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 path from 'path'; 177c804472Sopenharmony_ciimport type { 187c804472Sopenharmony_ci CallSignatureDeclaration, 197c804472Sopenharmony_ci ComputedPropertyName, 207c804472Sopenharmony_ci FunctionDeclaration, 217c804472Sopenharmony_ci Identifier, 227c804472Sopenharmony_ci MethodDeclaration, 237c804472Sopenharmony_ci MethodSignature, 247c804472Sopenharmony_ci ModifiersArray, 257c804472Sopenharmony_ci ModuleDeclaration, 267c804472Sopenharmony_ci ParameterDeclaration, 277c804472Sopenharmony_ci PropertyName, 287c804472Sopenharmony_ci SourceFile 297c804472Sopenharmony_ci} from 'typescript'; 307c804472Sopenharmony_ciimport { 317c804472Sopenharmony_ci isClassDeclaration, 327c804472Sopenharmony_ci isComputedPropertyName, 337c804472Sopenharmony_ci isIdentifier, 347c804472Sopenharmony_ci isModuleBlock, 357c804472Sopenharmony_ci isModuleDeclaration, 367c804472Sopenharmony_ci isPrivateIdentifier 377c804472Sopenharmony_ci} from 'typescript'; 387c804472Sopenharmony_ciimport fs from 'fs'; 397c804472Sopenharmony_ciimport ts from 'typescript'; 407c804472Sopenharmony_ciimport type { ImportElementEntity } from '../declaration-node/importAndExportDeclaration'; 417c804472Sopenharmony_ciimport { collectAllKitFiles } from './kitUtils'; 427c804472Sopenharmony_ci 437c804472Sopenharmony_ciconst paramIndex = 2; 447c804472Sopenharmony_ciconst allLegalImports = new Set<string>(); 457c804472Sopenharmony_ciconst fileNameList = new Set<string>(); 467c804472Sopenharmony_ciconst allClassSet = new Set<string>(); 477c804472Sopenharmony_ci 487c804472Sopenharmony_ciexport const dtsFileList: Array<string> = []; 497c804472Sopenharmony_ci 507c804472Sopenharmony_ci/** 517c804472Sopenharmony_ci * get all legal imports 527c804472Sopenharmony_ci * @returns 537c804472Sopenharmony_ci */ 547c804472Sopenharmony_ciexport function getAllLegalImports(): Set<string> { 557c804472Sopenharmony_ci return new Set<string>(allLegalImports); 567c804472Sopenharmony_ci} 577c804472Sopenharmony_ci 587c804472Sopenharmony_ci/** 597c804472Sopenharmony_ci * get all legal imports 607c804472Sopenharmony_ci * @param element 617c804472Sopenharmony_ci */ 627c804472Sopenharmony_ciexport function collectAllLegalImports(element: string): void { 637c804472Sopenharmony_ci allLegalImports.add(element); 647c804472Sopenharmony_ci} 657c804472Sopenharmony_ci 667c804472Sopenharmony_ci/** 677c804472Sopenharmony_ci * collect all mock js file path 687c804472Sopenharmony_ci * @returns 697c804472Sopenharmony_ci */ 707c804472Sopenharmony_ciexport function getAllFileNameList(): Set<string> { 717c804472Sopenharmony_ci return new Set<string>(fileNameList); 727c804472Sopenharmony_ci} 737c804472Sopenharmony_ci 747c804472Sopenharmony_ci/** 757c804472Sopenharmony_ci * collect all file name 767c804472Sopenharmony_ci */ 777c804472Sopenharmony_ciexport function collectAllFileName(filePath: string): void { 787c804472Sopenharmony_ci const fullFileName = path.basename(filePath); 797c804472Sopenharmony_ci let fileName = ''; 807c804472Sopenharmony_ci if (fullFileName.endsWith('d.ts')) { 817c804472Sopenharmony_ci fileName = fullFileName.split('.d.ts')[0]; 827c804472Sopenharmony_ci } else if (fullFileName.endsWith('d.ets')) { 837c804472Sopenharmony_ci fileName = fullFileName.split('.d.ets')[0]; 847c804472Sopenharmony_ci } 857c804472Sopenharmony_ci 867c804472Sopenharmony_ci let outputFileName = ''; 877c804472Sopenharmony_ci if (fileName.includes('@')) { 887c804472Sopenharmony_ci outputFileName = fileName.split('@')[1].replace(/\./g, '_'); 897c804472Sopenharmony_ci } else { 907c804472Sopenharmony_ci outputFileName = fileName; 917c804472Sopenharmony_ci } 927c804472Sopenharmony_ci fileNameList.add(outputFileName); 937c804472Sopenharmony_ci} 947c804472Sopenharmony_ci 957c804472Sopenharmony_ci/** 967c804472Sopenharmony_ci * get all class name set 977c804472Sopenharmony_ci * @returns 987c804472Sopenharmony_ci */ 997c804472Sopenharmony_ciexport function getClassNameSet(): Set<string> { 1007c804472Sopenharmony_ci return new Set<string>(allClassSet); 1017c804472Sopenharmony_ci} 1027c804472Sopenharmony_ci 1037c804472Sopenharmony_ci/** 1047c804472Sopenharmony_ci * get all class declaration 1057c804472Sopenharmony_ci * @param sourceFile 1067c804472Sopenharmony_ci * @returns 1077c804472Sopenharmony_ci */ 1087c804472Sopenharmony_ciexport function getAllClassDeclaration(sourceFile: SourceFile): Set<string> { 1097c804472Sopenharmony_ci sourceFile.forEachChild(node => { 1107c804472Sopenharmony_ci if (isClassDeclaration(node)) { 1117c804472Sopenharmony_ci if (node.name !== undefined) { 1127c804472Sopenharmony_ci allClassSet.add(node.name.escapedText.toString()); 1137c804472Sopenharmony_ci } 1147c804472Sopenharmony_ci } else if (isModuleDeclaration(node)) { 1157c804472Sopenharmony_ci const moduleDeclaration = node as ModuleDeclaration; 1167c804472Sopenharmony_ci const moduleBody = moduleDeclaration.body; 1177c804472Sopenharmony_ci parseModuleBody(moduleBody); 1187c804472Sopenharmony_ci } 1197c804472Sopenharmony_ci }); 1207c804472Sopenharmony_ci return allClassSet; 1217c804472Sopenharmony_ci} 1227c804472Sopenharmony_ci 1237c804472Sopenharmony_ci/** 1247c804472Sopenharmony_ci * get module class declaration 1257c804472Sopenharmony_ci * @param moduleBody 1267c804472Sopenharmony_ci * @returns 1277c804472Sopenharmony_ci */ 1287c804472Sopenharmony_cifunction parseModuleBody(moduleBody: ts.ModuleBody): void { 1297c804472Sopenharmony_ci if (moduleBody !== undefined && isModuleBlock(moduleBody)) { 1307c804472Sopenharmony_ci moduleBody.statements.forEach(value => { 1317c804472Sopenharmony_ci if (isClassDeclaration(value) && value.name !== undefined) { 1327c804472Sopenharmony_ci allClassSet.add(firstCharacterToUppercase(value.name?.escapedText.toString())); 1337c804472Sopenharmony_ci } 1347c804472Sopenharmony_ci }); 1357c804472Sopenharmony_ci } 1367c804472Sopenharmony_ci} 1377c804472Sopenharmony_ci 1387c804472Sopenharmony_ci/** 1397c804472Sopenharmony_ci * get keywords 1407c804472Sopenharmony_ci * @param modifiers 1417c804472Sopenharmony_ci * @returns 1427c804472Sopenharmony_ci */ 1437c804472Sopenharmony_ciexport function getModifiers(modifiers: ModifiersArray): Array<number> { 1447c804472Sopenharmony_ci const modifiersArray: Array<number> = []; 1457c804472Sopenharmony_ci modifiers.forEach(value => modifiersArray.push(value.kind)); 1467c804472Sopenharmony_ci return modifiersArray; 1477c804472Sopenharmony_ci} 1487c804472Sopenharmony_ci 1497c804472Sopenharmony_ci/** 1507c804472Sopenharmony_ci * get property name 1517c804472Sopenharmony_ci * @param node property node 1527c804472Sopenharmony_ci * @param sourceFile 1537c804472Sopenharmony_ci * @returns 1547c804472Sopenharmony_ci */ 1557c804472Sopenharmony_ciexport function getPropertyName(node: PropertyName, sourceFile: SourceFile): string { 1567c804472Sopenharmony_ci let propertyName = ''; 1577c804472Sopenharmony_ci const fileText = sourceFile.getFullText(); 1587c804472Sopenharmony_ci if (isIdentifier(node) || isPrivateIdentifier(node)) { 1597c804472Sopenharmony_ci const newNameNode = node as Identifier; 1607c804472Sopenharmony_ci propertyName = newNameNode.escapedText.toString(); 1617c804472Sopenharmony_ci } else if (isComputedPropertyName(node)) { 1627c804472Sopenharmony_ci const newNameNode = node as ComputedPropertyName; 1637c804472Sopenharmony_ci propertyName = fileText.slice(newNameNode.expression.pos, newNameNode.expression.end).trim(); 1647c804472Sopenharmony_ci } else { 1657c804472Sopenharmony_ci propertyName = fileText.slice(node.pos, node.end).trim(); 1667c804472Sopenharmony_ci } 1677c804472Sopenharmony_ci return propertyName; 1687c804472Sopenharmony_ci} 1697c804472Sopenharmony_ci 1707c804472Sopenharmony_ci/** 1717c804472Sopenharmony_ci * get parameter declaration 1727c804472Sopenharmony_ci * @param parameter 1737c804472Sopenharmony_ci * @param sourceFile 1747c804472Sopenharmony_ci * @returns 1757c804472Sopenharmony_ci */ 1767c804472Sopenharmony_ciexport function getParameter(parameter: ParameterDeclaration, sourceFile: SourceFile): ParameterEntity { 1777c804472Sopenharmony_ci let paramName = ''; 1787c804472Sopenharmony_ci let paramTypeString = ''; 1797c804472Sopenharmony_ci const paramTypeKind = parameter.type?.kind === undefined ? -1 : parameter.type.kind; 1807c804472Sopenharmony_ci const fileText = sourceFile.getFullText(); 1817c804472Sopenharmony_ci if (isIdentifier(parameter.name)) { 1827c804472Sopenharmony_ci paramName = parameter.name.escapedText === undefined ? '' : parameter.name.escapedText.toString(); 1837c804472Sopenharmony_ci } else { 1847c804472Sopenharmony_ci const start = parameter.name.pos === undefined ? 0 : parameter.name.pos; 1857c804472Sopenharmony_ci const end = parameter.name.end === undefined ? 0 : parameter.name.end; 1867c804472Sopenharmony_ci paramName = fileText.slice(start, end).trim(); 1877c804472Sopenharmony_ci } 1887c804472Sopenharmony_ci 1897c804472Sopenharmony_ci const start = parameter.type?.pos === undefined ? 0 : parameter.type.pos; 1907c804472Sopenharmony_ci const end = parameter.type?.end === undefined ? 0 : parameter.type.end; 1917c804472Sopenharmony_ci paramTypeString = fileText.slice(start, end).trim(); 1927c804472Sopenharmony_ci return { 1937c804472Sopenharmony_ci paramName: paramName, 1947c804472Sopenharmony_ci paramTypeString: paramTypeString, 1957c804472Sopenharmony_ci paramTypeKind: paramTypeKind 1967c804472Sopenharmony_ci }; 1977c804472Sopenharmony_ci} 1987c804472Sopenharmony_ci 1997c804472Sopenharmony_ci/** 2007c804472Sopenharmony_ci * get method or function return info 2017c804472Sopenharmony_ci * @param node 2027c804472Sopenharmony_ci * @param sourceFile 2037c804472Sopenharmony_ci * @returns 2047c804472Sopenharmony_ci */ 2057c804472Sopenharmony_ciexport function getFunctionAndMethodReturnInfo( 2067c804472Sopenharmony_ci node: FunctionDeclaration | MethodDeclaration | MethodSignature | CallSignatureDeclaration, 2077c804472Sopenharmony_ci sourceFile: SourceFile 2087c804472Sopenharmony_ci): ReturnTypeEntity { 2097c804472Sopenharmony_ci const returnInfo = { returnKindName: '', returnKind: -1 }; 2107c804472Sopenharmony_ci if (node.type !== undefined) { 2117c804472Sopenharmony_ci const start = node.type.pos === undefined ? 0 : node.type.pos; 2127c804472Sopenharmony_ci const end = node.type.end === undefined ? 0 : node.type.end; 2137c804472Sopenharmony_ci returnInfo.returnKindName = sourceFile.text.substring(start, end).trim(); 2147c804472Sopenharmony_ci returnInfo.returnKind = node.type.kind; 2157c804472Sopenharmony_ci } 2167c804472Sopenharmony_ci return returnInfo; 2177c804472Sopenharmony_ci} 2187c804472Sopenharmony_ci 2197c804472Sopenharmony_ci/** 2207c804472Sopenharmony_ci * get export modifiers 2217c804472Sopenharmony_ci * @param modifiers 2227c804472Sopenharmony_ci * @returns 2237c804472Sopenharmony_ci */ 2247c804472Sopenharmony_ciexport function getExportKeyword(modifiers: ModifiersArray): Array<number> { 2257c804472Sopenharmony_ci const modifiersArray: Array<number> = []; 2267c804472Sopenharmony_ci modifiers.forEach(value => { 2277c804472Sopenharmony_ci modifiersArray.push(value.kind); 2287c804472Sopenharmony_ci }); 2297c804472Sopenharmony_ci return modifiersArray; 2307c804472Sopenharmony_ci} 2317c804472Sopenharmony_ci 2327c804472Sopenharmony_ci/** 2337c804472Sopenharmony_ci * 2347c804472Sopenharmony_ci * @param str first letter capitalization 2357c804472Sopenharmony_ci * @returns 2367c804472Sopenharmony_ci */ 2377c804472Sopenharmony_ciexport function firstCharacterToUppercase(str: string): string { 2387c804472Sopenharmony_ci return str.slice(0, 1).toUpperCase() + str.slice(1); 2397c804472Sopenharmony_ci} 2407c804472Sopenharmony_ci 2417c804472Sopenharmony_ci/** 2427c804472Sopenharmony_ci * parameters entity 2437c804472Sopenharmony_ci */ 2447c804472Sopenharmony_ciexport interface ParameterEntity { 2457c804472Sopenharmony_ci paramName: string; 2467c804472Sopenharmony_ci paramTypeString: string; 2477c804472Sopenharmony_ci paramTypeKind: number; 2487c804472Sopenharmony_ci} 2497c804472Sopenharmony_ci 2507c804472Sopenharmony_ci/** 2517c804472Sopenharmony_ci * return type entity 2527c804472Sopenharmony_ci */ 2537c804472Sopenharmony_ciexport interface ReturnTypeEntity { 2547c804472Sopenharmony_ci returnKindName: string; 2557c804472Sopenharmony_ci returnKind: number; 2567c804472Sopenharmony_ci} 2577c804472Sopenharmony_ci 2587c804472Sopenharmony_ci/** 2597c804472Sopenharmony_ci * Get OpenHarmony project dir 2607c804472Sopenharmony_ci * @return project dir 2617c804472Sopenharmony_ci */ 2627c804472Sopenharmony_ci 2637c804472Sopenharmony_ciexport function getProjectDir(): string { 2647c804472Sopenharmony_ci const apiInputPath = process.argv[paramIndex]; 2657c804472Sopenharmony_ci const privateInterface = path.join('vendor', 'huawei', 'interface', 'hmscore_sdk_js', 'api'); 2667c804472Sopenharmony_ci const openInterface = path.join('interface', 'sdk-js', 'api'); 2677c804472Sopenharmony_ci if (apiInputPath.indexOf(openInterface) > -1) { 2687c804472Sopenharmony_ci return apiInputPath.replace(`${path.sep}${openInterface}`, ''); 2697c804472Sopenharmony_ci } else { 2707c804472Sopenharmony_ci return apiInputPath.replace(`${path.sep}${privateInterface}`, ''); 2717c804472Sopenharmony_ci } 2727c804472Sopenharmony_ci} 2737c804472Sopenharmony_ci 2747c804472Sopenharmony_ci/** 2757c804472Sopenharmony_ci * return interface api dir in OpenHarmony 2767c804472Sopenharmony_ci */ 2777c804472Sopenharmony_ciexport function getOhosInterfacesDir(): string { 2787c804472Sopenharmony_ci return path.join(getProjectDir(), 'interface', 'sdk-js', 'api'); 2797c804472Sopenharmony_ci} 2807c804472Sopenharmony_ci 2817c804472Sopenharmony_ci/** 2827c804472Sopenharmony_ci * return interface api root path 2837c804472Sopenharmony_ci * @returns apiInputPath 2847c804472Sopenharmony_ci */ 2857c804472Sopenharmony_ciexport function getApiInputPath(): string { 2867c804472Sopenharmony_ci return process.argv[paramIndex]; 2877c804472Sopenharmony_ci} 2887c804472Sopenharmony_ci 2897c804472Sopenharmony_ci/** 2907c804472Sopenharmony_ci * return OpenHarmony file path dependent on by HarmonyOs 2917c804472Sopenharmony_ci * @param importPath path of depend imported 2927c804472Sopenharmony_ci * @param sourceFile sourceFile of current file 2937c804472Sopenharmony_ci * @returns dependsFilePath 2947c804472Sopenharmony_ci */ 2957c804472Sopenharmony_ciexport function findOhosDependFile(importPath: string, sourceFile: SourceFile): string { 2967c804472Sopenharmony_ci const interFaceDir = getOhosInterfacesDir(); 2977c804472Sopenharmony_ci const tmpImportPath = importPath.replace(/'/g, '').replace('.d.ts', '').replace('.d.ets', ''); 2987c804472Sopenharmony_ci const sourceFileDir = path.dirname(sourceFile.fileName); 2997c804472Sopenharmony_ci let dependsFilePath: string; 3007c804472Sopenharmony_ci if (tmpImportPath.startsWith('./')) { 3017c804472Sopenharmony_ci const subIndex = 2; 3027c804472Sopenharmony_ci dependsFilePath = path.join(sourceFileDir, tmpImportPath.substring(subIndex)); 3037c804472Sopenharmony_ci } else if (tmpImportPath.startsWith('../')) { 3047c804472Sopenharmony_ci const backSymbolList = tmpImportPath.split('/').filter(step => step === '..'); 3057c804472Sopenharmony_ci dependsFilePath = [ 3067c804472Sopenharmony_ci ...sourceFileDir.split(path.sep).slice(0, -backSymbolList.length), 3077c804472Sopenharmony_ci ...tmpImportPath.split('/').filter(step => step !== '..') 3087c804472Sopenharmony_ci ].join(path.sep); 3097c804472Sopenharmony_ci } else if (tmpImportPath.startsWith('@ohos.inner.')) { 3107c804472Sopenharmony_ci const pathSteps = tmpImportPath.replace(/@ohos\.inner\./g, '').split('.'); 3117c804472Sopenharmony_ci for (let i = 0; i < pathSteps.length; i++) { 3127c804472Sopenharmony_ci const tmpInterFaceDir = path.join(interFaceDir, ...pathSteps.slice(0, i), pathSteps.slice(i).join('.')); 3137c804472Sopenharmony_ci if (fs.existsSync(tmpInterFaceDir + '.d.ts')) { 3147c804472Sopenharmony_ci return tmpInterFaceDir + '.d.ts'; 3157c804472Sopenharmony_ci } 3167c804472Sopenharmony_ci 3177c804472Sopenharmony_ci if (fs.existsSync(tmpInterFaceDir + '.d.ets')) { 3187c804472Sopenharmony_ci return tmpInterFaceDir + '.d.ets'; 3197c804472Sopenharmony_ci } 3207c804472Sopenharmony_ci } 3217c804472Sopenharmony_ci } else if (tmpImportPath.startsWith('@ohos.')) { 3227c804472Sopenharmony_ci dependsFilePath = path.join(getOhosInterfacesDir(), tmpImportPath); 3237c804472Sopenharmony_ci } 3247c804472Sopenharmony_ci 3257c804472Sopenharmony_ci if (fs.existsSync(dependsFilePath + '.d.ts')) { 3267c804472Sopenharmony_ci return dependsFilePath + '.d.ts'; 3277c804472Sopenharmony_ci } 3287c804472Sopenharmony_ci 3297c804472Sopenharmony_ci if (fs.existsSync(dependsFilePath + '.d.ets')) { 3307c804472Sopenharmony_ci return dependsFilePath + '.d.ets'; 3317c804472Sopenharmony_ci } 3327c804472Sopenharmony_ci 3337c804472Sopenharmony_ci console.warn(`Cannot find module '${importPath}'`); 3347c804472Sopenharmony_ci return ''; 3357c804472Sopenharmony_ci} 3367c804472Sopenharmony_ci 3377c804472Sopenharmony_ci/** 3387c804472Sopenharmony_ci * Determine if the file is a openHarmony interface file 3397c804472Sopenharmony_ci * @param path: interface file path 3407c804472Sopenharmony_ci * @returns 3417c804472Sopenharmony_ci */ 3427c804472Sopenharmony_ciexport function isOhosInterface(path: string): boolean { 3437c804472Sopenharmony_ci return path.startsWith(getOhosInterfacesDir()); 3447c804472Sopenharmony_ci} 3457c804472Sopenharmony_ci 3467c804472Sopenharmony_ci/** 3477c804472Sopenharmony_ci * reutn js-sdk root folder full path 3487c804472Sopenharmony_ci * @returns 3497c804472Sopenharmony_ci */ 3507c804472Sopenharmony_ciexport function getJsSdkDir(): string { 3517c804472Sopenharmony_ci let sdkJsDir = process.argv[paramIndex].split(path.sep).slice(0, -1).join(path.sep); 3527c804472Sopenharmony_ci sdkJsDir += sdkJsDir.endsWith(path.sep) ? '' : path.sep; 3537c804472Sopenharmony_ci return sdkJsDir; 3547c804472Sopenharmony_ci} 3557c804472Sopenharmony_ci 3567c804472Sopenharmony_ci/** 3577c804472Sopenharmony_ci * Determine whether the object has been imported 3587c804472Sopenharmony_ci * @param importDeclarations imported Declaration list in current file 3597c804472Sopenharmony_ci * @param typeName Object being inspected 3607c804472Sopenharmony_ci * @returns 3617c804472Sopenharmony_ci */ 3627c804472Sopenharmony_ciexport function hasBeenImported(importDeclarations: ImportElementEntity[], typeName: string): boolean { 3637c804472Sopenharmony_ci if (!typeName.trim()) { 3647c804472Sopenharmony_ci return true; 3657c804472Sopenharmony_ci } 3667c804472Sopenharmony_ci if (isFirstCharLowerCase(typeName)) { 3677c804472Sopenharmony_ci return true; 3687c804472Sopenharmony_ci } 3697c804472Sopenharmony_ci return importDeclarations.some(importDeclaration => { 3707c804472Sopenharmony_ci if (importDeclaration.importElements.includes(typeName) && importDeclaration.importPath.includes('./')) { 3717c804472Sopenharmony_ci return true; 3727c804472Sopenharmony_ci } 3737c804472Sopenharmony_ci return false; 3747c804472Sopenharmony_ci }); 3757c804472Sopenharmony_ci} 3767c804472Sopenharmony_ci 3777c804472Sopenharmony_ci/** 3787c804472Sopenharmony_ci * Determine whether the first character in a string is a lowercase letter 3797c804472Sopenharmony_ci * @param str target string 3807c804472Sopenharmony_ci * @returns 3817c804472Sopenharmony_ci */ 3827c804472Sopenharmony_cifunction isFirstCharLowerCase(str: string): boolean { 3837c804472Sopenharmony_ci const lowerCaseFirstChar = str[0].toLowerCase(); 3847c804472Sopenharmony_ci return str[0] === lowerCaseFirstChar; 3857c804472Sopenharmony_ci} 3867c804472Sopenharmony_ci 3877c804472Sopenharmony_ciexport const specialFiles = [ 3887c804472Sopenharmony_ci '@internal/component/ets/common.d.ts', 3897c804472Sopenharmony_ci '@internal/component/ets/units.d.ts', 3907c804472Sopenharmony_ci '@internal/component/ets/common_ts_ets_api.d.ts', 3917c804472Sopenharmony_ci '@internal/component/ets/enums.d.ts', 3927c804472Sopenharmony_ci '@internal/component/ets/alert_dialog.d.ts', 3937c804472Sopenharmony_ci '@internal/component/ets/ability_component.d.ts', 3947c804472Sopenharmony_ci '@internal/component/ets/rich_editor.d.ts', 3957c804472Sopenharmony_ci '@internal/component/ets/symbolglyph.d.ts', 3967c804472Sopenharmony_ci '@internal/component/ets/button.d.ts', 3977c804472Sopenharmony_ci '@internal/component/ets/nav_destination.d.ts', 3987c804472Sopenharmony_ci '@internal/component/ets/navigation.d.ts', 3997c804472Sopenharmony_ci '@internal/component/ets/text_common.d.ts', 4007c804472Sopenharmony_ci '@internal/component/ets/styled_string.d.ts' 4017c804472Sopenharmony_ci]; 4027c804472Sopenharmony_ci 4037c804472Sopenharmony_ciexport const specialType = ['Storage', 'File', 'ChildProcess', 'Cipher', 'Sensor', 'Authenticator']; 4047c804472Sopenharmony_ci 4057c804472Sopenharmony_ciexport const specialClassName = ['Want', 'Configuration', 'InputMethodExtensionContext']; 4067c804472Sopenharmony_ci 4077c804472Sopenharmony_ci/** 4087c804472Sopenharmony_ci * get add kit file map 4097c804472Sopenharmony_ci * @param apiInputPath api input path 4107c804472Sopenharmony_ci * @returns 4117c804472Sopenharmony_ci */ 4127c804472Sopenharmony_ciexport function generateKitMap(apiInputPath: string): void { 4137c804472Sopenharmony_ci const kitPath = path.join(apiInputPath, '../', 'kits'); 4147c804472Sopenharmony_ci if (!fs.existsSync(kitPath)) { 4157c804472Sopenharmony_ci throw new Error(`${kitPath} does not exist.`); 4167c804472Sopenharmony_ci } 4177c804472Sopenharmony_ci collectAllKitFiles(kitPath); 4187c804472Sopenharmony_ci} 4197c804472Sopenharmony_ci 4207c804472Sopenharmony_ciexport interface DependencyListParams { 4217c804472Sopenharmony_ci dependency: Array<string>; 4227c804472Sopenharmony_ci export: string; 4237c804472Sopenharmony_ci} 4247c804472Sopenharmony_ci 4257c804472Sopenharmony_ciexport interface DependencyParams { 4267c804472Sopenharmony_ci [key: string]: DependencyListParams; 4277c804472Sopenharmony_ci} 4287c804472Sopenharmony_ci 4297c804472Sopenharmony_ci// dependence on collecting files 4307c804472Sopenharmony_ciexport const DEPENDENCY_LIST: DependencyParams = {}; 4317c804472Sopenharmony_ci 4327c804472Sopenharmony_ci// Json file indentation configuration 4337c804472Sopenharmony_ciexport const JSON_FILE_INDENTATION = 2; 4347c804472Sopenharmony_ci 4357c804472Sopenharmony_ci/** 4367c804472Sopenharmony_ci * generated depend.json 4377c804472Sopenharmony_ci */ 4387c804472Sopenharmony_ciexport function generateDependJsonFile(): void { 4397c804472Sopenharmony_ci const dependInfoPath = path.join(__dirname, '../../../runtime/main/extend/systemplugin/depend.json'); 4407c804472Sopenharmony_ci fs.writeFileSync(dependInfoPath, JSON.stringify(DEPENDENCY_LIST, null, JSON_FILE_INDENTATION), 'utf-8'); 4417c804472Sopenharmony_ci} 4427c804472Sopenharmony_ci 4437c804472Sopenharmony_ci/** 4447c804472Sopenharmony_ci * generated MyComponent.js 4457c804472Sopenharmony_ci * 4467c804472Sopenharmony_ci * @param outDir generated file root directory 4477c804472Sopenharmony_ci */ 4487c804472Sopenharmony_ciexport function generateMyComponent(outDir: string): void { 4497c804472Sopenharmony_ci fs.writeFileSync(path.join(outDir, 'MyComponent.js'), 'class MyComponent {}\nexport { MyComponent };'); 4507c804472Sopenharmony_ci} 4517c804472Sopenharmony_ci 4527c804472Sopenharmony_ci// initialize all variables in the file 4537c804472Sopenharmony_ciexport let INITVARIABLE = ''; 4547c804472Sopenharmony_ci 4557c804472Sopenharmony_ci/** 4567c804472Sopenharmony_ci * set initialize variable 4577c804472Sopenharmony_ci * 4587c804472Sopenharmony_ci * @param value variable name 4597c804472Sopenharmony_ci */ 4607c804472Sopenharmony_ciexport function setInitVariable(value?: string): void { 4617c804472Sopenharmony_ci if (value) { 4627c804472Sopenharmony_ci if (!INITVARIABLE.includes(`let ${value} = {};`)) { 4637c804472Sopenharmony_ci INITVARIABLE += `let ${value} = {};\n`; 4647c804472Sopenharmony_ci } 4657c804472Sopenharmony_ci } else { 4667c804472Sopenharmony_ci INITVARIABLE = ''; 4677c804472Sopenharmony_ci } 4687c804472Sopenharmony_ci} 4697c804472Sopenharmony_ci 4707c804472Sopenharmony_ci/** 4717c804472Sopenharmony_ci * get all initialize variable 4727c804472Sopenharmony_ci * @returns string 4737c804472Sopenharmony_ci */ 4747c804472Sopenharmony_ciexport function getInitVariable(): string { 4757c804472Sopenharmony_ci return INITVARIABLE; 4767c804472Sopenharmony_ci} 477