const path = require('path'); const process = require('process'); const rspack = require('@rspack/core'); const ReactRefreshPlugin = require('@rspack/plugin-react-refresh'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const { RsdoctorRspackPlugin } = require('@rsdoctor/rspack-plugin'); const pdfjsDistPath = path.dirname(require.resolve('pdfjs-dist/package.json')); const cMapsDir = path.join(pdfjsDistPath, 'cmaps'); module.exports = (env, argv) => { const port = process.env.SERVER_PORT; const prod = argv.mode === 'production'; return { mode: 'development', devtool: 'source-map', optimization: { minimize: false, removeAvailableModules: true, removeEmptyChunks: true, splitChunks: false, }, entry: { app: { import: './src/ts/entry.tsx', filename: 'js/main.js', }, extension: { import: './extension/entry.tsx', filename: 'extension/js/main.js', }, }, resolve: { extensions: [ '.ts', '.tsx', '.js', '.jsx' ], alias: { dist: path.resolve(__dirname, 'dist'), protobuf: path.resolve(__dirname, 'dist/lib'), json: path.resolve(__dirname, 'src/json'), Lib: path.resolve(__dirname, 'src/ts/lib'), Store: path.resolve(__dirname, 'src/ts/store'), Component: path.resolve(__dirname, 'src/ts/component'), Interface: path.resolve(__dirname, 'src/ts/interface'), Model: path.resolve(__dirname, 'src/ts/model'), Docs: path.resolve(__dirname, 'src/ts/docs'), Hook: path.resolve(__dirname, 'src/ts/hook'), }, modules: [ path.resolve('./src/'), path.resolve('./electron/'), path.resolve('./dist/'), path.resolve('./node_modules') ] }, watchOptions: { ignored: /node_modules/, poll: false, }, devServer: { hot: true, static: ['dist'], watchFiles: { paths: ['src'], options: { usePolling: false, }, }, historyApiFallback: true, host: 'localhost', port, client: { progress: false, overlay: { runtimeErrors: (error) => { if (error.message === 'ResizeObserver loop completed with undelivered notifications.') { return false; } return true; }, }, }, }, module: { rules: [ { test: /\.(j|t)s$/, exclude: [/[\\/]node_modules[\\/]/], loader: 'builtin:swc-loader', options: { jsc: { parser: { syntax: 'typescript', }, transform: { react: { runtime: 'automatic', development: !prod, refresh: !prod, }, }, }, env: { targets: 'Chrome >= 48', }, }, }, { test: /\.(j|t)sx$/, loader: 'builtin:swc-loader', exclude: [/[\\/]node_modules[\\/]/], options: { jsc: { parser: { syntax: 'typescript', tsx: true, }, transform: { react: { runtime: 'automatic', development: !prod, refresh: !prod, }, }, }, env: { targets: 'Chrome >= 48', // browser compatibility }, }, }, { enforce: 'pre', test: /\.js$/, loader: 'source-map-loader' }, { test: /\.(eot|ttf|otf|woff|woff2)$/, type: 'asset/inline' }, { test: /\.(jpe?g|png|gif|svg)$/, type: 'asset/inline' }, { test: /\.s?css/, use: [ { loader: 'style-loader' }, { loader: 'css-loader' }, { loader: 'sass-loader' } ] } ] }, plugins: [ !prod && new ReactRefreshPlugin(), process.env.RSDOCTOR && new RsdoctorRspackPlugin({}), new ForkTsCheckerWebpackPlugin(), // new rspack.IgnorePlugin({ // resourceRegExp: /osx-temperature-sensor/, // }), new rspack.optimize.LimitChunkCountPlugin({ maxChunks: 1, }), new rspack.CopyRspackPlugin({ patterns: [ { from: cMapsDir, to: './cmaps/' }, ], }), ].filter(Boolean), }; };