@@ -2,6 +2,7 @@ import { dirname } from 'path';
2
2
3
3
import { OpenAPIParser } from '../services/OpenAPIParser' ;
4
4
import {
5
+ OpenAPIEncoding ,
5
6
OpenAPIMediaType ,
6
7
OpenAPIOperation ,
7
8
OpenAPIParameter ,
@@ -130,6 +131,101 @@ export function isJsonLike(contentType: string): boolean {
130
131
return contentType . search ( / j s o n / i) !== - 1 ;
131
132
}
132
133
134
+ export function isFormUrlEncoded ( contentType : string ) : boolean {
135
+ return contentType === 'application/x-www-form-urlencoded' ;
136
+ }
137
+
138
+ function formEncodeField ( fieldVal : any , fieldName : string , explode : boolean ) : string {
139
+ if ( ! fieldVal || ! fieldVal . length ) {
140
+ return fieldName + '=' ;
141
+ }
142
+
143
+ if ( Array . isArray ( fieldVal ) ) {
144
+ if ( explode ) {
145
+ return fieldVal . map ( val => `${ fieldName } =${ val } ` ) . join ( '&' ) ;
146
+ } else {
147
+ return fieldName + '=' + fieldVal . map ( val => val . toString ( ) ) . join ( ',' ) ;
148
+ }
149
+ } else if ( typeof fieldVal === 'object' ) {
150
+ if ( explode ) {
151
+ return Object . keys ( fieldVal )
152
+ . map ( k => `${ k } =${ fieldVal [ k ] } ` )
153
+ . join ( '&' ) ;
154
+ } else {
155
+ return (
156
+ fieldName +
157
+ '=' +
158
+ Object . keys ( fieldVal )
159
+ . map ( k => `${ k } ,${ fieldVal [ k ] } ` )
160
+ . join ( ',' )
161
+ ) ;
162
+ }
163
+ } else {
164
+ return fieldName + '=' + fieldVal . toString ( ) ;
165
+ }
166
+ }
167
+
168
+ function delimitedEncodeField ( fieldVal : any , fieldName : string , delimeter : string ) : string {
169
+ if ( Array . isArray ( fieldVal ) ) {
170
+ return fieldVal . map ( v => v . toString ( ) ) . join ( delimeter ) ;
171
+ } else if ( typeof fieldVal === 'object' ) {
172
+ return Object . keys ( fieldVal )
173
+ . map ( k => `${ k } ${ delimeter } ${ fieldVal [ k ] } ` )
174
+ . join ( delimeter ) ;
175
+ } else {
176
+ return fieldName + '=' + fieldVal . toString ( ) ;
177
+ }
178
+ }
179
+
180
+ function deepObjectEncodeField ( fieldVal : any , fieldName : string ) : string {
181
+ if ( Array . isArray ( fieldVal ) ) {
182
+ console . warn ( 'deepObject style cannot be used with array value:' + fieldVal . toString ( ) ) ;
183
+ return '' ;
184
+ } else if ( typeof fieldVal === 'object' ) {
185
+ return Object . keys ( fieldVal )
186
+ . map ( k => `${ fieldName } [${ k } ]=${ fieldVal [ k ] } ` )
187
+ . join ( '&' ) ;
188
+ } else {
189
+ console . warn ( 'deepObject style cannot be used with non-object value:' + fieldVal . toString ( ) ) ;
190
+ return '' ;
191
+ }
192
+ }
193
+
194
+ /*
195
+ * Should be used only for url-form-encoded body payloads
196
+ * To be used for parmaters should be extended with other style values
197
+ */
198
+ export function urlFormEncodePayload (
199
+ payload : object ,
200
+ encoding : { [ field : string ] : OpenAPIEncoding } = { } ,
201
+ ) {
202
+ if ( Array . isArray ( payload ) ) {
203
+ throw new Error ( 'Payload must have fields: ' + payload . toString ( ) ) ;
204
+ } else {
205
+ return Object . keys ( payload )
206
+ . map ( fieldName => {
207
+ const fieldVal = payload [ fieldName ] ;
208
+ const { style = 'form' , explode = true } = encoding [ fieldName ] || { } ;
209
+ switch ( style ) {
210
+ case 'form' :
211
+ return formEncodeField ( fieldVal , fieldName , explode ) ;
212
+ break ;
213
+ case 'spaceDelimited' :
214
+ return delimitedEncodeField ( fieldVal , fieldName , '%20' ) ;
215
+ case 'pipeDelimited' :
216
+ return delimitedEncodeField ( fieldVal , fieldName , '|' ) ;
217
+ case 'deepObject' :
218
+ return deepObjectEncodeField ( fieldVal , fieldName ) ;
219
+ default :
220
+ // TODO implement rest of styles for path parameters
221
+ console . warn ( 'Incorrect or unsupported encoding style: ' + style ) ;
222
+ return '' ;
223
+ }
224
+ } )
225
+ . join ( '&' ) ;
226
+ }
227
+ }
228
+
133
229
export function langFromMime ( contentType : string ) : string {
134
230
if ( contentType . search ( / x m l / i) !== - 1 ) {
135
231
return 'xml' ;
0 commit comments