Skip to content

Commit 2f84eea

Browse files
authored
Merge pull request #144 from FrontEndDev-org/feat/v0.x
Feat/v0.x
2 parents 691587d + fbf980b commit 2f84eea

File tree

11 files changed

+107
-148
lines changed

11 files changed

+107
-148
lines changed

.github/workflows/code-review.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ jobs:
2626
- uses: actions/checkout@v3
2727
- uses: ./.github/actions/node-env
2828
- run: npm ci
29-
- run: npm run test
29+
- run: npm run test:coverage
30+
- uses: codacy/codacy-coverage-reporter-action@v1
31+
with:
32+
api-token: ${{ secrets.CODACY_API_TOKEN }}
33+
coverage-reports: coverage/lcov.info

.github/workflows/release-please.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
- uses: actions/checkout@v3
3232
- uses: ./.github/actions/node-env
3333
- run: npm ci
34-
- run: npm run test-coverage
34+
- run: npm run test:coverage
3535
- uses: codacy/codacy-coverage-reporter-action@v1
3636
with:
3737
api-token: ${{ secrets.CODACY_API_TOKEN }}

README.md

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -132,24 +132,22 @@ generate({
132132

133133
# 配置
134134

135-
| 参数名 | 类型 | 可选性 | 描述 | 默认值 |
136-
| -------------------- | --------------- | ------- | --------------------------------------------------------------------------------- | ----------------------------------------------- |
137-
| `cwd` | `string` | `false` | 当前工作路径 | `process.cwd()` |
138-
| `dest` | `string` | `false` | 目标目录 | `src/apis` |
139-
| `axiosImport` | `string` | `false` | axios 导入内容 | 默认从官方 Axios 导入,可以使用自己实现的客户端 |
140-
| `unwrapResponseData` | `boolean` | `false` | 是否取消对 axios response 的包裹(即直接返回 ResponseData,而不是 AxiosResponse) | `false` |
141-
| `list` | `OpenApiSpec[]` | `false` | OpenAPI 规范声明列表 | `[]` |
142-
143-
`OpenApiSpec` 签名:
144-
145-
| 名称 | 类型 | 可选项 | 描述 | 默认值 |
146-
| ------------- | -------- | ------- | -------------------------------------- | --------------- |
147-
| `name` | `string` | `true` | 文件名,可以包含路径,相当于 dest 配置 | `process.cwd()` |
148-
| `axiosImport` | `string` | `false` | axios 导入内容,优先级更高 ||
149-
| `url` | `string` | `false` | 远程 openApi 描述地址 | `undefined` |
150-
| `spec` | `Spec` | `false` | 本地 OpenApi 描述文件 | `undefined` |
151-
152-
备注:`url` 属性和 `spec` 属性,至少有一个必须。
135+
| 参数名 | 类型 | 可选性 | 描述 | 默认值 |
136+
| -------------------- | ----------------- | ------- | --------------------------------------------------------------------------------- | ----------------------------------------------- |
137+
| `cwd` | `string` | `false` | 当前工作路径 | `process.cwd()` |
138+
| `dest` | `string` | `false` | 目标目录 | `src/apis` |
139+
| `axiosImport` | `string` | `false` | axios 导入内容 | 默认从官方 Axios 导入,可以使用自己实现的客户端 |
140+
| `unwrapResponseData` | `boolean` | `false` | 是否取消对 axios response 的包裹(即直接返回 ResponseData,而不是 AxiosResponse) | `false` |
141+
| `apis` | `OpenapiConfig[]` | `false` | OpenAPI 列表 <br/> <br/> | `[]` |
142+
143+
`OpenapiConfig` 签名:
144+
145+
| 名称 | 类型 | 可选项 | 描述 | 默认值 |
146+
| -------------------- | --------- | ------------ | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ----------- |
147+
| `name` | `string` | 必须 | openapi 的名称,将会生成 ${name}.ts 文件 | `undefined` |
148+
| `axiosImport` | `string` | 可选 | axios 导入内容,优先级更高 ||
149+
| `unwrapResponseData` | `boolean` | 可选 | 是否取消对 axios response 的包裹,优先级更高(即直接返回 ResponseData,而不是 <br/><br/>AxiosResponse) <br/> | `false` |
150+
| `schema` | `string | OpenApiSpec` | 必须 | openapi 的 schema,可以是一个链接地址,也可以是本地路径,也可以是一个对象 | `undefined` |
153151

154152
# 鸣谢
155153

package-lock.json

Lines changed: 1 addition & 74 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"prepare": "husky install",
77
"lint": "eslint src/**/*.ts && tsc --project tsconfig.json --noEmit",
88
"test": "vitest run",
9-
"test-coverage": "vitest run --coverage",
9+
"test:coverage": "vitest run --coverage",
1010
"build:types": "rm -rf dist-dts && tsc --project tsconfig.types.json",
1111
"build:files": "rm -rf dist-cjs dist-mjs && rollup --config",
1212
"build": "npm run build:types && npm run build:files"

src/commands.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export async function start(startConfig?: StartConfig) {
5151

5252
try {
5353
await generate(strictConfig, (generated, info) => {
54-
const { oasItem } = generated;
54+
const { openapi } = generated;
5555
const { index, length, done, start, end } = info;
5656
const width = Math.min(String(length).length, 2);
5757
const stepText = String(index + 1).padStart(width, '0');
@@ -61,14 +61,14 @@ export async function start(startConfig?: StartConfig) {
6161
console.log(
6262
chalk.cyanBright(`[${stepText}/${length}]`),
6363
'generated ',
64-
chalk.yellowBright(oasItem.name),
64+
chalk.yellowBright(openapi.name),
6565
chalk.gray(`${past}ms`)
6666
);
6767
} else {
6868
console.log(
6969
chalk.cyanBright(`[${stepText}/${length}]`),
7070
'generating',
71-
chalk.yellowBright(oasItem.name),
71+
chalk.yellowBright(openapi.name),
7272
chalk.gray('...')
7373
);
7474
}

src/configure.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const defaults: StrictConfig = {
66
dest: 'src/apis',
77
axiosImport: axiosImportDefault,
88
unwrapResponseData: false,
9-
list: [],
9+
apis: [],
1010
onGenerated: () => 0,
1111
};
1212

src/generator.ts

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,52 @@
11
import fs from 'fs/promises';
2+
import { isBoolean, isString } from 'lodash-es';
23
import path from 'path';
3-
import { generateApi } from 'swagger-typescript-api';
4+
import { generateApi, GenerateApiParams } from 'swagger-typescript-api';
45
import { axiosImportDefault, helpersImport, templatesDir } from './const';
5-
import {
6-
Generated,
7-
GeneratedCallback,
8-
OpenApiSpec,
9-
OpenApiSpecAsLocal,
10-
OpenApiSpecAsRemote,
11-
StrictConfig,
12-
} from './types';
6+
import { Generated, GeneratedCallback, OpenapiConfig, StrictConfig } from './types';
137

14-
export async function generateItem(oasItem: OpenApiSpec, config: StrictConfig): Promise<Generated> {
15-
const { name, axiosImport: axiosImportScope } = oasItem;
16-
const { cwd, dest, axiosImport: axiosImportGlobal, unwrapResponseData } = config;
17-
const axiosImport = axiosImportScope || axiosImportGlobal || axiosImportDefault;
18-
const { files } = await generateApi({
8+
export function generateParams(openapiConfig: OpenapiConfig, config: StrictConfig): GenerateApiParams {
9+
const { name, schema, unwrapResponseData: unwrapResponseDataScope } = openapiConfig;
10+
const { unwrapResponseData: unwrapResponseDataGlobal } = config;
11+
const unwrapResponseData = isBoolean(unwrapResponseDataScope) ? unwrapResponseDataScope : unwrapResponseDataGlobal;
12+
const common: Omit<GenerateApiParams, 'url' | 'input' | 'spec'> = {
1913
name,
20-
url: (oasItem as OpenApiSpecAsRemote).url,
21-
spec: (oasItem as OpenApiSpecAsLocal).spec,
2214
output: false,
2315
httpClientType: 'axios',
2416
templates: templatesDir,
2517
silent: true,
2618
unwrapResponseData,
27-
});
19+
};
20+
21+
if (isString(schema)) {
22+
if (/^https:\/\//i.test(schema)) {
23+
return {
24+
...common,
25+
url: schema,
26+
};
27+
} else {
28+
return {
29+
...common,
30+
input: schema,
31+
};
32+
}
33+
} else {
34+
return {
35+
...common,
36+
spec: schema,
37+
};
38+
}
39+
}
2840

41+
export async function generateItem(openapiConfig: OpenapiConfig, config: StrictConfig): Promise<Generated> {
42+
const { axiosImport: axiosImportScope, schema } = openapiConfig;
43+
const { cwd, dest, axiosImport: axiosImportGlobal, unwrapResponseData } = config;
44+
const axiosImport = axiosImportScope || axiosImportGlobal || axiosImportDefault;
45+
const params = generateParams(openapiConfig, config);
46+
const { files } = await generateApi(params);
2947
const generated: Generated = {
3048
files: [],
31-
oasItem,
49+
openapi: openapiConfig,
3250
config,
3351
};
3452

@@ -47,17 +65,17 @@ export async function generateItem(oasItem: OpenApiSpec, config: StrictConfig):
4765
}
4866

4967
export async function generate(config: StrictConfig, callback?: GeneratedCallback): Promise<Generated[]> {
50-
const { list, onGenerated } = config;
68+
const { apis, onGenerated } = config;
5169
let index = 0;
52-
const length = list.length;
70+
const length = apis.length;
5371
const generatedList: Generated[] = [];
5472

55-
for (const oasItem of list) {
73+
for (const oasItem of apis) {
5674
const start = Date.now();
5775
callback?.(
5876
{
5977
files: [],
60-
oasItem,
78+
openapi: oasItem,
6179
config,
6280
},
6381
{ index, length, done: false, start, end: start }

src/types.ts

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,31 @@
1-
interface OpenApiSpecBase {
1+
export type OpenapiSpec = import('swagger-schema-official').Spec;
2+
3+
export type OpenapiConfig = {
4+
/**
5+
* openapi 的名称,将会生成 ${name}.ts 文件
6+
*/
27
name: string;
38

49
/**
5-
* 全局导入 axios 客户端,优先级低于每个 oas 配置,默认从 axios 官方导入,导入名称必须为 axios,例如
10+
* 导入 axios 客户端,默认从 axios 官方导入,导入名称必须为 axios,优先级高于全局配置,例如
611
* ```
712
* import { axios } from '@/utils/axios';
813
* ```
914
*/
1015
axiosImport?: string;
11-
}
1216

13-
export interface OpenApiSpecAsRemote extends OpenApiSpecBase {
14-
url: string;
15-
}
16-
17-
export type Spec = import('swagger-schema-official').Spec;
18-
19-
export interface OpenApiSpecAsLocal extends OpenApiSpecBase {
20-
spec: Spec;
21-
}
17+
/**
18+
* 是否取消包装 data,默认 undefined,优先级高于全局配置
19+
* false = 返回值就是响应(response),response.data 才是实际值
20+
* true = 返回值就是数据
21+
*/
22+
unwrapResponseData?: boolean;
2223

23-
export type OpenApiSpec = OpenApiSpecAsRemote | OpenApiSpecAsLocal;
24+
/**
25+
* openapi 的 schema,可以是一个链接地址,也可以是本地路径,也可以是一个对象
26+
*/
27+
schema: string | OpenapiSpec;
28+
};
2429

2530
export interface UserConfig {
2631
/**
@@ -34,7 +39,7 @@ export interface UserConfig {
3439
dest?: string;
3540

3641
/**
37-
* 导入 axios 客户端,优先级高于全局配置,默认从 axios 官方导入,导入名称必须为 axios,例如
42+
* 默认从 axios 官方导入,导入名称必须为 axios,例如
3843
* ```
3944
* import { axios } from '@/utils/axios';
4045
* ```
@@ -56,9 +61,9 @@ export interface UserConfig {
5661
onGenerated?: (generated: Generated) => any;
5762

5863
/**
59-
* OpenApiSpec 列表
64+
* OpenapiConfig 列表
6065
*/
61-
list: OpenApiSpec[];
66+
apis: OpenapiConfig[];
6267
}
6368

6469
export type StrictConfig = Required<UserConfig>;
@@ -73,7 +78,7 @@ export enum ContentKind {
7378

7479
export interface Generated {
7580
files: string[];
76-
oasItem: OpenApiSpec;
81+
openapi: OpenapiConfig;
7782
config: StrictConfig;
7883
}
7984

test/configure.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ test('defaults', () => {
66
const axios = new Axios();`);
77
expect(defaults.dest).toBe('src/apis');
88
expect(defaults.cwd).toBe(process.cwd());
9-
expect(defaults.list).toHaveLength(0);
9+
expect(defaults.apis).toHaveLength(0);
1010
expect(defaults.unwrapResponseData).toBe(false);
1111
expect(defaults.onGenerated).toBeTypeOf('function');
1212
});
1313

1414
test('defineConfig', () => {
1515
const userConfig: UserConfig = {
16-
list: [],
16+
apis: [],
1717
};
1818
const strictConfig = defineConfig(userConfig);
1919

0 commit comments

Comments
 (0)