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 { createSourceFile, ScriptTarget } from 'typescript';
197c804472Sopenharmony_ciimport {
207c804472Sopenharmony_ci  collectAllFileName,
217c804472Sopenharmony_ci  getAllClassDeclaration,
227c804472Sopenharmony_ci  dtsFileList,
237c804472Sopenharmony_ci  getOhosInterfacesDir,
247c804472Sopenharmony_ci  specialFiles,
257c804472Sopenharmony_ci  generateKitMap,
267c804472Sopenharmony_ci  generateDependJsonFile,
277c804472Sopenharmony_ci  generateMyComponent
287c804472Sopenharmony_ci} from './common/commonUtils';
297c804472Sopenharmony_ciimport { getSourceFileAssembly } from './declaration-node/sourceFileElementsAssemply';
307c804472Sopenharmony_ciimport { generateEntry } from './generate/generateEntry';
317c804472Sopenharmony_ciimport { generateIndex } from './generate/generateIndex';
327c804472Sopenharmony_ciimport { generateSourceFileElements } from './generate/generateMockJsFile';
337c804472Sopenharmony_ciimport { generateSystemIndex } from './generate/generateSystemIndex';
347c804472Sopenharmony_ci
357c804472Sopenharmony_ci/**
367c804472Sopenharmony_ci * get all api .d.ts file path
377c804472Sopenharmony_ci * @param dir
387c804472Sopenharmony_ci * @returns
397c804472Sopenharmony_ci */
407c804472Sopenharmony_cifunction getAllDtsFile(dir: string): void {
417c804472Sopenharmony_ci  const arr = fs.readdirSync(dir);
427c804472Sopenharmony_ci  if (!dir.toString().includes('node_modules') && !dir.toString().includes(path.join('@internal', 'component'))) {
437c804472Sopenharmony_ci    arr.forEach(value => {
447c804472Sopenharmony_ci      const fullPath = path.join(dir, value);
457c804472Sopenharmony_ci      const stats = fs.statSync(fullPath);
467c804472Sopenharmony_ci      if (stats.isDirectory()) {
477c804472Sopenharmony_ci        getAllDtsFile(fullPath);
487c804472Sopenharmony_ci      } else {
497c804472Sopenharmony_ci        dtsFileList.push(fullPath);
507c804472Sopenharmony_ci      }
517c804472Sopenharmony_ci    });
527c804472Sopenharmony_ci  }
537c804472Sopenharmony_ci}
547c804472Sopenharmony_ci
557c804472Sopenharmony_ci/**
567c804472Sopenharmony_ci * get all component .d.ts file path
577c804472Sopenharmony_ci * @param dir
587c804472Sopenharmony_ci * @returns
597c804472Sopenharmony_ci */
607c804472Sopenharmony_cifunction getAllComponentsFilePath(dir: string): Array<string> {
617c804472Sopenharmony_ci  const componentPath = path.join(dir, '@internal', 'component', 'ets');
627c804472Sopenharmony_ci  if (!fs.existsSync(componentPath)) {
637c804472Sopenharmony_ci    return;
647c804472Sopenharmony_ci  }
657c804472Sopenharmony_ci  const componentPathArr = fs.readdirSync(componentPath);
667c804472Sopenharmony_ci  componentPathArr.forEach(value => {
677c804472Sopenharmony_ci    const fullPath = path.join(componentPath, value);
687c804472Sopenharmony_ci    if (fs.existsSync(fullPath) && !fs.statSync(fullPath).isDirectory()) {
697c804472Sopenharmony_ci      const componentName = `@internal/component/ets/${value}`;
707c804472Sopenharmony_ci      if (!specialFiles.includes(componentName)) {
717c804472Sopenharmony_ci        specialFiles.push(componentName);
727c804472Sopenharmony_ci      }
737c804472Sopenharmony_ci    }
747c804472Sopenharmony_ci  });
757c804472Sopenharmony_ci}
767c804472Sopenharmony_ci
777c804472Sopenharmony_ci/**
787c804472Sopenharmony_ci * mkdir
797c804472Sopenharmony_ci * @param dirname
807c804472Sopenharmony_ci * @returns
817c804472Sopenharmony_ci */
827c804472Sopenharmony_cifunction mkdirsSync(dirname): boolean {
837c804472Sopenharmony_ci  if (fs.existsSync(dirname)) {
847c804472Sopenharmony_ci    return true;
857c804472Sopenharmony_ci  } else {
867c804472Sopenharmony_ci    if (mkdirsSync(path.dirname(dirname))) {
877c804472Sopenharmony_ci      fs.mkdirSync(dirname);
887c804472Sopenharmony_ci      return true;
897c804472Sopenharmony_ci    }
907c804472Sopenharmony_ci  }
917c804472Sopenharmony_ci  return false;
927c804472Sopenharmony_ci}
937c804472Sopenharmony_ci
947c804472Sopenharmony_ci/**
957c804472Sopenharmony_ci * hgandle all ets file mock logic
967c804472Sopenharmony_ci * @param outMockJsFileDir automated mock file output path
977c804472Sopenharmony_ci * @returns
987c804472Sopenharmony_ci */
997c804472Sopenharmony_cifunction etsFileToMock(outMockJsFileDir: string): void {
1007c804472Sopenharmony_ci  let index = 0;
1017c804472Sopenharmony_ci  while (index < dtsFileList.length) {
1027c804472Sopenharmony_ci    const value = dtsFileList[index];
1037c804472Sopenharmony_ci    index++;
1047c804472Sopenharmony_ci
1057c804472Sopenharmony_ci    if (!value.endsWith('.d.ts') && !value.endsWith('.d.ets')) {
1067c804472Sopenharmony_ci      continue;
1077c804472Sopenharmony_ci    }
1087c804472Sopenharmony_ci
1097c804472Sopenharmony_ci    const code = fs.readFileSync(value);
1107c804472Sopenharmony_ci    const sourceFile = createSourceFile(value, code.toString(), ScriptTarget.Latest);
1117c804472Sopenharmony_ci    let fileName: string;
1127c804472Sopenharmony_ci    if (value.endsWith('.d.ts')) {
1137c804472Sopenharmony_ci      fileName = path.basename(value, '.d.ts');
1147c804472Sopenharmony_ci    } else if (value.endsWith('.d.ets')) {
1157c804472Sopenharmony_ci      fileName = path.basename(value, '.d.ets');
1167c804472Sopenharmony_ci    } else {
1177c804472Sopenharmony_ci      continue;
1187c804472Sopenharmony_ci    }
1197c804472Sopenharmony_ci    let outputFileName = '';
1207c804472Sopenharmony_ci    if (fileName.includes('@')) {
1217c804472Sopenharmony_ci      outputFileName = fileName.split('@')[1].replace(/\./g, '_');
1227c804472Sopenharmony_ci    } else {
1237c804472Sopenharmony_ci      outputFileName = fileName;
1247c804472Sopenharmony_ci    }
1257c804472Sopenharmony_ci
1267c804472Sopenharmony_ci    let tmpOutputMockJsFileDir = outMockJsFileDir;
1277c804472Sopenharmony_ci    if (!outputFileName.startsWith('system_')) {
1287c804472Sopenharmony_ci      tmpOutputMockJsFileDir = path.join(outMockJsFileDir, 'napi');
1297c804472Sopenharmony_ci    }
1307c804472Sopenharmony_ci
1317c804472Sopenharmony_ci    if (value.startsWith(getOhosInterfacesDir()) && !apiInputPath.startsWith(getOhosInterfacesDir())) {
1327c804472Sopenharmony_ci      tmpOutputMockJsFileDir = path.join(tmpOutputMockJsFileDir, '@ohos');
1337c804472Sopenharmony_ci    }
1347c804472Sopenharmony_ci
1357c804472Sopenharmony_ci    let dirName = '';
1367c804472Sopenharmony_ci    dirName = path.join(tmpOutputMockJsFileDir, path.dirname(value).split(`${path.sep}api`)[1]);
1377c804472Sopenharmony_ci    if (!fs.existsSync(dirName)) {
1387c804472Sopenharmony_ci      mkdirsSync(dirName);
1397c804472Sopenharmony_ci    }
1407c804472Sopenharmony_ci    const sourceFileEntity = getSourceFileAssembly(sourceFile, fileName);
1417c804472Sopenharmony_ci    const filePath = path.join(dirName, outputFileName + '.js');
1427c804472Sopenharmony_ci    fs.writeFileSync(filePath, '');
1437c804472Sopenharmony_ci    fs.appendFileSync(
1447c804472Sopenharmony_ci      path.join(filePath),
1457c804472Sopenharmony_ci      generateSourceFileElements('', sourceFileEntity, sourceFile, outputFileName)
1467c804472Sopenharmony_ci    );
1477c804472Sopenharmony_ci  }
1487c804472Sopenharmony_ci}
1497c804472Sopenharmony_ci
1507c804472Sopenharmony_ci/**
1517c804472Sopenharmony_ci * Project Entry Function
1527c804472Sopenharmony_ci * @param apiInputPath interface_sdk-js\api absolute file path
1537c804472Sopenharmony_ci * @returns
1547c804472Sopenharmony_ci */
1557c804472Sopenharmony_cifunction main(apiInputPath): void {
1567c804472Sopenharmony_ci  const dtsDir = apiInputPath;
1577c804472Sopenharmony_ci  const outMockJsFileDir = path.join(__dirname, '../../runtime/main/extend/systemplugin');
1587c804472Sopenharmony_ci  generateKitMap(apiInputPath);
1597c804472Sopenharmony_ci  getAllDtsFile(dtsDir);
1607c804472Sopenharmony_ci  getAllComponentsFilePath(dtsDir);
1617c804472Sopenharmony_ci  dtsFileList.forEach(value => {
1627c804472Sopenharmony_ci    collectAllFileName(value);
1637c804472Sopenharmony_ci    if (value.endsWith('.d.ts') || value.endsWith('.d.ets')) {
1647c804472Sopenharmony_ci      const code = fs.readFileSync(value);
1657c804472Sopenharmony_ci      const sourceFile = createSourceFile(value, code.toString(), ScriptTarget.Latest);
1667c804472Sopenharmony_ci      getAllClassDeclaration(sourceFile);
1677c804472Sopenharmony_ci    }
1687c804472Sopenharmony_ci  });
1697c804472Sopenharmony_ci
1707c804472Sopenharmony_ci  etsFileToMock(outMockJsFileDir);
1717c804472Sopenharmony_ci
1727c804472Sopenharmony_ci  if (!fs.existsSync(path.join(outMockJsFileDir, 'napi'))) {
1737c804472Sopenharmony_ci    mkdirsSync(path.join(outMockJsFileDir, 'napi'));
1747c804472Sopenharmony_ci  }
1757c804472Sopenharmony_ci  generateDependJsonFile();
1767c804472Sopenharmony_ci  generateMyComponent(outMockJsFileDir);
1777c804472Sopenharmony_ci  fs.writeFileSync(path.join(outMockJsFileDir, 'napi', 'index.js'), generateIndex());
1787c804472Sopenharmony_ci  fs.writeFileSync(path.join(outMockJsFileDir, 'index.js'), generateSystemIndex());
1797c804472Sopenharmony_ci  fs.writeFileSync(path.join(outMockJsFileDir, 'entry.js'), generateEntry());
1807c804472Sopenharmony_ci}
1817c804472Sopenharmony_ci
1827c804472Sopenharmony_ciconst paramIndex = 2;
1837c804472Sopenharmony_ciconst apiInputPath = process.argv[paramIndex];
1847c804472Sopenharmony_cimain(apiInputPath);
185