From 900bceda47e4c736e70a66e66cfce719b4c6d203 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 24 May 2021 18:53:42 -0400 Subject: [PATCH] Fix json schema array properties (#1709) * Fix proxy array properties being handled incorrectly * Add tests to check array properties --- ext/js/data/json-schema.js | 5 +++-- test/test-json-schema.js | 7 ++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ext/js/data/json-schema.js b/ext/js/data/json-schema.js index a6306c3a..8fb920fc 100644 --- a/ext/js/data/json-schema.js +++ b/ext/js/data/json-schema.js @@ -852,11 +852,12 @@ class JsonSchemaProxyHandler { let propertySchema; if (Array.isArray(target)) { - property = this._getArrayIndex(property); - if (property === null) { + const index = this._getArrayIndex(property); + if (index === null) { // Note: this does not currently wrap mutating functions like push, pop, shift, unshift, splice return target[property]; } + property = index; propertySchema = this._schema.getArrayItemSchema(property); } else { propertySchema = this._schema.getObjectPropertySchema(property); diff --git a/test/test-json-schema.js b/test/test-json-schema.js index c5ff830a..1c61f1b8 100644 --- a/test/test-json-schema.js +++ b/test/test-json-schema.js @@ -946,7 +946,12 @@ function testProxy1() { {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) => { value[1] = 'string'; }} + {error: false, value: ['default'], action: (value) => { value[1] = 'string'; }}, + {error: false, value: ['default'], action: (value) => { + value[1] = 'string'; + if (value.length !== 2) { throw new Error(`Invalid length; expected=2; actual=${value.length}`); } + if (typeof value.push !== 'function') { throw new Error(`Invalid push; expected=function; actual=${typeof value.push}`); } + }} ] },