diff --git a/dist/amd/can-define-backup.js b/dist/amd/can-define-backup.js new file mode 100644 index 0000000..74b7831 --- /dev/null +++ b/dist/amd/can-define-backup.js @@ -0,0 +1,82 @@ +/*can-define-backup@2.0.0-pre.0#can-define-backup*/ +define([ + 'require', + 'exports', + 'module', + 'can-assign', + 'can-reflect', + 'can-simple-observable', + 'can-diff/deep', + 'can-diff/map' +], function (require, exports, module) { + var assign = require('can-assign'); + var canReflect = require('can-reflect'); + var SimpleObservable = require('can-simple-observable'); + var diffDeep = require('can-diff/deep'); + var diffMap = require('can-diff/map'); + var flatProps = function (a, cur) { + var obj = {}; + for (var prop in a) { + if (typeof a[prop] !== 'object' || a[prop] === null || a[prop] instanceof Date) { + obj[prop] = a[prop]; + } else { + obj[prop] = cur[prop]; + } + } + return obj; + }; + var observables = new WeakMap(); + function getBackup(map) { + var obs = observables.get(map); + if (!obs) { + obs = new SimpleObservable(); + observables.set(map, obs); + } + return obs; + } + function defineBackup(Map) { + assign(Map.prototype, { + backup: function () { + var store = getBackup(this); + canReflect.setValue(store, this.serialize()); + return this; + }, + isDirty: function (checkAssociations) { + var store = getBackup(this); + var backupStore = canReflect.getValue(store); + if (!backupStore) { + return false; + } + var currentValue = this.serialize(); + var patches; + if (!!checkAssociations) { + patches = diffDeep(currentValue, backupStore); + } else { + patches = diffMap(currentValue, backupStore).filter(function (patch) { + if (patch.type !== 'set') { + return true; + } else { + var curVal = currentValue[patch.key], backupVal = backupStore[patch.key]; + var twoObjectsCompared = curVal && backupVal && typeof curVal === 'object' && typeof backupVal === 'object'; + return !twoObjectsCompared; + } + }); + } + return patches.length; + }, + restore: function (restoreAssociations) { + var store = getBackup(this); + var curVal = canReflect.getValue(store); + var props = restoreAssociations ? curVal : flatProps(curVal, this); + if (this.isDirty(restoreAssociations)) { + for (var prop in props) { + this[prop] = props[prop]; + } + } + return this; + } + }); + return; + } + module.exports = exports = defineBackup; +}); \ No newline at end of file diff --git a/dist/cjs/can-define-backup.js b/dist/cjs/can-define-backup.js new file mode 100644 index 0000000..e05a717 --- /dev/null +++ b/dist/cjs/can-define-backup.js @@ -0,0 +1,71 @@ +/*can-define-backup@2.0.0-pre.0#can-define-backup*/ +var assign = require('can-assign'); +var canReflect = require('can-reflect'); +var SimpleObservable = require('can-simple-observable'); +var diffDeep = require('can-diff/deep/deep'); +var diffMap = require('can-diff/map/map'); +var flatProps = function (a, cur) { + var obj = {}; + for (var prop in a) { + if (typeof a[prop] !== 'object' || a[prop] === null || a[prop] instanceof Date) { + obj[prop] = a[prop]; + } else { + obj[prop] = cur[prop]; + } + } + return obj; +}; +var observables = new WeakMap(); +function getBackup(map) { + var obs = observables.get(map); + if (!obs) { + obs = new SimpleObservable(); + observables.set(map, obs); + } + return obs; +} +function defineBackup(Map) { + assign(Map.prototype, { + backup: function () { + var store = getBackup(this); + canReflect.setValue(store, this.serialize()); + return this; + }, + isDirty: function (checkAssociations) { + var store = getBackup(this); + var backupStore = canReflect.getValue(store); + if (!backupStore) { + return false; + } + var currentValue = this.serialize(); + var patches; + if (!!checkAssociations) { + patches = diffDeep(currentValue, backupStore); + } else { + patches = diffMap(currentValue, backupStore).filter(function (patch) { + if (patch.type !== 'set') { + return true; + } else { + var curVal = currentValue[patch.key], backupVal = backupStore[patch.key]; + var twoObjectsCompared = curVal && backupVal && typeof curVal === 'object' && typeof backupVal === 'object'; + return !twoObjectsCompared; + } + }); + } + return patches.length; + }, + restore: function (restoreAssociations) { + var store = getBackup(this); + var curVal = canReflect.getValue(store); + var props = restoreAssociations ? curVal : flatProps(curVal, this); + if (this.isDirty(restoreAssociations)) { + for (var prop in props) { + this[prop] = props[prop]; + } + } + return this; + } + }); + return; +} +module.exports = exports = defineBackup; \ No newline at end of file diff --git a/dist/global/can-define-backup.js b/dist/global/can-define-backup.js new file mode 100644 index 0000000..e49b385 --- /dev/null +++ b/dist/global/can-define-backup.js @@ -0,0 +1,222 @@ +/*[global-shim-start]*/ +(function(exports, global, doEval) { + // jshint ignore:line + var origDefine = global.define; + + var get = function(name) { + var parts = name.split("."), + cur = global, + i; + for (i = 0; i < parts.length; i++) { + if (!cur) { + break; + } + cur = cur[parts[i]]; + } + return cur; + }; + var set = function(name, val) { + var parts = name.split("."), + cur = global, + i, + part, + next; + for (i = 0; i < parts.length - 1; i++) { + part = parts[i]; + next = cur[part]; + if (!next) { + next = cur[part] = {}; + } + cur = next; + } + part = parts[parts.length - 1]; + cur[part] = val; + }; + var useDefault = function(mod) { + if (!mod || !mod.__esModule) return false; + var esProps = { __esModule: true, default: true }; + for (var p in mod) { + if (!esProps[p]) return false; + } + return true; + }; + + var hasCjsDependencies = function(deps) { + return ( + deps[0] === "require" && deps[1] === "exports" && deps[2] === "module" + ); + }; + + var modules = + (global.define && global.define.modules) || + (global._define && global._define.modules) || + {}; + var ourDefine = (global.define = function(moduleName, deps, callback) { + var module; + if (typeof deps === "function") { + callback = deps; + deps = []; + } + var args = [], + i; + for (i = 0; i < deps.length; i++) { + args.push( + exports[deps[i]] + ? get(exports[deps[i]]) + : modules[deps[i]] || get(deps[i]) + ); + } + // CJS has no dependencies but 3 callback arguments + if (hasCjsDependencies(deps) || (!deps.length && callback.length)) { + module = { exports: {} }; + args[0] = function(name) { + return exports[name] ? get(exports[name]) : modules[name]; + }; + args[1] = module.exports; + args[2] = module; + } else if (!args[0] && deps[0] === "exports") { + // Babel uses the exports and module object. + module = { exports: {} }; + args[0] = module.exports; + if (deps[1] === "module") { + args[1] = module; + } + } else if (!args[0] && deps[0] === "module") { + args[0] = { id: moduleName }; + } + + global.define = origDefine; + var result = callback ? callback.apply(null, args) : undefined; + global.define = ourDefine; + + // Favor CJS module.exports over the return value + result = module && module.exports ? module.exports : result; + modules[moduleName] = result; + + // Set global exports + var globalExport = exports[moduleName]; + if (globalExport && !get(globalExport)) { + if (useDefault(result)) { + result = result["default"]; + } + set(globalExport, result); + } + }); + global.define.orig = origDefine; + global.define.modules = modules; + global.define.amd = true; + ourDefine("@loader", [], function() { + // shim for @@global-helpers + var noop = function() {}; + return { + get: function() { + return { prepareGlobal: noop, retrieveGlobal: noop }; + }, + global: global, + __exec: function(__load) { + doEval(__load.source, global); + } + }; + }); +})( + {}, + typeof self == "object" && self.Object == Object + ? self + : typeof process === "object" && + Object.prototype.toString.call(process) === "[object process]" + ? global + : window, + function(__$source__, __$global__) { + // jshint ignore:line + eval("(function() { " + __$source__ + " \n }).call(__$global__);"); + } +); + +/*can-define-backup@2.0.0-pre.0#can-define-backup*/ +define('can-define-backup', [ + 'require', + 'exports', + 'module', + 'can-assign', + 'can-reflect', + 'can-simple-observable', + 'can-diff/deep/deep', + 'can-diff/map/map' +], function (require, exports, module) { + var assign = require('can-assign'); + var canReflect = require('can-reflect'); + var SimpleObservable = require('can-simple-observable'); + var diffDeep = require('can-diff/deep/deep'); + var diffMap = require('can-diff/map/map'); + var flatProps = function (a, cur) { + var obj = {}; + for (var prop in a) { + if (typeof a[prop] !== 'object' || a[prop] === null || a[prop] instanceof Date) { + obj[prop] = a[prop]; + } else { + obj[prop] = cur[prop]; + } + } + return obj; + }; + var observables = new WeakMap(); + function getBackup(map) { + var obs = observables.get(map); + if (!obs) { + obs = new SimpleObservable(); + observables.set(map, obs); + } + return obs; + } + function defineBackup(Map) { + assign(Map.prototype, { + backup: function () { + var store = getBackup(this); + canReflect.setValue(store, this.serialize()); + return this; + }, + isDirty: function (checkAssociations) { + var store = getBackup(this); + var backupStore = canReflect.getValue(store); + if (!backupStore) { + return false; + } + var currentValue = this.serialize(); + var patches; + if (!!checkAssociations) { + patches = diffDeep(currentValue, backupStore); + } else { + patches = diffMap(currentValue, backupStore).filter(function (patch) { + if (patch.type !== 'set') { + return true; + } else { + var curVal = currentValue[patch.key], backupVal = backupStore[patch.key]; + var twoObjectsCompared = curVal && backupVal && typeof curVal === 'object' && typeof backupVal === 'object'; + return !twoObjectsCompared; + } + }); + } + return patches.length; + }, + restore: function (restoreAssociations) { + var store = getBackup(this); + var curVal = canReflect.getValue(store); + var props = restoreAssociations ? curVal : flatProps(curVal, this); + if (this.isDirty(restoreAssociations)) { + for (var prop in props) { + this[prop] = props[prop]; + } + } + return this; + } + }); + return; + } + module.exports = exports = defineBackup; +}); +/*[global-shim-end]*/ +(function(global) { // jshint ignore:line + global._define = global.define; + global.define = global.define.orig; +} +)(typeof self == "object" && self.Object == Object ? self : (typeof process === "object" && Object.prototype.toString.call(process) === "[object process]") ? global : window); \ No newline at end of file