Fix set/deleteProperty not allowing array splicing (#1713)

* Fix set/deleteProperty not allowing array splicing

* Update tests
This commit is contained in:
toasted-nutbread 2021-05-26 21:08:24 -04:00 committed by GitHub
parent 8ed712512b
commit 52aa92208c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 5 deletions

View File

@ -874,9 +874,13 @@ class JsonSchemaProxyHandler {
let propertySchema;
if (Array.isArray(target)) {
property = this._getArrayIndex(property);
if (property === null) { throw new Error(`Property ${property} cannot be assigned to array`); }
if (property > target.length) { throw new Error('Array index out of range'); }
const index = this._getArrayIndex(property);
if (index === null) {
target[property] = value;
return true;
}
if (index > target.length) { throw new Error('Array index out of range'); }
property = index;
propertySchema = this._schema.getArrayItemSchema(property);
} else {
propertySchema = this._schema.getObjectPropertySchema(property);
@ -894,7 +898,7 @@ class JsonSchemaProxyHandler {
deleteProperty(target, property) {
const required = (
(typeof target === 'object' && target !== null) ?
(Array.isArray(target) || this._schema.isObjectPropertyRequired(property)) :
(!Array.isArray(target) && this._schema.isObjectPropertyRequired(property)) :
true
);
if (required) {

View File

@ -945,7 +945,7 @@ function testProxy1() {
tests: [
{error: false, value: ['default'], action: (value) => { value[0] = 'string'; }},
{error: true, value: ['default'], action: (value) => { value[0] = null; }},
{error: true, value: ['default'], action: (value) => { delete value[0]; }},
{error: false, value: ['default'], action: (value) => { delete value[0]; }},
{error: false, value: ['default'], action: (value) => { value[1] = 'string'; }},
{error: false, value: ['default'], action: (value) => {
value[1] = 'string';