From cbb9f50fa02da6c05c9bdd0c5d3859e37a5bb1b2 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Thu, 12 Dec 2019 18:05:37 +0200 Subject: [PATCH] fix: remove implicit discriminator mapping when explicit is present --- src/services/models/Schema.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index fb541103..1b8e0ce3 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -216,7 +216,10 @@ export class SchemaModel { ) { const discriminator = getDiscriminator(schema)!; this.discriminatorProp = discriminator.propertyName; - const inversedMapping = parser.findDerived([...(schema.parentRefs || []), this.pointer]); + const implicitInversedMapping = parser.findDerived([ + ...(schema.parentRefs || []), + this.pointer, + ]); if (schema.oneOf) { for (const variant of schema.oneOf) { @@ -224,21 +227,24 @@ export class SchemaModel { continue; } const name = JsonPointer.baseName(variant.$ref); - inversedMapping[variant.$ref] = [name]; + implicitInversedMapping[variant.$ref] = [name]; } } const mapping = discriminator.mapping || {}; + const explicitInversedMapping = {}; for (const name in mapping) { const $ref = mapping[name]; - if (Array.isArray(inversedMapping[$ref])) { - inversedMapping[$ref].push(name); + if (Array.isArray(explicitInversedMapping[$ref])) { + explicitInversedMapping[$ref].push(name); } else { - inversedMapping[$ref] = [name]; + explicitInversedMapping[$ref] = [name]; } } + const inversedMapping = { ...implicitInversedMapping, ...explicitInversedMapping }; + const refs: Array<{ $ref; name }> = []; for (const $ref of Object.keys(inversedMapping)) {