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