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_ciconst fs = require('fs'); 176a23e08bSopenharmony_ciconst path = require('path'); 186a23e08bSopenharmony_ciconst cluster = require('cluster'); 196a23e08bSopenharmony_ciconst process = require('process'); 206a23e08bSopenharmony_ciconst crypto = require('crypto'); 216a23e08bSopenharmony_ciconst events = require('events'); 226a23e08bSopenharmony_ciconst os = require('os'); 236a23e08bSopenharmony_ciconst childProcess = require('child_process'); 246a23e08bSopenharmony_ci 256a23e08bSopenharmony_ciconst forward = '(global.___mainEntry___ = function (globalObjects) {' + '\n' + 266a23e08bSopenharmony_ci ' var define = globalObjects.define;' + '\n' + 276a23e08bSopenharmony_ci ' var require = globalObjects.require;' + '\n' + 286a23e08bSopenharmony_ci ' var bootstrap = globalObjects.bootstrap;' + '\n' + 296a23e08bSopenharmony_ci ' var register = globalObjects.register;' + '\n' + 306a23e08bSopenharmony_ci ' var render = globalObjects.render;' + '\n' + 316a23e08bSopenharmony_ci ' var $app_define$ = globalObjects.$app_define$;' + '\n' + 326a23e08bSopenharmony_ci ' var $app_bootstrap$ = globalObjects.$app_bootstrap$;' + '\n' + 336a23e08bSopenharmony_ci ' var $app_require$ = globalObjects.$app_require$;' + '\n' + 346a23e08bSopenharmony_ci ' var history = globalObjects.history;' + '\n' + 356a23e08bSopenharmony_ci ' var Image = globalObjects.Image;' + '\n' + 366a23e08bSopenharmony_ci ' var OffscreenCanvas = globalObjects.OffscreenCanvas;' + '\n' + 376a23e08bSopenharmony_ci ' (function(global) {' + '\n' + 386a23e08bSopenharmony_ci ' "use strict";' + '\n'; 396a23e08bSopenharmony_ciconst last = '\n' + '})(this.__appProto__);' + '\n' + '})'; 406a23e08bSopenharmony_ciconst genAbcScript = 'gen-abc.js'; 416a23e08bSopenharmony_cilet output; 426a23e08bSopenharmony_cilet isWin = false; 436a23e08bSopenharmony_cilet isMac = false; 446a23e08bSopenharmony_cilet isDebug = false; 456a23e08bSopenharmony_cilet arkDir; 466a23e08bSopenharmony_cilet nodeJs; 476a23e08bSopenharmony_cilet intermediateJsBundle = []; 486a23e08bSopenharmony_cilet workerFile = null; 496a23e08bSopenharmony_cilet fileterIntermediateJsBundle = []; 506a23e08bSopenharmony_cilet hashJsonObject = {}; 516a23e08bSopenharmony_cilet buildPathInfo = ""; 526a23e08bSopenharmony_ciconst SUCCESS = 0; 536a23e08bSopenharmony_ciconst FAIL = 1; 546a23e08bSopenharmony_ciconst red = '\u001b[31m'; 556a23e08bSopenharmony_ciconst reset = '\u001b[39m'; 566a23e08bSopenharmony_ciconst blue = '\u001b[34m'; 576a23e08bSopenharmony_ciconst hashFile = 'gen_hash.json'; 586a23e08bSopenharmony_ciconst ARK = '/ark/'; 596a23e08bSopenharmony_ciconst NODE_MODULES = 'node_modules'; 606a23e08bSopenharmony_ciconst TEMPORARY = 'temporary'; 616a23e08bSopenharmony_ciconst TS2ABC = 'ts2abc'; 626a23e08bSopenharmony_ciconst ES2ABC = 'es2abc'; 636a23e08bSopenharmony_ciconst WINDOWS = 'Windows_NT'; 646a23e08bSopenharmony_ciconst LINUX = 'Linux'; 656a23e08bSopenharmony_ciconst MAC = 'Darwin'; 666a23e08bSopenharmony_ciconst FILESINFO_TXT = 'filesInfo.txt'; 676a23e08bSopenharmony_ciconst manageBunldeWorkersScript = 'manage-bundle-workers.js'; 686a23e08bSopenharmony_ciconst PREBUILDINFO_JSON = 'preBuildInfo.json'; 696a23e08bSopenharmony_ci 706a23e08bSopenharmony_ciclass GenAbcPlugin { 716a23e08bSopenharmony_ci constructor(output_, arkDir_, nodeJs_, workerFile_, isDebug_) { 726a23e08bSopenharmony_ci output = output_; 736a23e08bSopenharmony_ci arkDir = arkDir_; 746a23e08bSopenharmony_ci nodeJs = nodeJs_; 756a23e08bSopenharmony_ci isDebug = isDebug_; 766a23e08bSopenharmony_ci workerFile = workerFile_; 776a23e08bSopenharmony_ci } 786a23e08bSopenharmony_ci apply(compiler) { 796a23e08bSopenharmony_ci if (fs.existsSync(path.resolve(arkDir, 'build-win'))) { 806a23e08bSopenharmony_ci isWin = true; 816a23e08bSopenharmony_ci } else if (fs.existsSync(path.resolve(arkDir, 'build-mac'))) { 826a23e08bSopenharmony_ci isMac = true; 836a23e08bSopenharmony_ci } else if (!fs.existsSync(path.resolve(arkDir, 'build'))) { 846a23e08bSopenharmony_ci console.error(red, 'ERROR find build fail', reset); 856a23e08bSopenharmony_ci process.exitCode = FAIL; 866a23e08bSopenharmony_ci return; 876a23e08bSopenharmony_ci } 886a23e08bSopenharmony_ci 896a23e08bSopenharmony_ci if (!checkNodeModules()) { 906a23e08bSopenharmony_ci process.exitCode = FAIL; 916a23e08bSopenharmony_ci return; 926a23e08bSopenharmony_ci } 936a23e08bSopenharmony_ci 946a23e08bSopenharmony_ci // for preview mode max listeners 956a23e08bSopenharmony_ci events.EventEmitter.defaultMaxListeners = 100; 966a23e08bSopenharmony_ci 976a23e08bSopenharmony_ci compiler.hooks.emit.tap('GenAbcPlugin', (compilation) => { 986a23e08bSopenharmony_ci const assets = compilation.assets; 996a23e08bSopenharmony_ci const keys = Object.keys(assets); 1006a23e08bSopenharmony_ci buildPathInfo = output; 1016a23e08bSopenharmony_ci keys.forEach(key => { 1026a23e08bSopenharmony_ci // choice *.js 1036a23e08bSopenharmony_ci if (output && path.extname(key) === '.js') { 1046a23e08bSopenharmony_ci let newContent = assets[key].source(); 1056a23e08bSopenharmony_ci if (checkWorksFile(key, workerFile) && key !== 'commons.js' && key !== 'vendors.js') { 1066a23e08bSopenharmony_ci newContent = forward + newContent + last; 1076a23e08bSopenharmony_ci } 1086a23e08bSopenharmony_ci if (key === 'commons.js' || key === 'vendors.js' || !checkWorksFile(key, workerFile)) { 1096a23e08bSopenharmony_ci newContent = `\n\n\n\n\n\n\n\n\n\n\n\n\n\n` + newContent; 1106a23e08bSopenharmony_ci } 1116a23e08bSopenharmony_ci const keyPath = key.replace(/\.js$/, ".temp.js"); 1126a23e08bSopenharmony_ci writeFileSync(newContent, output, keyPath, key, true); 1136a23e08bSopenharmony_ci } else if (output && path.extname(key) === '.json' && 1146a23e08bSopenharmony_ci process.env.DEVICE_LEVEL === 'card' && process.env.configOutput && !checkI18n(key)) { 1156a23e08bSopenharmony_ci writeFileSync(assets[key].source(), output, key, key, false); 1166a23e08bSopenharmony_ci } 1176a23e08bSopenharmony_ci }) 1186a23e08bSopenharmony_ci }); 1196a23e08bSopenharmony_ci compiler.hooks.afterEmit.tap('GenAbcPluginMultiThread', () => { 1206a23e08bSopenharmony_ci if (intermediateJsBundle.length === 0) { 1216a23e08bSopenharmony_ci return; 1226a23e08bSopenharmony_ci } 1236a23e08bSopenharmony_ci buildPathInfo = output; 1246a23e08bSopenharmony_ci clearWebpackCacheByBuildInfo(); 1256a23e08bSopenharmony_ci setPrebuildInfo(); 1266a23e08bSopenharmony_ci processMultiThreadEntry(); 1276a23e08bSopenharmony_ci }); 1286a23e08bSopenharmony_ci } 1296a23e08bSopenharmony_ci} 1306a23e08bSopenharmony_ci 1316a23e08bSopenharmony_cifunction processMultiThreadEntry() { 1326a23e08bSopenharmony_ci if (isTs2Abc() || process.env.minPlatformVersion === "8") { 1336a23e08bSopenharmony_ci invokeWorkerToGenAbc(); 1346a23e08bSopenharmony_ci } else if (isEs2Abc()) { 1356a23e08bSopenharmony_ci generateAbcByEs2AbcOfBundleMode(intermediateJsBundle); 1366a23e08bSopenharmony_ci } else { 1376a23e08bSopenharmony_ci console.debug(red, `ERROR please set panda module`, reset); 1386a23e08bSopenharmony_ci } 1396a23e08bSopenharmony_ci} 1406a23e08bSopenharmony_ci 1416a23e08bSopenharmony_cifunction checkI18n(key) { 1426a23e08bSopenharmony_ci const outI18nPath = path.resolve(process.env.configOutput, key); 1436a23e08bSopenharmony_ci const projectI18nPath = outI18nPath.replace(output, process.env.projectPath); 1446a23e08bSopenharmony_ci if (projectI18nPath.indexOf( 1456a23e08bSopenharmony_ci path.resolve(__dirname, process.env.projectPath, 'i18n')) > -1) { 1466a23e08bSopenharmony_ci return true; 1476a23e08bSopenharmony_ci } 1486a23e08bSopenharmony_ci return false; 1496a23e08bSopenharmony_ci} 1506a23e08bSopenharmony_ci 1516a23e08bSopenharmony_cifunction checkWorksFile(assetPath, workerFile) { 1526a23e08bSopenharmony_ci if (workerFile === null) { 1536a23e08bSopenharmony_ci if (assetPath.search("./workers/") !== 0) { 1546a23e08bSopenharmony_ci return true; 1556a23e08bSopenharmony_ci } else { 1566a23e08bSopenharmony_ci return false; 1576a23e08bSopenharmony_ci } 1586a23e08bSopenharmony_ci } else { 1596a23e08bSopenharmony_ci for (const key in workerFile) { 1606a23e08bSopenharmony_ci let keyExt = key + '.js'; 1616a23e08bSopenharmony_ci if (keyExt === assetPath) { 1626a23e08bSopenharmony_ci return false; 1636a23e08bSopenharmony_ci } 1646a23e08bSopenharmony_ci } 1656a23e08bSopenharmony_ci } 1666a23e08bSopenharmony_ci 1676a23e08bSopenharmony_ci return true; 1686a23e08bSopenharmony_ci} 1696a23e08bSopenharmony_ci 1706a23e08bSopenharmony_cifunction writeFileSync(inputString, buildPath, keyPath, jsBundleFile, isToBin) { 1716a23e08bSopenharmony_ci let output = path.resolve(buildPath, keyPath); 1726a23e08bSopenharmony_ci validateFilePathLength(output); 1736a23e08bSopenharmony_ci let parent = path.join(output, '..'); 1746a23e08bSopenharmony_ci if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) { 1756a23e08bSopenharmony_ci mkDir(parent); 1766a23e08bSopenharmony_ci } 1776a23e08bSopenharmony_ci if (!isToBin) { 1786a23e08bSopenharmony_ci fs.writeFileSync(output, inputString); 1796a23e08bSopenharmony_ci return; 1806a23e08bSopenharmony_ci } 1816a23e08bSopenharmony_ci let cacheOutputPath = ""; 1826a23e08bSopenharmony_ci if (process.env.cachePath) { 1836a23e08bSopenharmony_ci let buildDirArr = buildPathInfo.split(path.sep); 1846a23e08bSopenharmony_ci let abilityDir = buildDirArr[buildDirArr.length - 1]; 1856a23e08bSopenharmony_ci cacheOutputPath = path.join(process.env.cachePath, TEMPORARY, abilityDir, keyPath); 1866a23e08bSopenharmony_ci } else { 1876a23e08bSopenharmony_ci cacheOutputPath = output; 1886a23e08bSopenharmony_ci } 1896a23e08bSopenharmony_ci validateFilePathLength(cacheOutputPath); 1906a23e08bSopenharmony_ci parent = path.join(cacheOutputPath, '..'); 1916a23e08bSopenharmony_ci if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) { 1926a23e08bSopenharmony_ci mkDir(parent); 1936a23e08bSopenharmony_ci } 1946a23e08bSopenharmony_ci fs.writeFileSync(cacheOutputPath, inputString); 1956a23e08bSopenharmony_ci if (fs.existsSync(cacheOutputPath)) { 1966a23e08bSopenharmony_ci let fileSize = fs.statSync(cacheOutputPath).size; 1976a23e08bSopenharmony_ci let sourceFile = output.replace(/\.temp\.js$/, "_.js"); 1986a23e08bSopenharmony_ci if (!isDebug && (process.env.aceBuildJson && fs.existsSync(process.env.aceBuildJson))) { 1996a23e08bSopenharmony_ci const buildJsonInfo = JSON.parse(fs.readFileSync(process.env.aceBuildJson).toString()); 2006a23e08bSopenharmony_ci sourceFile = toUnixPath(sourceFile.replace(buildJsonInfo.projectRootPath + path.sep, '')); 2016a23e08bSopenharmony_ci } else { 2026a23e08bSopenharmony_ci sourceFile = toUnixPath(sourceFile.replace(process.env.projectRootPath + path.sep, '')); 2036a23e08bSopenharmony_ci } 2046a23e08bSopenharmony_ci output = toUnixPath(output); 2056a23e08bSopenharmony_ci cacheOutputPath = toUnixPath(cacheOutputPath); 2066a23e08bSopenharmony_ci intermediateJsBundle.push({ 2076a23e08bSopenharmony_ci path: output, size: fileSize, cacheOutputPath: cacheOutputPath, sourceFile: sourceFile 2086a23e08bSopenharmony_ci }); 2096a23e08bSopenharmony_ci } else { 2106a23e08bSopenharmony_ci console.debug(red, `ERROR Failed to convert file ${jsBundleFile} to bin. ${output} is lost`, reset); 2116a23e08bSopenharmony_ci process.exitCode = FAIL; 2126a23e08bSopenharmony_ci } 2136a23e08bSopenharmony_ci} 2146a23e08bSopenharmony_ci 2156a23e08bSopenharmony_cifunction mkDir(path_) { 2166a23e08bSopenharmony_ci const parent = path.join(path_, '..'); 2176a23e08bSopenharmony_ci if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) { 2186a23e08bSopenharmony_ci mkDir(parent); 2196a23e08bSopenharmony_ci } 2206a23e08bSopenharmony_ci fs.mkdirSync(path_); 2216a23e08bSopenharmony_ci} 2226a23e08bSopenharmony_ci 2236a23e08bSopenharmony_cifunction getSmallestSizeGroup(groupSize) { 2246a23e08bSopenharmony_ci let groupSizeArray = Array.from(groupSize); 2256a23e08bSopenharmony_ci groupSizeArray.sort(function(g1, g2) { 2266a23e08bSopenharmony_ci return g1[1] - g2[1]; // sort by size 2276a23e08bSopenharmony_ci }); 2286a23e08bSopenharmony_ci return groupSizeArray[0][0]; 2296a23e08bSopenharmony_ci} 2306a23e08bSopenharmony_ci 2316a23e08bSopenharmony_cifunction splitJsBundlesBySize(bundleArray, groupNumber) { 2326a23e08bSopenharmony_ci let result = []; 2336a23e08bSopenharmony_ci if (bundleArray.length < groupNumber) { 2346a23e08bSopenharmony_ci for (let value of bundleArray) { 2356a23e08bSopenharmony_ci result.push([value]); 2366a23e08bSopenharmony_ci } 2376a23e08bSopenharmony_ci return result; 2386a23e08bSopenharmony_ci } 2396a23e08bSopenharmony_ci 2406a23e08bSopenharmony_ci bundleArray.sort(function(f1, f2) { 2416a23e08bSopenharmony_ci return f2.size - f1.size; 2426a23e08bSopenharmony_ci }); 2436a23e08bSopenharmony_ci let groupFileSize = new Map(); 2446a23e08bSopenharmony_ci for (let i = 0; i < groupNumber; ++i) { 2456a23e08bSopenharmony_ci result.push([]); 2466a23e08bSopenharmony_ci groupFileSize.set(i, 0); 2476a23e08bSopenharmony_ci } 2486a23e08bSopenharmony_ci 2496a23e08bSopenharmony_ci let index = 0; 2506a23e08bSopenharmony_ci while(index < bundleArray.length) { 2516a23e08bSopenharmony_ci let smallestGroup = getSmallestSizeGroup(groupFileSize); 2526a23e08bSopenharmony_ci result[smallestGroup].push(bundleArray[index]); 2536a23e08bSopenharmony_ci let sizeUpdate = groupFileSize.get(smallestGroup) + bundleArray[index].size; 2546a23e08bSopenharmony_ci groupFileSize.set(smallestGroup, sizeUpdate); 2556a23e08bSopenharmony_ci index++; 2566a23e08bSopenharmony_ci } 2576a23e08bSopenharmony_ci return result; 2586a23e08bSopenharmony_ci} 2596a23e08bSopenharmony_ci 2606a23e08bSopenharmony_cifunction invokeWorkerToGenAbc() { 2616a23e08bSopenharmony_ci if (process.env.isPreview === "true") { 2626a23e08bSopenharmony_ci process.exitCode = SUCCESS; 2636a23e08bSopenharmony_ci } 2646a23e08bSopenharmony_ci let maxWorkerNumber = isEs2Abc() ? os.cpus().length : 3; 2656a23e08bSopenharmony_ci const abcArgs = initAbcEnv(); 2666a23e08bSopenharmony_ci let cmdPrefix = initCmdPrefix(abcArgs); 2676a23e08bSopenharmony_ci 2686a23e08bSopenharmony_ci filterIntermediateJsBundleByHashJson(buildPathInfo, intermediateJsBundle); 2696a23e08bSopenharmony_ci const splitedBundles = splitJsBundlesBySize(fileterIntermediateJsBundle, maxWorkerNumber); 2706a23e08bSopenharmony_ci const workerNumber = maxWorkerNumber < splitedBundles.length ? maxWorkerNumber : splitedBundles.length; 2716a23e08bSopenharmony_ci 2726a23e08bSopenharmony_ci try { 2736a23e08bSopenharmony_ci if (process.env.isPreview === 'true') { 2746a23e08bSopenharmony_ci processWorkersOfPreviewMode(splitedBundles, cmdPrefix, workerNumber); 2756a23e08bSopenharmony_ci } else { 2766a23e08bSopenharmony_ci processWorkersOfBuildMode(splitedBundles, cmdPrefix, workerNumber); 2776a23e08bSopenharmony_ci } 2786a23e08bSopenharmony_ci } catch (e) { 2796a23e08bSopenharmony_ci console.debug(red, `ERROR failed to generate abc. Error message: ${e} `, reset); 2806a23e08bSopenharmony_ci process.env.abcCompileSuccess = 'false'; 2816a23e08bSopenharmony_ci if (process.env.isPreview !== 'true') { 2826a23e08bSopenharmony_ci process.exit(FAIL); 2836a23e08bSopenharmony_ci } 2846a23e08bSopenharmony_ci } 2856a23e08bSopenharmony_ci} 2866a23e08bSopenharmony_ci 2876a23e08bSopenharmony_cifunction clearGlobalInfo() { 2886a23e08bSopenharmony_ci if (process.env.isPreview !== "true") { 2896a23e08bSopenharmony_ci intermediateJsBundle = []; 2906a23e08bSopenharmony_ci } 2916a23e08bSopenharmony_ci fileterIntermediateJsBundle = []; 2926a23e08bSopenharmony_ci hashJsonObject = {}; 2936a23e08bSopenharmony_ci} 2946a23e08bSopenharmony_ci 2956a23e08bSopenharmony_cifunction filterIntermediateJsBundleByHashJson(buildPath, inputPaths) { 2966a23e08bSopenharmony_ci inputPaths = removeDuplicateInfoOfBundleList(inputPaths); 2976a23e08bSopenharmony_ci 2986a23e08bSopenharmony_ci for (let i = 0; i < inputPaths.length; ++i) { 2996a23e08bSopenharmony_ci fileterIntermediateJsBundle.push(inputPaths[i]); 3006a23e08bSopenharmony_ci } 3016a23e08bSopenharmony_ci const hashFilePath = genHashJsonPath(buildPath); 3026a23e08bSopenharmony_ci if (hashFilePath.length == 0) { 3036a23e08bSopenharmony_ci return; 3046a23e08bSopenharmony_ci } 3056a23e08bSopenharmony_ci let updateJsonObject = {}; 3066a23e08bSopenharmony_ci let jsonObject = {}; 3076a23e08bSopenharmony_ci let jsonFile = ""; 3086a23e08bSopenharmony_ci if (fs.existsSync(hashFilePath)) { 3096a23e08bSopenharmony_ci jsonFile = fs.readFileSync(hashFilePath).toString(); 3106a23e08bSopenharmony_ci jsonObject = JSON.parse(jsonFile); 3116a23e08bSopenharmony_ci fileterIntermediateJsBundle = []; 3126a23e08bSopenharmony_ci for (let i = 0; i < inputPaths.length; ++i) { 3136a23e08bSopenharmony_ci const cacheOutputPath = inputPaths[i].cacheOutputPath; 3146a23e08bSopenharmony_ci const cacheAbcFilePath = cacheOutputPath.replace(/\.temp\.js$/, '.abc'); 3156a23e08bSopenharmony_ci if (!fs.existsSync(cacheOutputPath)) { 3166a23e08bSopenharmony_ci console.debug(red, `ERROR ${cacheOutputPath} is lost`, reset); 3176a23e08bSopenharmony_ci process.exitCode = FAIL; 3186a23e08bSopenharmony_ci break; 3196a23e08bSopenharmony_ci } 3206a23e08bSopenharmony_ci 3216a23e08bSopenharmony_ci if (fs.existsSync(cacheAbcFilePath)) { 3226a23e08bSopenharmony_ci const hashInputContentData = toHashData(cacheOutputPath); 3236a23e08bSopenharmony_ci const hashAbcContentData = toHashData(cacheAbcFilePath); 3246a23e08bSopenharmony_ci if (jsonObject[cacheOutputPath] === hashInputContentData && jsonObject[cacheAbcFilePath] === hashAbcContentData) { 3256a23e08bSopenharmony_ci updateJsonObject[cacheOutputPath] = hashInputContentData; 3266a23e08bSopenharmony_ci updateJsonObject[cacheAbcFilePath] = hashAbcContentData; 3276a23e08bSopenharmony_ci } else { 3286a23e08bSopenharmony_ci fileterIntermediateJsBundle.push(inputPaths[i]); 3296a23e08bSopenharmony_ci } 3306a23e08bSopenharmony_ci } else { 3316a23e08bSopenharmony_ci fileterIntermediateJsBundle.push(inputPaths[i]); 3326a23e08bSopenharmony_ci } 3336a23e08bSopenharmony_ci } 3346a23e08bSopenharmony_ci } 3356a23e08bSopenharmony_ci 3366a23e08bSopenharmony_ci hashJsonObject = updateJsonObject; 3376a23e08bSopenharmony_ci} 3386a23e08bSopenharmony_ci 3396a23e08bSopenharmony_cifunction writeHashJson() { 3406a23e08bSopenharmony_ci for (let i = 0; i < fileterIntermediateJsBundle.length; ++i) { 3416a23e08bSopenharmony_ci const cacheOutputPath = fileterIntermediateJsBundle[i].cacheOutputPath; 3426a23e08bSopenharmony_ci const cacheAbcFilePath = cacheOutputPath.replace(/\.temp\.js$/, '.abc'); 3436a23e08bSopenharmony_ci if (!fs.existsSync(cacheOutputPath) || !fs.existsSync(cacheAbcFilePath)) { 3446a23e08bSopenharmony_ci console.debug(red, `ERROR ${cacheOutputPath} is lost`, reset); 3456a23e08bSopenharmony_ci process.exitCode = FAIL; 3466a23e08bSopenharmony_ci break; 3476a23e08bSopenharmony_ci } 3486a23e08bSopenharmony_ci const hashInputContentData = toHashData(cacheOutputPath); 3496a23e08bSopenharmony_ci const hashAbcContentData = toHashData(cacheAbcFilePath); 3506a23e08bSopenharmony_ci hashJsonObject[cacheOutputPath] = hashInputContentData; 3516a23e08bSopenharmony_ci hashJsonObject[cacheAbcFilePath] = hashAbcContentData; 3526a23e08bSopenharmony_ci } 3536a23e08bSopenharmony_ci const hashFilePath = genHashJsonPath(buildPathInfo); 3546a23e08bSopenharmony_ci if (hashFilePath.length == 0) { 3556a23e08bSopenharmony_ci return; 3566a23e08bSopenharmony_ci } 3576a23e08bSopenharmony_ci fs.writeFileSync(hashFilePath, JSON.stringify(hashJsonObject)); 3586a23e08bSopenharmony_ci} 3596a23e08bSopenharmony_ci 3606a23e08bSopenharmony_cifunction genHashJsonPath(buildPath) { 3616a23e08bSopenharmony_ci buildPath = toUnixPath(buildPath); 3626a23e08bSopenharmony_ci if (process.env.cachePath) { 3636a23e08bSopenharmony_ci if (!fs.existsSync(process.env.cachePath) || !fs.statSync(process.env.cachePath).isDirectory()) { 3646a23e08bSopenharmony_ci return ''; 3656a23e08bSopenharmony_ci } 3666a23e08bSopenharmony_ci let buildDirArr = buildPathInfo.split(path.sep); 3676a23e08bSopenharmony_ci let abilityDir = buildDirArr[buildDirArr.length - 1]; 3686a23e08bSopenharmony_ci let hashJsonPath = path.join(process.env.cachePath, TEMPORARY, abilityDir, hashFile); 3696a23e08bSopenharmony_ci validateFilePathLength(hashJsonPath); 3706a23e08bSopenharmony_ci let parent = path.join(hashJsonPath, '..'); 3716a23e08bSopenharmony_ci if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) { 3726a23e08bSopenharmony_ci mkDir(parent); 3736a23e08bSopenharmony_ci } 3746a23e08bSopenharmony_ci return hashJsonPath; 3756a23e08bSopenharmony_ci } else if (buildPath.indexOf(ARK) >= 0) { 3766a23e08bSopenharmony_ci const dataTmps = buildPath.split(ARK); 3776a23e08bSopenharmony_ci const hashPath = path.join(dataTmps[0], ARK); 3786a23e08bSopenharmony_ci if (!fs.existsSync(hashPath) || !fs.statSync(hashPath).isDirectory()) { 3796a23e08bSopenharmony_ci return ''; 3806a23e08bSopenharmony_ci } 3816a23e08bSopenharmony_ci let hashJsonPath = path.join(hashPath, hashFile); 3826a23e08bSopenharmony_ci validateFilePathLength(hashJsonPath); 3836a23e08bSopenharmony_ci return hashJsonPath; 3846a23e08bSopenharmony_ci } else { 3856a23e08bSopenharmony_ci return ''; 3866a23e08bSopenharmony_ci } 3876a23e08bSopenharmony_ci} 3886a23e08bSopenharmony_ci 3896a23e08bSopenharmony_cifunction toUnixPath(data) { 3906a23e08bSopenharmony_ci if (/^win/.test(require('os').platform())) { 3916a23e08bSopenharmony_ci const fileTmps = data.split(path.sep); 3926a23e08bSopenharmony_ci const newData = path.posix.join(...fileTmps); 3936a23e08bSopenharmony_ci return newData; 3946a23e08bSopenharmony_ci } 3956a23e08bSopenharmony_ci return data; 3966a23e08bSopenharmony_ci} 3976a23e08bSopenharmony_ci 3986a23e08bSopenharmony_cifunction toHashData(path) { 3996a23e08bSopenharmony_ci const content = fs.readFileSync(path); 4006a23e08bSopenharmony_ci const hash = crypto.createHash('sha256'); 4016a23e08bSopenharmony_ci hash.update(content); 4026a23e08bSopenharmony_ci return hash.digest('hex'); 4036a23e08bSopenharmony_ci} 4046a23e08bSopenharmony_ci 4056a23e08bSopenharmony_cimodule.exports = { 4066a23e08bSopenharmony_ci GenAbcPlugin: GenAbcPlugin, 4076a23e08bSopenharmony_ci checkWorksFile: checkWorksFile 4086a23e08bSopenharmony_ci} 4096a23e08bSopenharmony_ci 4106a23e08bSopenharmony_cifunction copyFileCachePathToBuildPath() { 4116a23e08bSopenharmony_ci for (let i = 0; i < intermediateJsBundle.length; ++i) { 4126a23e08bSopenharmony_ci const abcFile = intermediateJsBundle[i].path.replace(/\.temp\.js$/, ".abc"); 4136a23e08bSopenharmony_ci const cacheOutputPath = intermediateJsBundle[i].cacheOutputPath; 4146a23e08bSopenharmony_ci const cacheAbcFilePath = intermediateJsBundle[i].cacheOutputPath.replace(/\.temp\.js$/, ".abc"); 4156a23e08bSopenharmony_ci if (!fs.existsSync(cacheAbcFilePath)) { 4166a23e08bSopenharmony_ci console.debug(red, `ERROR ${cacheAbcFilePath} is lost`, reset); 4176a23e08bSopenharmony_ci process.exitCode = FAIL; 4186a23e08bSopenharmony_ci break; 4196a23e08bSopenharmony_ci } 4206a23e08bSopenharmony_ci let parent = path.join(abcFile, '..'); 4216a23e08bSopenharmony_ci if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) { 4226a23e08bSopenharmony_ci mkDir(parent); 4236a23e08bSopenharmony_ci } 4246a23e08bSopenharmony_ci // for preview mode, cache path and old abc file both exist, should copy abc file for updating 4256a23e08bSopenharmony_ci if (process.env.cachePath !== undefined) { 4266a23e08bSopenharmony_ci fs.copyFileSync(cacheAbcFilePath, abcFile); 4276a23e08bSopenharmony_ci } 4286a23e08bSopenharmony_ci if (process.env.cachePath === undefined && fs.existsSync(cacheOutputPath)) { 4296a23e08bSopenharmony_ci fs.unlinkSync(cacheOutputPath); 4306a23e08bSopenharmony_ci } 4316a23e08bSopenharmony_ci } 4326a23e08bSopenharmony_ci} 4336a23e08bSopenharmony_ci 4346a23e08bSopenharmony_cifunction processExtraAssetForBundle() { 4356a23e08bSopenharmony_ci writeHashJson(); 4366a23e08bSopenharmony_ci copyFileCachePathToBuildPath(); 4376a23e08bSopenharmony_ci clearGlobalInfo(); 4386a23e08bSopenharmony_ci} 4396a23e08bSopenharmony_ci 4406a23e08bSopenharmony_cifunction checkNodeModules() { 4416a23e08bSopenharmony_ci if (process.env.panda === TS2ABC) { 4426a23e08bSopenharmony_ci let arkEntryPath = path.join(arkDir, 'build'); 4436a23e08bSopenharmony_ci if (isWin) { 4446a23e08bSopenharmony_ci arkEntryPath = path.join(arkDir, 'build-win'); 4456a23e08bSopenharmony_ci } else if (isMac) { 4466a23e08bSopenharmony_ci arkEntryPath = path.join(arkDir, 'build-mac'); 4476a23e08bSopenharmony_ci } 4486a23e08bSopenharmony_ci let nodeModulesPath = path.join(arkEntryPath, NODE_MODULES); 4496a23e08bSopenharmony_ci validateFilePathLength(nodeModulesPath); 4506a23e08bSopenharmony_ci if (!(fs.existsSync(nodeModulesPath) && fs.statSync(nodeModulesPath).isDirectory())) { 4516a23e08bSopenharmony_ci console.error(red, `ERROR: node_modules for ark compiler not found. 4526a23e08bSopenharmony_ci Please make sure switch to non-root user before runing "npm install" for safity requirements and try re-run "npm install" under ${arkEntryPath}`, reset); 4536a23e08bSopenharmony_ci return false; 4546a23e08bSopenharmony_ci } 4556a23e08bSopenharmony_ci } 4566a23e08bSopenharmony_ci 4576a23e08bSopenharmony_ci return true; 4586a23e08bSopenharmony_ci} 4596a23e08bSopenharmony_ci 4606a23e08bSopenharmony_cifunction initAbcEnv() { 4616a23e08bSopenharmony_ci let args = []; 4626a23e08bSopenharmony_ci if (process.env.minPlatformVersion === "8") { 4636a23e08bSopenharmony_ci process.env.panda = TS2ABC; 4646a23e08bSopenharmony_ci let js2abc = path.join(arkDir, 'build', 'legacy_api8', 'src', 'index.js'); 4656a23e08bSopenharmony_ci if (isWin) { 4666a23e08bSopenharmony_ci js2abc = path.join(arkDir, 'build-win', 'legacy_api8', 'src', 'index.js'); 4676a23e08bSopenharmony_ci } else if (isMac) { 4686a23e08bSopenharmony_ci js2abc = path.join(arkDir, 'build-mac', 'legacy_api8', 'src', 'index.js'); 4696a23e08bSopenharmony_ci } 4706a23e08bSopenharmony_ci validateFilePathLength(js2abc); 4716a23e08bSopenharmony_ci 4726a23e08bSopenharmony_ci js2abc = '"' + js2abc + '"'; 4736a23e08bSopenharmony_ci args = [ 4746a23e08bSopenharmony_ci '--expose-gc', 4756a23e08bSopenharmony_ci js2abc 4766a23e08bSopenharmony_ci ]; 4776a23e08bSopenharmony_ci if (isDebug) { 4786a23e08bSopenharmony_ci args.push('--debug'); 4796a23e08bSopenharmony_ci } 4806a23e08bSopenharmony_ci } else if (process.env.panda === TS2ABC) { 4816a23e08bSopenharmony_ci let js2abc = path.join(arkDir, 'build', 'src', 'index.js'); 4826a23e08bSopenharmony_ci if (isWin) { 4836a23e08bSopenharmony_ci js2abc = path.join(arkDir, 'build-win', 'src', 'index.js'); 4846a23e08bSopenharmony_ci } else if (isMac) { 4856a23e08bSopenharmony_ci js2abc = path.join(arkDir, 'build-mac', 'src', 'index.js'); 4866a23e08bSopenharmony_ci } 4876a23e08bSopenharmony_ci validateFilePathLength(js2abc); 4886a23e08bSopenharmony_ci 4896a23e08bSopenharmony_ci js2abc = '"' + js2abc + '"'; 4906a23e08bSopenharmony_ci args = [ 4916a23e08bSopenharmony_ci '--expose-gc', 4926a23e08bSopenharmony_ci js2abc 4936a23e08bSopenharmony_ci ]; 4946a23e08bSopenharmony_ci if (isDebug) { 4956a23e08bSopenharmony_ci args.push('--debug'); 4966a23e08bSopenharmony_ci } 4976a23e08bSopenharmony_ci } else if (process.env.panda === ES2ABC || process.env.panda === 'undefined' || process.env.panda === undefined) { 4986a23e08bSopenharmony_ci let es2abc = path.join(arkDir, 'build', 'bin', 'es2abc'); 4996a23e08bSopenharmony_ci if (isWin) { 5006a23e08bSopenharmony_ci es2abc = path.join(arkDir, 'build-win', 'bin', 'es2abc.exe'); 5016a23e08bSopenharmony_ci } else if (isMac) { 5026a23e08bSopenharmony_ci es2abc = path.join(arkDir, 'build-mac', 'bin', 'es2abc'); 5036a23e08bSopenharmony_ci } 5046a23e08bSopenharmony_ci validateFilePathLength(es2abc); 5056a23e08bSopenharmony_ci 5066a23e08bSopenharmony_ci args = [ 5076a23e08bSopenharmony_ci '"' + es2abc + '"' 5086a23e08bSopenharmony_ci ]; 5096a23e08bSopenharmony_ci if (isDebug) { 5106a23e08bSopenharmony_ci args.push('--debug-info'); 5116a23e08bSopenharmony_ci } 5126a23e08bSopenharmony_ci } else { 5136a23e08bSopenharmony_ci console.debug(red, `ERROR: please set panda module`, reset); 5146a23e08bSopenharmony_ci } 5156a23e08bSopenharmony_ci 5166a23e08bSopenharmony_ci return args; 5176a23e08bSopenharmony_ci} 5186a23e08bSopenharmony_ci 5196a23e08bSopenharmony_ciexport function isWindows() { 5206a23e08bSopenharmony_ci return os.type() === WINDOWS; 5216a23e08bSopenharmony_ci} 5226a23e08bSopenharmony_ci 5236a23e08bSopenharmony_ciexport function isLinux() { 5246a23e08bSopenharmony_ci return os.type() === LINUX; 5256a23e08bSopenharmony_ci} 5266a23e08bSopenharmony_ci 5276a23e08bSopenharmony_ciexport function isMacOs() { 5286a23e08bSopenharmony_ci return os.type() === MAC; 5296a23e08bSopenharmony_ci} 5306a23e08bSopenharmony_ci 5316a23e08bSopenharmony_ciexport function maxFilePathLength() { 5326a23e08bSopenharmony_ci if (isWindows()) { 5336a23e08bSopenharmony_ci return 32766; 5346a23e08bSopenharmony_ci } else if (isLinux()) { 5356a23e08bSopenharmony_ci return 4095; 5366a23e08bSopenharmony_ci } else if (isMacOs()) { 5376a23e08bSopenharmony_ci return 1016; 5386a23e08bSopenharmony_ci } else { 5396a23e08bSopenharmony_ci return -1; 5406a23e08bSopenharmony_ci } 5416a23e08bSopenharmony_ci} 5426a23e08bSopenharmony_ci 5436a23e08bSopenharmony_ciexport function validateFilePathLength(filePath) { 5446a23e08bSopenharmony_ci if (maxFilePathLength() < 0) { 5456a23e08bSopenharmony_ci console.error("Unknown OS platform"); 5466a23e08bSopenharmony_ci process.exitCode = FAIL; 5476a23e08bSopenharmony_ci return false; 5486a23e08bSopenharmony_ci } else if (filePath.length > 0 && filePath.length <= maxFilePathLength()) { 5496a23e08bSopenharmony_ci return true; 5506a23e08bSopenharmony_ci } else if (filePath.length > maxFilePathLength()) { 5516a23e08bSopenharmony_ci console.error(`The length of ${filePath} exceeds the limitation of current platform, which is ` + 5526a23e08bSopenharmony_ci `${maxFilePathLength()}. Please try moving the project folder to avoid deeply nested file path and try again`); 5536a23e08bSopenharmony_ci process.exitCode = FAIL; 5546a23e08bSopenharmony_ci return false; 5556a23e08bSopenharmony_ci } else { 5566a23e08bSopenharmony_ci console.error("Validate file path failed"); 5576a23e08bSopenharmony_ci process.exitCode = FAIL; 5586a23e08bSopenharmony_ci return false; 5596a23e08bSopenharmony_ci } 5606a23e08bSopenharmony_ci} 5616a23e08bSopenharmony_ci 5626a23e08bSopenharmony_ciexport function isEs2Abc() { 5636a23e08bSopenharmony_ci return process.env.panda === ES2ABC || process.env.panda === 'undefined' || process.env.panda === undefined; 5646a23e08bSopenharmony_ci} 5656a23e08bSopenharmony_ci 5666a23e08bSopenharmony_ciexport function isTs2Abc() { 5676a23e08bSopenharmony_ci return process.env.panda === TS2ABC; 5686a23e08bSopenharmony_ci} 5696a23e08bSopenharmony_ci 5706a23e08bSopenharmony_cifunction generateAbcByEs2AbcOfBundleMode(inputPaths) { 5716a23e08bSopenharmony_ci filterIntermediateJsBundleByHashJson(buildPathInfo, inputPaths); 5726a23e08bSopenharmony_ci if (fileterIntermediateJsBundle.length === 0) { 5736a23e08bSopenharmony_ci processExtraAssetForBundle(); 5746a23e08bSopenharmony_ci return; 5756a23e08bSopenharmony_ci } 5766a23e08bSopenharmony_ci let filesInfoPath = generateFileOfBundle(fileterIntermediateJsBundle); 5776a23e08bSopenharmony_ci const fileThreads = os.cpus().length < 16 ? os.cpus().length : 16; 5786a23e08bSopenharmony_ci let genAbcCmd = 5796a23e08bSopenharmony_ci `${initAbcEnv().join(' ')} "@${filesInfoPath}" --file-threads "${fileThreads}"`; 5806a23e08bSopenharmony_ci 5816a23e08bSopenharmony_ci console.debug('gen abc cmd is: ', genAbcCmd); 5826a23e08bSopenharmony_ci try { 5836a23e08bSopenharmony_ci if (process.env.isPreview === 'true') { 5846a23e08bSopenharmony_ci childProcess.execSync(genAbcCmd); 5856a23e08bSopenharmony_ci processExtraAssetForBundle(); 5866a23e08bSopenharmony_ci } else { 5876a23e08bSopenharmony_ci const child = childProcess.exec(genAbcCmd); 5886a23e08bSopenharmony_ci child.on('exit', (code) => { 5896a23e08bSopenharmony_ci if (code === FAIL) { 5906a23e08bSopenharmony_ci console.debug(red, "ERROR failed to execute es2abc", reset); 5916a23e08bSopenharmony_ci process.exit(FAIL); 5926a23e08bSopenharmony_ci } 5936a23e08bSopenharmony_ci if (process.env.cachePath === undefined) { 5946a23e08bSopenharmony_ci unlinkSync(filesInfoPath); 5956a23e08bSopenharmony_ci } 5966a23e08bSopenharmony_ci processExtraAssetForBundle(); 5976a23e08bSopenharmony_ci }); 5986a23e08bSopenharmony_ci 5996a23e08bSopenharmony_ci child.on('error', (err) => { 6006a23e08bSopenharmony_ci console.debug(red, err.toString(), reset); 6016a23e08bSopenharmony_ci process.exit(FAIL); 6026a23e08bSopenharmony_ci }); 6036a23e08bSopenharmony_ci 6046a23e08bSopenharmony_ci child.stderr.on('data', (data) => { 6056a23e08bSopenharmony_ci console.debug(red, data.toString(), reset); 6066a23e08bSopenharmony_ci }); 6076a23e08bSopenharmony_ci } 6086a23e08bSopenharmony_ci } catch (e) { 6096a23e08bSopenharmony_ci console.debug(red, `ERROR failed to generate abc with filesInfo ${filesInfoPath}. Error message: ${e} `, reset); 6106a23e08bSopenharmony_ci process.env.abcCompileSuccess = 'false'; 6116a23e08bSopenharmony_ci if (process.env.isPreview !== 'true') { 6126a23e08bSopenharmony_ci process.exit(FAIL); 6136a23e08bSopenharmony_ci } 6146a23e08bSopenharmony_ci } finally { 6156a23e08bSopenharmony_ci if (process.env.isPreview === 'true') { 6166a23e08bSopenharmony_ci if (process.env.cachePath === undefined) { 6176a23e08bSopenharmony_ci unlinkSync(filesInfoPath); 6186a23e08bSopenharmony_ci } 6196a23e08bSopenharmony_ci } 6206a23e08bSopenharmony_ci } 6216a23e08bSopenharmony_ci} 6226a23e08bSopenharmony_ci 6236a23e08bSopenharmony_cifunction generateFileOfBundle(inputPaths) { 6246a23e08bSopenharmony_ci let filesInfoPath = buildCachePath(FILESINFO_TXT); 6256a23e08bSopenharmony_ci inputPaths = removeDuplicateInfoOfBundleList(inputPaths); 6266a23e08bSopenharmony_ci 6276a23e08bSopenharmony_ci let filesInfo = ''; 6286a23e08bSopenharmony_ci inputPaths.forEach(info => { 6296a23e08bSopenharmony_ci const cacheOutputPath = info.cacheOutputPath; 6306a23e08bSopenharmony_ci const recordName = 'null_recordName'; 6316a23e08bSopenharmony_ci const moduleType = 'script'; 6326a23e08bSopenharmony_ci const sourceFile = info.sourceFile; 6336a23e08bSopenharmony_ci const abcFilePath = cacheOutputPath.replace(/\.temp\.js$/, ".abc"); 6346a23e08bSopenharmony_ci filesInfo += `${cacheOutputPath};${recordName};${moduleType};${sourceFile};${abcFilePath}\n`; 6356a23e08bSopenharmony_ci }); 6366a23e08bSopenharmony_ci fs.writeFileSync(filesInfoPath, filesInfo, 'utf-8'); 6376a23e08bSopenharmony_ci 6386a23e08bSopenharmony_ci return filesInfoPath; 6396a23e08bSopenharmony_ci} 6406a23e08bSopenharmony_ci 6416a23e08bSopenharmony_cifunction removeDuplicateInfoOfBundleList(inputPaths) { 6426a23e08bSopenharmony_ci let tempInputPaths = []; 6436a23e08bSopenharmony_ci inputPaths.forEach((item) => { 6446a23e08bSopenharmony_ci const check = tempInputPaths.every((newItem) => { 6456a23e08bSopenharmony_ci return item.path !== newItem.path; 6466a23e08bSopenharmony_ci }); 6476a23e08bSopenharmony_ci if (check) { 6486a23e08bSopenharmony_ci tempInputPaths.push(item); 6496a23e08bSopenharmony_ci } 6506a23e08bSopenharmony_ci }); 6516a23e08bSopenharmony_ci inputPaths = tempInputPaths; 6526a23e08bSopenharmony_ci 6536a23e08bSopenharmony_ci return inputPaths; 6546a23e08bSopenharmony_ci} 6556a23e08bSopenharmony_ci 6566a23e08bSopenharmony_cifunction buildCachePath(tailName) { 6576a23e08bSopenharmony_ci let pathName = process.env.cachePath !== undefined ? 6586a23e08bSopenharmony_ci path.join(process.env.cachePath, tailName) : path.join(buildPathInfo, tailName); 6596a23e08bSopenharmony_ci validateFilePathLength(pathName); 6606a23e08bSopenharmony_ci 6616a23e08bSopenharmony_ci return pathName; 6626a23e08bSopenharmony_ci} 6636a23e08bSopenharmony_ci 6646a23e08bSopenharmony_cifunction unlinkSync(filePath) { 6656a23e08bSopenharmony_ci if (fs.existsSync(filePath)) { 6666a23e08bSopenharmony_ci fs.unlinkSync(filePath); 6676a23e08bSopenharmony_ci } 6686a23e08bSopenharmony_ci} 6696a23e08bSopenharmony_ci 6706a23e08bSopenharmony_cifunction initCmdPrefix(abcArgs) { 6716a23e08bSopenharmony_ci let cmdPrefix = ""; 6726a23e08bSopenharmony_ci if (process.env.panda === TS2ABC) { 6736a23e08bSopenharmony_ci cmdPrefix = `${nodeJs} ${abcArgs.join(' ')}`; 6746a23e08bSopenharmony_ci } else if (process.env.panda === ES2ABC || process.env.panda === 'undefined' || process.env.panda === undefined) { 6756a23e08bSopenharmony_ci cmdPrefix = `${abcArgs.join(' ')}`; 6766a23e08bSopenharmony_ci } else { 6776a23e08bSopenharmony_ci console.debug(red, `ERROR please set panda module`, reset); 6786a23e08bSopenharmony_ci } 6796a23e08bSopenharmony_ci 6806a23e08bSopenharmony_ci return cmdPrefix; 6816a23e08bSopenharmony_ci} 6826a23e08bSopenharmony_ci 6836a23e08bSopenharmony_cifunction processWorkersOfPreviewMode(splittedData, cmdPrefix, workerNumber) { 6846a23e08bSopenharmony_ci let processEnv = Object.assign({}, process.env); 6856a23e08bSopenharmony_ci let arkEnvParams = { 6866a23e08bSopenharmony_ci 'splittedData': JSON.stringify(splittedData), 6876a23e08bSopenharmony_ci 'cmdPrefix': cmdPrefix, 6886a23e08bSopenharmony_ci 'workerNumber': workerNumber.toString() 6896a23e08bSopenharmony_ci }; 6906a23e08bSopenharmony_ci processEnv.arkEnvParams = JSON.stringify(arkEnvParams); 6916a23e08bSopenharmony_ci 6926a23e08bSopenharmony_ci let genAbcCmd = `${nodeJs} "${path.resolve(__dirname, manageBunldeWorkersScript)}"`; 6936a23e08bSopenharmony_ci childProcess.execSync(genAbcCmd, {env: processEnv}); 6946a23e08bSopenharmony_ci processExtraAssetForBundle(); 6956a23e08bSopenharmony_ci} 6966a23e08bSopenharmony_ci 6976a23e08bSopenharmony_cifunction processWorkersOfBuildMode(splittedData, cmdPrefix, workerNumber) { 6986a23e08bSopenharmony_ci const clusterNewApiVersion = 16; 6996a23e08bSopenharmony_ci const currentNodeVersion = parseInt(process.version.split(".")[0]); 7006a23e08bSopenharmony_ci const useNewApi = currentNodeVersion >= clusterNewApiVersion; 7016a23e08bSopenharmony_ci 7026a23e08bSopenharmony_ci if (useNewApi && cluster.isPrimary || !useNewApi && cluster.isMaster) { 7036a23e08bSopenharmony_ci if (useNewApi) { 7046a23e08bSopenharmony_ci cluster.setupPrimary({ 7056a23e08bSopenharmony_ci exec: path.resolve(__dirname, genAbcScript) 7066a23e08bSopenharmony_ci }); 7076a23e08bSopenharmony_ci } else { 7086a23e08bSopenharmony_ci cluster.setupMaster({ 7096a23e08bSopenharmony_ci exec: path.resolve(__dirname, genAbcScript) 7106a23e08bSopenharmony_ci }); 7116a23e08bSopenharmony_ci } 7126a23e08bSopenharmony_ci 7136a23e08bSopenharmony_ci for (let i = 0; i < workerNumber; ++i) { 7146a23e08bSopenharmony_ci let workerData = { 7156a23e08bSopenharmony_ci 'inputs': JSON.stringify(splittedData[i]), 7166a23e08bSopenharmony_ci 'cmd': cmdPrefix 7176a23e08bSopenharmony_ci }; 7186a23e08bSopenharmony_ci cluster.fork(workerData); 7196a23e08bSopenharmony_ci } 7206a23e08bSopenharmony_ci 7216a23e08bSopenharmony_ci cluster.on('exit', (worker, code, signal) => { 7226a23e08bSopenharmony_ci if (code === FAIL) { 7236a23e08bSopenharmony_ci process.exitCode = FAIL; 7246a23e08bSopenharmony_ci } 7256a23e08bSopenharmony_ci console.debug(`worker ${worker.process.pid} finished`); 7266a23e08bSopenharmony_ci }); 7276a23e08bSopenharmony_ci 7286a23e08bSopenharmony_ci process.on('exit', (code) => { 7296a23e08bSopenharmony_ci if (process.exitCode !== FAIL && process.env.isPreview !== 'true') { 7306a23e08bSopenharmony_ci processExtraAssetForBundle(); 7316a23e08bSopenharmony_ci } 7326a23e08bSopenharmony_ci }); 7336a23e08bSopenharmony_ci } 7346a23e08bSopenharmony_ci} 7356a23e08bSopenharmony_ci 7366a23e08bSopenharmony_cifunction clearWebpackCacheByBuildInfo() { 7376a23e08bSopenharmony_ci if (!process.env.cachePath) { 7386a23e08bSopenharmony_ci return; 7396a23e08bSopenharmony_ci } 7406a23e08bSopenharmony_ci 7416a23e08bSopenharmony_ci // clear&update cache dir when build info is different from last time 7426a23e08bSopenharmony_ci const cachePrebuildInfoPath = path.join(process.env.cachePath, PREBUILDINFO_JSON); 7436a23e08bSopenharmony_ci if (fs.existsSync(cachePrebuildInfoPath)) { 7446a23e08bSopenharmony_ci let cachedJson = undefined; 7456a23e08bSopenharmony_ci try { 7466a23e08bSopenharmony_ci cachedJson = JSON.parse(fs.readFileSync(cachePrebuildInfoPath).toString()); 7476a23e08bSopenharmony_ci } catch { 7486a23e08bSopenharmony_ci removeHashJsonFile(); 7496a23e08bSopenharmony_ci return; 7506a23e08bSopenharmony_ci } 7516a23e08bSopenharmony_ci // api version is 8 or 9 7526a23e08bSopenharmony_ci if (cachedJson && cachedJson.minAPIVersion && 7536a23e08bSopenharmony_ci cachedJson.minAPIVersion.toString() !== process.env.minPlatformVersion) { 7546a23e08bSopenharmony_ci removeHashJsonFile(); 7556a23e08bSopenharmony_ci } 7566a23e08bSopenharmony_ci } 7576a23e08bSopenharmony_ci} 7586a23e08bSopenharmony_ci 7596a23e08bSopenharmony_cifunction setPrebuildInfo() { 7606a23e08bSopenharmony_ci if (process.env.cachePath && process.env.minPlatformVersion) { 7616a23e08bSopenharmony_ci let cachedJson = {}; 7626a23e08bSopenharmony_ci const cachePrebuildInfoPath = path.join(process.env.cachePath, PREBUILDINFO_JSON); 7636a23e08bSopenharmony_ci validateFilePathLength(cachePrebuildInfoPath); 7646a23e08bSopenharmony_ci cachedJson.minAPIVersion = process.env.minPlatformVersion; 7656a23e08bSopenharmony_ci fs.writeFile(cachePrebuildInfoPath, JSON.stringify(cachedJson, null, 2), 'utf-8', 7666a23e08bSopenharmony_ci (err) => { 7676a23e08bSopenharmony_ci if (err) { 7686a23e08bSopenharmony_ci logger.error(red, `ArkTS:ERROR Failed to write bundle build info.`, reset); 7696a23e08bSopenharmony_ci } 7706a23e08bSopenharmony_ci } 7716a23e08bSopenharmony_ci ); 7726a23e08bSopenharmony_ci } 7736a23e08bSopenharmony_ci} 7746a23e08bSopenharmony_ci 7756a23e08bSopenharmony_cifunction removeHashJsonFile() { 7766a23e08bSopenharmony_ci const hashFilePath = genHashJsonPath(buildPathInfo); 7776a23e08bSopenharmony_ci if (hashFilePath.length !== 0 && fs.existsSync(hashFilePath)) { 7786a23e08bSopenharmony_ci fs.unlinkSync(hashFilePath); 7796a23e08bSopenharmony_ci } 7806a23e08bSopenharmony_ci} 781