cis-api-tool
Version:
根据 swagger/yapi/apifox 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。
179 lines (175 loc) • 7.24 kB
JavaScript
#!/usr/bin/env node
const require_chunk = require('./chunk-nOFOJqeH.js');
require('./swaggerJsonToYApiData-DMCRZnWF.js');
require('./apifox-PMgYeCjV.js');
require('./ApifoxToYApiServer-PYQ3pvnI.js');
const require_function = require('./function-Cr5WSwXg.js');
require('./types-ufzJEJtt.js');
require('./helpers-CkwKrNWm.js');
require('./utils-pVoOHgaY.js');
require('./SwaggerToYApiServer-DmRkv1M-.js');
const require_Generator = require('./Generator-DsA_IvU1.js');
const ts_node = require_chunk.__toESM(require("ts-node"));
const consola = require_chunk.__toESM(require("consola"));
const fs_extra = require_chunk.__toESM(require("fs-extra"));
const ora = require_chunk.__toESM(require("ora"));
const path = require_chunk.__toESM(require("path"));
const prompts = require_chunk.__toESM(require("prompts"));
const yargs = require_chunk.__toESM(require("yargs"));
//#region src/cli.ts
ts_node.register({
skipProject: true,
transpileOnly: true,
compilerOptions: {
strict: false,
target: "es2017",
module: "commonjs",
moduleResolution: "node",
declaration: false,
removeComments: false,
esModuleInterop: true,
allowSyntheticDefaultImports: true,
importHelpers: false,
allowJs: true,
lib: ["ESNext"]
}
});
async function run(cmd, options) {
let useCustomConfigFile = false;
let cwd;
let configTSFile;
let configJSFile;
let configFile;
let configFileExist;
if (!options?.configFile) {
cwd = process.cwd();
configTSFile = path.default.join(cwd, "apiPower.config.ts");
configJSFile = path.default.join(cwd, "apiPower.config.js");
const configTSFileExist = await fs_extra.default.pathExists(configTSFile);
const configJSFileExist = !configTSFileExist && await fs_extra.default.pathExists(configJSFile);
configFileExist = configTSFileExist || configJSFileExist;
configFile = configTSFileExist ? configTSFile : configJSFile;
} else {
useCustomConfigFile = true;
configFile = options.configFile;
cwd = path.default.dirname(configFile);
configFileExist = await fs_extra.default.pathExists(configFile);
}
if (cmd === "help") console.log(`\n${require_function.dedent`
# 用法
初始化配置文件: apiPower init
生成代码: apiPower
查看帮助: apiPower help
# GitHub
https://github.com/x011223/cis-api-tool.git
`}\n`);
else if (cmd === "init") {
if (configFileExist) {
consola.default.info(`检测到配置文件: ${configFile}`);
const answers = await (0, prompts.default)({
message: "是否覆盖已有配置文件?",
name: "override",
type: "confirm"
});
if (!answers.override) return;
}
let outputConfigFile;
let outputConfigFileType;
if (useCustomConfigFile) {
outputConfigFile = configFile;
outputConfigFileType = configFile.endsWith(".js") ? "js" : "ts";
} else {
const answers = await (0, prompts.default)({
message: "选择配置文件类型?",
name: "configFileType",
type: "select",
choices: [{
title: "TypeScript(apiPower.config.ts)",
value: "ts"
}, {
title: "JavaScript(apiPower.config.js)",
value: "js"
}]
});
outputConfigFile = answers.configFileType === "js" ? configJSFile : configTSFile;
outputConfigFileType = answers.configFileType;
}
await fs_extra.default.outputFile(outputConfigFile, require_function.dedent`
import { defineConfig } from 'cis-api-tool'
export default defineConfig([
{
serverUrl: 'http://github.com/x011223/cis-api-tool',
serverType: 'swagger',
typesOnly: false,
target: '${outputConfigFileType === "js" ? "javascript" : "typescript"}',
reactHooks: {
enabled: false,
},
prodEnvName: 'production',
outputFilePath: 'src/api/index.${outputConfigFileType}',
requestFunctionFilePath: 'src/api/request.${outputConfigFileType}',
dataKey: 'data',
projects: [
{
token: 'hello',
categories: [
{
id: 0,
// getRequestFunctionName(interfaceInfo, changeCase) {
// 以接口全路径生成请求函数名
// return changeCase.camelCase(interfaceInfo.path)
// 若生成的请求函数名存在语法关键词报错、或想通过某个关键词触发 IDE 自动引入提示,可考虑加前缀,如:
// return changeCase.camelCase(\`api_\${interfaceInfo.path}\`)
// 若生成的请求函数名有重复报错,可考虑将接口请求方式纳入生成条件,如:
// return changeCase.camelCase(\`\${interfaceInfo.method}_\${interfaceInfo.path}\`)
// },
},
],
},
],
},
])
`);
consola.default.success("写入配置文件完毕");
} else {
if (!configFileExist) return consola.default.error(`找不到配置文件: ${useCustomConfigFile ? configFile : `${configTSFile} 或 ${configJSFile}`}`);
consola.default.success(`找到配置文件: ${configFile}`);
let config;
let generator;
let spinner;
try {
config = require(configFile).default;
generator = new require_Generator.Generator(config, { cwd });
await generator.cleanOutputDirectory();
consola.default.info(`清理outputDir下的文件,但保留requestFunctionFilePath指定的文件`);
spinner = (0, ora.default)("正在获取数据并生成代码...").start();
const delayNotice = require_function.wait(5e3);
delayNotice.then(() => {
spinner.text = `正在获取数据并生成代码... (若长时间处于此状态,请检查是否有接口定义的数据过大导致拉取或解析缓慢)`;
});
await generator.prepare();
delayNotice.cancel();
const output = await generator.generate();
spinner.stop();
consola.default.success("获取数据并生成代码完毕");
await generator.write(output);
consola.default.success("写入文件完毕");
await generator.destroy();
await config.hooks?.success?.();
} catch (err) {
spinner?.stop();
await generator?.destroy();
await config?.hooks?.fail?.();
/* istanbul ignore next */
consola.default.error(err);
}
await config?.hooks?.complete?.();
}
}
/* istanbul ignore next */
if (require.main === module) {
const argv = (0, yargs.default)(process.argv).alias("c", "config").argv;
run(argv._[2], { configFile: argv.config ? path.default.resolve(process.cwd(), argv.config) : void 0 });
}
//#endregion
exports.run = run;