mirror of
https://gitee.com/openharmony/developtools_ace_ets2bundle
synced 2024-11-23 08:29:55 +00:00
01cb28ff23
Signed-off-by: txdyyangbo <yangbo198@huawei.com>
148 lines
4.4 KiB
JavaScript
148 lines
4.4 KiB
JavaScript
/*
|
|
* Copyright (c) 2021-2022 Huawei Device Co., Ltd.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const ts = require('typescript');
|
|
const SECOND_PARAM = 2;
|
|
const THIRD_PARAM = 3;
|
|
const FOURTH_PARAM = 4;
|
|
const FIFTH_PARAM = 5;
|
|
const systemModules = [];
|
|
|
|
function generateKitConfig(kitFilePath, output, apiFilePath, arktsFilePath) {
|
|
readSystemApis(apiFilePath, systemModules);
|
|
readSystemApis(arktsFilePath, systemModules);
|
|
const kitFiles = [];
|
|
readFile(kitFilePath, kitFiles);
|
|
if (fs.existsSync(output)) {
|
|
removeDir(output);
|
|
}
|
|
mkDir(output);
|
|
kitFiles.forEach((item) => {
|
|
let content = fs.readFileSync(item, 'utf8');
|
|
const outputPath = path.resolve(output, path.basename(item).replace('.d.ts', '.json'));
|
|
const symbol = {};
|
|
const kitSourceFile = ts.createSourceFile(item, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
if (kitSourceFile.statements && kitSourceFile.statements.length > 0) {
|
|
kitSourceFile.statements.forEach(statement => {
|
|
getImportDeclarationInfo(statement, symbol);
|
|
});
|
|
}
|
|
const result = {
|
|
'symbols': symbol
|
|
};
|
|
const STANDARD_INDENT = 2;
|
|
createKitConfigs(outputPath, JSON.stringify(result, null, STANDARD_INDENT));
|
|
});
|
|
}
|
|
|
|
function getImportDeclarationInfo(statement, symbol) {
|
|
if (!ts.isImportDeclaration(statement)) {
|
|
return;
|
|
}
|
|
let source = '';
|
|
if (statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
source = statement.moduleSpecifier.getText().replace(/('|")*/g, '');
|
|
for (let i = 0; i < systemModules.length; i++) {
|
|
const moduleName = systemModules[i];
|
|
if (moduleName.replace(/(\.d\.ts|\.d\.ets)$/, '') === source) {
|
|
source = moduleName;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (statement.importClause) {
|
|
const clause = statement.importClause;
|
|
if (clause.name) {
|
|
addSymbol(symbol, clause.name.getText(), source, 'default');
|
|
}
|
|
if (clause.namedBindings) {
|
|
const binding = clause.namedBindings;
|
|
if (ts.isNamespaceImport(binding) && binding.name) {
|
|
addSymbol(symbol, binding.name.getText(), source, 'default');
|
|
} else if (ts.isNamedImports(binding) && binding.elements && binding.elements.length > 0) {
|
|
processNamedImports(binding.elements, symbol, source);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function processNamedImports(elements, symbol, source) {
|
|
elements.forEach(element => {
|
|
if (ts.isImportSpecifier(element)) {
|
|
const name = element.name.getText();
|
|
const bindingsName = element.propertyName ? element.propertyName.getText() : name;
|
|
addSymbol(symbol, name, source, bindingsName);
|
|
}
|
|
});
|
|
}
|
|
|
|
function addSymbol(symbol, name, source, bindings) {
|
|
symbol[name] = {
|
|
source: source,
|
|
bindings: bindings
|
|
};
|
|
}
|
|
|
|
function readFile(dir, fileDir) {
|
|
const files = fs.readdirSync(dir);
|
|
files.forEach((element) => {
|
|
const filePath = path.join(dir, element);
|
|
const status = fs.statSync(filePath);
|
|
if (status.isDirectory()) {
|
|
readFile(filePath, fileDir);
|
|
} else {
|
|
fileDir.push(filePath);
|
|
}
|
|
});
|
|
}
|
|
|
|
function readSystemApis(dir, fileDir) {
|
|
const files = fs.readdirSync(dir);
|
|
files.forEach(file => {
|
|
const filePath = path.join(dir, file);
|
|
const status = fs.statSync(filePath);
|
|
if (!status.isDirectory()) {
|
|
fileDir.push(file);
|
|
}
|
|
});
|
|
}
|
|
|
|
function mkDir(filePath) {
|
|
const parent = path.join(filePath, '..');
|
|
if (!(fs.existsSync(parent) && !fs.statSync(parent).isFile())) {
|
|
mkDir(parent);
|
|
}
|
|
fs.mkdirSync(filePath);
|
|
}
|
|
|
|
function removeDir(path) {
|
|
if (fs.existsSync(path)) {
|
|
fs.rmdirSync(path, {recursive: true});
|
|
}
|
|
}
|
|
|
|
function createKitConfigs(fileName, content) {
|
|
fs.writeFile(fileName, content, err => {
|
|
if (err) {
|
|
console.error(err);
|
|
return;
|
|
}
|
|
});
|
|
}
|
|
|
|
generateKitConfig(process.argv[SECOND_PARAM], process.argv[THIRD_PARAM], process.argv[FOURTH_PARAM], process.argv[FIFTH_PARAM]);
|