Option schema default value info (#963)
* Add traversal info to getValidValueOrDefault * Move private function
This commit is contained in:
parent
dfdefc15d3
commit
75734de7eb
@ -147,34 +147,8 @@ class JsonSchemaValidator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getValidValueOrDefault(schema, value) {
|
getValidValueOrDefault(schema, value) {
|
||||||
let type = this._getValueType(value);
|
const info = new JsonSchemaTraversalInfo(value, schema);
|
||||||
const schemaType = schema.type;
|
return this._getValidValueOrDefault(schema, value, info);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getPropertySchema(schema, property, value) {
|
getPropertySchema(schema, property, value) {
|
||||||
@ -620,7 +594,38 @@ class JsonSchemaValidator {
|
|||||||
return null;
|
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 properties = new Set(Object.getOwnPropertyNames(value));
|
||||||
|
|
||||||
const required = schema.required;
|
const required = schema.required;
|
||||||
@ -630,7 +635,11 @@ class JsonSchemaValidator {
|
|||||||
|
|
||||||
const propertySchema = this._getPropertySchema(schema, property, value, null);
|
const propertySchema = this._getPropertySchema(schema, property, value, null);
|
||||||
if (propertySchema === null) { continue; }
|
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) {
|
if (propertySchema === null) {
|
||||||
Reflect.deleteProperty(value, property);
|
Reflect.deleteProperty(value, property);
|
||||||
} else {
|
} 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;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
_populateArrayDefaults(value, schema) {
|
_populateArrayDefaults(value, schema, info) {
|
||||||
for (let i = 0, ii = value.length; i < ii; ++i) {
|
for (let i = 0, ii = value.length; i < ii; ++i) {
|
||||||
const propertySchema = this._getPropertySchema(schema, i, value, null);
|
const propertySchema = this._getPropertySchema(schema, i, value, null);
|
||||||
if (propertySchema === null) { continue; }
|
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;
|
const minItems = schema.minItems;
|
||||||
@ -658,7 +675,11 @@ class JsonSchemaValidator {
|
|||||||
for (let i = value.length; i < minItems; ++i) {
|
for (let i = value.length; i < minItems; ++i) {
|
||||||
const propertySchema = this._getPropertySchema(schema, i, value, null);
|
const propertySchema = this._getPropertySchema(schema, i, value, null);
|
||||||
if (propertySchema === null) { break; }
|
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);
|
value.push(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user