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