From ca8a2b4d5fd0b72c0241f5ab665502e33e24f6cd Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Mon, 7 Jun 2021 15:17:43 +0200 Subject: [PATCH 1/2] Fix map events --- lib/map-verifyer.js | 37 +++++++++++++++++++++++++++---------- test/spec-object-test.js | 27 +++++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/lib/map-verifyer.js b/lib/map-verifyer.js index 1ccd4ef..b8298fa 100644 --- a/lib/map-verifyer.js +++ b/lib/map-verifyer.js @@ -25,9 +25,9 @@ function mapVerifyer(keyVerify, valueTest) { } function createMapValueReader(valueTest, verify) { - return (map, emitter, parent) => { + return (map, emitter, base) => { return new Proxy(verify(unwrap(map)), { - get: createItemGetter(valueTest, emitter, parent, 'read'), + get: createItemGetter(valueTest, emitter, base, 'read'), set: failSet, deleteProperty: failDelete }); @@ -35,20 +35,37 @@ function createMapValueReader(valueTest, verify) { } function createMapValueWriter(valueTest) { - return (map, emitter, parent) => { + return (map, emitter, base) => { return new Proxy(unwrap(map), { - get: createItemGetter(valueTest, emitter, parent, 'write'), + get: createItemGetter(valueTest, emitter, base, 'write'), set(target, key, value) { - value = unwrap(value); - valueTest.verify(value, objectPath(parent, key)); - if (emitter) { - emitter.emit('set', objectPath(parent, key), value); + if (typeof key === 'string') { + value = unwrap(value); + const path = objectPath(base, key); + valueTest.verify(value, path); + if (emitter) { + emitter.emit('set', { + type: 'object', + object: target, + key, + value, + base, + path + }); + } } return Reflect.set(target, key, value); }, deleteProperty(target, key) { - if (emitter) { - emitter.emit('delete', objectPath(parent, key)); + if (emitter && typeof key === 'string') { + const path = objectPath(base, key); + emitter.emit('delete', { + type: 'object', + object: target, + key, + base, + path + }); } return Reflect.deleteProperty(target, key); } diff --git a/test/spec-object-test.js b/test/spec-object-test.js index 8df3e15..41b1cd2 100644 --- a/test/spec-object-test.js +++ b/test/spec-object-test.js @@ -1117,11 +1117,34 @@ describe('spec object', () => { }); it('emits "set" event for nested map property assign', () => { - const proxy = objectSchema.write({ some: { map: {} } }, emitter); + const original = {}; + const proxy = objectSchema.write({ some: { map: original } }, emitter); proxy.some.map.key = 42; - assert.calledOnceWith(onSet, 'some.map.key', 42); + assert.calledOnceWith(onSet, { + type: 'object', + object: original, + key: 'key', + base: 'some.map', + path: 'some.map.key', + value: 42 + }); + }); + + it('emits "delete" event for nested map property delete', () => { + const original = { key: 42 }; + const proxy = objectSchema.write({ some: { map: original } }, emitter); + + delete proxy.some.map.key; + + assert.calledOnceWith(onDelete, { + type: 'object', + object: original, + key: 'key', + base: 'some.map', + path: 'some.map.key' + }); }); }); From 3285d6a76266fbac033a801ff737317f4dbe3c48 Mon Sep 17 00:00:00 2001 From: Maximilian Antoni Date: Mon, 7 Jun 2021 15:27:08 +0200 Subject: [PATCH 2/2] 3.4.1 --- CHANGES.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index e073335..059fdb3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## 3.4.1 + +- 🐛 [`ca8a2b4`](https://github.com/javascript-studio/studio-schema/commit/ca8a2b4d5fd0b72c0241f5ab665502e33e24f6cd) + Fix map events + +_Released by [Maximilian Antoni](https://github.com/mantoni) on 2021-06-07._ + ## 3.4.0 - 🍏 [`b6485e9`](https://github.com/javascript-studio/studio-schema/commit/b6485e9d421184cf82afcd0d0d2641da8c43c45e) diff --git a/package-lock.json b/package-lock.json index 1e61247..fbad4f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@studio/schema", - "version": "3.4.0", + "version": "3.4.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@studio/schema", - "version": "3.4.0", + "version": "3.4.1", "license": "MIT", "devDependencies": { "@sinonjs/referee-sinon": "^9.0.2", diff --git a/package.json b/package.json index 2d10a41..8809bfc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@studio/schema", - "version": "3.4.0", + "version": "3.4.1", "description": "Plain JavaScript objects with runtime type guarantees", "main": "index.js", "scripts": {