webpack.config.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. const data = require('./package.json');
  4. const Build = require('@jupyterlab/builder').Build;
  5. const webpack = require('webpack');
  6. const merge = require('webpack-merge').default;
  7. const baseConfig = require('@jupyterlab/builder/lib/webpack.config.base');
  8. const { ModuleFederationPlugin } = webpack.container;
  9. const fs = require('fs-extra');
  10. const path = require('path');
  11. const Handlebars = require('handlebars');
  12. // Ensure a clear build directory.
  13. const buildDir = path.resolve(__dirname, 'build');
  14. if (fs.existsSync(buildDir)) {
  15. fs.removeSync(buildDir);
  16. }
  17. fs.ensureDirSync(buildDir);
  18. // Configuration to handle extension assets
  19. const extensionAssetConfig = Build.ensureAssets({
  20. packageNames: jlab.extensions,
  21. output: buildDir
  22. });
  23. const singletons = {};
  24. jlab.singletonPackages.forEach(element => {
  25. singletons[element] = { singleton: true };
  26. });
  27. // Create a list of application extensions and mime extensions from
  28. // jlab.extensions
  29. const extensions = {};
  30. const mimeExtensions = {};
  31. for (const key of jlab.extensions) {
  32. const {
  33. jupyterlab: { extension, mimeExtension }
  34. } = require(`${key}/package.json`);
  35. if (extension !== undefined) {
  36. extensions[key] = extension === true ? '' : extension;
  37. }
  38. if (mimeExtension !== undefined) {
  39. mimeExtensions[key] = mimeExtension === true ? '' : mimeExtension;
  40. }
  41. }
  42. // Create the entry point file.
  43. const source = fs.readFileSync('index.template.js').toString();
  44. const template = Handlebars.compile(source);
  45. const extData = {
  46. jupyterlab_extensions: extensions,
  47. jupyterlab_mime_extensions: mimeExtensions
  48. };
  49. const result = template(extData);
  50. fs.writeFileSync(path.join(buildDir, 'index.js'), result);
  51. // Make a bootstrap entrypoint
  52. const entryPoint = path.join(buildDir, 'bootstrap.js');
  53. fs.copySync('./bootstrap.js', entryPoint);
  54. if (process.env.NODE_ENV === 'production') {
  55. baseConfig.mode = 'production';
  56. }
  57. module.exports = [
  58. merge(baseConfig, {
  59. mode: 'development',
  60. entry: ['./publicpath.js', './' + path.relative(__dirname, entryPoint)],
  61. output: {
  62. path: buildDir,
  63. library: {
  64. type: 'var',
  65. name: ['_JUPYTERLAB', 'CORE_OUTPUT']
  66. },
  67. filename: 'bundle.js'
  68. },
  69. plugins: [
  70. new ModuleFederationPlugin({
  71. library: {
  72. type: 'var',
  73. name: ['_JUPYTERLAB', 'CORE_LIBRARY_FEDERATION']
  74. },
  75. name: 'CORE_FEDERATION',
  76. shared: {
  77. ...data.resolutions,
  78. ...singletons
  79. }
  80. })
  81. ]
  82. })
  83. ].concat(extensionAssetConfig);