diff --git a/CHANGELOG.md b/CHANGELOG.md index 82720c4..7b91692 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,37 @@ +##### 1.5.3 - 03 December 2014 + +###### Backwards compatible bug fixes +- #263 - bower: update bower.json acc to the spec + +##### 1.5.2 - 03 December 2014 + +###### Backwards compatible bug fixes +- #262 - store.previousAttributes is storing references to nested objects, preventing changes from being detected + +###### Other +- Change detection "should" work on nested attributes now + +##### 1.5.1 - 02 December 2014 + +###### Backwards compatible API changes +- #259 - Added the "contains", "notContains", "|contains", and "|notContains" operators + +###### Backwards compatible bug fixes +- #258 - No changes detected on nested fields + +##### 1.5.0 - 01 December 2014 + +###### Backwards compatible API changes +- Added DSHttpAdapter.getPath and DSLocalStorageAdapter.getPath + +###### Backwards compatible bug fixes +- Removed console.logs left over from a previous commit + +##### 1.4.3 - 30 November 2014 + +###### Backwards compatible bug fixes +- #253 - Injecting an item with relationships a second time breaks relationships + ##### 1.4.2 - 18 November 2014 ###### Backwards compatible API changes diff --git a/bower.json b/bower.json index 5d315ba..b4cf8b8 100644 --- a/bower.json +++ b/bower.json @@ -30,7 +30,7 @@ "devDependencies": { "angular": "1.2.25", "angular-mocks": "1.2.25", - "angular-cache": "3.2.0", + "angular-cache": "3.2.2", "observe-js": "0.3.4", "angular-data-mocks": "1.0.0", "bootstrap": "3.2.0" diff --git a/dist/angular-data.js b/dist/angular-data.js index 45498e9..c6d7e16 100644 --- a/dist/angular-data.js +++ b/dist/angular-data.js @@ -1,7 +1,7 @@ /** * @author Jason Dobry * @file angular-data.js -* @version 1.4.2 - Homepage +* @version 1.5.3 - Homepage * @copyright (c) 2014 Jason Dobry * @license MIT * @@ -27,6 +27,10 @@ // // Summary of modifications: // Fixed use of "delete" keyword for IE8 compatibility +// Exposed diffObjectFromOldObject on the exported object +// Added the "equals" argument to diffObjectFromOldObject to be used to check equality +// Added a way to to define a default equality operator for diffObjectFromOldObject +// Added a way in diffObjectFromOldObject to ignore changes to certain properties // Removed all code related to: // - ArrayObserver // - ArraySplice @@ -37,6 +41,12 @@ (function(global) { 'use strict'; + var equalityFn = function (a, b) { + return a === b; + }; + + var blacklist = []; + // Detect and do basic sanity checking on Object/Array.observe. function detectObjectObserve() { if (typeof Object.observe !== 'function' || @@ -136,7 +146,20 @@ objectIsEmpty(diff.changed); } - function diffObjectFromOldObject(object, oldObject) { + function isBlacklisted(prop, bl) { + if (!bl || !bl.length) { + return false; + } + var matches; + for (var i = 0; i < bl.length; i++) { + if ((Object.prototype.toString.call(bl[i]) === '[object RegExp]' && bl[i].test(prop)) || bl[i] === prop) { + return matches = prop; + } + } + return !!matches; + } + + function diffObjectFromOldObject(object, oldObject, equals, bl) { var added = {}; var removed = {}; var changed = {}; @@ -144,7 +167,10 @@ for (var prop in oldObject) { var newValue = object[prop]; - if (newValue !== undefined && newValue === oldObject[prop]) + if (isBlacklisted(prop, bl)) + continue; + + if (newValue !== undefined && (equals ? equals(newValue, oldObject[prop]) : newValue === oldObject[prop])) continue; if (!(prop in object)) { @@ -152,7 +178,7 @@ continue; } - if (newValue !== oldObject[prop]) + if (equals ? !equals(newValue, oldObject[prop]) : newValue !== oldObject[prop]) changed[prop] = newValue; } @@ -160,6 +186,9 @@ if (prop in oldObject) continue; + if (isBlacklisted(prop, bl)) + continue; + added[prop] = object[prop]; } @@ -469,7 +498,7 @@ oldValues); } else { oldValues = this.oldObject_; - diff = diffObjectFromOldObject(this.value_, this.oldObject_); + diff = diffObjectFromOldObject(this.value_, this.oldObject_, equalityFn, blacklist); } if (diffIsEmpty(diff)) @@ -587,6 +616,13 @@ } global.Observer = Observer; + global.diffObjectFromOldObject = diffObjectFromOldObject; + global.setEqualityFn = function (fn) { + equalityFn = fn; + }; + global.setBlacklist = function (bl) { + blacklist = bl; + }; global.Observer.runEOM_ = runEOM; global.Observer.observerSentinel_ = observerSentinel; // for testing. global.Observer.hasObjectObserve = hasObserve; @@ -606,7 +642,7 @@ var indexOf = require('./indexOf'); module.exports = contains; -},{"./indexOf":7}],3:[function(require,module,exports){ +},{"./indexOf":5}],3:[function(require,module,exports){ var makeIterator = require('../function/makeIterator_'); /** @@ -634,47 +670,7 @@ var makeIterator = require('../function/makeIterator_'); -},{"../function/makeIterator_":14}],4:[function(require,module,exports){ -var findIndex = require('./findIndex'); - - /** - * Returns first item that matches criteria - */ - function find(arr, iterator, thisObj){ - var idx = findIndex(arr, iterator, thisObj); - return idx >= 0? arr[idx] : void(0); - } - - module.exports = find; - - - -},{"./findIndex":5}],5:[function(require,module,exports){ -var makeIterator = require('../function/makeIterator_'); - - /** - * Returns the index of the first item that matches criteria - */ - function findIndex(arr, iterator, thisObj){ - iterator = makeIterator(iterator, thisObj); - if (arr == null) { - return -1; - } - - var i = -1, len = arr.length; - while (++i < len) { - if (iterator(arr[i], i, arr)) { - return i; - } - } - - return -1; - } - - module.exports = findIndex; - - -},{"../function/makeIterator_":14}],6:[function(require,module,exports){ +},{"../function/makeIterator_":12}],4:[function(require,module,exports){ /** @@ -699,7 +695,7 @@ var makeIterator = require('../function/makeIterator_'); -},{}],7:[function(require,module,exports){ +},{}],5:[function(require,module,exports){ /** @@ -729,7 +725,7 @@ var makeIterator = require('../function/makeIterator_'); module.exports = indexOf; -},{}],8:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ var filter = require('./filter'); function isValidString(val) { @@ -748,7 +744,7 @@ var filter = require('./filter'); module.exports = join; -},{"./filter":3}],9:[function(require,module,exports){ +},{"./filter":3}],7:[function(require,module,exports){ var indexOf = require('./indexOf'); /** @@ -763,7 +759,7 @@ var indexOf = require('./indexOf'); module.exports = remove; -},{"./indexOf":7}],10:[function(require,module,exports){ +},{"./indexOf":5}],8:[function(require,module,exports){ /** @@ -800,7 +796,7 @@ var indexOf = require('./indexOf'); -},{}],11:[function(require,module,exports){ +},{}],9:[function(require,module,exports){ /** @@ -857,7 +853,7 @@ var indexOf = require('./indexOf'); -},{}],12:[function(require,module,exports){ +},{}],10:[function(require,module,exports){ var isFunction = require('../lang/isFunction'); /** @@ -887,7 +883,7 @@ var isFunction = require('../lang/isFunction'); module.exports = toLookup; -},{"../lang/isFunction":21}],13:[function(require,module,exports){ +},{"../lang/isFunction":19}],11:[function(require,module,exports){ /** @@ -901,7 +897,7 @@ var isFunction = require('../lang/isFunction'); -},{}],14:[function(require,module,exports){ +},{}],12:[function(require,module,exports){ var identity = require('./identity'); var prop = require('./prop'); var deepMatches = require('../object/deepMatches'); @@ -937,7 +933,7 @@ var deepMatches = require('../object/deepMatches'); -},{"../object/deepMatches":30,"./identity":13,"./prop":15}],15:[function(require,module,exports){ +},{"../object/deepMatches":27,"./identity":11,"./prop":13}],13:[function(require,module,exports){ /** @@ -953,7 +949,7 @@ var deepMatches = require('../object/deepMatches'); -},{}],16:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ var kindOf = require('./kindOf'); var isPlainObject = require('./isPlainObject'); var mixIn = require('../object/mixIn'); @@ -988,7 +984,7 @@ var mixIn = require('../object/mixIn'); var flags = ''; flags += r.multiline ? 'm' : ''; flags += r.global ? 'g' : ''; - flags += r.ignorecase ? 'i' : ''; + flags += r.ignoreCase ? 'i' : ''; return new RegExp(r.source, flags); } @@ -1004,7 +1000,7 @@ var mixIn = require('../object/mixIn'); -},{"../object/mixIn":37,"./isPlainObject":24,"./kindOf":26}],17:[function(require,module,exports){ +},{"../object/mixIn":34,"./isPlainObject":22,"./kindOf":23}],15:[function(require,module,exports){ var clone = require('./clone'); var forOwn = require('../object/forOwn'); var kindOf = require('./kindOf'); @@ -1054,7 +1050,7 @@ var isPlainObject = require('./isPlainObject'); -},{"../object/forOwn":33,"./clone":16,"./isPlainObject":24,"./kindOf":26}],18:[function(require,module,exports){ +},{"../object/forOwn":30,"./clone":14,"./isPlainObject":22,"./kindOf":23}],16:[function(require,module,exports){ var isKind = require('./isKind'); /** */ @@ -1064,7 +1060,7 @@ var isKind = require('./isKind'); module.exports = isArray; -},{"./isKind":22}],19:[function(require,module,exports){ +},{"./isKind":20}],17:[function(require,module,exports){ var isKind = require('./isKind'); /** */ @@ -1074,7 +1070,7 @@ var isKind = require('./isKind'); module.exports = isBoolean; -},{"./isKind":22}],20:[function(require,module,exports){ +},{"./isKind":20}],18:[function(require,module,exports){ var forOwn = require('../object/forOwn'); var isArray = require('./isArray'); @@ -1100,7 +1096,7 @@ var isArray = require('./isArray'); -},{"../object/forOwn":33,"./isArray":18}],21:[function(require,module,exports){ +},{"../object/forOwn":30,"./isArray":16}],19:[function(require,module,exports){ var isKind = require('./isKind'); /** */ @@ -1110,7 +1106,7 @@ var isKind = require('./isKind'); module.exports = isFunction; -},{"./isKind":22}],22:[function(require,module,exports){ +},{"./isKind":20}],20:[function(require,module,exports){ var kindOf = require('./kindOf'); /** * Check if value is from a specific "kind". @@ -1121,7 +1117,7 @@ var kindOf = require('./kindOf'); module.exports = isKind; -},{"./kindOf":26}],23:[function(require,module,exports){ +},{"./kindOf":23}],21:[function(require,module,exports){ var isKind = require('./isKind'); /** */ @@ -1131,7 +1127,7 @@ var isKind = require('./isKind'); module.exports = isObject; -},{"./isKind":22}],24:[function(require,module,exports){ +},{"./isKind":20}],22:[function(require,module,exports){ /** @@ -1146,17 +1142,7 @@ var isKind = require('./isKind'); -},{}],25:[function(require,module,exports){ -var isKind = require('./isKind'); - /** - */ - function isRegExp(val) { - return isKind(val, 'RegExp'); - } - module.exports = isRegExp; - - -},{"./isKind":22}],26:[function(require,module,exports){ +},{}],23:[function(require,module,exports){ var _rKind = /^\[object (.*)\]$/, @@ -1178,7 +1164,7 @@ var isKind = require('./isKind'); module.exports = kindOf; -},{}],27:[function(require,module,exports){ +},{}],24:[function(require,module,exports){ /** @@ -1193,7 +1179,7 @@ var isKind = require('./isKind'); -},{}],28:[function(require,module,exports){ +},{}],25:[function(require,module,exports){ /** * @constant Maximum 32-bit signed integer value. (2^31 - 1) */ @@ -1201,7 +1187,7 @@ var isKind = require('./isKind'); module.exports = 2147483647; -},{}],29:[function(require,module,exports){ +},{}],26:[function(require,module,exports){ /** * @constant Minimum 32-bit signed integer value (-2^31). */ @@ -1209,7 +1195,7 @@ var isKind = require('./isKind'); module.exports = -2147483648; -},{}],30:[function(require,module,exports){ +},{}],27:[function(require,module,exports){ var forOwn = require('./forOwn'); var isArray = require('../lang/isArray'); @@ -1266,7 +1252,7 @@ var isArray = require('../lang/isArray'); -},{"../lang/isArray":18,"./forOwn":33}],31:[function(require,module,exports){ +},{"../lang/isArray":16,"./forOwn":30}],28:[function(require,module,exports){ var forOwn = require('./forOwn'); var isPlainObject = require('../lang/isPlainObject'); @@ -1302,7 +1288,7 @@ var isPlainObject = require('../lang/isPlainObject'); -},{"../lang/isPlainObject":24,"./forOwn":33}],32:[function(require,module,exports){ +},{"../lang/isPlainObject":22,"./forOwn":30}],29:[function(require,module,exports){ var hasOwn = require('./hasOwn'); var _hasDontEnumBug, @@ -1380,7 +1366,7 @@ var hasOwn = require('./hasOwn'); -},{"./hasOwn":34}],33:[function(require,module,exports){ +},{"./hasOwn":31}],30:[function(require,module,exports){ var hasOwn = require('./hasOwn'); var forIn = require('./forIn'); @@ -1401,7 +1387,7 @@ var forIn = require('./forIn'); -},{"./forIn":32,"./hasOwn":34}],34:[function(require,module,exports){ +},{"./forIn":29,"./hasOwn":31}],31:[function(require,module,exports){ /** @@ -1415,7 +1401,7 @@ var forIn = require('./forIn'); -},{}],35:[function(require,module,exports){ +},{}],32:[function(require,module,exports){ var forOwn = require('./forOwn'); /** @@ -1433,7 +1419,7 @@ var forOwn = require('./forOwn'); -},{"./forOwn":33}],36:[function(require,module,exports){ +},{"./forOwn":30}],33:[function(require,module,exports){ var hasOwn = require('./hasOwn'); var deepClone = require('../lang/deepClone'); var isObject = require('../lang/isObject'); @@ -1475,7 +1461,7 @@ var isObject = require('../lang/isObject'); -},{"../lang/deepClone":17,"../lang/isObject":23,"./hasOwn":34}],37:[function(require,module,exports){ +},{"../lang/deepClone":15,"../lang/isObject":21,"./hasOwn":31}],34:[function(require,module,exports){ var forOwn = require('./forOwn'); /** @@ -1505,7 +1491,7 @@ var forOwn = require('./forOwn'); module.exports = mixIn; -},{"./forOwn":33}],38:[function(require,module,exports){ +},{"./forOwn":30}],35:[function(require,module,exports){ var forEach = require('../array/forEach'); /** @@ -1526,7 +1512,7 @@ var forEach = require('../array/forEach'); -},{"../array/forEach":6}],39:[function(require,module,exports){ +},{"../array/forEach":4}],36:[function(require,module,exports){ var slice = require('../array/slice'); /** @@ -1546,7 +1532,7 @@ var slice = require('../array/slice'); -},{"../array/slice":10}],40:[function(require,module,exports){ +},{"../array/slice":8}],37:[function(require,module,exports){ var namespace = require('./namespace'); /** @@ -1565,7 +1551,7 @@ var namespace = require('./namespace'); -},{"./namespace":38}],41:[function(require,module,exports){ +},{"./namespace":35}],38:[function(require,module,exports){ var randInt = require('./randInt'); var isArray = require('../lang/isArray'); @@ -1582,7 +1568,7 @@ var isArray = require('../lang/isArray'); -},{"../lang/isArray":18,"./randInt":45}],42:[function(require,module,exports){ +},{"../lang/isArray":16,"./randInt":42}],39:[function(require,module,exports){ var randHex = require('./randHex'); var choice = require('./choice'); @@ -1608,7 +1594,7 @@ var choice = require('./choice'); module.exports = guid; -},{"./choice":41,"./randHex":44}],43:[function(require,module,exports){ +},{"./choice":38,"./randHex":41}],40:[function(require,module,exports){ var random = require('./random'); var MIN_INT = require('../number/MIN_INT'); var MAX_INT = require('../number/MAX_INT'); @@ -1625,7 +1611,7 @@ var MAX_INT = require('../number/MAX_INT'); module.exports = rand; -},{"../number/MAX_INT":28,"../number/MIN_INT":29,"./random":46}],44:[function(require,module,exports){ +},{"../number/MAX_INT":25,"../number/MIN_INT":26,"./random":43}],41:[function(require,module,exports){ var choice = require('./choice'); var _chars = '0123456789abcdef'.split(''); @@ -1646,7 +1632,7 @@ var choice = require('./choice'); -},{"./choice":41}],45:[function(require,module,exports){ +},{"./choice":38}],42:[function(require,module,exports){ var MIN_INT = require('../number/MIN_INT'); var MAX_INT = require('../number/MAX_INT'); var rand = require('./rand'); @@ -1666,7 +1652,7 @@ var rand = require('./rand'); module.exports = randInt; -},{"../number/MAX_INT":28,"../number/MIN_INT":29,"./rand":43}],46:[function(require,module,exports){ +},{"../number/MAX_INT":25,"../number/MIN_INT":26,"./rand":40}],43:[function(require,module,exports){ /** @@ -1686,7 +1672,7 @@ var rand = require('./rand'); -},{}],47:[function(require,module,exports){ +},{}],44:[function(require,module,exports){ var toString = require('../lang/toString'); var replaceAccents = require('./replaceAccents'); var removeNonWord = require('./removeNonWord'); @@ -1708,7 +1694,7 @@ var lowerCase = require('./lowerCase'); module.exports = camelCase; -},{"../lang/toString":27,"./lowerCase":48,"./removeNonWord":51,"./replaceAccents":52,"./upperCase":53}],48:[function(require,module,exports){ +},{"../lang/toString":24,"./lowerCase":45,"./removeNonWord":48,"./replaceAccents":49,"./upperCase":50}],45:[function(require,module,exports){ var toString = require('../lang/toString'); /** * "Safer" String.toLowerCase() @@ -1721,7 +1707,7 @@ var toString = require('../lang/toString'); module.exports = lowerCase; -},{"../lang/toString":27}],49:[function(require,module,exports){ +},{"../lang/toString":24}],46:[function(require,module,exports){ var join = require('../array/join'); var slice = require('../array/slice'); @@ -1738,7 +1724,7 @@ var slice = require('../array/slice'); module.exports = makePath; -},{"../array/join":8,"../array/slice":10}],50:[function(require,module,exports){ +},{"../array/join":6,"../array/slice":8}],47:[function(require,module,exports){ var toString = require('../lang/toString'); var camelCase = require('./camelCase'); var upperCase = require('./upperCase'); @@ -1753,7 +1739,7 @@ var upperCase = require('./upperCase'); module.exports = pascalCase; -},{"../lang/toString":27,"./camelCase":47,"./upperCase":53}],51:[function(require,module,exports){ +},{"../lang/toString":24,"./camelCase":44,"./upperCase":50}],48:[function(require,module,exports){ var toString = require('../lang/toString'); // This pattern is generated by the _build/pattern-removeNonWord.js script var PATTERN = /[^\x20\x2D0-9A-Z\x5Fa-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/g; @@ -1769,7 +1755,7 @@ var toString = require('../lang/toString'); module.exports = removeNonWord; -},{"../lang/toString":27}],52:[function(require,module,exports){ +},{"../lang/toString":24}],49:[function(require,module,exports){ var toString = require('../lang/toString'); /** * Replaces all accented chars with regular ones @@ -1807,7 +1793,7 @@ var toString = require('../lang/toString'); module.exports = replaceAccents; -},{"../lang/toString":27}],53:[function(require,module,exports){ +},{"../lang/toString":24}],50:[function(require,module,exports){ var toString = require('../lang/toString'); /** * "Safer" String.toUpperCase() @@ -1819,7 +1805,7 @@ var toString = require('../lang/toString'); module.exports = upperCase; -},{"../lang/toString":27}],54:[function(require,module,exports){ +},{"../lang/toString":24}],51:[function(require,module,exports){ /** * @doc function * @id DSHttpAdapterProvider @@ -1891,6 +1877,36 @@ function DSHttpAdapterProvider() { this.$get = ['$http', '$log', 'DSUtils', function ($http, $log, DSUtils) { + /** + * @doc method + * @id DSHttpAdapter.methods:getPath + * @name getPath + * @description + * Return the path that would be used by this adapter for a given operation. + * + * ## Signature: + * ```js + * DSHttpAdapter.getPath(method, resourceConfig, id|attrs|params, options)) + * ``` + * + * @param {string} method The name of the method . + * @param {object} resourceConfig The object returned by DS.defineResource. + * @param {string|object} id|attrs|params The id, attrs, or params that you would pass into the method. + * @param {object} options Configuration options. + * @returns {string} The path. + */ + function getPath(method, resourceConfig, id, options) { + options = options || {}; + var args = [ + options.baseUrl || resourceConfig.baseUrl, + resourceConfig.getEndpoint((DSUtils.isString(id) || DSUtils.isNumber(id) || method === 'create') ? id : null, options) + ]; + if (method === 'find' || method === 'update' || method === 'destroy') { + args.push(id); + } + return DSUtils.makePath.apply(DSUtils, args); + } + /** * @doc interface * @id DSHttpAdapter @@ -1909,6 +1925,8 @@ function DSHttpAdapterProvider() { */ defaults: defaults, + getPath: getPath, + /** * @doc method * @id DSHttpAdapter.methods:HTTP @@ -2072,7 +2090,7 @@ function DSHttpAdapterProvider() { find: function (resourceConfig, id, options) { options = options || {}; return this.GET( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id), + getPath('find', resourceConfig, id, options), options ); }, @@ -2109,7 +2127,7 @@ function DSHttpAdapterProvider() { DSUtils.deepMixIn(options.params, params); } return this.GET( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(null, options)), + getPath('findAll', resourceConfig, params, options), options ); }, @@ -2141,7 +2159,7 @@ function DSHttpAdapterProvider() { create: function (resourceConfig, attrs, options) { options = options || {}; return this.POST( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(attrs, options)), + getPath('create', resourceConfig, attrs, options), attrs, options ); @@ -2175,7 +2193,7 @@ function DSHttpAdapterProvider() { update: function (resourceConfig, id, attrs, options) { options = options || {}; return this.PUT( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id), + getPath('update', resourceConfig, id, options), attrs, options ); @@ -2214,7 +2232,7 @@ function DSHttpAdapterProvider() { DSUtils.deepMixIn(options.params, params); } return this.PUT( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(null, options)), + getPath('updateAll', resourceConfig, attrs, options), attrs, options ); @@ -2247,7 +2265,7 @@ function DSHttpAdapterProvider() { destroy: function (resourceConfig, id, options) { options = options || {}; return this.DEL( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id), + getPath('destroy', resourceConfig, id, options), options ); }, @@ -2284,7 +2302,7 @@ function DSHttpAdapterProvider() { DSUtils.deepMixIn(options.params, params); } return this.DEL( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(null, options)), + getPath('destroyAll', resourceConfig, params, options), options ); } @@ -2294,7 +2312,7 @@ function DSHttpAdapterProvider() { module.exports = DSHttpAdapterProvider; -},{}],55:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ /*! * @doc function * @id DSLocalStorageAdapterProvider @@ -2304,6 +2322,36 @@ function DSLocalStorageAdapterProvider() { this.$get = ['$q', 'DSUtils', 'DSErrors', function ($q, DSUtils) { + /** + * @doc method + * @id DSLocalStorageAdapter.methods:getPath + * @name getPath + * @description + * Return the path that would be used by this adapter for a given operation. + * + * ## Signature: + * ```js + * DSLocalStorageAdapter.getPath(method, resourceConfig, id|attrs|params, options)) + * ``` + * + * @param {string} method The name of the method . + * @param {object} resourceConfig The object returned by DS.defineResource. + * @param {string|object} id|attrs|params The id, attrs, or params that you would pass into the method. + * @param {object} options Configuration options. + * @returns {string} The path. + */ + function getPath(method, resourceConfig, id, options) { + options = options || {}; + var args = [ + options.baseUrl || resourceConfig.baseUrl, + resourceConfig.getEndpoint((DSUtils.isString(id) || DSUtils.isNumber(id) || method === 'create') ? id : null, options) + ]; + if (method === 'find' || method === 'update' || method === 'destroy') { + args.push(id); + } + return DSUtils.makePath.apply(DSUtils, args); + } + /** * @doc interface * @id DSLocalStorageAdapter @@ -2454,7 +2502,7 @@ function DSLocalStorageAdapterProvider() { */ find: function find(resourceConfig, id, options) { options = options || {}; - return this.GET(DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.endpoint, id)).then(function (item) { + return this.GET(getPath('find', resourceConfig, id, options)).then(function (item) { if (!item) { return $q.reject(new Error('Not Found!')); } else { @@ -2493,7 +2541,7 @@ function DSLocalStorageAdapterProvider() { var items = []; var ids = DSUtils.keys(_this.getIds(resourceConfig.name, options)); DSUtils.forEach(ids, function (id) { - var itemJson = localStorage.getItem(DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id)); + var itemJson = localStorage.getItem(getPath('find', resourceConfig, id, options)); if (itemJson) { items.push(DSUtils.fromJson(itemJson)); } @@ -2536,15 +2584,19 @@ function DSLocalStorageAdapterProvider() { */ create: function (resourceConfig, attrs, options) { var _this = this; - attrs[resourceConfig.idAttribute] = attrs[resourceConfig.idAttribute] || DSUtils.guid(); + var id = attrs[resourceConfig.idAttribute]; options = options || {}; - return this.PUT( - DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(attrs, options), attrs[resourceConfig.idAttribute]), - attrs - ).then(function (item) { - _this.ensureId(item[resourceConfig.idAttribute], resourceConfig.name, options); - return item; - }); + return _this.GET(getPath('find', resourceConfig, id, options)).then(function (item) { + if (item) { + DSUtils.deepMixIn(item, attrs); + } else { + attrs[resourceConfig.idAttribute] = id = id || DSUtils.guid(); + } + return _this.PUT(getPath('update', resourceConfig, id, options), item || attrs); + }).then(function (item) { + _this.ensureId(item[resourceConfig.idAttribute], resourceConfig.name, options); + return item; + }); }, /** @@ -2582,9 +2634,13 @@ function DSLocalStorageAdapterProvider() { update: function (resourceConfig, id, attrs, options) { options = options || {}; var _this = this; - return _this.find(resourceConfig, id, options).then(function (item) { + return _this.GET(getPath('find', resourceConfig, id, options)).then(function (item) { + item = item || {}; DSUtils.deepMixIn(item, attrs); - return _this.PUT(DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id), item); + return _this.PUT(getPath('update', resourceConfig, id, options), item); + }).then(function (item) { + _this.ensureId(item[resourceConfig.idAttribute], resourceConfig.name, options); + return item; }); }, @@ -2653,7 +2709,7 @@ function DSLocalStorageAdapterProvider() { */ destroy: function (resourceConfig, id, options) { options = options || {}; - return this.DEL(DSUtils.makePath(options.baseUrl || resourceConfig.baseUrl, resourceConfig.getEndpoint(id, options), id)); + return this.DEL(getPath('destroy', resourceConfig, id, options)); }, /** @@ -2692,7 +2748,7 @@ function DSLocalStorageAdapterProvider() { module.exports = DSLocalStorageAdapterProvider; -},{}],56:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.create(' + resourceName + ', attrs[, options]): '; } @@ -2821,7 +2877,7 @@ function create(resourceName, attrs, options) { var created = DS.inject(resourceName, attrs, options); var id = created[definition.idAttribute]; resource.completedQueries[id] = new Date().getTime(); - resource.previousAttributes[id] = DSUtils.deepMixIn({}, created); + resource.previousAttributes[id] = DSUtils.copy(created); resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]); return DS.get(resourceName, id); } else { @@ -2842,7 +2898,7 @@ function create(resourceName, attrs, options) { module.exports = create; -},{}],57:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.destroy(' + resourceName + ', ' + id + '[, options]): '; } @@ -2953,7 +3009,7 @@ function destroy(resourceName, id, options) { module.exports = destroy; -},{}],58:[function(require,module,exports){ +},{}],55:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.destroyAll(' + resourceName + ', params[, options]): '; } @@ -3046,7 +3102,7 @@ function destroyAll(resourceName, params, options) { module.exports = destroyAll; -},{}],59:[function(require,module,exports){ +},{}],56:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.find(' + resourceName + ', ' + id + '[, options]): '; } @@ -3155,7 +3211,7 @@ function find(resourceName, id, options) { module.exports = find; -},{}],60:[function(require,module,exports){ +},{}],57:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.findAll(' + resourceName + ', params[, options]): '; } @@ -3335,7 +3391,7 @@ function findAll(resourceName, params, options) { module.exports = findAll; -},{}],61:[function(require,module,exports){ +},{}],58:[function(require,module,exports){ module.exports = { /** * @doc method @@ -3438,7 +3494,7 @@ module.exports = { updateAll: require('./updateAll') }; -},{"./create":56,"./destroy":57,"./destroyAll":58,"./find":59,"./findAll":60,"./loadRelations":62,"./refresh":63,"./save":64,"./update":65,"./updateAll":66}],62:[function(require,module,exports){ +},{"./create":53,"./destroy":54,"./destroyAll":55,"./find":56,"./findAll":57,"./loadRelations":59,"./refresh":60,"./save":61,"./update":62,"./updateAll":63}],59:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.loadRelations(' + resourceName + ', instance(Id), relations[, options]): '; } @@ -3592,7 +3648,7 @@ function loadRelations(resourceName, instance, relations, options) { module.exports = loadRelations; -},{}],63:[function(require,module,exports){ +},{}],60:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.refresh(' + resourceName + ', ' + id + '[, options]): '; } @@ -3677,7 +3733,7 @@ function refresh(resourceName, id, options) { module.exports = refresh; -},{}],64:[function(require,module,exports){ +},{}],61:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.save(' + resourceName + ', ' + id + '[, options]): '; } @@ -3810,7 +3866,7 @@ function save(resourceName, id, options) { if (options.cacheResponse) { var resource = DS.store[resourceName]; var saved = DS.inject(definition.name, attrs, options); - resource.previousAttributes[id] = DSUtils.deepMixIn({}, saved); + resource.previousAttributes[id] = DSUtils.copy(saved); resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]); resource.observers[id].discardChanges(); return DS.get(resourceName, id); @@ -3826,7 +3882,7 @@ function save(resourceName, id, options) { module.exports = save; -},{}],65:[function(require,module,exports){ +},{}],62:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.update(' + resourceName + ', ' + id + ', attrs[, options]): '; } @@ -3939,7 +3995,7 @@ function update(resourceName, id, attrs, options) { var resource = DS.store[resourceName]; var updated = DS.inject(definition.name, attrs, options); var id = updated[definition.idAttribute]; - resource.previousAttributes[id] = DSUtils.deepMixIn({}, updated); + resource.previousAttributes[id] = DSUtils.copy(updated); resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]); resource.observers[id].discardChanges(); return DS.get(definition.name, id); @@ -3955,7 +4011,7 @@ function update(resourceName, id, attrs, options) { module.exports = update; -},{}],66:[function(require,module,exports){ +},{}],63:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.updateAll(' + resourceName + ', attrs, params[, options]): '; } @@ -4089,9 +4145,7 @@ function updateAll(resourceName, attrs, params, options) { module.exports = updateAll; -},{}],67:[function(require,module,exports){ -var observe = require('../../lib/observe-js/observe-js'); - +},{}],64:[function(require,module,exports){ function lifecycleNoop(resourceName, attrs, cb) { cb(null, attrs); } @@ -4188,64 +4242,55 @@ Defaults.prototype.defaultFilter = function (collection, resourceName, params, o }; } if (DSUtils.isObject(clause)) { - DSUtils.forEach(clause, function (val, op) { + DSUtils.forEach(clause, function (term, op) { + var expr; + var isOr = op[0] === '|'; + var val = attrs[field]; + op = isOr ? op.substr(1) : op; if (op === '==') { - keep = first ? (attrs[field] == val) : keep && (attrs[field] == val); + expr = val == term; } else if (op === '===') { - keep = first ? (attrs[field] === val) : keep && (attrs[field] === val); + expr = val === term; } else if (op === '!=') { - keep = first ? (attrs[field] != val) : keep && (attrs[field] != val); + expr = val != term; } else if (op === '!==') { - keep = first ? (attrs[field] !== val) : keep && (attrs[field] !== val); + expr = val !== term; } else if (op === '>') { - keep = first ? (attrs[field] > val) : keep && (attrs[field] > val); + expr = val > term; } else if (op === '>=') { - keep = first ? (attrs[field] >= val) : keep && (attrs[field] >= val); + expr = val >= term; } else if (op === '<') { - keep = first ? (attrs[field] < val) : keep && (attrs[field] < val); + expr = val < term; } else if (op === '<=') { - keep = first ? (attrs[field] <= val) : keep && (attrs[field] <= val); + expr = val <= term; } else if (op === 'in') { - if (DSUtils.isString(val)) { - keep = first ? val.indexOf(attrs[field]) !== -1 : keep && val.indexOf(attrs[field]) !== -1; + if (DSUtils.isString(term)) { + expr = term.indexOf(val) !== -1; } else { - keep = first ? DSUtils.contains(val, attrs[field]) : keep && DSUtils.contains(val, attrs[field]); + expr = DSUtils.contains(term, val); } } else if (op === 'notIn') { - if (DSUtils.isString(val)) { - keep = first ? val.indexOf(attrs[field]) === -1 : keep && val.indexOf(attrs[field]) === -1; + if (DSUtils.isString(term)) { + expr = term.indexOf(val) === -1; } else { - keep = first ? !DSUtils.contains(val, attrs[field]) : keep && !DSUtils.contains(val, attrs[field]); + expr = !DSUtils.contains(term, val); } - } else if (op === '|==') { - keep = first ? (attrs[field] == val) : keep || (attrs[field] == val); - } else if (op === '|===') { - keep = first ? (attrs[field] === val) : keep || (attrs[field] === val); - } else if (op === '|!=') { - keep = first ? (attrs[field] != val) : keep || (attrs[field] != val); - } else if (op === '|!==') { - keep = first ? (attrs[field] !== val) : keep || (attrs[field] !== val); - } else if (op === '|>') { - keep = first ? (attrs[field] > val) : keep || (attrs[field] > val); - } else if (op === '|>=') { - keep = first ? (attrs[field] >= val) : keep || (attrs[field] >= val); - } else if (op === '|<') { - keep = first ? (attrs[field] < val) : keep || (attrs[field] < val); - } else if (op === '|<=') { - keep = first ? (attrs[field] <= val) : keep || (attrs[field] <= val); - } else if (op === '|in') { - if (DSUtils.isString(val)) { - keep = first ? val.indexOf(attrs[field]) !== -1 : keep || val.indexOf(attrs[field]) !== -1; + } else if (op === 'contains') { + if (DSUtils.isString(term)) { + expr = (val || '').indexOf(term) !== -1; } else { - keep = first ? DSUtils.contains(val, attrs[field]) : keep || DSUtils.contains(val, attrs[field]); + expr = DSUtils.contains(val, term); } - } else if (op === '|notIn') { - if (DSUtils.isString(val)) { - keep = first ? val.indexOf(attrs[field]) === -1 : keep || val.indexOf(attrs[field]) === -1; + } else if (op === 'notContains') { + if (DSUtils.isString(term)) { + expr = (val || '').indexOf(term) === -1; } else { - keep = first ? !DSUtils.contains(val, attrs[field]) : keep || !DSUtils.contains(val, attrs[field]); + expr = !DSUtils.contains(val, term); } } + if (expr !== undefined) { + keep = first ? expr : (isOr ? keep || expr : keep && expr); + } first = false; }); } @@ -4900,7 +4945,7 @@ function DSProvider() { if (typeof Object.observe !== 'function' || typeof Array.observe !== 'function') { $rootScope.$watch(function () { - observe.Platform.performMicrotaskCheckpoint(); + DSUtils.observe.Platform.performMicrotaskCheckpoint(); }); } @@ -4911,7 +4956,7 @@ function DSProvider() { module.exports = DSProvider; -},{"../../lib/observe-js/observe-js":1,"./async_methods":61,"./sync_methods":82}],68:[function(require,module,exports){ +},{"./async_methods":58,"./sync_methods":79}],65:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.bindAll(scope, expr, ' + resourceName + ', params[, cb]): '; } @@ -4996,7 +5041,7 @@ function bindAll(scope, expr, resourceName, params, cb) { module.exports = bindAll; -},{}],69:[function(require,module,exports){ +},{}],66:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.bindOne(scope, expr, ' + resourceName + ', id[, cb]): '; } @@ -5068,7 +5113,7 @@ function bindOne(scope, expr, resourceName, id, cb) { module.exports = bindOne; -},{}],70:[function(require,module,exports){ +},{}],67:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.changeHistory(' + resourceName + ', id): '; } @@ -5137,7 +5182,7 @@ function changeHistory(resourceName, id) { module.exports = changeHistory; -},{}],71:[function(require,module,exports){ +},{}],68:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.changes(' + resourceName + ', id): '; } @@ -5203,7 +5248,7 @@ function changes(resourceName, id, options) { var item = DS.get(resourceName, id); if (item) { DS.store[resourceName].observers[id].deliver(); - var diff = DSUtils.diffObjectFromOldObject(item, DS.store[resourceName].previousAttributes[id], options.ignoredChanges); + var diff = DSUtils.diffObjectFromOldObject(item, DS.store[resourceName].previousAttributes[id], DSUtils.deepEquals, options.ignoredChanges); DSUtils.forEach(diff, function (changeset, name) { var toKeep = []; DSUtils.forEach(changeset, function (value, field) { @@ -5224,7 +5269,7 @@ function changes(resourceName, id, options) { module.exports = changes; -},{}],72:[function(require,module,exports){ +},{}],69:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.compute(' + resourceName + ', instance): '; } @@ -5321,7 +5366,7 @@ module.exports = { _compute: _compute }; -},{}],73:[function(require,module,exports){ +},{}],70:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.createInstance(' + resourceName + '[, attrs][, options]): '; } @@ -5418,7 +5463,7 @@ function createInstance(resourceName, attrs, options) { module.exports = createInstance; -},{}],74:[function(require,module,exports){ +},{}],71:[function(require,module,exports){ /*jshint evil:true*/ var errorPrefix = 'DS.defineResource(definition): '; @@ -5782,9 +5827,7 @@ function defineResource(definition) { module.exports = defineResource; -},{}],75:[function(require,module,exports){ -var observe = require('../../../lib/observe-js/observe-js'); - +},{}],72:[function(require,module,exports){ /** * @doc method * @id DS.sync methods:digest @@ -5807,18 +5850,19 @@ var observe = require('../../../lib/observe-js/observe-js'); * */ function digest() { - if (!this.$rootScope.$$phase) { - this.$rootScope.$apply(function () { - observe.Platform.performMicrotaskCheckpoint(); + var _this = this; + if (!_this.$rootScope.$$phase) { + _this.$rootScope.$apply(function () { + _this.utils.observe.Platform.performMicrotaskCheckpoint(); }); } else { - observe.Platform.performMicrotaskCheckpoint(); + _this.utils.observe.Platform.performMicrotaskCheckpoint(); } } module.exports = digest; -},{"../../../lib/observe-js/observe-js":1}],76:[function(require,module,exports){ +},{}],73:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.eject(' + resourceName + ', ' + id + '): '; } @@ -5928,7 +5972,7 @@ function eject(resourceName, id, options) { module.exports = eject; -},{}],77:[function(require,module,exports){ +},{}],74:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.ejectAll(' + resourceName + '[, params]): '; } @@ -6051,7 +6095,7 @@ function ejectAll(resourceName, params, options) { module.exports = ejectAll; -},{}],78:[function(require,module,exports){ +},{}],75:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.filter(' + resourceName + '[, params][, options]): '; } @@ -6134,7 +6178,7 @@ function filter(resourceName, params, options) { module.exports = filter; -},{}],79:[function(require,module,exports){ +},{}],76:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.get(' + resourceName + ', ' + id + '): '; } @@ -6198,7 +6242,7 @@ function get(resourceName, id, options) { module.exports = get; -},{}],80:[function(require,module,exports){ +},{}],77:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.getAll(' + resourceName + '[, ids]): '; } @@ -6258,7 +6302,7 @@ function getAll(resourceName, ids) { module.exports = getAll; -},{}],81:[function(require,module,exports){ +},{}],78:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.hasChanges(' + resourceName + ', ' + id + '): '; } @@ -6323,7 +6367,7 @@ function hasChanges(resourceName, id) { module.exports = hasChanges; -},{}],82:[function(require,module,exports){ +},{}],79:[function(require,module,exports){ module.exports = { /** @@ -6547,35 +6591,16 @@ module.exports = { unlinkInverse: require('./unlinkInverse') }; -},{"./bindAll":68,"./bindOne":69,"./changeHistory":70,"./changes":71,"./compute":72,"./createInstance":73,"./defineResource":74,"./digest":75,"./eject":76,"./ejectAll":77,"./filter":78,"./get":79,"./getAll":80,"./hasChanges":81,"./inject":83,"./lastModified":84,"./lastSaved":85,"./link":86,"./linkAll":87,"./linkInverse":88,"./previous":89,"./unlinkInverse":90}],83:[function(require,module,exports){ -var observe = require('../../../lib/observe-js/observe-js'); +},{"./bindAll":65,"./bindOne":66,"./changeHistory":67,"./changes":68,"./compute":69,"./createInstance":70,"./defineResource":71,"./digest":72,"./eject":73,"./ejectAll":74,"./filter":75,"./get":76,"./getAll":77,"./hasChanges":78,"./inject":80,"./lastModified":81,"./lastSaved":82,"./link":83,"./linkAll":84,"./linkInverse":85,"./previous":86,"./unlinkInverse":87}],80:[function(require,module,exports){ var _compute = require('./compute')._compute; function errorPrefix(resourceName) { return 'DS.inject(' + resourceName + ', attrs[, options]): '; } -function _injectRelations(definition, injected, options) { - var DS = this; - - DS.utils.forEach(definition.relationList, function (def) { - var relationName = def.relation; - var relationDef = DS.definitions[relationName]; - if (injected[def.localField]) { - if (!relationDef) { - throw new DS.errors.R(definition.name + 'relation is defined but the resource is not!'); - } - try { - injected[def.localField] = DS.inject(relationName, injected[def.localField], options); - } catch (err) { - DS.$log.error(errorPrefix(definition.name) + 'Failed to inject ' + def.type + ' relation: "' + relationName + '"!', err); - } - } - }); -} - function _inject(definition, resource, attrs, options) { var DS = this; + var DSUtils = DS.utils; var $log = DS.$log; function _react(added, removed, changed, oldValueFn, firstTime) { @@ -6583,16 +6608,16 @@ function _inject(definition, resource, attrs, options) { var item; var innerId = (oldValueFn && oldValueFn(definition.idAttribute)) ? oldValueFn(definition.idAttribute) : target[definition.idAttribute]; - DS.utils.forEach(definition.relationFields, function (field) { + DSUtils.forEach(definition.relationFields, function (field) { delete added[field]; delete removed[field]; delete changed[field]; }); - if (!DS.utils.isEmpty(added) || !DS.utils.isEmpty(removed) || !DS.utils.isEmpty(changed) || firstTime) { + if (!DSUtils.isEmpty(added) || !DSUtils.isEmpty(removed) || !DSUtils.isEmpty(changed) || firstTime) { item = DS.get(definition.name, innerId); - resource.modified[innerId] = DS.utils.updateTimestamp(resource.modified[innerId]); - resource.collectionModified = DS.utils.updateTimestamp(resource.collectionModified); + resource.modified[innerId] = DSUtils.updateTimestamp(resource.modified[innerId]); + resource.collectionModified = DSUtils.updateTimestamp(resource.collectionModified); if (definition.keepChangeHistory) { var changeRecord = { resourceName: definition.name, @@ -6609,7 +6634,7 @@ function _inject(definition, resource, attrs, options) { if (definition.computed) { item = item || DS.get(definition.name, innerId); - DS.utils.forEach(definition.computed, function (fn, field) { + DSUtils.forEach(definition.computed, function (fn, field) { var compute = false; // check if required fields changed angular.forEach(fn.deps, function (dep) { @@ -6626,7 +6651,7 @@ function _inject(definition, resource, attrs, options) { if (definition.relations) { item = item || DS.get(definition.name, innerId); - DS.utils.forEach(definition.relationList, function (def) { + DSUtils.forEach(definition.relationList, function (def) { if (item[def.localField] && (def.localKey in added || def.localKey in removed || def.localKey in changed)) { DS.link(definition.name, item[definition.idAttribute], [def.relation]); } @@ -6641,7 +6666,7 @@ function _inject(definition, resource, attrs, options) { } var injected; - if (DS.utils.isArray(attrs)) { + if (DSUtils.isArray(attrs)) { injected = []; for (var i = 0; i < attrs.length; i++) { injected.push(_inject.call(DS, definition, resource, attrs[i], options)); @@ -6663,6 +6688,45 @@ function _inject(definition, resource, attrs, options) { throw error; } else { try { + DSUtils.forEach(definition.relationList, function (def) { + var relationName = def.relation; + var relationDef = DS.definitions[relationName]; + var toInject = attrs[def.localField]; + if (toInject) { + if (!relationDef) { + throw new DS.errors.R(definition.name + 'relation is defined but the resource is not!'); + } + if (DSUtils.isArray(toInject)) { + var items = []; + DSUtils.forEach(toInject, function (toInjectItem) { + if (toInjectItem !== DS.store[relationName][toInjectItem[relationDef.idAttribute]]) { + try { + var injectedItem = DS.inject(relationName, toInjectItem, options); + if (def.foreignKey) { + injectedItem[def.foreignKey] = attrs[definition.idAttribute]; + } + items.push(injectedItem); + } catch (err) { + DS.$log.error(errorPrefix(definition.name) + 'Failed to inject ' + def.type + ' relation: "' + relationName + '"!', err); + } + } + }); + attrs[def.localField] = items; + } else { + if (toInject !== DS.store[relationName][toInject[relationDef.idAttribute]]) { + try { + attrs[def.localField] = DS.inject(relationName, attrs[def.localField], options); + if (def.foreignKey) { + attrs[def.localField][def.foreignKey] = attrs[definition.idAttribute]; + } + } catch (err) { + DS.$log.error(errorPrefix(definition.name) + 'Failed to inject ' + def.type + ' relation: "' + relationName + '"!', err); + } + } + } + } + }); + definition.beforeInject(definition.name, attrs); var id = attrs[idA]; var item = DS.get(definition.name, id); @@ -6678,31 +6742,25 @@ function _inject(definition, resource, attrs, options) { } else { item = {}; } - resource.previousAttributes[id] = {}; + resource.previousAttributes[id] = DSUtils.copy(attrs); - DS.utils.deepMixIn(item, attrs); - DS.utils.deepMixIn(resource.previousAttributes[id], attrs); + DSUtils.deepMixIn(item, attrs); resource.collection.push(item); resource.changeHistories[id] = []; - resource.observers[id] = new observe.ObjectObserver(item); + resource.observers[id] = new DSUtils.observe.ObjectObserver(item); resource.observers[id].open(_react, item); resource.index.put(id, item); _react.call(item, {}, {}, {}, null, true); - - if (definition.relations) { - _injectRelations.call(DS, definition, item, options); - } } else { - DS.utils.deepMixIn(item, attrs); + DSUtils.deepMixIn(item, attrs); if (definition.resetHistoryOnInject) { - resource.previousAttributes[id] = {}; - DS.utils.deepMixIn(resource.previousAttributes[id], attrs); + resource.previousAttributes[id] = DSUtils.copy(attrs); if (resource.changeHistories[id].length) { - DS.utils.forEach(resource.changeHistories[id], function (changeRecord) { - DS.utils.remove(resource.changeHistory, changeRecord); + DSUtils.forEach(resource.changeHistories[id], function (changeRecord) { + DSUtils.remove(resource.changeHistory, changeRecord); }); resource.changeHistories[id].splice(0, resource.changeHistories[id].length); } @@ -6714,8 +6772,9 @@ function _inject(definition, resource, attrs, options) { } resource.observers[id].deliver(); } - resource.saved[id] = DS.utils.updateTimestamp(resource.saved[id]); - resource.modified[id] = initialLastModified && resource.modified[id] === initialLastModified ? DS.utils.updateTimestamp(resource.modified[id]) : resource.modified[id]; + resource.saved[id] = DSUtils.updateTimestamp(resource.saved[id]); + resource.modified[id] = initialLastModified && resource.modified[id] === initialLastModified ? DSUtils.updateTimestamp(resource.modified[id]) : resource.modified[id]; + definition.afterInject(definition.name, item); injected = item; } catch (err) { @@ -6828,7 +6887,7 @@ function inject(resourceName, attrs, options) { resource.collectionModified = DS.utils.updateTimestamp(resource.collectionModified); } - if (options.linkInverse) { + if (options.linkInverse && typeof options.linkInverse === 'boolean') { if (DS.utils.isArray(injected)) { if (injected.length) { DS.linkInverse(definition.name, injected[0][definition.idAttribute]); @@ -6850,13 +6909,12 @@ function inject(resourceName, attrs, options) { DS.emit(definition, 'inject', injected); } - return injected; } module.exports = inject; -},{"../../../lib/observe-js/observe-js":1,"./compute":72}],84:[function(require,module,exports){ +},{"./compute":69}],81:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.lastModified(' + resourceName + '[, ' + id + ']): '; } @@ -6915,7 +6973,7 @@ function lastModified(resourceName, id) { module.exports = lastModified; -},{}],85:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.lastSaved(' + resourceName + '[, ' + id + ']): '; } @@ -6979,7 +7037,7 @@ function lastSaved(resourceName, id) { module.exports = lastSaved; -},{}],86:[function(require,module,exports){ +},{}],83:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.link(' + resourceName + ', id[, relations]): '; } @@ -7081,7 +7139,7 @@ function link(resourceName, id, relations) { module.exports = link; -},{}],87:[function(require,module,exports){ +},{}],84:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.linkAll(' + resourceName + '[, params][, relations]): '; } @@ -7198,7 +7256,7 @@ function linkAll(resourceName, params, relations) { module.exports = linkAll; -},{}],88:[function(require,module,exports){ +},{}],85:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.linkInverse(' + resourceName + ', id[, relations]): '; } @@ -7296,7 +7354,7 @@ function linkInverse(resourceName, id, relations) { module.exports = linkInverse; -},{}],89:[function(require,module,exports){ +},{}],86:[function(require,module,exports){ function errorPrefix(resourceName, id) { return 'DS.previous(' + resourceName + '[, ' + id + ']): '; } @@ -7353,7 +7411,7 @@ function previous(resourceName, id) { module.exports = previous; -},{}],90:[function(require,module,exports){ +},{}],87:[function(require,module,exports){ function errorPrefix(resourceName) { return 'DS.unlinkInverse(' + resourceName + ', id[, relations]): '; } @@ -7454,7 +7512,7 @@ function unlinkInverse(resourceName, id, relations) { module.exports = unlinkInverse; -},{}],91:[function(require,module,exports){ +},{}],88:[function(require,module,exports){ /** * @doc function * @id errors.types:IllegalArgumentError @@ -7587,7 +7645,7 @@ module.exports = [function () { }; }]; -},{}],92:[function(require,module,exports){ +},{}],89:[function(require,module,exports){ (function (window, angular, undefined) { 'use strict'; @@ -7676,7 +7734,7 @@ module.exports = [function () { })(window, window.angular); -},{"./adapters/http":54,"./adapters/localStorage":55,"./datastore":67,"./errors":91,"./utils":93}],93:[function(require,module,exports){ +},{"./adapters/http":51,"./adapters/localStorage":52,"./datastore":64,"./errors":88,"./utils":90}],90:[function(require,module,exports){ var DSErrors = require('./errors'); function Events(target) { @@ -7735,22 +7793,14 @@ var toPromisify = [ 'afterDestroy' ]; -var find = require('mout/array/find'); -var isRegExp = require('mout/lang/isRegExp'); +var deepEquals = angular.equals; -function isBlacklisted(prop, blacklist) { - if (!blacklist || !blacklist.length) { - return false; - } - var matches = find(blacklist, function (blItem) { - if ((isRegExp(blItem) && blItem.test(prop)) || blItem === prop) { - return prop; - } - }); - return !!matches; -} +var observe = require('../lib/observe-js/observe-js'); + +observe.setEqualityFn(deepEquals); module.exports = ['$q', function ($q) { + return { isBoolean: require('mout/lang/isBoolean'), isString: angular.isString, @@ -7759,13 +7809,13 @@ module.exports = ['$q', function ($q) { isNumber: angular.isNumber, isFunction: angular.isFunction, isEmpty: require('mout/lang/isEmpty'), - isRegExp: isRegExp, toJson: JSON.stringify, fromJson: angular.fromJson, makePath: require('mout/string/makePath'), upperCase: require('mout/string/upperCase'), pascalCase: require('mout/string/pascalCase'), deepMixIn: require('mout/object/deepMixIn'), + deepEquals: deepEquals, mixIn: require('mout/object/mixIn'), forEach: angular.forEach, pick: require('mout/object/pick'), @@ -7773,13 +7823,14 @@ module.exports = ['$q', function ($q) { merge: require('mout/object/merge'), contains: require('mout/array/contains'), filter: require('mout/array/filter'), - find: find, toLookup: require('mout/array/toLookup'), remove: require('mout/array/remove'), slice: require('mout/array/slice'), sort: require('mout/array/sort'), guid: require('mout/random/guid'), + copy: angular.copy, keys: require('mout/object/keys'), + observe: observe, _: function (parent, options) { var _this = this; options = options || {}; @@ -7840,53 +7891,9 @@ module.exports = ['$q', function ($q) { } } }, - diffObjectFromOldObject: function (object, oldObject, blacklist) { - var added = {}; - var removed = {}; - var changed = {}; - blacklist = blacklist || []; - - for (var prop in oldObject) { - var newValue = object[prop]; - - if (isBlacklisted(prop, blacklist)) { - continue; - } - - if (newValue !== undefined && newValue === oldObject[prop]) { - continue; - } - - if (!(prop in object)) { - removed[prop] = undefined; - continue; - } - - if (newValue !== oldObject[prop]) { - changed[prop] = newValue; - } - } - - for (var prop2 in object) { - if (prop2 in oldObject) { - continue; - } - - if (isBlacklisted(prop2, blacklist)) { - continue; - } - - added[prop2] = object[prop2]; - } - - return { - added: added, - removed: removed, - changed: changed - }; - }, + diffObjectFromOldObject: observe.diffObjectFromOldObject, Events: Events }; }]; -},{"./errors":91,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[92]); +},{"../lib/observe-js/observe-js":1,"./errors":88,"mout/array/contains":2,"mout/array/filter":3,"mout/array/remove":7,"mout/array/slice":8,"mout/array/sort":9,"mout/array/toLookup":10,"mout/lang/isBoolean":17,"mout/lang/isEmpty":18,"mout/object/deepMixIn":28,"mout/object/keys":32,"mout/object/merge":33,"mout/object/mixIn":34,"mout/object/pick":36,"mout/object/set":37,"mout/random/guid":39,"mout/string/makePath":46,"mout/string/pascalCase":47,"mout/string/upperCase":50}]},{},[89]); diff --git a/dist/angular-data.min.js b/dist/angular-data.min.js index 9700da4..d85be29 100644 --- a/dist/angular-data.min.js +++ b/dist/angular-data.min.js @@ -1,12 +1,12 @@ /** * @author Jason Dobry * @file angular-data.min.js -* @version 1.4.2 - Homepage +* @version 1.5.3 - Homepage * @copyright (c) 2014 Jason Dobry * @license MIT * * @overview Data store for Angular.js. */ -!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gb&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;acycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}});var observerSentinel={},expectedRecordTypes={add:!0,update:!0,"delete":!0};global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ObjectObserver=ObjectObserver}((exports.Number={isNaN:window.isNaN})?exports:exports)},{}],2:[function(a,b){function c(a,b){return-1!==d(a,b)}var d=a("./indexOf");b.exports=c},{"./indexOf":7}],3:[function(a,b){function c(a,b,c){b=d(b,c);var e=[];if(null==a)return e;for(var f,g=-1,h=a.length;++g=0?a[e]:void 0}var d=a("./findIndex");b.exports=c},{"./findIndex":5}],5:[function(a,b){function c(a,b,c){if(b=d(b,c),null==a)return-1;for(var e=-1,f=a.length;++ec?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}b.exports=c},{}],8:[function(a,b){function c(a){return null!=a&&""!==a}function d(a,b){return b=b||"",e(a,c).join(b)}var e=a("./filter");b.exports=d},{"./filter":3}],9:[function(a,b){function c(a,b){var c=d(a,b);-1!==c&&a.splice(c,1)}var d=a("./indexOf");b.exports=c},{"./indexOf":7}],10:[function(a,b){function c(a,b,c){var d=a.length;b=null==b?0:0>b?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}b.exports=c},{}],11:[function(a,b){function c(a,b){if(null==a)return[];if(a.length<2)return a;null==b&&(b=d);var f,g,h;return f=~~(a.length/2),g=c(a.slice(0,f),b),h=c(a.slice(f,a.length),b),e(g,h,b)}function d(a,b){return b>a?-1:a>b?1:0}function e(a,b,c){for(var d=[];a.length&&b.length;)d.push(c(a[0],b[0])<=0?a.shift():b.shift());return a.length&&d.push.apply(d,a),b.length&&d.push.apply(d,b),d}b.exports=c},{}],12:[function(a,b){function c(a,b){var c={};if(null==a)return c;var e,f=-1,g=a.length;if(d(b))for(;++f0?a:6;for(var b="";a--;)b+=d(e);return b}var d=a("./choice"),e="0123456789abcdef".split("");b.exports=c},{"./choice":41}],45:[function(a,b){function c(a,b){return a=null==a?d:~~a,b=null==b?e:~~b,Math.round(f(a-.5,b+.499999999999))}var d=a("../number/MIN_INT"),e=a("../number/MAX_INT"),f=a("./rand");b.exports=c},{"../number/MAX_INT":28,"../number/MIN_INT":29,"./rand":43}],46:[function(a,b){function c(){return c.get()}c.get=Math.random,b.exports=c},{}],47:[function(a,b){function c(a){return a=d(a),a=e(a),a=f(a).replace(/[\-_]/g," ").replace(/\s[a-z]/g,g).replace(/\s+/g,"").replace(/^[A-Z]/g,h)}var d=a("../lang/toString"),e=a("./replaceAccents"),f=a("./removeNonWord"),g=a("./upperCase"),h=a("./lowerCase");b.exports=c},{"../lang/toString":27,"./lowerCase":48,"./removeNonWord":51,"./replaceAccents":52,"./upperCase":53}],48:[function(a,b){function c(a){return a=d(a),a.toLowerCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],49:[function(a,b){function c(){var a=d(e(arguments),"/");return a.replace(/([^:\/]|^)\/{2,}/g,"$1/")}var d=a("../array/join"),e=a("../array/slice");b.exports=c},{"../array/join":8,"../array/slice":10}],50:[function(a,b){function c(a){return a=d(a),e(a).replace(/^[a-z]/,f)}var d=a("../lang/toString"),e=a("./camelCase"),f=a("./upperCase");b.exports=c},{"../lang/toString":27,"./camelCase":47,"./upperCase":53}],51:[function(a,b){function c(a){return a=d(a),a.replace(e,"")}var d=a("../lang/toString"),e=/[^\x20\x2D0-9A-Z\x5Fa-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/g;b.exports=c},{"../lang/toString":27}],52:[function(a,b){function c(a){return a=d(a),a.search(/[\xC0-\xFF]/g)>-1&&(a=a.replace(/[\xC0-\xC5]/g,"A").replace(/[\xC6]/g,"AE").replace(/[\xC7]/g,"C").replace(/[\xC8-\xCB]/g,"E").replace(/[\xCC-\xCF]/g,"I").replace(/[\xD0]/g,"D").replace(/[\xD1]/g,"N").replace(/[\xD2-\xD6\xD8]/g,"O").replace(/[\xD9-\xDC]/g,"U").replace(/[\xDD]/g,"Y").replace(/[\xDE]/g,"P").replace(/[\xE0-\xE5]/g,"a").replace(/[\xE6]/g,"ae").replace(/[\xE7]/g,"c").replace(/[\xE8-\xEB]/g,"e").replace(/[\xEC-\xEF]/g,"i").replace(/[\xF1]/g,"n").replace(/[\xF2-\xF6\xF8]/g,"o").replace(/[\xF9-\xFC]/g,"u").replace(/[\xFE]/g,"p").replace(/[\xFD\xFF]/g,"y")),a}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],53:[function(a,b){function c(a){return a=d(a),a.toUpperCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":27}],54:[function(a,b){function c(){var a=this.defaults={queryTransform:function(a,b){return b},forceTrailingSlash:!1,$httpConfig:{}};this.$get=["$http","$log","DSUtils",function(b,c,d){return{defaults:a,HTTP:function(e){var f=(new Date).getTime();return this.defaults.forceTrailingSlash&&"/"!==e.url[e.url.length]&&(e.url+="/"),e=d.deepMixIn(e,a.$httpConfig),b(e).then(function(a){return c.debug(a.config.method+" request:"+a.config.url+" Time taken: "+((new Date).getTime()-f)+"ms",arguments),a})},GET:function(a,b){return b=b||{},"method"in b||(b.method="GET"),this.HTTP(d.deepMixIn(b,{url:a}))},POST:function(a,b,c){return c=c||{},"method"in c||(c.method="POST"),this.HTTP(d.deepMixIn(c,{url:a,data:b}))},PUT:function(a,b,c){return c=c||{},"method"in c||(c.method="PUT"),this.HTTP(d.deepMixIn(c,{url:a,data:b||{}}))},DEL:function(a,b){return b=b||{},"method"in b||(b.method="DELETE"),this.HTTP(d.deepMixIn(b,{url:a}))},find:function(a,b,c){return c=c||{},this.GET(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c),b),c)},findAll:function(b,c,e){return e=e||{},e.params=e.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(e.params,c)),this.GET(d.makePath(e.baseUrl||b.baseUrl,b.getEndpoint(null,e)),e)},create:function(a,b,c){return c=c||{},this.POST(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c)),b,c)},update:function(a,b,c,e){return e=e||{},this.PUT(d.makePath(e.baseUrl||a.baseUrl,a.getEndpoint(b,e),b),c,e)},updateAll:function(b,c,e,f){return f=f||{},f.params=f.params||{},e&&(e=a.queryTransform(b.name,e),d.deepMixIn(f.params,e)),this.PUT(d.makePath(f.baseUrl||b.baseUrl,b.getEndpoint(null,f)),c,f)},destroy:function(a,b,c){return c=c||{},this.DEL(d.makePath(c.baseUrl||a.baseUrl,a.getEndpoint(b,c),b),c)},destroyAll:function(b,c,e){return e=e||{},e.params=e.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(e.params,c)),this.DEL(d.makePath(e.baseUrl||b.baseUrl,b.getEndpoint(null,e)),e)}}}]}b.exports=c},{}],55:[function(a,b){function c(){this.$get=["$q","DSUtils","DSErrors",function(a,b){return{getIds:function(a,c){var d,e=b.makePath(c.baseUrl,"DSKeys",a),f=localStorage.getItem(e);return f?d=b.fromJson(f):(localStorage.setItem(e,b.toJson({})),d={}),d},saveKeys:function(a,c,d){var e=b.makePath(d.baseUrl,"DSKeys",c);localStorage.setItem(e,b.toJson(a))},ensureId:function(a,b,c){var d=this.getIds(b,c);d[a]=1,this.saveKeys(d,b,c)},removeId:function(a,b,c){var d=this.getIds(b,c);delete d[a],this.saveKeys(d,b,c)},GET:function(b){var c=a.defer();try{var d=localStorage.getItem(b);c.resolve(d?angular.fromJson(d):void 0)}catch(e){c.reject(e)}return c.promise},PUT:function(a,c){var d=this;return d.GET(a).then(function(e){return e&&b.deepMixIn(e,c),localStorage.setItem(a,JSON.stringify(e||c)),d.GET(a)})},DEL:function(b){var c=a.defer();try{localStorage.removeItem(b),c.resolve()}catch(d){c.reject(d)}return c.promise},find:function(c,d,e){return e=e||{},this.GET(b.makePath(e.baseUrl||c.baseUrl,c.endpoint,d)).then(function(b){return b?b:a.reject(new Error("Not Found!"))})},findAll:function(c,d,e){var f=this,g=a.defer();e=e||{},"allowSimpleWhere"in e||(e.allowSimpleWhere=!0);var h=[],i=b.keys(f.getIds(c.name,e));return b.forEach(i,function(a){var d=localStorage.getItem(b.makePath(e.baseUrl||c.baseUrl,c.getEndpoint(a,e),a));d&&h.push(b.fromJson(d))}),g.resolve(f.DS.defaults.defaultFilter.call(f.DS,h,c.name,d,e)),g.promise},create:function(a,c,d){var e=this;return c[a.idAttribute]=c[a.idAttribute]||b.guid(),d=d||{},this.PUT(b.makePath(d.baseUrl||a.baseUrl,a.getEndpoint(c,d),c[a.idAttribute]),c).then(function(b){return e.ensureId(b[a.idAttribute],a.name,d),b})},update:function(a,c,d,e){e=e||{};var f=this;return f.find(a,c,e).then(function(g){return b.deepMixIn(g,d),f.PUT(b.makePath(e.baseUrl||a.baseUrl,a.getEndpoint(c,e),c),g)})},updateAll:function(c,d,e,f){var g=this;return this.findAll(c,e,f).then(function(e){var h=[];return b.forEach(e,function(a){h.push(g.update(c,a[c.idAttribute],d,f))}),a.all(h)})},destroy:function(a,c,d){return d=d||{},this.DEL(b.makePath(d.baseUrl||a.baseUrl,a.getEndpoint(c,d),c))},destroyAll:function(c,d,e){var f=this;return this.findAll(c,d,e).then(function(d){var g=[];return b.forEach(d,function(a){g.push(f.destroy(c,a[c.idAttribute],e))}),a.all(g)})}}}]}b.exports=c},{}],56:[function(a,b){function c(a){return"DS.create("+a+", attrs[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new e.errors.IA(c(a)+"attrs: Must be an object!");return d=f._(i,d),g.resolve(b),d.upsert&&b[i.idAttribute]?e.update(a,b[i.idAttribute],b,d):g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeCreate.call(b,a,b)}).then(function(b){return d.notify&&e.emit(i,"beforeCreate",f.merge({},b)),d.eagerInject&&d.cacheResponse&&(b[i.idAttribute]=b[i.idAttribute]||f.guid(),h=e.inject(a,b)),e.adapters[d.adapter||i.defaultAdapter].create(i,d.serialize?d.serialize(a,b):i.serialize(a,b),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterCreate.call(c,a,c)}).then(function(b){if(d.notify&&e.emit(i,"afterCreate",f.merge({},b)),d.cacheResponse){var c=e.store[a];if(d.eagerInject){var g=b[i.idAttribute],j=h[i.idAttribute],k=e.get(a,j);c.previousAttributes[g]=c.previousAttributes[j],c.changeHistories[g]=c.changeHistories[j],c.observers[g]=c.observers[j],c.modified[g]=c.modified[j],c.saved[g]=c.saved[j],c.index.put(g,k),e.eject(a,j,{notify:!1}),k[i.idAttribute]=g,c.collection.push(k)}var l=e.inject(a,b,d),m=l[i.idAttribute];return c.completedQueries[m]=(new Date).getTime(),c.previousAttributes[m]=f.deepMixIn({},l),c.saved[m]=f.updateTimestamp(c.saved[m]),e.get(a,m)}return e.createInstance(a,b,d)})["catch"](function(b){return d.eagerInject&&d.cacheResponse&&e.eject(a,h[i.idAttribute],{notify:!1}),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],57:[function(a,b){function c(a,b){return"DS.destroy("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.definitions[a];if(d=d||{},b=f.resolveId(h,b),!h)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new e.errors.IA(c(a,b)+"id: Must be a string or a number!");var i=e.get(a,b);if(!i)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(h,d),g.resolve(i),g.promise.then(function(b){return d.beforeDestroy.call(b,a,b)}).then(function(c){return d.notify&&e.emit(h,"beforeDestroy",f.merge({},c)),d.eagerEject&&e.eject(a,b),e.adapters[d.adapter||h.defaultAdapter].destroy(h,b,d)}).then(function(){return d.afterDestroy.call(i,a,i)}).then(function(){return d.notify&&e.emit(h,"afterDestroy",f.merge({},i)),e.eject(a,b),b})["catch"](function(b){return d.eagerEject&&i&&e.inject(a,i),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],58:[function(a,b){function c(a){return"DS.destroyAll("+a+", params[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new h(c(a)+"params: Must be an object!");if(!f.isObject(d))throw new h(c(a)+"options: Must be an object!");return d=f._(i,d),g.resolve(),g.promise.then(function(){return e.adapters[d.adapter||i.defaultAdapter].destroyAll(i,b,d)}).then(function(){return e.ejectAll(a,b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],59:[function(a,b){function c(a,b){return"DS.find("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer(),h=g.promise;try{var i=e.errors.IA,j=e.definitions[a];if(d=d||{},!j)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new i(c(a,b)+"options: Must be an object!");d=f._(j,d);var k=e.store[a];if((d.bypassCache||!d.cacheResponse)&&delete k.completedQueries[b],!(b in k.completedQueries))return b in k.pendingQueries||(h=k.pendingQueries[b]=e.adapters[d.adapter||j.defaultAdapter].find(j,b,d).then(function(c){var f=d.deserialize?d.deserialize(a,c):j.deserialize(a,c);return delete k.pendingQueries[b],d.cacheResponse?(k.completedQueries[b]=(new Date).getTime(),e.inject(a,f,d)):e.createInstance(a,f,d)},function(a){return delete k.pendingQueries[b],e.$q.reject(a)})),k.pendingQueries[b];g.resolve(e.get(a,b))}catch(l){g.reject(l)}return h}b.exports=d},{}],60:[function(a,b){function c(a){return"DS.findAll("+a+", params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.store[b],i=f.definitions[b].idAttribute,j=(new Date).getTime();a=a||[],delete h.pendingQueries[d],h.completedQueries[d]=j,h.collectionModified=g.updateTimestamp(h.collectionModified);var k=f.inject(b,a,e);return g.isArray(k)?angular.forEach(k,function(a){a&&a[i]&&(h.completedQueries[a[i]]=j)}):(f.$log.warn(c(b)+"response is expected to be an array!"),h.completedQueries[k[i]]=j),k}function e(a,b,c){var e=this,f=e.utils,g=e.definitions[a],h=e.store[a],i=f.toJson(b);return(c.bypassCache||!c.cacheResponse)&&delete h.completedQueries[i],i in h.completedQueries?e.filter(a,b,c):(i in h.pendingQueries||(h.pendingQueries[i]=e.adapters[c.adapter||g.defaultAdapter].findAll(g,b,c).then(function(b){delete h.pendingQueries[i];var j=c.deserialize?c.deserialize(a,b):g.deserialize(a,b);if(!c.cacheResponse)return f.forEach(j,function(b,d){j[d]=e.createInstance(a,b,c)}),j;try{return d.call(e,j,a,i,c)}catch(k){return e.$q.reject(k)}},function(a){return delete h.pendingQueries[i],e.$q.reject(a)})),h.pendingQueries[i])}function f(a,b,d){var f=this,g=f.utils,h=f.$q.defer(),i=f.definitions[a];try{var j=f.errors.IA;if(d=d||{},b=b||{},!i)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new j(c(a)+"params: Must be an object!");if(!g.isObject(d))throw new j(c(a)+"options: Must be an object!");return d=g._(i,d),h.resolve(),h.promise.then(function(){return e.call(f,a,b,d)})}catch(k){return h.reject(k),h.promise}}b.exports=f},{}],61:[function(a,b){b.exports={create:a("./create"),destroy:a("./destroy"),destroyAll:a("./destroyAll"),find:a("./find"),findAll:a("./findAll"),loadRelations:a("./loadRelations"),refresh:a("./refresh"),save:a("./save"),update:a("./update"),updateAll:a("./updateAll")}},{"./create":56,"./destroy":57,"./destroyAll":58,"./find":59,"./findAll":60,"./loadRelations":62,"./refresh":63,"./save":64,"./update":65,"./updateAll":66}],62:[function(a,b){function c(a){return"DS.loadRelations("+a+", instance(Id), relations[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},(g.isString(b)||g.isNumber(b))&&(b=f.get(a,b)),angular.isString(d)&&(d=[d]),!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"instance(Id): Must be a string, number or object!");if(!g.isArray(d))throw new i(c(a)+"relations: Must be a string or an array!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");e=g._(j,e),e.hasOwnProperty("findBelongsTo")||(e.findBelongsTo=!0),e.hasOwnProperty("findHasMany")||(e.findHasMany=!0);var k=[],l=[];return g.forEach(j.relationList,function(a){var c=a.relation;if(g.contains(d,c)){var h,i={};e.allowSimpleWhere?i[a.foreignKey]=b[j.idAttribute]:(i.where={},i.where[a.foreignKey]={"==":b[j.idAttribute]}),"hasMany"===a.type&&i[a.foreignKey]?h=f.findAll(c,i,e):"hasOne"===a.type?a.localKey&&b[a.localKey]?h=f.find(c,b[a.localKey],e):a.foreignKey&&i[a.foreignKey]&&(h=f.findAll(c,i,e).then(function(a){return a.length?a[0]:null})):b[a.localKey]&&(h=f.find(c,b[a.localKey],e)),h&&(k.push(h),l.push(a.localField))}}),h.resolve(),h.promise.then(function(){return f.$q.all(k)}).then(function(a){return angular.forEach(l,function(c,d){b[c]=a[d]}),b})}catch(m){return h.reject(m),h.promise}}b.exports=d},{}],63:[function(a,b){function c(a,b){return"DS.refresh("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.errors.IA,h=e.definitions[a];if(d=d||{},b=f.resolveId(e.definitions[a],b),h){if(f.isString(b)||f.isNumber(b)){if(f.isObject(d)){if(d=f._(h,d),d.bypassCache=!0,e.get(a,b))return e.find(a,b,d);var i=e.$q.defer();return i.resolve(),i.promise}throw new g(c(a,b)+"options: Must be an object!")}throw new g(c(a,b)+"id: Must be a string or a number!")}throw new e.errors.NER(c(a,b)+a)}b.exports=d},{}],64:[function(a,b){function c(a,b){return"DS.save("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},b=f.resolveId(i,b),!i)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new h(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new h(c(a,b)+"options: Must be an object!");var j=e.get(a,b);if(!j)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(i,d),g.resolve(j),g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeUpdate.call(b,a,b)}).then(function(c){if(d.notify&&e.emit(i,"beforeUpdate",f.merge({},c)),d.changesOnly){var g=e.store[a];g.observers[b].deliver();var h=[],j=e.changes(a,b);for(var k in j.added)h.push(k);for(k in j.changed)h.push(k);if(j=f.pick(c,h),f.isEmpty(j))return c;c=j}return e.adapters[d.adapter||i.defaultAdapter].update(i,b,d.serialize?d.serialize(a,c):i.serialize(a,c),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterUpdate.call(c,a,c)}).then(function(c){if(d.notify&&e.emit(i,"afterUpdate",f.merge({},c)),d.cacheResponse){var g=e.store[a],h=e.inject(i.name,c,d);return g.previousAttributes[b]=f.deepMixIn({},h),g.saved[b]=f.updateTimestamp(g.saved[b]),g.observers[b].discardChanges(),e.get(a,b)}return c})}catch(k){return g.reject(k),g.promise}}b.exports=d},{}],65:[function(a,b){function c(a,b){return"DS.update("+a+", "+b+", attrs[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},b=g.resolveId(j,b),!j)throw new f.errors.NER(c(a,b)+a);if(!g.isString(b)&&!g.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!g.isObject(d))throw new i(c(a,b)+"attrs: Must be an object!");if(!g.isObject(e))throw new i(c(a,b)+"options: Must be an object!");return e=g._(j,e),h.resolve(d),h.promise.then(function(b){return e.beforeValidate.call(b,a,b) -}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(c){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},c)),f.adapters[e.adapter||j.defaultAdapter].update(j,b,e.serialize?e.serialize(a,c):j.serialize(a,c),e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(b){if(e.notify&&f.emit(j,"afterUpdate",g.merge({},b)),e.cacheResponse){var c=f.store[a],d=f.inject(j.name,b,e),h=d[j.idAttribute];return c.previousAttributes[h]=g.deepMixIn({},d),c.saved[h]=g.updateTimestamp(c.saved[h]),c.observers[h].discardChanges(),f.get(j.name,h)}return b})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],66:[function(a,b){function c(a){return"DS.updateAll("+a+", attrs, params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"attrs: Must be an object!");if(!g.isObject(d))throw new i(c(a)+"params: Must be an object!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");return e=g._(j,e),h.resolve(b),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(b){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},b)),f.adapters[e.adapter||j.defaultAdapter].updateAll(j,e.serialize?e.serialize(a,b):j.serialize(a,b),d,e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(a){return e.notify&&f.emit(j,"afterUpdate",g.merge({},a)),e.cacheResponse?f.inject(j.name,a,e):a})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],67:[function(a,b){function c(a,b,c){c(null,b)}function d(a,b,c,e,f){var g=b[c],h=e[g[0]],i=f[g[0]];return a.isString(h)&&(h=a.upperCase(h)),a.isString(i)&&(i=a.upperCase(i)),"DESC"===g[1]?h>i?-1:i>h?1:ch?-1:h>i?1:c"===f?c=b?a[e]>d:c&&a[e]>d:">="===f?c=b?a[e]>=d:c&&a[e]>=d:"<"===f?c=b?a[e]"===f?c=b?a[e]>d:c||a[e]>d:"|>="===f?c=b?a[e]>=d:c||a[e]>=d:"|<"===f?c=b?a[e]=b?a+1:b},deepFreeze:function i(a){if("function"==typeof Object.freeze){var b,c;Object.freeze(a);for(c in a)b=a[c],a.hasOwnProperty(c)&&"object"==typeof b&&!Object.isFrozen(b)&&i(b)}},diffObjectFromOldObject:function(a,b,c){var e={},f={},g={};c=c||[];for(var h in b){var i=a[h];d(h,c)||(void 0===i||i!==b[h])&&(h in a?i!==b[h]&&(g[h]=i):f[h]=void 0)}for(var j in a)j in b||d(j,c)||(e[j]=a[j]);return{added:e,removed:f,changed:g}},Events:c}}]},{"./errors":91,"mout/array/contains":2,"mout/array/filter":3,"mout/array/find":4,"mout/array/remove":9,"mout/array/slice":10,"mout/array/sort":11,"mout/array/toLookup":12,"mout/lang/isBoolean":19,"mout/lang/isEmpty":20,"mout/lang/isRegExp":25,"mout/object/deepMixIn":31,"mout/object/keys":35,"mout/object/merge":36,"mout/object/mixIn":37,"mout/object/pick":39,"mout/object/set":40,"mout/random/guid":42,"mout/string/makePath":49,"mout/string/pascalCase":50,"mout/string/upperCase":53}]},{},[92]); \ No newline at end of file +!function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;gb&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function isBlacklisted(a,b){if(!b||!b.length)return!1;for(var c,d=0;dcycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_,equalityFn,blacklist);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}});var observerSentinel={},expectedRecordTypes={add:!0,update:!0,"delete":!0};global.Observer=Observer,global.diffObjectFromOldObject=diffObjectFromOldObject,global.setEqualityFn=function(a){equalityFn=a},global.setBlacklist=function(a){blacklist=a},global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ObjectObserver=ObjectObserver}((exports.Number={isNaN:window.isNaN})?exports:exports)},{}],2:[function(a,b){function c(a,b){return-1!==d(a,b)}var d=a("./indexOf");b.exports=c},{"./indexOf":5}],3:[function(a,b){function c(a,b,c){b=d(b,c);var e=[];if(null==a)return e;for(var f,g=-1,h=a.length;++gc?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}b.exports=c},{}],6:[function(a,b){function c(a){return null!=a&&""!==a}function d(a,b){return b=b||"",e(a,c).join(b)}var e=a("./filter");b.exports=d},{"./filter":3}],7:[function(a,b){function c(a,b){var c=d(a,b);-1!==c&&a.splice(c,1)}var d=a("./indexOf");b.exports=c},{"./indexOf":5}],8:[function(a,b){function c(a,b,c){var d=a.length;b=null==b?0:0>b?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}b.exports=c},{}],9:[function(a,b){function c(a,b){if(null==a)return[];if(a.length<2)return a;null==b&&(b=d);var f,g,h;return f=~~(a.length/2),g=c(a.slice(0,f),b),h=c(a.slice(f,a.length),b),e(g,h,b)}function d(a,b){return b>a?-1:a>b?1:0}function e(a,b,c){for(var d=[];a.length&&b.length;)d.push(c(a[0],b[0])<=0?a.shift():b.shift());return a.length&&d.push.apply(d,a),b.length&&d.push.apply(d,b),d}b.exports=c},{}],10:[function(a,b){function c(a,b){var c={};if(null==a)return c;var e,f=-1,g=a.length;if(d(b))for(;++f0?a:6;for(var b="";a--;)b+=d(e);return b}var d=a("./choice"),e="0123456789abcdef".split("");b.exports=c},{"./choice":38}],42:[function(a,b){function c(a,b){return a=null==a?d:~~a,b=null==b?e:~~b,Math.round(f(a-.5,b+.499999999999))}var d=a("../number/MIN_INT"),e=a("../number/MAX_INT"),f=a("./rand");b.exports=c},{"../number/MAX_INT":25,"../number/MIN_INT":26,"./rand":40}],43:[function(a,b){function c(){return c.get()}c.get=Math.random,b.exports=c},{}],44:[function(a,b){function c(a){return a=d(a),a=e(a),a=f(a).replace(/[\-_]/g," ").replace(/\s[a-z]/g,g).replace(/\s+/g,"").replace(/^[A-Z]/g,h)}var d=a("../lang/toString"),e=a("./replaceAccents"),f=a("./removeNonWord"),g=a("./upperCase"),h=a("./lowerCase");b.exports=c},{"../lang/toString":24,"./lowerCase":45,"./removeNonWord":48,"./replaceAccents":49,"./upperCase":50}],45:[function(a,b){function c(a){return a=d(a),a.toLowerCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":24}],46:[function(a,b){function c(){var a=d(e(arguments),"/");return a.replace(/([^:\/]|^)\/{2,}/g,"$1/")}var d=a("../array/join"),e=a("../array/slice");b.exports=c},{"../array/join":6,"../array/slice":8}],47:[function(a,b){function c(a){return a=d(a),e(a).replace(/^[a-z]/,f)}var d=a("../lang/toString"),e=a("./camelCase"),f=a("./upperCase");b.exports=c},{"../lang/toString":24,"./camelCase":44,"./upperCase":50}],48:[function(a,b){function c(a){return a=d(a),a.replace(e,"")}var d=a("../lang/toString"),e=/[^\x20\x2D0-9A-Z\x5Fa-z\xC0-\xD6\xD8-\xF6\xF8-\xFF]/g;b.exports=c},{"../lang/toString":24}],49:[function(a,b){function c(a){return a=d(a),a.search(/[\xC0-\xFF]/g)>-1&&(a=a.replace(/[\xC0-\xC5]/g,"A").replace(/[\xC6]/g,"AE").replace(/[\xC7]/g,"C").replace(/[\xC8-\xCB]/g,"E").replace(/[\xCC-\xCF]/g,"I").replace(/[\xD0]/g,"D").replace(/[\xD1]/g,"N").replace(/[\xD2-\xD6\xD8]/g,"O").replace(/[\xD9-\xDC]/g,"U").replace(/[\xDD]/g,"Y").replace(/[\xDE]/g,"P").replace(/[\xE0-\xE5]/g,"a").replace(/[\xE6]/g,"ae").replace(/[\xE7]/g,"c").replace(/[\xE8-\xEB]/g,"e").replace(/[\xEC-\xEF]/g,"i").replace(/[\xF1]/g,"n").replace(/[\xF2-\xF6\xF8]/g,"o").replace(/[\xF9-\xFC]/g,"u").replace(/[\xFE]/g,"p").replace(/[\xFD\xFF]/g,"y")),a}var d=a("../lang/toString");b.exports=c},{"../lang/toString":24}],50:[function(a,b){function c(a){return a=d(a),a.toUpperCase()}var d=a("../lang/toString");b.exports=c},{"../lang/toString":24}],51:[function(a,b){function c(){var a=this.defaults={queryTransform:function(a,b){return b},forceTrailingSlash:!1,$httpConfig:{}};this.$get=["$http","$log","DSUtils",function(b,c,d){function e(a,b,c,e){e=e||{};var f=[e.baseUrl||b.baseUrl,b.getEndpoint(d.isString(c)||d.isNumber(c)||"create"===a?c:null,e)];return("find"===a||"update"===a||"destroy"===a)&&f.push(c),d.makePath.apply(d,f)}return{defaults:a,getPath:e,HTTP:function(e){var f=(new Date).getTime();return this.defaults.forceTrailingSlash&&"/"!==e.url[e.url.length]&&(e.url+="/"),e=d.deepMixIn(e,a.$httpConfig),b(e).then(function(a){return c.debug(a.config.method+" request:"+a.config.url+" Time taken: "+((new Date).getTime()-f)+"ms",arguments),a})},GET:function(a,b){return b=b||{},"method"in b||(b.method="GET"),this.HTTP(d.deepMixIn(b,{url:a}))},POST:function(a,b,c){return c=c||{},"method"in c||(c.method="POST"),this.HTTP(d.deepMixIn(c,{url:a,data:b}))},PUT:function(a,b,c){return c=c||{},"method"in c||(c.method="PUT"),this.HTTP(d.deepMixIn(c,{url:a,data:b||{}}))},DEL:function(a,b){return b=b||{},"method"in b||(b.method="DELETE"),this.HTTP(d.deepMixIn(b,{url:a}))},find:function(a,b,c){return c=c||{},this.GET(e("find",a,b,c),c)},findAll:function(b,c,f){return f=f||{},f.params=f.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(f.params,c)),this.GET(e("findAll",b,c,f),f)},create:function(a,b,c){return c=c||{},this.POST(e("create",a,b,c),b,c)},update:function(a,b,c,d){return d=d||{},this.PUT(e("update",a,b,d),c,d)},updateAll:function(b,c,f,g){return g=g||{},g.params=g.params||{},f&&(f=a.queryTransform(b.name,f),d.deepMixIn(g.params,f)),this.PUT(e("updateAll",b,c,g),c,g)},destroy:function(a,b,c){return c=c||{},this.DEL(e("destroy",a,b,c),c)},destroyAll:function(b,c,f){return f=f||{},f.params=f.params||{},c&&(c=a.queryTransform(b.name,c),d.deepMixIn(f.params,c)),this.DEL(e("destroyAll",b,c,f),f)}}}]}b.exports=c},{}],52:[function(a,b){function c(){this.$get=["$q","DSUtils","DSErrors",function(a,b){function c(a,c,d,e){e=e||{};var f=[e.baseUrl||c.baseUrl,c.getEndpoint(b.isString(d)||b.isNumber(d)||"create"===a?d:null,e)];return("find"===a||"update"===a||"destroy"===a)&&f.push(d),b.makePath.apply(b,f)}return{getIds:function(a,c){var d,e=b.makePath(c.baseUrl,"DSKeys",a),f=localStorage.getItem(e);return f?d=b.fromJson(f):(localStorage.setItem(e,b.toJson({})),d={}),d},saveKeys:function(a,c,d){var e=b.makePath(d.baseUrl,"DSKeys",c);localStorage.setItem(e,b.toJson(a))},ensureId:function(a,b,c){var d=this.getIds(b,c);d[a]=1,this.saveKeys(d,b,c)},removeId:function(a,b,c){var d=this.getIds(b,c);delete d[a],this.saveKeys(d,b,c)},GET:function(b){var c=a.defer();try{var d=localStorage.getItem(b);c.resolve(d?angular.fromJson(d):void 0)}catch(e){c.reject(e)}return c.promise},PUT:function(a,c){var d=this;return d.GET(a).then(function(e){return e&&b.deepMixIn(e,c),localStorage.setItem(a,JSON.stringify(e||c)),d.GET(a)})},DEL:function(b){var c=a.defer();try{localStorage.removeItem(b),c.resolve()}catch(d){c.reject(d)}return c.promise},find:function(b,d,e){return e=e||{},this.GET(c("find",b,d,e)).then(function(b){return b?b:a.reject(new Error("Not Found!"))})},findAll:function(d,e,f){var g=this,h=a.defer();f=f||{},"allowSimpleWhere"in f||(f.allowSimpleWhere=!0);var i=[],j=b.keys(g.getIds(d.name,f));return b.forEach(j,function(a){var e=localStorage.getItem(c("find",d,a,f));e&&i.push(b.fromJson(e))}),h.resolve(g.DS.defaults.defaultFilter.call(g.DS,i,d.name,e,f)),h.promise},create:function(a,d,e){var f=this,g=d[a.idAttribute];return e=e||{},f.GET(c("find",a,g,e)).then(function(h){return h?b.deepMixIn(h,d):d[a.idAttribute]=g=g||b.guid(),f.PUT(c("update",a,g,e),h||d)}).then(function(b){return f.ensureId(b[a.idAttribute],a.name,e),b})},update:function(a,d,e,f){f=f||{};var g=this;return g.GET(c("find",a,d,f)).then(function(h){return h=h||{},b.deepMixIn(h,e),g.PUT(c("update",a,d,f),h)}).then(function(b){return g.ensureId(b[a.idAttribute],a.name,f),b})},updateAll:function(c,d,e,f){var g=this;return this.findAll(c,e,f).then(function(e){var h=[];return b.forEach(e,function(a){h.push(g.update(c,a[c.idAttribute],d,f))}),a.all(h)})},destroy:function(a,b,d){return d=d||{},this.DEL(c("destroy",a,b,d))},destroyAll:function(c,d,e){var f=this;return this.findAll(c,d,e).then(function(d){var g=[];return b.forEach(d,function(a){g.push(f.destroy(c,a[c.idAttribute],e))}),a.all(g)})}}}]}b.exports=c},{}],53:[function(a,b){function c(a){return"DS.create("+a+", attrs[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new e.errors.IA(c(a)+"attrs: Must be an object!");return d=f._(i,d),g.resolve(b),d.upsert&&b[i.idAttribute]?e.update(a,b[i.idAttribute],b,d):g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeCreate.call(b,a,b)}).then(function(b){return d.notify&&e.emit(i,"beforeCreate",f.merge({},b)),d.eagerInject&&d.cacheResponse&&(b[i.idAttribute]=b[i.idAttribute]||f.guid(),h=e.inject(a,b)),e.adapters[d.adapter||i.defaultAdapter].create(i,d.serialize?d.serialize(a,b):i.serialize(a,b),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterCreate.call(c,a,c)}).then(function(b){if(d.notify&&e.emit(i,"afterCreate",f.merge({},b)),d.cacheResponse){var c=e.store[a];if(d.eagerInject){var g=b[i.idAttribute],j=h[i.idAttribute],k=e.get(a,j);c.previousAttributes[g]=c.previousAttributes[j],c.changeHistories[g]=c.changeHistories[j],c.observers[g]=c.observers[j],c.modified[g]=c.modified[j],c.saved[g]=c.saved[j],c.index.put(g,k),e.eject(a,j,{notify:!1}),k[i.idAttribute]=g,c.collection.push(k)}var l=e.inject(a,b,d),m=l[i.idAttribute];return c.completedQueries[m]=(new Date).getTime(),c.previousAttributes[m]=f.copy(l),c.saved[m]=f.updateTimestamp(c.saved[m]),e.get(a,m)}return e.createInstance(a,b,d)})["catch"](function(b){return d.eagerInject&&d.cacheResponse&&e.eject(a,h[i.idAttribute],{notify:!1}),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],54:[function(a,b){function c(a,b){return"DS.destroy("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.definitions[a];if(d=d||{},b=f.resolveId(h,b),!h)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new e.errors.IA(c(a,b)+"id: Must be a string or a number!");var i=e.get(a,b);if(!i)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(h,d),g.resolve(i),g.promise.then(function(b){return d.beforeDestroy.call(b,a,b)}).then(function(c){return d.notify&&e.emit(h,"beforeDestroy",f.merge({},c)),d.eagerEject&&e.eject(a,b),e.adapters[d.adapter||h.defaultAdapter].destroy(h,b,d)}).then(function(){return d.afterDestroy.call(i,a,i)}).then(function(){return d.notify&&e.emit(h,"afterDestroy",f.merge({},i)),e.eject(a,b),b})["catch"](function(b){return d.eagerEject&&i&&e.inject(a,i),e.$q.reject(b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],55:[function(a,b){function c(a){return"DS.destroyAll("+a+", params[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},!i)throw new e.errors.NER(c(a)+a);if(!f.isObject(b))throw new h(c(a)+"params: Must be an object!");if(!f.isObject(d))throw new h(c(a)+"options: Must be an object!");return d=f._(i,d),g.resolve(),g.promise.then(function(){return e.adapters[d.adapter||i.defaultAdapter].destroyAll(i,b,d)}).then(function(){return e.ejectAll(a,b)})}catch(j){return g.reject(j),g.promise}}b.exports=d},{}],56:[function(a,b){function c(a,b){return"DS.find("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer(),h=g.promise;try{var i=e.errors.IA,j=e.definitions[a];if(d=d||{},!j)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new i(c(a,b)+"options: Must be an object!");d=f._(j,d);var k=e.store[a];if((d.bypassCache||!d.cacheResponse)&&delete k.completedQueries[b],!(b in k.completedQueries))return b in k.pendingQueries||(h=k.pendingQueries[b]=e.adapters[d.adapter||j.defaultAdapter].find(j,b,d).then(function(c){var f=d.deserialize?d.deserialize(a,c):j.deserialize(a,c);return delete k.pendingQueries[b],d.cacheResponse?(k.completedQueries[b]=(new Date).getTime(),e.inject(a,f,d)):e.createInstance(a,f,d)},function(a){return delete k.pendingQueries[b],e.$q.reject(a)})),k.pendingQueries[b];g.resolve(e.get(a,b))}catch(l){g.reject(l)}return h}b.exports=d},{}],57:[function(a,b){function c(a){return"DS.findAll("+a+", params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.store[b],i=f.definitions[b].idAttribute,j=(new Date).getTime();a=a||[],delete h.pendingQueries[d],h.completedQueries[d]=j,h.collectionModified=g.updateTimestamp(h.collectionModified);var k=f.inject(b,a,e);return g.isArray(k)?angular.forEach(k,function(a){a&&a[i]&&(h.completedQueries[a[i]]=j)}):(f.$log.warn(c(b)+"response is expected to be an array!"),h.completedQueries[k[i]]=j),k}function e(a,b,c){var e=this,f=e.utils,g=e.definitions[a],h=e.store[a],i=f.toJson(b);return(c.bypassCache||!c.cacheResponse)&&delete h.completedQueries[i],i in h.completedQueries?e.filter(a,b,c):(i in h.pendingQueries||(h.pendingQueries[i]=e.adapters[c.adapter||g.defaultAdapter].findAll(g,b,c).then(function(b){delete h.pendingQueries[i];var j=c.deserialize?c.deserialize(a,b):g.deserialize(a,b);if(!c.cacheResponse)return f.forEach(j,function(b,d){j[d]=e.createInstance(a,b,c)}),j;try{return d.call(e,j,a,i,c)}catch(k){return e.$q.reject(k)}},function(a){return delete h.pendingQueries[i],e.$q.reject(a)})),h.pendingQueries[i])}function f(a,b,d){var f=this,g=f.utils,h=f.$q.defer(),i=f.definitions[a];try{var j=f.errors.IA;if(d=d||{},b=b||{},!i)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new j(c(a)+"params: Must be an object!");if(!g.isObject(d))throw new j(c(a)+"options: Must be an object!");return d=g._(i,d),h.resolve(),h.promise.then(function(){return e.call(f,a,b,d)})}catch(k){return h.reject(k),h.promise}}b.exports=f},{}],58:[function(a,b){b.exports={create:a("./create"),destroy:a("./destroy"),destroyAll:a("./destroyAll"),find:a("./find"),findAll:a("./findAll"),loadRelations:a("./loadRelations"),refresh:a("./refresh"),save:a("./save"),update:a("./update"),updateAll:a("./updateAll")}},{"./create":53,"./destroy":54,"./destroyAll":55,"./find":56,"./findAll":57,"./loadRelations":59,"./refresh":60,"./save":61,"./update":62,"./updateAll":63}],59:[function(a,b){function c(a){return"DS.loadRelations("+a+", instance(Id), relations[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},(g.isString(b)||g.isNumber(b))&&(b=f.get(a,b)),angular.isString(d)&&(d=[d]),!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"instance(Id): Must be a string, number or object!");if(!g.isArray(d))throw new i(c(a)+"relations: Must be a string or an array!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");e=g._(j,e),e.hasOwnProperty("findBelongsTo")||(e.findBelongsTo=!0),e.hasOwnProperty("findHasMany")||(e.findHasMany=!0);var k=[],l=[];return g.forEach(j.relationList,function(a){var c=a.relation;if(g.contains(d,c)){var h,i={};e.allowSimpleWhere?i[a.foreignKey]=b[j.idAttribute]:(i.where={},i.where[a.foreignKey]={"==":b[j.idAttribute]}),"hasMany"===a.type&&i[a.foreignKey]?h=f.findAll(c,i,e):"hasOne"===a.type?a.localKey&&b[a.localKey]?h=f.find(c,b[a.localKey],e):a.foreignKey&&i[a.foreignKey]&&(h=f.findAll(c,i,e).then(function(a){return a.length?a[0]:null})):b[a.localKey]&&(h=f.find(c,b[a.localKey],e)),h&&(k.push(h),l.push(a.localField))}}),h.resolve(),h.promise.then(function(){return f.$q.all(k)}).then(function(a){return angular.forEach(l,function(c,d){b[c]=a[d]}),b})}catch(m){return h.reject(m),h.promise}}b.exports=d},{}],60:[function(a,b){function c(a,b){return"DS.refresh("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.errors.IA,h=e.definitions[a];if(d=d||{},b=f.resolveId(e.definitions[a],b),h){if(f.isString(b)||f.isNumber(b)){if(f.isObject(d)){if(d=f._(h,d),d.bypassCache=!0,e.get(a,b))return e.find(a,b,d);var i=e.$q.defer();return i.resolve(),i.promise}throw new g(c(a,b)+"options: Must be an object!")}throw new g(c(a,b)+"id: Must be a string or a number!")}throw new e.errors.NER(c(a,b)+a)}b.exports=d},{}],61:[function(a,b){function c(a,b){return"DS.save("+a+", "+b+"[, options]): "}function d(a,b,d){var e=this,f=e.utils,g=e.$q.defer();try{var h=e.errors.IA,i=e.definitions[a];if(d=d||{},b=f.resolveId(i,b),!i)throw new e.errors.NER(c(a,b)+a);if(!f.isString(b)&&!f.isNumber(b))throw new h(c(a,b)+"id: Must be a string or a number!");if(!f.isObject(d))throw new h(c(a,b)+"options: Must be an object!");var j=e.get(a,b);if(!j)throw new e.errors.R(c(a,b)+'id: "'+b+'" not found!');return d=f._(i,d),g.resolve(j),g.promise.then(function(b){return d.beforeValidate.call(b,a,b)}).then(function(b){return d.validate.call(b,a,b)}).then(function(b){return d.afterValidate.call(b,a,b)}).then(function(b){return d.beforeUpdate.call(b,a,b)}).then(function(c){if(d.notify&&e.emit(i,"beforeUpdate",f.merge({},c)),d.changesOnly){var g=e.store[a];g.observers[b].deliver();var h=[],j=e.changes(a,b);for(var k in j.added)h.push(k);for(k in j.changed)h.push(k);if(j=f.pick(c,h),f.isEmpty(j))return c;c=j}return e.adapters[d.adapter||i.defaultAdapter].update(i,b,d.serialize?d.serialize(a,c):i.serialize(a,c),d)}).then(function(b){var c=d.deserialize?d.deserialize(a,b):i.deserialize(a,b);return d.afterUpdate.call(c,a,c)}).then(function(c){if(d.notify&&e.emit(i,"afterUpdate",f.merge({},c)),d.cacheResponse){var g=e.store[a],h=e.inject(i.name,c,d);return g.previousAttributes[b]=f.copy(h),g.saved[b]=f.updateTimestamp(g.saved[b]),g.observers[b].discardChanges(),e.get(a,b)}return c})}catch(k){return g.reject(k),g.promise}}b.exports=d},{}],62:[function(a,b){function c(a,b){return"DS.update("+a+", "+b+", attrs[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},b=g.resolveId(j,b),!j)throw new f.errors.NER(c(a,b)+a);if(!g.isString(b)&&!g.isNumber(b))throw new i(c(a,b)+"id: Must be a string or a number!");if(!g.isObject(d))throw new i(c(a,b)+"attrs: Must be an object!"); +if(!g.isObject(e))throw new i(c(a,b)+"options: Must be an object!");return e=g._(j,e),h.resolve(d),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(c){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},c)),f.adapters[e.adapter||j.defaultAdapter].update(j,b,e.serialize?e.serialize(a,c):j.serialize(a,c),e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(b){if(e.notify&&f.emit(j,"afterUpdate",g.merge({},b)),e.cacheResponse){var c=f.store[a],d=f.inject(j.name,b,e),h=d[j.idAttribute];return c.previousAttributes[h]=g.copy(d),c.saved[h]=g.updateTimestamp(c.saved[h]),c.observers[h].discardChanges(),f.get(j.name,h)}return b})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],63:[function(a,b){function c(a){return"DS.updateAll("+a+", attrs, params[, options]): "}function d(a,b,d,e){var f=this,g=f.utils,h=f.$q.defer();try{var i=f.errors.IA,j=f.definitions[a];if(e=e||{},!j)throw new f.errors.NER(c(a)+a);if(!g.isObject(b))throw new i(c(a)+"attrs: Must be an object!");if(!g.isObject(d))throw new i(c(a)+"params: Must be an object!");if(!g.isObject(e))throw new i(c(a)+"options: Must be an object!");return e=g._(j,e),h.resolve(b),h.promise.then(function(b){return e.beforeValidate.call(b,a,b)}).then(function(b){return e.validate.call(b,a,b)}).then(function(b){return e.afterValidate.call(b,a,b)}).then(function(b){return e.beforeUpdate.call(b,a,b)}).then(function(b){return e.notify&&f.emit(j,"beforeUpdate",g.merge({},b)),f.adapters[e.adapter||j.defaultAdapter].updateAll(j,e.serialize?e.serialize(a,b):j.serialize(a,b),d,e)}).then(function(b){var c=e.deserialize?e.deserialize(a,b):j.deserialize(a,b);return e.afterUpdate.call(c,a,c)}).then(function(a){return e.notify&&f.emit(j,"afterUpdate",g.merge({},a)),e.cacheResponse?f.inject(j.name,a,e):a})}catch(k){return h.reject(k),h.promise}}b.exports=d},{}],64:[function(a,b){function c(a,b,c){c(null,b)}function d(a,b,c,e,f){var g=b[c],h=e[g[0]],i=f[g[0]];return a.isString(h)&&(h=a.upperCase(h)),a.isString(i)&&(i=a.upperCase(i)),"DESC"===g[1]?h>i?-1:i>h?1:ch?-1:h>i?1:c"===f?h=j>d:">="===f?h=j>=d:"<"===f?h=d>j:"<="===f?h=d>=j:"in"===f?h=g.isString(d)?-1!==d.indexOf(j):g.contains(d,j):"notIn"===f?h=g.isString(d)?-1===d.indexOf(j):!g.contains(d,j):"contains"===f?h=g.isString(d)?-1!==(j||"").indexOf(d):g.contains(j,d):"notContains"===f&&(h=g.isString(d)?-1===(j||"").indexOf(d):!g.contains(j,d)),void 0!==h&&(c=b?h:i?c||h:c&&h),b=!1})}),c}));var k=null;if(g.isString(c.orderBy)?k=[[c.orderBy,"ASC"]]:g.isArray(c.orderBy)&&(k=c.orderBy),!k&&g.isString(c.sort)?k=[[c.sort,"ASC"]]:!k&&g.isArray(c.sort)&&(k=c.sort),k){var l=0;angular.forEach(k,function(a,b){if(g.isString(a))k[b]=[a,"ASC"];else if(!g.isArray(a))throw new f.errors.IllegalArgumentError("DS.filter(resourceName[, params][, options]): "+JSON.stringify(a)+": Must be a string or an array!",{params:{"orderBy[i]":{actual:typeof a,expected:"string|array"}}});h=g.sort(h,function(a,b){return d(g,k,l,a,b)})})}var m=angular.isNumber(c.limit)?c.limit:null,n=null;return angular.isNumber(c.skip)?n=c.skip:angular.isNumber(c.offset)&&(n=c.offset),m&&n?h=f.utils.slice(h,n,Math.min(h.length,n+m)):f.utils.isNumber(m)?h=f.utils.slice(h,0,Math.min(h.length,m)):f.utils.isNumber(n)&&(h=n=b?a+1:b},deepFreeze:function h(a){if("function"==typeof Object.freeze){var b,c;Object.freeze(a);for(c in a)b=a[c],a.hasOwnProperty(c)&&"object"==typeof b&&!Object.isFrozen(b)&&h(b)}},diffObjectFromOldObject:g.diffObjectFromOldObject,Events:c}}]},{"../lib/observe-js/observe-js":1,"./errors":88,"mout/array/contains":2,"mout/array/filter":3,"mout/array/remove":7,"mout/array/slice":8,"mout/array/sort":9,"mout/array/toLookup":10,"mout/lang/isBoolean":17,"mout/lang/isEmpty":18,"mout/object/deepMixIn":28,"mout/object/keys":32,"mout/object/merge":33,"mout/object/mixIn":34,"mout/object/pick":36,"mout/object/set":37,"mout/random/guid":39,"mout/string/makePath":46,"mout/string/pascalCase":47,"mout/string/upperCase":50}]},{},[89]); \ No newline at end of file diff --git a/guide/nav.html b/guide/nav.html index 02ad652..ba87f3b 100644 --- a/guide/nav.html +++ b/guide/nav.html @@ -82,7 +82,7 @@ API