From d05c912ad21a0c2768f411036a05d359746183ac Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Thu, 24 Jun 2021 17:12:21 +0200 Subject: [PATCH] feat: assigning schema id to parameter schemas in components (#324) * Fixed parameter schemas are not getting correct id Co-authored-by: Lukasz Gornicki --- lib/anonymousNaming.js | 33 +++++++++++++++++++++++++++++---- lib/models/asyncapi.js | 3 ++- test/models/asyncapi_test.js | 11 ++++++++++- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/lib/anonymousNaming.js b/lib/anonymousNaming.js index fbd569351..656d23043 100644 --- a/lib/anonymousNaming.js +++ b/lib/anonymousNaming.js @@ -17,6 +17,20 @@ function assignNameToComponentMessages(doc) { } } +/** + * Assign ids based on parameter keys. + * + * @private + * @param {Record} parameterObject + */ +function assignIdToParameters(parameterObject) { + for (const [parameterKey, parameter] of Object.entries(parameterObject)) { + if (parameter.schema()) { + parameter.schema().json()[String(xParserSchemaId)] = parameterKey; + } + } +} + /** * Assign parameter keys as uid for the parameter schema. * @@ -26,9 +40,7 @@ function assignNameToComponentMessages(doc) { function assignUidToParameterSchemas(doc) { doc.channelNames().forEach(channelName => { const channel = doc.channel(channelName); - for (const [parameterKey, parameterSchema] of Object.entries(channel.parameters())) { - parameterSchema.json()[String(xParserSchemaId)] = parameterKey; - } + assignIdToParameters(channel.parameters()); }); } @@ -45,6 +57,18 @@ function assignUidToComponentSchemas(doc) { } } } + +/** + * Assign uid to component parameters schemas + * + * @private + * @param {AsyncAPIDocument} doc + */ +function assignUidToComponentParameterSchemas(doc) { + if (doc.hasComponents()) { + assignIdToParameters(doc.components().parameters()); + } +} /** * Assign anonymous names to nameless messages. @@ -98,6 +122,7 @@ module.exports = { assignNameToComponentMessages, assignUidToParameterSchemas, assignUidToComponentSchemas, + assignUidToComponentParameterSchemas, assignNameToAnonymousMessages, assignIdToAnonymousSchemas -}; \ No newline at end of file +}; diff --git a/lib/models/asyncapi.js b/lib/models/asyncapi.js index c83f4eb32..e7bd81944 100644 --- a/lib/models/asyncapi.js +++ b/lib/models/asyncapi.js @@ -9,7 +9,7 @@ const MixinExternalDocs = require('../mixins/external-docs'); const MixinTags = require('../mixins/tags'); const MixinSpecificationExtensions = require('../mixins/specification-extensions'); const {xParserSpecParsed, xParserCircle, xParserCircleProps} = require('../constants'); -const {assignNameToAnonymousMessages, assignNameToComponentMessages, assignUidToComponentSchemas, assignUidToParameterSchemas, assignIdToAnonymousSchemas} = require('../anonymousNaming'); +const {assignNameToAnonymousMessages, assignNameToComponentMessages, assignUidToComponentSchemas, assignUidToParameterSchemas, assignIdToAnonymousSchemas, assignUidToComponentParameterSchemas} = require('../anonymousNaming'); const {traverseAsyncApiDocument, SchemaIteratorCallbackType} = require('../iterators'); /** @@ -38,6 +38,7 @@ class AsyncAPIDocument extends Base { markCircularSchemas(this); assignUidToComponentSchemas(this); + assignUidToComponentParameterSchemas(this); assignUidToParameterSchemas(this); assignIdToAnonymousSchemas(this); diff --git a/test/models/asyncapi_test.js b/test/models/asyncapi_test.js index de17b5baf..44d895d2f 100644 --- a/test/models/asyncapi_test.js +++ b/test/models/asyncapi_test.js @@ -59,7 +59,16 @@ describe('AsyncAPIDocument', function() { describe('assignUidToParameterSchemas()', function() { it('should assign uids to parameters', function() { const inputDoc = { channels: { 'smartylighting/{streetlightId}': { parameters: { streetlightId: { schema: { type: 'string' } } } } } }; - const expectedDoc = { channels: { 'smartylighting/{streetlightId}': { parameters: { streetlightId: { schema: { type: 'string', 'x-parser-schema-id': '' }, 'x-parser-schema-id': 'streetlightId' } } } }, 'x-parser-spec-parsed': true }; + const expectedDoc = { channels: { 'smartylighting/{streetlightId}': { parameters: { streetlightId: { schema: { type: 'string', 'x-parser-schema-id': 'streetlightId' } } } } }, 'x-parser-spec-parsed': true }; + const d = new AsyncAPIDocument(inputDoc); + expect(d.json()).to.be.deep.equal(expectedDoc); + }); + }); + + describe('assignUidToComponentParameterSchemas()', function() { + it('should assign uids to component parameters', function() { + const inputDoc = { channels: { 'smartylighting/{streetlightId}': {}, components: { parameters: { streetlightId: { schema: { type: 'string' } } } } } }; + const expectedDoc = { channels: { 'smartylighting/{streetlightId}': {}, components: { parameters: {streetlightId: { schema: { type: 'string', 'x-parser-schema-id': 'streetlightId' } } } } }, 'x-parser-spec-parsed': true }; const d = new AsyncAPIDocument(inputDoc); expect(d.json()).to.be.deep.equal(expectedDoc); });