UNPKG

cis-api-tool

Version:

根据 swagger/yapi/apifox 的接口定义生成 TypeScript/JavaScript 的接口类型及其请求函数代码。

179 lines (175 loc) 7.24 kB
#!/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;