@@ -108,98 +108,111 @@ function parseMethods(
108108 ( [ pathName , pathDef ] ) =>
109109 Object . entries ( pathDef )
110110 . filter (
111- ( [ methodType , operation ] ) =>
111+ ( [ methodType , operation ] : [ string , OpenAPIV2 . OperationObject ] ) =>
112112 supportedMethods . indexOf ( methodType ?. toUpperCase ( ) ) !== - 1 && // skip unsupported methods
113113 ( ! swaggerTag ||
114114 ( operation &&
115115 'tags' in operation &&
116- operation . tags . includes ( swaggerTag ) ) ) , // if tag exists take only paths including this tag
116+ operation . tags ? .includes ( swaggerTag ) ) ) , // if tag exists take only paths including this tag
117117 )
118- . map ( ( [ methodType , operation ] ) => {
119- // select the lowest success (code 20x) response
120- const successResponseCode =
121- ( 'responses' in operation &&
122- Object . keys ( operation . responses )
123- . slice ( )
124- . sort ( )
125- . filter ( code => code . startsWith ( '2' ) ) [ 0 ] ) ||
126- 'default' ;
127-
128- const okResponse = operation . responses [ successResponseCode ] ;
129-
130- const responseTypeSchema = determineResponseType (
131- okResponse && '$ref' in okResponse
132- ? responses [ dereferenceType ( okResponse . $ref ) ]
133- : okResponse ,
134- ) ;
135-
136- const transformedParams = transformParameters (
137- [ ...( pathDef . parameters || [ ] ) , ...( operation . parameters || [ ] ) ] ,
138- parameters || { } ,
139- ) ;
140-
141- const methodTypeLowered = methodType . toLowerCase ( ) as MethodType ;
142- const formData = transformedParams
143- . filter ( ( { name, isFormParameter } ) => name && isFormParameter )
144- . map ( ( { name, camelCaseName } ) => ( {
145- name,
146- camelCaseName : camelCaseName || name ,
147- } ) ) ;
148- const stringifyBody = ( param ?: Parameter ) =>
149- param ? `JSON.stringify(args.${ param . camelCaseName } )` : 'null' ;
150- const body = / ^ (?: p o s t | p u t | p a t c h ) \b / . test ( methodTypeLowered )
151- ? formData . length
152- ? 'formData'
153- : stringifyBody (
154- transformedParams . find (
155- ( { isBodyParameter } ) => isBodyParameter ,
156- ) ,
157- )
158- : undefined ;
159-
160- return {
161- hasJsonResponse : true ,
162- methodName : toCamelCase (
163- operation . operationId
164- ? ! swaggerTag
165- ? operation . operationId
166- : operation . operationId . replace ( `${ swaggerTag } _` , '' )
167- : `${ methodTypeLowered } _${ pathName . replace ( / [ { } ] / g, '' ) } ` ,
168- ) ,
169- methodType : methodTypeLowered ,
170- body,
171- parameters : transformedParams ,
172- paramsOptional : transformedParams . every (
173- ( { isRequired } ) => ! isRequired ,
174- ) ,
175- formData,
176- // turn path interpolation `{this}` into string template `${args.this}
177- path : pathName . replace (
178- / { ( .* ?) } / g,
179- ( _ : string , ...args : string [ ] ) : string =>
180- `\${args.${ toCamelCase ( args [ 0 ] ) } }` ,
181- ) ,
182- responseGuard : responseTypeSchema . guard ?.( 'response' ) ,
183- description : createDocsComment (
118+ . map (
119+ ( [ methodType , operation ] : [ string , OpenAPIV2 . OperationObject ] ) => {
120+ // select the lowest success (code 20x) response
121+ const successResponseCode =
122+ ( 'responses' in operation &&
123+ Object . keys ( operation . responses )
124+ . slice ( )
125+ . sort ( )
126+ . filter ( code => code . startsWith ( '2' ) ) [ 0 ] ) ||
127+ 'default' ;
128+
129+ const okResponse = operation . responses [ successResponseCode ] ;
130+
131+ const responseTypeSchema = determineResponseType (
132+ okResponse && '$ref' in okResponse
133+ ? responses [ dereferenceType ( okResponse . $ref ) ]
134+ : okResponse ,
135+ ) ;
136+
137+ const transformedParams = transformParameters (
184138 [
185- operation . summary ,
186- operation . description ,
187- operation . deprecated
188- ? `@deprecated this method has been deprecated and may be removed in future.`
189- : null ,
190- `Response generated for [ ${ successResponseCode } ] HTTP response code.` ,
191- ]
192- . filter ( str => ! ! str )
193- . join ( '\n' ) ,
194- 2 ,
195- true ,
196- ) ,
197- responseTypeSchema,
198- ...( responseTypeSchema . type === 'File' && {
199- requestResponseType : 'blob' as 'blob' ,
200- } ) ,
201- } ;
202- } ) ,
139+ ...( pathDef . parameters ?. length && operation . parameters ?. length
140+ ? pathDef . parameters . filter ( parameter =>
141+ operation . parameters ?. some (
142+ param =>
143+ ( param as OpenAPIV2 . ParameterObject ) . name !==
144+ ( parameter as OpenAPIV2 . ParameterObject ) . name ,
145+ ) ,
146+ )
147+ : pathDef . parameters || [ ] ) ,
148+ ...( operation . parameters || [ ] ) ,
149+ ] as ExtendedParameter [ ] ,
150+ parameters || { } ,
151+ ) ;
152+
153+ const methodTypeLowered = methodType . toLowerCase ( ) as MethodType ;
154+ const formData = transformedParams
155+ . filter ( ( { name, isFormParameter } ) => name && isFormParameter )
156+ . map ( ( { name, camelCaseName } ) => ( {
157+ name,
158+ camelCaseName : camelCaseName || name ,
159+ } ) ) ;
160+ const stringifyBody = ( param ?: Parameter ) =>
161+ param ? `JSON.stringify(args.${ param . camelCaseName } )` : 'null' ;
162+ const body = / ^ (?: p o s t | p u t | p a t c h ) \b / . test ( methodTypeLowered )
163+ ? formData . length
164+ ? 'formData'
165+ : stringifyBody (
166+ transformedParams . find (
167+ ( { isBodyParameter } ) => isBodyParameter ,
168+ ) ,
169+ )
170+ : undefined ;
171+
172+ return {
173+ hasJsonResponse : true ,
174+ methodName : toCamelCase (
175+ operation . operationId
176+ ? ! swaggerTag
177+ ? operation . operationId
178+ : operation . operationId . replace ( `${ swaggerTag } _` , '' )
179+ : `${ methodTypeLowered } _${ pathName . replace ( / [ { } ] / g, '' ) } ` ,
180+ ) ,
181+ methodType : methodTypeLowered ,
182+ body,
183+ parameters : transformedParams ,
184+ paramsOptional : transformedParams . every (
185+ ( { isRequired } ) => ! isRequired ,
186+ ) ,
187+ formData,
188+ // turn path interpolation `{this}` into string template `${args.this}
189+ path : pathName . replace (
190+ / { ( .* ?) } / g,
191+ ( _ : string , ...args : string [ ] ) : string =>
192+ `\${args.${ toCamelCase ( args [ 0 ] ) } }` ,
193+ ) ,
194+ responseGuard : responseTypeSchema . guard ?.( 'response' ) ,
195+ description : createDocsComment (
196+ [
197+ operation . summary ,
198+ operation . description ,
199+ operation . deprecated
200+ ? `@deprecated this method has been deprecated and may be removed in future.`
201+ : null ,
202+ `Response generated for [ ${ successResponseCode } ] HTTP response code.` ,
203+ ]
204+ . filter ( str => ! ! str )
205+ . join ( '\n' ) ,
206+ 2 ,
207+ true ,
208+ ) ,
209+ responseTypeSchema,
210+ ...( responseTypeSchema . type === 'File' && {
211+ requestResponseType : 'blob' as 'blob' ,
212+ } ) ,
213+ } ;
214+ } ,
215+ ) ,
203216 ) ,
204217 ) ;
205218}
0 commit comments