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}