16a23e08bSopenharmony_ci/*
26a23e08bSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
36a23e08bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46a23e08bSopenharmony_ci * you may not use this file except in compliance with the License.
56a23e08bSopenharmony_ci * You may obtain a copy of the License at
66a23e08bSopenharmony_ci *
76a23e08bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86a23e08bSopenharmony_ci *
96a23e08bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106a23e08bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116a23e08bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126a23e08bSopenharmony_ci * See the License for the specific language governing permissions and
136a23e08bSopenharmony_ci * limitations under the License.
146a23e08bSopenharmony_ci */
156a23e08bSopenharmony_ci
166a23e08bSopenharmony_civar path = require('path')
176a23e08bSopenharmony_civar fs = require('fs')
186a23e08bSopenharmony_ci
196a23e08bSopenharmony_civar ResourcePlugin = require('./lib/resource-plugin')
206a23e08bSopenharmony_civar ResultStates = require('./lib/compile-plugin')
216a23e08bSopenharmony_civar GenBinPlugin = require('./lib/genBin-plugin')
226a23e08bSopenharmony_civar GenAbcPlugin = require('./lib/genAbc-plugin').GenAbcPlugin
236a23e08bSopenharmony_civar AfterEmitPlugin = require('./lib/cardJson-plugin').AfterEmitPlugin
246a23e08bSopenharmony_ciconst ReadJsonPlugin = require('./lib/read-json-plugin')
256a23e08bSopenharmony_ci
266a23e08bSopenharmony_ciconst { PLATFORM }= require('./lib/lite/lite-enum')
276a23e08bSopenharmony_ciconst util = require('./lib/util')
286a23e08bSopenharmony_ciconst TerserPlugin = require('terser-webpack-plugin')
296a23e08bSopenharmony_ciconst CopyPlugin = require("copy-webpack-plugin")
306a23e08bSopenharmony_ciconst webpack = require('webpack')
316a23e08bSopenharmony_cilet watchMode = (process.env.watchMode && process.env.watchMode === 'true') || false
326a23e08bSopenharmony_ciconst {
336a23e08bSopenharmony_ci  deleteFolderRecursive,
346a23e08bSopenharmony_ci  readManifest,
356a23e08bSopenharmony_ci  loadEntryObj,
366a23e08bSopenharmony_ci  hashProjectPath,
376a23e08bSopenharmony_ci  checkMultiResourceBuild,
386a23e08bSopenharmony_ci  readWorkerFile,
396a23e08bSopenharmony_ci  compareCache,
406a23e08bSopenharmony_ci  parseAbilityName
416a23e08bSopenharmony_ci} = require('./main.product')
426a23e08bSopenharmony_ci
436a23e08bSopenharmony_ciconst richModule = {
446a23e08bSopenharmony_ci  rules: [
456a23e08bSopenharmony_ci    {
466a23e08bSopenharmony_ci      test: /\.visual$/,
476a23e08bSopenharmony_ci      use: [{
486a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './lib/loader-gen.js')
496a23e08bSopenharmony_ci      }]
506a23e08bSopenharmony_ci    },
516a23e08bSopenharmony_ci    {
526a23e08bSopenharmony_ci      test: /(\.hml)(\?[^?]+)?$/,
536a23e08bSopenharmony_ci      use: [{
546a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './index.js')
556a23e08bSopenharmony_ci      }]
566a23e08bSopenharmony_ci    },
576a23e08bSopenharmony_ci    {
586a23e08bSopenharmony_ci      test: /\.png$/,
596a23e08bSopenharmony_ci      use: [{
606a23e08bSopenharmony_ci        loader: 'file-loader',
616a23e08bSopenharmony_ci        options: {
626a23e08bSopenharmony_ci          name: '[name].[ext]',
636a23e08bSopenharmony_ci          outputPath: 'common'
646a23e08bSopenharmony_ci        }
656a23e08bSopenharmony_ci      }]
666a23e08bSopenharmony_ci    },
676a23e08bSopenharmony_ci    {
686a23e08bSopenharmony_ci      test: /\.css$/,
696a23e08bSopenharmony_ci      use: [{
706a23e08bSopenharmony_ci        loader: 'css-loader'
716a23e08bSopenharmony_ci      }]
726a23e08bSopenharmony_ci    },
736a23e08bSopenharmony_ci    {
746a23e08bSopenharmony_ci      test: /\.less$/,
756a23e08bSopenharmony_ci      use: [{
766a23e08bSopenharmony_ci        loader: 'less-loader'
776a23e08bSopenharmony_ci      }]
786a23e08bSopenharmony_ci    },
796a23e08bSopenharmony_ci    {
806a23e08bSopenharmony_ci      test: /\.(scss|sass)$/,
816a23e08bSopenharmony_ci      use: [{
826a23e08bSopenharmony_ci        loader: 'style-loader!css-loader!sass-loader'
836a23e08bSopenharmony_ci      }]
846a23e08bSopenharmony_ci    },
856a23e08bSopenharmony_ci    {
866a23e08bSopenharmony_ci      test: /\.jsx?$/,
876a23e08bSopenharmony_ci      type: 'javascript/auto',
886a23e08bSopenharmony_ci      use: [
896a23e08bSopenharmony_ci        {
906a23e08bSopenharmony_ci          loader: path.resolve(__dirname, 'lib/module-script.js')
916a23e08bSopenharmony_ci        },
926a23e08bSopenharmony_ci        {
936a23e08bSopenharmony_ci          loader: util.loadBabelModule('babel-loader'),
946a23e08bSopenharmony_ci          options: {
956a23e08bSopenharmony_ci            presets: [util.loadBabelModule('@babel/preset-env')],
966a23e08bSopenharmony_ci            targets: 'node 8',
976a23e08bSopenharmony_ci            plugins: [
986a23e08bSopenharmony_ci              [
996a23e08bSopenharmony_ci                util.loadBabelModule('@babel/plugin-transform-modules-commonjs'),
1006a23e08bSopenharmony_ci                {'allowTopLevelThis': true}
1016a23e08bSopenharmony_ci              ],
1026a23e08bSopenharmony_ci              util.loadBabelModule('@babel/plugin-proposal-class-properties')
1036a23e08bSopenharmony_ci            ],
1046a23e08bSopenharmony_ci            compact: false
1056a23e08bSopenharmony_ci          }
1066a23e08bSopenharmony_ci        }
1076a23e08bSopenharmony_ci      ]
1086a23e08bSopenharmony_ci    }
1096a23e08bSopenharmony_ci  ]
1106a23e08bSopenharmony_ci}
1116a23e08bSopenharmony_ci
1126a23e08bSopenharmony_ciconst cardModule = {
1136a23e08bSopenharmony_ci  rules: [
1146a23e08bSopenharmony_ci    {
1156a23e08bSopenharmony_ci      test: /\.visual$/,
1166a23e08bSopenharmony_ci      use: [{
1176a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './lib/loader-gen.js')
1186a23e08bSopenharmony_ci      }]
1196a23e08bSopenharmony_ci    },
1206a23e08bSopenharmony_ci    {
1216a23e08bSopenharmony_ci      test: /\.hml$/,
1226a23e08bSopenharmony_ci      use: [{
1236a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './lib/card-loader.js')
1246a23e08bSopenharmony_ci      }]
1256a23e08bSopenharmony_ci    },
1266a23e08bSopenharmony_ci    {
1276a23e08bSopenharmony_ci      test: /\.css$/,
1286a23e08bSopenharmony_ci      use: [{
1296a23e08bSopenharmony_ci        loader: 'css-loader'
1306a23e08bSopenharmony_ci      }]
1316a23e08bSopenharmony_ci    },
1326a23e08bSopenharmony_ci    {
1336a23e08bSopenharmony_ci      test: /\.less$/,
1346a23e08bSopenharmony_ci      use: [{
1356a23e08bSopenharmony_ci        loader: 'less-loader'
1366a23e08bSopenharmony_ci      }]
1376a23e08bSopenharmony_ci    },
1386a23e08bSopenharmony_ci    {
1396a23e08bSopenharmony_ci      test: /\.(scss|sass)$/,
1406a23e08bSopenharmony_ci      use: [{
1416a23e08bSopenharmony_ci        loader: 'css-loader!sass-loader'
1426a23e08bSopenharmony_ci      }]
1436a23e08bSopenharmony_ci    },
1446a23e08bSopenharmony_ci    {
1456a23e08bSopenharmony_ci      test: /\.jsx?$/,
1466a23e08bSopenharmony_ci      type: 'javascript/auto',
1476a23e08bSopenharmony_ci      use: [
1486a23e08bSopenharmony_ci        {
1496a23e08bSopenharmony_ci          loader: path.resolve(__dirname, 'lib/module-script.js')
1506a23e08bSopenharmony_ci        },
1516a23e08bSopenharmony_ci        {
1526a23e08bSopenharmony_ci          loader: util.loadBabelModule('babel-loader'),
1536a23e08bSopenharmony_ci          options: {
1546a23e08bSopenharmony_ci            presets: [util.loadBabelModule('@babel/preset-env')],
1556a23e08bSopenharmony_ci            targets: 'node 8',
1566a23e08bSopenharmony_ci            plugins: [util.loadBabelModule('@babel/plugin-transform-modules-commonjs'),
1576a23e08bSopenharmony_ci            util.loadBabelModule('@babel/plugin-proposal-class-properties')],
1586a23e08bSopenharmony_ci            compact: false
1596a23e08bSopenharmony_ci          }
1606a23e08bSopenharmony_ci        }
1616a23e08bSopenharmony_ci      ]
1626a23e08bSopenharmony_ci    }
1636a23e08bSopenharmony_ci  ]
1646a23e08bSopenharmony_ci}
1656a23e08bSopenharmony_ci
1666a23e08bSopenharmony_cilet config = {
1676a23e08bSopenharmony_ci  cache: {
1686a23e08bSopenharmony_ci    type: 'filesystem'
1696a23e08bSopenharmony_ci  },
1706a23e08bSopenharmony_ci  watch: watchMode,
1716a23e08bSopenharmony_ci  watchOptions: {
1726a23e08bSopenharmony_ci    aggregateTimeout: 10,
1736a23e08bSopenharmony_ci    poll: false,
1746a23e08bSopenharmony_ci    ignored: ["**/node_modules", "**/oh_modules", "**/*.json~"]
1756a23e08bSopenharmony_ci  },
1766a23e08bSopenharmony_ci  optimization: {
1776a23e08bSopenharmony_ci    moduleIds: 'deterministic',
1786a23e08bSopenharmony_ci    chunkIds: 'deterministic',
1796a23e08bSopenharmony_ci  },
1806a23e08bSopenharmony_ci  output: {
1816a23e08bSopenharmony_ci    filename: '[name].js',
1826a23e08bSopenharmony_ci    pathinfo: false,
1836a23e08bSopenharmony_ci    devtoolModuleFilenameTemplate: (info) => {
1846a23e08bSopenharmony_ci      const newInfo = info.absoluteResourcePath.replace(process.env.projectRootPath + path.sep, '')
1856a23e08bSopenharmony_ci        .replace(process.env.projectRootPath + path.sep, '')
1866a23e08bSopenharmony_ci        .replace(path.join(__dirname, path.sep), '');
1876a23e08bSopenharmony_ci      return newInfo;
1886a23e08bSopenharmony_ci    },
1896a23e08bSopenharmony_ci    globalObject: 'globalThis'
1906a23e08bSopenharmony_ci  },
1916a23e08bSopenharmony_ci  devtool: 'nosources-source-map',
1926a23e08bSopenharmony_ci  mode: 'development',
1936a23e08bSopenharmony_ci  module: richModule,
1946a23e08bSopenharmony_ci  node: {
1956a23e08bSopenharmony_ci    global: false
1966a23e08bSopenharmony_ci  },
1976a23e08bSopenharmony_ci  stats: 'none'
1986a23e08bSopenharmony_ci}
1996a23e08bSopenharmony_ci
2006a23e08bSopenharmony_cifunction setConfigs(env) {
2016a23e08bSopenharmony_ci  if (process.env.aceModuleJsonPath || env.aceModuleJsonPath) {
2026a23e08bSopenharmony_ci    process.env.compileMode = 'moduleJson';
2036a23e08bSopenharmony_ci  }
2046a23e08bSopenharmony_ci  process.env.error = env.error === undefined ? true : env.error
2056a23e08bSopenharmony_ci  process.env.warning = env.warning === undefined ? true : env.warning
2066a23e08bSopenharmony_ci  process.env.note = env.note === undefined ? true : env.note
2076a23e08bSopenharmony_ci  process.env.buildMode = env.buildMode || 'debug'
2086a23e08bSopenharmony_ci  process.env.logLevel = env.logLevel || '1'
2096a23e08bSopenharmony_ci  process.env.isPreview = env.isPreview || false
2106a23e08bSopenharmony_ci  process.env.projectPath = env.aceModuleRoot || process.env.aceModuleRoot || process.cwd();
2116a23e08bSopenharmony_ci  hashProjectPath(process.env.projectPath);
2126a23e08bSopenharmony_ci  process.env.buildPath = env.aceModuleBuild || process.env.aceModuleBuild ||
2136a23e08bSopenharmony_ci    path.resolve(process.env.projectPath, 'build');
2146a23e08bSopenharmony_ci  process.env.cachePath = env.cachePath || process.env.cachePath || path.resolve(__dirname, 'node_modules/.cache');
2156a23e08bSopenharmony_ci  process.env.aceManifestPath = process.env.aceManifestPath || path.resolve(process.env.projectPath, 'manifest.json');
2166a23e08bSopenharmony_ci  process.env.abilityType = process.env.abilityType || 'page';
2176a23e08bSopenharmony_ci  process.env.DEVICE_LEVEL = env.DEVICE_LEVEL || process.env.DEVICE_LEVEL || 'rich';
2186a23e08bSopenharmony_ci  process.env.aceModuleJsonPath = env.aceModuleJsonPath || process.env.aceModuleJsonPath;
2196a23e08bSopenharmony_ci  process.env.aceProfilePath = env.aceProfilePath || process.env.aceProfilePath;
2206a23e08bSopenharmony_ci  process.env.watchCSSFiles = process.env.watchCSSFiles || path.resolve(process.env.cachePath, '.rich_cache', 'preview_css.json');
2216a23e08bSopenharmony_ci  watchMode = (process.env.watchMode && process.env.watchMode === 'true') ||
2226a23e08bSopenharmony_ci    (env.watchMode && env.watchMode === 'true') || false;
2236a23e08bSopenharmony_ci  if (process.env.abilityType === 'page' || process.env.abilityType === 'form') {
2246a23e08bSopenharmony_ci    const manifest = readManifest(process.env.aceManifestPath)
2256a23e08bSopenharmony_ci    if (process.env.compileMode !== 'moduleJson') {
2266a23e08bSopenharmony_ci      process.env.DEVICE_LEVEL = manifest.type === 'form' ? 'card' : 'rich'
2276a23e08bSopenharmony_ci    }
2286a23e08bSopenharmony_ci    process.env.PLATFORM_VERSION = PLATFORM.VERSION6;
2296a23e08bSopenharmony_ci    const version = parseInt(manifest.minPlatformVersion);
2306a23e08bSopenharmony_ci    if (version == 5) {
2316a23e08bSopenharmony_ci      process.env.PLATFORM_VERSION = PLATFORM.VERSION5;
2326a23e08bSopenharmony_ci    }
2336a23e08bSopenharmony_ci    if (version <= 4) {
2346a23e08bSopenharmony_ci      process.env.PLATFORM_VERSION = PLATFORM.VERSION3;
2356a23e08bSopenharmony_ci    }
2366a23e08bSopenharmony_ci  }
2376a23e08bSopenharmony_ci  process.env.aceBuildJson = env.aceBuildJson || process.env.aceBuildJson;
2386a23e08bSopenharmony_ci  checkMultiResourceBuild(process.env.aceBuildJson);
2396a23e08bSopenharmony_ci}
2406a23e08bSopenharmony_ci
2416a23e08bSopenharmony_cifunction setArkPlugin(env, workerFile) {
2426a23e08bSopenharmony_ci  if (env.isPreview === "true" || env.compilerType && env.compilerType === 'ark') {
2436a23e08bSopenharmony_ci    let arkDir = path.join(__dirname, 'bin', 'ark');
2446a23e08bSopenharmony_ci    if (env.arkFrontendDir) {
2456a23e08bSopenharmony_ci      arkDir = env.arkFrontendDir;
2466a23e08bSopenharmony_ci    }
2476a23e08bSopenharmony_ci    let nodeJs = 'node';
2486a23e08bSopenharmony_ci    if (env.nodeJs) {
2496a23e08bSopenharmony_ci      nodeJs = env.nodeJs;
2506a23e08bSopenharmony_ci    }
2516a23e08bSopenharmony_ci    config.plugins.push(new GenAbcPlugin(process.env.buildPath, arkDir, nodeJs, workerFile,
2526a23e08bSopenharmony_ci      env.buildMode === 'debug'))
2536a23e08bSopenharmony_ci    if (env.buildMode === 'release') {
2546a23e08bSopenharmony_ci      config.output.path = path.join(process.env.cachePath, "releaseAssets",
2556a23e08bSopenharmony_ci        path.basename(process.env.buildPath));
2566a23e08bSopenharmony_ci      process.env.configOutput = config.output.path;
2576a23e08bSopenharmony_ci    }
2586a23e08bSopenharmony_ci  } else {
2596a23e08bSopenharmony_ci    if (env.deviceType) {
2606a23e08bSopenharmony_ci      let deviceArr = env.deviceType.split(/,/)
2616a23e08bSopenharmony_ci      let isDefault = deviceArr.indexOf('tv') >= 0 || deviceArr.indexOf('wearable') >= 0 ? true : false
2626a23e08bSopenharmony_ci      if (isDefault) {
2636a23e08bSopenharmony_ci        config.plugins.push(new GenBinPlugin(process.env.buildPath, path.join(__dirname, 'bin', workerFile)))
2646a23e08bSopenharmony_ci      }
2656a23e08bSopenharmony_ci    }
2666a23e08bSopenharmony_ci  }
2676a23e08bSopenharmony_ci}
2686a23e08bSopenharmony_ci
2696a23e08bSopenharmony_cifunction existsPackageJson(config, rootPackageJsonPath, modulePackageJsonPath) {
2706a23e08bSopenharmony_ci  if (config.cache) {
2716a23e08bSopenharmony_ci    config.cache.buildDependencies = {
2726a23e08bSopenharmony_ci      config: []
2736a23e08bSopenharmony_ci    };
2746a23e08bSopenharmony_ci    if (fs.existsSync(rootPackageJsonPath)) {
2756a23e08bSopenharmony_ci      config.cache.buildDependencies.config.push(rootPackageJsonPath);
2766a23e08bSopenharmony_ci    }
2776a23e08bSopenharmony_ci    if (fs.existsSync(modulePackageJsonPath)) {
2786a23e08bSopenharmony_ci      config.cache.buildDependencies.config.push(modulePackageJsonPath);
2796a23e08bSopenharmony_ci    }
2806a23e08bSopenharmony_ci  }
2816a23e08bSopenharmony_ci}
2826a23e08bSopenharmony_ci
2836a23e08bSopenharmony_cifunction excludeWorker(workerFile, name) {
2846a23e08bSopenharmony_ci  if (workerFile) {
2856a23e08bSopenharmony_ci    return Object.keys(workerFile).includes(name);
2866a23e08bSopenharmony_ci  }
2876a23e08bSopenharmony_ci  return /^\.\/workers\//.test(name);
2886a23e08bSopenharmony_ci}
2896a23e08bSopenharmony_ci
2906a23e08bSopenharmony_cimodule.exports = (env) => {
2916a23e08bSopenharmony_ci  setConfigs(env);
2926a23e08bSopenharmony_ci  compareCache(path.resolve(process.env.cachePath, '.rich_cache'));
2936a23e08bSopenharmony_ci  const workerFile = readWorkerFile();
2946a23e08bSopenharmony_ci  if (process.env.compileMode === 'moduleJson') {
2956a23e08bSopenharmony_ci    process.env.DEVICE_LEVEL = 'card';
2966a23e08bSopenharmony_ci    config.entry = {};
2976a23e08bSopenharmony_ci  } else {
2986a23e08bSopenharmony_ci    deleteFolderRecursive(process.env.buildPath);
2996a23e08bSopenharmony_ci    config.entry = loadEntryObj(process.env.projectPath, process.env.DEVICE_LEVEL,
3006a23e08bSopenharmony_ci      process.env.abilityType, process.env.aceManifestPath);
3016a23e08bSopenharmony_ci    existsPackageJson(config, path.resolve(process.env.projectPath, '../../../../../package.json'),
3026a23e08bSopenharmony_ci      path.resolve(process.env.projectPath, '../../../../package.json'));
3036a23e08bSopenharmony_ci  }
3046a23e08bSopenharmony_ci  config.cache.cacheDirectory = path.resolve(process.env.cachePath, '.rich_cache',
3056a23e08bSopenharmony_ci    path.basename(process.env.projectPath));
3066a23e08bSopenharmony_ci  config.output.path = path.resolve(__dirname, process.env.buildPath)
3076a23e08bSopenharmony_ci  config.plugins = [
3086a23e08bSopenharmony_ci    new ResourcePlugin(process.env.projectPath, process.env.buildPath,
3096a23e08bSopenharmony_ci      process.env.aceManifestPath, process.env.watchCSSFiles, workerFile),
3106a23e08bSopenharmony_ci    new ResultStates({
3116a23e08bSopenharmony_ci      build: process.env.buildPath
3126a23e08bSopenharmony_ci    }),
3136a23e08bSopenharmony_ci    new webpack.DefinePlugin({
3146a23e08bSopenharmony_ci      STANDARD: JSON.stringify(true),
3156a23e08bSopenharmony_ci      LITE: JSON.stringify(false)
3166a23e08bSopenharmony_ci    })
3176a23e08bSopenharmony_ci  ]
3186a23e08bSopenharmony_ci  config.resolve = {
3196a23e08bSopenharmony_ci    modules: [
3206a23e08bSopenharmony_ci      process.env.projectPath,
3216a23e08bSopenharmony_ci      path.join(process.env.projectPath, '../../../../../'),
3226a23e08bSopenharmony_ci      path.join(__dirname, 'node_modules'),
3236a23e08bSopenharmony_ci      './node_modules',
3246a23e08bSopenharmony_ci      './oh_modules'
3256a23e08bSopenharmony_ci    ],
3266a23e08bSopenharmony_ci    descriptionFiles: ['package.json', 'oh-package.json5'],
3276a23e08bSopenharmony_ci    plugins: [new ReadJsonPlugin()],
3286a23e08bSopenharmony_ci  }
3296a23e08bSopenharmony_ci  if (fs.existsSync(path.resolve(process.env.projectPath, 'i18n'))) {
3306a23e08bSopenharmony_ci    config.plugins.push(new CopyPlugin({
3316a23e08bSopenharmony_ci      patterns: [
3326a23e08bSopenharmony_ci        {
3336a23e08bSopenharmony_ci          from: path.resolve(process.env.projectPath, 'i18n'),
3346a23e08bSopenharmony_ci          to: path.resolve(process.env.buildPath, 'i18n'),
3356a23e08bSopenharmony_ci          noErrorOnMissing: true
3366a23e08bSopenharmony_ci        }
3376a23e08bSopenharmony_ci      ]
3386a23e08bSopenharmony_ci    }))
3396a23e08bSopenharmony_ci  }
3406a23e08bSopenharmony_ci  if (process.env.aceConfigPath && fs.existsSync(process.env.aceConfigPath)) {
3416a23e08bSopenharmony_ci    config.plugins.push(new CopyPlugin({
3426a23e08bSopenharmony_ci      patterns: [
3436a23e08bSopenharmony_ci        {
3446a23e08bSopenharmony_ci          from: path.resolve(process.env.aceConfigPath),
3456a23e08bSopenharmony_ci          to: path.resolve(process.env.buildPath, 'config.json'),
3466a23e08bSopenharmony_ci          noErrorOnMissing: true
3476a23e08bSopenharmony_ci        }
3486a23e08bSopenharmony_ci      ]
3496a23e08bSopenharmony_ci    }))
3506a23e08bSopenharmony_ci  }
3516a23e08bSopenharmony_ci  if (process.env.DEVICE_LEVEL === 'card') {
3526a23e08bSopenharmony_ci    config.module = cardModule
3536a23e08bSopenharmony_ci    config.plugins.push(new AfterEmitPlugin())
3546a23e08bSopenharmony_ci    config.optimization = {};
3556a23e08bSopenharmony_ci    setArkPlugin(env, workerFile);
3566a23e08bSopenharmony_ci  } else {
3576a23e08bSopenharmony_ci    if (process.env.compileMode !== 'moduleJson' && process.env.abilityType === 'page') {
3586a23e08bSopenharmony_ci      Object.assign(config.optimization, {
3596a23e08bSopenharmony_ci        splitChunks: {
3606a23e08bSopenharmony_ci          chunks(chunk) {
3616a23e08bSopenharmony_ci            return !excludeWorker(workerFile, chunk.name) && !/^\.\/TestAbility/.test(chunk.name);
3626a23e08bSopenharmony_ci          },
3636a23e08bSopenharmony_ci          minSize: 0,
3646a23e08bSopenharmony_ci          cacheGroups: {
3656a23e08bSopenharmony_ci            vendors: {
3666a23e08bSopenharmony_ci              test: /[\\/](node|oh)_modules[\\/]/,
3676a23e08bSopenharmony_ci              priority: 20,
3686a23e08bSopenharmony_ci              name: "vendors",
3696a23e08bSopenharmony_ci            },
3706a23e08bSopenharmony_ci            commons: {
3716a23e08bSopenharmony_ci              test: /\.js|css|hml$/,
3726a23e08bSopenharmony_ci              name: 'commons',
3736a23e08bSopenharmony_ci              priority: 10,
3746a23e08bSopenharmony_ci              minChunks: 2,
3756a23e08bSopenharmony_ci            }
3766a23e08bSopenharmony_ci          }
3776a23e08bSopenharmony_ci        },
3786a23e08bSopenharmony_ci      });
3796a23e08bSopenharmony_ci    }
3806a23e08bSopenharmony_ci    setArkPlugin(env, workerFile);
3816a23e08bSopenharmony_ci    if (env.sourceMap === 'none') {
3826a23e08bSopenharmony_ci      config.devtool = false
3836a23e08bSopenharmony_ci    }
3846a23e08bSopenharmony_ci    if (env.buildMode === 'release') {
3856a23e08bSopenharmony_ci      config.mode = 'production';
3866a23e08bSopenharmony_ci      Object.assign(config.optimization, {
3876a23e08bSopenharmony_ci        minimize: true,
3886a23e08bSopenharmony_ci        minimizer: [new TerserPlugin({
3896a23e08bSopenharmony_ci          terserOptions: {
3906a23e08bSopenharmony_ci            compress: {
3916a23e08bSopenharmony_ci              defaults: false,
3926a23e08bSopenharmony_ci              dead_code: true,
3936a23e08bSopenharmony_ci              collapse_vars: true,
3946a23e08bSopenharmony_ci              unused: true,
3956a23e08bSopenharmony_ci              drop_debugger: true,
3966a23e08bSopenharmony_ci              if_return: true,
3976a23e08bSopenharmony_ci              reduce_vars: true,
3986a23e08bSopenharmony_ci              join_vars: false,
3996a23e08bSopenharmony_ci              sequences: 0,
4006a23e08bSopenharmony_ci            },
4016a23e08bSopenharmony_ci            format: {
4026a23e08bSopenharmony_ci              semicolons: false,
4036a23e08bSopenharmony_ci              beautify: true,
4046a23e08bSopenharmony_ci              braces: true,
4056a23e08bSopenharmony_ci              indent_level: 2,
4066a23e08bSopenharmony_ci            },
4076a23e08bSopenharmony_ci          },
4086a23e08bSopenharmony_ci        })],
4096a23e08bSopenharmony_ci      });
4106a23e08bSopenharmony_ci      config.output.devtoolModuleFilenameTemplate = (info) => {
4116a23e08bSopenharmony_ci        const newInfo = info.absoluteResourcePath.replace(process.env.projectRootPath + path.sep, '')
4126a23e08bSopenharmony_ci          .replace(process.env.projectRootPath + path.sep, '')
4136a23e08bSopenharmony_ci          .replace(path.join(__dirname, path.sep), '');
4146a23e08bSopenharmony_ci        return newInfo;
4156a23e08bSopenharmony_ci      }
4166a23e08bSopenharmony_ci      config.output.sourceMapFilename = '_releaseMap/[name].js.map'
4176a23e08bSopenharmony_ci    }
4186a23e08bSopenharmony_ci  }
4196a23e08bSopenharmony_ci  if (process.env.abilityType === 'testrunner') {
4206a23e08bSopenharmony_ci    config.module.rules = [];
4216a23e08bSopenharmony_ci    config.module.rules.unshift({
4226a23e08bSopenharmony_ci      test: /TestRunner/,
4236a23e08bSopenharmony_ci      use: [{
4246a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './index.js')
4256a23e08bSopenharmony_ci      }]
4266a23e08bSopenharmony_ci    })
4276a23e08bSopenharmony_ci  } else {
4286a23e08bSopenharmony_ci    config.module.rules.unshift({
4296a23e08bSopenharmony_ci      test: parseAbilityName(process.env.abilityType, process.env.projectPath),
4306a23e08bSopenharmony_ci      use: [{
4316a23e08bSopenharmony_ci        loader: path.resolve(__dirname, './index.js')
4326a23e08bSopenharmony_ci      }]
4336a23e08bSopenharmony_ci    })
4346a23e08bSopenharmony_ci  }
4356a23e08bSopenharmony_ci
4366a23e08bSopenharmony_ci  config.output.library = process.env.hashProjectPath;
4376a23e08bSopenharmony_ci  return config
4386a23e08bSopenharmony_ci}
439