const { readFileSync } = require("fs"); const { resolve } = require("path"); const { BannerPlugin, EnvironmentPlugin } = require("webpack"); const WorkerPlugin = require("worker-plugin"); const { merge } = require("webpack-merge"); const { argv: { mode }, } = require("yargs"); const { name: filename, version } = require("./package.json"); const banner = readFileSync(resolve("./_includes/header.txt"), "utf-8"); const ASSET_PATH = "/assets/js/"; const envConfig = (() => { switch (mode) { case "production": return { devtool: false, plugins: [ new WorkerPlugin({ globalObject: "self" }), new BannerPlugin({ banner, raw: true }), new EnvironmentPlugin({ DEBUG: false, ASSET_PATH, GET_CLAPS_API: "https://worker.getclaps.app", }), ], }; default: return { devtool: "source-map", plugins: [ new WorkerPlugin({ globalObject: "self" }), new EnvironmentPlugin({ DEBUG: true, ASSET_PATH, GET_CLAPS_API: "https://worker.getclaps.dev", }), ], }; } })(); const sharedPreset = { modules: false, useBuiltIns: "entry", corejs: 2, }; const babelPresetLegacy = { babelrc: false, presets: [ [ "@babel/preset-env", { ...sharedPreset, targets: { ie: "11", }, }, ], ], }; const babelPresetModern = { babelrc: false, presets: [ [ "@babel/preset-env", { ...sharedPreset, targets: { esmodules: true, }, }, ], ], }; const sharedConfig = { entry: resolve("./_js/src/entry.js"), output: { path: resolve("./assets/js"), publicPath: ASSET_PATH, }, resolve: { modules: [ resolve("./_js"), resolve("./node_modules"), ...(process.env.NODE_PATH ? [resolve(process.env.NODE_PATH)] : []), ], extensions: [".json", ".js"], symlinks: true, }, optimization: { splitChunks: { // chunks: 'all', // minSize: 30000, // maxSize: 0, // minChunks: 1, // maxAsyncRequests: 5, // maxInitialRequests: 3, // automaticNameDelimiter: '~', // automaticNameMaxLength: 30, // name: true, // cacheGroups: { // vendors: { // test: /[\\/]node_modules[\\/]/, // priority: -10 // }, // default: { // minChunks: 2, // priority: -20, // reuseExistingChunk: true // } // } }, }, performance: { hints: "warning", maxEntrypointSize: 512000, maxAssetSize: 512000, }, }; module.exports = [ merge(envConfig, sharedConfig, { output: { filename: `${filename}-${version}.js`, chunkFilename: `[name]-${filename}-${version}.js`, }, module: { rules: [ { test: /(\.jsx|\.js)$/, loader: "babel-loader", options: babelPresetModern, }, { test: /modernizr-custom/, use: "null-loader", }, { test: /@webcomponents\/(template|url|webcomponents-platform)/, use: "null-loader", }, ], }, }), merge(envConfig, sharedConfig, { output: { filename: `LEGACY-${filename}-${version}.js`, chunkFilename: `LEGACY-[name]-${filename}-${version}.js`, }, module: { rules: [ { test: /(\.jsx|\.js)$/, loader: "babel-loader", options: babelPresetLegacy, }, ], }, }), ];