import path from "path";
// const { GenerateSW } = require("workbox-webpack-plugin");

const WebpackObfuscator = require("webpack-obfuscator");
const config = {
  projectName: "cityh5",

  date: "2023-12-2",
  designWidth: 750,
  deviceRatio: {
    640: 2.34 / 2,
    750: 1,
    828: 1.81 / 2,
  },
  sourceRoot: "src",
  outputRoot: "dist",
  plugins: [],
  defineConstants: {},
  copy: {
    patterns: [],
    options: {},
  },
  framework: "react",
  compiler: "webpack5",
  cache: {
    enable: false, // Webpack 持久化缓存配置，建议开启。默认配置请参考：https://docs.taro.zone/docs/config-detail#cache
  },

  h5: {
    webpackChain(chain) {
      chain.output.filename("static/js/[name].[contenthash:8].js");
      chain.output.chunkFilename("static/js/[name].[contenthash:8].js");
      chain
        .plugin("MiniCssExtractPlugin")
        .use(require("mini-css-extract-plugin"), [
          {
            filename: "static/css/[name].[contenthash:8].css",
            chunkFilename: "static/css/[name].[contenthash:8].css",
          },
        ]);
      if (process.env.NODE_ENV === "production") {
        // js代码混淆
        chain.plugin("obfuscator").use(WebpackObfuscator, [
          {
            rotateStringArray: true,
            stringArray: true,
            stringArrayThreshold: 0.5, // 降低比例，提高速度
            compact: true,
            controlFlowFlattening: false, // 关闭，提高速度
            deadCodeInjection: false, // 关闭，提高速度
            debugProtection: false,
            disableConsoleOutput: true,
            selfDefending: false, // 关闭，提高速度
            simplify: true, // 开启简化，提高性能
            // 禁用对 async/await 的转换
            target: "browser", // 或设置为适合目标环境的 ECMAScript 版本
            disableOptimizations: true, // 禁用某些优化来避免处理 async/await
          },
          ["**/*.js", "!node_modules/**"], // 避免对 node_modules 进行混淆
        ]);
      }

      chain.module
        .rule("markdown")
        .test(/\.md$/)
        .use("raw-loader")
        .loader("raw-loader")
        .end();
      chain.module
        .rule("ico")
        .test(/\.ico$/)
        .use("file-loader")
        .loader("file-loader")
        .options({
          name: "static/images/[name].[ext]",
        });
    },

    esnextModules: ["taro-ui"],
    publicPath: "/",
    // publicPath: `/v${new Date().getTime()}/`,

    staticDirectory: "static",
    postcss: {
      autoprefixer: {
        enable: true,
        config: {},
      },
      cssModules: {
        enable: false, // 默认为 false，如需使用 css modules 功能，则设为 true
        config: {
          namingPattern: "module", // 转换模式，取值为 global/module
          generateScopedName: "[name]__[local]___[hash:base64:5]",
        },
      },
    },

    router: {
      // basename: '/myapp',
      mode: "browser", // 或者是 'hash'
      customRoutes: {
        // "页面路径": "自定义路由"
        "/pages/index/index": "/",
        "/pages/book/index": "/book",
        // '/pages/detail/index': ['/detail'], // 可以通过数组为页面配置多个自定义路由
        // "pages/my/index": "/my",
        // "pages/meetup/index": "/meetup",
        // "pages/meetup/Detail/index": "/detail",
      },
    },
    // defineConstants: {
    //   HOST: '"/api"'
    // },
    devServer: {
      // host: 'nomad.hackrobot.cn', // 替换为您的域名
      // port: 10087,            // 选择一个适当的端口号
      proxy: {
        "/api/": {
          target: JSON.parse('"http://localhost:8700"'), //本地调试端口
          pathRewrite: {
            "^/api/": "/",
          },
          changeOrigin: true,
        },
      },
      // 允许特定域名访问
      allowedHosts: [
        "nomadro.com",
        "localhost",
        ".nomadro.com",
        "hackrobot.cn",
      ], // 允许所有 *.nomadyt.com 子域访问
    },
    htmlPluginOption: {
      favicon: path.resolve(__dirname, "..", "src", "images", "dgnomad.png"), // 同样处理 favicon 路径
      meta: {
        "cache-control": "no-cache, no-store, must-revalidate",
        pragma: "no-cache",
        expires: "0",
      },
    },

    target: ["web", "browserslist:> 0.25%, not dead"],
  },
};

module.exports = function (merge) {
  if (process.env.NODE_ENV === "development") {
    return merge({}, config, require("./dev"));
  }
  return merge({}, config, require("./prod"));
};
