107ac75b1Sopenharmony_ci/* 207ac75b1Sopenharmony_ci * Copyright (c) 2023 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 { EventEmitter } from 'events'; 1807ac75b1Sopenharmony_ciimport * as ts from 'typescript'; 1907ac75b1Sopenharmony_ci 2007ac75b1Sopenharmony_ciimport { 2107ac75b1Sopenharmony_ci projectConfig, 2207ac75b1Sopenharmony_ci globalProgram 2307ac75b1Sopenharmony_ci} from '../../../main'; 2407ac75b1Sopenharmony_ciimport { 2507ac75b1Sopenharmony_ci serviceChecker, 2607ac75b1Sopenharmony_ci languageService, 2707ac75b1Sopenharmony_ci printDiagnostic, 2807ac75b1Sopenharmony_ci fastBuildLogger, 2907ac75b1Sopenharmony_ci emitBuildInfo, 3007ac75b1Sopenharmony_ci runArkTSLinter, 3107ac75b1Sopenharmony_ci targetESVersionChanged, 3207ac75b1Sopenharmony_ci collectFileToIgnoreDiagnostics 3307ac75b1Sopenharmony_ci} from '../../ets_checker'; 3407ac75b1Sopenharmony_ciimport { TS_WATCH_END_MSG } from '../../pre_define'; 3507ac75b1Sopenharmony_ciimport { 3607ac75b1Sopenharmony_ci setChecker, 3707ac75b1Sopenharmony_ci startTimeStatisticsLocation, 3807ac75b1Sopenharmony_ci stopTimeStatisticsLocation, 3907ac75b1Sopenharmony_ci CompilationTimeStatistics 4007ac75b1Sopenharmony_ci} from '../../utils'; 4107ac75b1Sopenharmony_ciimport { 4207ac75b1Sopenharmony_ci configureSyscapInfo, 4307ac75b1Sopenharmony_ci configurePermission 4407ac75b1Sopenharmony_ci} from '../system_api/api_check_utils'; 4507ac75b1Sopenharmony_ci 4607ac75b1Sopenharmony_ciexport let tsWatchEmitter: EventEmitter | undefined = undefined; 4707ac75b1Sopenharmony_ciexport let tsWatchEndPromise: Promise<void>; 4807ac75b1Sopenharmony_ci 4907ac75b1Sopenharmony_ciexport function etsChecker() { 5007ac75b1Sopenharmony_ci let executedOnce: boolean = false; 5107ac75b1Sopenharmony_ci return { 5207ac75b1Sopenharmony_ci name: 'etsChecker', 5307ac75b1Sopenharmony_ci buildStart() { 5407ac75b1Sopenharmony_ci const compilationTime: CompilationTimeStatistics = new CompilationTimeStatistics(this.share, 'etsChecker', 'buildStart'); 5507ac75b1Sopenharmony_ci if (process.env.watchMode === 'true' && process.env.triggerTsWatch === 'true') { 5607ac75b1Sopenharmony_ci tsWatchEmitter = new EventEmitter(); 5707ac75b1Sopenharmony_ci tsWatchEndPromise = new Promise<void>(resolve => { 5807ac75b1Sopenharmony_ci tsWatchEmitter.on(TS_WATCH_END_MSG, () => { 5907ac75b1Sopenharmony_ci resolve(); 6007ac75b1Sopenharmony_ci }); 6107ac75b1Sopenharmony_ci }); 6207ac75b1Sopenharmony_ci } 6307ac75b1Sopenharmony_ci if (this.share.projectConfig.deviceTypes) { 6407ac75b1Sopenharmony_ci configureSyscapInfo(this.share.projectConfig); 6507ac75b1Sopenharmony_ci } 6607ac75b1Sopenharmony_ci if (this.share.projectConfig.permission) { 6707ac75b1Sopenharmony_ci configurePermission(this.share.projectConfig); 6807ac75b1Sopenharmony_ci } 6907ac75b1Sopenharmony_ci if (this.share.projectConfig.integratedHsp) { 7007ac75b1Sopenharmony_ci projectConfig.integratedHsp = this.share.projectConfig.integratedHsp; 7107ac75b1Sopenharmony_ci projectConfig.resetBundleName = this.share.projectConfig.integratedHsp; 7207ac75b1Sopenharmony_ci } 7307ac75b1Sopenharmony_ci Object.assign(projectConfig, this.share.projectConfig); 7407ac75b1Sopenharmony_ci Object.assign(this.share.projectConfig, { 7507ac75b1Sopenharmony_ci compileHar: projectConfig.compileHar, 7607ac75b1Sopenharmony_ci compileShared: projectConfig.compileShared, 7707ac75b1Sopenharmony_ci moduleRootPath: projectConfig.moduleRootPath, 7807ac75b1Sopenharmony_ci buildPath: projectConfig.buildPath, 7907ac75b1Sopenharmony_ci isCrossplatform: projectConfig.isCrossplatform, 8007ac75b1Sopenharmony_ci requestPermissions: projectConfig.requestPermissions, 8107ac75b1Sopenharmony_ci definePermissions: projectConfig.definePermissions, 8207ac75b1Sopenharmony_ci syscapIntersectionSet: projectConfig.syscapIntersectionSet, 8307ac75b1Sopenharmony_ci syscapUnionSet: projectConfig.syscapUnionSet, 8407ac75b1Sopenharmony_ci deviceTypesMessage: projectConfig.deviceTypesMessage, 8507ac75b1Sopenharmony_ci compileSdkVersion: projectConfig.compileSdkVersion, 8607ac75b1Sopenharmony_ci compatibleSdkVersion: projectConfig.compatibleSdkVersion, 8707ac75b1Sopenharmony_ci runtimeOS: projectConfig.runtimeOS 8807ac75b1Sopenharmony_ci }); 8907ac75b1Sopenharmony_ci const logger = this.share.getLogger('etsChecker'); 9007ac75b1Sopenharmony_ci const rootFileNames: string[] = []; 9107ac75b1Sopenharmony_ci const resolveModulePaths: string[] = []; 9207ac75b1Sopenharmony_ci rootFileNamesCollect(rootFileNames); 9307ac75b1Sopenharmony_ci if (this.share && this.share.projectConfig && this.share.projectConfig.resolveModulePaths && 9407ac75b1Sopenharmony_ci Array.isArray(this.share.projectConfig.resolveModulePaths)) { 9507ac75b1Sopenharmony_ci resolveModulePaths.push(...this.share.projectConfig.resolveModulePaths); 9607ac75b1Sopenharmony_ci } 9707ac75b1Sopenharmony_ci if (process.env.watchMode === 'true') { 9807ac75b1Sopenharmony_ci !executedOnce && serviceChecker(rootFileNames, logger, resolveModulePaths, compilationTime, this.share); 9907ac75b1Sopenharmony_ci startTimeStatisticsLocation(compilationTime ? compilationTime.diagnosticTime : undefined); 10007ac75b1Sopenharmony_ci if (executedOnce) { 10107ac75b1Sopenharmony_ci const timePrinterInstance = ts.ArkTSLinterTimePrinter.getInstance(); 10207ac75b1Sopenharmony_ci timePrinterInstance.setArkTSTimePrintSwitch(false); 10307ac75b1Sopenharmony_ci timePrinterInstance.appendTime(ts.TimePhase.START); 10407ac75b1Sopenharmony_ci globalProgram.builderProgram = languageService.getBuilderProgram(/*withLinterProgram*/ true); 10507ac75b1Sopenharmony_ci globalProgram.program = globalProgram.builderProgram.getProgram(); 10607ac75b1Sopenharmony_ci timePrinterInstance.appendTime(ts.TimePhase.GET_PROGRAM); 10707ac75b1Sopenharmony_ci collectFileToIgnoreDiagnostics(rootFileNames); 10807ac75b1Sopenharmony_ci runArkTSLinter(); 10907ac75b1Sopenharmony_ci } 11007ac75b1Sopenharmony_ci executedOnce = true; 11107ac75b1Sopenharmony_ci const allDiagnostics: ts.Diagnostic[] = globalProgram.builderProgram 11207ac75b1Sopenharmony_ci .getSyntacticDiagnostics() 11307ac75b1Sopenharmony_ci .concat(globalProgram.builderProgram.getSemanticDiagnostics()); 11407ac75b1Sopenharmony_ci stopTimeStatisticsLocation(compilationTime ? compilationTime.diagnosticTime : undefined); 11507ac75b1Sopenharmony_ci emitBuildInfo(); 11607ac75b1Sopenharmony_ci allDiagnostics.forEach((diagnostic: ts.Diagnostic) => { 11707ac75b1Sopenharmony_ci printDiagnostic(diagnostic); 11807ac75b1Sopenharmony_ci }); 11907ac75b1Sopenharmony_ci fastBuildLogger.debug(TS_WATCH_END_MSG); 12007ac75b1Sopenharmony_ci tsWatchEmitter.emit(TS_WATCH_END_MSG); 12107ac75b1Sopenharmony_ci } else { 12207ac75b1Sopenharmony_ci serviceChecker(rootFileNames, logger, resolveModulePaths, compilationTime, this.share); 12307ac75b1Sopenharmony_ci } 12407ac75b1Sopenharmony_ci setChecker(); 12507ac75b1Sopenharmony_ci }, 12607ac75b1Sopenharmony_ci shouldInvalidCache(): boolean { 12707ac75b1Sopenharmony_ci // The generated js file might be different in some cases when we change the targetESVersion, 12807ac75b1Sopenharmony_ci // so we need to regenerate them all when targetESVersion is changed. 12907ac75b1Sopenharmony_ci return targetESVersionChanged; 13007ac75b1Sopenharmony_ci } 13107ac75b1Sopenharmony_ci }; 13207ac75b1Sopenharmony_ci} 13307ac75b1Sopenharmony_ci 13407ac75b1Sopenharmony_cifunction rootFileNamesCollect(rootFileNames: string[]): void { 13507ac75b1Sopenharmony_ci const entryFiles: string[] = projectConfig.widgetCompile ? Object.values(projectConfig.cardEntryObj) : Object.values(projectConfig.entryObj); 13607ac75b1Sopenharmony_ci entryFiles.forEach((fileName: string) => { 13707ac75b1Sopenharmony_ci rootFileNames.push(path.resolve(fileName)); 13807ac75b1Sopenharmony_ci }); 13907ac75b1Sopenharmony_ci} 140