const path = require("path"); const webpack = require("webpack"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const TerserPlugin = require("terser-webpack-plugin"); module.exports = { mode: "production", entry: { "excalidraw.min": "./index.tsx", }, output: { path: path.resolve(__dirname, "dist"), library: "Excalidraw", libraryTarget: "umd", filename: "[name].js", }, resolve: { extensions: [".js", ".ts", ".tsx", ".css", ".scss"], }, module: { rules: [ { test: /\.(sa|sc|c)ss$/, exclude: /node_modules/, use: [ MiniCssExtractPlugin.loader, { loader: "css-loader" }, "sass-loader", ], }, { test: /\.(ts|tsx|js|jsx|mjs)$/, exclude: /node_modules\/(?!(roughjs|socket.io-client|browser-nativefs)\/).*/, use: [ { loader: "ts-loader", options: { transpileOnly: true, configFile: path.resolve(__dirname, "tsconfig.prod.json"), }, }, { loader: "babel-loader", options: { presets: [ "@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript", ], plugins: [ "@babel/plugin-proposal-object-rest-spread", "@babel/plugin-transform-arrow-functions", "transform-class-properties", "@babel/plugin-transform-async-to-generator", ], }, }, ], }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ { loader: "file-loader", options: { name: "[name].[ext]", }, }, ], }, ], }, optimization: { minimize: true, minimizer: [ new TerserPlugin({ test: /\.js($|\?)/i, }), new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1, }), ], }, plugins: [new MiniCssExtractPlugin({ filename: "[name].css" })], externals: { react: { root: "React", commonjs2: "react", commonjs: "react", amd: "react", }, "react-dom": { root: "ReactDOM", commonjs2: "react-dom", commonjs: "react-dom", amd: "react-dom", }, }, };