107ac75b1Sopenharmony_ci/* 207ac75b1Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 307ac75b1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 407ac75b1Sopenharmony_ci * you may not use this file except in compliance with the License. 507ac75b1Sopenharmony_ci * You may obtain a copy of the License at 607ac75b1Sopenharmony_ci * 707ac75b1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 807ac75b1Sopenharmony_ci * 907ac75b1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1007ac75b1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1107ac75b1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1207ac75b1Sopenharmony_ci * See the License for the specific language governing permissions and 1307ac75b1Sopenharmony_ci * limitations under the License. 1407ac75b1Sopenharmony_ci */ 1507ac75b1Sopenharmony_ci 1607ac75b1Sopenharmony_ciconst fs = require('fs'); 1707ac75b1Sopenharmony_ciconst path = require('path'); 1807ac75b1Sopenharmony_ciconst ts = require('typescript'); 1907ac75b1Sopenharmony_ciconst SECOND_PARAM = 2; 2007ac75b1Sopenharmony_ciconst THIRD_PARAM = 3; 2107ac75b1Sopenharmony_ciconst FOURTH_PARAM = 4; 2207ac75b1Sopenharmony_ciconst FIFTH_PARAM = 5; 2307ac75b1Sopenharmony_ciconst systemModules = []; 2407ac75b1Sopenharmony_ci 2507ac75b1Sopenharmony_cifunction generateKitConfig(kitFilePath, output, apiFilePath, arktsFilePath) { 2607ac75b1Sopenharmony_ci readSystemApis(apiFilePath, systemModules); 2707ac75b1Sopenharmony_ci readSystemApis(arktsFilePath, systemModules); 2807ac75b1Sopenharmony_ci const kitFiles = []; 2907ac75b1Sopenharmony_ci readFile(kitFilePath, kitFiles); 3007ac75b1Sopenharmony_ci if (fs.existsSync(output)) { 3107ac75b1Sopenharmony_ci removeDir(output); 3207ac75b1Sopenharmony_ci } 3307ac75b1Sopenharmony_ci mkDir(output); 3407ac75b1Sopenharmony_ci kitFiles.forEach((item) => { 3507ac75b1Sopenharmony_ci let content = fs.readFileSync(item, 'utf8'); 3607ac75b1Sopenharmony_ci const outputPath = path.resolve(output, path.basename(item).replace('.d.ts', '.json')); 3707ac75b1Sopenharmony_ci const symbol = {}; 3807ac75b1Sopenharmony_ci const kitSourceFile = ts.createSourceFile(item, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 3907ac75b1Sopenharmony_ci if (kitSourceFile.statements && kitSourceFile.statements.length > 0) { 4007ac75b1Sopenharmony_ci kitSourceFile.statements.forEach(statement => { 4107ac75b1Sopenharmony_ci getImportDeclarationInfo(statement, symbol); 4207ac75b1Sopenharmony_ci }); 4307ac75b1Sopenharmony_ci } 4407ac75b1Sopenharmony_ci const result = { 4507ac75b1Sopenharmony_ci 'symbols': symbol 4607ac75b1Sopenharmony_ci }; 4707ac75b1Sopenharmony_ci const STANDARD_INDENT = 2; 4807ac75b1Sopenharmony_ci createKitConfigs(outputPath, JSON.stringify(result, null, STANDARD_INDENT)); 4907ac75b1Sopenharmony_ci }); 5007ac75b1Sopenharmony_ci} 5107ac75b1Sopenharmony_ci 5207ac75b1Sopenharmony_cifunction getImportDeclarationInfo(statement, symbol) { 5307ac75b1Sopenharmony_ci if (!ts.isImportDeclaration(statement)) { 5407ac75b1Sopenharmony_ci return; 5507ac75b1Sopenharmony_ci } 5607ac75b1Sopenharmony_ci let source = ''; 5707ac75b1Sopenharmony_ci if (statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) { 5807ac75b1Sopenharmony_ci source = statement.moduleSpecifier.getText().replace(/('|")*/g, ''); 5907ac75b1Sopenharmony_ci for (let i = 0; i < systemModules.length; i++) { 6007ac75b1Sopenharmony_ci const moduleName = systemModules[i]; 6107ac75b1Sopenharmony_ci if (moduleName.replace(/(\.d\.ts|\.d\.ets)$/, '') === source) { 6207ac75b1Sopenharmony_ci source = moduleName; 6307ac75b1Sopenharmony_ci break; 6407ac75b1Sopenharmony_ci } 6507ac75b1Sopenharmony_ci } 6607ac75b1Sopenharmony_ci } 6707ac75b1Sopenharmony_ci if (statement.importClause) { 6807ac75b1Sopenharmony_ci const clause = statement.importClause; 6907ac75b1Sopenharmony_ci if (clause.name) { 7007ac75b1Sopenharmony_ci addSymbol(symbol, clause.name.getText(), source, 'default'); 7107ac75b1Sopenharmony_ci } 7207ac75b1Sopenharmony_ci if (clause.namedBindings) { 7307ac75b1Sopenharmony_ci const binding = clause.namedBindings; 7407ac75b1Sopenharmony_ci if (ts.isNamespaceImport(binding) && binding.name) { 7507ac75b1Sopenharmony_ci addSymbol(symbol, binding.name.getText(), source, 'default'); 7607ac75b1Sopenharmony_ci } else if (ts.isNamedImports(binding) && binding.elements && binding.elements.length > 0) { 7707ac75b1Sopenharmony_ci processNamedImports(binding.elements, symbol, source); 7807ac75b1Sopenharmony_ci } 7907ac75b1Sopenharmony_ci } 8007ac75b1Sopenharmony_ci } 8107ac75b1Sopenharmony_ci} 8207ac75b1Sopenharmony_ci 8307ac75b1Sopenharmony_cifunction processNamedImports(elements, symbol, source) { 8407ac75b1Sopenharmony_ci elements.forEach(element => { 8507ac75b1Sopenharmony_ci if (ts.isImportSpecifier(element)) { 8607ac75b1Sopenharmony_ci const name = element.name.getText(); 8707ac75b1Sopenharmony_ci const bindingsName = element.propertyName ? element.propertyName.getText() : name; 8807ac75b1Sopenharmony_ci addSymbol(symbol, name, source, bindingsName); 8907ac75b1Sopenharmony_ci } 9007ac75b1Sopenharmony_ci }); 9107ac75b1Sopenharmony_ci} 9207ac75b1Sopenharmony_ci 9307ac75b1Sopenharmony_cifunction addSymbol(symbol, name, source, bindings) { 9407ac75b1Sopenharmony_ci symbol[name] = { 9507ac75b1Sopenharmony_ci source: source, 9607ac75b1Sopenharmony_ci bindings: bindings 9707ac75b1Sopenharmony_ci }; 9807ac75b1Sopenharmony_ci} 9907ac75b1Sopenharmony_ci 10007ac75b1Sopenharmony_cifunction readFile(dir, fileDir) { 10107ac75b1Sopenharmony_ci const files = fs.readdirSync(dir); 10207ac75b1Sopenharmony_ci files.forEach((element) => { 10307ac75b1Sopenharmony_ci const filePath = path.join(dir, element); 10407ac75b1Sopenharmony_ci const status = fs.statSync(filePath); 10507ac75b1Sopenharmony_ci if (status.isDirectory()) { 10607ac75b1Sopenharmony_ci readFile(filePath, fileDir); 10707ac75b1Sopenharmony_ci } else { 10807ac75b1Sopenharmony_ci fileDir.push(filePath); 10907ac75b1Sopenharmony_ci } 11007ac75b1Sopenharmony_ci }); 11107ac75b1Sopenharmony_ci} 11207ac75b1Sopenharmony_ci 11307ac75b1Sopenharmony_cifunction readSystemApis(dir, fileDir) { 11407ac75b1Sopenharmony_ci const files = fs.readdirSync(dir); 11507ac75b1Sopenharmony_ci files.forEach(file => { 11607ac75b1Sopenharmony_ci const filePath = path.join(dir, file); 11707ac75b1Sopenharmony_ci const status = fs.statSync(filePath); 11807ac75b1Sopenharmony_ci if (!status.isDirectory()) { 11907ac75b1Sopenharmony_ci fileDir.push(file); 12007ac75b1Sopenharmony_ci } 12107ac75b1Sopenharmony_ci }); 12207ac75b1Sopenharmony_ci} 12307ac75b1Sopenharmony_ci 12407ac75b1Sopenharmony_cifunction mkDir(filePath) { 12507ac75b1Sopenharmony_ci const parent = path.join(filePath, '..'); 12607ac75b1Sopenharmony_ci if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) { 12707ac75b1Sopenharmony_ci mkDir(parent); 12807ac75b1Sopenharmony_ci } 12907ac75b1Sopenharmony_ci fs.mkdirSync(filePath); 13007ac75b1Sopenharmony_ci} 13107ac75b1Sopenharmony_ci 13207ac75b1Sopenharmony_cifunction removeDir(path) { 13307ac75b1Sopenharmony_ci if (fs.existsSync(path)) { 13407ac75b1Sopenharmony_ci fs.rmdirSync(path, {recursive: true}); 13507ac75b1Sopenharmony_ci } 13607ac75b1Sopenharmony_ci} 13707ac75b1Sopenharmony_ci 13807ac75b1Sopenharmony_cifunction createKitConfigs(fileName, content) { 13907ac75b1Sopenharmony_ci fs.writeFile(fileName, content, err => { 14007ac75b1Sopenharmony_ci if (err) { 14107ac75b1Sopenharmony_ci console.error(err); 14207ac75b1Sopenharmony_ci return; 14307ac75b1Sopenharmony_ci } 14407ac75b1Sopenharmony_ci }); 14507ac75b1Sopenharmony_ci} 14607ac75b1Sopenharmony_ci 14707ac75b1Sopenharmony_cigenerateKitConfig(process.argv[SECOND_PARAM], process.argv[THIRD_PARAM], process.argv[FOURTH_PARAM], process.argv[FIFTH_PARAM]); 148