🏡 index : cold-air-networks/mirror-jetstream.git

import path from "path";
import TerserPlugin from "terser-webpack-plugin";
import { LicenseFilePlugin } from "generate-license-file-webpack-plugin";
import { fileURLToPath } from "url";
import UnicodeEscapePlugin from "@dapplets/unicode-escape-webpack-plugin";
import CacheBusterPlugin from "../utils/BabelCacheBuster.mjs";

const __dirname = path.dirname(fileURLToPath(import.meta.url));

function createConfig({ es6, filename, minify }) {
  let babelPlugins = []
  let babelTargets = { chrome: "100" }
  if (!es6) {
    // enable loose class definitions for es5 (e.g. with prototype assignments)
    babelPlugins = [["@babel/plugin-transform-classes", { loose: true }],];
    // Use a reasonably ok pre-es6 classes browser.
    babelTargets = { chrome: "40" };
  }
  return {
    entry: "./src/babylon-js-benchmark.mjs",
    mode: "production",
    devtool: "source-map",
    target: ["web", es6 ? "es6" : "es5"],
    output: {
      path: path.resolve(__dirname, "dist"),
      filename: filename,
      library: {
        name: "BabylonJSBenchmark",
        type: "globalThis",
      },
      libraryTarget: "assign",
      chunkFormat: "commonjs",
    },
    module: {
      rules: [
        {
          test: /\.[cm]?js$/,
          use: {
            loader: "babel-loader",
            options: {
              presets: [
                [
                  "@babel/preset-env",
                  { targets: babelTargets},
                ],
              ],
              plugins: [
                CacheBusterPlugin, ...babelPlugins
              ],
            },
          },
        },
      ],
    },
    plugins: [
      new LicenseFilePlugin({
        outputFileName: "LICENSE.txt",
      }),
      new UnicodeEscapePlugin({
        test: /\.(js|jsx|ts|tsx)$/, // Escape Unicode in JavaScript and TypeScript files
      }),
    ],
    optimization: {
      minimizer: [
        new TerserPlugin({
          extractComments: false,
          terserOptions: {
            mangle: minify,
            format: {
              // Keep this comment for cache-busting.
              comments: /@preserve|@license|@cc_on|ThouShaltNotCache/i,
            },
          },
        }),
      ],
    },
    resolve: {
      fallback: {
        assert: "assert/",
        fs: false,
        path: "path-browserify",
      },
    },
  };
}

export default (env, argv) => {
  const isDevelopment = argv.mode === "development";

  const nonMinifiedConfigs = [
    createConfig({
      es6: true,
      filename: "bundle.es6.js",
      minify: false,
    }),
    createConfig({
      es6: false,
      filename: "bundle.es5.js",
      minify: false,
    }),
  ];

  if (isDevelopment) {
    return nonMinifiedConfigs;
  }

  return [
    createConfig({
      es6: true,
      filename: "bundle.es6.min.js",
      minify: true,
    }),
    createConfig({
      es6: false,
      filename: "bundle.es5.min.js",
      minify: true,
    }),
  ];
};