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