diff --git a/.travis.yml b/.travis.yml index 4e34a7b1..d5a11531 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,4 @@ language: node_js -dist: trusty -before_script: - - npm install -node_js: 6 +node_js: 8 script: - - npm test - - npm run bench + - npm test && npm run bench diff --git a/dist/fast-json-patch.js b/dist/fast-json-patch.js index 828e3d1b..945d3f53 100644 --- a/dist/fast-json-patch.js +++ b/dist/fast-json-patch.js @@ -1,4 +1,4 @@ -/*! fast-json-patch, version: 2.0.6 */ +/*! fast-json-patch, version: 2.0.7 */ var jsonpatch = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache @@ -741,10 +741,10 @@ exports.JsonPatchError = helpers_2.PatchError; exports.deepClone = helpers_2._deepClone; exports.escapePathComponent = helpers_2.escapePathComponent; exports.unescapePathComponent = helpers_2.unescapePathComponent; -var beforeDict = []; +var beforeDict = new WeakMap(); var Mirror = (function () { function Mirror(obj) { - this.observers = []; + this.observers = new Map(); this.obj = obj; } return Mirror; @@ -757,26 +757,13 @@ var ObserverInfo = (function () { return ObserverInfo; }()); function getMirror(obj) { - for (var i = 0, length = beforeDict.length; i < length; i++) { - if (beforeDict[i].obj === obj) { - return beforeDict[i]; - } - } + return beforeDict.get(obj); } function getObserverFromMirror(mirror, callback) { - for (var j = 0, length = mirror.observers.length; j < length; j++) { - if (mirror.observers[j].callback === callback) { - return mirror.observers[j].observer; - } - } + return mirror.observers.get(callback); } function removeObserverFromMirror(mirror, observer) { - for (var j = 0, length = mirror.observers.length; j < length; j++) { - if (mirror.observers[j].observer === observer) { - mirror.observers.splice(j, 1); - return; - } - } + mirror.observers.delete(observer.callback); } /** * Detach an observer from an object @@ -790,15 +777,15 @@ exports.unobserve = unobserve; */ function observe(obj, callback) { var patches = []; - var root = obj; var observer; var mirror = getMirror(obj); if (!mirror) { mirror = new Mirror(obj); - beforeDict.push(mirror); + beforeDict.set(obj, mirror); } else { - observer = getObserverFromMirror(mirror, callback); + var observerInfo = getObserverFromMirror(mirror, callback); + observer = observerInfo && observerInfo.observer; } if (observer) { return observer; @@ -853,7 +840,7 @@ function observe(obj, callback) { } } }; - mirror.observers.push(new ObserverInfo(callback, observer)); + mirror.observers.set(callback, new ObserverInfo(callback, observer)); return observer; } exports.observe = observe; @@ -861,13 +848,7 @@ exports.observe = observe; * Generate an array of patches from an observer */ function generate(observer) { - var mirror; - for (var i = 0, length = beforeDict.length; i < length; i++) { - if (beforeDict[i].obj === observer.object) { - mirror = beforeDict[i]; - break; - } - } + var mirror = beforeDict.get(observer.object); _generate(mirror.value, observer.object, observer.patches, ""); if (observer.patches.length) { core_1.applyPatch(mirror.value, observer.patches); diff --git a/dist/fast-json-patch.min.js b/dist/fast-json-patch.min.js index df1eaa9b..ec817fb1 100644 --- a/dist/fast-json-patch.min.js +++ b/dist/fast-json-patch.min.js @@ -1,2 +1,2 @@ -/*! fast-json-patch, version: 2.0.6 */ -var jsonpatch=function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={i:d,l:!1,exports:{}};return a[d].call(e.exports,e,e.exports,b),e.l=!0,e.exports}var c={};return b.m=a,b.c=c,b.i=function(a){return a},b.d=function(a,c,d){b.o(a,c)||Object.defineProperty(a,c,{configurable:!1,enumerable:!0,get:d})},b.n=function(a){var c=a&&a.__esModule?function(){return a['default']}:function(){return a};return b.d(c,'a',c),c},b.o=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)},b.p='',b(b.s=3)}([function(a,b){function c(a,b){return i.call(a,b)}function d(a){if(Array.isArray(a)){for(var b=Array(a.length),d=0;d=b){c++;continue}return!1}return!0},b.escapePathComponent=e,b.unescapePathComponent=function(a){return a.replace(/~1/g,'/').replace(/~0/g,'~')},b._getPathRecursive=f,b.getPath=function(a,b){if(a===b)return'/';var c=f(a,b);if(''===c)throw new Error('Object not found in root');return'/'+c},b.hasUndefined=g;var j=function(a){function b(b,c,d,e,f){a.call(this,b),this.message=b,this.name=c,this.index=d,this.operation=e,this.tree=f}return h(b,a),b}(Error);b.PatchError=j},function(a,b,c){function d(a,b){if(''==b)return a;var c={op:'_get',path:b};return e(a,c),c.value}function e(a,c,e,f){if(void 0===e&&(e=!1),void 0===f&&(f=!0),e&&('function'==typeof e?e(c,0,a,c.path):g(c,0)),''===c.path){var h={newDocument:a};if('add'===c.op)return h.newDocument=c.value,h;if('replace'===c.op)return h.newDocument=c.value,h.removed=a,h;if('move'===c.op||'copy'===c.op)return h.newDocument=d(a,c.from),'move'===c.op&&(h.removed=a),h;if('test'===c.op){if(h.test=k(a,c.value),!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h.newDocument=a,h}if('remove'===c.op)return h.removed=a,h.newDocument=null,h;if('_get'===c.op)return c.value=a,h;if(e)throw new b.JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902','OPERATION_OP_INVALID',0,c,a);else return h}else{f||(a=l._deepClone(a));var i,j,o,p=c.path||'',q=p.split('/'),r=a,s=1,t=q.length;for(o='function'==typeof e?e:g;;){if(j=q[s],e&&void 0==i&&(void 0===r[j]?i=q.slice(0,s).join('/'):s==t-1&&(i=c.path),void 0!==i&&o(c,0,a,i)),s++,Array.isArray(r)){if('-'===j)j=r.length;else if(e&&!l.isInteger(j))throw new b.JsonPatchError('Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index','OPERATION_PATH_ILLEGAL_ARRAY_INDEX',0,c.path,c);else l.isInteger(j)&&(j=~~j);if(s>=t){if(e&&'add'===c.op&&j>r.length)throw new b.JsonPatchError('The specified index MUST NOT be greater than the number of elements in the array','OPERATION_VALUE_OUT_OF_BOUNDS',0,c.path,c);var h=n[c.op].call(c,r,j,a);if(!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h}}else if(j&&-1!=j.indexOf('~')&&(j=l.unescapePathComponent(j)),s>=t){var h=m[c.op].call(c,r,j,a);if(!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h}r=r[j]}}}function f(a,c,d,f){if(void 0===f&&(f=!0),d&&!Array.isArray(c))throw new b.JsonPatchError('Patch sequence must be an array','SEQUENCE_NOT_AN_ARRAY');f||(a=l._deepClone(a));for(var g=Array(c.length),h=0,i=c.length;h=b){c++;continue}return!1}return!0},b.escapePathComponent=e,b.unescapePathComponent=function(a){return a.replace(/~1/g,'/').replace(/~0/g,'~')},b._getPathRecursive=f,b.getPath=function(a,b){if(a===b)return'/';var c=f(a,b);if(''===c)throw new Error('Object not found in root');return'/'+c},b.hasUndefined=g;var j=function(a){function b(b,c,d,e,f){a.call(this,b),this.message=b,this.name=c,this.index=d,this.operation=e,this.tree=f}return h(b,a),b}(Error);b.PatchError=j},function(a,b,c){function d(a,b){if(''==b)return a;var c={op:'_get',path:b};return e(a,c),c.value}function e(a,c,e,f){if(void 0===e&&(e=!1),void 0===f&&(f=!0),e&&('function'==typeof e?e(c,0,a,c.path):g(c,0)),''===c.path){var h={newDocument:a};if('add'===c.op)return h.newDocument=c.value,h;if('replace'===c.op)return h.newDocument=c.value,h.removed=a,h;if('move'===c.op||'copy'===c.op)return h.newDocument=d(a,c.from),'move'===c.op&&(h.removed=a),h;if('test'===c.op){if(h.test=k(a,c.value),!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h.newDocument=a,h}if('remove'===c.op)return h.removed=a,h.newDocument=null,h;if('_get'===c.op)return c.value=a,h;if(e)throw new b.JsonPatchError('Operation `op` property is not one of operations defined in RFC-6902','OPERATION_OP_INVALID',0,c,a);else return h}else{f||(a=l._deepClone(a));var i,j,o,p=c.path||'',q=p.split('/'),r=a,s=1,t=q.length;for(o='function'==typeof e?e:g;;){if(j=q[s],e&&void 0==i&&(void 0===r[j]?i=q.slice(0,s).join('/'):s==t-1&&(i=c.path),void 0!==i&&o(c,0,a,i)),s++,Array.isArray(r)){if('-'===j)j=r.length;else if(e&&!l.isInteger(j))throw new b.JsonPatchError('Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index','OPERATION_PATH_ILLEGAL_ARRAY_INDEX',0,c.path,c);else l.isInteger(j)&&(j=~~j);if(s>=t){if(e&&'add'===c.op&&j>r.length)throw new b.JsonPatchError('The specified index MUST NOT be greater than the number of elements in the array','OPERATION_VALUE_OUT_OF_BOUNDS',0,c.path,c);var h=n[c.op].call(c,r,j,a);if(!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h}}else if(j&&-1!=j.indexOf('~')&&(j=l.unescapePathComponent(j)),s>=t){var h=m[c.op].call(c,r,j,a);if(!1===h.test)throw new b.JsonPatchError('Test operation failed','TEST_OPERATION_FAILED',0,c,a);return h}r=r[j]}}}function f(a,c,d,f){if(void 0===f&&(f=!0),d&&!Array.isArray(c))throw new b.JsonPatchError('Patch sequence must be an array','SEQUENCE_NOT_AN_ARRAY');f||(a=l._deepClone(a));for(var g=Array(c.length),h=0,i=c.length;h { callback: (patches: Operation[]) => void; } -var beforeDict = []; +var beforeDict = new WeakMap(); class Mirror { obj: any; - observers = []; + observers : Map = new Map(); + value: Object | Array; - constructor(obj: any) { + constructor(obj: Object) { this.obj = obj; } } class ObserverInfo { - callback: any; - observer: any; + callback: Function; + observer: ObserverInfo; - constructor(callback, observer) { + constructor(callback: Function, observer: ObserverInfo) { this.callback = callback; this.observer = observer; } } -function getMirror(obj: any): any { - for (var i = 0, length = beforeDict.length; i < length; i++) { - if (beforeDict[i].obj === obj) { - return beforeDict[i]; - } - } +function getMirror(obj: Object): Mirror { + return beforeDict.get(obj); } -function getObserverFromMirror(mirror: any, callback): any { - for (var j = 0, length = mirror.observers.length; j < length; j++) { - if (mirror.observers[j].callback === callback) { - return mirror.observers[j].observer; - } - } +function getObserverFromMirror(mirror: Mirror, callback): ObserverInfo { + return mirror.observers.get(callback) } -function removeObserverFromMirror(mirror: any, observer): any { - for (var j = 0, length = mirror.observers.length; j < length; j++) { - if (mirror.observers[j].observer === observer) { - mirror.observers.splice(j, 1); - return; - } - } +function removeObserverFromMirror(mirror: Mirror, observer): void { + mirror.observers.delete(observer.callback); } /** @@ -82,17 +70,17 @@ export function unobserve(root: T, observer: Observer) { /** * Observes changes made to an object, which can then be retrieved using generate */ -export function observe(obj: any, callback?: (patches: Operation[]) => void): Observer { +export function observe(obj: Object|Array, callback?: (patches: Operation[]) => void): Observer { var patches = []; - var root = obj; var observer; var mirror = getMirror(obj); if (!mirror) { mirror = new Mirror(obj); - beforeDict.push(mirror); + beforeDict.set(obj, mirror); } else { - observer = getObserverFromMirror(mirror, callback); + const observerInfo = getObserverFromMirror(mirror, callback); + observer = observerInfo && observerInfo.observer; } if (observer) { @@ -155,7 +143,7 @@ export function observe(obj: any, callback?: (patches: Operation[]) => void): } }; - mirror.observers.push(new ObserverInfo(callback, observer)); + mirror.observers.set(callback, new ObserverInfo(callback, observer)); return observer; } @@ -163,14 +151,8 @@ export function observe(obj: any, callback?: (patches: Operation[]) => void): /** * Generate an array of patches from an observer */ -export function generate(observer: Observer): Operation[] { - var mirror; - for (var i = 0, length = beforeDict.length; i < length; i++) { - if (beforeDict[i].obj === observer.object) { - mirror = beforeDict[i]; - break; - } - } +export function generate(observer: Observer): Operation[] { + var mirror = beforeDict.get(observer.object); _generate(mirror.value, observer.object, observer.patches, ""); if (observer.patches.length) { applyPatch(mirror.value, observer.patches); @@ -237,7 +219,7 @@ function _generate(mirror, obj, patches, path) { /** * Create an array of patches from the differences in two objects */ -export function compare(tree1: any, tree2: any): Operation[] { +export function compare(tree1: Object | Array, tree2: Object | Array): Operation[] { var patches = []; _generate(tree1, tree2, patches, ''); return patches; diff --git a/tsconfig.json b/tsconfig.json index 4e0a4307..78450648 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,9 @@ "target": "es5", "outDir": "lib/", "module": "commonjs", + "lib": [ + "es2016", "dom" + ], "noEmitHelpers": false, "declaration": true, "removeComments": false,