webpack.config.common.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. const path = require('path');
  2. const webpack = require('webpack');
  3. const ExtraWatchWebpackPlugin = require('extra-watch-webpack-plugin');
  4. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  5. // const CircularDependencyPlugin = require('circular-dependency-plugin');
  6. const sharedConfig = {
  7. module: {
  8. rules: [
  9. {
  10. test: /\.(woff2?|ttf|otf|eot|svg|html|ico)$/,
  11. use: [{
  12. loader: 'file-loader',
  13. options: { name: '[name].[ext]' }
  14. }]
  15. },
  16. {
  17. test: /\.(s*)css$/,
  18. use: [
  19. MiniCssExtractPlugin.loader,
  20. { loader: 'css-loader', options: { sourceMap: false } },
  21. { loader: 'resolve-url-loader', options: { sourceMap: false } },
  22. { loader: 'sass-loader', options: { sourceMap: false } },
  23. ]
  24. }
  25. ]
  26. },
  27. plugins: [
  28. // new CircularDependencyPlugin({
  29. // include: [ path.resolve(__dirname, 'lib/') ],
  30. // failOnError: false,
  31. // cwd: process.cwd(),
  32. // }),
  33. new ExtraWatchWebpackPlugin({
  34. files: [
  35. './lib/**/*.scss',
  36. './lib/**/*.html'
  37. ],
  38. }),
  39. new webpack.DefinePlugin({
  40. __VERSION__: webpack.DefinePlugin.runtimeValue(() => JSON.stringify(require('./package.json').version), true),
  41. __VERSION_TIMESTAMP__: webpack.DefinePlugin.runtimeValue(() => `${new Date().valueOf()}`, true),
  42. 'process.env.DEBUG': JSON.stringify(process.env.DEBUG)
  43. }),
  44. new MiniCssExtractPlugin({ filename: 'app.css' })
  45. ],
  46. resolve: {
  47. modules: [
  48. 'node_modules',
  49. path.resolve(__dirname, 'lib/')
  50. ],
  51. },
  52. watchOptions: {
  53. aggregateTimeout: 750
  54. },
  55. devtool: ''
  56. }
  57. function createEntry(src, outFolder, outFilename, isNode) {
  58. return {
  59. node: isNode ? void 0 : { fs: 'empty' }, // TODO find better solution? Currently used in file-handle.ts
  60. target: isNode ? 'node' : void 0,
  61. entry: path.resolve(__dirname, `lib/${src}.js`),
  62. output: { filename: `${outFilename}.js`, path: path.resolve(__dirname, `build/${outFolder}`) },
  63. ...sharedConfig
  64. }
  65. }
  66. function createEntryPoint(name, dir, out) {
  67. return {
  68. node: { fs: 'empty' }, // TODO find better solution? Currently used in file-handle.ts
  69. entry: path.resolve(__dirname, `lib/${dir}/${name}.js`),
  70. output: { filename: `${name}.js`, path: path.resolve(__dirname, `build/${out}`) },
  71. ...sharedConfig
  72. }
  73. }
  74. function createNodeEntryPoint(name, dir, out) {
  75. return {
  76. target: 'node',
  77. entry: path.resolve(__dirname, `lib/${dir}/${name}.js`),
  78. output: { filename: `${name}.js`, path: path.resolve(__dirname, `build/${out}`) },
  79. externals: {
  80. argparse: 'require("argparse")',
  81. 'node-fetch': 'require("node-fetch")',
  82. 'util.promisify': 'require("util.promisify")',
  83. xhr2: 'require("xhr2")',
  84. },
  85. ...sharedConfig
  86. }
  87. }
  88. function createApp(name) { return createEntryPoint('index', `apps/${name}`, name) }
  89. function createExample(name) { return createEntry(`examples/${name}/index`, `examples/${name}`, 'index') }
  90. function createBrowserTest(name) { return createEntryPoint(name, 'tests/browser', 'tests') }
  91. function createNodeApp(name) { return createNodeEntryPoint('index', `apps/${name}`, name) }
  92. module.exports = {
  93. createApp,
  94. createEntry,
  95. createExample,
  96. createBrowserTest,
  97. createNodeEntryPoint,
  98. createNodeApp
  99. }