fix: patternProperties in properties and items

This commit is contained in:
Alex Varchuk 2022-07-06 17:08:11 +03:00
parent 10eeb5ceac
commit 9b9215a5ff
4 changed files with 40 additions and 11 deletions

View File

@ -25,6 +25,26 @@
} }
} }
} }
},
"properties": {
"nestedObjectProp": {
"type": "object",
"patternProperties": {
".*": {
"type": "integer"
}
}
},
"nestedArrayProp": {
"type": "array",
"items": {
"patternProperties": {
".*": {
"type": "string"
}
}
}
}
} }
} }
} }

View File

@ -107,11 +107,22 @@ describe('Models', () => {
const spec = require('../fixtures/3.1/patternProperties.json'); const spec = require('../fixtures/3.1/patternProperties.json');
parser = new OpenAPIParser(spec, undefined, opts); parser = new OpenAPIParser(spec, undefined, opts);
const schema = new SchemaModel(parser, spec.components.schemas.Patterns, '', opts); const schema = new SchemaModel(parser, spec.components.schemas.Patterns, '', opts);
expect(schema.fields).toHaveLength(2);
expect(schema.fields![0].kind).toEqual('patternProperties'); expect(schema.fields).toHaveLength(4);
expect(schema.fields![0].schema.type).toEqual('string'); expect(schema.fields![0].kind).toEqual('field');
expect(schema.fields![1].kind).toEqual('patternProperties'); expect(schema.fields![0].name).toEqual('nestedObjectProp');
expect(schema.fields![1].schema.type).toEqual('object'); expect(schema.fields![0].schema.type).toEqual('object');
expect(schema.fields![0].schema.fields![0].kind).toEqual('patternProperties');
expect(schema.fields).toHaveLength(4);
expect(schema.fields![1].kind).toEqual('field');
expect(schema.fields![1].name).toEqual('nestedArrayProp');
expect(schema.fields![1].schema.items!.fields![0].kind).toEqual('patternProperties');
expect(schema.fields![2].kind).toEqual('patternProperties');
expect(schema.fields![2].schema.type).toEqual('string');
expect(schema.fields![3].kind).toEqual('patternProperties');
expect(schema.fields![3].schema.type).toEqual('object');
}); });
describe('type array', () => { describe('type array', () => {

View File

@ -418,7 +418,7 @@ function buildFields(
options: RedocNormalizedOptions, options: RedocNormalizedOptions,
): FieldModel[] { ): FieldModel[] {
const props = schema.properties || schema.prefixItems || schema.items || {}; const props = schema.properties || schema.prefixItems || schema.items || {};
let patternProps = schema.patternProperties || {}; const patternProps = schema.patternProperties || {};
const additionalProps = schema.additionalProperties || schema.unevaluatedProperties; const additionalProps = schema.additionalProperties || schema.unevaluatedProperties;
const itemsProps = schema.prefixItems ? schema.items : schema.additionalItems; const itemsProps = schema.prefixItems ? schema.items : schema.additionalItems;
const defaults = schema.default; const defaults = schema.default;
@ -432,10 +432,6 @@ function buildFields(
field = {}; field = {};
} }
if (field.patternProperties) {
patternProps = { ...patternProps, ...field.patternProperties };
}
const required = const required =
schema.required === undefined ? false : schema.required.indexOf(fieldName) > -1; schema.required === undefined ? false : schema.required.indexOf(fieldName) > -1;

View File

@ -136,7 +136,9 @@ export function isPrimitiveType(
isPrimitive = isPrimitive =
schema.properties !== undefined schema.properties !== undefined
? Object.keys(schema.properties).length === 0 ? Object.keys(schema.properties).length === 0
: schema.additionalProperties === undefined && schema.unevaluatedProperties === undefined; : schema.additionalProperties === undefined &&
schema.unevaluatedProperties === undefined &&
schema.patternProperties === undefined;
} }
if (isArray(schema.items) || isArray(schema.prefixItems)) { if (isArray(schema.items) || isArray(schema.prefixItems)) {