@@ -3,21 +3,23 @@ import { upperFirst, camelCase } from 'lodash-es';
33import { documentToMeta , type Metas } from './document-to-meta' ;
44import { methods } from './adapter' ;
55import prettier from 'prettier' ;
6+ import { generateComments } from './generate-comments' ;
67
78export 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 `
6870declare 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 `
105124var ${ 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+
132171export const generateContentTypeTpl = ( className : string , metas : Metas ) => {
133172 return `
134173 const contentTypes${ className } = {
0 commit comments