|
1 | | -import chalk from 'chalk'; |
2 | | -import { cosmiconfig } from 'cosmiconfig'; |
3 | 1 | import fs from 'fs/promises'; |
4 | 2 | import path from 'path'; |
5 | 3 | import { generateApi } from 'swagger-typescript-api'; |
6 | | -import { defineConfig } from './configure'; |
7 | 4 | import { axiosImportDefault, helpersImport, templatesDir } from './const'; |
8 | | -import { StrictConfig, Oas, UserConfig } from './types'; |
9 | | -import { exitError, normalizeError, tryCatch } from './utils'; |
| 5 | +import { Generated, GeneratedCallback, OasItem, OasItemAsSpec, OasItemAsUrl, StrictConfig } from './types'; |
10 | 6 |
|
11 | | -export async function generateItem(oas: Oas, config: StrictConfig) { |
12 | | - const { name, url, spec, axiosImport: axiosImportScope } = oas; |
| 7 | +export async function generateItem(oasItem: OasItem, config: StrictConfig): Promise<Generated> { |
| 8 | + const { name, axiosImport: axiosImportScope } = oasItem; |
13 | 9 | const { cwd, dest, axiosImport: axiosImportGlobal, unwrapResponseData } = config; |
14 | 10 | const axiosImport = axiosImportScope || axiosImportGlobal || axiosImportDefault; |
15 | 11 | const { files } = await generateApi({ |
16 | 12 | name, |
17 | | - url, |
18 | | - spec, |
| 13 | + url: (oasItem as OasItemAsUrl).url, |
| 14 | + spec: (oasItem as OasItemAsSpec).spec, |
19 | 15 | output: false, |
20 | 16 | httpClientType: 'axios', |
21 | 17 | templates: templatesDir, |
22 | 18 | silent: true, |
23 | 19 | unwrapResponseData, |
24 | 20 | }); |
25 | 21 |
|
| 22 | + const generated: Generated = { |
| 23 | + files: [], |
| 24 | + oasItem, |
| 25 | + config, |
| 26 | + }; |
| 27 | + |
26 | 28 | for (const { content, name: filename } of files) { |
27 | 29 | const contentFinal = [axiosImport, helpersImport, content].join('\n'); |
28 | 30 | const file = path.join(cwd, dest, filename); |
29 | 31 | const dir = path.dirname(file); |
30 | 32 |
|
31 | 33 | await fs.mkdir(dir, { recursive: true }); |
32 | 34 | await fs.writeFile(file, contentFinal); |
33 | | - } |
34 | | -} |
35 | 35 |
|
36 | | -export async function generate(config: StrictConfig) { |
37 | | - const { list } = config; |
38 | | - let step = 0; |
39 | | - const length = list.length; |
40 | | - const width = String(length).length; |
41 | | - |
42 | | - for (const oas of list) { |
43 | | - step++; |
44 | | - const stepText = String(step).padStart(width, '0'); |
45 | | - console.log(chalk.cyanBright(`[${stepText}/${length}]`), 'generating', chalk.yellow(oas.name)); |
46 | | - await generateItem(oas, config); |
| 36 | + generated.files.push(file); |
47 | 37 | } |
48 | | -} |
49 | 38 |
|
50 | | -export async function start() { |
51 | | - const explorer = cosmiconfig('oas', { |
52 | | - searchPlaces: ['oas.config.cjs', 'oas.config.js', 'oas.json'], |
53 | | - }); |
54 | | - const [err1, result] = await tryCatch(explorer.search()); |
| 39 | + return generated; |
| 40 | +} |
55 | 41 |
|
56 | | - if (err1) { |
57 | | - return exitError('配置文件查找失败'); |
58 | | - } |
| 42 | +export async function generate(config: StrictConfig, callback?: GeneratedCallback): Promise<Generated[]> { |
| 43 | + const { list, onGenerated } = config; |
| 44 | + let index = 0; |
| 45 | + const length = list.length; |
| 46 | + const generatedList: Generated[] = []; |
59 | 47 |
|
60 | | - if (!result) { |
61 | | - return exitError('配置文件未找到'); |
| 48 | + for (const oasItem of list) { |
| 49 | + const start = Date.now(); |
| 50 | + callback?.( |
| 51 | + { |
| 52 | + files: [], |
| 53 | + oasItem, |
| 54 | + config, |
| 55 | + }, |
| 56 | + { index, length, done: false, start, end: start } |
| 57 | + ); |
| 58 | + const generated = await generateItem(oasItem, config); |
| 59 | + generatedList.push(generated); |
| 60 | + onGenerated(generated); |
| 61 | + callback?.(generated, { index, length, done: true, start, end: Date.now() }); |
| 62 | + index++; |
62 | 63 | } |
63 | 64 |
|
64 | | - const config = result.filepath.endsWith('js') |
65 | | - ? // js 文件使用 defineConfig,返回的是 StrictConfig |
66 | | - (result.config as StrictConfig) |
67 | | - : // json 文件是纯文本,返回的 UserConfig |
68 | | - defineConfig(result.config as UserConfig); |
69 | | - |
70 | | - try { |
71 | | - await generate(config); |
72 | | - } catch (err) { |
73 | | - exitError(normalizeError(err).message); |
74 | | - } |
| 65 | + return generatedList; |
75 | 66 | } |
0 commit comments