yapi-apifox-to-typescript 4.2.2 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cjs/cli.js CHANGED
@@ -1,285 +1,176 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
-
4
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
-
6
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
7
-
8
- exports.__esModule = true;
9
- exports.run = run;
10
-
11
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
12
-
13
- var _taggedTemplateLiteralLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose"));
14
-
15
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
16
-
17
- var TSNode = _interopRequireWildcard(require("ts-node"));
18
-
19
- var _consola = _interopRequireDefault(require("consola"));
20
-
21
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
22
-
23
- var _ora = _interopRequireDefault(require("ora"));
24
-
25
- var _path = _interopRequireDefault(require("path"));
26
-
27
- var _prompts = _interopRequireDefault(require("prompts"));
28
-
29
- var _yargs = _interopRequireDefault(require("yargs"));
30
-
31
- var _vtils = require("vtils");
32
-
33
- var _Generator = require("./Generator");
34
-
35
- var _templateObject, _templateObject2;
36
-
37
- TSNode.register({
38
- // 不加载本地的 tsconfig.json
39
- skipProject: true,
40
- // 仅转译,不做类型检查
41
- transpileOnly: true,
42
- // 自定义编译选项
43
- compilerOptions: {
44
- strict: false,
45
- target: 'es2017',
46
- module: 'commonjs',
47
- moduleResolution: 'node',
48
- declaration: false,
49
- removeComments: false,
50
- esModuleInterop: true,
51
- allowSyntheticDefaultImports: true,
52
- importHelpers: false,
53
- // 转换 js,支持在 ytt.config.js 里使用最新语法
54
- allowJs: true,
55
- lib: ['es2017']
56
- }
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_runtime = require("./_virtual/_rolldown/runtime.js");
4
+ const require_mini_ut = require("./mini-ut.js");
5
+ const require_Generator = require("./Generator.js");
6
+ let ts_node = require("ts-node");
7
+ ts_node = require_runtime.__toESM(ts_node);
8
+ let consola = require("consola");
9
+ consola = require_runtime.__toESM(consola);
10
+ let fs_extra = require("fs-extra");
11
+ fs_extra = require_runtime.__toESM(fs_extra);
12
+ let ora = require("ora");
13
+ ora = require_runtime.__toESM(ora);
14
+ let path = require("path");
15
+ path = require_runtime.__toESM(path);
16
+ let prompts = require("prompts");
17
+ prompts = require_runtime.__toESM(prompts);
18
+ let yargs = require("yargs");
19
+ yargs = require_runtime.__toESM(yargs);
20
+ //#region src/cli.ts
21
+ ts_node.register({
22
+ skipProject: true,
23
+ transpileOnly: true,
24
+ compilerOptions: {
25
+ strict: false,
26
+ target: "es2017",
27
+ module: "commonjs",
28
+ moduleResolution: "node",
29
+ declaration: false,
30
+ removeComments: false,
31
+ esModuleInterop: true,
32
+ allowSyntheticDefaultImports: true,
33
+ importHelpers: false,
34
+ allowJs: true,
35
+ lib: ["es2017"]
36
+ }
57
37
  });
58
-
59
- function run(_x, _x2) {
60
- return _run.apply(this, arguments);
38
+ async function run(cmd, options) {
39
+ let useCustomConfigFile = false;
40
+ let cwd;
41
+ let configTSFile;
42
+ let configJSFile;
43
+ let configFile;
44
+ let configFileExist;
45
+ if (!options?.configFile) {
46
+ cwd = process.cwd();
47
+ configTSFile = path.default.join(cwd, "ytt.config.ts");
48
+ configJSFile = path.default.join(cwd, "ytt.config.js");
49
+ const configTSFileExist = await fs_extra.default.pathExists(configTSFile);
50
+ const configJSFileExist = !configTSFileExist && await fs_extra.default.pathExists(configJSFile);
51
+ configFileExist = configTSFileExist || configJSFileExist;
52
+ configFile = configTSFileExist ? configTSFile : configJSFile;
53
+ } else {
54
+ useCustomConfigFile = true;
55
+ configFile = options.configFile;
56
+ cwd = path.default.dirname(configFile);
57
+ configFileExist = await fs_extra.default.pathExists(configFile);
58
+ }
59
+ if (cmd === "help") console.log(`\n${require_mini_ut.dedent`
60
+ # 用法
61
+ 初始化配置文件: ytt init
62
+ 生成代码: ytt
63
+ 查看帮助: ytt help
64
+
65
+ # GitHub
66
+ https://github.com/kekexunxun/yapi-to-typescript
67
+ `}\n`);
68
+ else if (cmd === "init") {
69
+ if (configFileExist) {
70
+ consola.default.info(`检测到配置文件: ${configFile}`);
71
+ if (!(await (0, prompts.default)({
72
+ message: "是否覆盖已有配置文件?",
73
+ name: "override",
74
+ type: "confirm"
75
+ })).override) return;
76
+ }
77
+ let outputConfigFile;
78
+ let outputConfigFileType;
79
+ if (useCustomConfigFile) {
80
+ outputConfigFile = configFile;
81
+ outputConfigFileType = configFile.endsWith(".js") ? "js" : "ts";
82
+ } else {
83
+ const answers = await (0, prompts.default)({
84
+ message: "选择配置文件类型?",
85
+ name: "configFileType",
86
+ type: "select",
87
+ choices: [{
88
+ title: "TypeScript(ytt.config.ts)",
89
+ value: "ts"
90
+ }, {
91
+ title: "JavaScript(ytt.config.js)",
92
+ value: "js"
93
+ }]
94
+ });
95
+ outputConfigFile = answers.configFileType === "js" ? configJSFile : configTSFile;
96
+ outputConfigFileType = answers.configFileType;
97
+ }
98
+ await fs_extra.default.outputFile(outputConfigFile, require_mini_ut.dedent`
99
+ import { defineConfig } from 'yapi-apifox-to-typescript'
100
+
101
+ export default defineConfig([
102
+ {
103
+ serverUrl: 'http://foo.bar',
104
+ typesOnly: false,
105
+ target: '${outputConfigFileType === "js" ? "javascript" : "typescript"}',
106
+ reactHooks: {
107
+ enabled: false,
108
+ },
109
+ prodEnvName: 'production',
110
+ outputFilePath: 'src/api/index.${outputConfigFileType}',
111
+ requestFunctionFilePath: 'src/api/request.${outputConfigFileType}',
112
+ dataKey: 'data',
113
+ projects: [
114
+ {
115
+ token: 'hello',
116
+ categories: [
117
+ {
118
+ id: 0,
119
+ getRequestFunctionName(interfaceInfo, changeCase) {
120
+ // 以接口全路径生成请求函数名
121
+ return changeCase.camelCase(interfaceInfo.path)
122
+
123
+ // 若生成的请求函数名存在语法关键词报错、或想通过某个关键词触发 IDE 自动引入提示,可考虑加前缀,如:
124
+ // return changeCase.camelCase(\`api_\${interfaceInfo.path}\`)
125
+
126
+ // 若生成的请求函数名有重复报错,可考虑将接口请求方式纳入生成条件,如:
127
+ // return changeCase.camelCase(\`\${interfaceInfo.method}_\${interfaceInfo.path}\`)
128
+ },
129
+ },
130
+ ],
131
+ },
132
+ ],
133
+ },
134
+ ])
135
+ `);
136
+ consola.default.success("写入配置文件完毕");
137
+ } else {
138
+ if (!configFileExist) return consola.default.error(`找不到配置文件: ${useCustomConfigFile ? configFile : `${configTSFile} 或 ${configJSFile}`}`);
139
+ consola.default.success(`找到配置文件: ${configFile}`);
140
+ let config;
141
+ let generator;
142
+ let spinner;
143
+ try {
144
+ config = require(configFile).default;
145
+ generator = new require_Generator.Generator(config, { cwd });
146
+ spinner = (0, ora.default)("正在获取数据并生成代码...").start();
147
+ const delayNotice = require_mini_ut.wait(5e3);
148
+ delayNotice.then(() => {
149
+ spinner.text = `正在获取数据并生成代码... (若长时间处于此状态,请检查是否有接口定义的数据过大导致拉取或解析缓慢)`;
150
+ });
151
+ await generator.prepare();
152
+ delayNotice.cancel();
153
+ const output = await generator.generate();
154
+ spinner.stop();
155
+ consola.default.success("获取数据并生成代码完毕");
156
+ await generator.write(output);
157
+ consola.default.success("写入文件完毕");
158
+ await generator.destroy();
159
+ await config.hooks?.success?.();
160
+ } catch (err) {
161
+ spinner?.stop();
162
+ await generator?.destroy();
163
+ await config?.hooks?.fail?.();
164
+ /* istanbul ignore next */
165
+ consola.default.error(err);
166
+ }
167
+ await config?.hooks?.complete?.();
168
+ }
61
169
  }
62
170
  /* istanbul ignore next */
63
-
64
-
65
- function _run() {
66
- _run = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(cmd, options) {
67
- var useCustomConfigFile, cwd, configTSFile, configJSFile, configFile, configFileExist, configTSFileExist, configJSFileExist, answers, outputConfigFile, outputConfigFileType, _answers, _config2, _config2$hooks, config, generator, spinner, _hooks, delayNotice, output, _spinner, _generator, _config, _config$hooks;
68
-
69
- return _regenerator.default.wrap(function _callee$(_context) {
70
- while (1) {
71
- switch (_context.prev = _context.next) {
72
- case 0:
73
- useCustomConfigFile = false;
74
-
75
- if (options != null && options.configFile) {
76
- _context.next = 18;
77
- break;
78
- }
79
-
80
- cwd = process.cwd();
81
- configTSFile = _path.default.join(cwd, 'ytt.config.ts');
82
- configJSFile = _path.default.join(cwd, 'ytt.config.js');
83
- _context.next = 7;
84
- return _fsExtra.default.pathExists(configTSFile);
85
-
86
- case 7:
87
- configTSFileExist = _context.sent;
88
- _context.t0 = !configTSFileExist;
89
-
90
- if (!_context.t0) {
91
- _context.next = 13;
92
- break;
93
- }
94
-
95
- _context.next = 12;
96
- return _fsExtra.default.pathExists(configJSFile);
97
-
98
- case 12:
99
- _context.t0 = _context.sent;
100
-
101
- case 13:
102
- configJSFileExist = _context.t0;
103
- configFileExist = configTSFileExist || configJSFileExist;
104
- configFile = configTSFileExist ? configTSFile : configJSFile;
105
- _context.next = 24;
106
- break;
107
-
108
- case 18:
109
- useCustomConfigFile = true;
110
- configFile = options.configFile;
111
- cwd = _path.default.dirname(configFile);
112
- _context.next = 23;
113
- return _fsExtra.default.pathExists(configFile);
114
-
115
- case 23:
116
- configFileExist = _context.sent;
117
-
118
- case 24:
119
- if (!(cmd === 'help')) {
120
- _context.next = 28;
121
- break;
122
- }
123
-
124
- console.log("\n" + (0, _vtils.dedent)(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["\n # \u7528\u6CD5\n \u521D\u59CB\u5316\u914D\u7F6E\u6587\u4EF6: ytt init\n \u751F\u6210\u4EE3\u7801: ytt\n \u67E5\u770B\u5E2E\u52A9: ytt help\n\n # GitHub\n https://github.com/kekexunxun/yapi-to-typescript\n "]))) + "\n");
125
- _context.next = 87;
126
- break;
127
-
128
- case 28:
129
- if (!(cmd === 'init')) {
130
- _context.next = 51;
131
- break;
132
- }
133
-
134
- if (!configFileExist) {
135
- _context.next = 36;
136
- break;
137
- }
138
-
139
- _consola.default.info("\u68C0\u6D4B\u5230\u914D\u7F6E\u6587\u4EF6: " + configFile);
140
-
141
- _context.next = 33;
142
- return (0, _prompts.default)({
143
- message: '是否覆盖已有配置文件?',
144
- name: 'override',
145
- type: 'confirm'
146
- });
147
-
148
- case 33:
149
- answers = _context.sent;
150
-
151
- if (answers.override) {
152
- _context.next = 36;
153
- break;
154
- }
155
-
156
- return _context.abrupt("return");
157
-
158
- case 36:
159
- if (!useCustomConfigFile) {
160
- _context.next = 41;
161
- break;
162
- }
163
-
164
- outputConfigFile = configFile;
165
- outputConfigFileType = configFile.endsWith('.js') ? 'js' : 'ts';
166
- _context.next = 46;
167
- break;
168
-
169
- case 41:
170
- _context.next = 43;
171
- return (0, _prompts.default)({
172
- message: '选择配置文件类型?',
173
- name: 'configFileType',
174
- type: 'select',
175
- choices: [{
176
- title: 'TypeScript(ytt.config.ts)',
177
- value: 'ts'
178
- }, {
179
- title: 'JavaScript(ytt.config.js)',
180
- value: 'js'
181
- }]
182
- });
183
-
184
- case 43:
185
- _answers = _context.sent;
186
- outputConfigFile = _answers.configFileType === 'js' ? configJSFile : configTSFile;
187
- outputConfigFileType = _answers.configFileType;
188
-
189
- case 46:
190
- _context.next = 48;
191
- return _fsExtra.default.outputFile(outputConfigFile, (0, _vtils.dedent)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["\n import { defineConfig } from 'yapi-apifox-to-typescript'\n\n export default defineConfig([\n {\n serverUrl: 'http://foo.bar',\n typesOnly: false,\n target: '", "',\n reactHooks: {\n enabled: false,\n },\n prodEnvName: 'production',\n outputFilePath: 'src/api/index.", "',\n requestFunctionFilePath: 'src/api/request.", "',\n dataKey: 'data',\n projects: [\n {\n token: 'hello',\n categories: [\n {\n id: 0,\n getRequestFunctionName(interfaceInfo, changeCase) {\n // \u4EE5\u63A5\u53E3\u5168\u8DEF\u5F84\u751F\u6210\u8BF7\u6C42\u51FD\u6570\u540D\n return changeCase.camelCase(interfaceInfo.path)\n\n // \u82E5\u751F\u6210\u7684\u8BF7\u6C42\u51FD\u6570\u540D\u5B58\u5728\u8BED\u6CD5\u5173\u952E\u8BCD\u62A5\u9519\u3001\u6216\u60F3\u901A\u8FC7\u67D0\u4E2A\u5173\u952E\u8BCD\u89E6\u53D1 IDE \u81EA\u52A8\u5F15\u5165\u63D0\u793A\uFF0C\u53EF\u8003\u8651\u52A0\u524D\u7F00\uFF0C\u5982:\n // return changeCase.camelCase(`api_${interfaceInfo.path}`)\n\n // \u82E5\u751F\u6210\u7684\u8BF7\u6C42\u51FD\u6570\u540D\u6709\u91CD\u590D\u62A5\u9519\uFF0C\u53EF\u8003\u8651\u5C06\u63A5\u53E3\u8BF7\u6C42\u65B9\u5F0F\u7EB3\u5165\u751F\u6210\u6761\u4EF6\uFF0C\u5982:\n // return changeCase.camelCase(`${interfaceInfo.method}_${interfaceInfo.path}`)\n },\n },\n ],\n },\n ],\n },\n ])\n "], ["\n import { defineConfig } from 'yapi-apifox-to-typescript'\n\n export default defineConfig([\n {\n serverUrl: 'http://foo.bar',\n typesOnly: false,\n target: '", "',\n reactHooks: {\n enabled: false,\n },\n prodEnvName: 'production',\n outputFilePath: 'src/api/index.", "',\n requestFunctionFilePath: 'src/api/request.", "',\n dataKey: 'data',\n projects: [\n {\n token: 'hello',\n categories: [\n {\n id: 0,\n getRequestFunctionName(interfaceInfo, changeCase) {\n // \u4EE5\u63A5\u53E3\u5168\u8DEF\u5F84\u751F\u6210\u8BF7\u6C42\u51FD\u6570\u540D\n return changeCase.camelCase(interfaceInfo.path)\n\n // \u82E5\u751F\u6210\u7684\u8BF7\u6C42\u51FD\u6570\u540D\u5B58\u5728\u8BED\u6CD5\u5173\u952E\u8BCD\u62A5\u9519\u3001\u6216\u60F3\u901A\u8FC7\u67D0\u4E2A\u5173\u952E\u8BCD\u89E6\u53D1 IDE \u81EA\u52A8\u5F15\u5165\u63D0\u793A\uFF0C\u53EF\u8003\u8651\u52A0\u524D\u7F00\uFF0C\u5982:\n // return changeCase.camelCase(\\`api_\\${interfaceInfo.path}\\`)\n\n // \u82E5\u751F\u6210\u7684\u8BF7\u6C42\u51FD\u6570\u540D\u6709\u91CD\u590D\u62A5\u9519\uFF0C\u53EF\u8003\u8651\u5C06\u63A5\u53E3\u8BF7\u6C42\u65B9\u5F0F\u7EB3\u5165\u751F\u6210\u6761\u4EF6\uFF0C\u5982:\n // return changeCase.camelCase(\\`\\${interfaceInfo.method}_\\${interfaceInfo.path}\\`)\n },\n },\n ],\n },\n ],\n },\n ])\n "])), outputConfigFileType === 'js' ? 'javascript' : 'typescript', outputConfigFileType, outputConfigFileType));
192
-
193
- case 48:
194
- _consola.default.success('写入配置文件完毕');
195
-
196
- _context.next = 87;
197
- break;
198
-
199
- case 51:
200
- if (configFileExist) {
201
- _context.next = 53;
202
- break;
203
- }
204
-
205
- return _context.abrupt("return", _consola.default.error("\u627E\u4E0D\u5230\u914D\u7F6E\u6587\u4EF6: " + (useCustomConfigFile ? configFile : configTSFile + " \u6216 " + configJSFile)));
206
-
207
- case 53:
208
- _consola.default.success("\u627E\u5230\u914D\u7F6E\u6587\u4EF6: " + configFile);
209
-
210
- _context.prev = 54;
211
- config = require(configFile).default;
212
- generator = new _Generator.Generator(config, {
213
- cwd: cwd
214
- });
215
- spinner = (0, _ora.default)('正在获取数据并生成代码...').start();
216
- delayNotice = (0, _vtils.wait)(5000);
217
- delayNotice.then(function () {
218
- spinner.text = "\u6B63\u5728\u83B7\u53D6\u6570\u636E\u5E76\u751F\u6210\u4EE3\u7801... (\u82E5\u957F\u65F6\u95F4\u5904\u4E8E\u6B64\u72B6\u6001\uFF0C\u8BF7\u68C0\u67E5\u662F\u5426\u6709\u63A5\u53E3\u5B9A\u4E49\u7684\u6570\u636E\u8FC7\u5927\u5BFC\u81F4\u62C9\u53D6\u6216\u89E3\u6790\u7F13\u6162)";
219
- });
220
- _context.next = 62;
221
- return generator.prepare();
222
-
223
- case 62:
224
- delayNotice.cancel();
225
- _context.next = 65;
226
- return generator.generate();
227
-
228
- case 65:
229
- output = _context.sent;
230
- spinner.stop();
231
-
232
- _consola.default.success('获取数据并生成代码完毕');
233
-
234
- _context.next = 70;
235
- return generator.write(output);
236
-
237
- case 70:
238
- _consola.default.success('写入文件完毕');
239
-
240
- _context.next = 73;
241
- return generator.destroy();
242
-
243
- case 73:
244
- _context.next = 75;
245
- return (_hooks = config.hooks) == null ? void 0 : _hooks.success == null ? void 0 : _hooks.success();
246
-
247
- case 75:
248
- _context.next = 85;
249
- break;
250
-
251
- case 77:
252
- _context.prev = 77;
253
- _context.t1 = _context["catch"](54);
254
- (_spinner = spinner) == null ? void 0 : _spinner.stop();
255
- _context.next = 82;
256
- return (_generator = generator) == null ? void 0 : _generator.destroy();
257
-
258
- case 82:
259
- _context.next = 84;
260
- return (_config = config) == null ? void 0 : (_config$hooks = _config.hooks) == null ? void 0 : _config$hooks.fail == null ? void 0 : _config$hooks.fail();
261
-
262
- case 84:
263
- /* istanbul ignore next */
264
- _consola.default.error(_context.t1);
265
-
266
- case 85:
267
- _context.next = 87;
268
- return (_config2 = config) == null ? void 0 : (_config2$hooks = _config2.hooks) == null ? void 0 : _config2$hooks.complete == null ? void 0 : _config2$hooks.complete();
269
-
270
- case 87:
271
- case "end":
272
- return _context.stop();
273
- }
274
- }
275
- }, _callee, null, [[54, 77]]);
276
- }));
277
- return _run.apply(this, arguments);
278
- }
279
-
280
171
  if (require.main === module) {
281
- var argv = (0, _yargs.default)(process.argv).alias('c', 'config').argv;
282
- run(argv._[2], {
283
- configFile: argv.config ? _path.default.resolve(process.cwd(), argv.config) : undefined
284
- });
285
- }
172
+ const argv = (0, yargs.default)(process.argv).help(false).version(false).alias("c", "config").parseSync();
173
+ run(argv._[2], { configFile: argv.config ? path.default.resolve(process.cwd(), argv.config) : void 0 });
174
+ }
175
+ //#endregion
176
+ exports.run = run;