const { join, resolve } = require('path') const mode = process.env.NODE_ENV?.trim() || 'development' const isDev = mode === 'development' const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') /** @type {(parentDir: string, alias?: Record, aliasFields?: (string | string[]), filename?: string) => import('webpack').WebpackOptionsNormalized} */ module.exports = (parentDir, alias = {}, aliasFields = 'browser', filename = 'app') => ({ devtool: 'source-map', entry: [join(__dirname, 'main.js')], stats: { warnings: false }, output: { path: join(parentDir, 'build'), filename: 'renderer.js' }, mode, optimization:{ minimize: false // TODO: https://github.com/NoCrypt/migu/issues/2 }, module: { rules: [ { test: /\.svelte$/, use: { loader: 'svelte-loader', options: { compilerOptions: { dev: isDev }, emitCss: !isDev, hotReload: isDev } } }, { test: /\.css$/, use: [ MiniCssExtractPlugin.loader, { loader: 'css-loader', options: { sourceMap: true } } ] }, { // required to prevent errors from Svelte on Webpack 5+ test: /node_modules\/svelte\/.*\.mjs$/, resolve: { fullySpecified: false } } ] }, resolve: { aliasFields: [aliasFields], alias: { ...alias, '@': __dirname, module: false, url: false, debug: resolve(__dirname, './modules/debug.js'), 'svelte-radix': resolve(__dirname, '../node_modules/svelte-radix/dist/index.js'), 'bittorrent-tracker/lib/client/websocket-tracker.js': resolve('../node_modules/bittorrent-tracker/lib/client/websocket-tracker.js') }, extensions: ['.mjs', '.js', '.svelte'] }, plugins: [ new MiniCssExtractPlugin({ filename: '[name].css' }), new CopyWebpackPlugin({ patterns: [ { from: join(__dirname, 'public') } ] }), new HtmlWebpackPlugin({ filename: filename + '.html', inject: false, templateContent: ({ htmlWebpackPlugin }) => /* html */` Migu ${htmlWebpackPlugin.tags.headTags} ${htmlWebpackPlugin.tags.bodyTags} ` })], target: 'web' })