1/* 2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { ESMODULE } from './common/ark_define'; 17import { ModuleBuildMode } from './module/module_build_mode'; 18import { ModuleColdreloadMode } from './module/module_coldreload_mode'; 19import { ModuleHotfixMode } from './module/module_hotfix_mode'; 20import { ModuleHotreloadMode } from './module/module_hotreload_mode'; 21import { ModulePreviewMode } from './module/module_preview_mode'; 22import { ModuleSourceFile } from './module/module_source_file'; 23import type { ModuleMode } from './module/module_mode'; 24import { SourceMapGenerator } from './generate_sourcemap'; 25import { 26 CompileEvent, 27 getHookEventFactory, 28 createAndStartEvent, 29 stopEvent 30} from '../../performance'; 31import { PreloadFileModules } from './module/module_preload_file_utils'; 32 33let moduleMode: ModuleMode = null; 34 35export async function generateModuleAbc(error) { 36 const hookEventFactory: CompileEvent | undefined = getHookEventFactory(this.share, 'genAbc', 'buildEnd'); 37 if (error) { 38 // When error thrown in previous plugins, rollup will catch and call buildEnd plugin. 39 // Stop generate abc if error exists 40 return; 41 } 42 if (this.share.projectConfig.compileMode === ESMODULE) { 43 if (this.share.projectConfig.singleFileEmit) { 44 if (ModuleSourceFile.needProcessMock) { 45 ModuleSourceFile.generateMockConfigFile(this); 46 } 47 } else { 48 await ModuleSourceFile.processModuleSourceFiles(this, hookEventFactory); 49 } 50 if (this.share.projectConfig.compileHar) { 51 if (!this.share.projectConfig.byteCodeHar) { 52 // compileHar: compile har of project, which convert .ets to .d.ts and js 53 SourceMapGenerator.getInstance().buildModuleSourceMapInfo(hookEventFactory); 54 return; 55 } 56 } 57 PreloadFileModules.finalizeWritePreloadSoList(); 58 generateAbc(this, hookEventFactory); 59 } 60} 61 62function generateAbc(rollupObject: Object, parentEvent: CompileEvent | undefined): void { 63 const eventGenerateAbc = createAndStartEvent(parentEvent, 'generate abc'); 64 if (rollupObject.share.projectConfig.watchMode !== 'true') { 65 if (rollupObject.share.arkProjectConfig.coldReload) { 66 const moduleColdreloadMode: ModuleColdreloadMode = new ModuleColdreloadMode(rollupObject); 67 moduleColdreloadMode.generateAbc(rollupObject, eventGenerateAbc); 68 moduleMode = moduleColdreloadMode; 69 } else if (rollupObject.share.arkProjectConfig.hotReload) { 70 // If file changes are monitored by the IDE, rollup is not started in watch mode, 71 // so rollupObject.share.projectConfig.watchMode is not true. Hotreload in this mode 72 // supports scenarios where entry depends on HAR and HSP. 73 const moduleHotreloadMode: ModuleHotreloadMode = new ModuleHotreloadMode(rollupObject); 74 moduleHotreloadMode.generateAbc(rollupObject, eventGenerateAbc); 75 moduleMode = moduleHotreloadMode; 76 } else { 77 const moduleBuildMode: ModuleBuildMode = new ModuleBuildMode(rollupObject); 78 moduleBuildMode.generateAbc(rollupObject, eventGenerateAbc); 79 moduleMode = moduleBuildMode; 80 } 81 } else if (rollupObject.share.arkProjectConfig.hotReload) { 82 // If file changes are monitored by rollup, rollup must be started in watch mode, 83 // so rollupObject.share.projectConfig.watchMode needs to be true. Hotreload in this mode 84 // does not support scenarios where entry depends on HSP. 85 const moduleHotreloadMode: ModuleHotreloadMode = new ModuleHotreloadMode(rollupObject); 86 moduleHotreloadMode.generateAbc(rollupObject, eventGenerateAbc); 87 moduleMode = moduleHotreloadMode; 88 } else if (rollupObject.share.arkProjectConfig.hotFix) { 89 const moduleHotfixMode: ModuleHotfixMode = new ModuleHotfixMode(rollupObject); 90 moduleHotfixMode.generateAbc(rollupObject, eventGenerateAbc); 91 moduleMode = moduleHotfixMode; 92 } else { 93 const modulePreviewMode: ModulePreviewMode = new ModulePreviewMode(rollupObject); 94 modulePreviewMode.generateAbc(rollupObject, eventGenerateAbc); 95 moduleMode = modulePreviewMode; 96 } 97 stopEvent(eventGenerateAbc); 98} 99 100export function cleanModuleMode(): void { 101 if (moduleMode) { 102 moduleMode.triggerAsync = null; 103 moduleMode.triggerEndSignal = null; 104 moduleMode = null; 105 } 106} 107