Skip to content

Commit e3748b5

Browse files
committed
feat: 新增method+uri生成方法
1 parent 1abe744 commit e3748b5

File tree

6 files changed

+215
-53
lines changed

6 files changed

+215
-53
lines changed

src/base-openapi-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export abstract class BaseOpenapiClient {
4444
return uri;
4545
}
4646

47-
protected request(uri: string, method: Methods, opts: BaseOpenapiClient.FullOpts) {
47+
protected request(uri: string, method: Methods, opts: BaseOpenapiClient.FullOpts = {}) {
4848
const contentTypes = this.getContentTypes(uri, method);
4949
const requestBodyType = opts.requestBodyType || contentTypes[0] || 'application/json';
5050
const responseType = opts.responseType || contentTypes[1] || 'json';

src/bin.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ spinner.add({
7373

7474
await Promise.all(
7575
ctx.configs.map(async (config, i) => {
76-
const result = await generateTemplate(ctx.docs[i]!, config.projectName);
76+
const result = await generateTemplate(
77+
ctx.docs[i]!,
78+
config.projectName,
79+
config.classMode || 'method',
80+
);
7781
ctx.projects = {
7882
...ctx.projects,
7983
...result,

src/define-config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ export interface OpenapiClientConfig {
2323
* 比如项目名为`demo`,则导出的类为`OpenapiClientDemo`
2424
*/
2525
projectName?: string;
26+
/**
27+
* 类的生成方式。默认值:`method`
28+
* - `method`,仅生成 `get|post|put|patch|delete` 几个方法,uri作为第一个参数传入
29+
* - `uri`,所有的 method+uri 都会重新拼接成一个方法,比如`postUsersById()`
30+
*/
31+
classMode?: 'method' | 'uri';
2632
}
2733

2834
export const defineConfig = (options: OpenapiClientConfig | OpenapiClientConfig[]) => {

src/lib/document-to-meta.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export type Metas = Record<
1616
body: { optional: boolean; types: string[] };
1717
response: { types: string[] };
1818
responseTypes: string[];
19+
description?: string;
20+
deprecated?: boolean;
1921
}[]
2022
>;
2123

@@ -40,6 +42,8 @@ export const documentToMeta = (docs: OpenAPIV3.Document) => {
4042
params: parseParameters(docs, pathItem, methodItem, 'path'),
4143
...parseRequestBody(docs, methodItem),
4244
...parseResponse(docs, methodItem),
45+
deprecated: methodItem.deprecated || false,
46+
description: methodItem.description || '',
4347
});
4448
});
4549
});

src/lib/generate-template.ts

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,23 @@ import { upperFirst, camelCase } from 'lodash-es';
33
import { documentToMeta, type Metas } from './document-to-meta';
44
import { methods } from './adapter';
55
import prettier from 'prettier';
6+
import { generateComments } from './generate-comments';
67

78
export const generateTemplate = async (
89
docs: OpenAPIV3.Document,
910
projectName: string = '',
11+
classMode: 'method' | 'uri',
1012
) => {
1113
const className = `OpenapiClient${upperFirst(camelCase(projectName))}`;
1214
const metas = documentToMeta(docs);
1315
const dts = `
1416
${generateNamespaceTpl(className, metas)}
15-
${generateClassForDTS(className, metas)}
17+
${classMode === 'method' ? generateMethodModeClassForDTS(className, metas) : generateUriModelClassForDTS(className, metas)}
1618
${generatePathRelationTpl(className, metas)}
1719
`;
1820

1921
const js = `
20-
${generateClassForJS(className)}
22+
${classMode === 'method' ? generateMethodModeClassForJS(className) : generateUriModeClassForJS(className, metas)}
2123
${generateContentTypeTpl(className, metas)}
2224
`;
2325

@@ -63,7 +65,7 @@ declare namespace ${className} {
6365
}`;
6466
};
6567

66-
export const generateClassForDTS = (className: string, metas: Metas) => {
68+
export const generateMethodModeClassForDTS = (className: string, metas: Metas) => {
6769
return `
6870
declare class ${className} extends BaseOpenapiClient {
6971
${methods
@@ -96,31 +98,48 @@ declare class ${className} extends BaseOpenapiClient {
9698
BaseOpenapiClient.UserInputOpts['requestBodyType'],
9799
BaseOpenapiClient.UserInputOpts['responseType'],
98100
];
99-
}
100-
`;
101+
}`;
102+
};
103+
104+
export const generateUriModelClassForDTS = (className: string, metas: Metas) => {
105+
return `
106+
declare class ${className} extends BaseOpenapiClient {
107+
${methods
108+
.flatMap((method) => {
109+
return metas[method].map((meta) => {
110+
const optional =
111+
meta.query.optional && meta.params.optional && meta.body.optional;
112+
113+
return `
114+
${generateComments(meta)}
115+
${camelCase(meta.key)}(opts${optional ? '?' : ''}: ${className}_${method}_paths['${meta.uri}']['request']): Promise<${className}_${method}_paths['${meta.uri}']['response']>`;
116+
});
117+
})
118+
.join('\n')}
119+
}`;
101120
};
102121

103-
export const generateClassForJS = (className: string) => {
122+
export const generateMethodModeClassForJS = (className: string) => {
104123
return `
105124
var ${className} = class extends BaseOpenapiClient {
106-
get(uri, ...rest) {
107-
return this.request(uri, "get", rest[0] || {});
125+
get(uri, opts) {
126+
return this.request(uri, "get", opts);
108127
}
109128
110-
post(uri, ...rest) {
111-
return this.request(uri, "post", rest[0] || {});
129+
post(uri, opts) {
130+
return this.request(uri, "post", opts);
112131
}
113132
114-
put(uri, ...rest) {
115-
return this.request(uri, "put", rest[0] || {});
133+
put(uri, opts) {
134+
return this.request(uri, "put", opts);
116135
}
117136
118-
patch(uri, ...rest) {
119-
return this.request(uri, "patch", rest[0] || {});
137+
patch(uri, opts) {
138+
return this.request(uri, "patch", opts);
120139
}
121140
122-
delete(uri, ...rest) {
123-
return this.request(uri, "delete", rest[0] || {});
141+
delete(uri, opts) {
142+
return this.request(uri, "delete", opts);
124143
}
125144
126145
getContentTypes(uri, method) {
@@ -129,6 +148,26 @@ var ${className} = class extends BaseOpenapiClient {
129148
};`;
130149
};
131150

151+
export const generateUriModeClassForJS = (className: string, metas: Metas) => {
152+
return `
153+
var ${className} = class extends BaseOpenapiClient {
154+
${methods
155+
.flatMap((method) => {
156+
return metas[method].map((meta) => {
157+
return `
158+
${camelCase(meta.key)}(opts) {
159+
return this.request('${meta.uri}', "${method}", opts);
160+
}`;
161+
});
162+
})
163+
.join('\n')}
164+
165+
getContentTypes(uri, method) {
166+
return contentTypes${className}[method + " " + uri] || [void 0, void 0];
167+
}
168+
};`;
169+
};
170+
132171
export const generateContentTypeTpl = (className: string, metas: Metas) => {
133172
return `
134173
const contentTypes${className} = {

0 commit comments

Comments
 (0)