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