From b04bf6036d19e8e2bdcb4b11be4dd3a52d961272 Mon Sep 17 00:00:00 2001 From: zeapo Date: Thu, 26 Mar 2020 17:55:00 +0100 Subject: [PATCH 1/2] sort discriminator entries by mapping order --- src/services/models/Schema.ts | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index 7fb5a8e95e..0ce7e6fdce 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -254,7 +254,7 @@ export class SchemaModel { const inversedMapping = { ...implicitInversedMapping, ...explicitInversedMapping }; - const refs: Array<{ $ref; name }> = []; + let refs: Array<{ $ref; name }> = []; for (const $ref of Object.keys(inversedMapping)) { const names = inversedMapping[$ref]; @@ -267,6 +267,35 @@ export class SchemaModel { } } + // Make the listing respects the mapping + // in case a mapping is defined, the user usually wants to have the order shown + // as it was defined in the yaml. This will sort the names given the provided + // mapping (if provided). + // The logic is: + // - If a name is among the mapping, promote it to first + // - Names among the mapping are sorted by their order in the mapping + // - Names outside the mapping are sorted alphabetically + const names = Object.keys(mapping); + if (names.length !== 0) { + refs = refs.sort((left, right) => { + const indexLeft = names.indexOf(left.name); + const indexRight = names.indexOf(right.name); + + if (indexLeft < 0 && indexRight < 0) { + // out of mapping, order by name + return left.name - right.name; + } else if (indexLeft < 0) { + // the right is found, so mapping wins + return 1; + } else if (indexRight < 0) { + // left wins as it's in mapping + return -1; + } else { + return indexLeft - indexRight; + } + }); + } + this.oneOf = refs.map(({ $ref, name }) => { const innerSchema = new SchemaModel(parser, parser.byRef($ref)!, $ref, this.options, true); innerSchema.title = name; From d8b74100c91a641449864840db2d94bdb0cd2bfb Mon Sep 17 00:00:00 2001 From: zeapo Date: Fri, 27 Mar 2020 12:06:50 +0100 Subject: [PATCH 2/2] fix string compare --- src/services/models/Schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index 0ce7e6fdce..678c8d4264 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -283,7 +283,7 @@ export class SchemaModel { if (indexLeft < 0 && indexRight < 0) { // out of mapping, order by name - return left.name - right.name; + return left.name.localCompare(right.name); } else if (indexLeft < 0) { // the right is found, so mapping wins return 1;