1/* 2 * Copyright (c) 2023 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 fs from 'fs'; 17import path from 'path'; 18import { 19 ARK_COMPILER_META_INFO, 20 ESMODULE, 21 IS_CACHE_INVALID 22} from './common/ark_define'; 23import { 24 TRANSFORMED_MOCK_CONFIG, 25 USER_DEFINE_MOCK_CONFIG 26} from '../../pre_define'; 27 28let disableCache: boolean = false; 29export function checkArkCompilerCacheInfo(rollupObject: Object): void { 30 disableCache = false; 31 const metaInfo: string = getMetaInfo(rollupObject.share.projectConfig, rollupObject.share.arkProjectConfig); 32 const lastMetaInfo: string = rollupObject.cache.get(ARK_COMPILER_META_INFO); 33 if (!lastMetaInfo || metaInfo !== lastMetaInfo || isMockConfigModified(rollupObject)) { 34 rollupObject.cache.set(IS_CACHE_INVALID, true); 35 disableCache = true; 36 } 37 rollupObject.cache.set(ARK_COMPILER_META_INFO, metaInfo); 38} 39 40function getMetaInfo(projectConfig: Object, arkProjectConfig: Object): string { 41 let metaInfoArr: string[] = []; 42 // user selects the compiled API version information 43 const compileSdkVersion: string = projectConfig.compileSdkVersion ? 44 projectConfig.compileSdkVersion : 'null_compileSdkVersion'; 45 // user selects the compatible API version information 46 const compatibleSdkVersion: string = projectConfig.compatibleSdkVersion ? 47 projectConfig.compatibleSdkVersion : 'null_compatibleSdkVersion'; 48 const compatibleSdkVersionStage: string = projectConfig.compatibleSdkVersionStage ? 49 projectConfig.compatibleSdkVersionStage : 'null_compatibleSdkVersionStage'; 50 const runtimeOS: string = projectConfig.runtimeOS ? projectConfig.runtimeOS : 'null_runtimeOS'; 51 const sdkPath: string = projectConfig.etsLoaderPath ? 52 projectConfig.etsLoaderPath : 'null_sdkPath'; 53 // version information for loading SDKs in the IDE 54 const sdkVersion: string = projectConfig.etsLoaderVersion ? 55 projectConfig.etsLoaderVersion : 'null_sdkVersion'; 56 const sdkReleaseType: string = projectConfig.etsLoaderReleaseType ? 57 projectConfig.etsLoaderReleaseType : 'null_sdkReleaseType'; 58 metaInfoArr.push( 59 compileSdkVersion, compatibleSdkVersion, compatibleSdkVersionStage, runtimeOS, sdkPath, sdkVersion, sdkReleaseType); 60 61 if (projectConfig.compileHar) { 62 const useTsHar: string = arkProjectConfig.useTsHar; 63 metaInfoArr.push(useTsHar); 64 } 65 66 if (projectConfig.compileMode === ESMODULE) { 67 const bundleName: string = projectConfig.bundleName ? projectConfig.bundleName : 'null_bundleName'; 68 const allModuleNameHash: string = projectConfig.allModuleNameHash ? projectConfig.allModuleNameHash : 69 'null_allModuleNameHash'; 70 const aotCompileMode: string = projectConfig.aotCompileMode ? projectConfig.aotCompileMode : 'null_aotCompileMode'; 71 const apPath: string = projectConfig.apPath ? projectConfig.apPath : 'null_apPath'; 72 metaInfoArr.push(bundleName, allModuleNameHash, aotCompileMode, apPath); 73 } 74 75 return metaInfoArr.join(':'); 76} 77 78function isMockConfigModified(rollupObject): boolean { 79 // mock is only enabled in the following two modes 80 if (!rollupObject.share.projectConfig.isPreview && !rollupObject.share.projectConfig.isOhosTest) { 81 return false; 82 } 83 84 if (!rollupObject.share.projectConfig.mockParams || !rollupObject.share.projectConfig.mockParams.mockConfigPath) { 85 return false; 86 } 87 88 const userDefinedMockConfigCache: string = 89 path.resolve(rollupObject.share.projectConfig.cachePath, `./${USER_DEFINE_MOCK_CONFIG}`); 90 const transformedMockConfigCache: string = 91 path.resolve(rollupObject.share.projectConfig.cachePath, `./${TRANSFORMED_MOCK_CONFIG}`); 92 if (!fs.existsSync(userDefinedMockConfigCache) || !fs.existsSync(transformedMockConfigCache)) { 93 return true; 94 } 95 96 const mockConfigInfo: Object = 97 require('json5').parse(fs.readFileSync(rollupObject.share.projectConfig.mockParams.mockConfigPath, 'utf-8')); 98 const cachedMockConfigInfo: Object = 99 require('json5').parse(fs.readFileSync(userDefinedMockConfigCache, 'utf-8')); 100 return JSON.stringify(mockConfigInfo) !== JSON.stringify(cachedMockConfigInfo); 101} 102 103/** 104 * rollup shouldInvalidCache hook 105 * @param {rollup OutputOptions} options 106 */ 107export function shouldInvalidCache(): boolean { 108 return disableCache; 109} 110export const utCache = { 111 getMetaInfo 112}; 113