From 43baa875cbe82befac43ba7d4d7b9bb7f3a1c051 Mon Sep 17 00:00:00 2001 From: Eugene Toder Date: Fri, 7 Jun 2024 13:22:13 -0400 Subject: [PATCH] feat(json-schema): support x-additionalPropertiesName x-additionalPropertiesName is a Redocly extension to display more descriptive property names in objects with additionalProperties[1]. This allows generating nicer looking and more informative documentation and examples than Swagger UI's current "additionalProp" name. [1] https://redocly.com/docs/api-reference-docs/specification-extensions/x-additional-properties-name/ --- .../json-schema-2020-12-samples/fn/main.js | 6 ++- .../plugins/json-schema-5-samples/fn/index.js | 5 +- .../plugins/json-schema-2020-12-samples/fn.js | 46 +++++++++++++++++++ .../plugins/json-schema-5-samples/fn/index.js | 45 ++++++++++++++++++ 4 files changed, 98 insertions(+), 4 deletions(-) diff --git a/src/core/plugins/json-schema-2020-12-samples/fn/main.js b/src/core/plugins/json-schema-2020-12-samples/fn/main.js index ced45993920..e143785e467 100644 --- a/src/core/plugins/json-schema-2020-12-samples/fn/main.js +++ b/src/core/plugins/json-schema-2020-12-samples/fn/main.js @@ -458,6 +458,8 @@ export const sampleFromSchemaGeneric = ( ) { res[displayName].push(additionalPropSample) } else { + const keyName = + additionalProps?.["x-additionalPropertiesName"] || "additionalProp" const toGenerateCount = Number.isInteger(schema.minProperties) && schema.minProperties > 0 && @@ -470,10 +472,10 @@ export const sampleFromSchemaGeneric = ( } if (respectXML) { const temp = {} - temp["additionalProp" + i] = additionalPropSample["notagname"] + temp[keyName + i] = additionalPropSample["notagname"] res[displayName].push(temp) } else { - res["additionalProp" + i] = additionalPropSample + res[keyName + i] = additionalPropSample } propertyAddedCounter++ } diff --git a/src/core/plugins/json-schema-5-samples/fn/index.js b/src/core/plugins/json-schema-5-samples/fn/index.js index e1fcf8623fe..5d2071e9e40 100644 --- a/src/core/plugins/json-schema-5-samples/fn/index.js +++ b/src/core/plugins/json-schema-5-samples/fn/index.js @@ -506,6 +506,7 @@ export const sampleFromSchemaGeneric = (schema, config={}, exampleOverride = und { res[displayName].push(additionalPropSample) } else { + const keyName = additionalProps["x-additionalPropertiesName"] || "additionalProp" const toGenerateCount = schema.minProperties !== null && schema.minProperties !== undefined && propertyAddedCounter < schema.minProperties ? schema.minProperties - propertyAddedCounter : 3 @@ -515,10 +516,10 @@ export const sampleFromSchemaGeneric = (schema, config={}, exampleOverride = und } if(respectXML) { const temp = {} - temp["additionalProp" + i] = additionalPropSample["notagname"] + temp[keyName + i] = additionalPropSample["notagname"] res[displayName].push(temp) } else { - res["additionalProp" + i] = additionalPropSample + res[keyName + i] = additionalPropSample } propertyAddedCounter++ } diff --git a/test/unit/core/plugins/json-schema-2020-12-samples/fn.js b/test/unit/core/plugins/json-schema-2020-12-samples/fn.js index a5ff7fc1470..27fe2a75f1b 100644 --- a/test/unit/core/plugins/json-schema-2020-12-samples/fn.js +++ b/test/unit/core/plugins/json-schema-2020-12-samples/fn.js @@ -1253,6 +1253,30 @@ describe("sampleFromSchema", () => { expect(sampleFromSchema(definition)).toEqual(expected) }) + it("should handle additionalProperties with x-additionalPropertiesName", () => { + const definition = { + type: "object", + additionalProperties: { + type: "string", + "x-additionalPropertiesName": "bar", + }, + properties: { + foo: { + type: "string", + }, + }, + } + + const expected = { + foo: "string", + bar1: "string", + bar2: "string", + bar3: "string", + } + + expect(sampleFromSchema(definition)).toEqual(expected) + }) + it("should handle additionalProperties=true", () => { const definition = { type: "object", @@ -2755,6 +2779,28 @@ describe("createXMLExample", function () { expect(sut(definition)).toEqual(expected) }) + it("returns object with additional props with x-additionalPropertiesName", function () { + const expected = + '\n\n\tstring\n\tstring\n\tstring\n\tstring\n' + const definition = { + type: "object", + properties: { + dog: { + type: "string", + }, + }, + additionalProperties: { + type: "string", + "x-additionalPropertiesName": "animal", + }, + xml: { + name: "animals", + }, + } + + expect(sut(definition)).toEqual(expected) + }) + it("returns object with additional props =true", function () { const expected = '\n\n\tstring\n\tAnything can be here\n' diff --git a/test/unit/core/plugins/json-schema-5-samples/fn/index.js b/test/unit/core/plugins/json-schema-5-samples/fn/index.js index d3b6ea15c47..a963818c13f 100644 --- a/test/unit/core/plugins/json-schema-5-samples/fn/index.js +++ b/test/unit/core/plugins/json-schema-5-samples/fn/index.js @@ -945,6 +945,30 @@ describe("sampleFromSchema", () => { expect(sampleFromSchema(definition)).toEqual(expected) }) + it("should handle additionalProperties with x-additionalPropertiesName", () => { + const definition = { + type: "object", + additionalProperties: { + type: "string", + "x-additionalPropertiesName": "bar", + }, + properties: { + foo: { + type: "string", + }, + }, + } + + const expected = { + foo: "string", + bar1: "string", + bar2: "string", + bar3: "string", + } + + expect(sampleFromSchema(definition)).toEqual(expected) + }) + it("should handle additionalProperties=true", () => { const definition = { type: "object", @@ -2199,6 +2223,27 @@ describe("createXMLExample", function () { expect(sut(definition)).toEqual(expected) }) + it("returns object with additional props with x-additionalPropertiesName", function () { + let expected = "\n\n\tstring\n\tstring\n\tstring\n\tstring\n" + let definition = { + type: "object", + properties: { + dog: { + type: "string" + } + }, + additionalProperties: { + type: "string", + "x-additionalPropertiesName": "animal" + }, + xml: { + name: "animals" + } + } + + expect(sut(definition)).toEqual(expected) + }) + it("returns object with additional props =true", function () { let expected = "\n\n\tstring\n\tAnything can be here\n" let definition = {