@@ -45,96 +45,100 @@ func parametersMapNames(s ParametersMap) []string {
45
45
return out
46
46
}
47
47
48
- func isExternalRef (ref string ) bool {
49
- return ref != "" && ! strings .HasPrefix (ref , "#/components/" )
48
+ func isExternalRef (ref string , parentIsExternal bool ) bool {
49
+ return ref != "" && ( ! strings .HasPrefix (ref , "#/components/" ) || parentIsExternal )
50
50
}
51
51
52
- func (doc * T ) addSchemaToSpec (s * SchemaRef , refNameResolver RefNameResolver ) {
53
- if s == nil || ! isExternalRef (s .Ref ) {
54
- return
52
+ func (doc * T ) addSchemaToSpec (s * SchemaRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
53
+ if s == nil || ! isExternalRef (s .Ref , parentIsExternal ) {
54
+ return false
55
55
}
56
56
57
57
name := refNameResolver (s .Ref )
58
58
if _ , ok := doc .Components .Schemas [name ]; ok {
59
59
s .Ref = "#/components/schemas/" + name
60
- return
60
+ return true
61
61
}
62
62
63
63
if doc .Components .Schemas == nil {
64
64
doc .Components .Schemas = make (Schemas )
65
65
}
66
66
doc .Components .Schemas [name ] = s .Value .NewRef ()
67
67
s .Ref = "#/components/schemas/" + name
68
+ return true
68
69
}
69
70
70
- func (doc * T ) addParameterToSpec (p * ParameterRef , refNameResolver RefNameResolver ) {
71
- if p == nil || ! isExternalRef (p .Ref ) {
72
- return
71
+ func (doc * T ) addParameterToSpec (p * ParameterRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
72
+ if p == nil || ! isExternalRef (p .Ref , parentIsExternal ) {
73
+ return false
73
74
}
74
75
name := refNameResolver (p .Ref )
75
76
if _ , ok := doc .Components .Parameters [name ]; ok {
76
77
p .Ref = "#/components/parameters/" + name
77
- return
78
+ return true
78
79
}
79
80
80
81
if doc .Components .Parameters == nil {
81
82
doc .Components .Parameters = make (ParametersMap )
82
83
}
83
84
doc .Components .Parameters [name ] = & ParameterRef {Value : p .Value }
84
85
p .Ref = "#/components/parameters/" + name
86
+ return true
85
87
}
86
88
87
- func (doc * T ) addHeaderToSpec (h * HeaderRef , refNameResolver RefNameResolver ) {
88
- if h == nil || ! isExternalRef (h .Ref ) {
89
- return
89
+ func (doc * T ) addHeaderToSpec (h * HeaderRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
90
+ if h == nil || ! isExternalRef (h .Ref , parentIsExternal ) {
91
+ return false
90
92
}
91
93
name := refNameResolver (h .Ref )
92
94
if _ , ok := doc .Components .Headers [name ]; ok {
93
95
h .Ref = "#/components/headers/" + name
94
- return
96
+ return true
95
97
}
96
98
if doc .Components .Headers == nil {
97
99
doc .Components .Headers = make (Headers )
98
100
}
99
101
doc .Components .Headers [name ] = & HeaderRef {Value : h .Value }
100
102
h .Ref = "#/components/headers/" + name
103
+ return true
101
104
}
102
105
103
- func (doc * T ) addRequestBodyToSpec (r * RequestBodyRef , refNameResolver RefNameResolver ) {
104
- if r == nil || ! isExternalRef (r .Ref ) {
105
- return
106
+ func (doc * T ) addRequestBodyToSpec (r * RequestBodyRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
107
+ if r == nil || ! isExternalRef (r .Ref , parentIsExternal ) {
108
+ return false
106
109
}
107
110
name := refNameResolver (r .Ref )
108
111
if _ , ok := doc .Components .RequestBodies [name ]; ok {
109
112
r .Ref = "#/components/requestBodies/" + name
110
- return
113
+ return true
111
114
}
112
115
if doc .Components .RequestBodies == nil {
113
116
doc .Components .RequestBodies = make (RequestBodies )
114
117
}
115
118
doc .Components .RequestBodies [name ] = & RequestBodyRef {Value : r .Value }
116
119
r .Ref = "#/components/requestBodies/" + name
120
+ return true
117
121
}
118
122
119
- func (doc * T ) addResponseToSpec (r * ResponseRef , refNameResolver RefNameResolver ) {
120
- if r == nil || ! isExternalRef (r .Ref ) {
121
- return
123
+ func (doc * T ) addResponseToSpec (r * ResponseRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
124
+ if r == nil || ! isExternalRef (r .Ref , parentIsExternal ) {
125
+ return false
122
126
}
123
127
name := refNameResolver (r .Ref )
124
128
if _ , ok := doc .Components .Responses [name ]; ok {
125
129
r .Ref = "#/components/responses/" + name
126
- return
130
+ return true
127
131
}
128
132
if doc .Components .Responses == nil {
129
133
doc .Components .Responses = make (Responses )
130
134
}
131
135
doc .Components .Responses [name ] = & ResponseRef {Value : r .Value }
132
136
r .Ref = "#/components/responses/" + name
133
-
137
+ return true
134
138
}
135
139
136
- func (doc * T ) addSecuritySchemeToSpec (ss * SecuritySchemeRef , refNameResolver RefNameResolver ) {
137
- if ss == nil || ! isExternalRef (ss .Ref ) {
140
+ func (doc * T ) addSecuritySchemeToSpec (ss * SecuritySchemeRef , refNameResolver RefNameResolver , parentIsExternal bool ) {
141
+ if ss == nil || ! isExternalRef (ss .Ref , parentIsExternal ) {
138
142
return
139
143
}
140
144
name := refNameResolver (ss .Ref )
@@ -150,8 +154,8 @@ func (doc *T) addSecuritySchemeToSpec(ss *SecuritySchemeRef, refNameResolver Ref
150
154
151
155
}
152
156
153
- func (doc * T ) addExampleToSpec (e * ExampleRef , refNameResolver RefNameResolver ) {
154
- if e == nil || ! isExternalRef (e .Ref ) {
157
+ func (doc * T ) addExampleToSpec (e * ExampleRef , refNameResolver RefNameResolver , parentIsExternal bool ) {
158
+ if e == nil || ! isExternalRef (e .Ref , parentIsExternal ) {
155
159
return
156
160
}
157
161
name := refNameResolver (e .Ref )
@@ -167,8 +171,8 @@ func (doc *T) addExampleToSpec(e *ExampleRef, refNameResolver RefNameResolver) {
167
171
168
172
}
169
173
170
- func (doc * T ) addLinkToSpec (l * LinkRef , refNameResolver RefNameResolver ) {
171
- if l == nil || ! isExternalRef (l .Ref ) {
174
+ func (doc * T ) addLinkToSpec (l * LinkRef , refNameResolver RefNameResolver , parentIsExternal bool ) {
175
+ if l == nil || ! isExternalRef (l .Ref , parentIsExternal ) {
172
176
return
173
177
}
174
178
name := refNameResolver (l .Ref )
@@ -184,9 +188,9 @@ func (doc *T) addLinkToSpec(l *LinkRef, refNameResolver RefNameResolver) {
184
188
185
189
}
186
190
187
- func (doc * T ) addCallbackToSpec (c * CallbackRef , refNameResolver RefNameResolver ) {
188
- if c == nil || ! isExternalRef (c .Ref ) {
189
- return
191
+ func (doc * T ) addCallbackToSpec (c * CallbackRef , refNameResolver RefNameResolver , parentIsExternal bool ) bool {
192
+ if c == nil || ! isExternalRef (c .Ref , parentIsExternal ) {
193
+ return false
190
194
}
191
195
name := refNameResolver (c .Ref )
192
196
if _ , ok := doc .Components .Callbacks [name ]; ok {
@@ -197,118 +201,119 @@ func (doc *T) addCallbackToSpec(c *CallbackRef, refNameResolver RefNameResolver)
197
201
}
198
202
doc .Components .Callbacks [name ] = & CallbackRef {Value : c .Value }
199
203
c .Ref = "#/components/callbacks/" + name
204
+ return true
200
205
}
201
206
202
- func (doc * T ) derefSchema (s * Schema , refNameResolver RefNameResolver ) {
207
+ func (doc * T ) derefSchema (s * Schema , refNameResolver RefNameResolver , parentIsExternal bool ) {
203
208
if s == nil || doc .isVisitedSchema (s ) {
204
209
return
205
210
}
206
211
207
212
for _ , list := range []SchemaRefs {s .AllOf , s .AnyOf , s .OneOf } {
208
213
for _ , s2 := range list {
209
- doc .addSchemaToSpec (s2 , refNameResolver )
214
+ isExternal := doc .addSchemaToSpec (s2 , refNameResolver , parentIsExternal )
210
215
if s2 != nil {
211
- doc .derefSchema (s2 .Value , refNameResolver )
216
+ doc .derefSchema (s2 .Value , refNameResolver , isExternal || parentIsExternal )
212
217
}
213
218
}
214
219
}
215
220
for _ , s2 := range s .Properties {
216
- doc .addSchemaToSpec (s2 , refNameResolver )
221
+ isExternal := doc .addSchemaToSpec (s2 , refNameResolver , parentIsExternal )
217
222
if s2 != nil {
218
- doc .derefSchema (s2 .Value , refNameResolver )
223
+ doc .derefSchema (s2 .Value , refNameResolver , isExternal || parentIsExternal )
219
224
}
220
225
}
221
226
for _ , ref := range []* SchemaRef {s .Not , s .AdditionalProperties , s .Items } {
222
- doc .addSchemaToSpec (ref , refNameResolver )
227
+ isExternal := doc .addSchemaToSpec (ref , refNameResolver , parentIsExternal )
223
228
if ref != nil {
224
- doc .derefSchema (ref .Value , refNameResolver )
229
+ doc .derefSchema (ref .Value , refNameResolver , isExternal || parentIsExternal )
225
230
}
226
231
}
227
232
}
228
233
229
- func (doc * T ) derefHeaders (hs Headers , refNameResolver RefNameResolver ) {
234
+ func (doc * T ) derefHeaders (hs Headers , refNameResolver RefNameResolver , parentIsExternal bool ) {
230
235
for _ , h := range hs {
231
- doc .addHeaderToSpec (h , refNameResolver )
236
+ isExternal := doc .addHeaderToSpec (h , refNameResolver , parentIsExternal )
232
237
if doc .isVisitedHeader (h .Value ) {
233
238
continue
234
239
}
235
- doc .derefParameter (h .Value .Parameter , refNameResolver )
240
+ doc .derefParameter (h .Value .Parameter , refNameResolver , parentIsExternal || isExternal )
236
241
}
237
242
}
238
243
239
- func (doc * T ) derefExamples (es Examples , refNameResolver RefNameResolver ) {
244
+ func (doc * T ) derefExamples (es Examples , refNameResolver RefNameResolver , parentIsExternal bool ) {
240
245
for _ , e := range es {
241
- doc .addExampleToSpec (e , refNameResolver )
246
+ doc .addExampleToSpec (e , refNameResolver , parentIsExternal )
242
247
}
243
248
}
244
249
245
- func (doc * T ) derefContent (c Content , refNameResolver RefNameResolver ) {
250
+ func (doc * T ) derefContent (c Content , refNameResolver RefNameResolver , parentIsExternal bool ) {
246
251
for _ , mediatype := range c {
247
- doc .addSchemaToSpec (mediatype .Schema , refNameResolver )
252
+ isExternal := doc .addSchemaToSpec (mediatype .Schema , refNameResolver , parentIsExternal )
248
253
if mediatype .Schema != nil {
249
- doc .derefSchema (mediatype .Schema .Value , refNameResolver )
254
+ doc .derefSchema (mediatype .Schema .Value , refNameResolver , isExternal || parentIsExternal )
250
255
}
251
- doc .derefExamples (mediatype .Examples , refNameResolver )
256
+ doc .derefExamples (mediatype .Examples , refNameResolver , parentIsExternal )
252
257
for _ , e := range mediatype .Encoding {
253
- doc .derefHeaders (e .Headers , refNameResolver )
258
+ doc .derefHeaders (e .Headers , refNameResolver , parentIsExternal )
254
259
}
255
260
}
256
261
}
257
262
258
- func (doc * T ) derefLinks (ls Links , refNameResolver RefNameResolver ) {
263
+ func (doc * T ) derefLinks (ls Links , refNameResolver RefNameResolver , parentIsExternal bool ) {
259
264
for _ , l := range ls {
260
- doc .addLinkToSpec (l , refNameResolver )
265
+ doc .addLinkToSpec (l , refNameResolver , parentIsExternal )
261
266
}
262
267
}
263
268
264
- func (doc * T ) derefResponses (es Responses , refNameResolver RefNameResolver ) {
269
+ func (doc * T ) derefResponses (es Responses , refNameResolver RefNameResolver , parentIsExternal bool ) {
265
270
for _ , e := range es {
266
- doc .addResponseToSpec (e , refNameResolver )
271
+ isExternal := doc .addResponseToSpec (e , refNameResolver , parentIsExternal )
267
272
if e .Value != nil {
268
- doc .derefHeaders (e .Value .Headers , refNameResolver )
269
- doc .derefContent (e .Value .Content , refNameResolver )
270
- doc .derefLinks (e .Value .Links , refNameResolver )
273
+ doc .derefHeaders (e .Value .Headers , refNameResolver , isExternal || parentIsExternal )
274
+ doc .derefContent (e .Value .Content , refNameResolver , isExternal || parentIsExternal )
275
+ doc .derefLinks (e .Value .Links , refNameResolver , isExternal || parentIsExternal )
271
276
}
272
277
}
273
278
}
274
279
275
- func (doc * T ) derefParameter (p Parameter , refNameResolver RefNameResolver ) {
276
- doc .addSchemaToSpec (p .Schema , refNameResolver )
277
- doc .derefContent (p .Content , refNameResolver )
280
+ func (doc * T ) derefParameter (p Parameter , refNameResolver RefNameResolver , parentIsExternal bool ) {
281
+ isExternal := doc .addSchemaToSpec (p .Schema , refNameResolver , parentIsExternal )
282
+ doc .derefContent (p .Content , refNameResolver , parentIsExternal )
278
283
if p .Schema != nil {
279
- doc .derefSchema (p .Schema .Value , refNameResolver )
284
+ doc .derefSchema (p .Schema .Value , refNameResolver , isExternal || parentIsExternal )
280
285
}
281
286
}
282
287
283
- func (doc * T ) derefRequestBody (r RequestBody , refNameResolver RefNameResolver ) {
284
- doc .derefContent (r .Content , refNameResolver )
288
+ func (doc * T ) derefRequestBody (r RequestBody , refNameResolver RefNameResolver , parentIsExternal bool ) {
289
+ doc .derefContent (r .Content , refNameResolver , parentIsExternal )
285
290
}
286
291
287
- func (doc * T ) derefPaths (paths map [string ]* PathItem , refNameResolver RefNameResolver ) {
292
+ func (doc * T ) derefPaths (paths map [string ]* PathItem , refNameResolver RefNameResolver , parentIsExternal bool ) {
288
293
for _ , ops := range paths {
289
294
// inline full operations
290
295
ops .Ref = ""
291
296
292
297
for _ , param := range ops .Parameters {
293
- doc .addParameterToSpec (param , refNameResolver )
298
+ doc .addParameterToSpec (param , refNameResolver , parentIsExternal )
294
299
}
295
300
296
301
for _ , op := range ops .Operations () {
297
- doc .addRequestBodyToSpec (op .RequestBody , refNameResolver )
302
+ isExternal := doc .addRequestBodyToSpec (op .RequestBody , refNameResolver , parentIsExternal )
298
303
if op .RequestBody != nil && op .RequestBody .Value != nil {
299
- doc .derefRequestBody (* op .RequestBody .Value , refNameResolver )
304
+ doc .derefRequestBody (* op .RequestBody .Value , refNameResolver , parentIsExternal || isExternal )
300
305
}
301
306
for _ , cb := range op .Callbacks {
302
- doc .addCallbackToSpec (cb , refNameResolver )
307
+ isExternal := doc .addCallbackToSpec (cb , refNameResolver , parentIsExternal )
303
308
if cb .Value != nil {
304
- doc .derefPaths (* cb .Value , refNameResolver )
309
+ doc .derefPaths (* cb .Value , refNameResolver , parentIsExternal || isExternal )
305
310
}
306
311
}
307
- doc .derefResponses (op .Responses , refNameResolver )
312
+ doc .derefResponses (op .Responses , refNameResolver , parentIsExternal )
308
313
for _ , param := range op .Parameters {
309
- doc .addParameterToSpec (param , refNameResolver )
314
+ isExternal := doc .addParameterToSpec (param , refNameResolver , parentIsExternal )
310
315
if param .Value != nil {
311
- doc .derefParameter (* param .Value , refNameResolver )
316
+ doc .derefParameter (* param .Value , refNameResolver , parentIsExternal || isExternal )
312
317
}
313
318
}
314
319
}
@@ -337,42 +342,42 @@ func (doc *T) InternalizeRefs(ctx context.Context, refNameResolver func(ref stri
337
342
names := schemaNames (doc .Components .Schemas )
338
343
for _ , name := range names {
339
344
schema := doc .Components .Schemas [name ]
340
- doc .addSchemaToSpec (schema , refNameResolver )
345
+ isExternal := doc .addSchemaToSpec (schema , refNameResolver , false )
341
346
if schema != nil {
342
347
schema .Ref = "" // always dereference the top level
343
- doc .derefSchema (schema .Value , refNameResolver )
348
+ doc .derefSchema (schema .Value , refNameResolver , isExternal )
344
349
}
345
350
}
346
351
names = parametersMapNames (doc .Components .Parameters )
347
352
for _ , name := range names {
348
353
p := doc .Components .Parameters [name ]
349
- doc .addParameterToSpec (p , refNameResolver )
354
+ isExternal := doc .addParameterToSpec (p , refNameResolver , false )
350
355
if p != nil && p .Value != nil {
351
356
p .Ref = "" // always dereference the top level
352
- doc .derefParameter (* p .Value , refNameResolver )
357
+ doc .derefParameter (* p .Value , refNameResolver , isExternal )
353
358
}
354
359
}
355
- doc .derefHeaders (doc .Components .Headers , refNameResolver )
360
+ doc .derefHeaders (doc .Components .Headers , refNameResolver , false )
356
361
for _ , req := range doc .Components .RequestBodies {
357
- doc .addRequestBodyToSpec (req , refNameResolver )
362
+ isExternal := doc .addRequestBodyToSpec (req , refNameResolver , false )
358
363
if req != nil && req .Value != nil {
359
364
req .Ref = "" // always dereference the top level
360
- doc .derefRequestBody (* req .Value , refNameResolver )
365
+ doc .derefRequestBody (* req .Value , refNameResolver , isExternal )
361
366
}
362
367
}
363
- doc .derefResponses (doc .Components .Responses , refNameResolver )
368
+ doc .derefResponses (doc .Components .Responses , refNameResolver , false )
364
369
for _ , ss := range doc .Components .SecuritySchemes {
365
- doc .addSecuritySchemeToSpec (ss , refNameResolver )
370
+ doc .addSecuritySchemeToSpec (ss , refNameResolver , false )
366
371
}
367
- doc .derefExamples (doc .Components .Examples , refNameResolver )
368
- doc .derefLinks (doc .Components .Links , refNameResolver )
372
+ doc .derefExamples (doc .Components .Examples , refNameResolver , false )
373
+ doc .derefLinks (doc .Components .Links , refNameResolver , false )
369
374
for _ , cb := range doc .Components .Callbacks {
370
- doc .addCallbackToSpec (cb , refNameResolver )
375
+ isExternal := doc .addCallbackToSpec (cb , refNameResolver , false )
371
376
if cb != nil && cb .Value != nil {
372
377
cb .Ref = "" // always dereference the top level
373
- doc .derefPaths (* cb .Value , refNameResolver )
378
+ doc .derefPaths (* cb .Value , refNameResolver , isExternal )
374
379
}
375
380
}
376
381
377
- doc .derefPaths (doc .Paths , refNameResolver )
382
+ doc .derefPaths (doc .Paths , refNameResolver , false )
378
383
}
0 commit comments