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