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