blob: 7add4c9a81abf6fe92a5209e73c7e30c1c0e8196 [file] [edit]
/*
* Copyright (C) 2025 Apple Inc. All rights reserved.
* Copyright 2025 Google LLC
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
import path from "path";
import webpack from "webpack";
import TerserPlugin from "terser-webpack-plugin";
import UnicodeEscapePlugin from "@dapplets/unicode-escape-webpack-plugin";
import { LicenseWebpackPlugin } from "license-webpack-plugin";
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
function createConfig({ filename, minify }) {
return {
mode: "production",
devtool: "source-map",
target: "web",
entry: "./src/react-render-test.cjs",
output: {
path: path.resolve(__dirname, "dist"),
filename: filename,
library: {
name: "ReactRenderTest",
type: "globalThis",
},
libraryTarget: "assign",
},
plugins: [
new webpack.ProvidePlugin({
TextEncoder: ["text-encoding", "TextEncoder"],
TextDecoder: ["text-encoding", "TextDecoder"],
MessageChannel: [path.resolve(__dirname, "src/mock/message_channel.cjs"), "MessageChannel"],
process: "process/browser",
Buffer: ["buffer", "Buffer"],
}),
new UnicodeEscapePlugin({
test: /\.(js|jsx|ts|tsx)$/, // Escape Unicode in JavaScript and TypeScript files
}),
new LicenseWebpackPlugin({
perChunkOutput: true,
outputFilename: "LICENSE.txt",
}),
],
module: {
rules: [
{
test: /\.c?js$/,
exclude: /node_modules/,
use: {
loader: "babel-loader",
options: {
presets: [
["@babel/preset-env", {
// Keep ES6 classes.
exclude: ["@babel/plugin-transform-classes"]
}],
"@babel/preset-react"
],
plugins: [path.resolve(__dirname, "../utils/BabelCacheBuster.mjs")],
},
},
},
{
test: /\.c?js$/,
include: path.resolve(__dirname, "node_modules"),
use: {
loader: "babel-loader",
options: {
plugins: [path.resolve(__dirname, "../utils/BabelCacheBuster.mjs")],
},
},
},
],
},
optimization: {
minimizer: [
new TerserPlugin({
extractComments: false,
terserOptions: {
mangle: minify,
format: {
// Keep this comment for cache-busting.
comments: /ThouShaltNotCache/i,
},
},
}),
],
},
resolve: {
fallback: {
"assert": path.resolve("assert/"),
"buffer": path.resolve("buffer/"),
"canvas": false,
"child_process": false,
"crypto": false,
"fs": false,
"http": false,
"https": false,
"net": false,
"os": false,
"path": path.resolve("path-browserify"),
"stream": path.resolve("stream-browserify"),
"string_decoder": path.resolve("string_decoder/"),
"tls": false,
"url": path.resolve("url/"),
"util": path.resolve("util/"),
"vm": false,
"zlib": false,
}
},
performance: {
hints: false
},
};
};
export default [
createConfig({ filename: "bundle.min.js", minify: true }),
createConfig({ filename: "bundle.js", minify: false })
];