@@ -216,27 +216,45 @@ export class SchemaModel {
216
216
) {
217
217
const discriminator = getDiscriminator ( schema ) ! ;
218
218
this . discriminatorProp = discriminator . propertyName ;
219
- const derived = parser . findDerived ( [ ...( schema . parentRefs || [ ] ) , this . pointer ] ) ;
219
+ const inversedMapping = parser . findDerived ( [ ...( schema . parentRefs || [ ] ) , this . pointer ] ) ;
220
220
221
221
if ( schema . oneOf ) {
222
222
for ( const variant of schema . oneOf ) {
223
223
if ( variant . $ref === undefined ) {
224
224
continue ;
225
225
}
226
226
const name = JsonPointer . baseName ( variant . $ref ) ;
227
- derived [ variant . $ref ] = name ;
227
+ inversedMapping [ variant . $ref ] = [ name ] ;
228
228
}
229
229
}
230
230
231
231
const mapping = discriminator . mapping || { } ;
232
232
for ( const name in mapping ) {
233
- derived [ mapping [ name ] ] = name ;
233
+ const $ref = mapping [ name ] ;
234
+
235
+ if ( Array . isArray ( inversedMapping [ $ref ] ) ) {
236
+ inversedMapping [ $ref ] . push ( name ) ;
237
+ } else {
238
+ inversedMapping [ $ref ] = [ name ] ;
239
+ }
240
+ }
241
+
242
+ const refs : Array < { $ref ; name } > = [ ] ;
243
+
244
+ for ( const $ref of Object . keys ( inversedMapping ) ) {
245
+ const names = inversedMapping [ $ref ] ;
246
+ if ( Array . isArray ( names ) ) {
247
+ for ( const name of names ) {
248
+ refs . push ( { $ref, name } ) ;
249
+ }
250
+ } else {
251
+ refs . push ( { $ref, name : names } ) ;
252
+ }
234
253
}
235
254
236
- const refs = Object . keys ( derived ) ;
237
- this . oneOf = refs . map ( ref => {
238
- const innerSchema = new SchemaModel ( parser , parser . byRef ( ref ) ! , ref , this . options , true ) ;
239
- innerSchema . title = derived [ ref ] ;
255
+ this . oneOf = refs . map ( ( { $ref, name } ) => {
256
+ const innerSchema = new SchemaModel ( parser , parser . byRef ( $ref ) ! , $ref , this . options , true ) ;
257
+ innerSchema . title = name ;
240
258
return innerSchema ;
241
259
} ) ;
242
260
}
0 commit comments