webpack.config.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const { composePlugins, withNx } = require('@nx/webpack');
  2. const { withReact } = require('@nx/react');
  3. const webpack = require('webpack');
  4. const css_prefix = 'lsf-';
  5. // Nx plugins for webpack.
  6. module.exports = composePlugins(
  7. withNx({
  8. // Skip TypeScript type checking during build to avoid UI library type errors
  9. skipTypeChecking: true,
  10. }),
  11. withReact({
  12. // Uncomment this line if you don't want to use SVGR
  13. // See: https://react-svgr.com/
  14. // svgr: false
  15. }),
  16. (config) => {
  17. // Enable WebAssembly support
  18. config.experiments = {
  19. ...config.experiments,
  20. asyncWebAssembly: true,
  21. syncWebAssembly: true,
  22. topLevelAwait: true,
  23. };
  24. // Add fallbacks for Node.js core modules
  25. config.resolve = {
  26. ...config.resolve,
  27. fallback: {
  28. ...config.resolve.fallback,
  29. path: false,
  30. fs: false,
  31. crypto: false,
  32. stream: false,
  33. buffer: false,
  34. util: false,
  35. process: false,
  36. },
  37. // Provide empty module for problematic audio decoder
  38. alias: {
  39. ...config.resolve.alias,
  40. '@humansignal/audio-file-decoder': require.resolve('./src/utils/empty-module.js'),
  41. },
  42. };
  43. // Ignore source map warnings and module not found errors
  44. config.ignoreWarnings = [
  45. /Failed to parse source map/,
  46. /export .* was not found/,
  47. /Can't resolve 'a'/,
  48. /decode-audio\.wasm/,
  49. /audio-file-decoder/,
  50. /Critical dependency: the request of a dependency is an expression/,
  51. ];
  52. // Add plugins
  53. config.plugins = [
  54. ...config.plugins,
  55. // Replace audio decoder with empty module
  56. new webpack.NormalModuleReplacementPlugin(
  57. /@humansignal\/audio-file-decoder/,
  58. require.resolve('./src/utils/empty-module.js')
  59. ),
  60. // Ignore specific modules that cause issues
  61. new webpack.IgnorePlugin({
  62. resourceRegExp: /^\.\/locale$/,
  63. contextRegExp: /moment$/,
  64. }),
  65. // Define CSS_PREFIX for LabelStudio
  66. new webpack.DefinePlugin({
  67. 'process.env.CSS_PREFIX': JSON.stringify(css_prefix),
  68. }),
  69. ];
  70. // Configure CSS modules with lsf- prefix for LabelStudio editor styles
  71. config.module.rules.forEach((rule) => {
  72. const testString = rule.test?.toString() || '';
  73. const isScss = testString.includes('scss');
  74. const isCssModule = testString.includes('.module');
  75. if (rule.test?.toString().match(/scss|sass/) && !isCssModule) {
  76. const r = rule.oneOf?.filter((r) => {
  77. // we don't need rules that don't have loaders
  78. if (!r.use) return false;
  79. const testString = r.test?.toString() || '';
  80. // we also don't need css modules as these are used directly
  81. // in the code and don't need prefixing
  82. if (testString.match(/module|raw|antd/)) return false;
  83. // we only target pre-processors that has 'css-loader included'
  84. return testString.match(/scss|sass/) && r.use.some((u) => u.loader && u.loader.includes('css-loader'));
  85. });
  86. r?.forEach((_r) => {
  87. const cssLoader = _r.use.find((use) => use.loader && use.loader.includes('css-loader'));
  88. if (!cssLoader) return;
  89. const isSASS = _r.use.some((use) => use.loader && use.loader.match(/sass|scss/));
  90. if (isSASS) _r.exclude = /node_modules/;
  91. if (cssLoader.options) {
  92. cssLoader.options.modules = {
  93. localIdentName: `${css_prefix}[local]`, // Add lsf- prefix
  94. getLocalIdent(_ctx, _ident, className) {
  95. if (className.includes('ant')) return className;
  96. },
  97. };
  98. }
  99. });
  100. }
  101. });
  102. // Add rule for XML files and WASM
  103. config.module = {
  104. ...config.module,
  105. rules: [
  106. ...config.module.rules,
  107. {
  108. test: /\.xml$/,
  109. type: 'asset/source',
  110. },
  111. {
  112. test: /\.wasm$/,
  113. type: 'webassembly/async',
  114. },
  115. ],
  116. };
  117. return config;
  118. }
  119. );