@@ -23,6 +23,7 @@ interface TraversalState {
23
23
24
24
interface TopLevelPathNodes {
25
25
requestBodies : Root < SchemaObject > [ ] ;
26
+ requestParameters : Root < SchemaObject > [ ] ;
26
27
responses : Root < SchemaObject > [ ] ;
27
28
}
28
29
interface TopLevelSchemaNodes extends TopLevelPathNodes {
@@ -43,14 +44,31 @@ class Node<T, P> {
43
44
}
44
45
type SchemaObjectNode = Node < SchemaObject , SchemaObject > ;
45
46
47
+ function isParameterObject ( node : ParameterObject | ReferenceObject ) : node is ParameterObject {
48
+ return ! ( ( node as ReferenceObject ) . $ref ) ;
49
+ }
50
+ function isReferenceObject ( node : ArraySchemaObject | NonArraySchemaObject | ReferenceObject ) : node is ReferenceObject {
51
+ return ! ! ( ( node as ReferenceObject ) . $ref ) ;
52
+ }
53
+ function isArraySchemaObject ( node : ArraySchemaObject | NonArraySchemaObject | ReferenceObject ) : node is ArraySchemaObject {
54
+ return ! ! ( ( node as ArraySchemaObject ) . items ) ;
55
+ }
56
+ function isNonArraySchemaObject ( node : ArraySchemaObject | NonArraySchemaObject | ReferenceObject ) : node is NonArraySchemaObject {
57
+ return ! isArraySchemaObject ( node ) && ! isReferenceObject ( node ) ;
58
+ }
59
+
46
60
class Root < T > extends Node < T , T > {
47
61
constructor ( schema : T , path : string [ ] ) {
48
62
super ( null , schema , path ) ;
49
63
}
50
64
}
51
65
52
- type SchemaObject = OpenAPIV3 . SchemaObject ;
66
+ type ArraySchemaObject = OpenAPIV3 . ArraySchemaObject ;
67
+ type NonArraySchemaObject = OpenAPIV3 . NonArraySchemaObject ;
68
+ type OperationObject = OpenAPIV3 . OperationObject ;
69
+ type ParameterObject = OpenAPIV3 . ParameterObject ;
53
70
type ReferenceObject = OpenAPIV3 . ReferenceObject ;
71
+ type SchemaObject = OpenAPIV3 . SchemaObject ;
54
72
type Schema = ReferenceObject | SchemaObject ;
55
73
56
74
if ( ! Array . prototype [ 'flatMap' ] ) {
@@ -99,6 +117,7 @@ export class SchemaPreprocessor {
99
117
schemas : componentSchemas ,
100
118
requestBodies : r . requestBodies ,
101
119
responses : r . responses ,
120
+ requestParameters : r . requestParameters ,
102
121
} ;
103
122
104
123
// Traverse the schemas
@@ -127,6 +146,7 @@ export class SchemaPreprocessor {
127
146
128
147
private gatherSchemaNodesFromPaths ( ) : TopLevelPathNodes {
129
148
const requestBodySchemas = [ ] ;
149
+ const requestParameterSchemas = [ ] ;
130
150
const responseSchemas = [ ] ;
131
151
132
152
for ( const [ p , pi ] of Object . entries ( this . apiDoc . paths ) ) {
@@ -140,14 +160,18 @@ export class SchemaPreprocessor {
140
160
const node = new Root < OpenAPIV3 . OperationObject > ( operation , path ) ;
141
161
const requestBodies = this . extractRequestBodySchemaNodes ( node ) ;
142
162
const responseBodies = this . extractResponseSchemaNodes ( node ) ;
163
+ const requestParameters = this . extractRequestParameterSchemaNodes ( node ) ;
143
164
144
165
requestBodySchemas . push ( ...requestBodies ) ;
145
166
responseSchemas . push ( ...responseBodies ) ;
167
+ requestParameterSchemas . push ( ...requestParameters ) ;
146
168
}
147
169
}
148
170
}
171
+
149
172
return {
150
173
requestBodies : requestBodySchemas ,
174
+ requestParameters : requestParameterSchemas ,
151
175
responses : responseSchemas ,
152
176
} ;
153
177
}
@@ -230,6 +254,10 @@ export class SchemaPreprocessor {
230
254
for ( const node of nodes . responses ) {
231
255
recurse ( null , node , initOpts ( ) ) ;
232
256
}
257
+
258
+ for ( const node of nodes . requestParameters ) {
259
+ recurse ( null , node , initOpts ( ) ) ;
260
+ }
233
261
}
234
262
235
263
private schemaVisitor (
@@ -505,6 +533,28 @@ export class SchemaPreprocessor {
505
533
return schemas ;
506
534
}
507
535
536
+ private extractRequestParameterSchemaNodes (
537
+ operationNode : Root < OperationObject > ,
538
+ ) : Root < SchemaObject > [ ] {
539
+
540
+ return ( operationNode . schema . parameters ?? [ ] ) . flatMap ( ( node ) => {
541
+ const parameterObject = isParameterObject ( node ) ? node : undefined ;
542
+ if ( ! parameterObject ?. schema ) return [ ] ;
543
+
544
+ const schema = isNonArraySchemaObject ( parameterObject . schema ) ?
545
+ parameterObject . schema :
546
+ undefined ;
547
+ if ( ! schema ) return [ ] ;
548
+
549
+ return new Root ( schema , [
550
+ ...operationNode . path ,
551
+ 'parameters' ,
552
+ parameterObject . name ,
553
+ parameterObject . in
554
+ ] ) ;
555
+ } ) ;
556
+ }
557
+
508
558
private resolveSchema < T > ( schema ) : T {
509
559
if ( ! schema ) return null ;
510
560
const ref = schema ?. [ '$ref' ] ;
@@ -541,7 +591,7 @@ export class SchemaPreprocessor {
541
591
) =>
542
592
// if name or ref exists and are equal
543
593
( opParam [ 'name' ] && opParam [ 'name' ] === pathParam [ 'name' ] ) ||
544
- ( opParam [ '$ref' ] && opParam [ '$ref' ] === pathParam [ '$ref' ] ) ;
594
+ ( opParam [ '$ref' ] && opParam [ '$ref' ] === pathParam [ '$ref' ] ) ;
545
595
546
596
// Add Path level query param to list ONLY if there is not already an operation-level query param by the same name.
547
597
for ( const param of parameters ) {
0 commit comments