@@ -17,6 +17,10 @@ const OperationNotFoundError = createError('OperationNotFoundError', function (m
1717 Object . assign ( this , extra || { } )
1818} )
1919
20+ const findParametersWithName = ( name , parameters ) => {
21+ return parameters . filter ( p => p . name === name )
22+ }
23+
2024// For stubbing in tests
2125export const self = {
2226 buildRequest
@@ -118,34 +122,47 @@ export function buildRequest({
118122 req . headers . accept = responseContentType
119123 }
120124
121- // Add values to request
122- arrayOrEmpty ( operation . parameters ) // operation parameters
125+ const combinedParameters = [ ]
126+ . concat ( arrayOrEmpty ( operation . parameters ) ) // operation parameters
123127 . concat ( arrayOrEmpty ( path . parameters ) ) // path parameters
124- . forEach ( ( parameter ) => {
125- const builder = parameterBuilders [ parameter . in ]
126- let value
127128
128- // REVIEW: OAS3: have any key names or parameter shapes changed?
129- // Any new features that need to be plugged in here?
129+ // REVIEW: OAS3: have any key names or parameter shapes changed?
130+ // Any new features that need to be plugged in here?
130131
131- if ( parameter . in === 'body' && parameter . schema && parameter . schema . properties ) {
132- value = parameters
133- }
134132
135- value = parameter && parameter . name && parameters [ parameter . name ]
133+ // Add values to request
134+ combinedParameters . forEach ( ( parameter ) => {
135+ const builder = parameterBuilders [ parameter . in ]
136+ let value
136137
137- if ( typeof parameter . default !== 'undefined ' && typeof value === 'undefined' ) {
138- value = parameter . default
139- }
138+ if ( parameter . in === 'body ' && parameter . schema && parameter . schema . properties ) {
139+ value = parameters
140+ }
140141
141- if ( typeof value === 'undefined' && parameter . required && ! parameter . allowEmptyValue ) {
142- throw new Error ( `Required parameter ${ parameter . name } is not provided` )
143- }
142+ value = parameter && parameter . name && parameters [ parameter . name ]
144143
145- if ( builder ) {
146- builder ( { req, parameter, value, operation, spec, specIsOAS3} )
147- }
148- } )
144+ if ( typeof value === 'undefined' ) {
145+ // check for `name-in` formatted key
146+ value = parameter && parameter . name && parameters [ `${ parameter . in } .${ parameter . name } ` ]
147+ }
148+ else if ( findParametersWithName ( parameter . name , combinedParameters ) . length > 1 ) {
149+ // value came from `parameters[parameter.name]`
150+ // check to see if this is an ambiguous parameter
151+ console . warn ( `Parameter '${ parameter . name } ' is ambiguous because the defined spec has more than one parameter with the name: '${ parameter . name } ' and the passed-in parameter values did not define an 'in' value.` )
152+ }
153+
154+ if ( typeof parameter . default !== 'undefined' && typeof value === 'undefined' ) {
155+ value = parameter . default
156+ }
157+
158+ if ( typeof value === 'undefined' && parameter . required && ! parameter . allowEmptyValue ) {
159+ throw new Error ( `Required parameter ${ parameter . name } is not provided` )
160+ }
161+
162+ if ( builder ) {
163+ builder ( { req, parameter, value, operation, spec} )
164+ }
165+ } )
149166
150167 const requestBodyDef = operation . requestBody || { }
151168 const requestBodyMediaTypes = Object . keys ( requestBodyDef . content || { } )
@@ -198,7 +215,6 @@ export function buildRequest({
198215 }
199216 }
200217
201-
202218 // Add securities, which are applicable
203219 // REVIEW: OAS3: what changed in securities?
204220 req = applySecurities ( { request : req , securities, operation, spec} )
0 commit comments