Option schema default value info (#963)

* Add traversal info to getValidValueOrDefault

* Move private function
This commit is contained in:
toasted-nutbread 2020-10-27 19:27:27 -04:00 committed by GitHub
parent dfdefc15d3
commit 75734de7eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -147,34 +147,8 @@ class JsonSchemaValidator {
}
getValidValueOrDefault(schema, value) {
let type = this._getValueType(value);
const schemaType = schema.type;
if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schemaType)) {
let assignDefault = true;
const schemaDefault = schema.default;
if (typeof schemaDefault !== 'undefined') {
value = clone(schemaDefault);
type = this._getValueType(value);
assignDefault = !this._isValueTypeAny(value, type, schemaType);
}
if (assignDefault) {
value = this._getDefaultTypeValue(schemaType);
type = this._getValueType(value);
}
}
switch (type) {
case 'object':
value = this._populateObjectDefaults(value, schema);
break;
case 'array':
value = this._populateArrayDefaults(value, schema);
break;
}
return value;
const info = new JsonSchemaTraversalInfo(value, schema);
return this._getValidValueOrDefault(schema, value, info);
}
getPropertySchema(schema, property, value) {
@ -620,7 +594,38 @@ class JsonSchemaValidator {
return null;
}
_populateObjectDefaults(value, schema) {
_getValidValueOrDefault(schema, value, info) {
let type = this._getValueType(value);
const schemaType = schema.type;
if (typeof value === 'undefined' || !this._isValueTypeAny(value, type, schemaType)) {
let assignDefault = true;
const schemaDefault = schema.default;
if (typeof schemaDefault !== 'undefined') {
value = clone(schemaDefault);
type = this._getValueType(value);
assignDefault = !this._isValueTypeAny(value, type, schemaType);
}
if (assignDefault) {
value = this._getDefaultTypeValue(schemaType);
type = this._getValueType(value);
}
}
switch (type) {
case 'object':
value = this._populateObjectDefaults(value, schema, info);
break;
case 'array':
value = this._populateArrayDefaults(value, schema, info);
break;
}
return value;
}
_populateObjectDefaults(value, schema, info) {
const properties = new Set(Object.getOwnPropertyNames(value));
const required = schema.required;
@ -630,7 +635,11 @@ class JsonSchemaValidator {
const propertySchema = this._getPropertySchema(schema, property, value, null);
if (propertySchema === null) { continue; }
value[property] = this.getValidValueOrDefault(propertySchema, value[property]);
info.valuePush(property, value);
info.schemaPush(property, propertySchema);
value[property] = this._getValidValueOrDefault(propertySchema, value[property], info);
info.schemaPop();
info.valuePop();
}
}
@ -639,18 +648,26 @@ class JsonSchemaValidator {
if (propertySchema === null) {
Reflect.deleteProperty(value, property);
} else {
value[property] = this.getValidValueOrDefault(propertySchema, value[property]);
info.valuePush(property, value);
info.schemaPush(property, propertySchema);
value[property] = this._getValidValueOrDefault(propertySchema, value[property], info);
info.schemaPop();
info.valuePop();
}
}
return value;
}
_populateArrayDefaults(value, schema) {
_populateArrayDefaults(value, schema, info) {
for (let i = 0, ii = value.length; i < ii; ++i) {
const propertySchema = this._getPropertySchema(schema, i, value, null);
if (propertySchema === null) { continue; }
value[i] = this.getValidValueOrDefault(propertySchema, value[i]);
info.valuePush(i, value);
info.schemaPush(i, propertySchema);
value[i] = this._getValidValueOrDefault(propertySchema, value[i], info);
info.schemaPop();
info.valuePop();
}
const minItems = schema.minItems;
@ -658,7 +675,11 @@ class JsonSchemaValidator {
for (let i = value.length; i < minItems; ++i) {
const propertySchema = this._getPropertySchema(schema, i, value, null);
if (propertySchema === null) { break; }
const item = this.getValidValueOrDefault(propertySchema);
info.valuePush(i, value);
info.schemaPush(i, propertySchema);
const item = this._getValidValueOrDefault(propertySchema, void 0, info);
info.schemaPop();
info.valuePop();
value.push(item);
}
}