Skip to content
Snippets Groups Projects
webpack.static-viz.config.js 4.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • const YAML = require("json-to-pretty-yaml");
    
    const TerserPlugin = require("terser-webpack-plugin");
    
    const webpack = require("webpack");
    
    const { StatsWriterPlugin } = require("webpack-stats-plugin");
    
    const ASSETS_PATH = __dirname + "/resources/frontend_client/app/assets";
    
    const SRC_PATH = __dirname + "/frontend/src/metabase";
    const BUILD_PATH = __dirname + "/resources/frontend_client";
    
    const CLJS_SRC_PATH = __dirname + "/target/cljs_release";
    const CLJS_SRC_PATH_DEV = __dirname + "/target/cljs_dev";
    
    const LIB_SRC_PATH = __dirname + "/frontend/src/metabase-lib";
    
    const TYPES_SRC_PATH = __dirname + "/frontend/src/metabase-types";
    
    const SDK_SRC_PATH = __dirname + "/enterprise/frontend/src/embedding-sdk";
    
    const WEBPACK_BUNDLE = process.env.WEBPACK_BUNDLE || "development";
    const devMode = WEBPACK_BUNDLE !== "production";
    
    
    module.exports = env => {
      return {
        mode: "production",
        context: SRC_PATH,
    
        performance: {
          hints: false,
        },
    
        entry: {
          "lib-static-viz": {
            import: "./static-viz/index.js",
            library: {
              name: "StaticViz",
              type: "var",
            },
    
        output: {
          path: BUILD_PATH + "/app/dist",
          filename: "[name].bundle.js",
    
          publicPath: "/app/dist",
          globalObject: "{}",
    
            {
              test: /\.css$/i,
              use: "null-loader",
            },
    
              exclude: /node_modules|cljs|css\/core\/fonts\.styled\.ts/,
              use: [
                {
                  loader: "swc-loader",
                  options: {
                    jsc: {
                      loose: true,
                      transform: {
                        react: {
                          runtime: "automatic",
                          refresh: false,
                        },
                      },
                      parser: {
                        syntax: "typescript",
                        tsx: true,
                      },
                      experimental: {
                        plugins: [["@swc/plugin-emotion", { sourceMap: devMode }]],
                      },
                    },
    
                    sourceMaps: true,
                    minify: false, // produces same bundle size, but cuts 1s locally
                    env: {
                      targets: ["defaults"],
                    },
                  },
                },
              ],
    
            {
              test: /\.svg/,
              type: "asset/source",
              resourceQuery: /source/, // *.svg?source
            },
            {
              test: /\.svg$/i,
              issuer: /\.[jt]sx?$/,
              resourceQuery: /component/, // *.svg?component
              use: [
                {
                  loader: "@svgr/webpack",
                  options: {
                    ref: true,
                  },
                },
              ],
            },
    
              test: /\.svg$/,
              type: "asset/resource",
              resourceQuery: { not: [/component|source/] },
    
          ],
        },
        resolve: {
          extensions: [".webpack.js", ".web.js", ".js", ".jsx", ".ts", ".tsx"],
          alias: {
    
            cljs: devMode ? CLJS_SRC_PATH_DEV : CLJS_SRC_PATH,
    
            "metabase-types": TYPES_SRC_PATH,
    
            "process/browser": require.resolve("process/browser"),
          },
          fallback: {
            crypto: require.resolve("crypto-browserify"),
            stream: require.resolve("stream-browserify"),
            buffer: require.resolve("buffer/"),
            process: require.resolve("process/browser"),
    
          minimize: false,
    
          minimizer: [
            new TerserPlugin({
              minify: TerserPlugin.swcMinify,
            }),
          ],
    
          new webpack.EnvironmentPlugin({
            EMBEDDING_SDK_VERSION: null,
            IS_EMBEDDING_SDK_BUILD: false,
          }),
          new webpack.NormalModuleReplacementPlugin(
            /node_modules\/@reduxjs\/toolkit\/.*\/process$/,
            "process/browser",
          ),
          new webpack.ProvidePlugin({
            process: "process/browser",
            Buffer: ["buffer", "Buffer"],
          }),
    
          new StatsWriterPlugin({
            stats: {
              modules: true,
              assets: false,
              nestedModules: false,
              reasons: false,
              excludeModules: [/node_modules/],
            },
            filename: "../../../../.github/static-viz-sources.yaml",
            transform: stats =>
              YAML.stringify({
                static_viz: stats.modules
                  .filter(
                    module =>
                      module.type !== "hidden modules" &&
    
                      module.moduleType !== "runtime" &&
                      module.nameForCondition != null,
    
                  )
                  .map(module =>
                    module.nameForCondition.replace(`${__dirname}/`, ""),
                  ),
              }),
          }),
        ],