107ac75b1Sopenharmony_ci/*
207ac75b1Sopenharmony_ci * Copyright (c) 2021 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_ciimport path from 'path';
1707ac75b1Sopenharmony_ciimport ts from 'typescript';
1807ac75b1Sopenharmony_ciimport fs from 'fs';
1907ac75b1Sopenharmony_ciimport os from 'os';
2007ac75b1Sopenharmony_ciimport uglifyJS from 'uglify-js';
2107ac75b1Sopenharmony_ci
2207ac75b1Sopenharmony_ciimport {
2307ac75b1Sopenharmony_ci  partialUpdateConfig,
2407ac75b1Sopenharmony_ci  projectConfig,
2507ac75b1Sopenharmony_ci  globalProgram
2607ac75b1Sopenharmony_ci} from '../main';
2707ac75b1Sopenharmony_ciimport { createHash } from 'crypto';
2807ac75b1Sopenharmony_ciimport type { Hash } from 'crypto';
2907ac75b1Sopenharmony_ciimport {
3007ac75b1Sopenharmony_ci  AUXILIARY,
3107ac75b1Sopenharmony_ci  EXTNAME_ETS,
3207ac75b1Sopenharmony_ci  EXTNAME_JS,
3307ac75b1Sopenharmony_ci  MAIN,
3407ac75b1Sopenharmony_ci  FAIL,
3507ac75b1Sopenharmony_ci  TEMPORARY,
3607ac75b1Sopenharmony_ci  ESMODULE,
3707ac75b1Sopenharmony_ci  $$,
3807ac75b1Sopenharmony_ci  EXTEND_DECORATORS,
3907ac75b1Sopenharmony_ci  COMPONENT_EXTEND_DECORATOR,
4007ac75b1Sopenharmony_ci  COMPONENT_ANIMATABLE_EXTEND_DECORATOR,
4107ac75b1Sopenharmony_ci  COMPONENT_CONSTRUCTOR_LOCALSTORAGE_TYPE_PU,
4207ac75b1Sopenharmony_ci  GET_SHARED,
4307ac75b1Sopenharmony_ci  COMPONENT_CONSTRUCTOR_UNDEFINED,
4407ac75b1Sopenharmony_ci  USE_SHARED_STORAGE,
4507ac75b1Sopenharmony_ci  STORAGE
4607ac75b1Sopenharmony_ci} from './pre_define';
4707ac75b1Sopenharmony_ci
4807ac75b1Sopenharmony_ciexport enum LogType {
4907ac75b1Sopenharmony_ci  ERROR = 'ERROR',
5007ac75b1Sopenharmony_ci  WARN = 'WARN',
5107ac75b1Sopenharmony_ci  NOTE = 'NOTE'
5207ac75b1Sopenharmony_ci}
5307ac75b1Sopenharmony_ciexport const TEMPORARYS: string = 'temporarys';
5407ac75b1Sopenharmony_ciexport const BUILD: string = 'build';
5507ac75b1Sopenharmony_ciexport const SRC_MAIN: string = 'src/main';
5607ac75b1Sopenharmony_ci
5707ac75b1Sopenharmony_ciconst red: string = '\u001b[31m';
5807ac75b1Sopenharmony_ciconst reset: string = '\u001b[39m';
5907ac75b1Sopenharmony_ci
6007ac75b1Sopenharmony_ciconst WINDOWS: string = 'Windows_NT';
6107ac75b1Sopenharmony_ciconst LINUX: string = 'Linux';
6207ac75b1Sopenharmony_ciconst MAC: string = 'Darwin';
6307ac75b1Sopenharmony_ciconst HARMONYOS: string = 'HarmonyOS';
6407ac75b1Sopenharmony_ci
6507ac75b1Sopenharmony_ciexport interface LogInfo {
6607ac75b1Sopenharmony_ci  type: LogType,
6707ac75b1Sopenharmony_ci  message: string,
6807ac75b1Sopenharmony_ci  pos?: number,
6907ac75b1Sopenharmony_ci  line?: number,
7007ac75b1Sopenharmony_ci  column?: number,
7107ac75b1Sopenharmony_ci  fileName?: string
7207ac75b1Sopenharmony_ci}
7307ac75b1Sopenharmony_ci
7407ac75b1Sopenharmony_ciexport const repeatLog: Map<string, LogInfo> = new Map();
7507ac75b1Sopenharmony_ci
7607ac75b1Sopenharmony_ciexport interface IFileLog {
7707ac75b1Sopenharmony_ci  sourceFile: ts.SourceFile | undefined;
7807ac75b1Sopenharmony_ci  errors: LogInfo[];
7907ac75b1Sopenharmony_ci  cleanUp(): void
8007ac75b1Sopenharmony_ci}
8107ac75b1Sopenharmony_ci
8207ac75b1Sopenharmony_ciexport function emitLogInfo(loader: any, infos: LogInfo[], fastBuild: boolean = false,
8307ac75b1Sopenharmony_ci  resourcePath: string = null): void {
8407ac75b1Sopenharmony_ci  if (infos && infos.length) {
8507ac75b1Sopenharmony_ci    infos.forEach((item) => {
8607ac75b1Sopenharmony_ci      switch (item.type) {
8707ac75b1Sopenharmony_ci        case LogType.ERROR:
8807ac75b1Sopenharmony_ci          fastBuild ? loader.error('\u001b[31m' + getMessage(item.fileName || resourcePath, item, true)) :
8907ac75b1Sopenharmony_ci            loader.emitError(getMessage(item.fileName || loader.resourcePath, item));
9007ac75b1Sopenharmony_ci          break;
9107ac75b1Sopenharmony_ci        case LogType.WARN:
9207ac75b1Sopenharmony_ci          fastBuild ? loader.warn('\u001b[33m' + getMessage(item.fileName || resourcePath, item, true)) :
9307ac75b1Sopenharmony_ci            loader.emitWarning(getMessage(item.fileName || loader.resourcePath, item));
9407ac75b1Sopenharmony_ci          break;
9507ac75b1Sopenharmony_ci        case LogType.NOTE:
9607ac75b1Sopenharmony_ci          fastBuild ? loader.info('\u001b[34m' + getMessage(item.fileName || resourcePath, item, true)) :
9707ac75b1Sopenharmony_ci            loader.emitWarning(getMessage(loader.resourcePath, item));
9807ac75b1Sopenharmony_ci          break;
9907ac75b1Sopenharmony_ci      }
10007ac75b1Sopenharmony_ci    });
10107ac75b1Sopenharmony_ci  }
10207ac75b1Sopenharmony_ci}
10307ac75b1Sopenharmony_ci
10407ac75b1Sopenharmony_ciexport function addLog(type: LogType, message: string, pos: number, log: LogInfo[],
10507ac75b1Sopenharmony_ci  sourceFile: ts.SourceFile) {
10607ac75b1Sopenharmony_ci  const posOfNode: ts.LineAndCharacter = sourceFile.getLineAndCharacterOfPosition(pos);
10707ac75b1Sopenharmony_ci  log.push({
10807ac75b1Sopenharmony_ci    type: type,
10907ac75b1Sopenharmony_ci    message: message,
11007ac75b1Sopenharmony_ci    line: posOfNode.line + 1,
11107ac75b1Sopenharmony_ci    column: posOfNode.character + 1,
11207ac75b1Sopenharmony_ci    fileName: sourceFile.fileName
11307ac75b1Sopenharmony_ci  });
11407ac75b1Sopenharmony_ci}
11507ac75b1Sopenharmony_ci
11607ac75b1Sopenharmony_ciexport function getMessage(fileName: string, info: LogInfo, fastBuild: boolean = false): string {
11707ac75b1Sopenharmony_ci  let message: string;
11807ac75b1Sopenharmony_ci  if (info.line && info.column) {
11907ac75b1Sopenharmony_ci    message = `BUILD${info.type} File: ${fileName}:${info.line}:${info.column}\n ${info.message}`;
12007ac75b1Sopenharmony_ci  } else {
12107ac75b1Sopenharmony_ci    message = `BUILD${info.type} File: ${fileName}\n ${info.message}`;
12207ac75b1Sopenharmony_ci  }
12307ac75b1Sopenharmony_ci  if (fastBuild) {
12407ac75b1Sopenharmony_ci    message = message.replace(/^BUILD/, 'ArkTS:');
12507ac75b1Sopenharmony_ci  }
12607ac75b1Sopenharmony_ci  return message;
12707ac75b1Sopenharmony_ci}
12807ac75b1Sopenharmony_ci
12907ac75b1Sopenharmony_ciexport function getTransformLog(transformLog: IFileLog): LogInfo[] {
13007ac75b1Sopenharmony_ci  const sourceFile: ts.SourceFile = transformLog.sourceFile;
13107ac75b1Sopenharmony_ci  const logInfos: LogInfo[] = transformLog.errors.map((item) => {
13207ac75b1Sopenharmony_ci    if (item.pos) {
13307ac75b1Sopenharmony_ci      if (!item.column || !item.line) {
13407ac75b1Sopenharmony_ci        const posOfNode: ts.LineAndCharacter = sourceFile.getLineAndCharacterOfPosition(item.pos);
13507ac75b1Sopenharmony_ci        item.line = posOfNode.line + 1;
13607ac75b1Sopenharmony_ci        item.column = posOfNode.character + 1;
13707ac75b1Sopenharmony_ci      }
13807ac75b1Sopenharmony_ci    } else {
13907ac75b1Sopenharmony_ci      item.line = item.line || undefined;
14007ac75b1Sopenharmony_ci      item.column = item.column || undefined;
14107ac75b1Sopenharmony_ci    }
14207ac75b1Sopenharmony_ci    if (!item.fileName) {
14307ac75b1Sopenharmony_ci      item.fileName = sourceFile.fileName;
14407ac75b1Sopenharmony_ci    }
14507ac75b1Sopenharmony_ci    return item;
14607ac75b1Sopenharmony_ci  });
14707ac75b1Sopenharmony_ci  return logInfos;
14807ac75b1Sopenharmony_ci}
14907ac75b1Sopenharmony_ci
15007ac75b1Sopenharmony_ciclass ComponentInfo {
15107ac75b1Sopenharmony_ci  private _id: number = 0;
15207ac75b1Sopenharmony_ci  private _componentNames: Set<string> = new Set(['ForEach']);
15307ac75b1Sopenharmony_ci  public set id(id: number) {
15407ac75b1Sopenharmony_ci    this._id = id;
15507ac75b1Sopenharmony_ci  }
15607ac75b1Sopenharmony_ci  public get id() {
15707ac75b1Sopenharmony_ci    return this._id;
15807ac75b1Sopenharmony_ci  }
15907ac75b1Sopenharmony_ci  public set componentNames(componentNames: Set<string>) {
16007ac75b1Sopenharmony_ci    this._componentNames = componentNames;
16107ac75b1Sopenharmony_ci  }
16207ac75b1Sopenharmony_ci  public get componentNames() {
16307ac75b1Sopenharmony_ci    return this._componentNames;
16407ac75b1Sopenharmony_ci  }
16507ac75b1Sopenharmony_ci}
16607ac75b1Sopenharmony_ci
16707ac75b1Sopenharmony_ciexport let componentInfo: ComponentInfo = new ComponentInfo();
16807ac75b1Sopenharmony_ci
16907ac75b1Sopenharmony_ciexport function hasDecorator(node: ts.MethodDeclaration | ts.FunctionDeclaration |
17007ac75b1Sopenharmony_ci  ts.StructDeclaration | ts.ClassDeclaration, decortorName: string,
17107ac75b1Sopenharmony_ci  customBuilder: ts.Decorator[] = null, log: LogInfo[] = null): boolean {
17207ac75b1Sopenharmony_ci  const decorators: readonly ts.Decorator[] = ts.getAllDecorators(node);
17307ac75b1Sopenharmony_ci  if (decorators && decorators.length) {
17407ac75b1Sopenharmony_ci    const extendResult = {
17507ac75b1Sopenharmony_ci      Extend: false,
17607ac75b1Sopenharmony_ci      AnimatableExtend: false
17707ac75b1Sopenharmony_ci    };
17807ac75b1Sopenharmony_ci    for (let i = 0; i < decorators.length; i++) {
17907ac75b1Sopenharmony_ci      const originalDecortor: string = decorators[i].getText().replace(/\(.*\)$/, '').replace(/\s*/g, '').trim();
18007ac75b1Sopenharmony_ci      if (log && EXTEND_DECORATORS.includes(decortorName)) {
18107ac75b1Sopenharmony_ci        if (originalDecortor === COMPONENT_EXTEND_DECORATOR) {
18207ac75b1Sopenharmony_ci          extendResult.Extend = true;
18307ac75b1Sopenharmony_ci        }
18407ac75b1Sopenharmony_ci        if (originalDecortor === COMPONENT_ANIMATABLE_EXTEND_DECORATOR) {
18507ac75b1Sopenharmony_ci          extendResult.AnimatableExtend = true;
18607ac75b1Sopenharmony_ci        }
18707ac75b1Sopenharmony_ci      } else {
18807ac75b1Sopenharmony_ci        if (originalDecortor === decortorName) {
18907ac75b1Sopenharmony_ci          if (customBuilder) {
19007ac75b1Sopenharmony_ci            customBuilder.push(...decorators.slice(i + 1), ...decorators.slice(0, i));
19107ac75b1Sopenharmony_ci          }
19207ac75b1Sopenharmony_ci          return true;
19307ac75b1Sopenharmony_ci        }
19407ac75b1Sopenharmony_ci      }
19507ac75b1Sopenharmony_ci    }
19607ac75b1Sopenharmony_ci    if (log && extendResult.Extend && extendResult.AnimatableExtend) {
19707ac75b1Sopenharmony_ci      log.push({
19807ac75b1Sopenharmony_ci        type: LogType.ERROR,
19907ac75b1Sopenharmony_ci        message: `The function can not be decorated by '@Extend' and '@AnimatableExtend' at the same time.`,
20007ac75b1Sopenharmony_ci        pos: node.getStart()
20107ac75b1Sopenharmony_ci      });
20207ac75b1Sopenharmony_ci    }
20307ac75b1Sopenharmony_ci    return (decortorName === COMPONENT_EXTEND_DECORATOR && extendResult.Extend) ||
20407ac75b1Sopenharmony_ci      (decortorName === COMPONENT_ANIMATABLE_EXTEND_DECORATOR && extendResult.AnimatableExtend);
20507ac75b1Sopenharmony_ci  }
20607ac75b1Sopenharmony_ci  return false;
20707ac75b1Sopenharmony_ci}
20807ac75b1Sopenharmony_ci
20907ac75b1Sopenharmony_ciconst STATEMENT_EXPECT: number = 1128;
21007ac75b1Sopenharmony_ciconst SEMICOLON_EXPECT: number = 1005;
21107ac75b1Sopenharmony_ciconst STATESTYLES_EXPECT: number = 1003;
21207ac75b1Sopenharmony_ciexport const IGNORE_ERROR_CODE: number[] = [STATEMENT_EXPECT, SEMICOLON_EXPECT, STATESTYLES_EXPECT];
21307ac75b1Sopenharmony_ci
21407ac75b1Sopenharmony_ciexport function readFile(dir: string, utFiles: string[]): void {
21507ac75b1Sopenharmony_ci  try {
21607ac75b1Sopenharmony_ci    const files: string[] = fs.readdirSync(dir);
21707ac75b1Sopenharmony_ci    files.forEach((element) => {
21807ac75b1Sopenharmony_ci      const filePath: string = path.join(dir, element);
21907ac75b1Sopenharmony_ci      const status: fs.Stats = fs.statSync(filePath);
22007ac75b1Sopenharmony_ci      if (status.isDirectory()) {
22107ac75b1Sopenharmony_ci        readFile(filePath, utFiles);
22207ac75b1Sopenharmony_ci      } else {
22307ac75b1Sopenharmony_ci        utFiles.push(filePath);
22407ac75b1Sopenharmony_ci      }
22507ac75b1Sopenharmony_ci    });
22607ac75b1Sopenharmony_ci  } catch (e) {
22707ac75b1Sopenharmony_ci    console.error(red, 'ArkTS ERROR: ' + e, reset);
22807ac75b1Sopenharmony_ci  }
22907ac75b1Sopenharmony_ci}
23007ac75b1Sopenharmony_ci
23107ac75b1Sopenharmony_ciexport function circularFile(inputPath: string, outputPath: string): void {
23207ac75b1Sopenharmony_ci  if (!inputPath || !outputPath) {
23307ac75b1Sopenharmony_ci    return;
23407ac75b1Sopenharmony_ci  }
23507ac75b1Sopenharmony_ci  fs.readdir(inputPath, function (err, files) {
23607ac75b1Sopenharmony_ci    if (!files) {
23707ac75b1Sopenharmony_ci      return;
23807ac75b1Sopenharmony_ci    }
23907ac75b1Sopenharmony_ci    files.forEach(file => {
24007ac75b1Sopenharmony_ci      const inputFile: string = path.resolve(inputPath, file);
24107ac75b1Sopenharmony_ci      const outputFile: string = path.resolve(outputPath, file);
24207ac75b1Sopenharmony_ci      const fileStat: fs.Stats = fs.statSync(inputFile);
24307ac75b1Sopenharmony_ci      if (fileStat.isFile()) {
24407ac75b1Sopenharmony_ci        copyFile(inputFile, outputFile);
24507ac75b1Sopenharmony_ci      } else {
24607ac75b1Sopenharmony_ci        circularFile(inputFile, outputFile);
24707ac75b1Sopenharmony_ci      }
24807ac75b1Sopenharmony_ci    });
24907ac75b1Sopenharmony_ci  });
25007ac75b1Sopenharmony_ci}
25107ac75b1Sopenharmony_ci
25207ac75b1Sopenharmony_cifunction copyFile(inputFile: string, outputFile: string): void {
25307ac75b1Sopenharmony_ci  try {
25407ac75b1Sopenharmony_ci    const parent: string = path.join(outputFile, '..');
25507ac75b1Sopenharmony_ci    if (!(fs.existsSync(parent) && fs.statSync(parent).isDirectory())) {
25607ac75b1Sopenharmony_ci      mkDir(parent);
25707ac75b1Sopenharmony_ci    }
25807ac75b1Sopenharmony_ci    if (fs.existsSync(outputFile)) {
25907ac75b1Sopenharmony_ci      return;
26007ac75b1Sopenharmony_ci    }
26107ac75b1Sopenharmony_ci    const readStream: fs.ReadStream = fs.createReadStream(inputFile);
26207ac75b1Sopenharmony_ci    const writeStream: fs.WriteStream = fs.createWriteStream(outputFile);
26307ac75b1Sopenharmony_ci    readStream.pipe(writeStream);
26407ac75b1Sopenharmony_ci    readStream.on('close', function () {
26507ac75b1Sopenharmony_ci      writeStream.end();
26607ac75b1Sopenharmony_ci    });
26707ac75b1Sopenharmony_ci  } catch (err) {
26807ac75b1Sopenharmony_ci    throw err.message;
26907ac75b1Sopenharmony_ci  }
27007ac75b1Sopenharmony_ci}
27107ac75b1Sopenharmony_ci
27207ac75b1Sopenharmony_ciexport function mkDir(path_: string): void {
27307ac75b1Sopenharmony_ci  const parent: string = path.join(path_, '..');
27407ac75b1Sopenharmony_ci  if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) {
27507ac75b1Sopenharmony_ci    mkDir(parent);
27607ac75b1Sopenharmony_ci  }
27707ac75b1Sopenharmony_ci  fs.mkdirSync(path_);
27807ac75b1Sopenharmony_ci}
27907ac75b1Sopenharmony_ci
28007ac75b1Sopenharmony_ciexport function toUnixPath(data: string): string {
28107ac75b1Sopenharmony_ci  if (/^win/.test(require('os').platform())) {
28207ac75b1Sopenharmony_ci    const fileTmps: string[] = data.split(path.sep);
28307ac75b1Sopenharmony_ci    const newData: string = path.posix.join(...fileTmps);
28407ac75b1Sopenharmony_ci    return newData;
28507ac75b1Sopenharmony_ci  }
28607ac75b1Sopenharmony_ci  return data;
28707ac75b1Sopenharmony_ci}
28807ac75b1Sopenharmony_ci
28907ac75b1Sopenharmony_ciexport function tryToLowerCasePath(filePath: string): string {
29007ac75b1Sopenharmony_ci  return toUnixPath(filePath).toLowerCase();
29107ac75b1Sopenharmony_ci}
29207ac75b1Sopenharmony_ci
29307ac75b1Sopenharmony_ciexport function toHashData(path: string): string {
29407ac75b1Sopenharmony_ci  const content: string = fs.readFileSync(path).toString();
29507ac75b1Sopenharmony_ci  const hash: Hash = createHash('sha256');
29607ac75b1Sopenharmony_ci  hash.update(content);
29707ac75b1Sopenharmony_ci  return hash.digest('hex');
29807ac75b1Sopenharmony_ci}
29907ac75b1Sopenharmony_ci
30007ac75b1Sopenharmony_ciexport function writeFileSync(filePath: string, content: string): void {
30107ac75b1Sopenharmony_ci  if (!fs.existsSync(filePath)) {
30207ac75b1Sopenharmony_ci    const parent: string = path.join(filePath, '..');
30307ac75b1Sopenharmony_ci    if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) {
30407ac75b1Sopenharmony_ci      mkDir(parent);
30507ac75b1Sopenharmony_ci    }
30607ac75b1Sopenharmony_ci  }
30707ac75b1Sopenharmony_ci  fs.writeFileSync(filePath, content);
30807ac75b1Sopenharmony_ci}
30907ac75b1Sopenharmony_ciexport function genLoaderOutPathOfHar(filePath: string, cachePath: string, buildPath: string, moduleRootPath: string, projectRootPath): string {
31007ac75b1Sopenharmony_ci  filePath = toUnixPath(filePath);
31107ac75b1Sopenharmony_ci  buildPath = toUnixPath(buildPath);
31207ac75b1Sopenharmony_ci  const cacheRootPath: string = toUnixPath(cachePath);
31307ac75b1Sopenharmony_ci  const moduleName = toUnixPath(moduleRootPath).replace(toUnixPath(projectRootPath), '');
31407ac75b1Sopenharmony_ci  const relativeFilePath: string = filePath.replace(cacheRootPath, '').replace(moduleName, '');
31507ac75b1Sopenharmony_ci  const output: string = path.join(buildPath, relativeFilePath);
31607ac75b1Sopenharmony_ci  return output;
31707ac75b1Sopenharmony_ci}
31807ac75b1Sopenharmony_ci
31907ac75b1Sopenharmony_ciexport function genTemporaryPath(filePath: string, projectPath: string, buildPath: string, projectConfig: Object,
32007ac75b1Sopenharmony_ci  metaInfo: Object, buildInHar: boolean = false): string {
32107ac75b1Sopenharmony_ci  filePath = toUnixPath(filePath).replace(/\.[cm]js$/, EXTNAME_JS);
32207ac75b1Sopenharmony_ci  projectPath = toUnixPath(projectPath);
32307ac75b1Sopenharmony_ci
32407ac75b1Sopenharmony_ci  if (process.env.compileTool === 'rollup') {
32507ac75b1Sopenharmony_ci    let relativeFilePath: string = '';
32607ac75b1Sopenharmony_ci    if (metaInfo) {
32707ac75b1Sopenharmony_ci      if (metaInfo.isLocalDependency) {
32807ac75b1Sopenharmony_ci        // When buildInHar and compileHar are both True,
32907ac75b1Sopenharmony_ci        // this is the path under the PackageHar directory being spliced ​​together.
33007ac75b1Sopenharmony_ci        // Here, only the relative path based on moduleRootPath needs to be retained.
33107ac75b1Sopenharmony_ci        // eg. moduleA/index.js --> index.js --> PackageHar/index.js
33207ac75b1Sopenharmony_ci        // eg. moduleA/src/main/ets/test.js --> src/main/ets/test.js --> PackageHar/src/main/ets/test.js
33307ac75b1Sopenharmony_ci        const moduleName: string = buildInHar && projectConfig.compileHar ? '' : metaInfo.moduleName;
33407ac75b1Sopenharmony_ci        relativeFilePath = filePath.replace(toUnixPath(metaInfo.belongModulePath), moduleName);
33507ac75b1Sopenharmony_ci      } else {
33607ac75b1Sopenharmony_ci        relativeFilePath = filePath.replace(toUnixPath(metaInfo.belongProjectPath), '');
33707ac75b1Sopenharmony_ci      }
33807ac75b1Sopenharmony_ci    } else {
33907ac75b1Sopenharmony_ci      relativeFilePath = filePath.replace(toUnixPath(projectConfig.projectRootPath), '');
34007ac75b1Sopenharmony_ci    }
34107ac75b1Sopenharmony_ci    const output: string = path.join(buildPath, relativeFilePath);
34207ac75b1Sopenharmony_ci    return output;
34307ac75b1Sopenharmony_ci  }
34407ac75b1Sopenharmony_ci
34507ac75b1Sopenharmony_ci  if (isPackageModulesFile(filePath, projectConfig)) {
34607ac75b1Sopenharmony_ci    const packageDir: string = projectConfig.packageDir;
34707ac75b1Sopenharmony_ci    const fakePkgModulesPath: string = toUnixPath(path.join(projectConfig.projectRootPath, packageDir));
34807ac75b1Sopenharmony_ci    let output: string = '';
34907ac75b1Sopenharmony_ci    if (filePath.indexOf(fakePkgModulesPath) === -1) {
35007ac75b1Sopenharmony_ci      const hapPath: string = toUnixPath(projectConfig.projectRootPath);
35107ac75b1Sopenharmony_ci      const tempFilePath: string = filePath.replace(hapPath, '');
35207ac75b1Sopenharmony_ci      const relativeFilePath: string = tempFilePath.substring(tempFilePath.indexOf(packageDir) + packageDir.length + 1);
35307ac75b1Sopenharmony_ci      output = path.join(buildPath, buildInHar ? '' : TEMPORARY, packageDir, MAIN, relativeFilePath);
35407ac75b1Sopenharmony_ci    } else {
35507ac75b1Sopenharmony_ci      output = filePath.replace(fakePkgModulesPath,
35607ac75b1Sopenharmony_ci        path.join(buildPath, buildInHar ? '' : TEMPORARY, packageDir, AUXILIARY));
35707ac75b1Sopenharmony_ci    }
35807ac75b1Sopenharmony_ci    return output;
35907ac75b1Sopenharmony_ci  }
36007ac75b1Sopenharmony_ci
36107ac75b1Sopenharmony_ci  if (filePath.indexOf(projectPath) !== -1) {
36207ac75b1Sopenharmony_ci    const relativeFilePath: string = filePath.replace(projectPath, '');
36307ac75b1Sopenharmony_ci    const output: string = path.join(buildPath, buildInHar ? '' : TEMPORARY, relativeFilePath);
36407ac75b1Sopenharmony_ci    return output;
36507ac75b1Sopenharmony_ci  }
36607ac75b1Sopenharmony_ci
36707ac75b1Sopenharmony_ci  return '';
36807ac75b1Sopenharmony_ci}
36907ac75b1Sopenharmony_ci
37007ac75b1Sopenharmony_ciexport function isPackageModulesFile(filePath: string, projectConfig: Object): boolean {
37107ac75b1Sopenharmony_ci  filePath = toUnixPath(filePath);
37207ac75b1Sopenharmony_ci  const hapPath: string = toUnixPath(projectConfig.projectRootPath);
37307ac75b1Sopenharmony_ci  const tempFilePath: string = filePath.replace(hapPath, '');
37407ac75b1Sopenharmony_ci  const packageDir: string = projectConfig.packageDir;
37507ac75b1Sopenharmony_ci  if (tempFilePath.indexOf(packageDir) !== -1) {
37607ac75b1Sopenharmony_ci    const fakePkgModulesPath: string = toUnixPath(path.resolve(projectConfig.projectRootPath, packageDir));
37707ac75b1Sopenharmony_ci    if (filePath.indexOf(fakePkgModulesPath) !== -1) {
37807ac75b1Sopenharmony_ci      return true;
37907ac75b1Sopenharmony_ci    }
38007ac75b1Sopenharmony_ci    if (projectConfig.modulePathMap) {
38107ac75b1Sopenharmony_ci      for (const key in projectConfig.modulePathMap) {
38207ac75b1Sopenharmony_ci        const value: string = projectConfig.modulePathMap[key];
38307ac75b1Sopenharmony_ci        const fakeModulePkgModulesPath: string = toUnixPath(path.resolve(value, packageDir));
38407ac75b1Sopenharmony_ci        if (filePath.indexOf(fakeModulePkgModulesPath) !== -1) {
38507ac75b1Sopenharmony_ci          return true;
38607ac75b1Sopenharmony_ci        }
38707ac75b1Sopenharmony_ci      }
38807ac75b1Sopenharmony_ci    }
38907ac75b1Sopenharmony_ci  }
39007ac75b1Sopenharmony_ci
39107ac75b1Sopenharmony_ci  return false;
39207ac75b1Sopenharmony_ci}
39307ac75b1Sopenharmony_ci
39407ac75b1Sopenharmony_ciexport interface GeneratedFileInHar {
39507ac75b1Sopenharmony_ci  sourcePath: string;
39607ac75b1Sopenharmony_ci  sourceCachePath?: string;
39707ac75b1Sopenharmony_ci  obfuscatedSourceCachePath?: string;
39807ac75b1Sopenharmony_ci  originalDeclarationCachePath?: string;
39907ac75b1Sopenharmony_ci  originalDeclarationContent?: string;
40007ac75b1Sopenharmony_ci  obfuscatedDeclarationCachePath?: string;
40107ac75b1Sopenharmony_ci}
40207ac75b1Sopenharmony_ci
40307ac75b1Sopenharmony_ciexport const harFilesRecord: Map<string, GeneratedFileInHar> = new Map();
40407ac75b1Sopenharmony_ci
40507ac75b1Sopenharmony_ciexport function generateSourceFilesInHar(sourcePath: string, sourceContent: string, suffix: string,
40607ac75b1Sopenharmony_ci  projectConfig: Object, modulePathMap?: Object): void {
40707ac75b1Sopenharmony_ci  const belongModuleInfo: Object = getBelongModuleInfo(sourcePath, modulePathMap, projectConfig.projectRootPath);
40807ac75b1Sopenharmony_ci  // compileShared: compile shared har of project
40907ac75b1Sopenharmony_ci  let jsFilePath: string = genTemporaryPath(sourcePath,
41007ac75b1Sopenharmony_ci    projectConfig.compileShared ? projectConfig.projectRootPath : projectConfig.moduleRootPath,
41107ac75b1Sopenharmony_ci    projectConfig.compileShared || projectConfig.byteCodeHar ? path.resolve(projectConfig.aceModuleBuild, '../etsFortgz') : projectConfig.cachePath,
41207ac75b1Sopenharmony_ci    projectConfig, belongModuleInfo, projectConfig.compileShared);
41307ac75b1Sopenharmony_ci  if (!jsFilePath.match(new RegExp(projectConfig.packageDir))) {
41407ac75b1Sopenharmony_ci    jsFilePath = jsFilePath.replace(/\.ets$/, suffix).replace(/\.ts$/, suffix);
41507ac75b1Sopenharmony_ci    if (projectConfig.obfuscateHarType === 'uglify' && suffix === '.js') {
41607ac75b1Sopenharmony_ci      sourceContent = uglifyJS.minify(sourceContent).code;
41707ac75b1Sopenharmony_ci    }
41807ac75b1Sopenharmony_ci    // collect the declaration files for obfuscation
41907ac75b1Sopenharmony_ci    if (projectConfig.compileMode === ESMODULE && (/\.d\.e?ts$/).test(jsFilePath)) {
42007ac75b1Sopenharmony_ci      sourcePath = toUnixPath(sourcePath);
42107ac75b1Sopenharmony_ci      const genFilesInHar: GeneratedFileInHar = {
42207ac75b1Sopenharmony_ci        sourcePath: sourcePath,
42307ac75b1Sopenharmony_ci        originalDeclarationCachePath: jsFilePath,
42407ac75b1Sopenharmony_ci        originalDeclarationContent: sourceContent
42507ac75b1Sopenharmony_ci      };
42607ac75b1Sopenharmony_ci      harFilesRecord.set(sourcePath, genFilesInHar);
42707ac75b1Sopenharmony_ci      return;
42807ac75b1Sopenharmony_ci    } else {
42907ac75b1Sopenharmony_ci      mkdirsSync(path.dirname(jsFilePath));
43007ac75b1Sopenharmony_ci    }
43107ac75b1Sopenharmony_ci    fs.writeFileSync(jsFilePath, sourceContent);
43207ac75b1Sopenharmony_ci  }
43307ac75b1Sopenharmony_ci}
43407ac75b1Sopenharmony_ci
43507ac75b1Sopenharmony_ciexport function mkdirsSync(dirname: string): boolean {
43607ac75b1Sopenharmony_ci  if (fs.existsSync(dirname)) {
43707ac75b1Sopenharmony_ci    return true;
43807ac75b1Sopenharmony_ci  } else if (mkdirsSync(path.dirname(dirname))) {
43907ac75b1Sopenharmony_ci    fs.mkdirSync(dirname);
44007ac75b1Sopenharmony_ci    return true;
44107ac75b1Sopenharmony_ci  }
44207ac75b1Sopenharmony_ci
44307ac75b1Sopenharmony_ci  return false;
44407ac75b1Sopenharmony_ci}
44507ac75b1Sopenharmony_ci
44607ac75b1Sopenharmony_ciexport function nodeLargeOrEqualTargetVersion(targetVersion: number): boolean {
44707ac75b1Sopenharmony_ci  const currentNodeVersion: number = parseInt(process.versions.node.split('.')[0]);
44807ac75b1Sopenharmony_ci  if (currentNodeVersion >= targetVersion) {
44907ac75b1Sopenharmony_ci    return true;
45007ac75b1Sopenharmony_ci  }
45107ac75b1Sopenharmony_ci
45207ac75b1Sopenharmony_ci  return false;
45307ac75b1Sopenharmony_ci}
45407ac75b1Sopenharmony_ci
45507ac75b1Sopenharmony_ciexport function removeDir(dirName: string): void {
45607ac75b1Sopenharmony_ci  if (fs.existsSync(dirName)) {
45707ac75b1Sopenharmony_ci    if (nodeLargeOrEqualTargetVersion(16)) {
45807ac75b1Sopenharmony_ci      fs.rmSync(dirName, { recursive: true });
45907ac75b1Sopenharmony_ci    } else {
46007ac75b1Sopenharmony_ci      fs.rmdirSync(dirName, { recursive: true });
46107ac75b1Sopenharmony_ci    }
46207ac75b1Sopenharmony_ci  }
46307ac75b1Sopenharmony_ci}
46407ac75b1Sopenharmony_ci
46507ac75b1Sopenharmony_ciexport function parseErrorMessage(message: string): string {
46607ac75b1Sopenharmony_ci  const messageArrary: string[] = message.split('\n');
46707ac75b1Sopenharmony_ci  let logContent: string = '';
46807ac75b1Sopenharmony_ci  messageArrary.forEach(element => {
46907ac75b1Sopenharmony_ci    if (!(/^at/.test(element.trim()))) {
47007ac75b1Sopenharmony_ci      logContent = logContent + element + '\n';
47107ac75b1Sopenharmony_ci    }
47207ac75b1Sopenharmony_ci  });
47307ac75b1Sopenharmony_ci  return logContent;
47407ac75b1Sopenharmony_ci}
47507ac75b1Sopenharmony_ci
47607ac75b1Sopenharmony_ciexport function isWindows(): boolean {
47707ac75b1Sopenharmony_ci  return os.type() === WINDOWS;
47807ac75b1Sopenharmony_ci}
47907ac75b1Sopenharmony_ci
48007ac75b1Sopenharmony_ciexport function isLinux(): boolean {
48107ac75b1Sopenharmony_ci  return os.type() === LINUX;
48207ac75b1Sopenharmony_ci}
48307ac75b1Sopenharmony_ci
48407ac75b1Sopenharmony_ciexport function isMac(): boolean {
48507ac75b1Sopenharmony_ci  return os.type() === MAC;
48607ac75b1Sopenharmony_ci}
48707ac75b1Sopenharmony_ci
48807ac75b1Sopenharmony_ciexport function isHarmonyOs(): boolean {
48907ac75b1Sopenharmony_ci  return os.type() === HARMONYOS;
49007ac75b1Sopenharmony_ci}
49107ac75b1Sopenharmony_ci
49207ac75b1Sopenharmony_ciexport function maxFilePathLength(): number {
49307ac75b1Sopenharmony_ci  if (isWindows()) {
49407ac75b1Sopenharmony_ci    return 32766;
49507ac75b1Sopenharmony_ci  } else if (isLinux() || isHarmonyOs()) {
49607ac75b1Sopenharmony_ci    return 4095;
49707ac75b1Sopenharmony_ci  } else if (isMac()) {
49807ac75b1Sopenharmony_ci    return 1016;
49907ac75b1Sopenharmony_ci  } else {
50007ac75b1Sopenharmony_ci    return -1;
50107ac75b1Sopenharmony_ci  }
50207ac75b1Sopenharmony_ci}
50307ac75b1Sopenharmony_ci
50407ac75b1Sopenharmony_ciexport function validateFilePathLength(filePath: string, logger: Object): boolean {
50507ac75b1Sopenharmony_ci  if (maxFilePathLength() < 0) {
50607ac75b1Sopenharmony_ci    logger.error(red, 'Unknown OS platform', reset);
50707ac75b1Sopenharmony_ci    process.exitCode = FAIL;
50807ac75b1Sopenharmony_ci    return false;
50907ac75b1Sopenharmony_ci  } else if (filePath.length > 0 && filePath.length <= maxFilePathLength()) {
51007ac75b1Sopenharmony_ci    return true;
51107ac75b1Sopenharmony_ci  } else if (filePath.length > maxFilePathLength()) {
51207ac75b1Sopenharmony_ci    logger.error(red, `The length of ${filePath} exceeds the limitation of current platform, which is ` +
51307ac75b1Sopenharmony_ci      `${maxFilePathLength()}. Please try moving the project folder to avoid deeply nested file path and try again`,
51407ac75b1Sopenharmony_ci    reset);
51507ac75b1Sopenharmony_ci    process.exitCode = FAIL;
51607ac75b1Sopenharmony_ci    return false;
51707ac75b1Sopenharmony_ci  } else {
51807ac75b1Sopenharmony_ci    logger.error(red, 'Validate file path failed', reset);
51907ac75b1Sopenharmony_ci    process.exitCode = FAIL;
52007ac75b1Sopenharmony_ci    return false;
52107ac75b1Sopenharmony_ci  }
52207ac75b1Sopenharmony_ci}
52307ac75b1Sopenharmony_ci
52407ac75b1Sopenharmony_ciexport function validateFilePathLengths(filePaths: Array<string>, logger: any): boolean {
52507ac75b1Sopenharmony_ci  filePaths.forEach((filePath) => {
52607ac75b1Sopenharmony_ci    if (!validateFilePathLength(filePath, logger)) {
52707ac75b1Sopenharmony_ci      return false;
52807ac75b1Sopenharmony_ci    }
52907ac75b1Sopenharmony_ci    return true;
53007ac75b1Sopenharmony_ci  });
53107ac75b1Sopenharmony_ci  return true;
53207ac75b1Sopenharmony_ci}
53307ac75b1Sopenharmony_ci
53407ac75b1Sopenharmony_ciexport function unlinkSync(filePath: string): void {
53507ac75b1Sopenharmony_ci  if (fs.existsSync(filePath)) {
53607ac75b1Sopenharmony_ci    fs.unlinkSync(filePath);
53707ac75b1Sopenharmony_ci  }
53807ac75b1Sopenharmony_ci}
53907ac75b1Sopenharmony_ci
54007ac75b1Sopenharmony_ciexport function getExtensionIfUnfullySpecifiedFilepath(filePath: string): string {
54107ac75b1Sopenharmony_ci  if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {
54207ac75b1Sopenharmony_ci    return '';
54307ac75b1Sopenharmony_ci  }
54407ac75b1Sopenharmony_ci
54507ac75b1Sopenharmony_ci  let extension: string = EXTNAME_ETS;
54607ac75b1Sopenharmony_ci  if (fs.existsSync(filePath + '.ts') && fs.statSync(filePath + '.ts').isFile()) {
54707ac75b1Sopenharmony_ci    extension = '.ts';
54807ac75b1Sopenharmony_ci  } else if (fs.existsSync(filePath + '.d.ts') && fs.statSync(filePath + '.d.ts').isFile()) {
54907ac75b1Sopenharmony_ci    extension = '.d.ts';
55007ac75b1Sopenharmony_ci  } else if (fs.existsSync(filePath + '.d.ets') && fs.statSync(filePath + '.d.ets').isFile()) {
55107ac75b1Sopenharmony_ci    extension = '.d.ets';
55207ac75b1Sopenharmony_ci  } else if (fs.existsSync(filePath + '.js') && fs.statSync(filePath + '.js').isFile()) {
55307ac75b1Sopenharmony_ci    extension = '.js';
55407ac75b1Sopenharmony_ci  } else if (fs.existsSync(filePath + '.json') && fs.statSync(filePath + '.json').isFile()) {
55507ac75b1Sopenharmony_ci    extension = '.json';
55607ac75b1Sopenharmony_ci  }
55707ac75b1Sopenharmony_ci
55807ac75b1Sopenharmony_ci  return extension;
55907ac75b1Sopenharmony_ci}
56007ac75b1Sopenharmony_ci
56107ac75b1Sopenharmony_ciexport function shouldWriteChangedList(watchModifiedFiles: string[],
56207ac75b1Sopenharmony_ci  watchRemovedFiles: string[]): boolean {
56307ac75b1Sopenharmony_ci  if (projectConfig.compileMode === ESMODULE && process.env.watchMode === 'true' && !projectConfig.isPreview &&
56407ac75b1Sopenharmony_ci    projectConfig.changedFileList && (watchRemovedFiles.length + watchModifiedFiles.length)) {
56507ac75b1Sopenharmony_ci    if (process.env.compileTool !== 'rollup') {
56607ac75b1Sopenharmony_ci      if (!(watchModifiedFiles.length === 1 &&
56707ac75b1Sopenharmony_ci        watchModifiedFiles[0] === projectConfig.projectPath && !watchRemovedFiles.length)) {
56807ac75b1Sopenharmony_ci        return true;
56907ac75b1Sopenharmony_ci      } else {
57007ac75b1Sopenharmony_ci        return false;
57107ac75b1Sopenharmony_ci      }
57207ac75b1Sopenharmony_ci    }
57307ac75b1Sopenharmony_ci    return true;
57407ac75b1Sopenharmony_ci  }
57507ac75b1Sopenharmony_ci  return false;
57607ac75b1Sopenharmony_ci}
57707ac75b1Sopenharmony_ci
57807ac75b1Sopenharmony_ciinterface HotReloadIncrementalTime {
57907ac75b1Sopenharmony_ci  hotReloadIncrementalStartTime: string;
58007ac75b1Sopenharmony_ci  hotReloadIncrementalEndTime: string;
58107ac75b1Sopenharmony_ci}
58207ac75b1Sopenharmony_ci
58307ac75b1Sopenharmony_ciexport const hotReloadIncrementalTime: HotReloadIncrementalTime = {
58407ac75b1Sopenharmony_ci  hotReloadIncrementalStartTime: '',
58507ac75b1Sopenharmony_ci  hotReloadIncrementalEndTime: ''
58607ac75b1Sopenharmony_ci};
58707ac75b1Sopenharmony_ci
58807ac75b1Sopenharmony_ciinterface FilesObj {
58907ac75b1Sopenharmony_ci  modifiedFiles: string[],
59007ac75b1Sopenharmony_ci  removedFiles: string[]
59107ac75b1Sopenharmony_ci}
59207ac75b1Sopenharmony_ci
59307ac75b1Sopenharmony_cilet allModifiedFiles: Set<string> = new Set();
59407ac75b1Sopenharmony_ci
59507ac75b1Sopenharmony_ciexport function getHotReloadFiles(watchModifiedFiles: string[],
59607ac75b1Sopenharmony_ci  watchRemovedFiles: string[], hotReloadSupportFiles: Set<string>): FilesObj {
59707ac75b1Sopenharmony_ci  hotReloadIncrementalTime.hotReloadIncrementalStartTime = new Date().getTime().toString();
59807ac75b1Sopenharmony_ci  watchRemovedFiles = watchRemovedFiles.map(file => path.relative(projectConfig.projectPath, file));
59907ac75b1Sopenharmony_ci  allModifiedFiles = new Set([...allModifiedFiles, ...watchModifiedFiles
60007ac75b1Sopenharmony_ci    .filter(file => fs.statSync(file).isFile() &&
60107ac75b1Sopenharmony_ci      (hotReloadSupportFiles.has(file) || !['.ets', '.ts', '.js'].includes(path.extname(file))))
60207ac75b1Sopenharmony_ci    .map(file => path.relative(projectConfig.projectPath, file))]
60307ac75b1Sopenharmony_ci    .filter(file => !watchRemovedFiles.includes(file)));
60407ac75b1Sopenharmony_ci  return {
60507ac75b1Sopenharmony_ci    modifiedFiles: [...allModifiedFiles],
60607ac75b1Sopenharmony_ci    removedFiles: [...watchRemovedFiles]
60707ac75b1Sopenharmony_ci  };
60807ac75b1Sopenharmony_ci}
60907ac75b1Sopenharmony_ci
61007ac75b1Sopenharmony_ciexport function getResolveModules(projectPath: string, faMode: boolean): string[] {
61107ac75b1Sopenharmony_ci  if (faMode) {
61207ac75b1Sopenharmony_ci    return [
61307ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../../'),
61407ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../' + projectConfig.packageDir),
61507ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../../' + projectConfig.packageDir),
61607ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../')
61707ac75b1Sopenharmony_ci    ];
61807ac75b1Sopenharmony_ci  } else {
61907ac75b1Sopenharmony_ci    return [
62007ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../'),
62107ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../' + projectConfig.packageDir),
62207ac75b1Sopenharmony_ci      path.resolve(projectPath, '../../../../' + projectConfig.packageDir),
62307ac75b1Sopenharmony_ci      path.resolve(projectPath, '../')
62407ac75b1Sopenharmony_ci    ];
62507ac75b1Sopenharmony_ci  }
62607ac75b1Sopenharmony_ci}
62707ac75b1Sopenharmony_ci
62807ac75b1Sopenharmony_ciexport function writeUseOSFiles(useOSFiles: Set<string>): void {
62907ac75b1Sopenharmony_ci  let info: string = '';
63007ac75b1Sopenharmony_ci  if (!fs.existsSync(projectConfig.aceSoPath)) {
63107ac75b1Sopenharmony_ci    const parent: string = path.resolve(projectConfig.aceSoPath, '..');
63207ac75b1Sopenharmony_ci    if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) {
63307ac75b1Sopenharmony_ci      mkDir(parent);
63407ac75b1Sopenharmony_ci    }
63507ac75b1Sopenharmony_ci  } else {
63607ac75b1Sopenharmony_ci    info = fs.readFileSync(projectConfig.aceSoPath, 'utf-8') + '\n';
63707ac75b1Sopenharmony_ci  }
63807ac75b1Sopenharmony_ci  fs.writeFileSync(projectConfig.aceSoPath, info + Array.from(useOSFiles).join('\n'));
63907ac75b1Sopenharmony_ci}
64007ac75b1Sopenharmony_ci
64107ac75b1Sopenharmony_ci
64207ac75b1Sopenharmony_ciexport function writeCollectionFile(cachePath: string, appCollection: Map<string, Set<string>>,
64307ac75b1Sopenharmony_ci  allComponentsOrModules: Map<string, Array<string>>, fileName: string, allFiles: Set<string> = null,
64407ac75b1Sopenharmony_ci  widgetPath: string = undefined): void {
64507ac75b1Sopenharmony_ci  for (let key of appCollection.keys()) {
64607ac75b1Sopenharmony_ci    if (appCollection.get(key).size === 0) {
64707ac75b1Sopenharmony_ci      allComponentsOrModules.delete(key);
64807ac75b1Sopenharmony_ci      continue;
64907ac75b1Sopenharmony_ci    }
65007ac75b1Sopenharmony_ci    if (allFiles && !allFiles.has(key)) {
65107ac75b1Sopenharmony_ci      continue;
65207ac75b1Sopenharmony_ci    }
65307ac75b1Sopenharmony_ci    const newKey: string = projectConfig.projectRootPath ? path.relative(projectConfig.projectRootPath, key) : key;
65407ac75b1Sopenharmony_ci    allComponentsOrModules.set(newKey, Array.from(appCollection.get(key)));
65507ac75b1Sopenharmony_ci  }
65607ac75b1Sopenharmony_ci  const content: string = JSON.stringify(Object.fromEntries(allComponentsOrModules), null, 2);
65707ac75b1Sopenharmony_ci  writeFileSync(path.resolve(cachePath, fileName), content);
65807ac75b1Sopenharmony_ci  if (widgetPath) {
65907ac75b1Sopenharmony_ci    writeFileSync(path.resolve(widgetPath, fileName), content);
66007ac75b1Sopenharmony_ci  }
66107ac75b1Sopenharmony_ci}
66207ac75b1Sopenharmony_ci
66307ac75b1Sopenharmony_ciexport function getAllComponentsOrModules(allFiles: Set<string>,
66407ac75b1Sopenharmony_ci  cacheCollectionFileName: string): Map<string, Array<string>> {
66507ac75b1Sopenharmony_ci  const cacheCollectionFilePath: string = path.resolve(projectConfig.cachePath, cacheCollectionFileName);
66607ac75b1Sopenharmony_ci  const allComponentsOrModules: Map<string, Array<string>> = new Map();
66707ac75b1Sopenharmony_ci  if (!fs.existsSync(cacheCollectionFilePath)) {
66807ac75b1Sopenharmony_ci    return allComponentsOrModules;
66907ac75b1Sopenharmony_ci  }
67007ac75b1Sopenharmony_ci  const lastComponentsOrModules = require(cacheCollectionFilePath);
67107ac75b1Sopenharmony_ci  for (let key in lastComponentsOrModules) {
67207ac75b1Sopenharmony_ci    if (allFiles.has(key)) {
67307ac75b1Sopenharmony_ci      allComponentsOrModules.set(key, lastComponentsOrModules[key]);
67407ac75b1Sopenharmony_ci    }
67507ac75b1Sopenharmony_ci  }
67607ac75b1Sopenharmony_ci  return allComponentsOrModules;
67707ac75b1Sopenharmony_ci}
67807ac75b1Sopenharmony_ci
67907ac75b1Sopenharmony_ciexport function getPossibleBuilderTypeParameter(parameters: ts.ParameterDeclaration[]): string[] {
68007ac75b1Sopenharmony_ci  const parameterNames: string[] = [];
68107ac75b1Sopenharmony_ci  if (!partialUpdateConfig.builderCheck) {
68207ac75b1Sopenharmony_ci    if (isDollarParameter(parameters)) {
68307ac75b1Sopenharmony_ci      parameters[0].type.members.forEach((member) => {
68407ac75b1Sopenharmony_ci        if (member.name && ts.isIdentifier(member.name)) {
68507ac75b1Sopenharmony_ci          parameterNames.push(member.name.escapedText.toString());
68607ac75b1Sopenharmony_ci        }
68707ac75b1Sopenharmony_ci      });
68807ac75b1Sopenharmony_ci    } else {
68907ac75b1Sopenharmony_ci      parameters.forEach((parameter) => {
69007ac75b1Sopenharmony_ci        if (parameter.name && ts.isIdentifier(parameter.name)) {
69107ac75b1Sopenharmony_ci          parameterNames.push(parameter.name.escapedText.toString());
69207ac75b1Sopenharmony_ci        }
69307ac75b1Sopenharmony_ci      });
69407ac75b1Sopenharmony_ci    }
69507ac75b1Sopenharmony_ci  }
69607ac75b1Sopenharmony_ci  return parameterNames;
69707ac75b1Sopenharmony_ci}
69807ac75b1Sopenharmony_ci
69907ac75b1Sopenharmony_cifunction isDollarParameter(parameters: ts.ParameterDeclaration[]): boolean {
70007ac75b1Sopenharmony_ci  return parameters.length === 1 && parameters[0].name && ts.isIdentifier(parameters[0].name) &&
70107ac75b1Sopenharmony_ci    parameters[0].name.escapedText.toString() === $$ && parameters[0].type && ts.isTypeLiteralNode(parameters[0].type) &&
70207ac75b1Sopenharmony_ci    parameters[0].type.members && parameters[0].type.members.length > 0;
70307ac75b1Sopenharmony_ci}
70407ac75b1Sopenharmony_ci
70507ac75b1Sopenharmony_ciinterface ChildrenCacheFile {
70607ac75b1Sopenharmony_ci  fileName: string,
70707ac75b1Sopenharmony_ci  mtimeMs: number,
70807ac75b1Sopenharmony_ci}
70907ac75b1Sopenharmony_ci
71007ac75b1Sopenharmony_ciexport interface CacheFile {
71107ac75b1Sopenharmony_ci  mtimeMs: number,
71207ac75b1Sopenharmony_ci  children: Array<ChildrenCacheFile>,
71307ac75b1Sopenharmony_ci}
71407ac75b1Sopenharmony_ci
71507ac75b1Sopenharmony_ciexport interface RouterInfo {
71607ac75b1Sopenharmony_ci  name: string,
71707ac75b1Sopenharmony_ci  buildFunction: string,
71807ac75b1Sopenharmony_ci}
71907ac75b1Sopenharmony_ci
72007ac75b1Sopenharmony_ci// Global Information & Method
72107ac75b1Sopenharmony_ciexport class ProcessFileInfo {
72207ac75b1Sopenharmony_ci  buildStart: boolean = true;
72307ac75b1Sopenharmony_ci  wholeFileInfo: { [id: string]: SpecialArkTSFileInfo | TSFileInfo } = {}; // Save ArkTS & TS file's infomation
72407ac75b1Sopenharmony_ci  transformedFiles: Set<string> = new Set(); // ArkTS & TS Files which should be transformed in this compilation
72507ac75b1Sopenharmony_ci  cachedFiles: string[] = []; // ArkTS & TS Files which should not be transformed in this compilation
72607ac75b1Sopenharmony_ci  shouldHaveEntry: string[] = []; // Which file should have @Entry decorator
72707ac75b1Sopenharmony_ci  resourceToFile: { [resource: string]: Set<string> } = {}; // Resource is used by which file
72807ac75b1Sopenharmony_ci  lastResourceList: Set<string> = new Set();
72907ac75b1Sopenharmony_ci  resourceList: Set<string> = new Set(); // Whole project resource
73007ac75b1Sopenharmony_ci  shouldInvalidFiles: Set<string> = new Set();
73107ac75b1Sopenharmony_ci  resourceTableChanged: boolean = false;
73207ac75b1Sopenharmony_ci  currentArkTsFile: SpecialArkTSFileInfo;
73307ac75b1Sopenharmony_ci  reUseProgram: boolean = false;
73407ac75b1Sopenharmony_ci  resourcesArr: Set<string> = new Set();
73507ac75b1Sopenharmony_ci  lastResourcesSet: Set<string> = new Set();
73607ac75b1Sopenharmony_ci  transformCacheFiles: { [fileName: string]: CacheFile } = {};
73707ac75b1Sopenharmony_ci  processBuilder: boolean = false;
73807ac75b1Sopenharmony_ci  processGlobalBuilder: boolean = false;
73907ac75b1Sopenharmony_ci  processLocalBuilder: boolean = false;
74007ac75b1Sopenharmony_ci  builderLikeCollection: Set<string> = new Set();
74107ac75b1Sopenharmony_ci  newTsProgram: ts.Program;
74207ac75b1Sopenharmony_ci  changeFiles: string[] = [];
74307ac75b1Sopenharmony_ci  isFirstBuild: boolean = true;
74407ac75b1Sopenharmony_ci  processForEach: number = 0;
74507ac75b1Sopenharmony_ci  processLazyForEach: number = 0;
74607ac75b1Sopenharmony_ci  processRepeat: boolean = false;
74707ac75b1Sopenharmony_ci  isAsPageImport: boolean = false;
74807ac75b1Sopenharmony_ci  overallObjectLinkCollection: Map<string, Set<string>> = new Map();
74907ac75b1Sopenharmony_ci  overallLinkCollection: Map<string, Set<string>> = new Map();
75007ac75b1Sopenharmony_ci  overallBuilderParamCollection: Map<string, Set<string>> = new Map();
75107ac75b1Sopenharmony_ci  lazyForEachInfo: {
75207ac75b1Sopenharmony_ci    forEachParameters: ts.ParameterDeclaration,
75307ac75b1Sopenharmony_ci    isDependItem: boolean
75407ac75b1Sopenharmony_ci  } = {
75507ac75b1Sopenharmony_ci      forEachParameters: null,
75607ac75b1Sopenharmony_ci      isDependItem: false
75707ac75b1Sopenharmony_ci    };
75807ac75b1Sopenharmony_ci  routerInfo: Map<string, Array<RouterInfo>> = new Map();
75907ac75b1Sopenharmony_ci  hasLocalBuilderInFile: boolean = false;
76007ac75b1Sopenharmony_ci
76107ac75b1Sopenharmony_ci  addGlobalCacheInfo(resourceListCacheInfo: string[],
76207ac75b1Sopenharmony_ci    resourceToFileCacheInfo: { [resource: string]: Set<string> },
76307ac75b1Sopenharmony_ci    cacheFile: { [fileName: string]: CacheFile }): void {
76407ac75b1Sopenharmony_ci    if (this.buildStart) {
76507ac75b1Sopenharmony_ci      for (const element in resourceToFileCacheInfo) {
76607ac75b1Sopenharmony_ci        this.resourceToFile[element] = new Set(resourceToFileCacheInfo[element]);
76707ac75b1Sopenharmony_ci      }
76807ac75b1Sopenharmony_ci      this.lastResourceList = new Set(resourceListCacheInfo);
76907ac75b1Sopenharmony_ci    }
77007ac75b1Sopenharmony_ci    if (this.resourceTableChanged) {
77107ac75b1Sopenharmony_ci      this.compareResourceDiff();
77207ac75b1Sopenharmony_ci    }
77307ac75b1Sopenharmony_ci    if (cacheFile) {
77407ac75b1Sopenharmony_ci      this.transformCacheFiles = cacheFile;
77507ac75b1Sopenharmony_ci    }
77607ac75b1Sopenharmony_ci  }
77707ac75b1Sopenharmony_ci
77807ac75b1Sopenharmony_ci  addFileCacheInfo(id: string, fileCacheInfo: fileInfo): void {
77907ac75b1Sopenharmony_ci    if (fileCacheInfo && process.env.compileMode === 'moduleJson') {
78007ac75b1Sopenharmony_ci      if (Array.isArray(fileCacheInfo.fileToResourceList)) {
78107ac75b1Sopenharmony_ci        fileCacheInfo.fileToResourceList = new Set(fileCacheInfo.fileToResourceList);
78207ac75b1Sopenharmony_ci      } else {
78307ac75b1Sopenharmony_ci        fileCacheInfo.fileToResourceList = new Set();
78407ac75b1Sopenharmony_ci      }
78507ac75b1Sopenharmony_ci    }
78607ac75b1Sopenharmony_ci    if (id.match(/(?<!\.d)\.(ets)$/)) {
78707ac75b1Sopenharmony_ci      this.wholeFileInfo[id] = new SpecialArkTSFileInfo(fileCacheInfo);
78807ac75b1Sopenharmony_ci    } else if (id.match(/(?<!\.d)\.(ts)$/) && process.env.compileMode === 'moduleJson') {
78907ac75b1Sopenharmony_ci      this.wholeFileInfo[id] = new TSFileInfo(fileCacheInfo);
79007ac75b1Sopenharmony_ci    }
79107ac75b1Sopenharmony_ci  }
79207ac75b1Sopenharmony_ci
79307ac75b1Sopenharmony_ci  collectTransformedFiles(id: string): void {
79407ac75b1Sopenharmony_ci    if (id.match(process.env.compileMode === 'moduleJson' ? /(?<!\.d)\.(ets|ts)$/ : /(?<!\.d)\.(ets)$/)) {
79507ac75b1Sopenharmony_ci      this.transformedFiles.add(id);
79607ac75b1Sopenharmony_ci    }
79707ac75b1Sopenharmony_ci  }
79807ac75b1Sopenharmony_ci
79907ac75b1Sopenharmony_ci  collectCachedFiles(id: string): void {
80007ac75b1Sopenharmony_ci    if (id.match(process.env.compileMode === 'moduleJson' ? /(?<!\.d)\.(ets|ts)$/ : /(?<!\.d)\.(ets)$/)) {
80107ac75b1Sopenharmony_ci      this.cachedFiles.push(id);
80207ac75b1Sopenharmony_ci    }
80307ac75b1Sopenharmony_ci  }
80407ac75b1Sopenharmony_ci
80507ac75b1Sopenharmony_ci  judgeShouldHaveEntryFiles(entryFileWithoutEntryDecorator: Set<string>): void {
80607ac75b1Sopenharmony_ci    this.shouldHaveEntry = Object.values(projectConfig.entryObj as string[]).filter((item) => {
80707ac75b1Sopenharmony_ci      return !entryFileWithoutEntryDecorator.has(item.toLowerCase()) && item.match(/(?<!\.d)\.(ets)$/);
80807ac75b1Sopenharmony_ci    });
80907ac75b1Sopenharmony_ci  }
81007ac75b1Sopenharmony_ci
81107ac75b1Sopenharmony_ci  saveCacheFileInfo(cache): void {
81207ac75b1Sopenharmony_ci    if (process.env.compileMode === 'moduleJson') {
81307ac75b1Sopenharmony_ci      const fileCacheInfo: { [id: string]: fileInfo | tsFileInfo } = cache.get('fileCacheInfo') || {};
81407ac75b1Sopenharmony_ci      const resourceToFileCacheInfo = cache.get('resourceToFileCacheInfo') || {};
81507ac75b1Sopenharmony_ci      for (const i in resourceToFileCacheInfo) {
81607ac75b1Sopenharmony_ci        resourceToFileCacheInfo[i] = new Set(resourceToFileCacheInfo[i]);
81707ac75b1Sopenharmony_ci      }
81807ac75b1Sopenharmony_ci      const resourceToFile: { [resource: string]: Set<string> | string[] } = Object.assign(resourceToFileCacheInfo, this.resourceToFile);
81907ac75b1Sopenharmony_ci      for (const id of this.transformedFiles) {
82007ac75b1Sopenharmony_ci        fileCacheInfo[id] = this.wholeFileInfo[id].fileInfo;
82107ac75b1Sopenharmony_ci        for (const resource of this.wholeFileInfo[id].newFileToResourceList) {
82207ac75b1Sopenharmony_ci          if (!(fileCacheInfo[id].fileToResourceList as Set<string>).has(resource)) {
82307ac75b1Sopenharmony_ci            this.resourceToFileBecomeSet(resourceToFile, resource, id);
82407ac75b1Sopenharmony_ci          }
82507ac75b1Sopenharmony_ci        }
82607ac75b1Sopenharmony_ci        for (const resource of fileCacheInfo[id].fileToResourceList) {
82707ac75b1Sopenharmony_ci          if (!this.wholeFileInfo[id].newFileToResourceList.has(resource)) {
82807ac75b1Sopenharmony_ci            (resourceToFile[resource] as Set<string>).delete(id);
82907ac75b1Sopenharmony_ci          }
83007ac75b1Sopenharmony_ci        }
83107ac75b1Sopenharmony_ci        fileCacheInfo[id].fileToResourceList = [...this.wholeFileInfo[id].newFileToResourceList];
83207ac75b1Sopenharmony_ci      }
83307ac75b1Sopenharmony_ci      for (const id of this.cachedFiles) {
83407ac75b1Sopenharmony_ci        fileCacheInfo[id].fileToResourceList = [...fileCacheInfo[id].fileToResourceList];
83507ac75b1Sopenharmony_ci      }
83607ac75b1Sopenharmony_ci      this.resourceToFile = resourceToFile as { [resource: string]: Set<string> };
83707ac75b1Sopenharmony_ci      for (const resource in resourceToFile) {
83807ac75b1Sopenharmony_ci        resourceToFile[resource] = [...resourceToFile[resource]];
83907ac75b1Sopenharmony_ci      }
84007ac75b1Sopenharmony_ci      cache.set('fileCacheInfo', fileCacheInfo);
84107ac75b1Sopenharmony_ci      cache.set('resourceListCacheInfo', [...this.resourceList]);
84207ac75b1Sopenharmony_ci      cache.set('resourceToFileCacheInfo', resourceToFile);
84307ac75b1Sopenharmony_ci    } else {
84407ac75b1Sopenharmony_ci      const cacheInfo: { [id: string]: fileInfo } = cache.get('fileCacheInfo') || {};
84507ac75b1Sopenharmony_ci      for (const id of this.transformedFiles) {
84607ac75b1Sopenharmony_ci        cacheInfo[id] = this.wholeFileInfo[id].fileInfo;
84707ac75b1Sopenharmony_ci      }
84807ac75b1Sopenharmony_ci      cache.set('fileCacheInfo', cacheInfo);
84907ac75b1Sopenharmony_ci    }
85007ac75b1Sopenharmony_ci  }
85107ac75b1Sopenharmony_ci
85207ac75b1Sopenharmony_ci  resourceToFileBecomeSet(resourceToFile: { [resource: string]: Set<string> | string[] }, resource: string, id: string): void {
85307ac75b1Sopenharmony_ci    if (!resourceToFile[resource]) {
85407ac75b1Sopenharmony_ci      resourceToFile[resource] = new Set();
85507ac75b1Sopenharmony_ci    }
85607ac75b1Sopenharmony_ci    if (resourceToFile[resource] instanceof Set) {
85707ac75b1Sopenharmony_ci      resourceToFile[resource].add(id);
85807ac75b1Sopenharmony_ci    } else if (Array.isArray(resourceToFile[resource])) {
85907ac75b1Sopenharmony_ci      resourceToFile[resource] = new Set(resourceToFile[resource]);
86007ac75b1Sopenharmony_ci      resourceToFile[resource].add(id);
86107ac75b1Sopenharmony_ci    } else {
86207ac75b1Sopenharmony_ci      return;
86307ac75b1Sopenharmony_ci    }
86407ac75b1Sopenharmony_ci  }
86507ac75b1Sopenharmony_ci
86607ac75b1Sopenharmony_ci  updateResourceList(resource: string): void {
86707ac75b1Sopenharmony_ci    this.resourceList.add(resource);
86807ac75b1Sopenharmony_ci  }
86907ac75b1Sopenharmony_ci
87007ac75b1Sopenharmony_ci  compareResourceDiff(): void {
87107ac75b1Sopenharmony_ci    // delete resource
87207ac75b1Sopenharmony_ci    for (const resource of this.lastResourceList) {
87307ac75b1Sopenharmony_ci      if (!this.resourceList.has(resource) && this.resourceToFile[resource]) {
87407ac75b1Sopenharmony_ci        this.resourceToFile[resource].forEach(file => {
87507ac75b1Sopenharmony_ci          this.shouldInvalidFiles.add(file);
87607ac75b1Sopenharmony_ci        });
87707ac75b1Sopenharmony_ci      }
87807ac75b1Sopenharmony_ci    }
87907ac75b1Sopenharmony_ci    // create resource
88007ac75b1Sopenharmony_ci    for (const resource of this.resourceList) {
88107ac75b1Sopenharmony_ci      if (!this.resourceToFile[resource]) {
88207ac75b1Sopenharmony_ci        this.resourceToFile[resource] = new Set();
88307ac75b1Sopenharmony_ci      }
88407ac75b1Sopenharmony_ci      if (!this.lastResourceList.has(resource)) {
88507ac75b1Sopenharmony_ci        this.resourceToFile[resource].forEach(file => {
88607ac75b1Sopenharmony_ci          this.shouldInvalidFiles.add(file);
88707ac75b1Sopenharmony_ci        });
88807ac75b1Sopenharmony_ci      }
88907ac75b1Sopenharmony_ci    }
89007ac75b1Sopenharmony_ci  }
89107ac75b1Sopenharmony_ci
89207ac75b1Sopenharmony_ci  collectResourceInFile(resource: string, file: string): void {
89307ac75b1Sopenharmony_ci    if (this.wholeFileInfo[file]) {
89407ac75b1Sopenharmony_ci      this.wholeFileInfo[file].newFileToResourceList.add(resource);
89507ac75b1Sopenharmony_ci    }
89607ac75b1Sopenharmony_ci  }
89707ac75b1Sopenharmony_ci
89807ac75b1Sopenharmony_ci  clearCollectedInfo(cache): void {
89907ac75b1Sopenharmony_ci    this.buildStart = false;
90007ac75b1Sopenharmony_ci    this.resourceTableChanged = false;
90107ac75b1Sopenharmony_ci    this.isAsPageImport = false;
90207ac75b1Sopenharmony_ci    this.saveCacheFileInfo(cache);
90307ac75b1Sopenharmony_ci    this.transformedFiles = new Set();
90407ac75b1Sopenharmony_ci    this.cachedFiles = [];
90507ac75b1Sopenharmony_ci    this.lastResourceList = new Set([...this.resourceList]);
90607ac75b1Sopenharmony_ci    this.shouldInvalidFiles.clear();
90707ac75b1Sopenharmony_ci    this.resourcesArr.clear();
90807ac75b1Sopenharmony_ci  }
90907ac75b1Sopenharmony_ci  setCurrentArkTsFile(): void {
91007ac75b1Sopenharmony_ci    this.currentArkTsFile = new SpecialArkTSFileInfo();
91107ac75b1Sopenharmony_ci  }
91207ac75b1Sopenharmony_ci  getCurrentArkTsFile(): SpecialArkTSFileInfo {
91307ac75b1Sopenharmony_ci    return this.currentArkTsFile;
91407ac75b1Sopenharmony_ci  }
91507ac75b1Sopenharmony_ci}
91607ac75b1Sopenharmony_ci
91707ac75b1Sopenharmony_ciexport let storedFileInfo: ProcessFileInfo = new ProcessFileInfo();
91807ac75b1Sopenharmony_ci
91907ac75b1Sopenharmony_ciexport interface fileInfo extends tsFileInfo {
92007ac75b1Sopenharmony_ci  hasEntry: boolean; // Has @Entry decorator or not
92107ac75b1Sopenharmony_ci}
92207ac75b1Sopenharmony_ci
92307ac75b1Sopenharmony_ciexport interface tsFileInfo {
92407ac75b1Sopenharmony_ci  fileToResourceList: Set<string> | string[]; // How much Resource is used
92507ac75b1Sopenharmony_ci}
92607ac75b1Sopenharmony_ci
92707ac75b1Sopenharmony_ci// Save single TS file information
92807ac75b1Sopenharmony_ciclass TSFileInfo {
92907ac75b1Sopenharmony_ci  fileInfo: tsFileInfo = {
93007ac75b1Sopenharmony_ci    fileToResourceList: new Set()
93107ac75b1Sopenharmony_ci  };
93207ac75b1Sopenharmony_ci  newFileToResourceList: Set<string> = new Set();
93307ac75b1Sopenharmony_ci  constructor(cacheInfo: fileInfo, etsFile?: boolean) {
93407ac75b1Sopenharmony_ci    if (!etsFile) {
93507ac75b1Sopenharmony_ci      this.fileInfo = cacheInfo || this.fileInfo;
93607ac75b1Sopenharmony_ci    }
93707ac75b1Sopenharmony_ci  }
93807ac75b1Sopenharmony_ci}
93907ac75b1Sopenharmony_ci
94007ac75b1Sopenharmony_ci// Save single ArkTS file information
94107ac75b1Sopenharmony_ciclass SpecialArkTSFileInfo extends TSFileInfo {
94207ac75b1Sopenharmony_ci  fileInfo: fileInfo = {
94307ac75b1Sopenharmony_ci    hasEntry: false,
94407ac75b1Sopenharmony_ci    fileToResourceList: new Set()
94507ac75b1Sopenharmony_ci  };
94607ac75b1Sopenharmony_ci  recycleComponents: Set<string> = new Set([]);
94707ac75b1Sopenharmony_ci  compFromDETS: Set<string> = new Set();
94807ac75b1Sopenharmony_ci  animatableExtendAttribute: Map<string, Set<string>> = new Map();
94907ac75b1Sopenharmony_ci  pkgName: string;
95007ac75b1Sopenharmony_ci
95107ac75b1Sopenharmony_ci  constructor(cacheInfo?: fileInfo) {
95207ac75b1Sopenharmony_ci    super(cacheInfo, true);
95307ac75b1Sopenharmony_ci    this.fileInfo = cacheInfo || this.fileInfo;
95407ac75b1Sopenharmony_ci  }
95507ac75b1Sopenharmony_ci
95607ac75b1Sopenharmony_ci  get hasEntry(): boolean {
95707ac75b1Sopenharmony_ci    return this.fileInfo.hasEntry;
95807ac75b1Sopenharmony_ci  }
95907ac75b1Sopenharmony_ci  set hasEntry(value: boolean) {
96007ac75b1Sopenharmony_ci    this.fileInfo.hasEntry = value;
96107ac75b1Sopenharmony_ci  }
96207ac75b1Sopenharmony_ci}
96307ac75b1Sopenharmony_ci
96407ac75b1Sopenharmony_ciexport function setChecker(): void {
96507ac75b1Sopenharmony_ci  if (globalProgram.program) {
96607ac75b1Sopenharmony_ci    globalProgram.checker = globalProgram.program.getTypeChecker();
96707ac75b1Sopenharmony_ci    globalProgram.strictChecker = globalProgram.program.getLinterTypeChecker();
96807ac75b1Sopenharmony_ci  } else if (globalProgram.watchProgram) {
96907ac75b1Sopenharmony_ci    globalProgram.checker = globalProgram.watchProgram.getCurrentProgram().getProgram().getTypeChecker();
97007ac75b1Sopenharmony_ci  }
97107ac75b1Sopenharmony_ci}
97207ac75b1Sopenharmony_ciexport interface ExtendResult {
97307ac75b1Sopenharmony_ci  decoratorName: string;
97407ac75b1Sopenharmony_ci  componentName: string;
97507ac75b1Sopenharmony_ci}
97607ac75b1Sopenharmony_ci
97707ac75b1Sopenharmony_ciexport function resourcesRawfile(rawfilePath: string, resourcesArr: Set<string>, resourceName: string = ''): void {
97807ac75b1Sopenharmony_ci  if (fs.existsSync(process.env.rawFileResource) && fs.statSync(rawfilePath).isDirectory()) {
97907ac75b1Sopenharmony_ci    const files: string[] = fs.readdirSync(rawfilePath);
98007ac75b1Sopenharmony_ci    files.forEach((file: string) => {
98107ac75b1Sopenharmony_ci      if (fs.statSync(path.join(rawfilePath, file)).isDirectory()) {
98207ac75b1Sopenharmony_ci        resourcesRawfile(path.join(rawfilePath, file), resourcesArr, resourceName ? resourceName + '/' + file : file);
98307ac75b1Sopenharmony_ci      } else {
98407ac75b1Sopenharmony_ci        if (resourceName) {
98507ac75b1Sopenharmony_ci          resourcesArr.add(resourceName + '/' + file);
98607ac75b1Sopenharmony_ci        } else {
98707ac75b1Sopenharmony_ci          resourcesArr.add(file);
98807ac75b1Sopenharmony_ci        }
98907ac75b1Sopenharmony_ci      }
99007ac75b1Sopenharmony_ci    });
99107ac75b1Sopenharmony_ci  }
99207ac75b1Sopenharmony_ci}
99307ac75b1Sopenharmony_ci
99407ac75b1Sopenharmony_ciexport function differenceResourcesRawfile(oldRawfile: Set<string>, newRawfile: Set<string>): boolean {
99507ac75b1Sopenharmony_ci  if (oldRawfile.size !== 0 && oldRawfile.size === newRawfile.size) {
99607ac75b1Sopenharmony_ci    for (const singleRawfiles of oldRawfile.values()) {
99707ac75b1Sopenharmony_ci      if (!newRawfile.has(singleRawfiles)) {
99807ac75b1Sopenharmony_ci        return true;
99907ac75b1Sopenharmony_ci      }
100007ac75b1Sopenharmony_ci    }
100107ac75b1Sopenharmony_ci    return false;
100207ac75b1Sopenharmony_ci  } else if (oldRawfile.size === 0 && oldRawfile.size === newRawfile.size) {
100307ac75b1Sopenharmony_ci    return false;
100407ac75b1Sopenharmony_ci  } else {
100507ac75b1Sopenharmony_ci    return true;
100607ac75b1Sopenharmony_ci  }
100707ac75b1Sopenharmony_ci}
100807ac75b1Sopenharmony_ci
100907ac75b1Sopenharmony_ciexport function isString(text: unknown): text is string {
101007ac75b1Sopenharmony_ci  return typeof text === 'string';
101107ac75b1Sopenharmony_ci}
101207ac75b1Sopenharmony_ci
101307ac75b1Sopenharmony_cifunction getRollupCacheStoreKey(projectConfig: object): string {
101407ac75b1Sopenharmony_ci  let keyInfo: string[] = [projectConfig.compileSdkVersion, projectConfig.compatibleSdkVersion, projectConfig.runtimeOS,
101507ac75b1Sopenharmony_ci    projectConfig.etsLoaderPath];
101607ac75b1Sopenharmony_ci  return keyInfo.join('#');
101707ac75b1Sopenharmony_ci}
101807ac75b1Sopenharmony_ci
101907ac75b1Sopenharmony_cifunction getRollupCacheKey(projectConfig: object): string {
102007ac75b1Sopenharmony_ci  let isWidget: string = projectConfig.widgetCompile ? 'widget' : 'non-widget';
102107ac75b1Sopenharmony_ci  let ohosTestInfo: string = 'non-ohosTest';
102207ac75b1Sopenharmony_ci  if (projectConfig.testFrameworkPar) {
102307ac75b1Sopenharmony_ci    ohosTestInfo = JSON.stringify(projectConfig.testFrameworkPar);
102407ac75b1Sopenharmony_ci  }
102507ac75b1Sopenharmony_ci
102607ac75b1Sopenharmony_ci  let keyInfo: string[] = [projectConfig.entryModuleName, projectConfig.targetName, isWidget, ohosTestInfo,
102707ac75b1Sopenharmony_ci    projectConfig.needCoverageInsert, projectConfig.isOhosTest];
102807ac75b1Sopenharmony_ci  return keyInfo.join('#');
102907ac75b1Sopenharmony_ci}
103007ac75b1Sopenharmony_ci
103107ac75b1Sopenharmony_cifunction clearRollupCacheStore(cacheStoreManager: object, currentKey: string): void {
103207ac75b1Sopenharmony_ci  if (!cacheStoreManager) {
103307ac75b1Sopenharmony_ci    return;
103407ac75b1Sopenharmony_ci  }
103507ac75b1Sopenharmony_ci
103607ac75b1Sopenharmony_ci  for (let key of cacheStoreManager.keys()) {
103707ac75b1Sopenharmony_ci    if (key !== currentKey) {
103807ac75b1Sopenharmony_ci      cacheStoreManager.unmount(key);
103907ac75b1Sopenharmony_ci    }
104007ac75b1Sopenharmony_ci  }
104107ac75b1Sopenharmony_ci}
104207ac75b1Sopenharmony_ci
104307ac75b1Sopenharmony_ciexport function startTimeStatisticsLocation(startTimeEvent: CompileEvent): void {
104407ac75b1Sopenharmony_ci  if (startTimeEvent) {
104507ac75b1Sopenharmony_ci    startTimeEvent.start();
104607ac75b1Sopenharmony_ci  }
104707ac75b1Sopenharmony_ci}
104807ac75b1Sopenharmony_ci
104907ac75b1Sopenharmony_ciexport function stopTimeStatisticsLocation(stopTimeEvent: CompileEvent): void {
105007ac75b1Sopenharmony_ci  if (stopTimeEvent) {
105107ac75b1Sopenharmony_ci    stopTimeEvent.stop();
105207ac75b1Sopenharmony_ci  }
105307ac75b1Sopenharmony_ci}
105407ac75b1Sopenharmony_ciexport let resolveModuleNamesTime: CompileEvent;
105507ac75b1Sopenharmony_ciexport class CompilationTimeStatistics {
105607ac75b1Sopenharmony_ci  hookEventFactory: HookEventFactoryType;
105707ac75b1Sopenharmony_ci  createProgramTime: CompileEvent;
105807ac75b1Sopenharmony_ci  runArkTSLinterTime: CompileEvent;
105907ac75b1Sopenharmony_ci  diagnosticTime: CompileEvent;
106007ac75b1Sopenharmony_ci  scriptSnapshotTime: CompileEvent;
106107ac75b1Sopenharmony_ci  processImportTime: CompileEvent;
106207ac75b1Sopenharmony_ci  processComponentClassTime: CompileEvent;
106307ac75b1Sopenharmony_ci  validateEtsTime: CompileEvent;
106407ac75b1Sopenharmony_ci  tsProgramEmitTime: CompileEvent;
106507ac75b1Sopenharmony_ci  shouldEmitJsTime: CompileEvent;
106607ac75b1Sopenharmony_ci  transformNodesTime: CompileEvent;
106707ac75b1Sopenharmony_ci  emitTime: CompileEvent;
106807ac75b1Sopenharmony_ci  printNodeTime: CompileEvent;
106907ac75b1Sopenharmony_ci  noSourceFileRebuildProgramTime: CompileEvent;
107007ac75b1Sopenharmony_ci  etsTransformBuildStartTime: CompileEvent;
107107ac75b1Sopenharmony_ci  etsTransformLoadTime: CompileEvent;
107207ac75b1Sopenharmony_ci  processKitImportTime: CompileEvent;
107307ac75b1Sopenharmony_ci  processUISyntaxTime: CompileEvent;
107407ac75b1Sopenharmony_ci  constructor(share, pluginName: string, hookName: string) {
107507ac75b1Sopenharmony_ci    if (share && share.getHookEventFactory) {
107607ac75b1Sopenharmony_ci      if (pluginName === 'etsChecker' && hookName === 'buildStart' && share.getHookEventFactory(pluginName, hookName)) {
107707ac75b1Sopenharmony_ci        this.hookEventFactory = share.getHookEventFactory(pluginName, hookName);
107807ac75b1Sopenharmony_ci        this.createProgramTime = this.hookEventFactory.createEvent('createProgram');
107907ac75b1Sopenharmony_ci        this.runArkTSLinterTime = this.hookEventFactory.createEvent('arkTSLinter');
108007ac75b1Sopenharmony_ci        this.diagnosticTime = this.hookEventFactory.createEvent('diagnostic');
108107ac75b1Sopenharmony_ci        this.scriptSnapshotTime = this.createProgramTime.createSubEvent('scriptSnapshot');
108207ac75b1Sopenharmony_ci        resolveModuleNamesTime = this.hookEventFactory.createEvent('resolveModuleNames');
108307ac75b1Sopenharmony_ci      } else if (pluginName === 'etsTransform' && hookName === 'transform' && share.getHookEventFactory(pluginName, hookName)) {
108407ac75b1Sopenharmony_ci        this.hookEventFactory = share.getHookEventFactory(pluginName, hookName);
108507ac75b1Sopenharmony_ci        this.validateEtsTime = this.hookEventFactory.createEvent('validateEts');
108607ac75b1Sopenharmony_ci        this.tsProgramEmitTime = this.hookEventFactory.createEvent('tsProgramEmit');
108707ac75b1Sopenharmony_ci        this.shouldEmitJsTime = this.hookEventFactory.createEvent('shouldEmitJs');
108807ac75b1Sopenharmony_ci        this.transformNodesTime = this.tsProgramEmitTime.createSubEvent('transformNodes');
108907ac75b1Sopenharmony_ci        this.emitTime = this.tsProgramEmitTime.createSubEvent('emit');
109007ac75b1Sopenharmony_ci        this.printNodeTime = this.hookEventFactory.createEvent('printNode');
109107ac75b1Sopenharmony_ci        this.noSourceFileRebuildProgramTime = this.hookEventFactory.createEvent('noSourceFileRebuildProgram');
109207ac75b1Sopenharmony_ci        this.processKitImportTime = this.tsProgramEmitTime.createSubEvent('processKitImport');
109307ac75b1Sopenharmony_ci        this.processUISyntaxTime = this.tsProgramEmitTime.createSubEvent('processUISyntax');
109407ac75b1Sopenharmony_ci        this.processImportTime = this.processUISyntaxTime.createSubEvent('processImport');
109507ac75b1Sopenharmony_ci        this.processComponentClassTime = this.processUISyntaxTime.createSubEvent('processComponentClass');
109607ac75b1Sopenharmony_ci      } else if (pluginName === 'etsTransform' && hookName === 'buildStart' && share.getHookEventFactory(pluginName, hookName)) {
109707ac75b1Sopenharmony_ci        this.hookEventFactory = share.getHookEventFactory(pluginName, hookName);
109807ac75b1Sopenharmony_ci        this.etsTransformBuildStartTime = this.hookEventFactory.createEvent('etsTransformBuildStart');
109907ac75b1Sopenharmony_ci      } else if (pluginName === 'etsTransform' && hookName === 'load' && share.getHookEventFactory(pluginName, hookName)) {
110007ac75b1Sopenharmony_ci        this.hookEventFactory = share.getHookEventFactory(pluginName, hookName);
110107ac75b1Sopenharmony_ci        this.etsTransformLoadTime = this.hookEventFactory.createEvent('etsTransformLoad');
110207ac75b1Sopenharmony_ci      }
110307ac75b1Sopenharmony_ci    }
110407ac75b1Sopenharmony_ci  }
110507ac75b1Sopenharmony_ci}
110607ac75b1Sopenharmony_ci
110707ac75b1Sopenharmony_ciinterface HookEventFactoryType {
110807ac75b1Sopenharmony_ci  createEvent(name: string): CompileEvent | undefined;
110907ac75b1Sopenharmony_ci}
111007ac75b1Sopenharmony_ci
111107ac75b1Sopenharmony_citype CompileEventState = 'created' | 'beginning' | 'running' | 'failed' | 'success' | 'warn';
111207ac75b1Sopenharmony_ciinterface CompileEvent {
111307ac75b1Sopenharmony_ci  start(time?: number): CompileEvent;
111407ac75b1Sopenharmony_ci  stop(state?: CompileEventState, time?: number): void;
111507ac75b1Sopenharmony_ci  startAsyncEvent(time: number): CompileEvent;
111607ac75b1Sopenharmony_ci  stopAsyncEvent(state?: CompileEventState, TIME?: number): void;
111707ac75b1Sopenharmony_ci  createSubEvent(name: string): CompileEvent;
111807ac75b1Sopenharmony_ci}
111907ac75b1Sopenharmony_ci
112007ac75b1Sopenharmony_ciexport function resetUtils(): void {
112107ac75b1Sopenharmony_ci  componentInfo = new ComponentInfo();
112207ac75b1Sopenharmony_ci  harFilesRecord.clear();
112307ac75b1Sopenharmony_ci  storedFileInfo = new ProcessFileInfo();
112407ac75b1Sopenharmony_ci}
112507ac75b1Sopenharmony_ci
112607ac75b1Sopenharmony_ciexport function getStoredFileInfo(): ProcessFileInfo {
112707ac75b1Sopenharmony_ci  return storedFileInfo;
112807ac75b1Sopenharmony_ci}
112907ac75b1Sopenharmony_ci
113007ac75b1Sopenharmony_ciexport class EntryOptionValue {
113107ac75b1Sopenharmony_ci  routeName: ts.Expression;
113207ac75b1Sopenharmony_ci  storage: ts.Expression;
113307ac75b1Sopenharmony_ci  useSharedStorage: ts.Expression;
113407ac75b1Sopenharmony_ci}
113507ac75b1Sopenharmony_ci
113607ac75b1Sopenharmony_cifunction sharedNode(): ts.CallExpression {
113707ac75b1Sopenharmony_ci  return ts.factory.createCallExpression(
113807ac75b1Sopenharmony_ci    ts.factory.createPropertyAccessExpression(
113907ac75b1Sopenharmony_ci      ts.factory.createIdentifier(COMPONENT_CONSTRUCTOR_LOCALSTORAGE_TYPE_PU),
114007ac75b1Sopenharmony_ci      ts.factory.createIdentifier(GET_SHARED)
114107ac75b1Sopenharmony_ci    ),
114207ac75b1Sopenharmony_ci    undefined,
114307ac75b1Sopenharmony_ci    []
114407ac75b1Sopenharmony_ci  );
114507ac75b1Sopenharmony_ci}
114607ac75b1Sopenharmony_ci
114707ac75b1Sopenharmony_ciexport function createGetShared(entryOptionValue: EntryOptionValue): ts.ConditionalExpression {
114807ac75b1Sopenharmony_ci  return ts.factory.createConditionalExpression(
114907ac75b1Sopenharmony_ci    entryOptionValue.useSharedStorage,
115007ac75b1Sopenharmony_ci    ts.factory.createToken(ts.SyntaxKind.QuestionToken),
115107ac75b1Sopenharmony_ci    sharedNode(),
115207ac75b1Sopenharmony_ci    ts.factory.createToken(ts.SyntaxKind.ColonToken),
115307ac75b1Sopenharmony_ci    entryOptionValue.storage || ts.factory.createIdentifier(COMPONENT_CONSTRUCTOR_UNDEFINED)
115407ac75b1Sopenharmony_ci  );
115507ac75b1Sopenharmony_ci}
115607ac75b1Sopenharmony_ci
115707ac75b1Sopenharmony_ciexport function createGetSharedForVariable(entryOptionNode: ts.Expression, isShare: boolean = true): ts.ConditionalExpression {
115807ac75b1Sopenharmony_ci  return ts.factory.createConditionalExpression(
115907ac75b1Sopenharmony_ci    ts.factory.createPropertyAccessExpression(
116007ac75b1Sopenharmony_ci      entryOptionNode,
116107ac75b1Sopenharmony_ci      ts.factory.createIdentifier(USE_SHARED_STORAGE)
116207ac75b1Sopenharmony_ci    ),
116307ac75b1Sopenharmony_ci    ts.factory.createToken(ts.SyntaxKind.QuestionToken),
116407ac75b1Sopenharmony_ci    sharedNode(),
116507ac75b1Sopenharmony_ci    ts.factory.createToken(ts.SyntaxKind.ColonToken),
116607ac75b1Sopenharmony_ci    isShare ? ts.factory.createPropertyAccessExpression(
116707ac75b1Sopenharmony_ci      entryOptionNode, ts.factory.createIdentifier(STORAGE)) :
116807ac75b1Sopenharmony_ci      ts.factory.createIdentifier(COMPONENT_CONSTRUCTOR_UNDEFINED)
116907ac75b1Sopenharmony_ci  );
117007ac75b1Sopenharmony_ci}
117107ac75b1Sopenharmony_ci
117207ac75b1Sopenharmony_ciexport function judgeUseSharedStorageForExpresion(entryOptionNode: ts.Expression): ts.BinaryExpression {
117307ac75b1Sopenharmony_ci  return ts.factory.createBinaryExpression(
117407ac75b1Sopenharmony_ci    entryOptionNode,
117507ac75b1Sopenharmony_ci    ts.factory.createToken(ts.SyntaxKind.AmpersandAmpersandToken),
117607ac75b1Sopenharmony_ci    ts.factory.createBinaryExpression(
117707ac75b1Sopenharmony_ci      ts.factory.createPropertyAccessExpression(
117807ac75b1Sopenharmony_ci        entryOptionNode,
117907ac75b1Sopenharmony_ci        ts.factory.createIdentifier(USE_SHARED_STORAGE)
118007ac75b1Sopenharmony_ci      ),
118107ac75b1Sopenharmony_ci      ts.factory.createToken(ts.SyntaxKind.ExclamationEqualsToken),
118207ac75b1Sopenharmony_ci      ts.factory.createIdentifier(COMPONENT_CONSTRUCTOR_UNDEFINED)
118307ac75b1Sopenharmony_ci    )
118407ac75b1Sopenharmony_ci  );
118507ac75b1Sopenharmony_ci}
118607ac75b1Sopenharmony_ci
118707ac75b1Sopenharmony_ciexport function getRollupCache(rollupShareObject: object, projectConfig: object, key: string): object | undefined {
118807ac75b1Sopenharmony_ci  if (!rollupShareObject) {
118907ac75b1Sopenharmony_ci    return undefined;
119007ac75b1Sopenharmony_ci  }
119107ac75b1Sopenharmony_ci
119207ac75b1Sopenharmony_ci  // Preferentially get cache object from the rollup’s cache interface.
119307ac75b1Sopenharmony_ci  if (rollupShareObject.cache) {
119407ac75b1Sopenharmony_ci    // Only the cache object’s name as the cache key is required.
119507ac75b1Sopenharmony_ci    return rollupShareObject.cache.get(key);
119607ac75b1Sopenharmony_ci  }
119707ac75b1Sopenharmony_ci
119807ac75b1Sopenharmony_ci  // Try to get cache object from the rollup's cacheStoreManager interface.
119907ac75b1Sopenharmony_ci  if (rollupShareObject.cacheStoreManager) {
120007ac75b1Sopenharmony_ci    // The cache under cacheStoreManager is divided into two layers. The key for the first layer of cache is determined
120107ac75b1Sopenharmony_ci    // by the SDK and runtimeOS, accessed through the `mount` interface. The key for the second layer of cache is
120207ac75b1Sopenharmony_ci    // determined by the compilation task and the name of the cache object,
120307ac75b1Sopenharmony_ci    // accessed through `getCache` or `setCache` interface.
120407ac75b1Sopenharmony_ci    const cacheStoreKey: string = getRollupCacheStoreKey(projectConfig);
120507ac75b1Sopenharmony_ci    const cacheServiceKey: string = getRollupCacheKey(projectConfig) + '#' + key;
120607ac75b1Sopenharmony_ci
120707ac75b1Sopenharmony_ci    // Clear the cache if the SDK path or runtimeOS changed
120807ac75b1Sopenharmony_ci    clearRollupCacheStore(rollupShareObject.cacheStoreManager, cacheStoreKey);
120907ac75b1Sopenharmony_ci    return rollupShareObject.cacheStoreManager.mount(cacheStoreKey).getCache(cacheServiceKey);
121007ac75b1Sopenharmony_ci  }
121107ac75b1Sopenharmony_ci
121207ac75b1Sopenharmony_ci  return undefined;
121307ac75b1Sopenharmony_ci}
121407ac75b1Sopenharmony_ci
121507ac75b1Sopenharmony_ciexport function setRollupCache(rollupShareObject: object, projectConfig: object, key: string, value: object): void {
121607ac75b1Sopenharmony_ci  if (!rollupShareObject) {
121707ac75b1Sopenharmony_ci    return;
121807ac75b1Sopenharmony_ci  }
121907ac75b1Sopenharmony_ci
122007ac75b1Sopenharmony_ci  // Preferentially set cache object to the rollup’s cache interface.
122107ac75b1Sopenharmony_ci  if (rollupShareObject.cache) {
122207ac75b1Sopenharmony_ci    // Only the cache object’s name as the cache key is required.
122307ac75b1Sopenharmony_ci    rollupShareObject.cache.set(key, value);
122407ac75b1Sopenharmony_ci    return;
122507ac75b1Sopenharmony_ci  }
122607ac75b1Sopenharmony_ci
122707ac75b1Sopenharmony_ci  // Try to set cache object to the rollup's cacheStoreManager interface.
122807ac75b1Sopenharmony_ci  if (rollupShareObject.cacheStoreManager) {
122907ac75b1Sopenharmony_ci    const cacheStoreKey: string = getRollupCacheStoreKey(projectConfig);
123007ac75b1Sopenharmony_ci    const cacheServiceKey: string = getRollupCacheKey(projectConfig) + '#' + key;
123107ac75b1Sopenharmony_ci
123207ac75b1Sopenharmony_ci    rollupShareObject.cacheStoreManager.mount(cacheStoreKey).setCache(cacheServiceKey, value);
123307ac75b1Sopenharmony_ci  }
123407ac75b1Sopenharmony_ci}
123507ac75b1Sopenharmony_ci
123607ac75b1Sopenharmony_ciexport function removeDecorator(decorators: readonly ts.Decorator[], decoratorName: string): readonly ts.Decorator[] {
123707ac75b1Sopenharmony_ci  return decorators.filter((item: ts.Node) => {
123807ac75b1Sopenharmony_ci    if (ts.isDecorator(item) && ts.isIdentifier(item.expression) &&
123907ac75b1Sopenharmony_ci      item.expression.escapedText.toString() === decoratorName) {
124007ac75b1Sopenharmony_ci      return false;
124107ac75b1Sopenharmony_ci    }
124207ac75b1Sopenharmony_ci    return true;
124307ac75b1Sopenharmony_ci  });
124407ac75b1Sopenharmony_ci}
124507ac75b1Sopenharmony_ci
124607ac75b1Sopenharmony_ciexport function isFileInProject(filePath: string, projectRootPath: string): boolean {
124707ac75b1Sopenharmony_ci  const relativeFilePath: string = toUnixPath(path.relative(toUnixPath(projectRootPath), toUnixPath(filePath)));
124807ac75b1Sopenharmony_ci  // When processing ohmurl, hsp's filePath is consistent with moduleRequest
124907ac75b1Sopenharmony_ci  return fs.existsSync(filePath) && fs.statSync(filePath).isFile() && !relativeFilePath.startsWith('../');
125007ac75b1Sopenharmony_ci}
125107ac75b1Sopenharmony_ci
125207ac75b1Sopenharmony_ciexport function getProjectRootPath(filePath: string, projectConfig: Object, rootPathSet: Object): string {
125307ac75b1Sopenharmony_ci  if (rootPathSet) {
125407ac75b1Sopenharmony_ci    for (const rootPath of rootPathSet) {
125507ac75b1Sopenharmony_ci      if (isFileInProject(filePath, rootPath)) {
125607ac75b1Sopenharmony_ci        return rootPath;
125707ac75b1Sopenharmony_ci      }
125807ac75b1Sopenharmony_ci    }
125907ac75b1Sopenharmony_ci  }
126007ac75b1Sopenharmony_ci  return projectConfig.projectRootPath;
126107ac75b1Sopenharmony_ci}
126207ac75b1Sopenharmony_ci
126307ac75b1Sopenharmony_ciexport function getBelongModuleInfo(filePath: string, modulePathMap: Object, projectRootPath: string): Object {
126407ac75b1Sopenharmony_ci  for (const moduleName of Object.keys(modulePathMap)) {
126507ac75b1Sopenharmony_ci    if (toUnixPath(filePath).startsWith(toUnixPath(modulePathMap[moduleName]) + '/')) {
126607ac75b1Sopenharmony_ci      return {
126707ac75b1Sopenharmony_ci        isLocalDependency: true,
126807ac75b1Sopenharmony_ci        moduleName: moduleName,
126907ac75b1Sopenharmony_ci        belongModulePath: modulePathMap[moduleName]
127007ac75b1Sopenharmony_ci      };
127107ac75b1Sopenharmony_ci    }
127207ac75b1Sopenharmony_ci  }
127307ac75b1Sopenharmony_ci  return {
127407ac75b1Sopenharmony_ci    isLocalDependency: false,
127507ac75b1Sopenharmony_ci    moduleName: '',
127607ac75b1Sopenharmony_ci    belongModulePath: projectRootPath
127707ac75b1Sopenharmony_ci  };
127807ac75b1Sopenharmony_ci}