From 1542c29a7a200afbc07bbc69614d7fbbe312cd16 Mon Sep 17 00:00:00 2001 From: Damith Karunaratne Date: Tue, 16 Mar 2021 11:30:06 +0530 Subject: [PATCH 1/3] improved change tracking not to track if value is same --- .gitignore | 1 + src/__tests__/index.spec.ts | 10 ++++++++++ src/deep-equal.ts | 26 ++++++++++++++++++++++++++ src/index.ts | 10 ++++++++++ 4 files changed, 47 insertions(+) create mode 100644 src/deep-equal.ts diff --git a/.gitignore b/.gitignore index 009af54..5bcb6fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dist coverage +node_modules diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts index 8f253f5..1778c84 100644 --- a/src/__tests__/index.spec.ts +++ b/src/__tests__/index.spec.ts @@ -585,6 +585,16 @@ describe('Sakota', () => { expect(proxy.__sakota__.getChanges('', /a/)).toEqual({ $set: { a: 1000 } }); expect(proxy.__sakota__.getChanges('', /c/)).toEqual({ $unset: { c: true } }); }); + + it('should not track changes if value is not changed', () => { + const proxy = Sakota.create({ a: 10, b: 20, c: 30 }); + proxy.a = 10; + expect(proxy.__sakota__.getChanges()).toEqual({}); + proxy.a = 12; + expect(proxy.__sakota__.getChanges()).toEqual({ $set: { a: 12 } }); + proxy.a = 10; + expect(proxy.__sakota__.getChanges()).toEqual({}); + }); }); describe('hasChanges', () => { diff --git a/src/deep-equal.ts b/src/deep-equal.ts new file mode 100644 index 0000000..b972194 --- /dev/null +++ b/src/deep-equal.ts @@ -0,0 +1,26 @@ +// ref: https://stackoverflow.com/a/25456134 + +const deepEqual = (x: any, y: any) => { + if (x === y) { + return true; + } else if (typeof x == 'object' && x != null && (typeof y == 'object' && y != null)) { + if (Object.keys(x).length != Object.keys(y).length) { + return false; + } + + for (var prop in x) { + if (y.hasOwnProperty(prop)) { + if (!deepEqual(x[prop], y[prop])) { + return false; + } + } else { + return false; + } + } + + return true; + } + return false; +}; + +export default deepEqual; diff --git a/src/index.ts b/src/index.ts index 6ab645d..514bb6f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,5 @@ +import deepEqual from './deep-equal'; + /** * The key used to get the handler. */ @@ -237,6 +239,14 @@ export class Sakota implements ProxyHandler { if (!this.diff) { this.diff = { $set: {}, $unset: {} }; } + if (key in obj && deepEqual(obj[key], val)) { + if (this.diff.$unset[key] || this.diff.$set[key]) { + delete this.diff.$unset[key]; + delete this.diff.$set[key]; + this.onChange(); + } + return true; + } delete this.diff.$unset[key]; delete this.kids[key]; this.diff.$set[key] = val; From 9f4909860c96bcbfd482335988eb1db805002d69 Mon Sep 17 00:00:00 2001 From: Damith Karunaratne Date: Tue, 16 Mar 2021 15:18:17 +0530 Subject: [PATCH 2/3] changing the library version --- changelog.md | 5 +++++ package-lock.json | 2 +- package.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index d867e60..a5ff1e5 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,8 @@ +# 2021-03-16 - v2.4.3 + + - improved change tracking. now if the value of a property is updated with the same value it will not track as a change. + - es getters/setters configuration. + # 2019-06-18 - v2.4.2 - Cache getters and property descriptors using weakmaps to reduce property lookup overhead. diff --git a/package-lock.json b/package-lock.json index ec2bd6f..8be2536 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@creately/sakota", - "version": "2.4.2", + "version": "2.4.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ed0df6e..511d36d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@creately/sakota", - "version": "2.4.2", + "version": "2.4.3", "description": "Proxies js objects and records all changes made on an object without modifying the object.", "main": "dist/index.js", "typings": "dist/index.d.ts", From 0a438f641525d8186abb9def7838854bbd4cf2c9 Mon Sep 17 00:00:00 2001 From: Damith Karunaratne Date: Tue, 16 Mar 2021 16:26:13 +0530 Subject: [PATCH 3/3] enabling es setters and getters by default --- src/__tests__/index.spec.ts | 3 --- src/index.ts | 12 ++++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/__tests__/index.spec.ts b/src/__tests__/index.spec.ts index 1778c84..08d55cc 100644 --- a/src/__tests__/index.spec.ts +++ b/src/__tests__/index.spec.ts @@ -1,8 +1,5 @@ import { Sakota } from '../'; -Sakota.enableESGetters(); -Sakota.enableESSetters(); - /** * Function returns an array of different types of values. */ diff --git a/src/index.ts b/src/index.ts index 514bb6f..fa67012 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,8 +43,8 @@ export class Sakota implements ProxyHandler { */ private static config = { prodmode: false, - esgetter: false, - essetter: false, + esgetter: true, + essetter: true, }; /** @@ -57,15 +57,15 @@ export class Sakota implements ProxyHandler { /** * Makes Sakota support javascript getters (expensive!). */ - public static enableESGetters(): void { - this.config.esgetter = true; + public static disableESGetters(): void { + this.config.esgetter = false; } /** * Makes Sakota support javascript getters (expensive!). */ - public static enableESSetters(): void { - this.config.essetter = true; + public static disableESSetters(): void { + this.config.essetter = false; } /**