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