From 605e9d030412cb99216d3eb1154cae2b3bff627c Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Tue, 4 Sep 2018 15:23:40 +0100 Subject: [PATCH] fix(json-schema): Count for arrays inside a schema reference checker The schema could contain anyOf, allOf, items etc that are arrays so we need to traverse those too. --- src/json-schema.js | 14 +++++++------- test/json-schema.js | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/json-schema.js b/src/json-schema.js index a27c311..8678839 100644 --- a/src/json-schema.js +++ b/src/json-schema.js @@ -112,15 +112,15 @@ function checkSchemaHasReferences(schema) { return true; } - let hasRef = false; - - Object.values(schema).forEach((value) => { - if (_.isObject(value) && checkSchemaHasReferences(value)) { - hasRef = true; + return Object.values(schema).some((value) => { + if (_.isArray(value)) { + return value.some(checkSchemaHasReferences); + } else if (_.isObject(value)) { + return checkSchemaHasReferences(value); } - }); - return hasRef; + return false; + }); } /** Convert Swagger schema to JSON Schema diff --git a/test/json-schema.js b/test/json-schema.js index 4f0aea4..7dbf062 100644 --- a/test/json-schema.js +++ b/test/json-schema.js @@ -364,6 +364,47 @@ describe('Swagger Schema to JSON Schema', () => { }); }); + it('does not dererferences root when references found inside schema with items', () => { + const root = { + definitions: { + Node: { + type: 'object', + properties: { + children: { + type: 'array', + items: [ + { $ref: '#/definitions/Node' }, + ], + }, + }, + }, + }, + }; + + const schema = convertSchema({ + $ref: '#/definitions/Node', + }, root); + + expect(schema).to.deep.equal({ + allOf: [ + { $ref: '#/definitions/Node' }, + ], + definitions: { + Node: { + type: 'object', + properties: { + children: { + type: 'array', + items: [ + { $ref: '#/definitions/Node' }, + ], + }, + }, + }, + }, + }); + }); + it('copies references to schema', () => { const root = { definitions: {