var webpack = require("webpack"), path = require("path"), CopyWebpackPlugin = require("copy-webpack-plugin"), HtmlWebpackPlugin = require("html-webpack-plugin"), TerserPlugin = require("terser-webpack-plugin"); var { CleanWebpackPlugin } = require("clean-webpack-plugin"); var ReactRefreshWebpackPlugin = require("@pmmmwh/react-refresh-webpack-plugin"); var ReactRefreshTypeScript = require("react-refresh-typescript"); const ASSET_PATH = process.env.ASSET_PATH || "/"; var alias = {}; var fileExtensions = [ "jpg", "jpeg", "png", "gif", "eot", "otf", "svg", "ttf", "woff", "woff2", ]; const isDevelopment = process.env.NODE_ENV !== "production"; var options = { mode: process.env.NODE_ENV || "development", ignoreWarnings: [ /Circular dependency between chunks with runtime/, /ResizeObserver loop completed with undelivered notifications/ ], entry: { index: path.join(__dirname, "web", "index.tsx"), }, output: { filename: "[name].bundle.js", path: path.resolve(__dirname, "build", "ui"), clean: true, publicPath: ASSET_PATH, }, module: { rules: [ { // look for .css or .scss files test: /\.(css|scss)$/, // in the `web` directory use: [ { loader: "style-loader", }, { loader: "css-loader", options: { importLoaders: 1 }, }, { loader: "postcss-loader", }, { loader: "sass-loader", options: { sourceMap: true, }, }, ], }, // { // test: new RegExp(".(" + fileExtensions.join("|") + ")$"), // type: "asset/resource", // exclude: /node_modules/, // // loader: 'file-loader', // // options: { // // name: '[name].[ext]', // // }, // }, { test: /\.html$/, loader: "html-loader", exclude: /node_modules/, }, { test: /\.(ts|tsx)$/, exclude: /node_modules\/(?!(tlsn-js|tlsn-js-v5)\/).*/, use: [ { loader: require.resolve("ts-loader"), options: { getCustomTransformers: () => ({ before: [isDevelopment && ReactRefreshTypeScript()].filter( Boolean ), }), transpileOnly: isDevelopment, allowTsInNodeModules: true, }, }, ], }, { test: /\.(js|jsx)$/, use: [ { loader: "source-map-loader", }, { loader: require.resolve("babel-loader"), options: { plugins: [ isDevelopment && require.resolve("react-refresh/babel"), ].filter(Boolean), }, }, ], exclude: /node_modules/, }, { test: /\.(gif|png|jpe?g|svg)$/i, use: [ 'file-loader', { loader: 'image-webpack-loader', options: { publicPath: 'assets', bypassOnDebug: true, // webpack@1.x disable: true, // webpack@2.x and newer }, }, ], }, ], }, resolve: { alias: alias, extensions: fileExtensions .map((extension) => "." + extension) .concat([".js", ".jsx", ".ts", ".tsx", ".css", ".png", ".svg"]), }, plugins: [ isDevelopment && new ReactRefreshWebpackPlugin(), new CleanWebpackPlugin({ verbose: false }), new webpack.ProgressPlugin(), // expose and write the allowed env vars on the compiled bundle new webpack.EnvironmentPlugin(["NODE_ENV"]), new CopyWebpackPlugin({ patterns: [ { from: "node_modules/tlsn-js-v5/build", to: path.join(__dirname, "build", "ui"), force: true, }, { from: "node_modules/tlsn-js/build", to: path.join(__dirname, "build", "ui"), force: true, }, { from: "static/favicon.png", to: path.join(__dirname, "build", "ui"), force: true, }, ] }), // new HtmlWebpackPlugin({ // template: path.join(__dirname, "static", "index.html"), // filename: "index.html", // chunks: ["index"], // cache: false, // }), new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'], }), ].filter(Boolean), infrastructureLogging: { level: "info", }, // Required by wasm-bindgen-rayon, in order to use SharedArrayBuffer on the Web // Ref: // - https://github.com/GoogleChromeLabs/wasm-bindgen-rayon#setting-up // - https://web.dev/i18n/en/coop-coep/ devServer: { headers: { 'Cross-Origin-Embedder-Policy': 'require-corp', 'Cross-Origin-Opener-Policy': 'same-origin', } }, }; if (process.env.NODE_ENV === "development") { options.devtool = "cheap-module-source-map"; } else { options.optimization = { minimize: true, minimizer: [ new TerserPlugin({ extractComments: false, }), ], }; } module.exports = options;