Skip to content
Snippets Groups Projects
webpack.static-viz.config.js 3.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • const YAML = require("json-to-pretty-yaml");
    
    const TerserPlugin = require("terser-webpack-plugin");
    
    const { StatsWriterPlugin } = require("webpack-stats-plugin");
    
    const { IgnorePlugin } = require("webpack");
    
    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 BABEL_CONFIG = {
      cacheDirectory: process.env.BABEL_DISABLE_CACHE ? null : ".babel_cache",
    };
    
    
    const WEBPACK_BUNDLE = process.env.WEBPACK_BUNDLE || "development";
    const devMode = WEBPACK_BUNDLE !== "production";
    
    
    module.exports = env => {
      const shouldDisableMinimization = env.WEBPACK_WATCH === true;
    
      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",
            },
    
            {
              test: /\.(tsx?|jsx?)$/,
              exclude: /node_modules|cljs/,
              use: [{ loader: "babel-loader", options: BABEL_CONFIG }],
            },
    
            {
              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$/i,
              use: "null-loader",
            },
    
          ],
        },
        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,
    
        optimization: {
          minimize: !shouldDisableMinimization,
    
          minimizer: [
            new TerserPlugin({
              minify: TerserPlugin.swcMinify,
            }),
          ],
    
        plugins: [
          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",
                  )
                  .map(module =>
                    module.nameForCondition.replace(`${__dirname}/`, ""),
                  ),
              }),
          }),
        ],