const path = require('path'); const CopyPlugin = require('copy-webpack-plugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const glob = require('glob'); const nodeExternals = require('webpack-node-externals'); module.exports = function (options, webpack) { const workerFiles = glob.sync(path.join(__dirname, 'src/worker/**.ts')); const workerEntries = workerFiles.reduce((acc, file) => { const relativePath = path.relative(path.join(__dirname, 'src/worker'), file); const entryName = `worker/${path.dirname(relativePath)}/${path.basename(relativePath, '.ts')}`; acc[entryName] = file; return acc; }, {}); return { ...options, entry: { index: ['webpack/hot/poll?100', options.entry], ...workerEntries, }, output: { path: path.join(__dirname, 'dist'), filename: '[name].js', }, mode: 'development', devtool: 'source-map', externals: [ nodeExternals({ allowlist: ['webpack/hot/poll?100', /^@teable/], }), ], // ignore tests hot reload watchOptions: { ignored: ['**/test/**', '**/*.spec.ts', '**/node_modules/**', '**/i18n.generated.ts'], poll: 1000, }, module: { rules: [ { test: /\.ts?$/, loader: 'ts-loader', options: { transpileOnly: true, happyPackMode: true, }, exclude: [/node_modules/, /.e2e-spec.ts$/], }, ], }, cache: { type: 'filesystem', allowCollectingMemory: true, buildDependencies: { // This makes all dependencies of this file - build dependencies config: [__filename], }, }, plugins: [ // filter default ForkTsCheckerWebpackPlugin to rewrite the ts config file path // nest default tsconfig path is tsconfig.build.json ...options.plugins.filter((plugin) => !(plugin instanceof ForkTsCheckerWebpackPlugin)), new webpack.HotModuleReplacementPlugin(), new ForkTsCheckerWebpackPlugin({ typescript: { configFile: 'tsconfig.json', memoryLimit: 4096, }, }), new CopyPlugin({ patterns: [{ from: 'src/features/mail-sender/templates', to: 'templates' }], }), ], }; };