/* */ import fs from 'fs'; import path from 'path'; import webpack from 'webpack'; import nodeExternals from 'webpack-node-externals'; import GeneratePackageJsonPlugin from 'generate-package-json-webpack-plugin'; import CopyPlugin from 'copy-webpack-plugin'; import pkg from './package.json'; const basePackageValues = { name: pkg.name, version: pkg.version, private: true, engines: pkg.engines, scripts: { start: 'node --nouse-idle-notification --expose-gc server.js', }, dependencies: { mysql2: '', bufferutil: '', 'utf-8-validate': '', bufferutil: '', }, }; const ttag = {}; const babelPlugins = [ ['ttag', ttag], ]; export default ({ development, extract, }) => { /* * write template files for translations */ if (extract) { ttag.extract = { output: path.resolve(__dirname, 'i18n', 'template-ssr.pot'), }; ttag.discover = ['t', 'jt']; } /* * worker threads need to be their own * entry points */ const workersDir = path.resolve(__dirname, 'src', 'workers'); const workerEntries = {}; fs.readdirSync(workersDir) .filter((e) => e.endsWith('.js')) .forEach((filename) => { const name = `workers/${filename.slice(0, -3)}`; const fullPath = path.resolve(workersDir, filename); workerEntries[name] = fullPath; }); return { name: 'server', target: 'node', context: __dirname, mode: (development) ? 'development' : 'production', entry: { server: [path.resolve(__dirname, 'src', 'server.js')], backup: [path.resolve(__dirname, 'src', 'backup.js')], ...workerEntries, }, output: { library: { type: 'commonjs2', }, clean: true, }, resolve: { extensions: ['.js', '.jsx'], }, module: { rules: [ { test: /\.(js|jsx)$/, loader: 'babel-loader', include: [ path.resolve(__dirname, 'src'), ], options: { cacheDirectory: false, plugins: babelPlugins, }, }, { test: /\.css/, use: [ { loader: 'css-loader', options: { importLoaders: 1, sourceMap: false, modules: false, }, }, 'clean-css-loader', ], }, { test: [/\.po$/], loader: 'ttag-po-loader', }, ], }, externals: [ /\/proxies\.json$/, /\/canvases\.json$/, /\/styleassets\.json$/, /\/assets\.json$/, nodeExternals(), ], plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': development ? '"development"' : '"production"', 'process.env.BROWSER': false, }), // create package.json for deployment new GeneratePackageJsonPlugin(basePackageValues, { sourcePackageFilenames: [ path.resolve(__dirname, 'package.json'), ], }), new CopyPlugin({ patterns: [ { from: path.resolve(__dirname, 'public'), to: path.resolve(__dirname, 'dist', 'public'), }, path.resolve(__dirname, 'src', 'canvases.json'), path.resolve(__dirname, 'src', 'proxies.json'), { from: path.resolve( __dirname, 'deployment', 'example-ecosystem.yml' ), to: path.resolve( __dirname, 'dist', 'ecosystem.yml' ), }, { from: path.resolve( __dirname, 'deployment', 'example-ecosystem-backup.yml' ), to: path.resolve( __dirname, 'dist', 'ecosystem-backup.yml' ), }, { from: path.resolve(__dirname, 'deployment', 'captchaFonts'), to: path.resolve(__dirname, 'dist', 'captchaFonts'), }, ], }), ], stats: { colors: true, reasons: false, hash: false, version: false, chunkModules: false, }, node: { global: false, __filename: false, __dirname: false, }, }; };