diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2021-05-24 18:53:42 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-24 18:53:42 -0400 |
commit | 900bceda47e4c736e70a66e66cfce719b4c6d203 (patch) | |
tree | 045267dcafa66fcfe95897fb78942663590e1939 | |
parent | 54e102f343b651ac41b2ce34d38a3a4638192d4a (diff) |
Fix json schema array properties (#1709)
* Fix proxy array properties being handled incorrectly
* Add tests to check array properties
-rw-r--r-- | ext/js/data/json-schema.js | 5 | ||||
-rw-r--r-- | 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}`); } + }} ] }, |