161847f8eSopenharmony_ci/*
261847f8eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
361847f8eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
461847f8eSopenharmony_ci * you may not use this file except in compliance with the License.
561847f8eSopenharmony_ci * You may obtain a copy of the License at
661847f8eSopenharmony_ci *
761847f8eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
861847f8eSopenharmony_ci *
961847f8eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1061847f8eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1161847f8eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1261847f8eSopenharmony_ci * See the License for the specific language governing permissions and
1361847f8eSopenharmony_ci * limitations under the License.
1461847f8eSopenharmony_ci */
1561847f8eSopenharmony_ci
1661847f8eSopenharmony_ciconst { ApiCollector, MultiProjectApiCollector } = require('./api_collector');
1761847f8eSopenharmony_ciconst { Logger } = require('./utils');
1861847f8eSopenharmony_ciconst path = require('path');
1961847f8eSopenharmony_ciconst fs = require('fs');
2061847f8eSopenharmony_ci
2161847f8eSopenharmony_ciclass AppApiCollectorPlugin {
2261847f8eSopenharmony_ci  constructor() {
2361847f8eSopenharmony_ci    this.logTag = 'AppApiCollectorPlugin';
2461847f8eSopenharmony_ci  }
2561847f8eSopenharmony_ci  getPluginOptions() {
2661847f8eSopenharmony_ci    return {
2761847f8eSopenharmony_ci      name: 'api-collector',
2861847f8eSopenharmony_ci      version: '0.1.0',
2961847f8eSopenharmony_ci      description: 'collect api from app\'s source code.',
3061847f8eSopenharmony_ci      commands: [
3161847f8eSopenharmony_ci        {
3261847f8eSopenharmony_ci          isRequiredOption: false,
3361847f8eSopenharmony_ci          options: ['--app <string>', 'app root directory'],
3461847f8eSopenharmony_ci        },
3561847f8eSopenharmony_ci        {
3661847f8eSopenharmony_ci          isRequiredOption: false,
3761847f8eSopenharmony_ci          options: ['--appDir <string>', 'a path that contains multiple applications'],
3861847f8eSopenharmony_ci        },
3961847f8eSopenharmony_ci        {
4061847f8eSopenharmony_ci          isRequiredOption: false,
4161847f8eSopenharmony_ci          options: ['--sdk <string>', 'sdk path, need to specify the ets directory, e.g sdk-root/version/ets'],
4261847f8eSopenharmony_ci        },
4361847f8eSopenharmony_ci        {
4461847f8eSopenharmony_ci          isRequiredOption: false,
4561847f8eSopenharmony_ci          options: ['--sdkRoot <string>', 'sdk root path'],
4661847f8eSopenharmony_ci        },
4761847f8eSopenharmony_ci        {
4861847f8eSopenharmony_ci          isRequiredOption: false,
4961847f8eSopenharmony_ci          options: ['--output <string>', 'the path to output the report'],
5061847f8eSopenharmony_ci        },
5161847f8eSopenharmony_ci        {
5261847f8eSopenharmony_ci          isRequiredOption: false,
5361847f8eSopenharmony_ci          options: ['--format <json,excel>', 'format of the output report'],
5461847f8eSopenharmony_ci        },
5561847f8eSopenharmony_ci        {
5661847f8eSopenharmony_ci          isRequiredOption: false,
5761847f8eSopenharmony_ci          options: ['--scanTest', 'scan ohosTest'],
5861847f8eSopenharmony_ci        },
5961847f8eSopenharmony_ci        {
6061847f8eSopenharmony_ci          isRequiredOption: false,
6161847f8eSopenharmony_ci          options: ['--debug', 'output debug logs'],
6261847f8eSopenharmony_ci        },
6361847f8eSopenharmony_ci        {
6461847f8eSopenharmony_ci          isRequiredOption: false,
6561847f8eSopenharmony_ci          options: ['--noRepeat', 'apiInfos is not repeat']
6661847f8eSopenharmony_ci        }
6761847f8eSopenharmony_ci      ],
6861847f8eSopenharmony_ci    };
6961847f8eSopenharmony_ci  }
7061847f8eSopenharmony_ci
7161847f8eSopenharmony_ci  async start(argv) {
7261847f8eSopenharmony_ci    if (!this.checkArguments(argv)) {
7361847f8eSopenharmony_ci      return;
7461847f8eSopenharmony_ci    }
7561847f8eSopenharmony_ci    const startTime = Date.now();
7661847f8eSopenharmony_ci    if (argv.app) {
7761847f8eSopenharmony_ci      await this.scanSingleProject(argv);
7861847f8eSopenharmony_ci    } else if (argv.appDir) {
7961847f8eSopenharmony_ci      await this.scanMultiProject(argv);
8061847f8eSopenharmony_ci    } else if (argv.dir) {
8161847f8eSopenharmony_ci      await this.scanNonProject(argv);
8261847f8eSopenharmony_ci    } else {
8361847f8eSopenharmony_ci      Logger.info(this.logTag, 'see --help');
8461847f8eSopenharmony_ci    }
8561847f8eSopenharmony_ci    Logger.info(this.logTag, `elapsed time ${Date.now() - startTime}`);
8661847f8eSopenharmony_ci    if (argv.debug) {
8761847f8eSopenharmony_ci      Logger.flush(this.getLogPath(argv));
8861847f8eSopenharmony_ci    }
8961847f8eSopenharmony_ci  }
9061847f8eSopenharmony_ci
9161847f8eSopenharmony_ci  async scanSingleProject(argv) {
9261847f8eSopenharmony_ci    const collector = new ApiCollector(argv);
9361847f8eSopenharmony_ci    await collector.setLibPath(this.findLibPath()).setIncludeTest(argv.scanTest).start();
9461847f8eSopenharmony_ci  }
9561847f8eSopenharmony_ci
9661847f8eSopenharmony_ci  async scanMultiProject(argv) {
9761847f8eSopenharmony_ci    if (!argv.sdk) {
9861847f8eSopenharmony_ci      const collector = new MultiProjectApiCollector(argv);
9961847f8eSopenharmony_ci      await collector.setLibPath(this.findLibPath()).setIncludeTest(argv.scanTest).start();
10061847f8eSopenharmony_ci    } else {
10161847f8eSopenharmony_ci      Logger.error(this.logTag, '--appDir and --sdkRoot are used together, replace --sdk with --sdkRoot');
10261847f8eSopenharmony_ci    }
10361847f8eSopenharmony_ci  }
10461847f8eSopenharmony_ci
10561847f8eSopenharmony_ci  async scanNonProject(argv) {
10661847f8eSopenharmony_ci    if (!argv.sdk) {
10761847f8eSopenharmony_ci      Logger.error(this.logTag, 'the --sdk is required when scanning non-project');
10861847f8eSopenharmony_ci      return;
10961847f8eSopenharmony_ci    }
11061847f8eSopenharmony_ci    const apiCollector = new ApiCollector(argv);
11161847f8eSopenharmony_ci    await apiCollector.setLibPath(this.findLibPath()).start();
11261847f8eSopenharmony_ci  }
11361847f8eSopenharmony_ci
11461847f8eSopenharmony_ci  getLogPath(argv) {
11561847f8eSopenharmony_ci    if (argv.output) {
11661847f8eSopenharmony_ci      return argv.output;
11761847f8eSopenharmony_ci    }
11861847f8eSopenharmony_ci    if (argv.appDir) {
11961847f8eSopenharmony_ci      return argv.appDir;
12061847f8eSopenharmony_ci    }
12161847f8eSopenharmony_ci    if (argv.app) {
12261847f8eSopenharmony_ci      return argv.app;
12361847f8eSopenharmony_ci    }
12461847f8eSopenharmony_ci    return __dirname;
12561847f8eSopenharmony_ci  }
12661847f8eSopenharmony_ci
12761847f8eSopenharmony_ci  findLibPath() {
12861847f8eSopenharmony_ci    if (process.env.bundleMode) {
12961847f8eSopenharmony_ci      return path.resolve(__dirname, 'libs');
13061847f8eSopenharmony_ci    }
13161847f8eSopenharmony_ci    return path.resolve(__dirname, '..', 'libs');
13261847f8eSopenharmony_ci  }
13361847f8eSopenharmony_ci
13461847f8eSopenharmony_ci  stop() {
13561847f8eSopenharmony_ci
13661847f8eSopenharmony_ci  }
13761847f8eSopenharmony_ci
13861847f8eSopenharmony_ci  checkArguments(argv) {
13961847f8eSopenharmony_ci    if (argv.sdk) {
14061847f8eSopenharmony_ci      const apiPath = path.resolve(argv.sdk, 'api');
14161847f8eSopenharmony_ci      const componentPath = path.resolve(argv.sdk, 'component');
14261847f8eSopenharmony_ci      if (!fs.existsSync(apiPath) || !fs.existsSync(componentPath)) {
14361847f8eSopenharmony_ci        Logger.error(this.logTag, '--sdk option need to specify the ets directory');
14461847f8eSopenharmony_ci        return false;
14561847f8eSopenharmony_ci      }
14661847f8eSopenharmony_ci    }
14761847f8eSopenharmony_ci    return this.checkPathIsValid(argv.app) &&
14861847f8eSopenharmony_ci      this.checkPathIsValid(argv.output) &&
14961847f8eSopenharmony_ci      this.checkPathIsValid(argv.sdkRoot) &&
15061847f8eSopenharmony_ci      this.checkPathIsValid(argv.appDir);
15161847f8eSopenharmony_ci  }
15261847f8eSopenharmony_ci
15361847f8eSopenharmony_ci  checkPathIsValid(path) {
15461847f8eSopenharmony_ci    if (path && !fs.existsSync(path)) {
15561847f8eSopenharmony_ci      Logger.error(this.logTag, `${path} not exists`);
15661847f8eSopenharmony_ci      return false;
15761847f8eSopenharmony_ci    }
15861847f8eSopenharmony_ci    return true;
15961847f8eSopenharmony_ci  }
16061847f8eSopenharmony_ci}
16161847f8eSopenharmony_ci
16261847f8eSopenharmony_cimodule.exports = AppApiCollectorPlugin;