diff --git a/src/normalizer.ts b/src/normalizer.ts index 6ba6c006..358108d8 100644 --- a/src/normalizer.ts +++ b/src/normalizer.ts @@ -145,6 +145,15 @@ rules.set('Transform const to singleton enum', schema => { } }) +rules.set('Spread required on allOf into its subSchema', schema => { + if (schema.allOf && schema.required) { + const schemaRequired = schema.required + schema.allOf.forEach(subSchema => { + subSchema.required = [...(subSchema.required || []), ...schemaRequired] + }) + } +}) + export function normalize(rootSchema: LinkedJSONSchema, filename: string, options: Options): NormalizedJSONSchema { rules.forEach(rule => traverse(rootSchema, schema => rule(schema, filename, options))) return rootSchema as NormalizedJSONSchema diff --git a/test/__snapshots__/test/test.ts.md b/test/__snapshots__/test/test.ts.md index 7e03a2c8..87dec240 100644 --- a/test/__snapshots__/test/test.ts.md +++ b/test/__snapshots__/test/test.ts.md @@ -9021,3 +9021,62 @@ Generated by [AVA](https://avajs.dev). ""␊ ]␊ }` + +## Spread required on AllOf into its sub-schema + +> Snapshot 1 + + `{␊ + "type": "object",␊ + "properties": {␊ + "reference": {␊ + "allOf": [␊ + {␊ + "$ref": "#/definitions/defined",␊ + "required": [␊ + "subproperty"␊ + ]␊ + }␊ + ],␊ + "required": [␊ + "subproperty"␊ + ]␊ + }␊ + },␊ + "definitions": {␊ + "defined": {␊ + "type": "object",␊ + "properties": {␊ + "subproperty": {␊ + "type": "integer"␊ + }␊ + },␊ + "required": [],␊ + "additionalProperties": true␊ + }␊ + },␊ + "additionalProperties": false,␊ + "required": [],␊ + "id": "RequiredOnAllOf"␊ + }` + +## mergeRequiredFromAllOf.js + +> Expected output to match snapshot for e2e test: mergeRequiredFromAllOf.js + + `/* tslint:disable */␊ + /**␊ + * This file was automatically generated by json-schema-to-typescript.␊ + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,␊ + * and run json-schema-to-typescript to regenerate this file.␊ + */␊ + ␊ + export interface MergeRequiredFromAllOf {␊ + reference?: Defined;␊ + }␊ + export interface Defined {␊ + foo: number;␊ + bar: string;␊ + [k: string]: unknown;␊ + }␊ + ` diff --git a/test/__snapshots__/test/test.ts.snap b/test/__snapshots__/test/test.ts.snap index 32b63915..7023c53f 100644 Binary files a/test/__snapshots__/test/test.ts.snap and b/test/__snapshots__/test/test.ts.snap differ diff --git a/test/e2e/mergeRequiredFromAllOf.ts b/test/e2e/mergeRequiredFromAllOf.ts new file mode 100644 index 00000000..02eddb05 --- /dev/null +++ b/test/e2e/mergeRequiredFromAllOf.ts @@ -0,0 +1,31 @@ +export const input = { + title: 'MergeRequiredFromAllOf', + type: 'object', + properties: { + reference: { + allOf: [ + { + $ref: '#/definitions/defined' + } + ], + required: ['foo'] + } + }, + definitions: { + defined: { + additionalProperties: true, + type: 'object', + properties: { + foo: { + type: 'integer' + }, + bar: { + type: 'string' + } + }, + required: ['bar'] + } + }, + required: [], + additionalProperties: false +} diff --git a/test/normalizer/requiredOnAllOf.json b/test/normalizer/requiredOnAllOf.json new file mode 100644 index 00000000..4b9962ab --- /dev/null +++ b/test/normalizer/requiredOnAllOf.json @@ -0,0 +1,62 @@ +{ + "name": "Spread required on AllOf into its sub-schema", + "in": { + "type": "object", + "properties": { + "reference": { + "allOf": [ + { + "$ref": "#/definitions/defined" + } + ], + "required": [ + "subproperty" + ] + } + }, + "definitions": { + "defined": { + "type": "object", + "properties": { + "subproperty": { + "type": "integer" + } + } + } + }, + "additionalProperties": false + }, + "out": { + "id": "RequiredOnAllOf", + "type": "object", + "properties": { + "reference": { + "allOf": [ + { + "$ref": "#/definitions/defined", + "required": [ + "subproperty" + ] + } + ], + "required": [ + "subproperty" + ] + } + }, + "definitions": { + "defined": { + "additionalProperties": true, + "type": "object", + "properties": { + "subproperty": { + "type": "integer" + } + }, + "required": [] + } + }, + "required": [], + "additionalProperties": false + } +} \ No newline at end of file