11import type { OpenAPIV3 } from 'openapi-types' ;
2- import { upperFirst , camelCase } from 'lodash-es' ;
2+ import { upperFirst , camelCase , snakeCase } from 'lodash-es' ;
33import { documentToMeta , type Metas } from './document-to-meta' ;
44import { methods } from './adapter' ;
55import prettier from 'prettier' ;
66import { generateComments } from './generate-comments' ;
7+ import type { OpenapiClientConfig } from '../define-config' ;
78
89export const generateTemplate = async (
910 docs : OpenAPIV3 . Document ,
10- projectName : string = '' ,
11- classMode : 'method' | 'uri' ,
11+ config : Pick < OpenapiClientConfig , 'projectName' | 'classMode' | 'tagToGroup' > ,
1212) => {
13+ const { projectName, classMode = 'method' , tagToGroup = true } = config ;
1314 const className = `OpenapiClient${ upperFirst ( camelCase ( projectName ) ) } ` ;
1415 const metas = documentToMeta ( docs ) ;
16+
17+ const classTpl =
18+ classMode === 'method'
19+ ? generateMethodModeClass ( className , metas )
20+ : tagToGroup
21+ ? generateUriModelClassWithNamespace ( className , metas )
22+ : generateUriModelClass ( className , metas ) ;
23+
1524 const dts = `
1625 ${ generateNamespaceTpl ( className , metas ) }
17- ${ classMode === 'method' ? generateMethodModeClassForDTS ( className , metas ) : generateUriModelClassForDTS ( className , metas ) }
26+ ${ classTpl . dts }
1827 ${ generatePathRelationTpl ( className , metas ) }
1928` ;
2029
2130 const js = `
22- ${ classMode === 'method' ? generateMethodModeClassForJS ( className ) : generateUriModeClassForJS ( className , metas ) }
31+ ${ classTpl . js }
2332 ${ generateContentTypeTpl ( className , metas ) }
2433 ` ;
2534
@@ -65,8 +74,9 @@ declare namespace ${className} {
6574}` ;
6675} ;
6776
68- export const generateMethodModeClassForDTS = ( className : string , metas : Metas ) => {
69- return `
77+ export const generateMethodModeClass = ( className : string , metas : Metas ) => {
78+ return {
79+ dts : `
7080declare class ${ className } extends BaseOpenapiClient {
7181 ${ methods
7282 . map ( ( method ) => {
@@ -98,11 +108,28 @@ declare class ${className} extends BaseOpenapiClient {
98108 BaseOpenapiClient.UserInputOpts['requestBodyType'],
99109 BaseOpenapiClient.UserInputOpts['responseType'],
100110 ];
101- }` ;
111+ }` ,
112+ js : `
113+ var ${ className } = class extends BaseOpenapiClient {
114+ ${ methods
115+ . map ( ( method ) => {
116+ if ( ! metas [ method ] . length ) return '' ;
117+ return `${ method } (uri, opts) {
118+ return this.request(uri, "get", opts);
119+ }` ;
120+ } )
121+ . join ( '\n' ) }
122+
123+ getContentTypes(uri, method) {
124+ return contentTypes${ className } [method + " " + uri] || [void 0, void 0];
125+ }
126+ };` ,
127+ } ;
102128} ;
103129
104- export const generateUriModelClassForDTS = ( className : string , metas : Metas ) => {
105- return `
130+ export const generateUriModelClass = ( className : string , metas : Metas ) => {
131+ return {
132+ dts : `
106133declare class ${ className } extends BaseOpenapiClient {
107134 ${ methods
108135 . flatMap ( ( method ) => {
@@ -116,40 +143,13 @@ declare class ${className} extends BaseOpenapiClient {
116143 } ) ;
117144 } )
118145 . join ( '\n' ) }
119- }` ;
120- } ;
121146
122- export const generateMethodModeClassForJS = ( className : string ) => {
123- return `
124- var ${ className } = class extends BaseOpenapiClient {
125- get(uri, opts) {
126- return this.request(uri, "get", opts);
127- }
128-
129- post(uri, opts) {
130- return this.request(uri, "post", opts);
131- }
132-
133- put(uri, opts) {
134- return this.request(uri, "put", opts);
135- }
136-
137- patch(uri, opts) {
138- return this.request(uri, "patch", opts);
139- }
140-
141- delete(uri, opts) {
142- return this.request(uri, "delete", opts);
143- }
144-
145- getContentTypes(uri, method) {
146- return contentTypes${ className } [method + " " + uri] || [void 0, void 0];
147- }
148- };` ;
149- } ;
150-
151- export const generateUriModeClassForJS = ( className : string , metas : Metas ) => {
152- return `
147+ protected getContentTypes(uri: string, method: string) : [
148+ BaseOpenapiClient.UserInputOpts['requestBodyType'],
149+ BaseOpenapiClient.UserInputOpts['responseType'],
150+ ];
151+ }` ,
152+ js : `
153153var ${ className } = class extends BaseOpenapiClient {
154154 ${ methods
155155 . flatMap ( ( method ) => {
@@ -165,7 +165,71 @@ var ${className} = class extends BaseOpenapiClient {
165165 getContentTypes(uri, method) {
166166 return contentTypes${ className } [method + " " + uri] || [void 0, void 0];
167167 }
168- };` ;
168+ };` ,
169+ } ;
170+ } ;
171+
172+ export const generateUriModelClassWithNamespace = ( className : string , metas : Metas ) => {
173+ const namespaces = [
174+ ...new Set (
175+ methods . flatMap ( ( method ) => metas [ method ] . flatMap ( ( meta ) => meta . tags || [ ] ) ) ,
176+ ) ,
177+ ] ;
178+
179+ return {
180+ dts : `
181+ declare class ${ className } extends BaseOpenapiClient {
182+ ${ namespaces
183+ . map ( ( ns ) => {
184+ return `readonly ${ snakeCase ( ns ) } : {
185+ ${ methods
186+ . flatMap ( ( method ) => {
187+ return metas [ method ]
188+ . filter ( ( meta ) => meta . tags . includes ( ns ) )
189+ . map ( ( meta ) => {
190+ const optional =
191+ meta . query . optional && meta . params . optional && meta . body . optional ;
192+
193+ return `
194+ ${ generateComments ( meta ) }
195+ ${ camelCase ( meta . key ) } (opts${ optional ? '?' : '' } : ${ className } _${ method } _paths['${ meta . uri } ']['request']): Promise<${ className } _${ method } _paths['${ meta . uri } ']['response']>` ;
196+ } ) ;
197+ } )
198+ . join ( '\n' ) }
199+ }` ;
200+ } )
201+ . join ( '\n' ) }
202+
203+ protected getContentTypes(uri: string, method: string) : [
204+ BaseOpenapiClient.UserInputOpts['requestBodyType'],
205+ BaseOpenapiClient.UserInputOpts['responseType'],
206+ ];
207+ }` ,
208+ js : `
209+ var ${ className } = class extends BaseOpenapiClient {
210+ ${ namespaces
211+ . map ( ( ns ) => {
212+ return `${ snakeCase ( ns ) } = {
213+ ${ methods
214+ . flatMap ( ( method ) => {
215+ return metas [ method ]
216+ . filter ( ( meta ) => meta . tags . includes ( ns ) )
217+ . map ( ( meta ) => {
218+ return `${ camelCase ( meta . key ) } (opts) {
219+ return this.request('${ meta . uri } ', '${ method } ', opts);
220+ },` ;
221+ } ) ;
222+ } )
223+ . join ( '\n' ) }
224+ }` ;
225+ } )
226+ . join ( '\n' ) }
227+
228+ getContentTypes(uri, method) {
229+ return contentTypes${ className } [method + ' ' + uri] || [void 0, void 0];
230+ }
231+ };` ,
232+ } ;
169233} ;
170234
171235export const generateContentTypeTpl = ( className : string , metas : Metas ) => {
0 commit comments