17c804472Sopenharmony_ci/* 27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 47c804472Sopenharmony_ci * you may not use this file except in compliance with the License. 57c804472Sopenharmony_ci * You may obtain a copy of the License at 67c804472Sopenharmony_ci * 77c804472Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 87c804472Sopenharmony_ci * 97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127c804472Sopenharmony_ci * See the License for the specific language governing permissions and 137c804472Sopenharmony_ci * limitations under the License. 147c804472Sopenharmony_ci */ 157c804472Sopenharmony_ci 167c804472Sopenharmony_ciimport fs from 'fs'; 177c804472Sopenharmony_ciimport path from 'path'; 187c804472Sopenharmony_ciimport { ScriptTarget, SyntaxKind, createSourceFile } from 'typescript'; 197c804472Sopenharmony_ciimport type { SourceFile } from 'typescript'; 207c804472Sopenharmony_ciimport { 217c804472Sopenharmony_ci collectAllLegalImports, 227c804472Sopenharmony_ci dtsFileList, 237c804472Sopenharmony_ci firstCharacterToUppercase, 247c804472Sopenharmony_ci getAllFileNameList, 257c804472Sopenharmony_ci getApiInputPath 267c804472Sopenharmony_ci} from '../common/commonUtils'; 277c804472Sopenharmony_ciimport type { ImportElementEntity } from '../declaration-node/importAndExportDeclaration'; 287c804472Sopenharmony_ciimport { getDefaultExportClassDeclaration } from '../declaration-node/sourceFileElementsAssemply'; 297c804472Sopenharmony_ciimport type { SourceFileEntity } from '../declaration-node/sourceFileElementsAssemply'; 307c804472Sopenharmony_ciimport { generateClassDeclaration } from './generateClassDeclaration'; 317c804472Sopenharmony_ciimport { generateEnumDeclaration } from './generateEnumDeclaration'; 327c804472Sopenharmony_ciimport { addToIndexArray } from './generateIndex'; 337c804472Sopenharmony_ci 347c804472Sopenharmony_ciimport { generateInterfaceDeclaration } from './generateInterfaceDeclaration'; 357c804472Sopenharmony_ciimport { generateModuleDeclaration } from './generateModuleDeclaration'; 367c804472Sopenharmony_ciimport { generateStaticFunction } from './generateStaticFunction'; 377c804472Sopenharmony_ciimport { addToSystemIndexArray } from './generateSystemIndex'; 387c804472Sopenharmony_ciimport { generateTypeAliasDeclaration } from './generateTypeAlias'; 397c804472Sopenharmony_ciimport { generateCommonFunction } from './generateCommonFunction'; 407c804472Sopenharmony_ciimport { 417c804472Sopenharmony_ci needToAddBrace, 427c804472Sopenharmony_ci hasExportDefaultKeyword, 437c804472Sopenharmony_ci MockFunctionElementEntity, 447c804472Sopenharmony_ci ReturnDataParams 457c804472Sopenharmony_ci} from './generateCommonUtil'; 467c804472Sopenharmony_ciimport { handleImportKit } from '../common/kitUtils'; 477c804472Sopenharmony_ci 487c804472Sopenharmony_ci/** 497c804472Sopenharmony_ci * generate mock file string 507c804472Sopenharmony_ci * @param rootName absolute path to the mock file to be generated 517c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 527c804472Sopenharmony_ci * @param sourceFile file Text Information 537c804472Sopenharmony_ci * @param fileName file name 547c804472Sopenharmony_ci * @returns file mock text 557c804472Sopenharmony_ci */ 567c804472Sopenharmony_ciexport function generateSourceFileElements( 577c804472Sopenharmony_ci rootName: string, 587c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 597c804472Sopenharmony_ci sourceFile: SourceFile, 607c804472Sopenharmony_ci fileName: string 617c804472Sopenharmony_ci): string { 627c804472Sopenharmony_ci let mockApi = ''; 637c804472Sopenharmony_ci let mockFunctionElements: Array<MockFunctionElementEntity> = []; 647c804472Sopenharmony_ci const dependsSourceFileList = collectReferenceFiles(sourceFile); 657c804472Sopenharmony_ci const heritageClausesArray = getCurrentApiHeritageArray(sourceFileEntity, sourceFile); 667c804472Sopenharmony_ci const extraImport = []; 677c804472Sopenharmony_ci 687c804472Sopenharmony_ci mockApi += importDeclarationsGenerate(sourceFileEntity, sourceFile, fileName, heritageClausesArray, dependsSourceFileList); 697c804472Sopenharmony_ci const enumDeclarationsData = enumDeclarationsGenerate(sourceFileEntity, mockFunctionElements); 707c804472Sopenharmony_ci mockApi += enumDeclarationsData.mockData; 717c804472Sopenharmony_ci mockFunctionElements = enumDeclarationsData.mockFunctionElements; 727c804472Sopenharmony_ci 737c804472Sopenharmony_ci const typeAliasDeclarationsData = typeAliasDeclarationsGenerate(sourceFileEntity, mockFunctionElements, sourceFile, extraImport, mockApi); 747c804472Sopenharmony_ci mockApi += typeAliasDeclarationsData.mockData; 757c804472Sopenharmony_ci mockFunctionElements = typeAliasDeclarationsData.mockFunctionElements; 767c804472Sopenharmony_ci 777c804472Sopenharmony_ci const interfaceDeclarationsData = interfaceDeclarationsGenerate(sourceFileEntity, mockFunctionElements, sourceFile, extraImport, mockApi); 787c804472Sopenharmony_ci mockApi += interfaceDeclarationsData.mockData; 797c804472Sopenharmony_ci mockFunctionElements = interfaceDeclarationsData.mockFunctionElements; 807c804472Sopenharmony_ci 817c804472Sopenharmony_ci const classDeclarationsData = classDeclarationsGenerate(sourceFileEntity, mockFunctionElements, sourceFile, mockApi, fileName); 827c804472Sopenharmony_ci mockApi += classDeclarationsData.mockData; 837c804472Sopenharmony_ci mockFunctionElements = classDeclarationsData.mockFunctionElements; 847c804472Sopenharmony_ci 857c804472Sopenharmony_ci mockApi += moduleDeclarationsGenerate(sourceFileEntity, sourceFile, mockApi, fileName, extraImport); 867c804472Sopenharmony_ci 877c804472Sopenharmony_ci mockApi += functionDeclarationsGenerate(sourceFileEntity, sourceFile, mockApi); 887c804472Sopenharmony_ci 897c804472Sopenharmony_ci mockApi += otherDeclarationsGenerate(rootName, sourceFileEntity, mockFunctionElements, sourceFile, mockApi, fileName, extraImport).mockData; 907c804472Sopenharmony_ci 917c804472Sopenharmony_ci mockApi += handleExportDeclarations(sourceFileEntity); 927c804472Sopenharmony_ci 937c804472Sopenharmony_ci mockApi = extraImport.join('') + mockApi; 947c804472Sopenharmony_ci 957c804472Sopenharmony_ci mockApi = addExportDefaultExpression(mockApi); 967c804472Sopenharmony_ci 977c804472Sopenharmony_ci return mockApi; 987c804472Sopenharmony_ci} 997c804472Sopenharmony_ci 1007c804472Sopenharmony_ci/** 1017c804472Sopenharmony_ci * get import declarations generate 1027c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 1037c804472Sopenharmony_ci * @param sourceFile file Text Information 1047c804472Sopenharmony_ci * @param fileName file name 1057c804472Sopenharmony_ci * @param heritageClausesArray heritage elements array data 1067c804472Sopenharmony_ci * @param dependsSourceFileList reference Files data 1077c804472Sopenharmony_ci * @returns string 1087c804472Sopenharmony_ci */ 1097c804472Sopenharmony_cifunction importDeclarationsGenerate( 1107c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 1117c804472Sopenharmony_ci sourceFile: SourceFile, 1127c804472Sopenharmony_ci fileName: string, 1137c804472Sopenharmony_ci heritageClausesArray: string[], 1147c804472Sopenharmony_ci dependsSourceFileList: SourceFile[] 1157c804472Sopenharmony_ci): string { 1167c804472Sopenharmony_ci let mockData = ''; 1177c804472Sopenharmony_ci if (sourceFileEntity.importDeclarations.length > 0) { 1187c804472Sopenharmony_ci sourceFileEntity.importDeclarations.forEach(value => { 1197c804472Sopenharmony_ci if ( 1207c804472Sopenharmony_ci sourceFile.fileName.endsWith('@ohos.arkui.UIContext.d.ts') && 1217c804472Sopenharmony_ci ['\'DatePickerDialogParam\'', '\'TimePickerDialogParam\'', 1227c804472Sopenharmony_ci '\'textPickerDialogParam\'', '\'./@ohos.app.ability.common\''].includes(value.importPath) 1237c804472Sopenharmony_ci ) { 1247c804472Sopenharmony_ci mockData += ''; 1257c804472Sopenharmony_ci } else { 1267c804472Sopenharmony_ci mockData += generateImportDeclaration(value, fileName, heritageClausesArray, sourceFile.fileName, dependsSourceFileList); 1277c804472Sopenharmony_ci } 1287c804472Sopenharmony_ci }); 1297c804472Sopenharmony_ci } 1307c804472Sopenharmony_ci if (fileName === 'ohos_arkui_observer') { 1317c804472Sopenharmony_ci mockData += 'const NavigationOperation = { PUSH: 1, POP: 2, REPLACE: 3 }\n'; 1327c804472Sopenharmony_ci } 1337c804472Sopenharmony_ci if (fileName === 'navigation') { 1347c804472Sopenharmony_ci mockData += 'const TextModifier = {}\n'; 1357c804472Sopenharmony_ci } 1367c804472Sopenharmony_ci return mockData; 1377c804472Sopenharmony_ci} 1387c804472Sopenharmony_ci 1397c804472Sopenharmony_ci/** 1407c804472Sopenharmony_ci * get enum declarations generate 1417c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 1427c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 1437c804472Sopenharmony_ci * @returns ReturnDataParams 1447c804472Sopenharmony_ci */ 1457c804472Sopenharmony_cifunction enumDeclarationsGenerate( 1467c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 1477c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity> 1487c804472Sopenharmony_ci): ReturnDataParams { 1497c804472Sopenharmony_ci const data: ReturnDataParams = { 1507c804472Sopenharmony_ci mockData: '', 1517c804472Sopenharmony_ci mockFunctionElements: mockFunctionElements 1527c804472Sopenharmony_ci }; 1537c804472Sopenharmony_ci if (sourceFileEntity.enumDeclarations.length > 0) { 1547c804472Sopenharmony_ci sourceFileEntity.enumDeclarations.forEach(value => { 1557c804472Sopenharmony_ci data.mockData += generateEnumDeclaration('', value) + '\n'; 1567c804472Sopenharmony_ci data.mockFunctionElements.push({ elementName: value.enumName, type: 'enum' }); 1577c804472Sopenharmony_ci }); 1587c804472Sopenharmony_ci } 1597c804472Sopenharmony_ci return data; 1607c804472Sopenharmony_ci} 1617c804472Sopenharmony_ci 1627c804472Sopenharmony_ci/** 1637c804472Sopenharmony_ci * get typeAlias declarations generate 1647c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 1657c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 1667c804472Sopenharmony_ci * @param sourceFile file Text Information 1677c804472Sopenharmony_ci * @param extraImport extra import data 1687c804472Sopenharmony_ci * @param mockApi file mock text 1697c804472Sopenharmony_ci * @returns ReturnDataParams 1707c804472Sopenharmony_ci */ 1717c804472Sopenharmony_cifunction typeAliasDeclarationsGenerate( 1727c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 1737c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity>, 1747c804472Sopenharmony_ci sourceFile: SourceFile, 1757c804472Sopenharmony_ci extraImport: string[], 1767c804472Sopenharmony_ci mockApi: string 1777c804472Sopenharmony_ci): ReturnDataParams { 1787c804472Sopenharmony_ci const data: ReturnDataParams = { 1797c804472Sopenharmony_ci mockData: '', 1807c804472Sopenharmony_ci mockFunctionElements: mockFunctionElements 1817c804472Sopenharmony_ci }; 1827c804472Sopenharmony_ci if (sourceFileEntity.typeAliasDeclarations.length > 0) { 1837c804472Sopenharmony_ci sourceFileEntity.typeAliasDeclarations.forEach(value => { 1847c804472Sopenharmony_ci data.mockData += generateTypeAliasDeclaration(value, false, sourceFile, extraImport, mockApi) + '\n'; 1857c804472Sopenharmony_ci data.mockFunctionElements.push({ elementName: value.typeAliasName, type: 'typeAlias' }); 1867c804472Sopenharmony_ci }); 1877c804472Sopenharmony_ci } 1887c804472Sopenharmony_ci return data; 1897c804472Sopenharmony_ci} 1907c804472Sopenharmony_ci 1917c804472Sopenharmony_ci/** 1927c804472Sopenharmony_ci * get interface declarations generate 1937c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 1947c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 1957c804472Sopenharmony_ci * @param sourceFile file Text Information 1967c804472Sopenharmony_ci * @param extraImport Additional exported data 1977c804472Sopenharmony_ci * @param mockApi file mock into text 1987c804472Sopenharmony_ci * @returns ReturnDataParams 1997c804472Sopenharmony_ci */ 2007c804472Sopenharmony_cifunction interfaceDeclarationsGenerate( 2017c804472Sopenharmony_ci entity: SourceFileEntity, 2027c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity>, 2037c804472Sopenharmony_ci sourceFile: SourceFile, 2047c804472Sopenharmony_ci extraImport: string[], 2057c804472Sopenharmony_ci mockApi: string 2067c804472Sopenharmony_ci): ReturnDataParams { 2077c804472Sopenharmony_ci const data: ReturnDataParams = { 2087c804472Sopenharmony_ci mockData: '', 2097c804472Sopenharmony_ci mockFunctionElements: mockFunctionElements 2107c804472Sopenharmony_ci }; 2117c804472Sopenharmony_ci if (entity.interfaceDeclarations.length > 0) { 2127c804472Sopenharmony_ci entity.interfaceDeclarations.forEach(value => { 2137c804472Sopenharmony_ci data.mockData += generateInterfaceDeclaration( 2147c804472Sopenharmony_ci value, sourceFile, true, mockApi, entity.interfaceDeclarations, 2157c804472Sopenharmony_ci entity.importDeclarations, extraImport 2167c804472Sopenharmony_ci ) + '\n'; 2177c804472Sopenharmony_ci data.mockFunctionElements.push({ elementName: value.interfaceName, type: 'interface' }); 2187c804472Sopenharmony_ci }); 2197c804472Sopenharmony_ci } 2207c804472Sopenharmony_ci return data; 2217c804472Sopenharmony_ci} 2227c804472Sopenharmony_ci 2237c804472Sopenharmony_ci/** 2247c804472Sopenharmony_ci * get class declarations generate 2257c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 2267c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 2277c804472Sopenharmony_ci * @param sourceFile file Text Information 2287c804472Sopenharmony_ci * @param mockApi file mock text 2297c804472Sopenharmony_ci * @param fileName file name 2307c804472Sopenharmony_ci * @returns ReturnDataParams 2317c804472Sopenharmony_ci */ 2327c804472Sopenharmony_cifunction classDeclarationsGenerate( 2337c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 2347c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity>, 2357c804472Sopenharmony_ci sourceFile: SourceFile, 2367c804472Sopenharmony_ci mockApi: string, 2377c804472Sopenharmony_ci fileName: string 2387c804472Sopenharmony_ci): ReturnDataParams { 2397c804472Sopenharmony_ci const data: ReturnDataParams = { 2407c804472Sopenharmony_ci mockData: '', 2417c804472Sopenharmony_ci mockFunctionElements: mockFunctionElements 2427c804472Sopenharmony_ci }; 2437c804472Sopenharmony_ci if (sourceFileEntity.classDeclarations.length > 0) { 2447c804472Sopenharmony_ci sourceFileEntity.classDeclarations.forEach(value => { 2457c804472Sopenharmony_ci if (!fileName.startsWith('system_') && !value.exportModifiers.includes(SyntaxKind.DefaultKeyword)) { 2467c804472Sopenharmony_ci data.mockData += generateClassDeclaration('', value, false, '', fileName, sourceFile, false, mockApi) + '\n'; 2477c804472Sopenharmony_ci data.mockFunctionElements.push({ elementName: value.className, type: 'class' }); 2487c804472Sopenharmony_ci } 2497c804472Sopenharmony_ci }); 2507c804472Sopenharmony_ci } 2517c804472Sopenharmony_ci return data; 2527c804472Sopenharmony_ci} 2537c804472Sopenharmony_ci 2547c804472Sopenharmony_ci/** 2557c804472Sopenharmony_ci * get module declarations generate 2567c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 2577c804472Sopenharmony_ci * @param sourceFile file Text Information 2587c804472Sopenharmony_ci * @param mockApi file mock text 2597c804472Sopenharmony_ci * @param fileName file name 2607c804472Sopenharmony_ci * @param extraImport extra import data 2617c804472Sopenharmony_ci * @returns string 2627c804472Sopenharmony_ci */ 2637c804472Sopenharmony_cifunction moduleDeclarationsGenerate( 2647c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 2657c804472Sopenharmony_ci sourceFile: SourceFile, 2667c804472Sopenharmony_ci mockApi: string, 2677c804472Sopenharmony_ci fileName: string, 2687c804472Sopenharmony_ci extraImport: string[] 2697c804472Sopenharmony_ci): string { 2707c804472Sopenharmony_ci let mockData = ''; 2717c804472Sopenharmony_ci if (sourceFileEntity.moduleDeclarations.length > 0) { 2727c804472Sopenharmony_ci sourceFileEntity.moduleDeclarations.forEach(value => { 2737c804472Sopenharmony_ci mockData += 2747c804472Sopenharmony_ci generateModuleDeclaration( 2757c804472Sopenharmony_ci value, 2767c804472Sopenharmony_ci sourceFile, 2777c804472Sopenharmony_ci fileName, 2787c804472Sopenharmony_ci mockApi, 2797c804472Sopenharmony_ci extraImport, 2807c804472Sopenharmony_ci sourceFileEntity.importDeclarations 2817c804472Sopenharmony_ci ) + '\n'; 2827c804472Sopenharmony_ci }); 2837c804472Sopenharmony_ci } 2847c804472Sopenharmony_ci return mockData; 2857c804472Sopenharmony_ci} 2867c804472Sopenharmony_ci 2877c804472Sopenharmony_ci/** 2887c804472Sopenharmony_ci * get function declarations generate 2897c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 2907c804472Sopenharmony_ci * @param sourceFile file Text Information 2917c804472Sopenharmony_ci * @param mockApi file mock text 2927c804472Sopenharmony_ci * @returns string 2937c804472Sopenharmony_ci */ 2947c804472Sopenharmony_cifunction functionDeclarationsGenerate( 2957c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 2967c804472Sopenharmony_ci sourceFile: SourceFile, 2977c804472Sopenharmony_ci mockApi: string 2987c804472Sopenharmony_ci): string { 2997c804472Sopenharmony_ci let mockData = ''; 3007c804472Sopenharmony_ci if (sourceFileEntity.functionDeclarations.size > 0) { 3017c804472Sopenharmony_ci Array.from(sourceFileEntity.functionDeclarations.keys()).forEach(key => { 3027c804472Sopenharmony_ci mockData += generateCommonFunction(key, sourceFileEntity.functionDeclarations.get(key), sourceFile, mockApi, true) + '\n'; 3037c804472Sopenharmony_ci }); 3047c804472Sopenharmony_ci } 3057c804472Sopenharmony_ci return mockData; 3067c804472Sopenharmony_ci} 3077c804472Sopenharmony_ci 3087c804472Sopenharmony_ci/** 3097c804472Sopenharmony_ci * get other declarations generate 3107c804472Sopenharmony_ci * @param rootName absolute path to the mock file to be generated 3117c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 3127c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 3137c804472Sopenharmony_ci * @param sourceFile file Text Information 3147c804472Sopenharmony_ci * @param mockApi file mock text 3157c804472Sopenharmony_ci * @param fileName file name 3167c804472Sopenharmony_ci * @returns ReturnDataParams 3177c804472Sopenharmony_ci */ 3187c804472Sopenharmony_cifunction otherDeclarationsGenerate( 3197c804472Sopenharmony_ci rootName: string, 3207c804472Sopenharmony_ci sourceFileEntity: SourceFileEntity, 3217c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity>, 3227c804472Sopenharmony_ci sourceFile: SourceFile, 3237c804472Sopenharmony_ci mockApi: string, 3247c804472Sopenharmony_ci fileName: string, 3257c804472Sopenharmony_ci extraImport: string[] 3267c804472Sopenharmony_ci): ReturnDataParams { 3277c804472Sopenharmony_ci const data: ReturnDataParams = { 3287c804472Sopenharmony_ci mockData: '', 3297c804472Sopenharmony_ci mockFunctionElements: [] 3307c804472Sopenharmony_ci }; 3317c804472Sopenharmony_ci if ( 3327c804472Sopenharmony_ci sourceFileEntity.moduleDeclarations.length === 0 && 3337c804472Sopenharmony_ci (fileName.startsWith('ohos_') || fileName.startsWith('system_') || fileName.startsWith('webgl')) 3347c804472Sopenharmony_ci ) { 3357c804472Sopenharmony_ci const moduleDeclarationsData = handleModuleDeclarationsNotExist( 3367c804472Sopenharmony_ci rootName, 3377c804472Sopenharmony_ci fileName, 3387c804472Sopenharmony_ci sourceFile, 3397c804472Sopenharmony_ci mockApi, 3407c804472Sopenharmony_ci mockFunctionElements 3417c804472Sopenharmony_ci ); 3427c804472Sopenharmony_ci data.mockData = moduleDeclarationsData.mockData; 3437c804472Sopenharmony_ci data.mockFunctionElements = moduleDeclarationsData.mockFunctionElements; 3447c804472Sopenharmony_ci } else { 3457c804472Sopenharmony_ci const defaultExportClass = getDefaultExportClassDeclaration(sourceFile); 3467c804472Sopenharmony_ci if (defaultExportClass.length > 0) { 3477c804472Sopenharmony_ci const mockNameArr = fileName.split('_'); 3487c804472Sopenharmony_ci const mockName = mockNameArr[mockNameArr.length - 1]; 3497c804472Sopenharmony_ci defaultExportClass.forEach(value => { 3507c804472Sopenharmony_ci data.mockData += 3517c804472Sopenharmony_ci generateClassDeclaration( 3527c804472Sopenharmony_ci rootName, 3537c804472Sopenharmony_ci value, 3547c804472Sopenharmony_ci false, 3557c804472Sopenharmony_ci mockName, 3567c804472Sopenharmony_ci '', 3577c804472Sopenharmony_ci sourceFile, 3587c804472Sopenharmony_ci false, 3597c804472Sopenharmony_ci mockApi, 3607c804472Sopenharmony_ci extraImport, 3617c804472Sopenharmony_ci sourceFileEntity.importDeclarations 3627c804472Sopenharmony_ci ) + '\n'; 3637c804472Sopenharmony_ci }); 3647c804472Sopenharmony_ci } 3657c804472Sopenharmony_ci } 3667c804472Sopenharmony_ci return data; 3677c804472Sopenharmony_ci} 3687c804472Sopenharmony_ci 3697c804472Sopenharmony_ci/** 3707c804472Sopenharmony_ci * handle Export Declarations 3717c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 3727c804472Sopenharmony_ci * @returns export text info 3737c804472Sopenharmony_ci */ 3747c804472Sopenharmony_cifunction handleExportDeclarations(sourceFileEntity: SourceFileEntity): string { 3757c804472Sopenharmony_ci let mockApi = ''; 3767c804472Sopenharmony_ci if (sourceFileEntity.exportDeclarations.length > 0) { 3777c804472Sopenharmony_ci sourceFileEntity.exportDeclarations.forEach(value => { 3787c804472Sopenharmony_ci const removeNoteRegx = /\/\*[\s\S]*?\*\//g; 3797c804472Sopenharmony_ci const flieText = value.replace(removeNoteRegx, '').replace(/\n/g, ''); 3807c804472Sopenharmony_ci if (flieText.includes('export type {')) { 3817c804472Sopenharmony_ci return; 3827c804472Sopenharmony_ci } 3837c804472Sopenharmony_ci if (flieText.includes('export {') && value.includes(' from ')) { 3847c804472Sopenharmony_ci mockApi += `${flieText}\n`; 3857c804472Sopenharmony_ci } 3867c804472Sopenharmony_ci if (flieText.includes('export *')) { 3877c804472Sopenharmony_ci mockApi += `${flieText}\n`; 3887c804472Sopenharmony_ci } 3897c804472Sopenharmony_ci }); 3907c804472Sopenharmony_ci } 3917c804472Sopenharmony_ci return mockApi; 3927c804472Sopenharmony_ci} 3937c804472Sopenharmony_ci 3947c804472Sopenharmony_ci/** 3957c804472Sopenharmony_ci * add extra export default expression 3967c804472Sopenharmony_ci * @param mockApi file mock text 3977c804472Sopenharmony_ci * @returns export text info 3987c804472Sopenharmony_ci */ 3997c804472Sopenharmony_cifunction addExportDefaultExpression(mockApi: string): string { 4007c804472Sopenharmony_ci const paramIndex = 2; 4017c804472Sopenharmony_ci const reg = /export\sconst\s.*\s=/g; 4027c804472Sopenharmony_ci const regDefault = /export\sdefault\s/g; 4037c804472Sopenharmony_ci const regFunc = /export\sfunction\s/g; 4047c804472Sopenharmony_ci const results = mockApi.match(reg); 4057c804472Sopenharmony_ci const resultDefaults = mockApi.match(regDefault); 4067c804472Sopenharmony_ci const resultFuncs = mockApi.match(regFunc); 4077c804472Sopenharmony_ci if (results && results.length === 1 && !resultDefaults && !resultFuncs) { 4087c804472Sopenharmony_ci const arr = results[0].split(' '); 4097c804472Sopenharmony_ci const moduleName = arr[arr.length - paramIndex]; 4107c804472Sopenharmony_ci mockApi += `\nexport default ${moduleName};`; 4117c804472Sopenharmony_ci } 4127c804472Sopenharmony_ci return mockApi; 4137c804472Sopenharmony_ci} 4147c804472Sopenharmony_ci 4157c804472Sopenharmony_ci/** 4167c804472Sopenharmony_ci * generate import definition 4177c804472Sopenharmony_ci * @param importEntity import entity data 4187c804472Sopenharmony_ci * @param sourceFileName file name 4197c804472Sopenharmony_ci * @param heritageClausesArray heritage elements array data 4207c804472Sopenharmony_ci * @param currentFilePath current file path 4217c804472Sopenharmony_ci * @param dependsSourceFileList reference Files data 4227c804472Sopenharmony_ci * @returns string 4237c804472Sopenharmony_ci */ 4247c804472Sopenharmony_ciexport function generateImportDeclaration( 4257c804472Sopenharmony_ci importEntity: ImportElementEntity, 4267c804472Sopenharmony_ci sourceFileName: string, 4277c804472Sopenharmony_ci heritageClausesArray: string[], 4287c804472Sopenharmony_ci currentFilePath: string, 4297c804472Sopenharmony_ci dependsSourceFileList: SourceFile[] 4307c804472Sopenharmony_ci): string { 4317c804472Sopenharmony_ci const importEntities = handleImportKit(importEntity); 4327c804472Sopenharmony_ci if (importEntities.length) { 4337c804472Sopenharmony_ci return importEntities 4347c804472Sopenharmony_ci .map(entity => 4357c804472Sopenharmony_ci generateImportDeclaration(entity, sourceFileName, heritageClausesArray, currentFilePath, dependsSourceFileList) 4367c804472Sopenharmony_ci ) 4377c804472Sopenharmony_ci .join('\n'); 4387c804472Sopenharmony_ci } 4397c804472Sopenharmony_ci 4407c804472Sopenharmony_ci const importDeclaration = referenctImport2ModuleImport(importEntity, currentFilePath, dependsSourceFileList); 4417c804472Sopenharmony_ci if (importDeclaration) { 4427c804472Sopenharmony_ci return importDeclaration; 4437c804472Sopenharmony_ci } 4447c804472Sopenharmony_ci 4457c804472Sopenharmony_ci const importPathSplit = importEntity.importPath.split('/'); 4467c804472Sopenharmony_ci 4477c804472Sopenharmony_ci let importPath = importPathSplit.slice(0, -1).join('/') + '/'; 4487c804472Sopenharmony_ci importPath += getImportPathName(importPathSplit); 4497c804472Sopenharmony_ci 4507c804472Sopenharmony_ci let importElements = generateImportElements(importEntity, heritageClausesArray); 4517c804472Sopenharmony_ci if (importElements === '{ mockWantAgent }' && importPath.includes('ohos_app_ability_wantAgent')) { 4527c804472Sopenharmony_ci importElements = '{ mockWantAgent as mockAbilityWantAgent }'; 4537c804472Sopenharmony_ci } 4547c804472Sopenharmony_ci const testPath = importPath.replace(/"/g, '').replace(/'/g, '').split('/'); 4557c804472Sopenharmony_ci if (!getAllFileNameList().has(testPath[testPath.length - 1]) && testPath[testPath.length - 1] !== 'ohos_application_want') { 4567c804472Sopenharmony_ci return ''; 4577c804472Sopenharmony_ci } 4587c804472Sopenharmony_ci 4597c804472Sopenharmony_ci const tmpImportPath = importPath.replace(/["']/g, ''); 4607c804472Sopenharmony_ci if (!tmpImportPath.startsWith('./') && !tmpImportPath.startsWith('../')) { 4617c804472Sopenharmony_ci importPath = `'./${tmpImportPath}'`; 4627c804472Sopenharmony_ci } 4637c804472Sopenharmony_ci if (sourceFileName === 'tagSession' && tmpImportPath === './basic' || sourceFileName === 'notificationContent' && 4647c804472Sopenharmony_ci tmpImportPath === './ohos_multimedia_image') { 4657c804472Sopenharmony_ci importPath = `'.${importPath.replace(/'/g, '')}'`; 4667c804472Sopenharmony_ci } 4677c804472Sopenharmony_ci 4687c804472Sopenharmony_ci if (sourceFileName === 'AbilityContext' && tmpImportPath === '../ohos_application_Ability') { 4697c804472Sopenharmony_ci return ''; 4707c804472Sopenharmony_ci } 4717c804472Sopenharmony_ci if (sourceFileName === 'Context' && tmpImportPath === './ApplicationContext') { 4727c804472Sopenharmony_ci return 'import { mockEnvironmentCallback } from \'../ohos_app_ability_EnvironmentCallback\'\n'; 4737c804472Sopenharmony_ci } 4747c804472Sopenharmony_ci if (!importElements.includes('{') && !importElements.includes('}') && needToAddBrace.includes(importElements)) { 4757c804472Sopenharmony_ci importElements = `{ ${importElements} }`; 4767c804472Sopenharmony_ci } 4777c804472Sopenharmony_ci collectAllLegalImports(importElements); 4787c804472Sopenharmony_ci return `import ${importElements} from ${importPath}\n`; 4797c804472Sopenharmony_ci} 4807c804472Sopenharmony_ci 4817c804472Sopenharmony_ci/** 4827c804472Sopenharmony_ci * handle module declarations does it exist 4837c804472Sopenharmony_ci * @param rootName absolute path to the mock file to be generated 4847c804472Sopenharmony_ci * @param fileName file name 4857c804472Sopenharmony_ci * @param sourceFile file Text Information 4867c804472Sopenharmony_ci * @param mockApi file mock text 4877c804472Sopenharmony_ci * @param mockFunctionElements all function element entity 4887c804472Sopenharmony_ci * @returns ReturnDataParams 4897c804472Sopenharmony_ci */ 4907c804472Sopenharmony_cifunction handleModuleDeclarationsNotExist( 4917c804472Sopenharmony_ci rootName: string, 4927c804472Sopenharmony_ci fileName: string, 4937c804472Sopenharmony_ci sourceFile: SourceFile, 4947c804472Sopenharmony_ci mockApi: string, 4957c804472Sopenharmony_ci mockFunctionElements: Array<MockFunctionElementEntity> 4967c804472Sopenharmony_ci): ReturnDataParams { 4977c804472Sopenharmony_ci const data: ReturnDataParams = { 4987c804472Sopenharmony_ci mockData: '', 4997c804472Sopenharmony_ci mockFunctionElements: mockFunctionElements 5007c804472Sopenharmony_ci }; 5017c804472Sopenharmony_ci const mockNameArr = fileName.split('_'); 5027c804472Sopenharmony_ci const mockName = mockNameArr[mockNameArr.length - 1]; 5037c804472Sopenharmony_ci const defaultExportClass = getDefaultExportClassDeclaration(sourceFile); 5047c804472Sopenharmony_ci defaultExportClass.forEach(value => { 5057c804472Sopenharmony_ci data.mockData += generateClassDeclaration(rootName, value, false, mockName, '', sourceFile, false, mockApi) + '\n'; 5067c804472Sopenharmony_ci data.mockFunctionElements.push({ elementName: value.className, type: 'class' }); 5077c804472Sopenharmony_ci }); 5087c804472Sopenharmony_ci data.mockData += `export function mock${firstCharacterToUppercase(mockName)}() {\n`; 5097c804472Sopenharmony_ci if (fileName.startsWith('system_')) { 5107c804472Sopenharmony_ci addToSystemIndexArray({ 5117c804472Sopenharmony_ci filename: fileName, 5127c804472Sopenharmony_ci mockFunctionName: `mock${firstCharacterToUppercase(mockName)}` 5137c804472Sopenharmony_ci }); 5147c804472Sopenharmony_ci data.mockData += `global.systemplugin.${mockName} = {`; 5157c804472Sopenharmony_ci const defaultClass = getDefaultExportClassDeclaration(sourceFile); 5167c804472Sopenharmony_ci let staticMethodBody = ''; 5177c804472Sopenharmony_ci defaultClass.forEach(value => { 5187c804472Sopenharmony_ci value.staticMethods.forEach(val => { 5197c804472Sopenharmony_ci staticMethodBody += generateStaticFunction(val, true, sourceFile, mockApi); 5207c804472Sopenharmony_ci }); 5217c804472Sopenharmony_ci }); 5227c804472Sopenharmony_ci data.mockData += staticMethodBody; 5237c804472Sopenharmony_ci data.mockData += '}'; 5247c804472Sopenharmony_ci } else { 5257c804472Sopenharmony_ci if (!fileName.startsWith('webgl')) { 5267c804472Sopenharmony_ci addToIndexArray({ fileName: fileName, mockFunctionName: `mock${firstCharacterToUppercase(mockName)}` }); 5277c804472Sopenharmony_ci } 5287c804472Sopenharmony_ci } 5297c804472Sopenharmony_ci data.mockData += `\nconst mockModule${firstCharacterToUppercase(mockName)} = {`; 5307c804472Sopenharmony_ci data.mockFunctionElements.forEach(val => { 5317c804472Sopenharmony_ci data.mockData += `${val.elementName}: ${val.elementName},`; 5327c804472Sopenharmony_ci }); 5337c804472Sopenharmony_ci data.mockData += '}\n'; 5347c804472Sopenharmony_ci const isHaveExportDefault = hasExportDefaultKeyword(mockName, sourceFile); 5357c804472Sopenharmony_ci const mockNameUppercase = firstCharacterToUppercase(mockName); 5367c804472Sopenharmony_ci data.mockData += isHaveExportDefault 5377c804472Sopenharmony_ci ? `return mockModule${mockNameUppercase}\n` 5387c804472Sopenharmony_ci : `return mockModule${mockNameUppercase}.${mockNameUppercase}\n`; 5397c804472Sopenharmony_ci data.mockData += '}'; 5407c804472Sopenharmony_ci return data; 5417c804472Sopenharmony_ci} 5427c804472Sopenharmony_ci 5437c804472Sopenharmony_ci/** 5447c804472Sopenharmony_ci * adapter default export 5457c804472Sopenharmony_ci * @param importName 5467c804472Sopenharmony_ci * @returns boolean 5477c804472Sopenharmony_ci */ 5487c804472Sopenharmony_cifunction checIsDefaultExportClass(importName: string): boolean { 5497c804472Sopenharmony_ci const defaultExportClass = [ 5507c804472Sopenharmony_ci 'Context', 5517c804472Sopenharmony_ci 'BaseContext', 5527c804472Sopenharmony_ci 'ExtensionContext', 5537c804472Sopenharmony_ci 'ApplicationContext', 5547c804472Sopenharmony_ci 'ExtensionAbility', 5557c804472Sopenharmony_ci 'Ability', 5567c804472Sopenharmony_ci 'UIExtensionAbility', 5577c804472Sopenharmony_ci 'UIExtensionContext' 5587c804472Sopenharmony_ci ]; 5597c804472Sopenharmony_ci return defaultExportClass.includes(importName); 5607c804472Sopenharmony_ci} 5617c804472Sopenharmony_ci 5627c804472Sopenharmony_ci/** 5637c804472Sopenharmony_ci * get heritage elements 5647c804472Sopenharmony_ci * @param sourceFileEntity all node information in the file 5657c804472Sopenharmony_ci * @param sourceFile file Text Information 5667c804472Sopenharmony_ci * @returns string[] 5677c804472Sopenharmony_ci */ 5687c804472Sopenharmony_cifunction getCurrentApiHeritageArray(sourceFileEntity: SourceFileEntity, sourceFile: SourceFile): string[] { 5697c804472Sopenharmony_ci const heritageClausesArray = []; 5707c804472Sopenharmony_ci const defaultClassArray = getDefaultExportClassDeclaration(sourceFile); 5717c804472Sopenharmony_ci sourceFileEntity.classDeclarations.forEach(value => { 5727c804472Sopenharmony_ci value.heritageClauses.forEach(val => { 5737c804472Sopenharmony_ci val.types.forEach(v => { 5747c804472Sopenharmony_ci heritageClausesArray.push(v); 5757c804472Sopenharmony_ci }); 5767c804472Sopenharmony_ci }); 5777c804472Sopenharmony_ci }); 5787c804472Sopenharmony_ci defaultClassArray.forEach(value => { 5797c804472Sopenharmony_ci value.heritageClauses.forEach(val => { 5807c804472Sopenharmony_ci val.types.forEach(v => { 5817c804472Sopenharmony_ci heritageClausesArray.push(v); 5827c804472Sopenharmony_ci }); 5837c804472Sopenharmony_ci }); 5847c804472Sopenharmony_ci }); 5857c804472Sopenharmony_ci return heritageClausesArray; 5867c804472Sopenharmony_ci} 5877c804472Sopenharmony_ci 5887c804472Sopenharmony_ci/** 5897c804472Sopenharmony_ci * collect reference Files 5907c804472Sopenharmony_ci * @param sourceFile file Text Information 5917c804472Sopenharmony_ci * @returns SourceFile[] 5927c804472Sopenharmony_ci */ 5937c804472Sopenharmony_cifunction collectReferenceFiles(sourceFile: SourceFile): SourceFile[] { 5947c804472Sopenharmony_ci const referenceElementTemplate = /\/\/\/\s*<reference\s+path="[^'"\[\]]+/g; 5957c804472Sopenharmony_ci const referenceFiles: SourceFile[] = []; 5967c804472Sopenharmony_ci const text = sourceFile.text; 5977c804472Sopenharmony_ci const referenceElement = text.match(referenceElementTemplate); 5987c804472Sopenharmony_ci 5997c804472Sopenharmony_ci referenceElement && 6007c804472Sopenharmony_ci referenceElement.forEach(element => { 6017c804472Sopenharmony_ci const referenceRelatePath = element.split(/path=["']/g)[1]; 6027c804472Sopenharmony_ci const realReferenceFilePath = contentRelatePath2RealRelatePath(sourceFile.fileName, referenceRelatePath); 6037c804472Sopenharmony_ci if (!realReferenceFilePath) { 6047c804472Sopenharmony_ci return; 6057c804472Sopenharmony_ci } 6067c804472Sopenharmony_ci 6077c804472Sopenharmony_ci if (!fs.existsSync(realReferenceFilePath)) { 6087c804472Sopenharmony_ci console.error(`Can not resolve file: ${realReferenceFilePath}`); 6097c804472Sopenharmony_ci return; 6107c804472Sopenharmony_ci } 6117c804472Sopenharmony_ci const code = fs.readFileSync(realReferenceFilePath); 6127c804472Sopenharmony_ci referenceFiles.push(createSourceFile(realReferenceFilePath, code.toString(), ScriptTarget.Latest)); 6137c804472Sopenharmony_ci !dtsFileList.includes(realReferenceFilePath) && dtsFileList.push(realReferenceFilePath); 6147c804472Sopenharmony_ci }); 6157c804472Sopenharmony_ci return referenceFiles; 6167c804472Sopenharmony_ci} 6177c804472Sopenharmony_ci 6187c804472Sopenharmony_ci/** 6197c804472Sopenharmony_ci * content relatePath to real relatePath 6207c804472Sopenharmony_ci * @param currentFilePath file name 6217c804472Sopenharmony_ci * @param contentReferenceRelatePath reference relate Path 6227c804472Sopenharmony_ci * @returns string 6237c804472Sopenharmony_ci */ 6247c804472Sopenharmony_cifunction contentRelatePath2RealRelatePath(currentFilePath: string, contentReferenceRelatePath: string): string { 6257c804472Sopenharmony_ci const conmponentSourceFileTemplate = /component\/[^'"\/]+\.d\.ts/; 6267c804472Sopenharmony_ci const currentFolderSourceFileTemplate = /\.\/[^\/]+\.d\.ts/; 6277c804472Sopenharmony_ci const baseFileNameTemplate = /[^\/]+\.d\.ts/; 6287c804472Sopenharmony_ci 6297c804472Sopenharmony_ci let realReferenceFilePath: string; 6307c804472Sopenharmony_ci if (conmponentSourceFileTemplate.test(contentReferenceRelatePath)) { 6317c804472Sopenharmony_ci const newRelateReferencePath = contentReferenceRelatePath.match(conmponentSourceFileTemplate)[0]; 6327c804472Sopenharmony_ci const referenceFileName = path.basename(newRelateReferencePath); 6337c804472Sopenharmony_ci realReferenceFilePath = path.join(getApiInputPath(), '@internal', 'component', 'ets', referenceFileName); 6347c804472Sopenharmony_ci } else if (currentFolderSourceFileTemplate.test(contentReferenceRelatePath)) { 6357c804472Sopenharmony_ci const referenceFileName = path.basename(contentReferenceRelatePath); 6367c804472Sopenharmony_ci realReferenceFilePath = currentFilePath.replace(baseFileNameTemplate, referenceFileName).replace(/\//g, path.sep); 6377c804472Sopenharmony_ci } else { 6387c804472Sopenharmony_ci console.error(`Can not find reference ${contentReferenceRelatePath} from ${currentFilePath}`); 6397c804472Sopenharmony_ci return ''; 6407c804472Sopenharmony_ci } 6417c804472Sopenharmony_ci return realReferenceFilePath; 6427c804472Sopenharmony_ci} 6437c804472Sopenharmony_ci 6447c804472Sopenharmony_ci/** 6457c804472Sopenharmony_ci * referenct import to module import 6467c804472Sopenharmony_ci * @param importEntity import entity data 6477c804472Sopenharmony_ci * @param currentFilePath current file path data 6487c804472Sopenharmony_ci * @param dependsSourceFileList reference Files data 6497c804472Sopenharmony_ci * @returns string 6507c804472Sopenharmony_ci */ 6517c804472Sopenharmony_ciexport function referenctImport2ModuleImport( 6527c804472Sopenharmony_ci importEntity: ImportElementEntity, 6537c804472Sopenharmony_ci currentFilePath: string, 6547c804472Sopenharmony_ci dependsSourceFileList: SourceFile[] 6557c804472Sopenharmony_ci): string { 6567c804472Sopenharmony_ci if (dependsSourceFileList.length && !importEntity.importPath.includes('.')) { 6577c804472Sopenharmony_ci for (let i = 0; i < dependsSourceFileList.length; i++) { 6587c804472Sopenharmony_ci if (dependsSourceFileList[i].text.includes(`declare module ${importEntity.importPath.replace(/'/g, '"')}`)) { 6597c804472Sopenharmony_ci let relatePath = path 6607c804472Sopenharmony_ci .relative(path.dirname(currentFilePath), dependsSourceFileList[i].fileName) 6617c804472Sopenharmony_ci .replace(/\\/g, '/') 6627c804472Sopenharmony_ci .replace(/.d.ts/g, '') 6637c804472Sopenharmony_ci .replace(/.d.ets/g, ''); 6647c804472Sopenharmony_ci relatePath = (relatePath.startsWith('@internal/component') ? './' : '') + relatePath; 6657c804472Sopenharmony_ci return `import ${importEntity.importElements} from '${relatePath}'\n`; 6667c804472Sopenharmony_ci } 6677c804472Sopenharmony_ci } 6687c804472Sopenharmony_ci } 6697c804472Sopenharmony_ci return ''; 6707c804472Sopenharmony_ci} 6717c804472Sopenharmony_ci 6727c804472Sopenharmony_ci/** 6737c804472Sopenharmony_ci * get import pathName 6747c804472Sopenharmony_ci * @param importPathSplit import path split to array data 6757c804472Sopenharmony_ci * @returns string 6767c804472Sopenharmony_ci */ 6777c804472Sopenharmony_cifunction getImportPathName(importPathSplit: string[]): string { 6787c804472Sopenharmony_ci let importPathName: string; 6797c804472Sopenharmony_ci let fileName = importPathSplit[importPathSplit.length - 1]; 6807c804472Sopenharmony_ci if (fileName.endsWith('.d.ts') || fileName.endsWith('.d.ets')) { 6817c804472Sopenharmony_ci fileName = fileName.split(/\.d\.e?ts/)[0]; 6827c804472Sopenharmony_ci } 6837c804472Sopenharmony_ci if (fileName.includes('@')) { 6847c804472Sopenharmony_ci importPathName = fileName.replace('@', '').replace(/\./g, '_'); 6857c804472Sopenharmony_ci } else { 6867c804472Sopenharmony_ci importPathName = fileName.replace(/\./g, '_'); 6877c804472Sopenharmony_ci } 6887c804472Sopenharmony_ci return importPathName; 6897c804472Sopenharmony_ci} 6907c804472Sopenharmony_ci 6917c804472Sopenharmony_ci/** 6927c804472Sopenharmony_ci * get import pathName 6937c804472Sopenharmony_ci * @param importEntity import entity data 6947c804472Sopenharmony_ci * @param heritageClausesArray heritage elements array data 6957c804472Sopenharmony_ci * @returns string 6967c804472Sopenharmony_ci */ 6977c804472Sopenharmony_cifunction generateImportElements(importEntity: ImportElementEntity, heritageClausesArray: string[]): string { 6987c804472Sopenharmony_ci let importElements = importEntity.importElements; 6997c804472Sopenharmony_ci if ( 7007c804472Sopenharmony_ci !importElements.includes('{') && 7017c804472Sopenharmony_ci !importElements.includes('* as') && 7027c804472Sopenharmony_ci !heritageClausesArray.includes(importElements) && 7037c804472Sopenharmony_ci importEntity.importPath.includes('@ohos') 7047c804472Sopenharmony_ci ) { 7057c804472Sopenharmony_ci const tmpArr = importEntity.importPath.split('.'); 7067c804472Sopenharmony_ci const mockModuleName = firstCharacterToUppercase(tmpArr[tmpArr.length - 1].replace('"', '').replace('\'', '')); 7077c804472Sopenharmony_ci if (importElements === 'observer' && importEntity.importPath.includes('@ohos.arkui.observer')) { 7087c804472Sopenharmony_ci return `{ mockUiObserver as ${importElements}}`; 7097c804472Sopenharmony_ci } 7107c804472Sopenharmony_ci importElements = `{ mock${mockModuleName} }`; 7117c804472Sopenharmony_ci } else { 7127c804472Sopenharmony_ci // adapt no rules .d.ts 7137c804472Sopenharmony_ci if (importElements.trim() === 'AccessibilityExtensionContext, { AccessibilityElement }') { 7147c804472Sopenharmony_ci importElements = '{ AccessibilityExtensionContext, AccessibilityElement }'; 7157c804472Sopenharmony_ci } else if (importElements.trim() === '{ image }') { 7167c804472Sopenharmony_ci importElements = '{ mockImage as image }'; 7177c804472Sopenharmony_ci } 7187c804472Sopenharmony_ci } 7197c804472Sopenharmony_ci return importElements; 7207c804472Sopenharmony_ci} 721