From 5883da32ca71b2700766c4903715596975c92702 Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Fri, 21 Jul 2017 13:12:02 +0100 Subject: [PATCH 1/2] feat(schema): Support allOf for objects --- CHANGELOG.md | 7 +++++++ src/schema.js | 37 ++++++++++++++++++++++++++----------- test/schema.js | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 224cea9..edea97c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# Master + +## Enhancements + +- Support `allOf` in object JSON Schemas when producing object data structure + elements. + # 0.12.0 - Updates to fury 3.0.0-beta.3 which supports Refract 1.0 serialisation diff --git a/src/schema.js b/src/schema.js index c0a7567..68aec13 100644 --- a/src/schema.js +++ b/src/schema.js @@ -61,20 +61,35 @@ export default class DataStructureGenerator { String: StringElement, } = this.minim.elements; - const element = new ObjectElement(); + let properties = schema.properties || {}; + let required = schema.required || []; + + if (schema.allOf && Array.isArray(schema.allOf)) { + // Merge all of the object allOf into properties and required + const allOf = schema.allOf.filter(subschema => subschema.type === 'object'); + + const allProperties = allOf + .filter(subschema => subschema.properties) + .map(subschema => subschema.properties); + properties = Object.assign(properties, ...allProperties); + + required = allOf + .filter(subschema => subschema.required) + .map(subschema => subschema.required) + .reduce((accumulator, property) => accumulator.concat(property), required); + } - if (schema.properties) { - element.content = _.map(schema.properties, (subschema, property) => { - const member = this.generateMember(property, subschema); + const element = new ObjectElement(); + element.content = _.map(properties, (subschema, property) => { + const member = this.generateMember(property, subschema); - const required = schema.required && schema.required.includes(property); - member.attributes.typeAttributes = new ArrayElement([ - new StringElement(required ? 'required' : 'optional'), - ]); + const isRequired = required.includes(property); + member.attributes.typeAttributes = new ArrayElement([ + new StringElement(isRequired ? 'required' : 'optional'), + ]); - return member; - }); - } + return member; + }); return element; } diff --git a/test/schema.js b/test/schema.js index 6331299..0892ee8 100644 --- a/test/schema.js +++ b/test/schema.js @@ -404,6 +404,43 @@ describe('JSON Schema to Data Structure', () => { expect(dataStructure.content.description.toValue()) .to.equal('- Object must have more than, or equal to 2 properties'); }); + + it('produces object element from multiple allOf objects', () => { + const schema = { + type: 'object', + allOf: [ + { + type: 'object', + properties: { + name: { + type: 'string', + }, + }, + }, + { + type: 'object', + properties: { + admin: { + type: 'boolean', + }, + }, + required: ['admin'], + }, + ], + }; + + const dataStructure = schemaToDataStructure(schema); + + expect(dataStructure.element).to.equal('dataStructure'); + expect(dataStructure.content).to.be.instanceof(ObjectElement); + + const name = dataStructure.content.get('name'); + expect(name).not.to.be.undefined; + + const admin = dataStructure.content.getMember('admin'); + expect(admin).not.to.be.undefined; + expect(admin.attributes.typeAttributes.toValue()).to.deep.equal(['required']); + }); }); context('array schema', () => { From 0d092e4da8f512c7314d85bca6623748fcf97b11 Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Fri, 21 Jul 2017 13:12:40 +0100 Subject: [PATCH 2/2] chore: Release 0.12.1 --- CHANGELOG.md | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edea97c..d049341 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Master +# 0.12.1 ## Enhancements diff --git a/package.json b/package.json index 51e3067..022ad7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fury-adapter-swagger", - "version": "0.12.0", + "version": "0.12.1", "description": "Swagger 2.0 parser for Fury.js", "main": "./lib/adapter.js", "tonicExampleFilename": "tonic-example.js",