107ac75b1Sopenharmony_ci/*
207ac75b1Sopenharmony_ci * Copyright (c) 2020 Huawei Device Co., Ltd.
307ac75b1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
407ac75b1Sopenharmony_ci * you may not use this file except in compliance with the License.
507ac75b1Sopenharmony_ci * You may obtain a copy of the License at
607ac75b1Sopenharmony_ci *
707ac75b1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
807ac75b1Sopenharmony_ci *
907ac75b1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1007ac75b1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1107ac75b1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1207ac75b1Sopenharmony_ci * See the License for the specific language governing permissions and
1307ac75b1Sopenharmony_ci * limitations under the License.
1407ac75b1Sopenharmony_ci */
1507ac75b1Sopenharmony_ci
1607ac75b1Sopenharmony_ciconst path = require('path');
1707ac75b1Sopenharmony_ciconst fs = require('fs');
1807ac75b1Sopenharmony_ciconst CopyPlugin = require('copy-webpack-plugin');
1907ac75b1Sopenharmony_ciconst Webpack = require('webpack');
2007ac75b1Sopenharmony_ciconst { CleanWebpackPlugin } = require('clean-webpack-plugin');
2107ac75b1Sopenharmony_ciconst { GenAbcPlugin } = require('./lib/gen_abc_plugin');
2207ac75b1Sopenharmony_ciconst buildPipeServer = require('./server/build_pipe_server');
2307ac75b1Sopenharmony_ci
2407ac75b1Sopenharmony_ciconst {
2507ac75b1Sopenharmony_ci  projectConfig,
2607ac75b1Sopenharmony_ci  loadEntryObj,
2707ac75b1Sopenharmony_ci  loadWorker,
2807ac75b1Sopenharmony_ci  abilityConfig,
2907ac75b1Sopenharmony_ci  readWorkerFile,
3007ac75b1Sopenharmony_ci  loadModuleInfo,
3107ac75b1Sopenharmony_ci  checkAppResourcePath,
3207ac75b1Sopenharmony_ci  addSDKBuildDependencies,
3307ac75b1Sopenharmony_ci  readPatchConfig,
3407ac75b1Sopenharmony_ci  getCleanConfig,
3507ac75b1Sopenharmony_ci  globalModulePaths
3607ac75b1Sopenharmony_ci} = require('./main');
3707ac75b1Sopenharmony_ciconst { ResultStates } = require('./lib/compile_info');
3807ac75b1Sopenharmony_ciconst { processUISyntax } = require('./lib/process_ui_syntax');
3907ac75b1Sopenharmony_ciconst {
4007ac75b1Sopenharmony_ci  IGNORE_ERROR_CODE,
4107ac75b1Sopenharmony_ci  removeDir,
4207ac75b1Sopenharmony_ci  mkdirsSync,
4307ac75b1Sopenharmony_ci  getResolveModules
4407ac75b1Sopenharmony_ci} = require('./lib/utils');
4507ac75b1Sopenharmony_ciconst { BUILD_SHARE_PATH, PREBUILDINFO_JSON } = require('./lib/pre_define');
4607ac75b1Sopenharmony_ciprocess.env.watchMode = (process.env.watchMode && process.env.watchMode === 'true') || 'false';
4707ac75b1Sopenharmony_ci
4807ac75b1Sopenharmony_cifunction initConfig(config) {
4907ac75b1Sopenharmony_ci  const projectPath = path.resolve(projectConfig.projectPath);
5007ac75b1Sopenharmony_ci  Object.assign(config, {
5107ac75b1Sopenharmony_ci    entry: projectConfig.entryObj,
5207ac75b1Sopenharmony_ci    watch: process.env.watchMode === 'true',
5307ac75b1Sopenharmony_ci    watchOptions: {
5407ac75b1Sopenharmony_ci      aggregateTimeout: 10,
5507ac75b1Sopenharmony_ci      poll: false,
5607ac75b1Sopenharmony_ci      ignored: /node_modules/
5707ac75b1Sopenharmony_ci    },
5807ac75b1Sopenharmony_ci    output: {
5907ac75b1Sopenharmony_ci      path: path.resolve(__dirname, projectConfig.buildPath),
6007ac75b1Sopenharmony_ci      filename: '[name].js',
6107ac75b1Sopenharmony_ci      devtoolModuleFilenameTemplate: 'webpack:///[absolute-resource-path]',
6207ac75b1Sopenharmony_ci      globalObject: 'globalThis'
6307ac75b1Sopenharmony_ci    },
6407ac75b1Sopenharmony_ci    devtool: 'nosources-source-map',
6507ac75b1Sopenharmony_ci    mode: 'development',
6607ac75b1Sopenharmony_ci    module: {
6707ac75b1Sopenharmony_ci      rules: [
6807ac75b1Sopenharmony_ci        {
6907ac75b1Sopenharmony_ci          test: /\.d\.ts/,
7007ac75b1Sopenharmony_ci          use: [{ loader: path.resolve(__dirname, 'lib/process_dts_file.js') }]
7107ac75b1Sopenharmony_ci        },
7207ac75b1Sopenharmony_ci        {
7307ac75b1Sopenharmony_ci          test: /(?<!\.d)\.(ets|ts)$/,
7407ac75b1Sopenharmony_ci          use: [
7507ac75b1Sopenharmony_ci            { loader: path.resolve(__dirname, 'lib/result_process.js') },
7607ac75b1Sopenharmony_ci            {
7707ac75b1Sopenharmony_ci              loader: 'ts-loader',
7807ac75b1Sopenharmony_ci              options: {
7907ac75b1Sopenharmony_ci                reportFiles: ['*.js'],
8007ac75b1Sopenharmony_ci                onlyCompileBundledFiles: true,
8107ac75b1Sopenharmony_ci                transpileOnly: true,
8207ac75b1Sopenharmony_ci                configFile: path.resolve(__dirname,
8307ac75b1Sopenharmony_ci                  projectConfig.compileMode === 'esmodule' ? 'tsconfig.esm.json' : 'tsconfig.json'),
8407ac75b1Sopenharmony_ci                getCustomTransformers(program) {
8507ac75b1Sopenharmony_ci                  let transformerOperation = {
8607ac75b1Sopenharmony_ci                    before: [processUISyntax(program)],
8707ac75b1Sopenharmony_ci                    after: []
8807ac75b1Sopenharmony_ci                  };
8907ac75b1Sopenharmony_ci
9007ac75b1Sopenharmony_ci                  return transformerOperation;
9107ac75b1Sopenharmony_ci                },
9207ac75b1Sopenharmony_ci                ignoreDiagnostics: IGNORE_ERROR_CODE
9307ac75b1Sopenharmony_ci              }
9407ac75b1Sopenharmony_ci            },
9507ac75b1Sopenharmony_ci            { loader: path.resolve(__dirname, 'lib/pre_process.js') }
9607ac75b1Sopenharmony_ci          ]
9707ac75b1Sopenharmony_ci        },
9807ac75b1Sopenharmony_ci        setJsConfigRule()
9907ac75b1Sopenharmony_ci      ]
10007ac75b1Sopenharmony_ci    },
10107ac75b1Sopenharmony_ci    node: {
10207ac75b1Sopenharmony_ci      global: false
10307ac75b1Sopenharmony_ci    },
10407ac75b1Sopenharmony_ci    resolve: {
10507ac75b1Sopenharmony_ci      symlinks: projectConfig.compileMode === 'esmodule' ? false : true,
10607ac75b1Sopenharmony_ci      extensions: ['.js', '.ets', '.ts', '.d.ts', '.d.ets'],
10707ac75b1Sopenharmony_ci      modules: [
10807ac75b1Sopenharmony_ci        projectPath,
10907ac75b1Sopenharmony_ci        './node_modules',
11007ac75b1Sopenharmony_ci        path.join(__dirname, 'node_modules'),
11107ac75b1Sopenharmony_ci        ...globalModulePaths
11207ac75b1Sopenharmony_ci      ]
11307ac75b1Sopenharmony_ci    },
11407ac75b1Sopenharmony_ci    stats: { preset: 'none' },
11507ac75b1Sopenharmony_ci    plugins: [
11607ac75b1Sopenharmony_ci      new Webpack.WatchIgnorePlugin({
11707ac75b1Sopenharmony_ci        paths: [
11807ac75b1Sopenharmony_ci          /\.d\.ts$/
11907ac75b1Sopenharmony_ci        ]
12007ac75b1Sopenharmony_ci      }),
12107ac75b1Sopenharmony_ci      new ResultStates()
12207ac75b1Sopenharmony_ci    ]
12307ac75b1Sopenharmony_ci  });
12407ac75b1Sopenharmony_ci  setModuleJsonConfigRule(config);
12507ac75b1Sopenharmony_ci  if (!projectConfig.xtsMode) {
12607ac75b1Sopenharmony_ci    config.cache = {
12707ac75b1Sopenharmony_ci      type: 'filesystem',
12807ac75b1Sopenharmony_ci      cacheDirectory: path.resolve(projectConfig.cachePath, '.ets_cache',
12907ac75b1Sopenharmony_ci        path.basename(projectConfig.projectPath))
13007ac75b1Sopenharmony_ci    };
13107ac75b1Sopenharmony_ci  }
13207ac75b1Sopenharmony_ci  if (!projectConfig.aceModuleJsonPath) {
13307ac75b1Sopenharmony_ci    config.resolve.modules.push(...getResolveModules(projectPath, true));
13407ac75b1Sopenharmony_ci    existsPackageJson(config, path.resolve(projectPath, '../../../../../package.json'),
13507ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../package.json'));
13607ac75b1Sopenharmony_ci  } else {
13707ac75b1Sopenharmony_ci    config.resolve.modules.push(...getResolveModules(projectPath, false));
13807ac75b1Sopenharmony_ci    existsPackageJson(config, path.resolve(projectPath, '../../../../package.json'),
13907ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../package.json'));
14007ac75b1Sopenharmony_ci  }
14107ac75b1Sopenharmony_ci}
14207ac75b1Sopenharmony_ci
14307ac75b1Sopenharmony_cifunction setJsConfigRule() {
14407ac75b1Sopenharmony_ci  const jsRule = {
14507ac75b1Sopenharmony_ci    test: /\.js$/,
14607ac75b1Sopenharmony_ci    use: [
14707ac75b1Sopenharmony_ci      { loader: path.resolve(__dirname, 'lib/process_source_file.js') },
14807ac75b1Sopenharmony_ci      {
14907ac75b1Sopenharmony_ci        loader: 'babel-loader',
15007ac75b1Sopenharmony_ci        options: {
15107ac75b1Sopenharmony_ci          plugins: ['@babel/plugin-proposal-class-properties'],
15207ac75b1Sopenharmony_ci          compact: false
15307ac75b1Sopenharmony_ci        }
15407ac75b1Sopenharmony_ci      },
15507ac75b1Sopenharmony_ci      { loader: path.resolve(__dirname, 'lib/process_system_module.js') }
15607ac75b1Sopenharmony_ci    ]
15707ac75b1Sopenharmony_ci  };
15807ac75b1Sopenharmony_ci  if (projectConfig.compileMode !== 'esmodule') {
15907ac75b1Sopenharmony_ci    jsRule.type = 'javascript/auto';
16007ac75b1Sopenharmony_ci    jsRule.use[1].options.plugins.unshift([
16107ac75b1Sopenharmony_ci      '@babel/plugin-transform-modules-commonjs',
16207ac75b1Sopenharmony_ci      {
16307ac75b1Sopenharmony_ci        'allowTopLevelThis': true
16407ac75b1Sopenharmony_ci      }
16507ac75b1Sopenharmony_ci    ]);
16607ac75b1Sopenharmony_ci  } else {
16707ac75b1Sopenharmony_ci    jsRule.resolve = { fullySpecified: false };
16807ac75b1Sopenharmony_ci  }
16907ac75b1Sopenharmony_ci  if (projectConfig.compileHar) {
17007ac75b1Sopenharmony_ci    jsRule.use.unshift({ loader: path.resolve(__dirname, 'lib/process_har_writejs.js')});
17107ac75b1Sopenharmony_ci  }
17207ac75b1Sopenharmony_ci  return jsRule;
17307ac75b1Sopenharmony_ci}
17407ac75b1Sopenharmony_ci
17507ac75b1Sopenharmony_cifunction setModuleJsonConfigRule(config) {
17607ac75b1Sopenharmony_ci  if (projectConfig.compileMode !== 'esmodule') {
17707ac75b1Sopenharmony_ci    return;
17807ac75b1Sopenharmony_ci  }
17907ac75b1Sopenharmony_ci  const jsonRule = {
18007ac75b1Sopenharmony_ci    test: /\.json$/,
18107ac75b1Sopenharmony_ci    use: [
18207ac75b1Sopenharmony_ci      { loader: path.resolve(__dirname, 'lib/process_source_file.js') }
18307ac75b1Sopenharmony_ci    ]
18407ac75b1Sopenharmony_ci  };
18507ac75b1Sopenharmony_ci  config.module.rules.push(jsonRule);
18607ac75b1Sopenharmony_ci}
18707ac75b1Sopenharmony_ci
18807ac75b1Sopenharmony_cifunction existsPackageJson(config, rootPackageJsonPath, modulePackageJsonPath) {
18907ac75b1Sopenharmony_ci  if (config.cache) {
19007ac75b1Sopenharmony_ci    config.cache.buildDependencies = {
19107ac75b1Sopenharmony_ci      config: []
19207ac75b1Sopenharmony_ci    };
19307ac75b1Sopenharmony_ci    if (fs.existsSync(rootPackageJsonPath)) {
19407ac75b1Sopenharmony_ci      config.cache.buildDependencies.config.push(rootPackageJsonPath);
19507ac75b1Sopenharmony_ci    }
19607ac75b1Sopenharmony_ci    if (fs.existsSync(modulePackageJsonPath)) {
19707ac75b1Sopenharmony_ci      config.cache.buildDependencies.config.push(modulePackageJsonPath);
19807ac75b1Sopenharmony_ci    }
19907ac75b1Sopenharmony_ci  }
20007ac75b1Sopenharmony_ci}
20107ac75b1Sopenharmony_ci
20207ac75b1Sopenharmony_cifunction setProjectConfig(envArgs) {
20307ac75b1Sopenharmony_ci  const args = Object.keys(envArgs);
20407ac75b1Sopenharmony_ci  if (args.indexOf('projectName') === args.length - 2) {
20507ac75b1Sopenharmony_ci    projectConfig.projectPath = path.join(process.cwd(), args[args.length - 1]);
20607ac75b1Sopenharmony_ci  }
20707ac75b1Sopenharmony_ci  if (envArgs.aceModuleRoot) {
20807ac75b1Sopenharmony_ci    projectConfig.projectPath = envArgs.aceModuleRoot;
20907ac75b1Sopenharmony_ci  }
21007ac75b1Sopenharmony_ci  if (envArgs.aceModuleBuild) {
21107ac75b1Sopenharmony_ci    projectConfig.buildPath = envArgs.aceModuleBuild;
21207ac75b1Sopenharmony_ci  }
21307ac75b1Sopenharmony_ci  if (envArgs.aceManifestPath) {
21407ac75b1Sopenharmony_ci    projectConfig.manifestFilePath = envArgs.aceManifestPath;
21507ac75b1Sopenharmony_ci  }
21607ac75b1Sopenharmony_ci  if (envArgs.aceProfilePath) {
21707ac75b1Sopenharmony_ci    projectConfig.aceProfilePath = envArgs.aceProfilePath;
21807ac75b1Sopenharmony_ci  }
21907ac75b1Sopenharmony_ci  if (envArgs.aceModuleJsonPath) {
22007ac75b1Sopenharmony_ci    projectConfig.aceModuleJsonPath = envArgs.aceModuleJsonPath;
22107ac75b1Sopenharmony_ci  }
22207ac75b1Sopenharmony_ci  if (envArgs.cachePath) {
22307ac75b1Sopenharmony_ci    projectConfig.cachePath = envArgs.cachePath;
22407ac75b1Sopenharmony_ci  }
22507ac75b1Sopenharmony_ci  if (envArgs.isPreview === 'true') {
22607ac75b1Sopenharmony_ci    projectConfig.isPreview = true;
22707ac75b1Sopenharmony_ci  }
22807ac75b1Sopenharmony_ci}
22907ac75b1Sopenharmony_ci
23007ac75b1Sopenharmony_cifunction setReleaseConfig(config) {
23107ac75b1Sopenharmony_ci  const TerserPlugin = require('terser-webpack-plugin');
23207ac75b1Sopenharmony_ci  config.mode = 'production';
23307ac75b1Sopenharmony_ci  if ((process.env.compileMode !== 'moduleJson' || projectConfig.splitCommon) &&
23407ac75b1Sopenharmony_ci    abilityConfig.abilityType === 'page') {
23507ac75b1Sopenharmony_ci    config.optimization = config.optimization;
23607ac75b1Sopenharmony_ci  } else {
23707ac75b1Sopenharmony_ci    config.optimization = {};
23807ac75b1Sopenharmony_ci  }
23907ac75b1Sopenharmony_ci  Object.assign(config.optimization, {
24007ac75b1Sopenharmony_ci    emitOnErrors: true,
24107ac75b1Sopenharmony_ci    usedExports: false,
24207ac75b1Sopenharmony_ci    minimize: true,
24307ac75b1Sopenharmony_ci    minimizer: [new TerserPlugin({
24407ac75b1Sopenharmony_ci      terserOptions: {
24507ac75b1Sopenharmony_ci        compress: {
24607ac75b1Sopenharmony_ci          defaults: false,
24707ac75b1Sopenharmony_ci          dead_code: true,
24807ac75b1Sopenharmony_ci          collapse_vars: true,
24907ac75b1Sopenharmony_ci          unused: true,
25007ac75b1Sopenharmony_ci          drop_debugger: true,
25107ac75b1Sopenharmony_ci          if_return: true,
25207ac75b1Sopenharmony_ci          reduce_vars: true,
25307ac75b1Sopenharmony_ci          join_vars: false,
25407ac75b1Sopenharmony_ci          sequences: 0
25507ac75b1Sopenharmony_ci        },
25607ac75b1Sopenharmony_ci        format: {
25707ac75b1Sopenharmony_ci          semicolons: false,
25807ac75b1Sopenharmony_ci          beautify: true,
25907ac75b1Sopenharmony_ci          braces: true,
26007ac75b1Sopenharmony_ci          indent_level: 2
26107ac75b1Sopenharmony_ci        }
26207ac75b1Sopenharmony_ci      }
26307ac75b1Sopenharmony_ci    })]
26407ac75b1Sopenharmony_ci  });
26507ac75b1Sopenharmony_ci  config.output.devtoolModuleFilenameTemplate = (info) => {
26607ac75b1Sopenharmony_ci    return `webpack:///${info.absoluteResourcePath.replace(projectConfig.projectRootPath, '')}`;
26707ac75b1Sopenharmony_ci  };
26807ac75b1Sopenharmony_ci  config.output.sourceMapFilename = '_releaseMap/[name].js.map';
26907ac75b1Sopenharmony_ci  config.performance = {
27007ac75b1Sopenharmony_ci    hints: false
27107ac75b1Sopenharmony_ci  };
27207ac75b1Sopenharmony_ci}
27307ac75b1Sopenharmony_ci
27407ac75b1Sopenharmony_cifunction setCopyPluginConfig(config, appResource, isPreview) {
27507ac75b1Sopenharmony_ci  const copyPluginPattrens = [];
27607ac75b1Sopenharmony_ci  copyPluginPattrens.push({
27707ac75b1Sopenharmony_ci    from: '**/*',
27807ac75b1Sopenharmony_ci    context: path.resolve(__dirname, projectConfig.projectPath),
27907ac75b1Sopenharmony_ci    globOptions: {
28007ac75b1Sopenharmony_ci      ignore: [
28107ac75b1Sopenharmony_ci        '**/*.ets',
28207ac75b1Sopenharmony_ci        '**/*.ts',
28307ac75b1Sopenharmony_ci        '**/*.js',
28407ac75b1Sopenharmony_ci        path.resolve(__dirname, projectConfig.buildPath, '**').replace(/\\/g, '/')
28507ac75b1Sopenharmony_ci      ]
28607ac75b1Sopenharmony_ci    },
28707ac75b1Sopenharmony_ci    to: path.resolve(__dirname, projectConfig.buildPath),
28807ac75b1Sopenharmony_ci    noErrorOnMissing: true
28907ac75b1Sopenharmony_ci  });
29007ac75b1Sopenharmony_ci  const sharePath = path.resolve(__dirname, projectConfig.projectPath, BUILD_SHARE_PATH);
29107ac75b1Sopenharmony_ci  if (fs.existsSync(sharePath)) {
29207ac75b1Sopenharmony_ci    copyPluginPattrens.push({
29307ac75b1Sopenharmony_ci      from: '**/*',
29407ac75b1Sopenharmony_ci      context: path.resolve(__dirname, projectConfig.projectPath, BUILD_SHARE_PATH),
29507ac75b1Sopenharmony_ci      to: path.resolve(__dirname, projectConfig.buildPath, BUILD_SHARE_PATH),
29607ac75b1Sopenharmony_ci      globOptions: {
29707ac75b1Sopenharmony_ci        ignore: [
29807ac75b1Sopenharmony_ci          '**/*.ets',
29907ac75b1Sopenharmony_ci          '**/*.ts',
30007ac75b1Sopenharmony_ci          '**/*.js',
30107ac75b1Sopenharmony_ci        ]
30207ac75b1Sopenharmony_ci      },
30307ac75b1Sopenharmony_ci      noErrorOnMissing: true
30407ac75b1Sopenharmony_ci    });
30507ac75b1Sopenharmony_ci  }
30607ac75b1Sopenharmony_ci  if (abilityConfig.abilityType === 'page') {
30707ac75b1Sopenharmony_ci    if (fs.existsSync(projectConfig.manifestFilePath)) {
30807ac75b1Sopenharmony_ci      copyPluginPattrens.push({
30907ac75b1Sopenharmony_ci        from: projectConfig.manifestFilePath,
31007ac75b1Sopenharmony_ci        to: path.resolve(__dirname, projectConfig.buildPath)
31107ac75b1Sopenharmony_ci      });
31207ac75b1Sopenharmony_ci    } else if (fs.existsSync(projectConfig.aceConfigPath)) {
31307ac75b1Sopenharmony_ci      copyPluginPattrens.push({
31407ac75b1Sopenharmony_ci        from: projectConfig.aceConfigPath,
31507ac75b1Sopenharmony_ci        to: path.resolve(__dirname, projectConfig.buildPath)
31607ac75b1Sopenharmony_ci      });
31707ac75b1Sopenharmony_ci    }
31807ac75b1Sopenharmony_ci  }
31907ac75b1Sopenharmony_ci  if (appResource && fs.existsSync(appResource) && !projectConfig.xtsMode &&
32007ac75b1Sopenharmony_ci    isPreview === 'true') {
32107ac75b1Sopenharmony_ci    copyPluginPattrens.push({
32207ac75b1Sopenharmony_ci      from: path.resolve(__dirname, appResource),
32307ac75b1Sopenharmony_ci      to: path.resolve(__dirname, projectConfig.cachePath)
32407ac75b1Sopenharmony_ci    });
32507ac75b1Sopenharmony_ci  }
32607ac75b1Sopenharmony_ci  config.plugins.push(new CopyPlugin({ patterns: copyPluginPattrens }));
32707ac75b1Sopenharmony_ci}
32807ac75b1Sopenharmony_ci
32907ac75b1Sopenharmony_cifunction excludeWorker(workerFile, name) {
33007ac75b1Sopenharmony_ci  if (workerFile) {
33107ac75b1Sopenharmony_ci    return Object.keys(workerFile).includes(name);
33207ac75b1Sopenharmony_ci  }
33307ac75b1Sopenharmony_ci  return /^\.\/workers\//.test(name);
33407ac75b1Sopenharmony_ci}
33507ac75b1Sopenharmony_ci
33607ac75b1Sopenharmony_cifunction setOptimizationConfig(config, workerFile) {
33707ac75b1Sopenharmony_ci  if ((process.env.compileMode !== 'moduleJson' || projectConfig.splitCommon) &&
33807ac75b1Sopenharmony_ci    abilityConfig.abilityType === 'page') {
33907ac75b1Sopenharmony_ci    config.optimization = {
34007ac75b1Sopenharmony_ci      splitChunks: {
34107ac75b1Sopenharmony_ci        chunks(chunk) {
34207ac75b1Sopenharmony_ci          return !excludeWorker(workerFile, chunk.name) && !/^\.\/TestAbility/.test(chunk.name);
34307ac75b1Sopenharmony_ci        },
34407ac75b1Sopenharmony_ci        minSize: 0,
34507ac75b1Sopenharmony_ci        cacheGroups: {
34607ac75b1Sopenharmony_ci          vendors: {
34707ac75b1Sopenharmony_ci            test: /[\\/]node_modules[\\/]/,
34807ac75b1Sopenharmony_ci            priority: -10,
34907ac75b1Sopenharmony_ci            name: 'vendors',
35007ac75b1Sopenharmony_ci          },
35107ac75b1Sopenharmony_ci          commons: {
35207ac75b1Sopenharmony_ci            name: 'commons',
35307ac75b1Sopenharmony_ci            priority: -20,
35407ac75b1Sopenharmony_ci            minChunks: 2,
35507ac75b1Sopenharmony_ci            reuseExistingChunk: true
35607ac75b1Sopenharmony_ci          }
35707ac75b1Sopenharmony_ci        }
35807ac75b1Sopenharmony_ci      }
35907ac75b1Sopenharmony_ci    };
36007ac75b1Sopenharmony_ci  }
36107ac75b1Sopenharmony_ci}
36207ac75b1Sopenharmony_ci
36307ac75b1Sopenharmony_cifunction setGenAbcPlugin(env, config) {
36407ac75b1Sopenharmony_ci  process.env.compilerType = 'ark';
36507ac75b1Sopenharmony_ci  process.env.panda = projectConfig.pandaMode;
36607ac75b1Sopenharmony_ci  let arkDir = path.join(__dirname, 'bin', 'ark');
36707ac75b1Sopenharmony_ci  if (env.arkFrontendDir) {
36807ac75b1Sopenharmony_ci    arkDir = env.arkFrontendDir;
36907ac75b1Sopenharmony_ci  }
37007ac75b1Sopenharmony_ci  let nodeJs = 'node';
37107ac75b1Sopenharmony_ci  if (env.nodeJs) {
37207ac75b1Sopenharmony_ci    nodeJs = env.nodeJs;
37307ac75b1Sopenharmony_ci  }
37407ac75b1Sopenharmony_ci  config.plugins.push(new GenAbcPlugin(projectConfig.buildPath, arkDir, nodeJs,
37507ac75b1Sopenharmony_ci    env.buildMode === 'debug'));
37607ac75b1Sopenharmony_ci  if (env.buildMode === 'release') {
37707ac75b1Sopenharmony_ci    config.output.path = path.join(projectConfig.cachePath, 'releaseAssets',
37807ac75b1Sopenharmony_ci      path.basename(projectConfig.buildPath));
37907ac75b1Sopenharmony_ci  }
38007ac75b1Sopenharmony_ci}
38107ac75b1Sopenharmony_ci
38207ac75b1Sopenharmony_cifunction setCleanWebpackPlugin(workerFile, config) {
38307ac75b1Sopenharmony_ci  config.plugins.push(
38407ac75b1Sopenharmony_ci    new CleanWebpackPlugin({
38507ac75b1Sopenharmony_ci      dry: false,
38607ac75b1Sopenharmony_ci      dangerouslyAllowCleanPatternsOutsideProject: true,
38707ac75b1Sopenharmony_ci      cleanOnceBeforeBuildPatterns: getCleanConfig(workerFile)
38807ac75b1Sopenharmony_ci    })
38907ac75b1Sopenharmony_ci  );
39007ac75b1Sopenharmony_ci}
39107ac75b1Sopenharmony_ci
39207ac75b1Sopenharmony_cifunction clearWebpackCacheByBuildInfo() {
39307ac75b1Sopenharmony_ci  if (!projectConfig.cachePath || projectConfig.xtsMode) {
39407ac75b1Sopenharmony_ci    return;
39507ac75b1Sopenharmony_ci  }
39607ac75b1Sopenharmony_ci
39707ac75b1Sopenharmony_ci  // clear&update cache dir when build info is different from last time
39807ac75b1Sopenharmony_ci  const cachePrebuildInfoPath = path.join(projectConfig.cachePath, PREBUILDINFO_JSON);
39907ac75b1Sopenharmony_ci  if (fs.existsSync(cachePrebuildInfoPath)) {
40007ac75b1Sopenharmony_ci    let cachedJson = undefined;
40107ac75b1Sopenharmony_ci    try {
40207ac75b1Sopenharmony_ci      cachedJson = JSON.parse(fs.readFileSync(cachePrebuildInfoPath).toString());
40307ac75b1Sopenharmony_ci    } catch {
40407ac75b1Sopenharmony_ci      removeDir(projectConfig.cachePath);
40507ac75b1Sopenharmony_ci      mkdirsSync(projectConfig.cachePath);
40607ac75b1Sopenharmony_ci    }
40707ac75b1Sopenharmony_ci    if (projectConfig.compileMode === 'esmodule' && cachedJson &&
40807ac75b1Sopenharmony_ci      (cachedJson.buildMode && cachedJson.buildMode !== projectConfig.buildArkMode ||
40907ac75b1Sopenharmony_ci      cachedJson.bundleName && cachedJson.bundleName !== projectConfig.bundleName ||
41007ac75b1Sopenharmony_ci      cachedJson.moduleName && cachedJson.moduleName !== projectConfig.moduleName)) {
41107ac75b1Sopenharmony_ci      removeDir(projectConfig.cachePath);
41207ac75b1Sopenharmony_ci      mkdirsSync(projectConfig.cachePath);
41307ac75b1Sopenharmony_ci    }
41407ac75b1Sopenharmony_ci    // api version is 8 or 9
41507ac75b1Sopenharmony_ci    if (projectConfig.compileMode === 'jsbundle' && cachedJson &&
41607ac75b1Sopenharmony_ci      cachedJson.minAPIVersion && cachedJson.minAPIVersion.toString() !== process.env.minPlatformVersion) {
41707ac75b1Sopenharmony_ci      removeDir(projectConfig.cachePath);
41807ac75b1Sopenharmony_ci      mkdirsSync(projectConfig.cachePath);
41907ac75b1Sopenharmony_ci    }
42007ac75b1Sopenharmony_ci  }
42107ac75b1Sopenharmony_ci}
42207ac75b1Sopenharmony_ci
42307ac75b1Sopenharmony_cimodule.exports = (env, argv) => {
42407ac75b1Sopenharmony_ci  const config = {};
42507ac75b1Sopenharmony_ci  setProjectConfig(env);
42607ac75b1Sopenharmony_ci  loadEntryObj(projectConfig);
42707ac75b1Sopenharmony_ci  loadModuleInfo(projectConfig, env);
42807ac75b1Sopenharmony_ci  clearWebpackCacheByBuildInfo();
42907ac75b1Sopenharmony_ci  initConfig(config);
43007ac75b1Sopenharmony_ci  readPatchConfig();
43107ac75b1Sopenharmony_ci  const workerFile = readWorkerFile();
43207ac75b1Sopenharmony_ci  setOptimizationConfig(config, workerFile);
43307ac75b1Sopenharmony_ci  setCleanWebpackPlugin(workerFile, config);
43407ac75b1Sopenharmony_ci
43507ac75b1Sopenharmony_ci  if (env.isPreview !== 'true') {
43607ac75b1Sopenharmony_ci    loadWorker(projectConfig, workerFile);
43707ac75b1Sopenharmony_ci    if (env.compilerType && env.compilerType === 'ark' && !projectConfig.compileHar) {
43807ac75b1Sopenharmony_ci      setGenAbcPlugin(env, config);
43907ac75b1Sopenharmony_ci    }
44007ac75b1Sopenharmony_ci  } else {
44107ac75b1Sopenharmony_ci    projectConfig.isPreview = true;
44207ac75b1Sopenharmony_ci    projectConfig.checkEntry = env.checkEntry;
44307ac75b1Sopenharmony_ci    setGenAbcPlugin(env, config);
44407ac75b1Sopenharmony_ci    let port;
44507ac75b1Sopenharmony_ci    process.argv.forEach((val, index) => {
44607ac75b1Sopenharmony_ci      if (val.startsWith('port=')) {
44707ac75b1Sopenharmony_ci        port = val.split('=')[1];
44807ac75b1Sopenharmony_ci      }
44907ac75b1Sopenharmony_ci    });
45007ac75b1Sopenharmony_ci    if (port) {
45107ac75b1Sopenharmony_ci      buildPipeServer.init(port);
45207ac75b1Sopenharmony_ci    }
45307ac75b1Sopenharmony_ci  }
45407ac75b1Sopenharmony_ci
45507ac75b1Sopenharmony_ci  if (projectConfig.compileHar && env.obfuscate === 'uglify') {
45607ac75b1Sopenharmony_ci    projectConfig.obfuscateHarType = 'uglify';
45707ac75b1Sopenharmony_ci  }
45807ac75b1Sopenharmony_ci
45907ac75b1Sopenharmony_ci  if (env.sourceMap === 'none') {
46007ac75b1Sopenharmony_ci    config.devtool = false;
46107ac75b1Sopenharmony_ci  }
46207ac75b1Sopenharmony_ci
46307ac75b1Sopenharmony_ci  if (env.buildMode === 'release' && projectConfig.compileMode !== 'esmodule') {
46407ac75b1Sopenharmony_ci    setReleaseConfig(config);
46507ac75b1Sopenharmony_ci  }
46607ac75b1Sopenharmony_ci
46707ac75b1Sopenharmony_ci  if (projectConfig.compileMode === 'esmodule' && projectConfig.harNameOhmMap) {
46807ac75b1Sopenharmony_ci    config.externals = [];
46907ac75b1Sopenharmony_ci    for (const harName in projectConfig.harNameOhmMap) {
47007ac75b1Sopenharmony_ci      config.externals.push(RegExp('^(' + harName + ')($|\\/\\S+)'));
47107ac75b1Sopenharmony_ci    }
47207ac75b1Sopenharmony_ci  }
47307ac75b1Sopenharmony_ci
47407ac75b1Sopenharmony_ci  const appResourcePath = env.appResource || process.env.appResource;
47507ac75b1Sopenharmony_ci  checkAppResourcePath(appResourcePath, config);
47607ac75b1Sopenharmony_ci  setCopyPluginConfig(config, appResourcePath, env.isPreview);
47707ac75b1Sopenharmony_ci  addSDKBuildDependencies(config);
47807ac75b1Sopenharmony_ci  config.output.library = projectConfig.hashProjectPath;
47907ac75b1Sopenharmony_ci  return config;
48007ac75b1Sopenharmony_ci};
481