webpack.config.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. loader: 'file-loader',
  11. test: /\.(woff2?|ttf|otf|eot|svg|html)$/,
  12. include: [path.resolve(__dirname, 'lib/')],
  13. options: {
  14. name: '[name].[ext]'
  15. }
  16. },
  17. {
  18. test: /\.(s*)css$/,
  19. use: [MiniCssExtractPlugin.loader, 'css-loader', 'resolve-url-loader', 'sass-loader']
  20. }
  21. ]
  22. },
  23. plugins: [
  24. // new CircularDependencyPlugin({
  25. // include: [ path.resolve(__dirname, 'lib/') ],
  26. // failOnError: false,
  27. // cwd: process.cwd(),
  28. // }),
  29. new ExtraWatchWebpackPlugin({
  30. files: [
  31. './lib/**/*.scss',
  32. './lib/**/*.html'
  33. ],
  34. }),
  35. new webpack.DefinePlugin({
  36. __PLUGIN_VERSION_TIMESTAMP__: webpack.DefinePlugin.runtimeValue(() => `${new Date().valueOf()}`, true),
  37. 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
  38. 'process.env.DEBUG': JSON.stringify(process.env.DEBUG)
  39. }),
  40. new MiniCssExtractPlugin({ filename: 'app.css' })
  41. ],
  42. resolve: {
  43. modules: [
  44. 'node_modules',
  45. path.resolve(__dirname, 'lib/')
  46. ],
  47. }
  48. }
  49. function createEntry(src, outFolder, outFilename, isNode) {
  50. return {
  51. node: isNode ? void 0 : { fs: 'empty' }, // TODO find better solution? Currently used in file-handle.ts
  52. target: isNode ? 'node' : void 0,
  53. entry: path.resolve(__dirname, `lib/${src}.js`),
  54. output: { filename: `${outFilename}.js`, path: path.resolve(__dirname, `build/${outFolder}`) },
  55. ...sharedConfig
  56. }
  57. }
  58. function createEntryPoint(name, dir, out) {
  59. return {
  60. node: { fs: 'empty' }, // TODO find better solution? Currently used in file-handle.ts
  61. entry: path.resolve(__dirname, `lib/${dir}/${name}.js`),
  62. output: { filename: `${name}.js`, path: path.resolve(__dirname, `build/${out}`) },
  63. ...sharedConfig
  64. }
  65. }
  66. function createNodeEntryPoint(name, dir, out) {
  67. return {
  68. target: 'node',
  69. entry: path.resolve(__dirname, `lib/${dir}/${name}.js`),
  70. output: { filename: `${name}.js`, path: path.resolve(__dirname, `build/${out}`) },
  71. externals: {
  72. argparse: 'require("argparse")',
  73. 'node-fetch': 'require("node-fetch")',
  74. 'util.promisify': 'require("util.promisify")',
  75. xhr2: 'require("xhr2")',
  76. },
  77. ...sharedConfig
  78. }
  79. }
  80. function createApp(name) { return createEntryPoint('index', `apps/${name}`, name) }
  81. function createBrowserTest(name) { return createEntryPoint(name, 'tests/browser', 'tests') }
  82. function createNodeApp(name) { return createNodeEntryPoint('index', `apps/${name}`, name) }
  83. module.exports = [
  84. createApp('viewer'),
  85. createApp('basic-wrapper'),
  86. createEntry('examples/proteopedia-wrapper/index', 'examples/proteopedia-wrapper', 'index'),
  87. createNodeApp('state-docs'),
  88. createNodeEntryPoint('preprocess', 'servers/model', 'model-server'),
  89. createApp('model-server-query'),
  90. createBrowserTest('font-atlas'),
  91. createBrowserTest('render-asa'),
  92. createBrowserTest('marching-cubes'),
  93. createBrowserTest('render-lines'),
  94. createBrowserTest('render-mesh'),
  95. createBrowserTest('render-shape'),
  96. createBrowserTest('render-spheres'),
  97. createBrowserTest('render-structure'),
  98. createBrowserTest('render-text'),
  99. ]