@@ -2,26 +2,36 @@ import type { OpenAPIV3 } from 'openapi-types';
22import { upperFirst , camelCase } from 'lodash-es' ;
33import { documentToMeta , type Metas } from './document-to-meta' ;
44import { methods } from './adapter' ;
5+ import prettier from 'prettier' ;
56
6- export const generateTemplate = ( docs : OpenAPIV3 . Document , projectName : string = '' ) => {
7- projectName = upperFirst ( camelCase ( projectName ) ) ;
8- const className = `OpenapiClient${ projectName } ` ;
7+ export const generateTemplate = async (
8+ docs : OpenAPIV3 . Document ,
9+ projectName : string = '' ,
10+ ) => {
11+ const className = `OpenapiClient${ upperFirst ( camelCase ( projectName ) ) } ` ;
912 const metas = documentToMeta ( docs ) ;
10- const tpl = `
11- import { BaseOpenapiClient } from './base-openapi-client';
12-
13+ const dts = `
1314 ${ generateNamespaceTpl ( className , metas ) }
14- ${ generateClassTpl ( className , metas ) }
15- ${ generateContentTypeTpl ( metas ) }
15+ ${ generateClassForDTS ( className , metas ) }
1616 ${ generatePathRelationTpl ( className , metas ) }
1717` ;
1818
19- return { [ projectName ] : tpl } ;
19+ const js = `
20+ ${ generateClassForJS ( className ) }
21+ ${ generateContentTypeTpl ( className , metas ) }
22+ ` ;
23+
24+ return {
25+ [ className ] : {
26+ dts : await prettier . format ( dts , { parser : 'typescript' } ) ,
27+ js : await prettier . format ( js , { parser : 'typescript' } ) ,
28+ } ,
29+ } ;
2030} ;
2131
2232export const generateNamespaceTpl = ( className : string , metas : Metas ) => {
2333 return `
24- export namespace ${ className } {
34+ declare namespace ${ className } {
2535 ${ methods
2636 . flatMap ( ( method ) => {
2737 let content = metas [ method ] . flatMap ( ( meta ) => {
@@ -30,7 +40,7 @@ export namespace ${className} {
3040 ( < const > [ 'query' , 'params' ] ) . forEach ( ( key ) => {
3141 const interfaceName = upperFirst ( camelCase ( meta . key + '_' + key ) ) ;
3242 if ( meta [ key ] . types . length ) {
33- opts . push ( `export interface ${ interfaceName } ${ meta [ key ] . types [ 0 ] } \n` ) ;
43+ opts . push ( `interface ${ interfaceName } ${ meta [ key ] . types [ 0 ] } \n` ) ;
3444 }
3545 } ) ;
3646
@@ -39,8 +49,8 @@ export namespace ${className} {
3949 if ( meta [ key ] . types . length ) {
4050 opts . push (
4151 meta [ key ] . types . length === 1
42- ? `export interface ${ interfaceName } ${ meta [ key ] . types } \n`
43- : `export type ${ interfaceName } = ${ meta [ key ] . types . join ( ' | ' ) } \n` ,
52+ ? `interface ${ interfaceName } ${ meta [ key ] . types } \n`
53+ : `type ${ interfaceName } = ${ meta [ key ] . types . join ( ' | ' ) } \n` ,
4454 ) ;
4555 }
4656 } ) ;
@@ -53,9 +63,9 @@ export namespace ${className} {
5363}` ;
5464} ;
5565
56- export const generateClassTpl = ( className : string , metas : Metas ) => {
66+ export const generateClassForDTS = ( className : string , metas : Metas ) => {
5767 return `
58- export class ${ className } extends BaseOpenapiClient {
68+ declare class ${ className } extends BaseOpenapiClient {
5969 ${ methods
6070 . map ( ( method ) => {
6171 if ( ! metas [ method ] . length ) return '' ;
@@ -78,22 +88,43 @@ export class ${className} extends BaseOpenapiClient {
7888
7989 return `${ method } <K extends keyof ${ className } _${ method } _paths>(
8090 uri: K, ...rest: ${ opts }
81- ): Promise<${ className } _${ method } _paths[K]['response']> {
82- return this.request(uri, '${ method } ', rest[0] || {});
83- }` ;
91+ ): Promise<${ className } _${ method } _paths[K]['response']>` ;
8492 } )
8593 . join ( '\n' ) }
8694
87- protected override getContentTypes(uri: string, method: string) {
88- return defaultContentTypes[uri + ' ' + method] || [void 0, void 0];
89- }
95+ protected getContentTypes(uri: string, method: string) : [
96+ BaseOpenapiClient.UserInputOpts['requestBodyType'],
97+ BaseOpenapiClient.UserInputOpts['responseType'],
98+ ];
9099}
91100 ` ;
92101} ;
93102
94- export const generateContentTypeTpl = ( metas : Metas ) => {
103+ export const generateClassForJS = ( className : string ) => {
104+ return `
105+ var ${ className } = class extends BaseOpenapiClient {
106+ get(uri, ...rest) {
107+ return this.request(uri, "get", rest[0] || {});
108+ }
109+ post(uri, ...rest) {
110+ return this.request(uri, "post", rest[0] || {});
111+ }
112+ put(uri, ...rest) {
113+ return this.request(uri, "put", rest[0] || {});
114+ }
115+ delete(uri, ...rest) {
116+ return this.request(uri, "delete", rest[0] || {});
117+ }
118+ getContentTypes(uri, method) {
119+ return contentTypes${ className } [uri + " " + method] || [void 0, void 0];
120+ }
121+ };
122+ ` ;
123+ } ;
124+
125+ export const generateContentTypeTpl = ( className : string , metas : Metas ) => {
95126 return `
96- const defaultContentTypes: Record<string, [BaseOpenapiClient.UserInputOpts['requestBodyType'], BaseOpenapiClient.UserInputOpts['responseType']]> = {
127+ const contentTypes ${ className } = {
97128 ${ methods
98129 . map ( ( method ) => {
99130 if ( ! metas [ method ] . length ) return '' ;
0 commit comments