From 99d0dab43ccb1319a27718bc91dbc8fae5b20366 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Tue, 13 Feb 2018 20:40:28 -0800 Subject: [PATCH] 3.0.2 --- AUTHORS | 1 + dist/js-data.es2015.js | 3923 +++++++++++++++++------------------ dist/js-data.es2015.js.map | 2 +- dist/js-data.js | 3925 ++++++++++++++++++------------------ dist/js-data.js.map | 2 +- dist/js-data.min.js | 4 +- dist/js-data.min.js.map | 2 +- package.json | 2 +- 8 files changed, 3982 insertions(+), 3879 deletions(-) diff --git a/AUTHORS b/AUTHORS index e432aff9..442e3fdc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -17,6 +17,7 @@ Jeremy TRUFIER Ken Børge Viktil Kent C. Dodds Kurt Van Delden +lumimies Matt Lewis Matt Winkler Matthew Overall diff --git a/dist/js-data.es2015.js b/dist/js-data.es2015.js index 28c5a447..e2a69816 100644 --- a/dist/js-data.es2015.js +++ b/dist/js-data.es2015.js @@ -1,6 +1,6 @@ /*! * js-data -* @version 3.0.1 - Homepage +* @version 3.0.2 - Homepage * @author js-data project authors * @copyright (c) 2014-2016 js-data project authors * @license MIT @@ -94,8 +94,8 @@ var toConsumableArray = function (arr) { * Utility methods used by JSData. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('foo')) // true + * import { utils } from 'js-data'; + * console.log(utils.isString('foo')); // true * * @namespace utils * @type {Object} @@ -166,9 +166,9 @@ var utils = { * `window.Promise` or `global.Promise`. * * @example Make JSData use a different `Promise` constructor - * import Promise from 'bluebird' - * import {utils} from 'js-data' - * utils.Promise = Promise + * import Promise from 'bluebird'; + * import { utils } from 'js-data'; + * utils.Promise = Promise; * * @name utils.Promise * @since 3.0.0 @@ -185,8 +185,8 @@ var utils = { * - does not start with "_" * * @method utils._ - * @param {Object} dest Destination object. - * @param {Object} src Source object. + * @param {object} dest Destination object. + * @param {object} src Source object. * @private * @since 3.0.0 */ @@ -203,7 +203,7 @@ var utils = { * Recursively iterates over relations found in `opts.with`. * * @method utils._forRelation - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {Relation} def Relation definition. * @param {Function} fn Callback function. * @param {*} [thisArg] Execution context for the callback function. @@ -276,19 +276,19 @@ var utils = { * provided `props`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Cat () {} * utils.addHiddenPropsToTarget(Cat.prototype, { * say () { - * console.log('meow') + * console.log('meow'); * } - * }) - * const cat = new Cat() - * cat.say() // "meow" + * }); + * const cat = new Cat(); + * cat.say(); // "meow" * * @method utils.addHiddenPropsToTarget - * @param {Object} target That to which `props` should be added. - * @param {Object} props Properties to be added to `target`. + * @param {object} target That to which `props` should be added. + * @param {object} props Properties to be added to `target`. * @since 3.0.0 */ addHiddenPropsToTarget: function addHiddenPropsToTarget(target, props) { @@ -307,17 +307,17 @@ var utils = { * Return whether the two objects are deeply different. * * @example - * import {utils} from 'js-data' - * utils.areDifferent({}, {}) // false - * utils.areDifferent({ a: 1 }, { a: 1 }) // false - * utils.areDifferent({ foo: 'bar' }, {}) // true + * import { utils } from 'js-data'; + * utils.areDifferent({}, {}); // false + * utils.areDifferent({ a: 1 }, { a: 1 }); // false + * utils.areDifferent({ foo: 'bar' }, {}); // true * * @method utils.areDifferent - * @param {Object} a Base object. - * @param {Object} b Comparison object. - * @param {Object} [opts] Configuration options. + * @param {object} a Base object. + * @param {object} b Comparison object. + * @param {object} [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {boolean} Whether the two objects are deeply different. * @see utils.diffObjects * @since 3.0.0 @@ -335,12 +335,12 @@ var utils = { * to just being called like a normal function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Cat () { - * utils.classCallCheck(this, Cat) + * utils.classCallCheck(this, Cat); * } - * const cat = new Cat() // this is ok - * Cat() // this throws an error + * const cat = new Cat(); // this is ok + * Cat(); // this throws an error * * @method utils.classCallCheck * @param {*} instance Instance that is being constructed. @@ -361,11 +361,11 @@ var utils = { * Deep copy a value. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' } } - * const b = utils.copy(a) - * a === b // false - * utils.areDifferent(a, b) // false + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' } }; + * const b = utils.copy(a); + * a === b; // false + * utils.areDifferent(a, b); // false * * @param {*} from Value to deep copy. * @param {*} [to] Destination object for the copy operation. @@ -459,15 +459,15 @@ var utils = { * `dest`. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * const b = { beep: 'bip' } - * utils.deepFillIn(b, a) - * console.log(b) // {"foo":{"bar":"baz"},"beep":"bip"} + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.deepFillIn(b, a); + * console.log(b); // {"foo":{"bar":"baz"},"beep":"bip"} * * @method utils.deepFillIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.fillIn * @see utils.deepMixIn * @since 3.0.0 @@ -491,15 +491,15 @@ var utils = { * Recursively shallow copy enumerable properties from `source` to `dest`. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * const b = { beep: 'bip' } - * utils.deepFillIn(b, a) - * console.log(b) // {"foo":{"bar":"baz"},"beep":"boop"} + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.deepFillIn(b, a); + * console.log(b); // {"foo":{"bar":"baz"},"beep":"boop"} * * @method utils.deepMixIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.fillIn * @see utils.deepFillIn * @since 3.0.0 @@ -524,20 +524,20 @@ var utils = { * Return a diff of the base object to the comparison object. * * @example - * import {utils} from 'js-data' - * const oldObject = { foo: 'bar', a: 1234 } - * const newObject = { beep: 'boop', a: 5678 } - * const diff = utils.diffObjects(oldObject, newObject) - * console.log(diff.added) // {"beep":"boop"} - * console.log(diff.changed) // {"a":5678} - * console.log(diff.removed) // {"foo":undefined} + * import { utils } from 'js-data'; + * const oldObject = { foo: 'bar', a: 1234 }; + * const newObject = { beep: 'boop', a: 5678 }; + * const diff = utils.diffObjects(oldObject, newObject); + * console.log(diff.added); // {"beep":"boop"} + * console.log(diff.changed); // {"a":5678} + * console.log(diff.removed); // {"foo":undefined} * * @method utils.diffObjects - * @param {Object} newObject Comparison object. - * @param {Object} oldObject Base object. - * @param {Object} [opts] Configuration options. + * @param {object} newObject Comparison object. + * @param {object} oldObject Base object. + * @param {object} [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {Object} The diff from the base object to the comparison object. * @see utils.areDifferent * @since 3.0.0 @@ -593,10 +593,10 @@ var utils = { * Return whether the two values are equal according to the `==` operator. * * @example - * import {utils} from 'js-data' - * console.log(utils.equal(1,1)) // true - * console.log(utils.equal(1,'1')) // true - * console.log(utils.equal(93, 66)) // false + * import { utils } from 'js-data'; + * console.log(utils.equal(1,1)); // true + * console.log(utils.equal(1,'1')); // true + * console.log(utils.equal(93, 66)); // false * * @method utils.equal * @param {*} a First value in the comparison. @@ -614,10 +614,10 @@ var utils = { * metadata. Used throughout the various js-data components. * * @example - * import {utils} from 'js-data' - * const errorFactory = utils.err('domain', 'target') - * const error400 = errorFactory(400, 'expected type', 'actual type') - * console.log(error400) // [Error: [domain:target] expected: expected type, found: string + * import { utils } from 'js-data'; + * const errorFactory = utils.err('domain', 'target'); + * const error400 = errorFactory(400, 'expected type', 'actual type'); + * console.log(error400); // [Error: [domain:target] expected: expected type, found: string http://www.js-data.io/v3.0/docs/errors#400] * @method utils.err * @param {string} domain Namespace. @@ -639,14 +639,14 @@ var utils = { * Add eventing capabilities into the target object. * * @example - * import {utils} from 'js-data' - * const user = { name: 'John' } - * utils.eventify(user) - * user.on('foo', () => console.log(arguments)) - * user.emit('foo', 1, 'bar') // should log to console values (1, "bar") + * import { utils } from 'js-data'; + * const user = { name: 'John' }; + * utils.eventify(user); + * user.on('foo', () => console.log(arguments)); + * user.emit('foo', 1, 'bar'); // should log to console values (1, "bar") * * @method utils.eventify - * @param {Object} target Target object. + * @param {object} target Target object. * @param {Function} [getter] Custom getter for retrieving the object's event * listeners. * @param {Function} [setter] Custom setter for setting the object's event @@ -726,24 +726,24 @@ var utils = { * to produce a subclass based on `props` and `classProps`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Animal () {} - * Animal.extend = utils.extend + * Animal.extend = utils.extend; * const Cat = Animal.extend({ * say () { - * console.log('meow') + * console.log('meow'); * } - * }) - * const cat = new Cat() - * cat instanceof Animal // true - * cat instanceof Cat // true - * cat.say() // "meow" + * }); + * const cat = new Cat(); + * cat instanceof Animal; // true + * cat instanceof Cat; // true + * cat.say(); // "meow" * * @method utils.extend - * @param {Object} props Instance properties for the subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} props Instance properties for the subclass. + * @param {object} [props.constructor] Provide a custom constructor function * to use as the subclass. - * @param {Object} props Static properties for the subclass. + * @param {object} props Static properties for the subclass. * @returns {Constructor} A new subclass. * @since 3.0.0 */ @@ -809,15 +809,15 @@ var utils = { * `src` but are missing from `dest. * * @example - * import {utils} from 'js-data' - * const a = { foo: 'bar', beep: 'boop' } - * const b = { beep: 'bip' } - * utils.fillIn(b, a) - * console.log(b) // {"foo":"bar","beep":"bip"} + * import { utils } from 'js-data'; + * const a = { foo: 'bar', beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.fillIn(b, a); + * console.log(b); // {"foo":"bar","beep":"bip"} * * @method utils.fillIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.deepFillIn * @see utils.deepMixIn * @since 3.0.0 @@ -835,20 +835,20 @@ var utils = { * Find the last index of an item in an array according to the given checker function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const john = { name: 'John', age: 20 } - * const sara = { name: 'Sara', age: 25 } - * const dan = { name: 'Dan', age: 20 } - * const users = [john, sara, dan] + * const john = { name: 'John', age: 20 }; + * const sara = { name: 'Sara', age: 25 }; + * const dan = { name: 'Dan', age: 20 }; + * const users = [john, sara, dan]; * - * console.log(utils.findIndex(users, (user) => user.age === 25)) // 1 - * console.log(utils.findIndex(users, (user) => user.age > 19)) // 2 - * console.log(utils.findIndex(users, (user) => user.name === 'John')) // 0 - * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')) // -1 + * console.log(utils.findIndex(users, (user) => user.age === 25)); // 1 + * console.log(utils.findIndex(users, (user) => user.age > 19)); // 2 + * console.log(utils.findIndex(users, (user) => user.name === 'John')); // 0 + * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')); // -1 * * @method utils.findIndex - * @param {Array} array The array to search. + * @param {array} array The array to search. * @param {Function} fn Checker function. * @returns {number} Index if found or -1 if not found. * @since 3.0.0 @@ -874,7 +874,7 @@ var utils = { * * @method utils.forEachRelation * @param {Mapper} mapper Mapper. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {Function} fn Callback function. * @param {*} thisArg Execution context for the callback function. * @since 3.0.0 @@ -894,18 +894,18 @@ var utils = { * Iterate over an object's own enumerable properties. * * @example - * import {utils} from 'js-data' - * const a = { b: 1, c: 4 } - * let sum = 0 + * import { utils } from 'js-data'; + * const a = { b: 1, c: 4 }; + * let sum = 0; * utils.forOwn(a, function (value, key) { - * sum += value - * }) - * console.log(sum) // 5 + * sum += value; + * }); + * console.log(sum); // 5 * * @method utils.forOwn - * @param {Object} object The object whose properties are to be enumerated. + * @param {object} object The object whose properties are to be enumerated. * @param {Function} fn Iteration function. - * @param {Object} [thisArg] Content to which to bind `fn`. + * @param {object} [thisArg] Content to which to bind `fn`. * @since 3.0.0 */ forOwn: function forOwn(obj, fn, thisArg) { @@ -924,10 +924,10 @@ var utils = { * Proxy for `JSON.parse`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const a = utils.fromJson('{"name" : "John"}') - * console.log(a) // { name: 'John' } + * const a = utils.fromJson('{"name" : "John"}'); + * console.log(a); // { name: 'John' } * * @method utils.fromJson * @param {string} json JSON to parse. @@ -945,13 +945,13 @@ var utils = { * nested properties. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * console.log(utils.get(a, 'beep')) // "boop" - * console.log(utils.get(a, 'foo.bar')) // "baz" + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * console.log(utils.get(a, 'beep')); // "boop" + * console.log(utils.get(a, 'foo.bar')); // "baz" * * @method utils.get - * @param {Object} object Object from which to retrieve a property's value. + * @param {object} object Object from which to retrieve a property's value. * @param {string} prop Property to retrieve. * @returns {*} Value of the specified property. * @see utils.set @@ -981,21 +981,21 @@ var utils = { * provided, then finds the parent class of the instance's constructor. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * // using ES2015 classes * class Foo {} * class Bar extends Foo {} - * const barInstance = new Bar() - * let baseType = utils.getSuper(barInstance) - * console.log(Foo === baseType) // true + * const barInstance = new Bar(); + * let baseType = utils.getSuper(barInstance); + * console.log(Foo === baseType); // true * * // using Function constructor with utils.extend * function Foo () {} - * Foo.extend = utils.extend - * const Bar = Foo.extend() - * const barInstance = new Bar() - * let baseType = utils.getSuper(barInstance) - * console.log(Foo === baseType) // true + * Foo.extend = utils.extend; + * const Bar = Foo.extend(); + * const barInstance = new Bar(); + * let baseType = utils.getSuper(barInstance); + * console.log(Foo === baseType); // true * * @method utils.getSuper * @param {Object|Function} instance Instance or constructor. @@ -1016,16 +1016,16 @@ var utils = { * Return the intersection of two arrays. * * @example - * import {utils} from 'js-data' - * const arrA = ['green', 'red', 'blue', 'red'] - * const arrB = ['green', 'yellow', 'red'] - * const intersected = utils.intersection(arrA, arrB) + * import { utils } from 'js-data'; + * const arrA = ['green', 'red', 'blue', 'red']; + * const arrB = ['green', 'yellow', 'red']; + * const intersected = utils.intersection(arrA, arrB); * - * console.log(intersected) // ['green', 'red']) + * console.log(intersected); // ['green', 'red']) * * @method utils.intersection - * @param {Array} array1 First array. - * @param {Array} array2 Second array. + * @param {array} array1 First array. + * @param {array} array2 Second array. * @returns {Array} Array of elements common to both arrays. * @since 3.0.0 */ @@ -1054,11 +1054,11 @@ var utils = { * Proxy for `Array.isArray`. * * @example - * import {utils} from 'js-data' - * const a = [1,2,3,4,5] - * const b = { foo: "bar" } - * console.log(utils.isArray(a)) // true - * console.log(utils.isArray(b)) // false + * import { utils } from 'js-data'; + * const a = [1,2,3,4,5]; + * const b = { foo: "bar" }; + * console.log(utils.isArray(a)); // true + * console.log(utils.isArray(b)); // false * * @method utils.isArray * @param {*} value The value to test. @@ -1072,16 +1072,16 @@ var utils = { * `blacklist`. * * @example - * import {utils} from 'js-data' - * const blacklist = [/^\$hashKey/g, /^_/g, 'id'] - * console.log(utils.isBlacklisted("$hashKey", blacklist)) // true - * console.log(utils.isBlacklisted("id", blacklist)) // true - * console.log(utils.isBlacklisted("_myProp", blacklist)) // true - * console.log(utils.isBlacklisted("my_id", blacklist)) // false + * import { utils } from 'js-data'; + * const blacklist = [/^\$hashKey/g, /^_/g, 'id']; + * console.log(utils.isBlacklisted("$hashKey", blacklist)); // true + * console.log(utils.isBlacklisted("id", blacklist)); // true + * console.log(utils.isBlacklisted("_myProp", blacklist)); // true + * console.log(utils.isBlacklisted("my_id", blacklist)); // false * * @method utils.isBlacklisted * @param {string} prop The name of a property to check. - * @param {Array} blacklist Array of strings and regular expressions. + * @param {array} blacklist Array of strings and regular expressions. * @returns {boolean} Whether `prop` was matched. * @since 3.0.0 */ @@ -1104,11 +1104,11 @@ var utils = { * Return whether the provided value is a boolean. * * @example - * import {utils} from 'js-data' - * const a = true - * const b = { foo: "bar" } - * console.log(utils.isBoolean(a)) // true - * console.log(utils.isBoolean(b)) // false + * import { utils } from 'js-data'; + * const a = true; + * const b = { foo: "bar" }; + * console.log(utils.isBoolean(a)); // true + * console.log(utils.isBoolean(b)); // false * * @method utils.isBoolean * @param {*} value The value to test. @@ -1124,11 +1124,11 @@ var utils = { * Return whether the provided value is a date. * * @example - * import {utils} from 'js-data' - * const a = new Date() - * const b = { foo: "bar" } - * console.log(utils.isDate(a)) // true - * console.log(utils.isDate(b)) // false + * import { utils } from 'js-data'; + * const a = new Date(); + * const b = { foo: "bar" }; + * console.log(utils.isDate(a)); // true + * console.log(utils.isDate(b)); // false * * @method utils.isDate * @param {*} value The value to test. @@ -1144,11 +1144,11 @@ var utils = { * Return whether the provided value is a function. * * @example - * import {utils} from 'js-data' - * const a = function (){ console.log('foo bar')} - * const b = { foo: "bar" } - * console.log(utils.isFunction(a)) // true - * console.log(utils.isFunction(b)) // false + * import { utils } from 'js-data'; + * const a = function () { console.log('foo bar'); }; + * const b = { foo: "bar" }; + * console.log(utils.isFunction(a)); // true + * console.log(utils.isFunction(b)); // false * * @method utils.isFunction * @param {*} value The value to test. @@ -1164,13 +1164,13 @@ var utils = { * Return whether the provided value is an integer. * * @example - * import {utils} from 'js-data' - * const a = 1 - * const b = 1.25 - * const c = '1' - * console.log(utils.isInteger(a)) // true - * console.log(utils.isInteger(b)) // false - * console.log(utils.isInteger(c)) // false + * import { utils } from 'js-data'; + * const a = 1; + * const b = 1.25; + * const c = '1'; + * console.log(utils.isInteger(a)); // true + * console.log(utils.isInteger(b)); // false + * console.log(utils.isInteger(c)); // false * * @method utils.isInteger * @param {*} value The value to test. @@ -1186,11 +1186,11 @@ var utils = { * Return whether the provided value is `null`. * * @example - * import {utils} from 'js-data' - * const a = null - * const b = { foo: "bar" } - * console.log(utils.isNull(a)) // true - * console.log(utils.isNull(b)) // false + * import { utils } from 'js-data'; + * const a = null; + * const b = { foo: "bar" }; + * console.log(utils.isNull(a)); // true + * console.log(utils.isNull(b)); // false * * @method utils.isNull * @param {*} value The value to test. @@ -1206,13 +1206,13 @@ var utils = { * Return whether the provided value is a number. * * @example - * import {utils} from 'js-data' - * const a = 1 - * const b = -1.25 - * const c = '1' - * console.log(utils.isNumber(a)) // true - * console.log(utils.isNumber(b)) // true - * console.log(utils.isNumber(c)) // false + * import { utils } from 'js-data'; + * const a = 1; + * const b = -1.25; + * const c = '1'; + * console.log(utils.isNumber(a)); // true + * console.log(utils.isNumber(b)); // true + * console.log(utils.isNumber(c)); // false * * @method utils.isNumber * @param {*} value The value to test. @@ -1229,11 +1229,11 @@ var utils = { * Return whether the provided value is an object. * * @example - * import {utils} from 'js-data' - * const a = { foo: "bar" } - * const b = 'foo bar' - * console.log(utils.isObject(a)) // true - * console.log(utils.isObject(b)) // false + * import { utils } from 'js-data'; + * const a = { foo: "bar" }; + * const b = 'foo bar'; + * console.log(utils.isObject(a)); // true + * console.log(utils.isObject(b)); // false * * @method utils.isObject * @param {*} value The value to test. @@ -1249,13 +1249,13 @@ var utils = { * Return whether the provided value is a regular expression. * * @example - * import {utils} from 'js-data' - * const a = /^\$.+$/ig - * const b = new RegExp('^\$.+$', 'ig') - * const c = { foo: "bar" } - * console.log(utils.isRegExp(a)) // true - * console.log(utils.isRegExp(b)) // true - * console.log(utils.isRegExp(c)) // false + * import { utils } from 'js-data'; + * const a = /^\$.+$/ig; + * const b = new RegExp('^\$.+$', 'ig'); + * const c = { foo: "bar" }; + * console.log(utils.isRegExp(a)); // true + * console.log(utils.isRegExp(b)); // true + * console.log(utils.isRegExp(c)); // false * * @method utils.isRegExp * @param {*} value The value to test. @@ -1271,12 +1271,12 @@ var utils = { * Return whether the provided value is a string or a number. * * @example - * import {utils} from 'js-data' - * console.log(utils.isSorN('')) // true - * console.log(utils.isSorN(-1.65)) // true - * console.log(utils.isSorN('my string')) // true - * console.log(utils.isSorN({})) // false - * console.log(utils.isSorN([1,2,4])) // false + * import { utils } from 'js-data'; + * console.log(utils.isSorN('')); // true + * console.log(utils.isSorN(-1.65)); // true + * console.log(utils.isSorN('my string')); // true + * console.log(utils.isSorN({})); // false + * console.log(utils.isSorN([1,2,4])); // false * * @method utils.isSorN * @param {*} value The value to test. @@ -1292,11 +1292,11 @@ var utils = { * Return whether the provided value is a string. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('')) // true - * console.log(utils.isString('my string')) // true - * console.log(utils.isString(100)) // false - * console.log(utils.isString([1,2,4])) // false + * import { utils } from 'js-data'; + * console.log(utils.isString('')); // true + * console.log(utils.isString('my string')); // true + * console.log(utils.isString(100)); // false + * console.log(utils.isString([1,2,4])); // false * * @method utils.isString * @param {*} value The value to test. @@ -1312,13 +1312,13 @@ var utils = { * Return whether the provided value is a `undefined`. * * @example - * import {utils} from 'js-data' - * const a = undefined - * const b = { foo: "bar"} - * console.log(utils.isUndefined(a)) // true - * console.log(utils.isUndefined(b.baz)) // true - * console.log(utils.isUndefined(b)) // false - * console.log(utils.isUndefined(b.foo)) // false + * import { utils } from 'js-data'; + * const a = undefined; + * const b = { foo: "bar"}; + * console.log(utils.isUndefined(a)); // true + * console.log(utils.isUndefined(b.baz)); // true + * console.log(utils.isUndefined(b)); // false + * console.log(utils.isUndefined(b.foo)); // false * * @method utils.isUndefined * @param {*} value The value to test. @@ -1334,17 +1334,17 @@ var utils = { * Mix in logging capabilities to the target. * * @example - * import {utils} from 'js-data' - * const a = { foo: "bar"} + * import { utils } from 'js-data'; + * const a = { foo: "bar"}; * * // Add standard logging to an object - * utils.logify(a) - * a.log('info', 'test log info') // output 'test log info' to console. + * utils.logify(a); + * a.log('info', 'test log info'); // output 'test log info' to console. * * // Toggle debug output of an object - * a.dbg('test debug output') // does not output because debug is off. - * a.debug = true - * a.dbg('test debug output') // output 'test debug output' to console. + * a.dbg('test debug output'); // does not output because debug is off. + * a.debug = true; + * a.dbg('test debug output'); // output 'test debug output' to console. * * @method utils.logify * @param {*} target The target. @@ -1393,18 +1393,18 @@ var utils = { * array. * * @example - * import {utils} from 'js-data' - * const colors = ['red', 'green', 'yellow'] + * import { utils } from 'js-data'; + * const colors = ['red', 'green', 'yellow']; * - * console.log(colors.length) // 3 - * utils.noDupeAdd(colors, 'red') - * console.log(colors.length) // 3, red already exists + * console.log(colors.length); // 3 + * utils.noDupeAdd(colors, 'red'); + * console.log(colors.length); // 3, red already exists * - * utils.noDupeAdd(colors, 'blue') - * console.log(colors.length) // 4, blue was added + * utils.noDupeAdd(colors, 'blue'); + * console.log(colors.length); // 4, blue was added * * @method utils.noDupeAdd - * @param {Array} array The array. + * @param {array} array The array. * @param {*} record The value to add. * @param {Function} fn Callback function passed to {@link utils.findIndex}. * @since 3.0.0 @@ -1425,14 +1425,14 @@ var utils = { * specified in `keys`. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John', $hashKey: 1214910 } + * import { utils } from 'js-data'; + * const a = { name: 'John', $hashKey: 1214910 }; * - * let b = utils.omit(a, ['$hashKey']) - * console.log(b) // { name: 'John' } + * let b = utils.omit(a, ['$hashKey']); + * console.log(b); // { name: 'John' } * * @method utils.omit - * @param {Object} props The object to copy. + * @param {object} props The object to copy. * @param {string[]} keys Array of strings, representing properties to skip. * @returns {Object} Shallow copy of `props`, minus `keys`. * @since 3.0.0 @@ -1453,14 +1453,14 @@ var utils = { * properties specified in `keys`. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John', $hashKey: 1214910 } + * import { utils } from 'js-data'; + * const a = { name: 'John', $hashKey: 1214910 }; * - * let b = utils.pick(a, ['$hashKey']) - * console.log(b) // { $hashKey: 1214910 } + * let b = utils.pick(a, ['$hashKey']); + * console.log(b); // { $hashKey: 1214910 } * * @method utils.pick - * @param {Object} props The object to copy. + * @param {object} props The object to copy. * @param {string[]} keys Array of strings, representing properties to keep. * @returns {Object} Shallow copy of `props`, but only including `keys`. * @since 3.0.0 @@ -1477,10 +1477,10 @@ var utils = { * Return a plain copy of the given value. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John' } - * let b = utils.plainCopy(a) - * console.log(a === b) // false + * import { utils } from 'js-data'; + * const a = { name: 'John' }; + * let b = utils.plainCopy(a); + * console.log(a === b); // false * * @method utils.plainCopy * @param {*} value The value to copy. @@ -1497,13 +1497,13 @@ var utils = { * Shortcut for `utils.Promise.reject(value)`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * utils.reject("Testing static reject").then(function(data) { + * utils.reject("Testing static reject").then(function (data) { * // not called - * }).catch(function(reason) { + * }).catch(function (reason) { * console.log(reason); // "Testing static reject" - * }) + * }); * * @method utils.reject * @param {*} [value] Value with which to reject the Promise. @@ -1520,14 +1520,14 @@ var utils = { * Remove the last item found in array according to the given checker function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const colors = ['red', 'green', 'yellow', 'red'] - * utils.remove(colors, (color) => color === 'red') - * console.log(colors) // ['red', 'green', 'yellow'] + * const colors = ['red', 'green', 'yellow', 'red']; + * utils.remove(colors, (color) => color === 'red'); + * console.log(colors); // ['red', 'green', 'yellow'] * * @method utils.remove - * @param {Array} array The array to search. + * @param {array} array The array to search. * @param {Function} fn Checker function. */ remove: function remove(array, fn) { @@ -1545,13 +1545,13 @@ var utils = { * Shortcut for `utils.Promise.resolve(value)`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * utils.resolve("Testing static resolve").then(function(data) { + * utils.resolve("Testing static resolve").then(function (data) { * console.log(data); // "Testing static resolve" - * }).catch(function(reason) { + * }).catch(function (reason) { * // not called - * }) + * }); * * @param {*} [value] Value with which to resolve the Promise. * @returns {Promise} Promise resolved with `value`. @@ -1567,7 +1567,7 @@ var utils = { * Set the value at the provided key or path. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const john = { * name: 'John', @@ -1576,27 +1576,27 @@ var utils = { * name: 'John's Mom', * age: 50 * } - * } + * }; * // set value by key - * utils.set(john, 'id', 98) - * console.log(john.id) // 98 + * utils.set(john, 'id', 98); + * console.log(john.id); // 98 * * // set value by path - * utils.set(john, 'parent.id', 20) - * console.log(john.parent.id) // 20 + * utils.set(john, 'parent.id', 20); + * console.log(john.parent.id); // 20 * * // set value by path/value map * utils.set(john, { * 'id': 1098, * 'parent': { id: 1020 }, * 'parent.age': '55' - * }) - * console.log(john.id) // 1098 - * console.log(john.parent.id) // 1020 - * console.log(john.parent.age) // 55 + * }); + * console.log(john.id); // 1098 + * console.log(john.parent.id); // 1020 + * console.log(john.parent.age); // 55 * * @method utils.set - * @param {Object} object The object on which to set a property. + * @param {object} object The object on which to set a property. * @param {(string|Object)} path The key or path to the property. Can also * pass in an object of path/value pairs, which will all be set on the target * object. @@ -1621,7 +1621,7 @@ var utils = { * Check whether the two provided objects are deeply equal. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const objA = { * name: 'John', @@ -1630,7 +1630,7 @@ var utils = { * item: 'item 1', * colors: ['red', 'green', 'blue'] * } - * } + * }; * * const objB = { * name: 'John', @@ -1639,15 +1639,15 @@ var utils = { * item: 'item 1', * colors: ['red', 'green', 'blue'] * } - * } + * }; * - * console.log(utils.deepEqual(a,b)) // true - * objB.nested.colors.add('yellow') // make a change to a nested object's array - * console.log(utils.deepEqual(a,b)) // false + * console.log(utils.deepEqual(a,b)); // true + * objB.nested.colors.add('yellow'); // make a change to a nested object's array + * console.log(utils.deepEqual(a,b)); // false * * @method utils.deepEqual - * @param {Object} a First object in the comparison. - * @param {Object} b Second object in the comparison. + * @param {object} a First object in the comparison. + * @param {object} b Second object in the comparison. * @returns {boolean} Whether the two provided objects are deeply equal. * @see utils.equal * @since 3.0.0 @@ -1693,11 +1693,11 @@ var utils = { * Proxy for `JSON.stringify`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const a = { name: 'John' } - * let jsonVal = utils.toJson(a) - * console.log(jsonVal) // '{"name" : "John"}' + * const a = { name: 'John' }; + * let jsonVal = utils.toJson(a); + * console.log(jsonVal); // '{"name" : "John"}' * * @method utils.toJson * @param {*} value Value to serialize to JSON. @@ -1711,7 +1711,7 @@ var utils = { * Unset the value at the provided key or path. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const john = { * name: 'John', @@ -1720,16 +1720,16 @@ var utils = { * name: 'John's Mom', * age: 50 * } - * } + * }; * - * utils.unset(john, age) - * utils.unset(john, parent.age) + * utils.unset(john, age); + * utils.unset(john, parent.age); * - * console.log(john.age) // null - * console.log(john.parent.age) // null + * console.log(john.age); // null + * console.log(john.parent.age); // null * * @method utils.unset - * @param {Object} object The object from which to delete the property. + * @param {object} object The object from which to delete the property. * @param {string} path The key or path to the property. * @see utils.set * @since 3.0.0 @@ -1841,52 +1841,51 @@ function Settable() { * Create a subclass of this Settable: * * @example Settable.extend - * // Normally you would do: import {Settable} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Settable} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Settable } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSettableClass extends Settable { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSettable = new CustomSettableClass() - * console.log(customSettable.foo()) - * console.log(CustomSettableClass.beep()) + * const customSettable = new CustomSettableClass(); + * console.log(customSettable.foo()); + * console.log(CustomSettableClass.beep()); * * // Extend the class using alternate method. * const OtherSettableClass = Settable.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherSettable = new OtherSettableClass() - * console.log(otherSettable.foo()) - * console.log(OtherSettableClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherSettable = new OtherSettableClass(); + * console.log(otherSettable.foo()); + * console.log(OtherSettableClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSettableClass () { - * Settable.call(this) - * this.created_at = new Date().getTime() + * Settable.call(this); + * this.created_at = new Date().getTime(); * } * Settable.extend({ * constructor: AnotherSettableClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherSettable = new AnotherSettableClass() - * console.log(anotherSettable.created_at) - * console.log(anotherSettable.foo()) - * console.log(AnotherSettableClass.beep()) + * const anotherSettable = new AnotherSettableClass(); + * console.log(anotherSettable.created_at); + * console.log(anotherSettable.foo()); + * console.log(AnotherSettableClass.beep()); * * @method Settable.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Settable class. * @since 3.0.0 */ @@ -1907,7 +1906,7 @@ Settable.extend = utils.extend; * ``` * * @class Component - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @returns {Component} A new {@link Component} instance. * @since 3.0.0 @@ -1922,16 +1921,15 @@ function Component(opts) { * functionality. * * @example Component#debug - * // Normally you would do: import {Component} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Component} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Component } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const component = new Component() - * component.log('debug', 'some message') // nothing gets logged + * const component = new Component(); + * component.log('debug', 'some message'); // nothing gets logged * // Display debug logs: - * component.debug = true - * component.log('debug', 'other message') // this DOES get logged + * component.debug = true; + * component.log('debug', 'other message'); // this DOES get logged * * @default false * @name Component#debug @@ -1961,52 +1959,51 @@ var Component$1 = Settable.extend({ * Create a subclass of this Component: * * @example Component.extend - * // Normally you would do: import {Component} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Component} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Component } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomComponentClass extends Component { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customComponent = new CustomComponentClass() - * console.log(customComponent.foo()) - * console.log(CustomComponentClass.beep()) + * const customComponent = new CustomComponentClass(); + * console.log(customComponent.foo()); + * console.log(CustomComponentClass.beep()); * * // Extend the class using alternate method. * const OtherComponentClass = Component.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherComponent = new OtherComponentClass() - * console.log(otherComponent.foo()) - * console.log(OtherComponentClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherComponent = new OtherComponentClass(); + * console.log(otherComponent.foo()); + * console.log(OtherComponentClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherComponentClass () { - * Component.call(this) - * this.created_at = new Date().getTime() + * Component.call(this); + * this.created_at = new Date().getTime(); * } * Component.extend({ * constructor: AnotherComponentClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherComponent = new AnotherComponentClass() - * console.log(anotherComponent.created_at) - * console.log(anotherComponent.foo()) - * console.log(AnotherComponentClass.beep()) + * const anotherComponent = new AnotherComponentClass(); + * console.log(anotherComponent.created_at); + * console.log(anotherComponent.foo()); + * console.log(AnotherComponentClass.beep()); * * @method Component.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Component class. * @since 3.0.0 */ @@ -2041,26 +2038,26 @@ utils.logify(Component.prototype); * @example * // Listen for all "afterCreate" events in a DataStore * store.on('afterCreate', (mapperName, props, opts, result) => { - * console.log(mapperName) // "post" - * console.log(props.id) // undefined - * console.log(result.id) // 1234 - * }) + * console.log(mapperName); // "post" + * console.log(props.id); // undefined + * console.log(result.id); // 1234 + * }); * store.create('post', { title: 'Modeling your data' }).then((post) => { - * console.log(post.id) // 1234 - * }) + * console.log(post.id); // 1234 + * }); * * @example * // Listen for the "add" event on a collection * collection.on('add', (records) => { - * console.log(records) // [...] - * }) + * console.log(records); // [...] + * }); * * @example * // Listen for "change" events on a record * post.on('change', (record, changes) => { - * console.log(changes) // { changed: { title: 'Modeling your data' } } - * }) - * post.title = 'Modeling your data' + * console.log(changes); // { changed: { title: 'Modeling your data' } } + * }); + * post.title = 'Modeling your data'; * * @method Component#on * @param {string} event Name of event to subsribe to. @@ -2075,15 +2072,15 @@ utils.logify(Component.prototype); * * @example * // Remove a particular listener for a particular event - * collection.off('add', handler) + * collection.off('add', handler); * * @example * // Remove all listeners for a particular event - * record.off('change') + * record.off('change'); * * @example * // Remove all listeners to all events - * store.off() + * store.off(); * * @method Component#off * @param {string} [event] Name of event to unsubsribe to. @@ -2094,21 +2091,21 @@ utils.logify(Component.prototype); * Trigger an event on this Component. * * @example Component#emit - * // import {Collection, DataStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, DataStore} = JSData + * // import { Collection, DataStore } from 'js-data'; + * const JSData = require('js-data'); + * const { Collection, DataStore } = JSData; * - * const collection = new Collection() + * const collection = new Collection(); * collection.on('foo', function (msg) { - * console.log(msg) - * }) - * collection.emit('foo', 'bar') + * console.log(msg); + * }); + * collection.emit('foo', 'bar'); * - * const store = new DataStore() + * const store = new DataStore(); * store.on('beep', function (msg) { - * console.log(msg) - * }) - * store.emit('beep', 'boop') + * console.log(msg); + * }); + * store.emit('beep', 'boop'); * * @method Component#emit * @param {string} event Name of event to emit. @@ -2148,12 +2145,16 @@ var escape = function escape(pattern) { * shouldn't have to create them yourself. Just use {@link Collection#query}. * * ```javascript - * import {Query} from 'js-data' + * import { Query } from 'js-data'; * ``` * - * @example - * const store = new JSData.DataStore() - * store.defineMapper('post') + * @example Query intro + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, @@ -2161,9 +2162,9 @@ var escape = function escape(pattern) { * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } * ] - * store.add('post', posts) - * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run() - * console.log(drafts) + * store.add('post', posts); + * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run(); + * console.log(drafts); * * @class Query * @extends Component @@ -2280,37 +2281,51 @@ var Query$1 = Component$1.extend({ * Find all entities between two boundaries. * * @example Get the users ages 18 to 30. - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const filteredUsers = store.query('user').between(18, 30, { index: 'age' }).run() - * console.log(filteredUsers) + * ]; + * store.add('user', users) + * const filteredUsers = store + * .query('user') + * .between(18, 30, { index: 'age' }) + * .run(); + * console.log(filteredUsers); * * @example Same as above. - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const filteredUsers = store.query('user').between([18], [30], { index: 'age' }).run() - * console.log(filteredUsers) + * ]; + * store.add('user', users) + * const filteredUsers = store + * .query('user') + * .between([18], [30], { index: 'age' }) + * .run(); + * console.log(filteredUsers); * * @method Query#between - * @param {Array} leftKeys Keys defining the left boundary. - * @param {Array} rightKeys Keys defining the right boundary. - * @param {Object} [opts] Configuration options. + * @param {array} leftKeys Keys defining the left boundary. + * @param {array} rightKeys Keys defining the right boundary. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @param {boolean} [opts.leftInclusive=true] Whether to include entities @@ -2336,7 +2351,7 @@ var Query$1 = Component$1.extend({ * The comparison function used by the {@link Query} class. * * @method Query#compare - * @param {Array} orderBy An orderBy clause used for sorting and sub-sorting. + * @param {array} orderBy An orderBy clause used for sorting and sub-sorting. * @param {number} index The index of the current orderBy clause being used. * @param {*} a The first item in the comparison. * @param {*} b The second item in the comparison. @@ -2407,7 +2422,11 @@ var Query$1 = Component$1.extend({ * the provided filter function. * * @example Get the draft posts by authors younger than 30 - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, @@ -2420,24 +2439,29 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, status: 'draft', id: 8 }, * { author: 'Jim', age: 27, status: 'published', id: 9 }, * { author: 'Jason', age: 55, status: 'published', id: 10 } - * ] - * store.add('post', posts) - * let results = store.query('post').filter({ - * where: { - * status: { - * '==': 'draft' - * }, - * age: { - * '<': 30 + * ]; + * store.add('post', posts); + * const results = store + * .query('post') + * .filter({ + * where: { + * status: { + * '==': 'draft' + * }, + * age: { + * '<': 30 + * } * } - * } - * }).run() - * console.log(results) + * }) + * .run(); + * console.log(results); * * @example Use a custom filter function - * const posts = query.filter(function (post) { - * return post.isReady() - * }).run() + * const posts = query + * .filter(function (post) { + * return post.isReady(); + * }) + * .run(); * * @method Query#filter * @param {(Object|Function)} [queryOrFn={}] Selection query or filter @@ -2456,24 +2480,36 @@ var Query$1 = Component$1.extend({ * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax * * @example Empty "findAll" query - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * store.findAll('post').then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @example Empty "filter" query - * const store = new JSData.DataStore() - * store.defineMapper('post') - * const posts = store.filter('post') - * console.log(posts) // [...] + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * const posts = store.filter('post'); + * console.log(posts); // [...] * * @example Complex "filter" query - * const PAGE_SIZE = 2 - * let currentPage = 3 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * const PAGE_SIZE = 2; + * let currentPage = 3; + * + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, @@ -2485,11 +2521,11 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, status: 'draft', id: 8 }, * { author: 'Jim', age: 27, status: 'published', id: 9 }, * { author: 'Jason', age: 55, status: 'published', id: 10 } - * ] - * store.add('post', posts) + * ]; + * store.add('post', posts); * // Retrieve a filtered page of blog posts * // Would typically replace filter with findAll - * store.filter('post', { + * const results = store.filter('post', { * where: { * status: { * // WHERE status = 'published' @@ -2512,7 +2548,8 @@ var Query$1 = Component$1.extend({ * limit: PAGE_SIZE, * // SKIP 4 * offset: PAGE_SIZE * (currentPage - 1) - * }) + * }); + * console.log(results); * * @namespace query * @property {number} [limit] See {@link query.limit}. @@ -2534,7 +2571,11 @@ var Query$1 = Component$1.extend({ * from the result. * * @example Return posts where author is at least 32 years old - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 5 }, @@ -2542,16 +2583,16 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, id: 7 }, * { author: 'Adam', age: 33, id: 8 }, * { author: 'Adam', age: 33, id: 9 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * where: { * age: { * '>=': 30 * } * } - * }) - * console.log(results) + * }); + * console.log(results); * * @name query.where * @type {Object} @@ -2597,7 +2638,11 @@ var Query$1 = Component$1.extend({ * Determines how records should be ordered in the result. * * @example Order posts by `author` then by `id` descending - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 5 }, @@ -2605,12 +2650,12 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, id: 7 }, * { author: 'Adam', age: 33, id: 8 }, * { author: 'Adam', age: 33, id: 9 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * orderBy:[['author','ASC'],['id','DESC']] - * }) - * console.log(results) + * }); + * console.log(results); * * @name query.orderBy * @type {string|Array[]} @@ -2633,18 +2678,29 @@ var Query$1 = Component$1.extend({ * Number of records to skip. * * @example Retrieve the first "page" of blog posts using findAll - * const PAGE_SIZE = 10 - * let currentPage = 1 - * PostMapper.findAll({ + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * const PAGE_SIZE = 10; + * let currentPage = 1; + * store.findAll('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) + * }); * * @example Retrieve the last "page" of blog posts using filter - * const PAGE_SIZE = 5 - * let currentPage = 2 - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * + * const PAGE_SIZE = 5; + * let currentPage = 2; + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, id: 1 }, * { author: 'Sally', age: 31, id: 2 }, @@ -2656,13 +2712,12 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, id: 8 }, * { author: 'Jim', age: 27, id: 9 }, * { author: 'Jason', age: 55, id: 10 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) - * + * }); * console.log(results) * * @name query.offset @@ -2680,17 +2735,29 @@ var Query$1 = Component$1.extend({ * Maximum number of records to retrieve. * * @example Retrieve the first "page" of blog posts using findAll + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * * const PAGE_SIZE = 10 * let currentPage = 1 - * PostMapper.findAll({ + * store.findAll('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) + * }); * * @example Retrieve the last "page" of blog posts using filter + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * * const PAGE_SIZE = 5 * let currentPage = 2 - * const store = new JSData.DataStore() * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 1 }, @@ -2703,14 +2770,14 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, id: 8 }, * { author: 'Jim', age: 27, id: 9 }, * { author: 'Jason', age: 55, id: 10 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) - * + * }); * console.log(results) + * * @name query.limit * @type {number} * @see http://www.js-data.io/v3.0/docs/query-syntax @@ -2745,26 +2812,26 @@ var Query$1 = Component$1.extend({ * Find the entity or entities that match the provided key. * * @example Get the entity whose primary key is 25. - * const entities = query.get(25).run() + * const entities = query.get(25).run(); * * @example Same as above. - * const entities = query.get([25]).run() + * const entities = query.get([25]).run(); * * @example Get all users who are active and have the "admin" role. * const activeAdmins = query.get(['active', 'admin'], { * index: 'activityAndRoles' - * }).run() + * }).run(); * * @example Get all entities that match a certain weather condition. * const niceDays = query.get(['sunny', 'humid', 'calm'], { * index: 'weatherConditions' - * }).run() + * }).run(); * * @method Query#get - * @param {Array} keyList Key(s) defining the entity to retrieve. If + * @param {array} keyList Key(s) defining the entity to retrieve. If * `keyList` is not an array (i.e. for a single-value key), it will be * wrapped in an array. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.string] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Query} A reference to itself for chaining. @@ -2792,16 +2859,16 @@ var Query$1 = Component$1.extend({ * Find the entity or entities that match the provided keyLists. * * @example Get the posts where "status" is "draft" or "inReview". - * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run() + * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run(); * * @example Same as above. - * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run() + * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run(); * * @method Query#getAll * @param {...Array} [keyList] Provide one or more keyLists, and all * entities matching each keyList will be retrieved. If no keyLists are * provided, all entities will be returned. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Query} A reference to itself for chaining. @@ -2870,18 +2937,18 @@ var Query$1 = Component$1.extend({ * Limit the result. * * @example Get only the first 2 posts. - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new JSData.DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, * { author: 'Mike', age: 32, status: 'draft', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } - * ] - * store.add('post', posts) - * const results = store.query('post').limit(2).run() - * console.log(results) + * ]; + * store.add('post', posts); + * const results = store.query('post').limit(2).run(); + * console.log(results); * * @method Query#limit * @param {number} num The maximum number of entities to keep in the result. @@ -2902,21 +2969,27 @@ var Query$1 = Component$1.extend({ * Apply a mapping function to the result data. * * @example - * // Return the age of all users - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const ages = store.query('user').map((user) => { - * return user.age - * }).run() - * console.log(ages) + * ]; + * store.add('user', users); + * const ages = store + * .query('user') + * .map(function (user) { + * return user.age; + * }) + * .run(); + * console.log(ages); * * @method Query#map * @param {Function} mapFn Mapping function. @@ -2935,7 +3008,7 @@ var Query$1 = Component$1.extend({ * collection's main index. * * @example - * const stringAges = UserCollection.query().mapCall('toString').run() + * const stringAges = UserCollection.query().mapCall('toString').run(); * * @method Query#mapCall * @param {string} funcName Name of function to call @@ -2973,18 +3046,22 @@ var Query$1 = Component$1.extend({ * Skip a number of results. * * @example Get all but the first 2 posts. - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, * { author: 'Mike', age: 32, status: 'draft', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } - * ] - * store.add('post', posts) - * const results = store.query('post').skip(2).run() - * console.log(results) + * ]; + * store.add('post', posts); + * const results = store.query('post').skip(2).run(); + * console.log(results); * * @method Query#skip * @param {number} num The number of entities to skip. @@ -3009,29 +3086,33 @@ var Query$1 = Component$1.extend({ * implemented by adapters (for the most part). * * @example Variant 1 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * + * ]; + * store.add('post', posts); * const publishedPosts = store.filter('post', { * status: 'published', * limit: 2 - * }) - * - * console.log(publishedPosts) + * }); + * console.log(publishedPosts); * * * @example Variant 2 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, @@ -3039,9 +3120,8 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * + * ]; + * store.add('post', posts); * const publishedPosts = store.filter('post', { * where: { * status: { @@ -3049,64 +3129,74 @@ var Query$1 = Component$1.extend({ * } * }, * limit: 2 - * }) - * - * console.log(publishedPosts) + * }); + * console.log(publishedPosts); * * @example Variant 3 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * - * const publishedPosts = store.query('post').filter({ - * status: 'published' - * }).limit(2).run() - * - * console.log(publishedPosts) + * ]; + * store.add('post', posts); + * const publishedPosts = store + * .query('post') + * .filter({ status: 'published' }) + * .limit(2) + * .run(); + * console.log(publishedPosts); * * @example Variant 4 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * - * const publishedPosts = store.query('post').filter({ - * where: { - * status: { - * '==': 'published' + * ]; + * store.add('post', posts); + * const publishedPosts = store + * .query('post') + * .filter({ + * where: { + * status: { + * '==': 'published' + * } * } - * } - * }).limit(2).run() - * - * console.log(publishedPosts) + * }) + * .limit(2) + * .run(); + * console.log(publishedPosts); * * @example Multiple operators + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) + * ]; + * store.add('post', posts); * * const myPublishedPosts = store.filter('post', { * where: { @@ -3117,9 +3207,9 @@ var Query$1 = Component$1.extend({ * '==': currentUser.id * } * } - * }) + * }); * - * console.log(myPublishedPosts) + * console.log(myPublishedPosts); * * @name Query.ops * @property {Function} == Equality operator. @@ -3195,52 +3285,51 @@ var Query$1 = Component$1.extend({ /** * Create a subclass of this Query: * @example Query.extend - * // Normally you would do: import {Query} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Query} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Query } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomQueryClass extends Query { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customQuery = new CustomQueryClass() - * console.log(customQuery.foo()) - * console.log(CustomQueryClass.beep()) + * const customQuery = new CustomQueryClass(); + * console.log(customQuery.foo()); + * console.log(CustomQueryClass.beep()); * * // Extend the class using alternate method. * const OtherQueryClass = Query.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherQuery = new OtherQueryClass() - * console.log(otherQuery.foo()) - * console.log(OtherQueryClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherQuery = new OtherQueryClass(); + * console.log(otherQuery.foo()); + * console.log(OtherQueryClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherQueryClass (collection) { - * Query.call(this, collection) - * this.created_at = new Date().getTime() + * Query.call(this, collection); + * this.created_at = new Date().getTime(); * } * Query.extend({ * constructor: AnotherQueryClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherQuery = new AnotherQueryClass() - * console.log(anotherQuery.created_at) - * console.log(anotherQuery.foo()) - * console.log(AnotherQueryClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherQuery = new AnotherQueryClass(); + * console.log(anotherQuery.created_at); + * console.log(anotherQuery.foo()); + * console.log(AnotherQueryClass.beep()); * * @method Query.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Query class. * @since 3.0.0 */ @@ -3630,7 +3719,7 @@ var HasOneRelation = Relation.extend({ * @name module:js-data.belongsTo * @method * @param {Mapper} related The relation the target belongs to. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} opts.foreignKey The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3650,7 +3739,7 @@ var belongsTo = function belongsTo(related, opts) { * @name module:js-data.hasMany * @method * @param {Mapper} related The relation of which the target has many. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} [opts.foreignKey] The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3670,7 +3759,7 @@ var hasMany = function hasMany(related, opts) { * @name module:js-data.hasOne * @method * @param {Mapper} related The relation of which the target has one. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} [opts.foreignKey] The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3717,89 +3806,84 @@ var previousPath = 'previous'; * ``` * * @example Record#constructor - * // Normally you would do: import {Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Record } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Instantiate a plain record - * let record = new Record() - * console.log('record: ' + JSON.stringify(record)) + * let record = new Record(); + * console.log('record: ' + JSON.stringify(record)); * * // You can supply properties on instantiation - * record = new Record({ name: 'John' }) - * console.log('record: ' + JSON.stringify(record)) + * record = new Record({ name: 'John' }); + * console.log('record: ' + JSON.stringify(record)); * * @example Record#constructor2 - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Instantiate a record that's associated with a Mapper: - * const UserMapper = new Mapper({ name: 'user' }) - * const User = UserMapper.recordClass - * const user = UserMapper.createRecord({ name: 'John' }) - * const user2 = new User({ name: 'Sally' }) - * console.log('user: ' + JSON.stringify(user)) - * console.log('user2: ' + JSON.stringify(user2)) + * const UserMapper = new Mapper({ name: 'user' }); + * const User = UserMapper.recordClass; + * const user = UserMapper.createRecord({ name: 'John' }); + * const user2 = new User({ name: 'Sally' }); + * console.log('user: ' + JSON.stringify(user)); + * console.log('user2: ' + JSON.stringify(user2)); * * @example Record#constructor3 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() - * store.defineMapper('user') + * const store = new Container(); + * store.defineMapper('user'); * * // Instantiate a record that's associated with a store's Mapper - * const user = store.createRecord('user', { name: 'John' }) - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user', { name: 'John' }); + * console.log('user: ' + JSON.stringify(user)); * * @example Record#constructor4 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * // Validate on instantiation - * const user = store.createRecord('user', { name: 1234 }) - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user', { name: 1234 }); + * console.log('user: ' + JSON.stringify(user)); * * @example Record#constructor5 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * // Skip validation on instantiation - * const user = store.createRecord('user', { name: 1234 }, { noValidate: true }) - * console.log('user: ' + JSON.stringify(user)) - * console.log('user.isValid(): ' + user.isValid()) + * const user = store.createRecord('user', { name: 1234 }, { noValidate: true }); + * console.log('user: ' + JSON.stringify(user)); + * console.log('user.isValid(): ' + user.isValid()); * * @class Record * @extends Component - * @param {Object} [props] The initial properties of the new Record instance. - * @param {Object} [opts] Configuration options. + * @param {object} [props] The initial properties of the new Record instance. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.noValidate=false] Whether to skip validation on the * initial properties. * @param {boolean} [opts.validateOnSet=true] Whether to enable setter @@ -3860,7 +3944,7 @@ var Record$1 = Component$1.extend({ * * @method Record#afterLoadRelations * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}. - * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}. + * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}. * @since 3.0.0 */ afterLoadRelations: function afterLoadRelations() {}, @@ -3871,7 +3955,7 @@ var Record$1 = Component$1.extend({ * * @method Record#beforeLoadRelations * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}. - * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}. + * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}. * @since 3.0.0 */ beforeLoadRelations: function beforeLoadRelations() {}, @@ -3894,22 +3978,21 @@ var Record$1 = Component$1.extend({ * {@link Record#commit} was called. * * @example Record#changes - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user changes: ' + JSON.stringify(user.changes())) - * user.name = 'John' - * console.log('user changes: ' + JSON.stringify(user.changes())) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user changes: ' + JSON.stringify(user.changes())); + * user.name = 'John'; + * console.log('user changes: ' + JSON.stringify(user.changes())); * * @method Record#changes * @param [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {Object} Object describing the changes to this record since it was * instantiated or its {@link Record#commit} method was last called. * @since 3.0.0 @@ -3925,26 +4008,26 @@ var Record$1 = Component$1.extend({ * previous property values being set to current values. * * @example Record#commit - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user hasChanges: ' + user.hasChanges()) - * user.name = 'John' - * console.log('user hasChanges: ' + user.hasChanges()) - * user.commit() - * console.log('user hasChanges: ' + user.hasChanges()) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user hasChanges: ' + user.hasChanges()); + * user.name = 'John'; + * console.log('user hasChanges: ' + user.hasChanges()); + * user.commit(); + * console.log('user hasChanges: ' + user.hasChanges()); * * @method Record#commit - * @param {Object} [opts] Configuration options. Passed to {@link Record#toJSON}. + * @param {object} [opts] Configuration options. Passed to {@link Record#toJSON}. * @since 3.0.0 */ commit: function commit(opts) { this._set('changed'); // unset + this._set('changing', false); this._set('history', []); // clear history this._set('previous', this.toJSON(opts)); }, @@ -3954,21 +4037,21 @@ var Record$1 = Component$1.extend({ * Call {@link Mapper#destroy} using this record's primary key. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('user') + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('user'); * store.find('user', 1234).then((user) => { - * console.log(user.id) // 1234 + * console.log(user.id); // 1234 * * // Destroy this user from the database - * return user.destroy() - * }) + * return user.destroy(); + * }); * * @method Record#destroy - * @param {Object} [opts] Configuration options passed to {@link Mapper#destroy}. + * @param {object} [opts] Configuration options passed to {@link Mapper#destroy}. * @returns {Promise} The result of calling {@link Mapper#destroy} with the * primary key of this record. * @since 3.0.0 @@ -3984,15 +4067,14 @@ var Record$1 = Component$1.extend({ * Return the value at the given path for this instance. * * @example Record#get - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * - * const user = store.createRecord('user', { name: 'Bob' }) - * console.log('user.get("name"): ' + user.get('name')) + * const user = store.createRecord('user', { name: 'Bob' }); + * console.log('user.get("name"): ' + user.get('name')); * * @method Record#get * @param {string} key Path of value to retrieve. @@ -4009,23 +4091,22 @@ var Record$1 = Component$1.extend({ * {@link Record#commit} was called. * * @example Record#hasChanges - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user hasChanges: ' + user.hasChanges()) - * user.name = 'John' - * console.log('user hasChanges: ' + user.hasChanges()) - * user.commit() - * console.log('user hasChanges: ' + user.hasChanges()) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user hasChanges: ' + user.hasChanges()); + * user.name = 'John'; + * console.log('user hasChanges: ' + user.hasChanges()); + * user.commit(); + * console.log('user hasChanges: ' + user.hasChanges()); * * @method Record#hasChanges * @param [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {boolean} Return whether the record has changed since it was * instantiated or since its {@link Record#commit} method was called. * @since 3.0.0 @@ -4041,18 +4122,17 @@ var Record$1 = Component$1.extend({ * considered "saved". Records without primary keys are considered "unsaved". * * @example Record#isNew - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * id: 1234 - * }) - * const user2 = store.createRecord('user') - * console.log('user isNew: ' + user.isNew()) // false - * console.log('user2 isNew: ' + user2.isNew()) // true + * }); + * const user2 = store.createRecord('user'); + * console.log('user isNew: ' + user.isNew()); // false + * console.log('user2 isNew: ' + user2.isNew()); // true * * @method Record#isNew * @returns {boolean} Whether the record is unsaved. @@ -4067,29 +4147,28 @@ var Record$1 = Component$1.extend({ * Return whether the record in its current state passes validation. * * @example Record#isValid - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * const user = store.createRecord('user', { * name: 1234 * }, { * noValidate: true // this allows us to put the record into an invalid state - * }) - * console.log('user isValid: ' + user.isValid()) - * user.name = 'John' - * console.log('user isValid: ' + user.isValid()) + * }); + * console.log('user isValid: ' + user.isValid()); + * user.name = 'John'; + * console.log('user isValid: ' + user.isValid()); * * @method Record#isValid - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}. * @returns {boolean} Whether the record in its current state passes * validation. * @since 3.0.0 @@ -4144,11 +4223,11 @@ var Record$1 = Component$1.extend({ * loaded. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); * store.defineMapper('user', { * relations: { * hasMany: { @@ -4158,7 +4237,7 @@ var Record$1 = Component$1.extend({ * } * } * } - * }) + * }); * store.defineMapper('post', { * relations: { * belongsTo: { @@ -4168,20 +4247,20 @@ var Record$1 = Component$1.extend({ * } * } * } - * }) + * }); * store.find('user', 1234).then((user) => { - * console.log(user.id) // 1234 + * console.log(user.id); // 1234 * * // Load the user's post relations - * return user.loadRelations(['post']) + * return user.loadRelations(['post']); * }).then((user) => { - * console.log(user.posts) // [{...}, {...}, ...] - * }) + * console.log(user.posts); // [{...}, {...}, ...] + * }); * * @method Record#loadRelations * @param {string[]} [relations] List of relations to load. Can use localField * names or Mapper names to pick relations. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {Promise} Resolves with the record, with the loaded relations now * attached. * @since 3.0.0 @@ -4266,20 +4345,19 @@ var Record$1 = Component$1.extend({ * Return the properties with which this record was instantiated. * * @example Record#previous - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * name: 'William' - * }) - * console.log('user previous: ' + JSON.stringify(user.previous())) - * user.name = 'Bob' - * console.log('user previous: ' + JSON.stringify(user.previous())) - * user.commit() - * console.log('user previous: ' + JSON.stringify(user.previous())) + * }); + * console.log('user previous: ' + JSON.stringify(user.previous())); + * user.name = 'Bob'; + * console.log('user previous: ' + JSON.stringify(user.previous())); + * user.commit(); + * console.log('user previous: ' + JSON.stringify(user.previous())); * * @method Record#previous * @param {string} [key] If specified, return just the initial value of the @@ -4300,23 +4378,22 @@ var Record$1 = Component$1.extend({ * instantiated. * * @example Record#revert - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * name: 'William' - * }) - * console.log('user: ' + JSON.stringify(user)) - * user.name = 'Bob' - * console.log('user: ' + JSON.stringify(user)) - * user.revert() - * console.log('user: ' + JSON.stringify(user)) + * }); + * console.log('user: ' + JSON.stringify(user)); + * user.name = 'Bob'; + * console.log('user: ' + JSON.stringify(user)); + * user.revert(); + * console.log('user: ' + JSON.stringify(user)); * * @method Record#revert - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.preserve] Array of strings or Regular Expressions * denoting properties that should not be reverted. * @since 3.0.0 @@ -4345,31 +4422,31 @@ var Record$1 = Component$1.extend({ * Delegates to {@link Mapper#create} or {@link Mapper#update}. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('session') - * const session = store.createRecord('session', { topic: 'Node.js' }) + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('session'); + * const session = store.createRecord('session', { topic: 'Node.js' }); * * // Create a new record in the database * session.save().then(() => { - * console.log(session.id) // 1234 + * console.log(session.id); // 1234 * - * session.skill_level = 'beginner' + * session.skill_level = 'beginner'; * * // Update the record in the database - * return session.save() - * }) + * return session.save(); + * }); * * @method Record#save - * @param {Object} [opts] Configuration options. See {@link Mapper#create} and + * @param {object} [opts] Configuration options. See {@link Mapper#create} and * {@link Mapper#update}. * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`. * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when * `opts.changesOnly` is `true`. - * @param {Array} [opts.ignore] Passed to {@link Record#changes} when + * @param {array} [opts.ignore] Passed to {@link Record#changes} when * `opts.changesOnly` is `true`. * @returns {Promise} The result of calling {@link Mapper#create} or * {@link Mapper#update}. @@ -4411,27 +4488,26 @@ var Record$1 = Component$1.extend({ * in {@link Mapper#schema}. * * @example Record#set - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * - * const user = store.createRecord('user') - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user'); + * console.log('user: ' + JSON.stringify(user)); * - * user.set('name', 'Bob') - * console.log('user: ' + JSON.stringify(user)) + * user.set('name', 'Bob'); + * console.log('user: ' + JSON.stringify(user)); * - * user.set({ age: 30, role: 'admin' }) - * console.log('user: ' + JSON.stringify(user)) + * user.set({ age: 30, role: 'admin' }); + * console.log('user: ' + JSON.stringify(user)); * * @fires Record#change * @method Record#set * @param {(string|Object)} key Key to set or hash of key-value pairs to set. * @param {*} [value] Value to set for the given key. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.silent=false] Whether to trigger change events. * @since 3.0.0 */ @@ -4456,27 +4532,26 @@ var Record$1 = Component$1.extend({ * be called with this record instead. * * @example Record#toJSON - * // Normally you would do: import { Container } from 'js-data' - * const JSData = require('js-data@3.0.0-rc.8') - * const { Container } = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * const user = store.createRecord('user', { * name: 'John', * $$hashKey: '1234' - * }) - * console.log('user: ' + JSON.stringify(user.toJSON())) + * }); + * console.log('user: ' + JSON.stringify(user.toJSON())); * * @method Record#toJSON - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the representation. Only available as an option if the class * from which this record was created has a Mapper and this record resides in @@ -4503,24 +4578,23 @@ var Record$1 = Component$1.extend({ * that have `track: true` in {@link Mapper#schema}. * * @example Record#unset - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * * const user = store.createRecord('user', { * name: 'John' - * }) - * console.log('user: ' + JSON.stringify(user)) + * }); + * console.log('user: ' + JSON.stringify(user)); * - * user.unset('name') - * console.log('user: ' + JSON.stringify(user)) + * user.unset('name'); + * console.log('user: ' + JSON.stringify(user)); * * @method Record#unset * @param {string} key Key to unset. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.silent=false] Whether to trigger change events. * @since 3.0.0 */ @@ -4533,29 +4607,28 @@ var Record$1 = Component$1.extend({ * Validate this record based on its current properties. * * @example Record#validate - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * const user = store.createRecord('user', { * name: 1234 * }, { * noValidate: true // this allows us to put the record into an invalid state - * }) - * console.log('user validation: ' + JSON.stringify(user.validate())) - * user.name = 'John' - * console.log('user validation: ' + user.validate()) + * }); + * console.log('user validation: ' + JSON.stringify(user.validate())); + * user.name = 'John'; + * console.log('user validation: ' + user.validate()); * * @method Record#validate - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}. * @returns {*} Array of errors or `undefined` if no errors. * @since 3.0.0 */ @@ -4595,11 +4668,11 @@ utils.eventify(Record.prototype, function () { * function onChange (record, changes) { * // do something * } - * record.on('change', onChange) + * record.on('change', onChange); * * @callback Record~changeListener * @param {Record} The Record that changed. - * @param {Object} The changes. + * @param {object} The changes. * @see Record#event:change * @since 3.0.0 */ @@ -4607,52 +4680,51 @@ utils.eventify(Record.prototype, function () { /** * Create a subclass of this Record: * @example Record.extend - * // Normally you would do: import {Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Record } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomRecordClass extends Record { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customRecord = new CustomRecordClass() - * console.log(customRecord.foo()) - * console.log(CustomRecordClass.beep()) + * const customRecord = new CustomRecordClass(); + * console.log(customRecord.foo()); + * console.log(CustomRecordClass.beep()); * * // Extend the class using alternate method. * const OtherRecordClass = Record.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherRecord = new OtherRecordClass() - * console.log(otherRecord.foo()) - * console.log(OtherRecordClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherRecord = new OtherRecordClass(); + * console.log(otherRecord.foo()); + * console.log(OtherRecordClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherRecordClass () { - * Record.call(this) - * this.created_at = new Date().getTime() + * Record.call(this); + * this.created_at = new Date().getTime(); * } * Record.extend({ * constructor: AnotherRecordClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherRecord = new AnotherRecordClass() - * console.log(anotherRecord.created_at) - * console.log(anotherRecord.foo()) - * console.log(AnotherRecordClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherRecord = new AnotherRecordClass(); + * console.log(anotherRecord.created_at); + * console.log(anotherRecord.foo()); + * console.log(AnotherRecordClass.beep()); * * @method Record.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Record class. * @since 3.0.0 */ @@ -5106,21 +5178,21 @@ var COLLECTION_DEFAULTS = { * An ordered set of {@link Record} instances. * * @example Collection#constructor - * // import {Collection, Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Collection, Record } from 'js-data'; + * const JSData = require('js-data'); + * const {Collection, Record} = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const user1 = new Record({ id: 1 }) - * const user2 = new Record({ id: 2 }) - * const UserCollection = new Collection([user1, user2]) - * console.log(UserCollection.get(1) === user1) + * const user1 = new Record({ id: 1 }); + * const user2 = new Record({ id: 2 }); + * const UserCollection = new Collection([user1, user2]); + * console.log(UserCollection.get(1) === user1); * * @class Collection * @extends Component - * @param {Array} [records] Initial set of records to insert into the + * @param {array} [records] Initial set of records to insert into the * collection. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}. * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}. * @param {string} [opts.onConflict="merge"] See {@link Collection#onConflict}. @@ -5150,16 +5222,15 @@ var COLLECTION_DEFAULTS = { * wrap records in {@link Mapper#recordClass}. * * @example Collection#mapper - * // Normally you would do: import {Collection, Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const {Collection, Mapper} = JSData; + * console.log('Using JSData v' + JSData.version.full); * * class MyMapperClass extends Mapper { - * foo () { return 'bar' } + * foo () { return 'bar'; } * } - * const myMapper = new MyMapperClass({ name: 'myMapper' }) - * const collection = new Collection(null, { mapper: myMapper }) + * const myMapper = new MyMapperClass({ name: 'myMapper' }); + * const collection = new Collection(null, { mapper: myMapper }); * * @name Collection#mapper * @type {Mapper} @@ -5251,7 +5322,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#add * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} data The record or records to insert. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}. * @param {boolean} [opts.noValidate] See {@link Record#noValidate}. * @param {string} [opts.onConflict] See {@link Collection#onConflict}. @@ -5358,7 +5429,7 @@ var Collection$1 = Component$1.extend({ * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} result The record or records * that were added to this Collection by {@link Collection#add}. - * @param {Object} opts The `opts` argument passed to {@link Collection#add}. + * @param {object} opts The `opts` argument passed to {@link Collection#add}. */ afterAdd: function afterAdd() {}, @@ -5370,8 +5441,8 @@ var Collection$1 = Component$1.extend({ * @method Collection#afterRemove * @since 3.0.0 * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}. - * @param {Object} opts The `opts` argument passed to {@link Collection#remove}. - * @param {Object} record The result that will be returned by {@link Collection#remove}. + * @param {object} opts The `opts` argument passed to {@link Collection#remove}. + * @param {object} record The result that will be returned by {@link Collection#remove}. */ afterRemove: function afterRemove() {}, @@ -5383,9 +5454,9 @@ var Collection$1 = Component$1.extend({ * * @method Collection#afterRemoveAll * @since 3.0.0 - * @param {Object} query The `query` argument passed to {@link Collection#removeAll}. - * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}. - * @param {Object} records The result that will be returned by {@link Collection#removeAll}. + * @param {object} query The `query` argument passed to {@link Collection#removeAll}. + * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}. + * @param {object} records The result that will be returned by {@link Collection#removeAll}. */ afterRemoveAll: function afterRemoveAll() {}, @@ -5398,7 +5469,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#beforeAdd * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}. - * @param {Object} opts The `opts` argument passed to {@link Collection#add}. + * @param {object} opts The `opts` argument passed to {@link Collection#add}. */ beforeAdd: function beforeAdd() {}, @@ -5409,7 +5480,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#beforeRemove * @since 3.0.0 * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}. - * @param {Object} opts The `opts` argument passed to {@link Collection#remove}. + * @param {object} opts The `opts` argument passed to {@link Collection#remove}. */ beforeRemove: function beforeRemove() {}, @@ -5419,8 +5490,8 @@ var Collection$1 = Component$1.extend({ * * @method Collection#beforeRemoveAll * @since 3.0.0 - * @param {Object} query The `query` argument passed to {@link Collection#removeAll}. - * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}. + * @param {object} query The `query` argument passed to {@link Collection#removeAll}. + * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}. */ beforeRemoveAll: function beforeRemoveAll() {}, @@ -5432,17 +5503,17 @@ var Collection$1 = Component$1.extend({ * * @example * // Get all users ages 18 to 30 - * const users = collection.between(18, 30, { index: 'age' }) + * const users = collection.between(18, 30, { index: 'age' }); * * @example * // Same as above - * const users = collection.between([18], [30], { index: 'age' }) + * const users = collection.between([18], [30], { index: 'age' }); * * @method Collection#between * @since 3.0.0 - * @param {Array} leftKeys Keys defining the left boundary. - * @param {Array} rightKeys Keys defining the right boundary. - * @param {Object} [opts] Configuration options. + * @param {array} leftKeys Keys defining the left boundary. + * @param {array} rightKeys Keys defining the right boundary. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @param {boolean} [opts.leftInclusive=true] Whether to include records @@ -5463,11 +5534,11 @@ var Collection$1 = Component$1.extend({ * * @example * // Index users by age - * collection.createIndex('age') + * collection.createIndex('age'); * * @example * // Index users by status and role - * collection.createIndex('statusAndRole', ['status', 'role']) + * collection.createIndex('statusAndRole', ['status', 'role']); * * @method Collection#createIndex * @since 3.0.0 @@ -5498,14 +5569,13 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()` * * @example Collection#filter - * // Normally you would do: import {Collection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Collection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const collection = new Collection([ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * * // Get the draft posts created less than three months ago * let posts = collection.filter({ @@ -5517,18 +5587,16 @@ var Collection$1 = Component$1.extend({ * '>=': (new Date().getTime() - (1000 \* 60 \* 60 \* 24 \* 30 \* 3)) // 3 months ago * } * } - * }) - * console.log(posts) + * }); + * console.log(posts); * * // Use a custom filter function - * posts = collection.filter(function (post) { - * return post.id % 2 === 0 - * }) + * posts = collection.filter((post) => post.id % 2 === 0); * * @method Collection#filter * @param {(Object|Function)} [queryOrFn={}] Selection query or filter * function. - * @param {Object} [thisArg] Context to which to bind `queryOrFn` if + * @param {object} [thisArg] Context to which to bind `queryOrFn` if * `queryOrFn` is a function. * @returns {Array} The result. * @see query @@ -5545,7 +5613,7 @@ var Collection$1 = Component$1.extend({ * @example * collection.forEach(function (record) { * // do something - * }) + * }); * * @method Collection#forEach * @since 3.0.0 @@ -5579,18 +5647,18 @@ var Collection$1 = Component$1.extend({ * * @example * // Get the posts where "status" is "draft" or "inReview" - * const posts = collection.getAll('draft', 'inReview', { index: 'status' }) + * const posts = collection.getAll('draft', 'inReview', { index: 'status' }); * * @example * // Same as above - * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' }) + * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' }); * * @method Collection#getAll * @since 3.0.0 * @param {...Array} [keyList] Provide one or more keyLists, and all * records matching each keyList will be retrieved. If no keyLists are * provided, all records will be returned. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Array} The result. @@ -5625,7 +5693,7 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().limit(maximumNumber).run()` * * @example - * const posts = collection.limit(10) + * const posts = collection.limit(10); * * @method Collection#limit * @since 3.0.0 @@ -5641,9 +5709,7 @@ var Collection$1 = Component$1.extend({ * Apply a mapping function to all records. * * @example - * const names = collection.map(function (user) { - * return user.name - * }) + * const names = collection.map((user) => user.name); * * @method Collection#map * @since 3.0.0 @@ -5687,7 +5753,7 @@ var Collection$1 = Component$1.extend({ * Return all "unsaved" (not uniquely identifiable) records in this colleciton. * * @method Collection#prune - * @param {Object} [opts] Configuration options, passed to {@link Collection#removeAll}. + * @param {object} [opts] Configuration options, passed to {@link Collection#removeAll}. * @since 3.0.0 * @returns {Array} The removed records, if any. */ @@ -5706,7 +5772,7 @@ var Collection$1 = Component$1.extend({ * .between(18, 30, { index: 'age' }) // between ages 18 and 30 * .skip(10) // second page * .limit(10) // page size - * .run() + * .run(); * * @method Collection#query * @since 3.0.0 @@ -5741,9 +5807,9 @@ var Collection$1 = Component$1.extend({ * Reduce the data in the collection to a single value and return the result. * * @example - * const totalVotes = collection.reduce(function (prev, record) { - * return prev + record.upVotes + record.downVotes - * }, 0) + * const totalVotes = collection.reduce((prev, record) => { + * return prev + record.upVotes + record.downVotes; + * }, 0); * * @method Collection#reduce * @since 3.0.0 @@ -5764,7 +5830,7 @@ var Collection$1 = Component$1.extend({ * @since 3.0.0 * @param {(string|number|object|Record)} idOrRecord The primary key of the * record to be removed, or a reference to the record that is to be removed. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {Object|Record} The removed record, if any. */ remove: function remove(idOrRecord, opts) { @@ -5799,11 +5865,11 @@ var Collection$1 = Component$1.extend({ * @method Collection#removeAll * @since 3.0.0 * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}. - * @param {Object} [queryOrRecords.where] See {@link query.where}. + * @param {object} [queryOrRecords.where] See {@link query.where}. * @param {number} [queryOrRecords.offset] See {@link query.offset}. * @param {number} [queryOrRecords.limit] See {@link query.limit}. * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {(Object[]|Record[])} The removed records, if any. */ removeAll: function removeAll(queryOrRecords, opts) { @@ -5835,7 +5901,7 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().skip(numberToSkip).run()` * * @example - * const posts = collection.skip(10) + * const posts = collection.skip(10); * * @method Collection#skip * @since 3.0.0 @@ -5853,7 +5919,7 @@ var Collection$1 = Component$1.extend({ * * @method Collection#toJSON * @since 3.0.0 - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the representation. * @returns {Array} The records. @@ -5882,8 +5948,8 @@ var Collection$1 = Component$1.extend({ * * @method Collection#updateIndex * @since 3.0.0 - * @param {Object} record The record to update. - * @param {Object} [opts] Configuration options. + * @param {object} record The record to update. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] The index in which to update the record's * position. If you don't specify an index then the record will be updated * in the main index. @@ -5900,7 +5966,7 @@ var Collection$1 = Component$1.extend({ * * @method Collection#updateIndexes * @since 3.0.0 - * @param {Object} record TODO + * @param {object} record TODO */ updateIndexes: function updateIndexes(record) { this.index.updateRecord(record); @@ -5925,11 +5991,11 @@ var Collection$1 = Component$1.extend({ * function onChange (record, changes) { * // do something * } - * collection.on('change', onChange) + * collection.on('change', onChange); * * @callback Collection~changeListener * @param {Record} The Record that changed. - * @param {Object} The changes. + * @param {object} The changes. * @see Collection#event:change * @since 3.0.0 */ @@ -5951,7 +6017,7 @@ var Collection$1 = Component$1.extend({ * function onAdd (recordOrRecords) { * // do something * } - * collection.on('add', onAdd) + * collection.on('add', onAdd); * * @callback Collection~addListener * @param {Record|Record[]} The Record or Records that were added. @@ -5978,7 +6044,7 @@ var Collection$1 = Component$1.extend({ * function onRemove (recordsOrRecords) { * // do something * } - * collection.on('remove', onRemove) + * collection.on('remove', onRemove); * * @callback Collection~removeListener * @param {Record|Record[]} Record or Records that were removed. @@ -5991,52 +6057,51 @@ var Collection$1 = Component$1.extend({ /** * Create a subclass of this Collection: * @example Collection.extend - * // Normally you would do: import {Collection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Collection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomCollectionClass extends Collection { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customCollection = new CustomCollectionClass() - * console.log(customCollection.foo()) - * console.log(CustomCollectionClass.beep()) + * const customCollection = new CustomCollectionClass(); + * console.log(customCollection.foo()); + * console.log(CustomCollectionClass.beep()); * * // Extend the class using alternate method. * const OtherCollectionClass = Collection.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherCollection = new OtherCollectionClass() - * console.log(otherCollection.foo()) - * console.log(OtherCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherCollection = new OtherCollectionClass(); + * console.log(otherCollection.foo()); + * console.log(OtherCollectionClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherCollectionClass () { - * Collection.call(this) - * this.created_at = new Date().getTime() + * Collection.call(this); + * this.created_at = new Date().getTime(); * } * Collection.extend({ * constructor: AnotherCollectionClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherCollection = new AnotherCollectionClass() - * console.log(anotherCollection.created_at) - * console.log(anotherCollection.foo()) - * console.log(AnotherCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherCollection = new AnotherCollectionClass(); + * console.log(anotherCollection.created_at); + * console.log(anotherCollection.foo()); + * console.log(AnotherCollectionClass.beep()); * * @method Collection.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Collection class. * @since 3.0.0 */ @@ -6882,7 +6947,7 @@ var typeGroupValidators = { * @method * @param {*} value Array to be validated. * @param {object} schema Schema containing at least one array keyword. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ array: function array(value, schema, opts) { @@ -6898,8 +6963,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.integer * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `integer` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `integer` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ integer: function integer(value, schema, opts) { @@ -6916,8 +6981,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.number * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `number` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `number` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ number: function number(value, schema, opts) { @@ -6936,8 +7001,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.numeric * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `numeric` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `numeric` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ numeric: function numeric(value, schema, opts) { @@ -6955,8 +7020,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.object * @method * @param {*} value Object to be validated. - * @param {Object} schema Schema containing at least one `object` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `object` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ object: function object(value, schema, opts) { @@ -6974,8 +7039,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.string * @method * @param {*} value String to be validated. - * @param {Object} schema Schema containing at least one `string` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `string` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ string: function string(value, schema, opts) { @@ -6986,18 +7051,17 @@ var typeGroupValidators = { * js-data's Schema class. * * @example Schema#constructor - * // Normally you would do: import {Schema} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Schema} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Schema } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const PostSchema = new Schema({ * type: 'object', * properties: { * title: { type: 'string' } * } - * }) - * PostSchema.validate({ title: 1234 }) + * }); + * PostSchema.validate({ title: 1234 }); * * @class Schema * @extends Component @@ -7318,45 +7382,44 @@ var Schema$1 = Component$1.extend({ /** * Create a subclass of this Schema: * @example Schema.extend - * // Normally you would do: import {Schema} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Schema} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Schema } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSchemaClass extends Schema { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSchema = new CustomSchemaClass() - * console.log(customSchema.foo()) - * console.log(CustomSchemaClass.beep()) + * const customSchema = new CustomSchemaClass(); + * console.log(customSchema.foo()); + * console.log(CustomSchemaClass.beep()); * * // Extend the class using alternate method. * const OtherSchemaClass = Schema.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherSchema = new OtherSchemaClass() - * console.log(otherSchema.foo()) - * console.log(OtherSchemaClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherSchema = new OtherSchemaClass(); + * console.log(otherSchema.foo()); + * console.log(OtherSchemaClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSchemaClass () { - * Schema.call(this) - * this.created_at = new Date().getTime() + * Schema.call(this); + * this.created_at = new Date().getTime(); * } * Schema.extend({ * constructor: AnotherSchemaClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherSchema = new AnotherSchemaClass() - * console.log(anotherSchema.created_at) - * console.log(anotherSchema.foo()) - * console.log(AnotherSchemaClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherSchema = new AnotherSchemaClass(); + * console.log(anotherSchema.created_at); + * console.log(anotherSchema.foo()); + * console.log(AnotherSchemaClass.beep()); * * @method Schema.extend * @param {object} [props={}] Properties to add to the prototype of the @@ -7633,23 +7696,23 @@ var MAPPER_DEFAULTS = { * [book]: http://martinfowler.com/books/eaa.html * [record]: Record.html * // Import and instantiate - * import {Mapper} from 'js-data' - * const UserMapper = new Mapper({ name: 'user' }) + * import { Mapper } from 'js-data'; + * const UserMapper = new Mapper({ name: 'user' }); * * @example * // Define a Mapper using the Container component - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); * * @class Mapper * @extends Component - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}. * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}. - * @param {Object} [opts.methods] See {@link Mapper#methods}. + * @param {object} [opts.methods] See {@link Mapper#methods}. * @param {string} opts.name See {@link Mapper#name}. * @param {boolean} [opts.notify] See {@link Mapper#notify}. * @param {boolean} [opts.raw=false] See {@link Mapper#raw}. @@ -7702,46 +7765,46 @@ var MAPPER_DEFAULTS = { * * @example * // Use POJOs only. - * import {Mapper, Record} from 'js-data' - * const UserMapper = new Mapper({ recordClass: false }) - * UserMapper.recordClass // false - * const user = UserMapper#createRecord() - * user instanceof Record // false + * import { Mapper, Record } from 'js-data'; + * const UserMapper = new Mapper({ recordClass: false }); + * UserMapper.recordClass // false; + * const user = UserMapper.createRecord(); + * user instanceof Record; // false * * @example * // Set to a custom class to have records wrapped in your custom class. - * import {Mapper, Record} from 'js-data' + * import { Mapper, Record } from 'js-data'; * // Custom class * class User { * constructor (props = {}) { * for (var key in props) { * if (props.hasOwnProperty(key)) { - * this[key] = props[key] + * this[key] = props[key]; * } * } * } * } - * const UserMapper = new Mapper({ recordClass: User }) - * UserMapper.recordClass // function User() {} - * const user = UserMapper#createRecord() - * user instanceof Record // false - * user instanceof User // true + * const UserMapper = new Mapper({ recordClass: User }); + * UserMapper.recordClass; // function User() {} + * const user = UserMapper.createRecord(); + * user instanceof Record; // false + * user instanceof User; // true * * * @example * // Extend the {@link Record} class. - * import {Mapper, Record} from 'js-data' + * import { Mapper, Record } from 'js-data'; * // Custom class * class User extends Record { * constructor () { - * super(props) + * super(props); * } * } - * const UserMapper = new Mapper({ recordClass: User }) - * UserMapper.recordClass // function User() {} - * const user = UserMapper#createRecord() - * user instanceof Record // true - * user instanceof User // true + * const UserMapper = new Mapper({ recordClass: User }); + * UserMapper.recordClass; // function User() {} + * const user = UserMapper.createRecord(); + * user instanceof Record; // true + * user instanceof User; // true * * @name Mapper#recordClass * @default {@link Record} @@ -7757,10 +7820,9 @@ var MAPPER_DEFAULTS = { * This Mapper's {@link Schema}. * * @example Mapper#schema - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const UserMapper = new Mapper({ * name: 'user', @@ -7774,19 +7836,19 @@ var MAPPER_DEFAULTS = { * is_active: { type: 'number' } * } * } - * }) + * }); * const user = UserMapper.createRecord({ * id: 1, * name: 'John', * role: 'admin' - * }) + * }); * user.on('change', function (user, changes) { - * console.log(changes) - * }) + * console.log(changes); + * }); * user.on('change:role', function (user, value) { - * console.log('change:role - ' + value) - * }) - * user.role = 'owner' + * console.log('change:role - ' + value); + * }); + * user.role = 'owner'; * * @name Mapper#schema * @see Schema @@ -7870,8 +7932,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCount - * @param {Object} query The `query` argument passed to {@link Mapper#count}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#count}. + * @param {object} query The `query` argument passed to {@link Mapper#count}. + * @param {object} opts The `opts` argument passed to {@link Mapper#count}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7883,8 +7945,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCreate - * @param {Object} props The `props` argument passed to {@link Mapper#create}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#create}. + * @param {object} props The `props` argument passed to {@link Mapper#create}. + * @param {object} opts The `opts` argument passed to {@link Mapper#create}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7896,8 +7958,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCreateMany - * @param {Array} records The `records` argument passed to {@link Mapper#createMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}. + * @param {array} records The `records` argument passed to {@link Mapper#createMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7910,7 +7972,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#afterDestroy * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7924,7 +7986,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#afterDestroyAll * @param {*} data The `data` returned by the adapter. * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7937,7 +7999,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#afterFind * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#find}. + * @param {object} opts The `opts` argument passed to {@link Mapper#find}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7949,8 +8011,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterFindAll - * @param {Object} query The `query` argument passed to {@link Mapper#findAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}. + * @param {object} query The `query` argument passed to {@link Mapper#findAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7962,8 +8024,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterSum - * @param {Object} query The `query` argument passed to {@link Mapper#sum}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}. + * @param {object} query The `query` argument passed to {@link Mapper#sum}. + * @param {object} opts The `opts` argument passed to {@link Mapper#sum}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7977,7 +8039,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#afterUpdate * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}. * @param {props} props The `props` argument passed to {@link Mapper#update}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#update}. + * @param {object} opts The `opts` argument passed to {@link Mapper#update}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7989,9 +8051,9 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterUpdateAll - * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}. - * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}. + * @param {object} props The `props` argument passed to {@link Mapper#updateAll}. + * @param {object} query The `query` argument passed to {@link Mapper#updateAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -8003,8 +8065,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterUpdateMany - * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}. + * @param {array} records The `records` argument passed to {@link Mapper#updateMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -8016,8 +8078,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCreate - * @param {Object} props The `props` argument passed to {@link Mapper#create}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#create}. + * @param {object} props The `props` argument passed to {@link Mapper#create}. + * @param {object} opts The `opts` argument passed to {@link Mapper#create}. * @since 3.0.0 */ beforeCreate: notify, @@ -8028,8 +8090,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCreateMany - * @param {Array} records The `records` argument passed to {@link Mapper#createMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}. + * @param {array} records The `records` argument passed to {@link Mapper#createMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}. * @since 3.0.0 */ beforeCreateMany: notify, @@ -8040,8 +8102,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCount - * @param {Object} query The `query` argument passed to {@link Mapper#count}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#count}. + * @param {object} query The `query` argument passed to {@link Mapper#count}. + * @param {object} opts The `opts` argument passed to {@link Mapper#count}. * @since 3.0.0 */ beforeCount: notify, @@ -8053,7 +8115,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeDestroy * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}. * @since 3.0.0 */ beforeDestroy: notify, @@ -8065,7 +8127,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeDestroyAll * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}. * @since 3.0.0 */ beforeDestroyAll: notify, @@ -8077,7 +8139,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeFind * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#find}. + * @param {object} opts The `opts` argument passed to {@link Mapper#find}. * @since 3.0.0 */ beforeFind: notify, @@ -8088,8 +8150,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeFindAll - * @param {Object} query The `query` argument passed to {@link Mapper#findAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}. + * @param {object} query The `query` argument passed to {@link Mapper#findAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}. * @since 3.0.0 */ beforeFindAll: notify, @@ -8101,8 +8163,8 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeSum * @param {string} field The `field` argument passed to {@link Mapper#sum}. - * @param {Object} query The `query` argument passed to {@link Mapper#sum}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}. + * @param {object} query The `query` argument passed to {@link Mapper#sum}. + * @param {object} opts The `opts` argument passed to {@link Mapper#sum}. * @since 3.0.0 */ beforeSum: notify, @@ -8115,7 +8177,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#beforeUpdate * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}. * @param {props} props The `props` argument passed to {@link Mapper#update}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#update}. + * @param {object} opts The `opts` argument passed to {@link Mapper#update}. * @since 3.0.0 */ beforeUpdate: notify, @@ -8126,9 +8188,9 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeUpdateAll - * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}. - * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}. + * @param {object} props The `props` argument passed to {@link Mapper#updateAll}. + * @param {object} query The `query` argument passed to {@link Mapper#updateAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}. * @since 3.0.0 */ beforeUpdateAll: notify, @@ -8139,8 +8201,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeUpdateMany - * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}. + * @param {array} records The `records` argument passed to {@link Mapper#updateMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}. * @since 3.0.0 */ beforeUpdateMany: notify, @@ -8188,20 +8250,20 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // user records will be attached to post records at "post.user" * localField: 'user' - * }) + * }); * * CommentMapper.belongsTo(UserMapper, { * // comment.user_id points to user.id * foreignKey: 'user_id' * // user records will be attached to comment records at "comment.user" * localField: 'user' - * }) + * }); * CommentMapper.belongsTo(PostMapper, { * // comment.post_id points to post.id * foreignKey: 'post_id' * // post records will be attached to comment records at "comment.post" * localField: 'post' - * }) + * }); * * @method Mapper#belongsTo * @see http://www.js-data.io/v3.0/docs/relations @@ -8221,16 +8283,16 @@ var Mapper$1 = Component$1.extend({ * @example * // Get the number of published blog posts * PostMapper.count({ status: 'published' }).then((numPublished) => { - * console.log(numPublished) // e.g. 45 - * }) + * console.log(numPublished); // e.g. 45 + * }); * * @method Mapper#count - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `count` method + * @param {object} [opts] Configuration options. Refer to the `count` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8259,11 +8321,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeCreate (props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback Mapper~beforeCreateListener - * @param {Object} props The `props` argument passed to {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument passed to {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeCreate}. * @see Mapper#event:beforeCreate * @see Mapper#create * @since 3.0.0 @@ -8283,12 +8345,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterCreate (props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback Mapper~afterCreateListener - * @param {Object} props The `props` argument passed to {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterCreate}. + * @param {object} props The `props` argument passed to {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterCreate}. + * @param {object} result The `result` argument passed to {@link Mapper#afterCreate}. * @see Mapper#event:afterCreate * @see Mapper#create * @since 3.0.0 @@ -8305,14 +8367,14 @@ var Mapper$1 = Component$1.extend({ * title: 'Modeling your data', * status: 'draft' * }).then((post) => { - * console.log(post) // { id: 1234, status: 'draft', ... } - * }) + * console.log(post); // { id: 1234, status: 'draft', ... } + * }); * * @fires Mapper#beforeCreate * @fires Mapper#afterCreate * @method Mapper#create - * @param {Object} props The properties for the new record. - * @param {Object} [opts] Configuration options. Refer to the `create` method + * @param {object} props The properties for the new record. + * @param {object} [opts] Configuration options. Refer to the `create` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8398,7 +8460,7 @@ var Mapper$1 = Component$1.extend({ * @deprecated * @method Mapper#createInstance * @param {Object|Array} props See {@link Mapper#createRecord}. - * @param {Object} [opts] See {@link Mapper#createRecord}. + * @param {object} [opts] See {@link Mapper#createRecord}. * @returns {Object|Array} See {@link Mapper#createRecord}. * @see Mapper#createRecord * @since 3.0.0 @@ -8411,8 +8473,8 @@ var Mapper$1 = Component$1.extend({ /** * Creates parent record for relation types like BelongsTo or HasMany with localKeys * in order to satisfy foreignKey dependency (so called child records). - * @param {Object} props See {@link Mapper#create}. - * @param {Object} opts See {@link Mapper#create}. + * @param {object} props See {@link Mapper#create}. + * @param {object} opts See {@link Mapper#create}. * @returns {Object} cached parent records map * @see Mapper#create * @since 3.0.0 @@ -8443,11 +8505,11 @@ var Mapper$1 = Component$1.extend({ /** * Creates child record for relation types like HasOne or HasMany with foreignKey * in order to satisfy foreignKey dependency (so called parent records). - * @param {Object} props See {@link Mapper#create}. - * @param {Object} context contains collected information. - * @param {Object} context.opts See {@link Mapper#create}. - * @param {Object} context.parentRelationMap contains parent records map - * @param {Object} context.originalProps contains data passed into {@link Mapper#create} method + * @param {object} props See {@link Mapper#create}. + * @param {object} context contains collected information. + * @param {object} context.opts See {@link Mapper#create}. + * @param {object} context.parentRelationMap contains parent records map + * @param {object} context.originalProps contains data passed into {@link Mapper#create} method * @return {Promise} updated props * @see Mapper#create * @since 3.0.0 @@ -8497,11 +8559,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeCreateMany (records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback Mapper~beforeCreateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see Mapper#event:beforeCreateMany * @see Mapper#createMany * @since 3.0.0 @@ -8521,12 +8583,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterCreateMany (records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback Mapper~afterCreateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see Mapper#event:afterCreateMany * @see Mapper#createMany * @since 3.0.0 @@ -8546,15 +8608,15 @@ var Mapper$1 = Component$1.extend({ * title: 'Reading data', * status: 'draft' * }]).then((posts) => { - * console.log(posts[0]) // { id: 1234, status: 'draft', ... } - * console.log(posts[1]) // { id: 1235, status: 'draft', ... } - * }) + * console.log(posts[0]); // { id: 1234, status: 'draft', ... } + * console.log(posts[1]); // { id: 1235, status: 'draft', ... } + * }); * * @fires Mapper#beforeCreate * @fires Mapper#afterCreate * @method Mapper#createMany * @param {Record[]} records Array of records to be created in one batch. - * @param {Object} [opts] Configuration options. Refer to the `createMany` + * @param {object} [opts] Configuration options. Refer to the `createMany` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8681,14 +8743,14 @@ var Mapper$1 = Component$1.extend({ * * @example * // Create empty unsaved record instance - * const post = PostMapper.createRecord() + * const post = PostMapper.createRecord(); * * @example * // Create an unsaved record instance with inital properties * const post = PostMapper.createRecord({ * title: 'Modeling your data', * status: 'draft' - * }) + * }); * * @example * // Create a record instance that corresponds to a saved record @@ -8697,7 +8759,7 @@ var Mapper$1 = Component$1.extend({ * id: 1234, * title: 'Modeling your data', * status: 'draft' - * }) + * }); * * @example * // Create record instances from an array @@ -8707,39 +8769,39 @@ var Mapper$1 = Component$1.extend({ * }, { * title: 'Reading data', * status: 'draft' - * }]) + * }]); * * @example * // Records are validated by default - * import {Mapper} from 'js-data' + * import { Mapper } from 'js-data'; * const PostMapper = new Mapper({ * name: 'post', * schema: { properties: { title: { type: 'string' } } } - * }) + * }); * try { * const post = PostMapper.createRecord({ * title: 1234, - * }) + * }); * } catch (err) { - * console.log(err.errors) // [{ expected: 'one of (string)', actual: 'number', path: 'title' }] + * console.log(err.errors); // [{ expected: 'one of (string)', actual: 'number', path: 'title' }] * } * * @example * // Skip validation - * import {Mapper} from 'js-data' + * import { Mapper } from 'js-data'; * const PostMapper = new Mapper({ * name: 'post', * schema: { properties: { title: { type: 'string' } } } - * }) + * }); * const post = PostMapper.createRecord({ * title: 1234, - * }, { noValidate: true }) - * console.log(post.isValid()) // false + * }, { noValidate: true }); + * console.log(post.isValid()); // false * * @method Mapper#createRecord * @param {Object|Object[]} props The properties for the Record instance or an * array of property objects for the Record instances. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}. * @returns {Record|Record[]} The Record instance or Record instances. * @since 3.0.0 @@ -8851,11 +8913,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeDestroy (id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback Mapper~beforeDestroyListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}. * @see Mapper#event:beforeDestroy * @see Mapper#destroy * @since 3.0.0 @@ -8875,12 +8937,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterDestroy (id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback Mapper~afterDestroyListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument passed to {@link Mapper#afterDestroy}. * @see Mapper#event:afterDestroy * @see Mapper#destroy * @since 3.0.0 @@ -8895,20 +8957,20 @@ var Mapper$1 = Component$1.extend({ * // Destroy a specific blog post * PostMapper.destroy(1234).then(() => { * // Blog post #1234 has been destroyed - * }) + * }); * * @example * // Get full response * PostMapper.destroy(1234, { raw: true }).then((result) => { - * console.log(result.deleted) e.g. 1 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.deleted); e.g. 1 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeDestroy * @fires Mapper#afterDestroy * @method Mapper#destroy * @param {(string|number)} id The primary key of the record to destroy. - * @param {Object} [opts] Configuration options. Refer to the `destroy` method + * @param {object} [opts] Configuration options. Refer to the `destroy` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8939,11 +9001,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeDestroyAll (query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback Mapper~beforeDestroyAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}. * @see Mapper#event:beforeDestroyAll * @see Mapper#destroyAll * @since 3.0.0 @@ -8963,12 +9025,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterDestroyAll (query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback Mapper~afterDestroyAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument passed to {@link Mapper#afterDestroyAll}. * @see Mapper#event:afterDestroyAll * @see Mapper#destroyAll * @since 3.0.0 @@ -8984,32 +9046,32 @@ var Mapper$1 = Component$1.extend({ * // Destroy all blog posts * PostMapper.destroyAll().then(() => { * // All blog posts have been destroyed - * }) + * }); * * @example * // Destroy all "draft" blog posts * PostMapper.destroyAll({ status: 'draft' }).then(() => { * // All "draft" blog posts have been destroyed - * }) + * }); * * @example * // Get full response - * const query = null - * const options = { raw: true } + * const query = null; + * const options = { raw: true }; * PostMapper.destroyAll(query, options).then((result) => { - * console.log(result.deleted) e.g. 14 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.deleted); e.g. 14 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeDestroyAll * @fires Mapper#afterDestroyAll * @method Mapper#destroyAll - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `destroyAll` + * @param {object} [opts] Configuration options. Refer to the `destroyAll` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9041,11 +9103,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeFind (id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback Mapper~beforeFindListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFind}. * @see Mapper#event:beforeFind * @see Mapper#find * @since 3.0.0 @@ -9065,12 +9127,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterFind (id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback Mapper~afterFindListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFind}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterFind}. + * @param {object} result The `result` argument passed to {@link Mapper#afterFind}. * @see Mapper#event:afterFind * @see Mapper#find * @since 3.0.0 @@ -9083,22 +9145,22 @@ var Mapper$1 = Component$1.extend({ * * @example * PostMapper.find(1).then((post) => { - * console.log(post) // { id: 1, ...} - * }) + * console.log(post); // { id: 1, ...} + * }); * * @example * // Get full response * PostMapper.find(1, { raw: true }).then((result) => { - * console.log(result.data) // { id: 1, ...} - * console.log(result.found) // 1 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.data); // { id: 1, ...} + * console.log(result.found); // 1 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeFind * @fires Mapper#afterFind * @method Mapper#find * @param {(string|number)} id The primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. Refer to the `find` method + * @param {object} [opts] Configuration options. Refer to the `find` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9131,11 +9193,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeFindAll (query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback Mapper~beforeFindAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument passed to {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}. * @see Mapper#event:beforeFindAll * @see Mapper#findAll * @since 3.0.0 @@ -9155,12 +9217,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterFindAll (query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback Mapper~afterFindAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument passed to {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument passed to {@link Mapper#afterFindAll}. * @see Mapper#event:afterFindAll * @see Mapper#findAll * @since 3.0.0 @@ -9174,26 +9236,26 @@ var Mapper$1 = Component$1.extend({ * @example * // Find all "published" blog posts * PostMapper.findAll({ status: 'published' }).then((posts) => { - * console.log(posts) // [{ id: 1, status: 'published', ...}, ...] - * }) + * console.log(posts); // [{ id: 1, status: 'published', ...}, ...] + * }); * * @example * // Get full response * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => { - * console.log(result.data) // [{ id: 1, status: 'published', ...}, ...] - * console.log(result.found) // e.g. 13 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.data); // [{ id: 1, status: 'published', ...}, ...] + * console.log(result.found); // e.g. 13 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeFindAll * @fires Mapper#afterFindAll * @method Mapper#findAll - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `findAll` method + * @param {object} [opts] Configuration options. Refer to the `findAll` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9285,7 +9347,7 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // post records will be attached to user records at "user.posts" * localField: 'posts' - * }) + * }); * * @method Mapper#hasMany * @see http://www.js-data.io/v3.0/docs/relations @@ -9306,7 +9368,7 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // profile records will be attached to user records at "user.profile" * localField: 'profile' - * }) + * }); * * @method Mapper#hasOne * @see http://www.js-data.io/v3.0/docs/relations @@ -9321,11 +9383,11 @@ var Mapper$1 = Component$1.extend({ * Return whether `record` is an instance of this Mapper's recordClass. * * @example - * const post = PostMapper.createRecord() + * const post = PostMapper.createRecord(); * - * console.log(PostMapper.is(post)) // true + * console.log(PostMapper.is(post)); // true * // Equivalent to what's above - * console.log(post instanceof PostMapper.recordClass) // true + * console.log(post instanceof PostMapper.recordClass); // true * * @method Mapper#is * @param {Object|Record} record The record to check. @@ -9345,7 +9407,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#registerAdapter * @param {string} name The name of the adapter to register. * @param {Adapter} adapter The adapter to register. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.default=false] Whether to make the adapter the * default adapter for this Mapper. * @since 3.0.0 @@ -9399,17 +9461,17 @@ var Mapper$1 = Component$1.extend({ * * @example * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => { - * console.log(amountPaid) // e.g. 451125.34 - * }) + * console.log(amountPaid); // e.g. 451125.34 + * }); * * @method Mapper#sum * @param {string} field The field to sum. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `sum` method + * @param {object} [opts] Configuration options. Refer to the `sum` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9428,7 +9490,7 @@ var Mapper$1 = Component$1.extend({ * be optionally be included. Non-schema properties can be excluded. * * @example - * import { Mapper, Schema } from 'js-data' + * import { Mapper, Schema } from 'js-data'; * const PersonMapper = new Mapper({ * name: 'person', * schema: { @@ -9437,10 +9499,10 @@ var Mapper$1 = Component$1.extend({ * id: { type: 'string' } * } * } - * }) - * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }) + * }); + * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }); * // "foo" is stripped by toJSON() - * console.log(PersonMapper.toJSON(person)) // {"id":1,"name":"John"} + * console.log(PersonMapper.toJSON(person)); // {"id":1,"name":"John"} * * const PersonRelaxedMapper = new Mapper({ * name: 'personRelaxed', @@ -9451,15 +9513,15 @@ var Mapper$1 = Component$1.extend({ * }, * additionalProperties: true * } - * }) - * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }) + * }); + * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }); * // "foo" is not stripped by toJSON - * console.log(PersonRelaxedMapper.toJSON(person2)) // {"id":1,"name":"John","foo":"bar"} + * console.log(PersonRelaxedMapper.toJSON(person2)); // {"id":1,"name":"John","foo":"bar"} * * @method Mapper#toJSON * @param {Record|Record[]} records Record or records from which to create a * POJO representation. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the POJO representation. * @param {boolean} [opts.withAll] Whether to simply include all relations in @@ -9534,12 +9596,12 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdate (id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback Mapper~beforeUpdateListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument passed to {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument passed to {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}. * @see Mapper#event:beforeUpdate * @see Mapper#update * @since 3.0.0 @@ -9559,13 +9621,13 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdate (id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback Mapper~afterUpdateListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument passed to {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument passed to {@link Mapper#afterUpdate}. * @see Mapper#event:afterUpdate * @see Mapper#update * @since 3.0.0 @@ -9583,15 +9645,15 @@ var Mapper$1 = Component$1.extend({ * status: 'published', * published_at: new Date() * }).then((post) => { - * console.log(post) // { id: 1234, status: 'published', ... } - * }) + * console.log(post); // { id: 1234, status: 'published', ... } + * }); * * @fires Mapper#beforeUpdate * @fires Mapper#afterUpdate * @method Mapper#update * @param {(string|number)} id The primary key of the record to update. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. Refer to the `update` method + * @param {object} props The update to apply to the record. + * @param {object} [opts] Configuration options. Refer to the `update` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9624,12 +9686,12 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdateAll (props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback Mapper~beforeUpdateAllListener - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see Mapper#event:beforeUpdateAll * @see Mapper#updateAll * @since 3.0.0 @@ -9649,13 +9711,13 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdateAll (props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback Mapper~afterUpdateAllListener - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see Mapper#event:afterUpdateAll * @see Mapper#updateAll * @since 3.0.0 @@ -9669,22 +9731,22 @@ var Mapper$1 = Component$1.extend({ * * @example * // Turn all of John's blog posts into drafts. - * const update = { status: draft: published_at: null } - * const query = { userId: 1234 } + * const update = { status: draft: published_at: null }; + * const query = { userId: 1234 }; * PostMapper.updateAll(update, query).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Mapper#beforeUpdateAll * @fires Mapper#afterUpdateAll * @method Mapper#updateAll - * @param {Object} props Update to apply to selected records. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} props Update to apply to selected records. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `updateAll` + * @param {object} [opts] Configuration options. Refer to the `updateAll` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9716,11 +9778,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdateMany (records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback Mapper~beforeUpdateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see Mapper#event:beforeUpdateMany * @see Mapper#updateMany * @since 3.0.0 @@ -9740,12 +9802,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdateMany (records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback Mapper~afterUpdateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see Mapper#event:afterUpdateMany * @see Mapper#updateMany * @since 3.0.0 @@ -9763,14 +9825,14 @@ var Mapper$1 = Component$1.extend({ * { id: 1234, status: 'draft' }, * { id: 2468, status: 'published', published_at: new Date() } * ]).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Mapper#beforeUpdateMany * @fires Mapper#afterUpdateMany * @method Mapper#updateMany * @param {Record[]} records Array up record updates. - * @param {Object} [opts] Configuration options. Refer to the `updateMany` + * @param {object} [opts] Configuration options. Refer to the `updateMany` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9799,19 +9861,19 @@ var Mapper$1 = Component$1.extend({ * name: { type: 'string' }, * id: { type: 'string' } * } - * }) + * }); * const PersonMapper = new Mapper({ * name: 'person', * schema: PersonSchema - * }) - * let errors = PersonMapper.validate({ name: 'John' }) - * console.log(errors) // undefined - * errors = PersonMapper.validate({ name: 123 }) - * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] + * }); + * let errors = PersonMapper.validate({ name: 'John' }); + * console.log(errors); // undefined + * errors = PersonMapper.validate({ name: 123 }); + * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] * * @method Mapper#validate * @param {Object|Object[]} record The record or records to validate. - * @param {Object} [opts] Configuration options. Passed to + * @param {object} [opts] Configuration options. Passed to * {@link Schema#validate}. * @returns {Object[]} Array of errors or `undefined` if no errors. * @since 3.0.0 @@ -9845,7 +9907,7 @@ var Mapper$1 = Component$1.extend({ * * ``` * function (data, opts) { - * return this.createRecord(data, opts) + * return this.createRecord(data, opts); * } * ``` * @@ -9854,21 +9916,21 @@ var Mapper$1 = Component$1.extend({ * name: 'post', * // Override to customize behavior * wrap (data, opts) { - * const originalWrap = this.constructor.prototype.wrap + * const originalWrap = this.constructor.prototype.wrap; * // Let's say "GET /post" doesn't return JSON quite like JSData expects, * // but the actual post records are nested under a "posts" field. So, * // we override Mapper#wrap to handle this special case. * if (opts.op === 'findAll') { - * return originalWrap.call(this, data.posts, opts) + * return originalWrap.call(this, data.posts, opts); * } * // Otherwise perform original behavior - * return originalWrap.call(this, data, opts) + * return originalWrap.call(this, data, opts); * } - * }) + * }); * * @method Mapper#wrap * @param {Object|Object[]} data The record or records to be wrapped. - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#createRecord}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#createRecord}. * @returns {Record|Record[]} The wrapped record or records. * @since 3.0.0 */ @@ -9911,52 +9973,51 @@ var Mapper$1 = Component$1.extend({ * Create a subclass of this Mapper: * * @example Mapper.extend - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomMapperClass extends Mapper { - * foo () { return 'bar' } - * static beep () { return 'boop' } - * } - * const customMapper = new CustomMapperClass() - * console.log(customMapper.foo()) - * console.log(CustomMapperClass.beep()) + * foo () { return 'bar'; } + * static beep () { return 'boop'; } + * }; + * const customMapper = new CustomMapperClass(); + * console.log(customMapper.foo()); + * console.log(CustomMapperClass.beep()); * * // Extend the class using alternate method. * const OtherMapperClass = Mapper.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherMapper = new OtherMapperClass() - * console.log(otherMapper.foo()) - * console.log(OtherMapperClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherMapper = new OtherMapperClass(); + * console.log(otherMapper.foo()); + * console.log(OtherMapperClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherMapperClass () { - * Mapper.call(this) - * this.created_at = new Date().getTime() + * Mapper.call(this); + * this.created_at = new Date().getTime(); * } * Mapper.extend({ * constructor: AnotherMapperClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherMapper = new AnotherMapperClass() - * console.log(anotherMapper.created_at) - * console.log(anotherMapper.foo()) - * console.log(AnotherMapperClass.beep()) + * const anotherMapper = new AnotherMapperClass(); + * console.log(anotherMapper.created_at); + * console.log(anotherMapper.foo()); + * console.log(AnotherMapperClass.beep()); * * @method Mapper.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Mapper class. * @since 3.0.0 */ @@ -9969,20 +10030,20 @@ var proxiedMapperMethods = [ * * @example * // Get the number of published blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.count('post', { status: 'published' }).then((numPublished) => { - * console.log(numPublished) // e.g. 45 - * }) + * console.log(numPublished); // e.g. 45 + * }); * * @method Container#count * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#count}. - * @param {Object} [opts] See {@link Mapper#count}. + * @param {object} [query] See {@link Mapper#count}. + * @param {object} [opts] See {@link Mapper#count}. * @returns {Promise} See {@link Mapper#count}. * @see Mapper#count * @since 3.0.0 @@ -10004,12 +10065,12 @@ var proxiedMapperMethods = [ * function onBeforeCreate (mapperName, props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback Container~beforeCreateListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}. * @see Container#event:beforeCreate * @see Container#create * @since 3.0.0 @@ -10029,13 +10090,13 @@ var proxiedMapperMethods = [ * function onAfterCreate (mapperName, props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback Container~afterCreateListener * @param {string} name The `name` argument received by {@link Mapper#afterCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}. + * @param {object} props The `props` argument received by {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreate}. * @see Container#event:afterCreate * @see Container#create * @since 3.0.0 @@ -10045,25 +10106,25 @@ var proxiedMapperMethods = [ * * @example * // Create and save a new blog post - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.create('post', { * title: 'Modeling your data', * status: 'draft' * }).then((post) => { - * console.log(post) // { id: 1234, status: 'draft', ... } - * }) + * console.log(post); // { id: 1234, status: 'draft', ... } + * }); * * @fires Container#beforeCreate * @fires Container#afterCreate * @method Container#create * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} props See {@link Mapper#create}. - * @param {Object} [opts] See {@link Mapper#create}. + * @param {object} props See {@link Mapper#create}. + * @param {object} [opts] See {@link Mapper#create}. * @returns {Promise} See {@link Mapper#create}. * @see Mapper#create * @since 3.0.0 @@ -10085,12 +10146,12 @@ var proxiedMapperMethods = [ * function onBeforeCreateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback Container~beforeCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see Container#event:beforeCreateMany * @see Container#createMany * @since 3.0.0 @@ -10110,13 +10171,13 @@ var proxiedMapperMethods = [ * function onAfterCreateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback Container~afterCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see Container#event:afterCreateMany * @see Container#createMany * @since 3.0.0 @@ -10126,11 +10187,11 @@ var proxiedMapperMethods = [ * * @example * // Create and save several new blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.createMany('post', [{ * title: 'Modeling your data', @@ -10139,16 +10200,16 @@ var proxiedMapperMethods = [ * title: 'Reading data', * status: 'draft' * }]).then((posts) => { - * console.log(posts[0]) // { id: 1234, status: 'draft', ... } - * console.log(posts[1]) // { id: 1235, status: 'draft', ... } - * }) + * console.log(posts[0]); // { id: 1234, status: 'draft', ... } + * console.log(posts[1]); // { id: 1235, status: 'draft', ... } + * }); * * @fires Container#beforeCreateMany * @fires Container#afterCreateMany * @method Container#createMany * @param {string} name Name of the {@link Mapper} to target. * @param {Record[]} records See {@link Mapper#createMany}. - * @param {Object} [opts] See {@link Mapper#createMany}. + * @param {object} [opts] See {@link Mapper#createMany}. * @returns {Promise} See {@link Mapper#createMany}. * @see Mapper#createMany * @since 3.0.0 @@ -10163,15 +10224,15 @@ var proxiedMapperMethods = [ * * @example * // Create empty unsaved record instance - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('post') - * const post = PostMapper.createRecord() + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('post'); + * const post = PostMapper.createRecord(); * * @method Container#createRecord * @param {string} name Name of the {@link Mapper} to target. * @param {Object|Object[]} props See {@link Mapper#createRecord}. - * @param {Object} [opts] See {@link Mapper#createRecord}. + * @param {object} [opts] See {@link Mapper#createRecord}. * @returns {Promise} See {@link Mapper#createRecord}. * @see Mapper#createRecord * @since 3.0.0 @@ -10193,12 +10254,12 @@ var proxiedMapperMethods = [ * function onBeforeDestroy (mapperName, id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback Container~beforeDestroyListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. * @see Container#event:beforeDestroy * @see Container#destroy * @since 3.0.0 @@ -10218,13 +10279,13 @@ var proxiedMapperMethods = [ * function onAfterDestroy (mapperName, id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback Container~afterDestroyListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}. * @see Container#event:afterDestroy * @see Container#destroy * @since 3.0.0 @@ -10234,22 +10295,22 @@ var proxiedMapperMethods = [ * * @example * // Destroy a specific blog post - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.destroy('post', 1234).then(() => { * // Blog post #1234 has been destroyed - * }) + * }); * * @fires Container#beforeDestroy * @fires Container#afterDestroy * @method Container#destroy * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#destroy}. - * @param {Object} [opts] See {@link Mapper#destroy}. + * @param {object} [opts] See {@link Mapper#destroy}. * @returns {Promise} See {@link Mapper#destroy}. * @see Mapper#destroy * @since 3.0.0 @@ -10271,12 +10332,12 @@ var proxiedMapperMethods = [ * function onBeforeDestroyAll (mapperName, query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback Container~beforeDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. * @see Container#event:beforeDestroyAll * @see Container#destroyAll * @since 3.0.0 @@ -10296,13 +10357,13 @@ var proxiedMapperMethods = [ * function onAfterDestroyAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback Container~afterDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}. * @see Container#event:afterDestroyAll * @see Container#destroyAll * @since 3.0.0 @@ -10312,22 +10373,22 @@ var proxiedMapperMethods = [ * * @example * // Destroy all "draft" blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.destroyAll('post', { status: 'draft' }).then(() => { * // All "draft" blog posts have been destroyed - * }) + * }); * * @fires Container#beforeDestroyAll * @fires Container#afterDestroyAll * @method Container#destroyAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#destroyAll}. - * @param {Object} [opts] See {@link Mapper#destroyAll}. + * @param {object} [query] See {@link Mapper#destroyAll}. + * @param {object} [opts] See {@link Mapper#destroyAll}. * @returns {Promise} See {@link Mapper#destroyAll}. * @see Mapper#destroyAll * @since 3.0.0 @@ -10349,12 +10410,12 @@ var proxiedMapperMethods = [ * function onBeforeFind (mapperName, id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback Container~beforeFindListener * @param {string} name The `name` argument received by {@link Mapper#beforeFind}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}. * @see Container#event:beforeFind * @see Container#find * @since 3.0.0 @@ -10374,13 +10435,13 @@ var proxiedMapperMethods = [ * function onAfterFind (mapperName, id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback Container~afterFindListener * @param {string} name The `name` argument received by {@link Mapper#afterFind}. * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}. + * @param {object} result The `result` argument received by {@link Mapper#afterFind}. * @see Container#event:afterFind * @see Container#find * @since 3.0.0 @@ -10389,22 +10450,22 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#find}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.find('post', 1).then((post) => { * console.log(post) // { id: 1, ...} - * }) + * }); * * @fires Container#beforeFind * @fires Container#afterFind * @method Container#find * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#find}. - * @param {Object} [opts] See {@link Mapper#find}. + * @param {object} [opts] See {@link Mapper#find}. * @returns {Promise} See {@link Mapper#find}. * @see Mapper#find * @since 3.0.0 @@ -10426,12 +10487,12 @@ var proxiedMapperMethods = [ * function onBeforeFindAll (mapperName, query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback Container~beforeFindAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. * @see Container#event:beforeFindAll * @see Container#findAll * @since 3.0.0 @@ -10451,13 +10512,13 @@ var proxiedMapperMethods = [ * function onAfterFindAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback Container~afterFindAllListener * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}. * @see Container#event:afterFindAll * @see Container#findAll * @since 3.0.0 @@ -10467,22 +10528,22 @@ var proxiedMapperMethods = [ * * @example * // Find all "published" blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.findAll('post', { status: 'published' }).then((posts) => { - * console.log(posts) // [{ id: 1, ...}, ...] - * }) + * console.log(posts); // [{ id: 1, ...}, ...] + * }); * * @fires Container#beforeFindAll * @fires Container#afterFindAll * @method Container#findAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#findAll}. - * @param {Object} [opts] See {@link Mapper#findAll}. + * @param {object} [query] See {@link Mapper#findAll}. + * @param {object} [opts] See {@link Mapper#findAll}. * @returns {Promise} See {@link Mapper#findAll}. * @see Mapper#findAll * @since 3.0.0 @@ -10504,14 +10565,14 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#is}. * * @example - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('post') - * const post = store.createRecord() + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('post'); + * const post = store.createRecord(); * - * console.log(store.is('post', post)) // true + * console.log(store.is('post', post)); // true * // Equivalent to what's above - * console.log(post instanceof store.getMapper('post').recordClass) // true + * console.log(post instanceof store.getMapper('post').recordClass); // true * * @method Container#is * @param {string} name Name of the {@link Mapper} to target. @@ -10526,21 +10587,21 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#sum}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('purchase_order') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('purchase_order'); * * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => { - * console.log(amountPaid) // e.g. 451125.34 - * }) + * console.log(amountPaid); // e.g. 451125.34 + * }); * * @method Container#sum * @param {string} name Name of the {@link Mapper} to target. * @param {string} field See {@link Mapper#sum}. - * @param {Object} [query] See {@link Mapper#sum}. - * @param {Object} [opts] See {@link Mapper#sum}. + * @param {object} [query] See {@link Mapper#sum}. + * @param {object} [opts] See {@link Mapper#sum}. * @returns {Promise} See {@link Mapper#sum}. * @see Mapper#sum * @since 3.0.0 @@ -10551,10 +10612,10 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#toJSON}. * * @example - * import { Container } from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); * store.defineMapper('person', { * schema: { * properties: { @@ -10562,10 +10623,10 @@ var proxiedMapperMethods = [ * id: { type: 'string' } * } * } - * }) - * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' }) + * }); + * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' }); * // "foo" is stripped by toJSON() - * console.log(store.toJSON('person', person)) // {"id":1,"name":"John"} + * console.log(store.toJSON('person', person)); // {"id":1,"name":"John"} * * store.defineMapper('personRelaxed', { * schema: { @@ -10575,15 +10636,15 @@ var proxiedMapperMethods = [ * }, * additionalProperties: true * } - * }) - * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' }) + * }); + * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' }); * // "foo" is not stripped by toJSON - * console.log(store.toJSON('personRelaxed', person2)) // {"id":1,"name":"John","foo":"bar"} + * console.log(store.toJSON('personRelaxed', person2)); // {"id":1,"name":"John","foo":"bar"} * * @method Container#toJSON * @param {string} name Name of the {@link Mapper} to target. * @param {Record|Record[]} records See {@link Mapper#toJSON}. - * @param {Object} [opts] See {@link Mapper#toJSON}. + * @param {object} [opts] See {@link Mapper#toJSON}. * @returns {Object|Object[]} See {@link Mapper#toJSON}. * @see Mapper#toJSON * @since 3.0.0 @@ -10605,13 +10666,13 @@ var proxiedMapperMethods = [ * function onBeforeUpdate (mapperName, id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback Container~beforeUpdateListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. * @see Container#event:beforeUpdate * @see Container#update * @since 3.0.0 @@ -10631,14 +10692,14 @@ var proxiedMapperMethods = [ * function onAfterUpdate (mapperName, id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback Container~afterUpdateListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}. * @see Container#event:afterUpdate * @see Container#update * @since 3.0.0 @@ -10647,26 +10708,26 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#update}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.update('post', 1234, { * status: 'published', * published_at: new Date() * }).then((post) => { - * console.log(post) // { id: 1234, status: 'published', ... } - * }) + * console.log(post); // { id: 1234, status: 'published', ... } + * }); * * @fires Container#beforeUpdate * @fires Container#afterUpdate * @method Container#update * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#update}. - * @param {Object} record See {@link Mapper#update}. - * @param {Object} [opts] See {@link Mapper#update}. + * @param {object} record See {@link Mapper#update}. + * @param {object} [opts] See {@link Mapper#update}. * @returns {Promise} See {@link Mapper#update}. * @see Mapper#update * @since 3.0.0 @@ -10689,13 +10750,13 @@ var proxiedMapperMethods = [ * function onBeforeUpdateAll (mapperName, props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback Container~beforeUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see Container#event:beforeUpdateAll * @see Container#updateAll * @since 3.0.0 @@ -10715,14 +10776,14 @@ var proxiedMapperMethods = [ * function onAfterUpdateAll (mapperName, props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback Container~afterUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see Container#event:afterUpdateAll * @see Container#updateAll * @since 3.0.0 @@ -10732,25 +10793,25 @@ var proxiedMapperMethods = [ * * @example * // Turn all of John's blog posts into drafts. - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') - * - * const update = { status: draft: published_at: null } - * const query = { userId: 1234 } + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); + * + * const update = { status: draft: published_at: null }; + * const query = { userId: 1234 }; * store.updateAll('post', update, query).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Container#beforeUpdateAll * @fires Container#afterUpdateAll * @method Container#updateAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} update See {@link Mapper#updateAll}. - * @param {Object} [query] See {@link Mapper#updateAll}. - * @param {Object} [opts] See {@link Mapper#updateAll}. + * @param {object} update See {@link Mapper#updateAll}. + * @param {object} [query] See {@link Mapper#updateAll}. + * @param {object} [opts] See {@link Mapper#updateAll}. * @returns {Promise} See {@link Mapper#updateAll}. * @see Mapper#updateAll * @since 3.0.0 @@ -10772,12 +10833,12 @@ var proxiedMapperMethods = [ * function onBeforeUpdateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback Container~beforeUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see Container#event:beforeUpdateMany * @see Container#updateMany * @since 3.0.0 @@ -10797,13 +10858,13 @@ var proxiedMapperMethods = [ * function onAfterUpdateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback Container~afterUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see Container#event:afterUpdateMany * @see Container#updateMany * @since 3.0.0 @@ -10812,25 +10873,25 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#updateMany}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.updateMany('post', [ * { id: 1234, status: 'draft' }, * { id: 2468, status: 'published', published_at: new Date() } * ]).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Container#beforeUpdateMany * @fires Container#afterUpdateMany * @method Container#updateMany * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}. - * @param {Object} [opts] See {@link Mapper#updateMany}. + * @param {object} [opts] See {@link Mapper#updateMany}. * @returns {Promise} See {@link Mapper#updateMany}. * @see Mapper#updateMany * @since 3.0.0 @@ -10841,8 +10902,8 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#validate}. * * @example - * import {Container} from 'js-data' - * const store = new Container() + * import { Container } from 'js-data'; + * const store = new Container(); * store.defineMapper('post', { * schema: { * properties: { @@ -10850,16 +10911,16 @@ var proxiedMapperMethods = [ * id: { type: 'string' } * } * } - * }) - * let errors = store.validate('post', { name: 'John' }) - * console.log(errors) // undefined - * errors = store.validate('post', { name: 123 }) - * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] + * }); + * let errors = store.validate('post', { name: 'John' }); + * console.log(errors); // undefined + * errors = store.validate('post', { name: 123 }); + * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] * * @method Container#validate * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records See {@link Mapper#validate}. - * @param {Object} [opts] See {@link Mapper#validate}. + * @param {object} [opts] See {@link Mapper#validate}. * @returns {Promise} See {@link Mapper#validate}. * @see Mapper#validate * @since 3.0.0 @@ -10875,19 +10936,19 @@ var proxiedMapperMethods = [ * don't have to register adapters for every single Mapper. * * @example Container#constructor - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const {Container} = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * * @class Container * @extends Component - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}. - * @param {Object} [opts.mapperDefaults] See {@link Container#mapperDefaults}. + * @param {object} [opts.mapperDefaults] See {@link Container#mapperDefaults}. * @since 3.0.0 */ function Container(opts) { @@ -10927,19 +10988,19 @@ function Container(opts) { * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers. * * @example Container#mapperClass - * // import {Container, Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container, Mapper } from 'js-data'; + * const JSData = require('js-data'); + * const { Container, Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * class MyMapperClass extends Mapper { * foo () { return 'bar' } * } * const store = new Container({ * mapperClass: MyMapperClass - * }) - * store.defineMapper('user') - * console.log(store.getMapper('user').foo()) + * }); + * store.defineMapper('user'); + * console.log(store.getMapper('user').foo()); * * @name Container#mapperClass * @see Mapper @@ -10960,18 +11021,18 @@ function Container(opts) { * new {@link Mapper}. * * @example Container#mapperDefaults - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const store = new Container({ * mapperDefaults: { * idAttribute: '_id' * } - * }) - * store.defineMapper('user') - * console.log(store.getMapper('user').idAttribute) + * }); + * store.defineMapper('user'); + * console.log(store.getMapper('user').idAttribute); * * @default {} * @name Container#mapperDefaults @@ -10995,16 +11056,16 @@ var props = { * the arugments passed to the listener. * * @example Container#on - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() - * store.on('foo', function (...args) { console.log(args.join(':')) }) - * store.defineMapper('user') - * store.emit('foo', 'arg1', 'arg2') - * store.getMapper('user').emit('foo', 'arg1', 'arg2') + * const store = new Container(); + * store.on('foo', function (...args) { console.log(args.join(':')) }); + * store.defineMapper('user'); + * store.emit('foo', 'arg1', 'arg2'); + * store.getMapper('user').emit('foo', 'arg1', 'arg2'); * * @method Container#on * @param {string} event Name of event to subsribe to. @@ -11036,21 +11097,21 @@ var props = { * Return a container scoped to a particular mapper. * * @example Container#as - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * const UserMapper = store.defineMapper('user') - * const UserStore = store.as('user') - * - * const user1 = store.createRecord('user', { name: 'John' }) - * const user2 = UserStore.createRecord({ name: 'John' }) - * const user3 = UserMapper.createRecord({ name: 'John' }) - * console.log(user1 === user2) - * console.log(user2 === user3) - * console.log(user1 === user3) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * const UserMapper = store.defineMapper('user'); + * const UserStore = store.as('user'); + * + * const user1 = store.createRecord('user', { name: 'John' }); + * const user2 = UserStore.createRecord({ name: 'John' }); + * const user3 = UserMapper.createRecord({ name: 'John' }); + * console.log(user1 === user2); + * console.log(user2 === user3); + * console.log(user1 === user3); * * @method Container#as * @param {string} name Name of the {@link Mapper}. @@ -11086,25 +11147,25 @@ var props = { * Create a new mapper and register it in this container. * * @example Container#defineMapper - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const store = new Container({ * mapperDefaults: { foo: 'bar' } - * }) + * }); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * console.log(UserMapper.foo) + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * console.log(UserMapper.foo); * * @method Container#defineMapper * @param {string} name Name under which to register the new {@link Mapper}. * {@link Mapper#name} will be set to this value. - * @param {Object} [opts] Configuration options. Passed to + * @param {object} [opts] Configuration options. Passed to * {@link Container#mapperClass} when creating the new {@link Mapper}. * @returns {Mapper} The newly created instance of {@link Mapper}. * @see Container#as @@ -11214,18 +11275,18 @@ var props = { * Return the mapper registered under the specified name. * * @example Container#getMapper - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * store.getMapper('profile') // throws Error, there is no mapper with name "profile" + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * store.getMapper('profile'); // throws Error, there is no mapper with name "profile" * * @method Container#getMapper * @param {string} name {@link Mapper#name}. @@ -11246,18 +11307,18 @@ var props = { * Doesn't throw error if mapper doesn't exist. * * @example Container#getMapperByName - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * console.log(store.getMapper('profile')) // Does NOT throw an error + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * console.log(store.getMapper('profile')); // Does NOT throw an error * * @method Container#getMapperByName * @param {string} name {@link Mapper#name}. @@ -11274,15 +11335,15 @@ var props = { * registered on a container are shared by all mappers in the container. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); * * @method Container#registerAdapter * @param {string} name The name of the adapter to register. * @param {Adapter} adapter The adapter to register. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.default=false] Whether to make the adapter the * default adapter for all Mappers in this container. * @since 3.0.0 @@ -11318,52 +11379,51 @@ Component$1.extend(props); /** * Create a subclass of this Container: * @example Container.extend - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomContainerClass extends Container { * foo () { return 'bar' } * static beep () { return 'boop' } * } - * const customContainer = new CustomContainerClass() - * console.log(customContainer.foo()) - * console.log(CustomContainerClass.beep()) + * const customContainer = new CustomContainerClass(); + * console.log(customContainer.foo()); + * console.log(CustomContainerClass.beep()); * * // Extend the class using alternate method. * const OtherContainerClass = Container.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherContainer = new OtherContainerClass() - * console.log(otherContainer.foo()) - * console.log(OtherContainerClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherContainer = new OtherContainerClass(); + * console.log(otherContainer.foo()); + * console.log(OtherContainerClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherContainerClass () { - * Container.call(this) - * this.created_at = new Date().getTime() + * Container.call(this); + * this.created_at = new Date().getTime(); * } * Container.extend({ * constructor: AnotherContainerClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherContainer = new AnotherContainerClass() - * console.log(anotherContainer.created_at) - * console.log(anotherContainer.foo()) - * console.log(AnotherContainerClass.beep()) + * const anotherContainer = new AnotherContainerClass(); + * console.log(anotherContainer.created_at); + * console.log(anotherContainer.foo()); + * console.log(AnotherContainerClass.beep()); * * @method Container.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Container class. * @since 3.0.0 */ @@ -11374,27 +11434,26 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#add}. * * @example SimpleStore#add - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('book') + * const store = new SimpleStore(); + * store.defineMapper('book'); * * // Add one book to the in-memory store: - * store.add('book', { id: 1, title: 'Respect your Data' }) + * store.add('book', { id: 1, title: 'Respect your Data' }); * // Add multiple books to the in-memory store: * store.add('book', [ * { id: 2, title: 'Easy data recipes' }, * { id: 3, title: 'Active Record 101' } - * ]) + * ]); * * @fires SimpleStore#add * @method SimpleStore#add * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}. - * @param {Object} [opts] Configuration options. See {@link Collection#add}. + * @param {object} [opts] Configuration options. See {@link Collection#add}. * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}. * @see Collection#add * @see Collection#add @@ -11407,17 +11466,17 @@ var proxiedCollectionMethods = [ * * @example * // Get all users ages 18 to 30 - * const users = store.between('user', 18, 30, { index: 'age' }) + * const users = store.between('user', 18, 30, { index: 'age' }); * * @example * // Same as above - * const users = store.between('user', [18], [30], { index: 'age' }) + * const users = store.between('user', [18], [30], { index: 'age' }); * * @method SimpleStore#between * @param {(string|number)} name Name of the {@link Mapper} to target. - * @param {Array} leftKeys See {@link Collection#between}. - * @param {Array} rightKeys See {@link Collection#between}. - * @param {Object} [opts] Configuration options. See {@link Collection#between}. + * @param {array} leftKeys See {@link Collection#between}. + * @param {array} rightKeys See {@link Collection#between}. + * @param {object} [opts] Configuration options. See {@link Collection#between}. * @returns {Object[]|Record[]} See {@link Collection#between}. * @see Collection#between * @see Collection#between @@ -11430,11 +11489,11 @@ var proxiedCollectionMethods = [ * * @example * // Index users by age - * store.createIndex('user', 'age') + * store.createIndex('user', 'age'); * * @example * // Index users by status and role - * store.createIndex('user', 'statusAndRole', ['status', 'role']) + * store.createIndex('user', 'statusAndRole', ['status', 'role']); * * @method SimpleStore#createIndex * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11450,16 +11509,15 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#filter}. * * @example SimpleStore#filter - * // import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('post') + * const store = new SimpleStore(); + * store.defineMapper('post'); * store.add('post', [ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * * // Get the draft posts created less than three months ago * let posts = store.filter('post', { @@ -11471,16 +11529,16 @@ var proxiedCollectionMethods = [ * '>=': (new Date().getTime() - (1000 \* 60 \* 60 \* 24 \* 30 \* 3)) // 3 months ago * } * } - * }) - * console.log(posts) + * }); + * console.log(posts); * * // Use a custom filter function - * posts = store.filter('post', function (post) { return post.id % 2 === 0 }) + * posts = store.filter('post', function (post) { return post.id % 2 === 0 }); * * @method SimpleStore#filter * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}. - * @param {Object} [thisArg] See {@link Collection#filter}. + * @param {object} [thisArg] See {@link Collection#filter}. * @returns {Array} See {@link Collection#filter}. * @see Collection#filter * @see Collection#filter @@ -11492,19 +11550,18 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#get}. * * @example SimpleStore#get - * // import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('post') + * const store = new SimpleStore(); + * store.defineMapper('post'); * store.add('post', [ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * - * console.log(store.get('post', 1)) // {...} - * console.log(store.get('post', 2)) // undefined + * console.log(store.get('post', 1)); // {...} + * console.log(store.get('post', 2)); // undefined * * @method SimpleStore#get * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11521,16 +11578,16 @@ var proxiedCollectionMethods = [ * * @example * // Get the posts where "status" is "draft" or "inReview" - * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' }) + * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' }); * * @example * // Same as above - * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' }) + * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' }); * * @method SimpleStore#getAll * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {...Array} [keyList] See {@link Collection#getAll}. - * @param {Object} [opts] See {@link Collection#getAll}. + * @param {object} [opts] See {@link Collection#getAll}. * @returns {Array} See {@link Collection#getAll}. * @see Collection#getAll * @see Collection#getAll @@ -11542,7 +11599,7 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#prune}. * * @method SimpleStore#prune - * @param {Object} [opts] See {@link Collection#prune}. + * @param {object} [opts] See {@link Collection#prune}. * @returns {Array} See {@link Collection#prune}. * @see Collection#prune * @see Collection#prune @@ -11559,7 +11616,7 @@ var proxiedCollectionMethods = [ * .between(18, 30, { index: 'age' }) // between ages 18 and 30 * .skip(10) // second page * .limit(10) // page size - * .run() + * .run(); * * @method SimpleStore#query * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11581,20 +11638,20 @@ var proxiedCollectionMethods = [ * title: { type: 'string' } * } * } - * }) + * }); * store.add('post', [ * { id: 1, status: 'published', title: 'Respect your Data' }, * { id: 2, status: 'draft', title: 'Connecting to a data source' } - * ]) - * console.log(store.toJSON('post')) + * ]); + * console.log(store.toJSON('post')); * const draftsJSON = store.query('post') * .filter({ status: 'draft' }) * .mapCall('toJSON') - * .run() + * .run(); * * @method SimpleStore#toJSON * @param {(string|number)} name Name of the {@link Mapper} to target. - * @param {Object} [opts] See {@link Collection#toJSON}. + * @param {object} [opts] See {@link Collection#toJSON}. * @returns {Array} See {@link Collection#toJSON}. * @see Collection#toJSON * @see Collection#toJSON @@ -11659,37 +11716,37 @@ var SIMPLESTORE_DEFAULTS = { * (the Mappers). * * ```javascript - * import {SimpleStore} from 'js-data' + * import { SimpleStore } from 'js-data'; * ``` * * @example - * import {SimpleStore} from 'js-data' - * import HttpAdapter from 'js-data-http' - * const store = new SimpleStore() + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; + * const store = new SimpleStore(); * * // SimpleStore#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') + * const UserMapper = store.defineMapper('user'); * * // SimpleStore#as returns the store scoped to a particular Mapper. - * const UserStore = store.as('user') + * const UserStore = store.as('user'); * * // Call "find" on "UserMapper" (Stateless ORM) * UserMapper.find(1).then((user) => { * // retrieved a "user" record via the http adapter, but that's it * * // Call "find" on "store" targeting "user" (Stateful SimpleStore) - * return store.find('user', 1) // same as "UserStore.find(1)" + * return store.find('user', 1); // same as "UserStore.find(1)" * }).then((user) => { * // not only was a "user" record retrieved, but it was added to the * // store's "user" collection - * const cachedUser = store.getCollection('user').get(1) - * console.log(user === cachedUser) // true - * }) + * const cachedUser = store.getCollection('user').get(1); + * console.log(user === cachedUser); // true + * }); * * @class SimpleStore * @extends Container - * @param {Object} [opts] Configuration options. See {@link Container}. + * @param {object} [opts] Configuration options. See {@link Container}. * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}. @@ -11725,8 +11782,8 @@ var props$2 = { * @private * @param {string} name Name of the {@link Collection} to which to * add the data. - * @param {Object} result The result from a Mapper. - * @param {Object} [opts] Configuration options. + * @param {object} result The result from a Mapper. + * @param {object} [opts] Configuration options. * @returns {(Object|Array)} Result. */ _end: function _end(name, result, opts) { @@ -11753,26 +11810,26 @@ var props$2 = { * @example * // Listen for all "afterCreate" events in a SimpleStore * store.on('afterCreate', (mapperName, props, opts, result) => { - * console.log(mapperName) // "post" - * console.log(props.id) // undefined - * console.log(result.id) // 1234 - * }) + * console.log(mapperName); // "post" + * console.log(props.id); // undefined + * console.log(result.id); // 1234 + * }); * store.create('post', { title: 'Modeling your data' }).then((post) => { - * console.log(post.id) // 1234 - * }) + * console.log(post.id); // 1234 + * }); * * @example * // Listen for the "add" event on a collection * store.on('add', (mapperName, records) => { - * console.log(records) // [...] - * }) + * console.log(records); // [...] + * }); * * @example * // Listen for "change" events on a record * store.on('change', (mapperName, record, changes) => { - * console.log(changes) // { changed: { title: 'Modeling your data' } } - * }) - * post.title = 'Modeling your data' + * console.log(changes); // { changed: { title: 'Modeling your data' } } + * }); + * post.title = 'Modeling your data'; * * @method SimpleStore#on * @param {string} event Name of event to subsribe to. @@ -11813,12 +11870,12 @@ var props$2 = { * // Let's say for a particular Resource, response data is in a weird format * if (name === 'comment') { * // Re-assign the variable to add the correct records into the stores - * data = data.items + * data = data.items; * } * // Now perform default behavior - * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts) + * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11827,18 +11884,18 @@ var props$2 = { * // Let's say for a particular Resource, response data is in a weird format * if (name === 'comment') { * // Re-assign the variable to add the correct records into the stores - * data = data.items + * data = data.items; * } * // Now perform default behavior - * return super.addToCache(mapperName, data, opts) + * return super.addToCache(mapperName, data, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#addToCache * @param {string} name Name of the {@link Mapper} to target. * @param {*} data Data from which data should be selected for add. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. */ addToCache: function addToCache(name, data, opts) { return this.getCollection(name).add(data, opts); @@ -11849,21 +11906,20 @@ var props$2 = { * Return the store scoped to a particular mapper/collection pair. * * @example SimpleStore.as - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * const UserMapper = store.defineMapper('user') - * const UserStore = store.as('user') - * - * const user1 = store.createRecord('user', { name: 'John' }) - * const user2 = UserStore.createRecord({ name: 'John' }) - * const user3 = UserMapper.createRecord({ name: 'John' }) - * console.log(user1 === user2) - * console.log(user2 === user3) - * console.log(user1 === user3) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * const UserMapper = store.defineMapper('user'); + * const UserStore = store.as('user'); + * + * const user1 = store.createRecord('user', { name: 'John' }); + * const user2 = UserStore.createRecord({ name: 'John' }); + * const user3 = UserMapper.createRecord({ name: 'John' }); + * console.log(user1 === user2); + * console.log(user2 === user3); + * console.log(user1 === user3); * * @method SimpleStore#as * @param {string} name Name of the {@link Mapper}. @@ -11919,12 +11975,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#find call - * return + * return; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts) + * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11933,18 +11989,18 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#find call - * return + * return; * } * // Otherwise perform default behavior - * return super.cachedFind(mapperName, id, opts) + * return super.cachedFind(mapperName, id, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cachedFind * @param {string} name The `name` argument passed to {@link SimpleStore#find}. * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}. * @since 3.0.0 */ cachedFind: cachedFn, @@ -11965,12 +12021,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#findAll call - * return undefined + * return undefined; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts) + * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11979,19 +12035,19 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#findAll call - * return undefined + * return undefined; * } * // Otherwise perform default behavior - * return super.cachedFindAll(mapperName, hash, opts) + * return super.cachedFindAll(mapperName, hash, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cachedFindAll * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}. * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on * the `query` argument passed to {@link SimpleStore#findAll}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}. * @since 3.0.0 */ cachedFindAll: cachedFn, @@ -12012,12 +12068,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts) + * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -12026,19 +12082,19 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior - * return super.cacheFind(mapperName, data, id, opts) + * return super.cacheFind(mapperName, data, id, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cacheFind * @param {string} name The `name` argument passed to {@link SimpleStore#find}. * @param {*} data The result to cache. * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}. * @since 3.0.0 */ cacheFind: function cacheFind(name, data, id, opts) { @@ -12066,12 +12122,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior. - * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts) + * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -12080,20 +12136,20 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior. - * return super.cachedFindAll(mapperName, data, hash, opts) + * return super.cachedFindAll(mapperName, data, hash, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cacheFindAll * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}. * @param {*} data The result to cache. * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on * the `query` argument passed to {@link SimpleStore#findAll}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}. * @since 3.0.0 */ cacheFindAll: function cacheFindAll(name, data, hash, opts) { @@ -12142,12 +12198,12 @@ var props$2 = { * function onBeforeCreate (mapperName, props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback SimpleStore~beforeCreateListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}. * @see SimpleStore#event:beforeCreate * @see SimpleStore#create * @since 3.0.0 @@ -12167,13 +12223,13 @@ var props$2 = { * function onAfterCreate (mapperName, props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback SimpleStore~afterCreateListener * @param {string} name The `name` argument received by {@link Mapper#afterCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}. + * @param {object} props The `props` argument received by {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreate}. * @see SimpleStore#event:afterCreate * @see SimpleStore#create * @since 3.0.0 @@ -12182,13 +12238,13 @@ var props$2 = { * Wrapper for {@link Mapper#create}. Adds the created record to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -12198,17 +12254,17 @@ var props$2 = { * edition: 'First Edition', * title: 'Respect your Data' * }).then((book) => { - * console.log(book.id) // 120392 - * console.log(book.title) // "Respect your Data" - * }) + * console.log(book.id); // 120392 + * console.log(book.title); // "Respect your Data" + * }); * * @fires SimpleStore#beforeCreate * @fires SimpleStore#afterCreate * @fires SimpleStore#add * @method SimpleStore#create * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} record Passed to {@link Mapper#create}. - * @param {Object} [opts] Passed to {@link Mapper#create}. See + * @param {object} record Passed to {@link Mapper#create}. + * @param {object} [opts] Passed to {@link Mapper#create}. See * {@link Mapper#create} for more configuration options. * @returns {Promise} Resolves with the result of the create. * @since 3.0.0 @@ -12238,12 +12294,12 @@ var props$2 = { * function onBeforeCreateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback SimpleStore~beforeCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see SimpleStore#event:beforeCreateMany * @see SimpleStore#createMany * @since 3.0.0 @@ -12263,13 +12319,13 @@ var props$2 = { * function onAfterCreateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback SimpleStore~afterCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see SimpleStore#event:afterCreateMany * @see SimpleStore#createMany * @since 3.0.0 @@ -12279,13 +12335,13 @@ var props$2 = { * store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -12299,17 +12355,17 @@ var props$2 = { * edition: 'Second Edition', * title: 'Respect your Data' * }]).then((books) => { - * console.log(books[0].id) // 142394 - * console.log(books[0].title) // "Respect your Data" - * }) + * console.log(books[0].id); // 142394 + * console.log(books[0].title); // "Respect your Data" + * }); * * @fires SimpleStore#beforeCreateMany * @fires SimpleStore#afterCreateMany * @fires SimpleStore#add * @method SimpleStore#createMany * @param {string} name Name of the {@link Mapper} to target. - * @param {Array} records Passed to {@link Mapper#createMany}. - * @param {Object} [opts] Passed to {@link Mapper#createMany}. See + * @param {array} records Passed to {@link Mapper#createMany}. + * @param {object} [opts] Passed to {@link Mapper#createMany}. See * {@link Mapper#createMany} for more configuration options. * @returns {Promise} Resolves with the result of the create. * @since 3.0.0 @@ -12389,12 +12445,12 @@ var props$2 = { * function onBeforeDestroy (mapperName, id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback SimpleStore~beforeDestroyListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. * @see SimpleStore#event:beforeDestroy * @see SimpleStore#destroy * @since 3.0.0 @@ -12414,13 +12470,13 @@ var props$2 = { * function onAfterDestroy (mapperName, id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback SimpleStore~afterDestroyListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}. * @see SimpleStore#event:afterDestroy * @see SimpleStore#destroy * @since 3.0.0 @@ -12431,28 +12487,28 @@ var props$2 = { * associated with the provided `id`. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * - * store.add('book', { id: 1234, title: 'Data Management is Hard' }) + * store.add('book', { id: 1234, title: 'Data Management is Hard' }); * * // Since this example uses the http adapter, we'll get something like: * // * // DELETE /book/1234 * store.destroy('book', 1234).then(() => { * // The book record is no longer in the in-memory store - * console.log(store.get('book', 1234)) // undefined + * console.log(store.get('book', 1234)); // undefined * - * return store.find('book', 1234) + * return store.find('book', 1234); * }).then((book) { * // The book was deleted from the database too - * console.log(book) // undefined - * }) + * console.log(book); // undefined + * }); * * @fires SimpleStore#beforeDestroy * @fires SimpleStore#afterDestroy @@ -12460,7 +12516,7 @@ var props$2 = { * @method SimpleStore#destroy * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#destroy}. - * @param {Object} [opts] Passed to {@link Mapper#destroy}. See + * @param {object} [opts] Passed to {@link Mapper#destroy}. See * {@link Mapper#destroy} for more configuration options. * @returns {Promise} Resolves when the destroy operation completes. * @since 3.0.0 @@ -12499,12 +12555,12 @@ var props$2 = { * function onBeforeDestroyAll (mapperName, query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback SimpleStore~beforeDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. * @see SimpleStore#event:beforeDestroyAll * @see SimpleStore#destroyAll * @since 3.0.0 @@ -12524,13 +12580,13 @@ var props$2 = { * function onAfterDestroyAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback SimpleStore~afterDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}. * @see SimpleStore#event:afterDestroyAll * @see SimpleStore#destroyAll * @since 3.0.0 @@ -12540,35 +12596,35 @@ var props$2 = { * the in-memory store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * - * store.add('book', { id: 1234, title: 'Data Management is Hard' }) + * store.add('book', { id: 1234, title: 'Data Management is Hard' }); * * // Since this example uses the http adapter, we'll get something like: * // * // DELETE /book/1234 * store.destroy('book', 1234).then(() => { * // The book record is gone from the in-memory store - * console.log(store.get('book', 1234)) // undefined - * return store.find('book', 1234) + * console.log(store.get('book', 1234)); // undefined + * return store.find('book', 1234); * }).then((book) { * // The book was deleted from the database too - * console.log(book) // undefined - * }) + * console.log(book); // undefined + * }); * * @fires SimpleStore#beforeDestroyAll * @fires SimpleStore#afterDestroyAll * @fires SimpleStore#remove * @method SimpleStore#destroyAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] Passed to {@link Mapper#destroyAll}. - * @param {Object} [opts] Passed to {@link Mapper#destroyAll}. See + * @param {object} [query] Passed to {@link Mapper#destroyAll}. + * @param {object} [opts] Passed to {@link Mapper#destroyAll}. See * {@link Mapper#destroyAll} for more configuration options. * @returns {Promise} Resolves when the delete completes. * @since 3.0.0 @@ -12616,12 +12672,12 @@ var props$2 = { * function onBeforeFind (mapperName, id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback SimpleStore~beforeFindListener * @param {string} name The `name` argument received by {@link Mapper#beforeFind}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}. * @see SimpleStore#event:beforeFind * @see SimpleStore#find * @since 3.0.0 @@ -12641,13 +12697,13 @@ var props$2 = { * function onAfterFind (mapperName, id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback SimpleStore~afterFindListener * @param {string} name The `name` argument received by {@link Mapper#afterFind}. * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}. + * @param {object} result The `result` argument received by {@link Mapper#afterFind}. * @see SimpleStore#event:afterFind * @see SimpleStore#find * @since 3.0.0 @@ -12656,21 +12712,21 @@ var props$2 = { * Wrapper for {@link Mapper#find}. Adds any found record to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // * // GET /book/1234 * store.find('book', 1234).then((book) => { * // The book record is now in the in-memory store - * console.log(store.get('book', 1234) === book) // true - * }) + * console.log(store.get('book', 1234) === book); // true + * }); * * @fires SimpleStore#beforeFind * @fires SimpleStore#afterFind @@ -12678,7 +12734,7 @@ var props$2 = { * @method SimpleStore#find * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#find}. - * @param {Object} [opts] Passed to {@link Mapper#find}. + * @param {object} [opts] Passed to {@link Mapper#find}. * @param {boolean} [opts.force] Bypass cacheFind * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind} * @returns {Promise} Resolves with the result, if any. @@ -12730,12 +12786,12 @@ var props$2 = { * function onBeforeFindAll (mapperName, query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback SimpleStore~beforeFindAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. * @see SimpleStore#event:beforeFindAll * @see SimpleStore#findAll * @since 3.0.0 @@ -12755,13 +12811,13 @@ var props$2 = { * function onAfterFindAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback SimpleStore~afterFindAllListener * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}. * @see SimpleStore#event:afterFindAll * @see SimpleStore#findAll * @since 3.0.0 @@ -12770,29 +12826,29 @@ var props$2 = { * Wrapper for {@link Mapper#findAll}. Adds any found records to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('movie') + * store.defineMapper('movie'); * * // Since this example uses the http adapter, we'll get something like: * // * // GET /movie?rating=PG * store.find('movie', { rating: 'PG' }).then((movies) => { * // The movie records are now in the in-memory store - * console.log(store.filter('movie')) - * }) + * console.log(store.filter('movie')); + * }); * * @fires SimpleStore#beforeFindAll * @fires SimpleStore#afterFindAll * @fires SimpleStore#add * @method SimpleStore#findAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] Passed to {@link Mapper.findAll}. - * @param {Object} [opts] Passed to {@link Mapper.findAll}. + * @param {object} [query] Passed to {@link Mapper.findAll}. + * @param {object} [opts] Passed to {@link Mapper.findAll}. * @param {boolean} [opts.force] Bypass cacheFindAll * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll} * @returns {Promise} Resolves with the result, if any. @@ -12861,7 +12917,7 @@ var props$2 = { * @method SimpleStore#hashQuery * @param {string} name The `name` argument passed to {@link SimpleStore#find} * or {@link SimpleStore#findAll}. - * @param {Object} query The `query` argument passed to {@link SimpleStore#find} + * @param {object} query The `query` argument passed to {@link SimpleStore#find} * or {@link SimpleStore#findAll}. * @returns {string} The JSONified `query`. * @since 3.0.0 @@ -12880,24 +12936,23 @@ var props$2 = { * {@link Record} from the store. * * @example SimpleStore#remove - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * store.defineMapper('book') - * console.log(store.getAll('book').length) - * store.add('book', { id: 1234 }) - * console.log(store.getAll('book').length) - * store.remove('book', 1234) - * console.log(store.getAll('book').length) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * store.defineMapper('book'); + * console.log(store.getAll('book').length); + * store.add('book', { id: 1234 }); + * console.log(store.getAll('book').length); + * store.remove('book', 1234); + * console.log(store.getAll('book').length); * * @fires SimpleStore#remove * @method SimpleStore#remove * @param {string} name The name of the {@link Collection} to target. * @param {string|number} id The primary key of the {@link Record} to remove. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record} to also * remove from the store. * @returns {Record} The removed {@link Record}, if any. @@ -12919,28 +12974,27 @@ var props$2 = { * {@link Record}s from the store. * * @example SimpleStore#removeAll - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * store.defineMapper('movie') - * console.log(store.getAll('movie').length) - * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' }) - * console.log(store.getAll('movie').length) - * store.removeAll('movie', { rating: 'R' }) - * console.log(store.getAll('movie').length) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * store.defineMapper('movie'); + * console.log(store.getAll('movie').length); + * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' }); + * console.log(store.getAll('movie').length); + * store.removeAll('movie', { rating: 'R' }); + * console.log(store.getAll('movie').length); * * @fires SimpleStore#remove * @method SimpleStore#removeAll * @param {string} name The name of the {@link Collection} to target. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record} to also * remove from the store. * @returns {Record} The removed {@link Record}s, if any. @@ -12971,7 +13025,7 @@ var props$2 = { * @param {string} name The name of the {@link Collection} to target. * @param {Record|Record[]} records {@link Record}s whose relations are to be * removed. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove * from the store. * @since 3.0.0 @@ -13035,13 +13089,13 @@ var props$2 = { * function onBeforeUpdate (mapperName, id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback SimpleStore~beforeUpdateListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. * @see SimpleStore#event:beforeUpdate * @see SimpleStore#update * @since 3.0.0 @@ -13061,14 +13115,14 @@ var props$2 = { * function onAfterUpdate (mapperName, id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback SimpleStore~afterUpdateListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}. * @see SimpleStore#event:afterUpdate * @see SimpleStore#update * @since 3.0.0 @@ -13078,21 +13132,21 @@ var props$2 = { * store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // * // PUT /post/1234 {"status":"published"} * store.update('post', 1, { status: 'published' }).then((post) => { * // The post record has also been updated in the in-memory store - * console.log(store.get('post', 1234)) - * }) + * console.log(store.get('post', 1234)); + * }); * * @fires SimpleStore#beforeUpdate * @fires SimpleStore#afterUpdate @@ -13100,8 +13154,8 @@ var props$2 = { * @method SimpleStore#update * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#update}. - * @param {Object} record Passed to {@link Mapper#update}. - * @param {Object} [opts] Passed to {@link Mapper#update}. See + * @param {object} record Passed to {@link Mapper#update}. + * @param {object} [opts] Passed to {@link Mapper#update}. See * {@link Mapper#update} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13131,13 +13185,13 @@ var props$2 = { * function onBeforeUpdateAll (mapperName, props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback SimpleStore~beforeUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see SimpleStore#event:beforeUpdateAll * @see SimpleStore#updateAll * @since 3.0.0 @@ -13157,14 +13211,14 @@ var props$2 = { * function onAfterUpdateAll (mapperName, props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback SimpleStore~afterUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see SimpleStore#event:afterUpdateAll * @see SimpleStore#updateAll * @since 3.0.0 @@ -13174,30 +13228,30 @@ var props$2 = { * the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // * // PUT /post?author_id=1234 {"status":"published"} * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => { * // The post records have also been updated in the in-memory store - * console.log(store.filter('posts', { author_id: 1234 })) - * }) + * console.log(store.filter('posts', { author_id: 1234 })); + * }); * * @fires SimpleStore#beforeUpdateAll * @fires SimpleStore#afterUpdateAll * @fires SimpleStore#add * @method SimpleStore#updateAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} props Passed to {@link Mapper#updateAll}. - * @param {Object} [query] Passed to {@link Mapper#updateAll}. - * @param {Object} [opts] Passed to {@link Mapper#updateAll}. See + * @param {object} props Passed to {@link Mapper#updateAll}. + * @param {object} [query] Passed to {@link Mapper#updateAll}. + * @param {object} [opts] Passed to {@link Mapper#updateAll}. See * {@link Mapper#updateAll} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13227,12 +13281,12 @@ var props$2 = { * function onBeforeUpdateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback SimpleStore~beforeUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see SimpleStore#event:beforeUpdateMany * @see SimpleStore#updateMany * @since 3.0.0 @@ -13252,13 +13306,13 @@ var props$2 = { * function onAfterUpdateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback SimpleStore~afterUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see SimpleStore#event:afterUpdateMany * @see SimpleStore#updateMany * @since 3.0.0 @@ -13268,13 +13322,13 @@ var props$2 = { * the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -13284,8 +13338,8 @@ var props$2 = { * { id: 4, status: 'published' } * ]).then((posts) => { * // The post records have also been updated in the in-memory store - * console.log(store.getAll('post', 3, 4)) - * }) + * console.log(store.getAll('post', 3, 4)); + * }); * * @fires SimpleStore#beforeUpdateMany * @fires SimpleStore#afterUpdateMany @@ -13293,7 +13347,7 @@ var props$2 = { * @method SimpleStore#updateMany * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}. - * @param {Object} [opts] Passed to {@link Mapper#updateMany}. See + * @param {object} [opts] Passed to {@link Mapper#updateMany}. See * {@link Mapper#updateMany} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13337,12 +13391,12 @@ var SimpleStore$1 = Container.extend(props$2); * function onChange (mapperName, record, changes) { * // do something * } - * store.on('change', onChange) + * store.on('change', onChange); * * @callback SimpleStore~changeListener * @param {string} name The name of the associated {@link Mapper}. * @param {Record} record The Record that changed. - * @param {Object} changes The changes. + * @param {object} changes The changes. * @see SimpleStore#event:change * @since 3.0.0 */ @@ -13371,7 +13425,7 @@ var SimpleStore$1 = Container.extend(props$2); * function onAdd (mapperName, recordOrRecords) { * // do something * } - * store.on('add', onAdd) + * store.on('add', onAdd); * * @callback SimpleStore~addListener * @param {string} name The name of the associated {@link Mapper}. @@ -13409,7 +13463,7 @@ var SimpleStore$1 = Container.extend(props$2); * function onRemove (mapperName, recordsOrRecords) { * // do something * } - * store.on('remove', onRemove) + * store.on('remove', onRemove); * * @callback SimpleStore~removeListener * @param {string} name The name of the associated {@link Mapper}. @@ -13426,29 +13480,28 @@ var SimpleStore$1 = Container.extend(props$2); /** * Create a subclass of this SimpleStore: * @example SimpleStore.extend - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSimpleStoreClass extends SimpleStore { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSimpleStore = new CustomSimpleStoreClass() - * console.log(customSimpleStore.foo()) - * console.log(CustomSimpleStoreClass.beep()) + * const customSimpleStore = new CustomSimpleStoreClass(); + * console.log(customSimpleStore.foo()); + * console.log(CustomSimpleStoreClass.beep()); * * // Extend the class using alternate method. * const OtherSimpleStoreClass = SimpleStore.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const otherSimpleStore = new OtherSimpleStoreClass() - * console.log(otherSimpleStore.foo()) - * console.log(OtherSimpleStoreClass.beep()) + * const otherSimpleStore = new OtherSimpleStoreClass(); + * console.log(otherSimpleStore.foo()); + * console.log(OtherSimpleStoreClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSimpleStoreClass () { @@ -13457,21 +13510,21 @@ var SimpleStore$1 = Container.extend(props$2); * } * SimpleStore.extend({ * constructor: AnotherSimpleStoreClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherSimpleStore = new AnotherSimpleStoreClass() - * console.log(anotherSimpleStore.created_at) - * console.log(anotherSimpleStore.foo()) - * console.log(AnotherSimpleStoreClass.beep()) + * const anotherSimpleStore = new AnotherSimpleStoreClass(); + * console.log(anotherSimpleStore.created_at); + * console.log(anotherSimpleStore.foo()); + * console.log(AnotherSimpleStoreClass.beep()); * * @method SimpleStore.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this SimpleStore class. * @since 3.0.0 */ @@ -13488,9 +13541,9 @@ var DOMAIN$9 = 'LinkedCollection'; * * @class LinkedCollection * @extends Collection - * @param {Array} [records] Initial set of records to insert into the + * @param {array} [records] Initial set of records to insert into the * collection. See {@link Collection}. - * @param {Object} [opts] Configuration options. See {@link Collection}. + * @param {object} [opts] Configuration options. See {@link Collection}. * @returns {Mapper} */ function LinkedCollection(records, opts) { @@ -13604,52 +13657,51 @@ var LinkedCollection$1 = Collection$1.extend({ * Create a subclass of this LinkedCollection: * * @example LinkedCollection.extend - * // Normally you would do: import {LinkedCollection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {LinkedCollection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { LinkedCollection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomLinkedCollectionClass extends LinkedCollection { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customLinkedCollection = new CustomLinkedCollectionClass() - * console.log(customLinkedCollection.foo()) - * console.log(CustomLinkedCollectionClass.beep()) + * const customLinkedCollection = new CustomLinkedCollectionClass(); + * console.log(customLinkedCollection.foo()); + * console.log(CustomLinkedCollectionClass.beep()); * * // Extend the class using alternate method. * const OtherLinkedCollectionClass = LinkedCollection.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherLinkedCollection = new OtherLinkedCollectionClass() - * console.log(otherLinkedCollection.foo()) - * console.log(OtherLinkedCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherLinkedCollection = new OtherLinkedCollectionClass(); + * console.log(otherLinkedCollection.foo()); + * console.log(OtherLinkedCollectionClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherLinkedCollectionClass () { - * LinkedCollection.call(this) - * this.created_at = new Date().getTime() + * LinkedCollection.call(this); + * this.created_at = new Date().getTime(); * } * LinkedCollection.extend({ * constructor: AnotherLinkedCollectionClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherLinkedCollection = new AnotherLinkedCollectionClass() - * console.log(anotherLinkedCollection.created_at) - * console.log(anotherLinkedCollection.foo()) - * console.log(AnotherLinkedCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherLinkedCollection = new AnotherLinkedCollectionClass(); + * console.log(anotherLinkedCollection.created_at); + * console.log(anotherLinkedCollection.foo()); + * console.log(AnotherLinkedCollectionClass.beep()); * * @method LinkedCollection.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this LinkedCollection class. * @since 3.0.0 */ @@ -13672,37 +13724,37 @@ var DATASTORE_DEFAULTS = { * {@link LinkedCollection} class to link related records together in memory. * * ```javascript - * import {DataStore} from 'js-data' + * import { DataStore } from 'js-data'; * ``` * * @example - * import {DataStore} from 'js-data' - * import HttpAdapter from 'js-data-http' - * const store = new DataStore() + * import { DataStore } from 'js-data'; + * import HttpAdapter from 'js-data-http'; + * const store = new DataStore(); * * // DataStore#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') + * const UserMapper = store.defineMapper('user'); * * // DataStore#as returns the store scoped to a particular Mapper. - * const UserStore = store.as('user') + * const UserStore = store.as('user'); * * // Call "find" on "UserMapper" (Stateless ORM) * UserMapper.find(1).then((user) => { * // retrieved a "user" record via the http adapter, but that's it * * // Call "find" on "store" targeting "user" (Stateful DataStore) - * return store.find('user', 1) // same as "UserStore.find(1)" + * return store.find('user', 1); // same as "UserStore.find(1)" * }).then((user) => { * // not only was a "user" record retrieved, but it was added to the * // store's "user" collection - * const cachedUser = store.getCollection('user').get(1) - * console.log(user === cachedUser) // true - * }) + * const cachedUser = store.getCollection('user').get(1); + * console.log(user === cachedUser); // true + * }); * * @class DataStore * @extends SimpleStore - * @param {Object} [opts] Configuration options. See {@link SimpleStore}. + * @param {object} [opts] Configuration options. See {@link SimpleStore}. * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}. @@ -14169,52 +14221,51 @@ var DataStore$1 = SimpleStore$1.extend(props$1); /** * Create a subclass of this DataStore: * @example DataStore.extend - * // Normally you would do: import {DataStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {DataStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomDataStoreClass extends DataStore { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customDataStore = new CustomDataStoreClass() - * console.log(customDataStore.foo()) - * console.log(CustomDataStoreClass.beep()) + * const customDataStore = new CustomDataStoreClass(); + * console.log(customDataStore.foo()); + * console.log(CustomDataStoreClass.beep()); * * // Extend the class using alternate method. * const OtherDataStoreClass = DataStore.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherDataStore = new OtherDataStoreClass() - * console.log(otherDataStore.foo()) - * console.log(OtherDataStoreClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherDataStore = new OtherDataStoreClass(); + * console.log(otherDataStore.foo()); + * console.log(OtherDataStoreClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherDataStoreClass () { - * DataStore.call(this) - * this.created_at = new Date().getTime() + * DataStore.call(this); + * this.created_at = new Date().getTime(); * } * DataStore.extend({ * constructor: AnotherDataStoreClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherDataStore = new AnotherDataStoreClass() - * console.log(anotherDataStore.created_at) - * console.log(anotherDataStore.foo()) - * console.log(AnotherDataStoreClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherDataStore = new AnotherDataStoreClass(); + * console.log(anotherDataStore.created_at); + * console.log(anotherDataStore.foo()); + * console.log(AnotherDataStoreClass.beep()); * * @method DataStore.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this DataStore class. * @since 3.0.0 */ @@ -14244,15 +14295,15 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * @example Load into your app via ES2015 Modules * import * as JSData from 'js-data'; * @example Load into your app via AMD - * define('myApp', ['js-data'], function (JSData) { ... }) + * define('myApp', ['js-data'], function (JSData) { ... }); */ /** * JSData's utility methods. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('foo')) // true + * import { utils } from 'js-data'; + * console.log(utils.isString('foo')); // true * * @name module:js-data.utils * @property {Function} Promise See {@link utils.Promise}. @@ -14264,8 +14315,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Collection} class. * * @example - * import {Collection} from 'js-data' - * const collection = new Collection() + * import { Collection } from 'js-data'; + * const collection = new Collection(); * * @name module:js-data.Collection * @see Collection @@ -14278,11 +14329,11 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * class. * * @example - * import {Component} from 'js-data' + * import { Component } from 'js-data'; * // Make a custom component. * const MyComponent = Component.extend({ * myMethod (someArg) { ... } - * }) + * }); * * @name module:js-data.Component * @see Component @@ -14295,8 +14346,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * {@link DataStore} instead. * * @example - * import {Container} from 'js-data' - * const store = new Container() + * import { Container } from 'js-data'; + * const store = new Container(); * * @name module:js-data.Container * @see Container @@ -14309,8 +14360,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Node.js you probably want to use {@link Container} instead. * * @example - * import {DataStore} from 'js-data' - * const store = new DataStore() + * import { DataStore } from 'js-data'; + * const store = new DataStore(); * * @name module:js-data.DataStore * @see DataStore @@ -14341,13 +14392,13 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Mapper} class. The core of the ORM. * * @example Recommended use - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); * * @example Create Mapper manually - * import {Mapper} from 'js-data' - * const UserMapper = new Mapper({ name: 'user' }) + * import { Mapper } from 'js-data'; + * const UserMapper = new Mapper({ name: 'user' }); * * @name module:js-data.Mapper * @see Container @@ -14369,10 +14420,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Record} class. * * @example - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); * * @name module:js-data.Record * @see Record @@ -14384,17 +14435,17 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04. * * @example - * import {Container, Schema} from 'js-data' + * import { Container, Schema } from 'js-data'; * const userSchema = new Schema({ * properties: { * id: { type: 'string' }, * name: { type: 'string' } * } - * }) - * const store = new Container() + * }); + * const store = new Container(); * store.defineMapper('user', { * schema: userSchema - * }) + * }); * * @name module:js-data.Schema * @see Schema @@ -14408,10 +14459,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Settable} class. * * @example - * import {Settable} from 'js-data' - * const obj = new Settable() - * obj.set('secret', 'value') - * console.log(JSON.stringify(obj)) // {} + * import { Settable } from 'js-data'; + * const obj = new Settable(); + * obj.set('secret', 'value'); + * console.log(JSON.stringify(obj)); // {} * * @name module:js-data.Settable * @see Settable @@ -14423,8 +14474,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Node.js you probably want to use {@link Container} instead. * * @example - * import {SimpleStore} from 'js-data' - * const store = new SimpleStore() + * import { SimpleStore } from 'js-data'; + * const store = new SimpleStore(); * * @name module:js-data.SimpleStore * @see SimpleStore @@ -14436,7 +14487,7 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Describes the version of this `JSData` object. * * @example - * console.log(JSData.version.full) // "3.0.0-beta.1" + * console.log(JSData.version.full); // "3.0.0-beta.1" * * @name version * @memberof module:js-data @@ -14452,10 +14503,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * @type {Object} */ var version = { - full: '3.0.1', + full: '3.0.2', major: 3, minor: 0, - patch: 1 + patch: 2 }; export { version, Collection$1 as Collection, Component$1 as Component, Container, DataStore$1 as DataStore, Index, LinkedCollection$1 as LinkedCollection, Mapper$1 as Mapper, Query$1 as Query, Record$1 as Record, Schema$1 as Schema, Settable, SimpleStore$1 as SimpleStore, utils, belongsTo, hasMany, hasOne, belongsToType, hasManyType, hasOneType }; diff --git a/dist/js-data.es2015.js.map b/dist/js-data.es2015.js.map index 12ad6517..a74061e6 100644 --- a/dist/js-data.es2015.js.map +++ b/dist/js-data.es2015.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data.es2015.js","sources":["../src/utils.js","../src/Settable.js","../src/Component.js","../src/Query.js","../src/Relation.js","../src/Relation/BelongsTo.js","../src/Relation/HasMany.js","../src/Relation/HasOne.js","../src/relations.js","../src/decorators.js","../src/Record.js","../lib/mindex/_utils.js","../lib/mindex/index.js","../src/Collection.js","../src/Schema.js","../src/Mapper.js","../src/Container.js","../src/SimpleStore.js","../src/LinkedCollection.js","../src/DataStore.js","../src/index.js"],"sourcesContent":["/**\n * Utility methods used by JSData.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('foo')) // true\n *\n * @namespace utils\n * @type {Object}\n */\n\nconst DOMAIN = 'utils'\n\nconst INFINITY = 1 / 0\nconst MAX_INTEGER = 1.7976931348623157e+308\nconst BOOL_TAG = '[object Boolean]'\nconst DATE_TAG = '[object Date]'\nconst FUNC_TAG = '[object Function]'\nconst NUMBER_TAG = '[object Number]'\nconst OBJECT_TAG = '[object Object]'\nconst REGEXP_TAG = '[object RegExp]'\nconst STRING_TAG = '[object String]'\nconst objToString = Object.prototype.toString\nconst PATH = /^(.+)\\.(.+)$/\n\nconst ERRORS = {\n '400' () { return `expected: ${arguments[0]}, found: ${arguments[2] ? arguments[1] : typeof arguments[1]}` },\n '404' () { return `${arguments[0]} not found` }\n}\n\nconst toInteger = function (value) {\n if (!value) {\n return 0\n }\n // Coerce to number\n value = +value\n if (value === INFINITY || value === -INFINITY) {\n const sign = (value < 0 ? -1 : 1)\n return sign * MAX_INTEGER\n }\n const remainder = value % 1\n return value === value ? (remainder ? value - remainder : value) : 0 // eslint-disable-line\n}\n\nconst toStr = function (value) {\n return objToString.call(value)\n}\n\nconst isPlainObject = function (value) {\n return (!!value && typeof value === 'object' && value.constructor === Object)\n}\n\nconst mkdirP = function (object, path) {\n if (!path) {\n return object\n }\n const parts = path.split('.')\n parts.forEach(function (key) {\n if (!object[key]) {\n object[key] = {}\n }\n object = object[key]\n })\n return object\n}\n\nconst utils = {\n /**\n * Reference to the Promise constructor used by JSData. Defaults to\n * `window.Promise` or `global.Promise`.\n *\n * @example Make JSData use a different `Promise` constructor\n * import Promise from 'bluebird'\n * import {utils} from 'js-data'\n * utils.Promise = Promise\n *\n * @name utils.Promise\n * @since 3.0.0\n * @type {Function}\n */\n Promise: Promise,\n\n /**\n * Shallow copy properties that meet the following criteria from `src` to\n * `dest`:\n *\n * - own enumerable\n * - not a function\n * - does not start with \"_\"\n *\n * @method utils._\n * @param {Object} dest Destination object.\n * @param {Object} src Source object.\n * @private\n * @since 3.0.0\n */\n _ (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (key && dest[key] === undefined && !utils.isFunction(value) && key.indexOf('_') !== 0) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Recursively iterates over relations found in `opts.with`.\n *\n * @method utils._forRelation\n * @param {Object} opts Configuration options.\n * @param {Relation} def Relation definition.\n * @param {Function} fn Callback function.\n * @param {*} [thisArg] Execution context for the callback function.\n * @private\n * @since 3.0.0\n */\n _forRelation (opts, def, fn, thisArg) {\n const relationName = def.relation\n let containedName = null\n let index\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n if ((index = utils._getIndex(opts.with, relationName)) >= 0) {\n containedName = relationName\n } else if ((index = utils._getIndex(opts.with, def.localField)) >= 0) {\n containedName = def.localField\n }\n\n if (opts.withAll) {\n fn.call(thisArg, def, {})\n return\n } else if (!containedName) {\n return\n }\n let optsCopy = {}\n utils.fillIn(optsCopy, def.getRelation())\n utils.fillIn(optsCopy, opts)\n optsCopy.with = opts.with.slice()\n optsCopy._activeWith = optsCopy.with.splice(index, 1)[0]\n optsCopy.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n optsCopy.with[i] = relation.substr(containedName.length + 1)\n } else {\n optsCopy.with[i] = ''\n }\n })\n fn.call(thisArg, def, optsCopy)\n },\n\n /**\n * Find the index of a relation in the given list\n *\n * @method utils._getIndex\n * @param {string[]} list List to search.\n * @param {string} relation Relation to find.\n * @private\n * @returns {number}\n */\n _getIndex (list, relation) {\n let index = -1\n list.forEach(function (_relation, i) {\n if (_relation === relation) {\n index = i\n return false\n } else if (utils.isObject(_relation)) {\n if (_relation.relation === relation) {\n index = i\n return false\n }\n }\n })\n return index\n },\n\n /**\n * Define hidden (non-enumerable), writable properties on `target` from the\n * provided `props`.\n *\n * @example\n * import {utils} from 'js-data'\n * function Cat () {}\n * utils.addHiddenPropsToTarget(Cat.prototype, {\n * say () {\n * console.log('meow')\n * }\n * })\n * const cat = new Cat()\n * cat.say() // \"meow\"\n *\n * @method utils.addHiddenPropsToTarget\n * @param {Object} target That to which `props` should be added.\n * @param {Object} props Properties to be added to `target`.\n * @since 3.0.0\n */\n addHiddenPropsToTarget (target, props) {\n const map = {}\n Object.keys(props).forEach(function (propName) {\n const descriptor = Object.getOwnPropertyDescriptor(props, propName)\n\n descriptor.enumerable = false\n map[propName] = descriptor\n })\n Object.defineProperties(target, map)\n },\n\n /**\n * Return whether the two objects are deeply different.\n *\n * @example\n * import {utils} from 'js-data'\n * utils.areDifferent({}, {}) // false\n * utils.areDifferent({ a: 1 }, { a: 1 }) // false\n * utils.areDifferent({ foo: 'bar' }, {}) // true\n *\n * @method utils.areDifferent\n * @param {Object} a Base object.\n * @param {Object} b Comparison object.\n * @param {Object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Whether the two objects are deeply different.\n * @see utils.diffObjects\n * @since 3.0.0\n */\n areDifferent (newObject, oldObject, opts) {\n opts || (opts = {})\n const diff = utils.diffObjects(newObject, oldObject, opts)\n const diffCount = Object.keys(diff.added).length +\n Object.keys(diff.removed).length +\n Object.keys(diff.changed).length\n return diffCount > 0\n },\n\n /**\n * Verified that the given constructor is being invoked via `new`, as opposed\n * to just being called like a normal function.\n *\n * @example\n * import {utils} from 'js-data'\n * function Cat () {\n * utils.classCallCheck(this, Cat)\n * }\n * const cat = new Cat() // this is ok\n * Cat() // this throws an error\n *\n * @method utils.classCallCheck\n * @param {*} instance Instance that is being constructed.\n * @param {Constructor} ctor Constructor function used to construct the\n * instance.\n * @since 3.0.0\n * @throws {Error} Throws an error if the constructor is being improperly\n * invoked.\n */\n classCallCheck (instance, ctor) {\n if (!(instance instanceof ctor)) {\n throw utils.err(`${ctor.name}`)(500, 'Cannot call a class as a function')\n }\n },\n\n /**\n * Deep copy a value.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' } }\n * const b = utils.copy(a)\n * a === b // false\n * utils.areDifferent(a, b) // false\n *\n * @param {*} from Value to deep copy.\n * @param {*} [to] Destination object for the copy operation.\n * @param {*} [stackFrom] For internal use.\n * @param {*} [stackTo] For internal use.\n * @param {string[]|RegExp[]} [blacklist] List of strings or RegExp of\n * properties to skip.\n * @param {boolean} [plain] Whether to make a plain copy (don't try to use\n * original prototype).\n * @returns {*} Deep copy of `from`.\n * @since 3.0.0\n */\n copy (from, to, stackFrom, stackTo, blacklist, plain) {\n if (!to) {\n to = from\n if (from) {\n if (utils.isArray(from)) {\n to = utils.copy(from, [], stackFrom, stackTo, blacklist, plain)\n } else if (utils.isDate(from)) {\n to = new Date(from.getTime())\n } else if (utils.isRegExp(from)) {\n to = new RegExp(from.source, from.toString().match(/[^/]*$/)[0])\n to.lastIndex = from.lastIndex\n } else if (utils.isObject(from)) {\n if (plain) {\n to = utils.copy(from, {}, stackFrom, stackTo, blacklist, plain)\n } else {\n to = utils.copy(from, Object.create(Object.getPrototypeOf(from)), stackFrom, stackTo, blacklist, plain)\n }\n }\n }\n } else {\n if (from === to) {\n throw utils.err(`${DOMAIN}.copy`)(500, 'Cannot copy! Source and destination are identical.')\n }\n\n stackFrom = stackFrom || []\n stackTo = stackTo || []\n\n if (utils.isObject(from)) {\n let index = stackFrom.indexOf(from)\n if (index !== -1) {\n return stackTo[index]\n }\n\n stackFrom.push(from)\n stackTo.push(to)\n }\n\n let result\n if (utils.isArray(from)) {\n let i\n to.length = 0\n for (i = 0; i < from.length; i++) {\n result = utils.copy(from[i], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[i])) {\n stackFrom.push(from[i])\n stackTo.push(result)\n }\n to.push(result)\n }\n } else {\n if (utils.isArray(to)) {\n to.length = 0\n } else {\n utils.forOwn(to, function (value, key) {\n delete to[key]\n })\n }\n for (var key in from) {\n if (from.hasOwnProperty(key)) {\n if (utils.isBlacklisted(key, blacklist)) {\n continue\n }\n result = utils.copy(from[key], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[key])) {\n stackFrom.push(from[key])\n stackTo.push(result)\n }\n to[key] = result\n }\n }\n }\n }\n return to\n },\n\n /**\n * Recursively shallow fill in own enumerable properties from `source` to\n * `dest`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.deepFillIn(b, a)\n * console.log(b) // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"bip\"}\n *\n * @method utils.deepFillIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.fillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n deepFillIn (dest, source) {\n if (source) {\n utils.forOwn(source, function (value, key) {\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepFillIn(existing, value)\n } else if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n }\n return dest\n },\n\n /**\n * Recursively shallow copy enumerable properties from `source` to `dest`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.deepFillIn(b, a)\n * console.log(b) // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"boop\"}\n *\n * @method utils.deepMixIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.fillIn\n * @see utils.deepFillIn\n * @since 3.0.0\n */\n deepMixIn (dest, source) {\n if (source) {\n for (var key in source) {\n const value = source[key]\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepMixIn(existing, value)\n } else {\n dest[key] = value\n }\n }\n }\n return dest\n },\n\n /**\n * Return a diff of the base object to the comparison object.\n *\n * @example\n * import {utils} from 'js-data'\n * const oldObject = { foo: 'bar', a: 1234 }\n * const newObject = { beep: 'boop', a: 5678 }\n * const diff = utils.diffObjects(oldObject, newObject)\n * console.log(diff.added) // {\"beep\":\"boop\"}\n * console.log(diff.changed) // {\"a\":5678}\n * console.log(diff.removed) // {\"foo\":undefined}\n *\n * @method utils.diffObjects\n * @param {Object} newObject Comparison object.\n * @param {Object} oldObject Base object.\n * @param {Object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} The diff from the base object to the comparison object.\n * @see utils.areDifferent\n * @since 3.0.0\n */\n diffObjects (newObject, oldObject, opts) {\n opts || (opts = {})\n let equalsFn = opts.equalsFn\n let blacklist = opts.ignore\n const diff = {\n added: {},\n changed: {},\n removed: {}\n }\n if (!utils.isFunction(equalsFn)) {\n equalsFn = utils.deepEqual\n }\n\n const newKeys = Object.keys(newObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n const oldKeys = Object.keys(oldObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n\n // Check for properties that were added or changed\n newKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (equalsFn(oldValue, newValue)) {\n return\n }\n if (oldValue === undefined) {\n diff.added[key] = newValue\n } else {\n diff.changed[key] = newValue\n }\n })\n\n // Check for properties that were removed\n oldKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (newValue === undefined && oldValue !== undefined) {\n diff.removed[key] = undefined\n }\n })\n\n return diff\n },\n\n /**\n * Return whether the two values are equal according to the `==` operator.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.equal(1,1)) // true\n * console.log(utils.equal(1,'1')) // true\n * console.log(utils.equal(93, 66)) // false\n *\n * @method utils.equal\n * @param {*} a First value in the comparison.\n * @param {*} b Second value in the comparison.\n * @returns {boolean} Whether the two values are equal according to `==`.\n * @since 3.0.0\n */\n equal (a, b) {\n return a == b // eslint-disable-line\n },\n\n /**\n * Produce a factory function for making Error objects with the provided\n * metadata. Used throughout the various js-data components.\n *\n * @example\n * import {utils} from 'js-data'\n * const errorFactory = utils.err('domain', 'target')\n * const error400 = errorFactory(400, 'expected type', 'actual type')\n * console.log(error400) // [Error: [domain:target] expected: expected type, found: string\nhttp://www.js-data.io/v3.0/docs/errors#400]\n * @method utils.err\n * @param {string} domain Namespace.\n * @param {string} target Target.\n * @returns {Function} Factory function.\n * @since 3.0.0\n */\n err (domain, target) {\n return function (code) {\n const prefix = `[${domain}:${target}] `\n let message = ERRORS[code].apply(null, Array.prototype.slice.call(arguments, 1))\n message = `${prefix}${message}\nhttp://www.js-data.io/v3.0/docs/errors#${code}`\n return new Error(message)\n }\n },\n\n /**\n * Add eventing capabilities into the target object.\n *\n * @example\n * import {utils} from 'js-data'\n * const user = { name: 'John' }\n * utils.eventify(user)\n * user.on('foo', () => console.log(arguments))\n * user.emit('foo', 1, 'bar') // should log to console values (1, \"bar\")\n *\n * @method utils.eventify\n * @param {Object} target Target object.\n * @param {Function} [getter] Custom getter for retrieving the object's event\n * listeners.\n * @param {Function} [setter] Custom setter for setting the object's event\n * listeners.\n * @since 3.0.0\n */\n eventify (target, getter, setter) {\n target = target || this\n let _events = {}\n if (!getter && !setter) {\n getter = function () { return _events }\n setter = function (value) { _events = value }\n }\n Object.defineProperties(target, {\n emit: {\n value (...args) {\n const events = getter.call(this) || {}\n const type = args.shift()\n let listeners = events[type] || []\n let i\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n listeners = events.all || []\n args.unshift(type)\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n }\n },\n off: {\n value (type, func) {\n const events = getter.call(this)\n const listeners = events[type]\n if (!listeners) {\n setter.call(this, {})\n } else if (func) {\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i].f === func) {\n listeners.splice(i, 1)\n break\n }\n }\n } else {\n listeners.splice(0, listeners.length)\n }\n }\n },\n on: {\n value (type, func, thisArg) {\n if (!getter.call(this)) {\n setter.call(this, {})\n }\n const events = getter.call(this)\n events[type] = events[type] || []\n events[type].push({\n c: thisArg,\n f: func\n })\n }\n }\n })\n },\n\n /**\n * Used for sublcassing. Invoke this method in the context of a superclass to\n * to produce a subclass based on `props` and `classProps`.\n *\n * @example\n * import {utils} from 'js-data'\n * function Animal () {}\n * Animal.extend = utils.extend\n * const Cat = Animal.extend({\n * say () {\n * console.log('meow')\n * }\n * })\n * const cat = new Cat()\n * cat instanceof Animal // true\n * cat instanceof Cat // true\n * cat.say() // \"meow\"\n *\n * @method utils.extend\n * @param {Object} props Instance properties for the subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to use as the subclass.\n * @param {Object} props Static properties for the subclass.\n * @returns {Constructor} A new subclass.\n * @since 3.0.0\n */\n extend (props, classProps) {\n const superClass = this\n let subClass\n\n props || (props = {})\n classProps || (classProps = {})\n\n if (props.hasOwnProperty('constructor')) {\n subClass = props.constructor\n delete props.constructor\n } else {\n subClass = function (...args) {\n utils.classCallCheck(this, subClass)\n superClass.apply(this, args)\n }\n }\n\n // Setup inheritance of instance members\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n configurable: true,\n enumerable: false,\n value: subClass,\n writable: true\n }\n })\n\n const obj = Object\n // Setup inheritance of static members\n if (obj.setPrototypeOf) {\n obj.setPrototypeOf(subClass, superClass)\n } else if (classProps.strictEs6Class) {\n subClass.__proto__ = superClass // eslint-disable-line\n } else {\n utils.forOwn(superClass, function (value, key) {\n subClass[key] = value\n })\n }\n if (!subClass.hasOwnProperty('__super__')) {\n Object.defineProperty(subClass, '__super__', {\n configurable: true,\n value: superClass\n })\n }\n\n utils.addHiddenPropsToTarget(subClass.prototype, props)\n utils.fillIn(subClass, classProps)\n\n return subClass\n },\n\n /**\n * Shallow copy own enumerable properties from `src` to `dest` that are on\n * `src` but are missing from `dest.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: 'bar', beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.fillIn(b, a)\n * console.log(b) // {\"foo\":\"bar\",\"beep\":\"bip\"}\n *\n * @method utils.fillIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.deepFillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n fillIn (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Find the last index of an item in an array according to the given checker function.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = { name: 'John', age: 20 }\n * const sara = { name: 'Sara', age: 25 }\n * const dan = { name: 'Dan', age: 20 }\n * const users = [john, sara, dan]\n *\n * console.log(utils.findIndex(users, (user) => user.age === 25)) // 1\n * console.log(utils.findIndex(users, (user) => user.age > 19)) // 2\n * console.log(utils.findIndex(users, (user) => user.name === 'John')) // 0\n * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')) // -1\n *\n * @method utils.findIndex\n * @param {Array} array The array to search.\n * @param {Function} fn Checker function.\n * @returns {number} Index if found or -1 if not found.\n * @since 3.0.0\n */\n findIndex (array, fn) {\n let index = -1\n if (!array) {\n return index\n }\n array.forEach(function (record, i) {\n if (fn(record)) {\n index = i\n return false\n }\n })\n return index\n },\n\n /**\n * Recursively iterate over a {@link Mapper}'s relations according to\n * `opts.with`.\n *\n * @method utils.forEachRelation\n * @param {Mapper} mapper Mapper.\n * @param {Object} opts Configuration options.\n * @param {Function} fn Callback function.\n * @param {*} thisArg Execution context for the callback function.\n * @since 3.0.0\n */\n forEachRelation (mapper, opts, fn, thisArg) {\n const relationList = mapper.relationList || []\n if (!relationList.length) {\n return\n }\n relationList.forEach(function (def) {\n utils._forRelation(opts, def, fn, thisArg)\n })\n },\n\n /**\n * Iterate over an object's own enumerable properties.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { b: 1, c: 4 }\n * let sum = 0\n * utils.forOwn(a, function (value, key) {\n * sum += value\n * })\n * console.log(sum) // 5\n *\n * @method utils.forOwn\n * @param {Object} object The object whose properties are to be enumerated.\n * @param {Function} fn Iteration function.\n * @param {Object} [thisArg] Content to which to bind `fn`.\n * @since 3.0.0\n */\n forOwn (obj, fn, thisArg) {\n const keys = Object.keys(obj)\n const len = keys.length\n let i\n for (i = 0; i < len; i++) {\n if (fn.call(thisArg, obj[keys[i]], keys[i], obj) === false) {\n break\n }\n }\n },\n\n /**\n * Proxy for `JSON.parse`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const a = utils.fromJson('{\"name\" : \"John\"}')\n * console.log(a) // { name: 'John' }\n *\n * @method utils.fromJson\n * @param {string} json JSON to parse.\n * @returns {Object} Parsed object.\n * @see utils.toJson\n * @since 3.0.0\n */\n fromJson (json) {\n return utils.isString(json) ? JSON.parse(json) : json\n },\n\n /**\n * Retrieve the specified property from the given object. Supports retrieving\n * nested properties.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * console.log(utils.get(a, 'beep')) // \"boop\"\n * console.log(utils.get(a, 'foo.bar')) // \"baz\"\n *\n * @method utils.get\n * @param {Object} object Object from which to retrieve a property's value.\n * @param {string} prop Property to retrieve.\n * @returns {*} Value of the specified property.\n * @see utils.set\n * @since 3.0.0\n */\n 'get': function (object, prop) {\n if (!prop) {\n return\n }\n const parts = prop.split('.')\n const last = parts.pop()\n\n while (prop = parts.shift()) { // eslint-disable-line\n object = object[prop]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n return object[last]\n },\n\n /**\n * Return the superclass for the given instance or subclass. If an instance is\n * provided, then finds the parent class of the instance's constructor.\n *\n * @example\n * import {utils} from 'js-data'\n * // using ES2015 classes\n * class Foo {}\n * class Bar extends Foo {}\n * const barInstance = new Bar()\n * let baseType = utils.getSuper(barInstance)\n * console.log(Foo === baseType) // true\n *\n * // using Function constructor with utils.extend\n * function Foo () {}\n * Foo.extend = utils.extend\n * const Bar = Foo.extend()\n * const barInstance = new Bar()\n * let baseType = utils.getSuper(barInstance)\n * console.log(Foo === baseType) // true\n *\n * @method utils.getSuper\n * @param {Object|Function} instance Instance or constructor.\n * @param {boolean} [isCtor=false] Whether `instance` is a constructor.\n * @returns {Constructor} The superclass (grandparent constructor).\n * @since 3.0.0\n */\n getSuper (instance, isCtor) {\n const ctor = isCtor ? instance : instance.constructor\n if (ctor.hasOwnProperty('__super__')) {\n return ctor.__super__\n }\n return Object.getPrototypeOf(ctor) || ctor.__proto__ // eslint-disable-line\n },\n\n /**\n * Return the intersection of two arrays.\n *\n * @example\n * import {utils} from 'js-data'\n * const arrA = ['green', 'red', 'blue', 'red']\n * const arrB = ['green', 'yellow', 'red']\n * const intersected = utils.intersection(arrA, arrB)\n *\n * console.log(intersected) // ['green', 'red'])\n *\n * @method utils.intersection\n * @param {Array} array1 First array.\n * @param {Array} array2 Second array.\n * @returns {Array} Array of elements common to both arrays.\n * @since 3.0.0\n */\n intersection (array1, array2) {\n if (!array1 || !array2) {\n return []\n }\n const result = []\n let item\n let i\n const len = array1.length\n for (i = 0; i < len; i++) {\n item = array1[i]\n if (result.indexOf(item) !== -1) {\n continue\n }\n if (array2.indexOf(item) !== -1) {\n result.push(item)\n }\n }\n return result\n },\n\n /**\n * Proxy for `Array.isArray`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = [1,2,3,4,5]\n * const b = { foo: \"bar\" }\n * console.log(utils.isArray(a)) // true\n * console.log(utils.isArray(b)) // false\n *\n * @method utils.isArray\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an array.\n * @since 3.0.0\n */\n isArray: Array.isArray,\n\n /**\n * Return whether `prop` is matched by any string or regular expression in\n * `blacklist`.\n *\n * @example\n * import {utils} from 'js-data'\n * const blacklist = [/^\\$hashKey/g, /^_/g, 'id']\n * console.log(utils.isBlacklisted(\"$hashKey\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"id\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"_myProp\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"my_id\", blacklist)) // false\n *\n * @method utils.isBlacklisted\n * @param {string} prop The name of a property to check.\n * @param {Array} blacklist Array of strings and regular expressions.\n * @returns {boolean} Whether `prop` was matched.\n * @since 3.0.0\n */\n isBlacklisted (prop, blacklist) {\n if (!blacklist || !blacklist.length) {\n return false\n }\n let matches\n for (var i = 0; i < blacklist.length; i++) {\n if ((toStr(blacklist[i]) === REGEXP_TAG && blacklist[i].test(prop)) || blacklist[i] === prop) {\n matches = prop\n return !!matches\n }\n }\n return !!matches\n },\n\n /**\n * Return whether the provided value is a boolean.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = true\n * const b = { foo: \"bar\" }\n * console.log(utils.isBoolean(a)) // true\n * console.log(utils.isBoolean(b)) // false\n *\n * @method utils.isBoolean\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a boolean.\n * @since 3.0.0\n */\n isBoolean (value) {\n return toStr(value) === BOOL_TAG\n },\n\n /**\n * Return whether the provided value is a date.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = new Date()\n * const b = { foo: \"bar\" }\n * console.log(utils.isDate(a)) // true\n * console.log(utils.isDate(b)) // false\n *\n * @method utils.isDate\n * @param {*} value The value to test.\n * @returns {Date} Whether the provided value is a date.\n * @since 3.0.0\n */\n isDate (value) {\n return (value && typeof value === 'object' && toStr(value) === DATE_TAG)\n },\n\n /**\n * Return whether the provided value is a function.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = function (){ console.log('foo bar')}\n * const b = { foo: \"bar\" }\n * console.log(utils.isFunction(a)) // true\n * console.log(utils.isFunction(b)) // false\n *\n * @method utils.isFunction\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a function.\n * @since 3.0.0\n */\n isFunction (value) {\n return typeof value === 'function' || (value && toStr(value) === FUNC_TAG)\n },\n\n /**\n * Return whether the provided value is an integer.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = 1\n * const b = 1.25\n * const c = '1'\n * console.log(utils.isInteger(a)) // true\n * console.log(utils.isInteger(b)) // false\n * console.log(utils.isInteger(c)) // false\n *\n * @method utils.isInteger\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an integer.\n * @since 3.0.0\n */\n isInteger (value) {\n return toStr(value) === NUMBER_TAG && value == toInteger(value) // eslint-disable-line\n },\n\n /**\n * Return whether the provided value is `null`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = null\n * const b = { foo: \"bar\" }\n * console.log(utils.isNull(a)) // true\n * console.log(utils.isNull(b)) // false\n *\n * @method utils.isNull\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is `null`.\n * @since 3.0.0\n */\n isNull (value) {\n return value === null\n },\n\n /**\n * Return whether the provided value is a number.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = 1\n * const b = -1.25\n * const c = '1'\n * console.log(utils.isNumber(a)) // true\n * console.log(utils.isNumber(b)) // true\n * console.log(utils.isNumber(c)) // false\n *\n * @method utils.isNumber\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a number.\n * @since 3.0.0\n */\n isNumber (value) {\n const type = typeof value\n return type === 'number' || (value && type === 'object' && toStr(value) === NUMBER_TAG)\n },\n\n /**\n * Return whether the provided value is an object.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: \"bar\" }\n * const b = 'foo bar'\n * console.log(utils.isObject(a)) // true\n * console.log(utils.isObject(b)) // false\n *\n * @method utils.isObject\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an object.\n * @since 3.0.0\n */\n isObject (value) {\n return toStr(value) === OBJECT_TAG\n },\n\n /**\n * Return whether the provided value is a regular expression.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = /^\\$.+$/ig\n * const b = new RegExp('^\\$.+$', 'ig')\n * const c = { foo: \"bar\" }\n * console.log(utils.isRegExp(a)) // true\n * console.log(utils.isRegExp(b)) // true\n * console.log(utils.isRegExp(c)) // false\n *\n * @method utils.isRegExp\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a regular expression.\n * @since 3.0.0\n */\n isRegExp (value) {\n return toStr(value) === REGEXP_TAG\n },\n\n /**\n * Return whether the provided value is a string or a number.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isSorN('')) // true\n * console.log(utils.isSorN(-1.65)) // true\n * console.log(utils.isSorN('my string')) // true\n * console.log(utils.isSorN({})) // false\n * console.log(utils.isSorN([1,2,4])) // false\n *\n * @method utils.isSorN\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string or a number.\n * @since 3.0.0\n */\n isSorN (value) {\n return utils.isString(value) || utils.isNumber(value)\n },\n\n /**\n * Return whether the provided value is a string.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('')) // true\n * console.log(utils.isString('my string')) // true\n * console.log(utils.isString(100)) // false\n * console.log(utils.isString([1,2,4])) // false\n *\n * @method utils.isString\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string.\n * @since 3.0.0\n */\n isString (value) {\n return typeof value === 'string' || (value && typeof value === 'object' && toStr(value) === STRING_TAG)\n },\n\n /**\n * Return whether the provided value is a `undefined`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = undefined\n * const b = { foo: \"bar\"}\n * console.log(utils.isUndefined(a)) // true\n * console.log(utils.isUndefined(b.baz)) // true\n * console.log(utils.isUndefined(b)) // false\n * console.log(utils.isUndefined(b.foo)) // false\n *\n * @method utils.isUndefined\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a `undefined`.\n * @since 3.0.0\n */\n isUndefined (value) {\n return value === undefined\n },\n\n /**\n * Mix in logging capabilities to the target.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: \"bar\"}\n *\n * // Add standard logging to an object\n * utils.logify(a)\n * a.log('info', 'test log info') // output 'test log info' to console.\n *\n * // Toggle debug output of an object\n * a.dbg('test debug output') // does not output because debug is off.\n * a.debug = true\n * a.dbg('test debug output') // output 'test debug output' to console.\n *\n * @method utils.logify\n * @param {*} target The target.\n * @since 3.0.0\n */\n logify (target) {\n utils.addHiddenPropsToTarget(target, {\n dbg (...args) {\n if (utils.isFunction(this.log)) {\n this.log('debug', ...args)\n }\n },\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (${this.name || this.constructor.name})`\n if (utils.isFunction(console[level])) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n }\n })\n },\n\n /**\n * Adds the given record to the provided array only if it's not already in the\n * array.\n *\n * @example\n * import {utils} from 'js-data'\n * const colors = ['red', 'green', 'yellow']\n *\n * console.log(colors.length) // 3\n * utils.noDupeAdd(colors, 'red')\n * console.log(colors.length) // 3, red already exists\n *\n * utils.noDupeAdd(colors, 'blue')\n * console.log(colors.length) // 4, blue was added\n *\n * @method utils.noDupeAdd\n * @param {Array} array The array.\n * @param {*} record The value to add.\n * @param {Function} fn Callback function passed to {@link utils.findIndex}.\n * @since 3.0.0\n */\n noDupeAdd (array, record, fn) {\n if (!array) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index < 0) {\n array.push(record)\n }\n },\n\n /**\n * Return a shallow copy of the provided object, minus the properties\n * specified in `keys`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John', $hashKey: 1214910 }\n *\n * let b = utils.omit(a, ['$hashKey'])\n * console.log(b) // { name: 'John' }\n *\n * @method utils.omit\n * @param {Object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to skip.\n * @returns {Object} Shallow copy of `props`, minus `keys`.\n * @since 3.0.0\n */\n omit (props, keys) {\n const _props = {}\n utils.forOwn(props, function (value, key) {\n if (keys.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n },\n\n /**\n * Return a shallow copy of the provided object, but only include the\n * properties specified in `keys`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John', $hashKey: 1214910 }\n *\n * let b = utils.pick(a, ['$hashKey'])\n * console.log(b) // { $hashKey: 1214910 }\n *\n * @method utils.pick\n * @param {Object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to keep.\n * @returns {Object} Shallow copy of `props`, but only including `keys`.\n * @since 3.0.0\n */\n pick (props, keys) {\n return keys.reduce((map, key) => {\n map[key] = props[key]\n return map\n }, {})\n },\n\n /**\n * Return a plain copy of the given value.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John' }\n * let b = utils.plainCopy(a)\n * console.log(a === b) // false\n *\n * @method utils.plainCopy\n * @param {*} value The value to copy.\n * @returns {*} Plain copy of `value`.\n * @see utils.copy\n * @since 3.0.0\n */\n plainCopy (value) {\n return utils.copy(value, undefined, undefined, undefined, undefined, true)\n },\n\n /**\n * Shortcut for `utils.Promise.reject(value)`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * utils.reject(\"Testing static reject\").then(function(data) {\n * // not called\n * }).catch(function(reason) {\n * console.log(reason); // \"Testing static reject\"\n * })\n *\n * @method utils.reject\n * @param {*} [value] Value with which to reject the Promise.\n * @returns {Promise} Promise reject with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n reject (value) {\n return utils.Promise.reject(value)\n },\n\n /**\n * Remove the last item found in array according to the given checker function.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const colors = ['red', 'green', 'yellow', 'red']\n * utils.remove(colors, (color) => color === 'red')\n * console.log(colors) // ['red', 'green', 'yellow']\n *\n * @method utils.remove\n * @param {Array} array The array to search.\n * @param {Function} fn Checker function.\n */\n remove (array, fn) {\n if (!array || !array.length) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index >= 0) {\n array.splice(index, 1) // todo should this be recursive?\n }\n },\n\n /**\n * Shortcut for `utils.Promise.resolve(value)`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * utils.resolve(\"Testing static resolve\").then(function(data) {\n * console.log(data); // \"Testing static resolve\"\n * }).catch(function(reason) {\n * // not called\n * })\n *\n * @param {*} [value] Value with which to resolve the Promise.\n * @returns {Promise} Promise resolved with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n resolve (value) {\n return utils.Promise.resolve(value)\n },\n\n /**\n * Set the value at the provided key or path.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * }\n * // set value by key\n * utils.set(john, 'id', 98)\n * console.log(john.id) // 98\n *\n * // set value by path\n * utils.set(john, 'parent.id', 20)\n * console.log(john.parent.id) // 20\n *\n * // set value by path/value map\n * utils.set(john, {\n * 'id': 1098,\n * 'parent': { id: 1020 },\n * 'parent.age': '55'\n * })\n * console.log(john.id) // 1098\n * console.log(john.parent.id) // 1020\n * console.log(john.parent.age) // 55\n *\n * @method utils.set\n * @param {Object} object The object on which to set a property.\n * @param {(string|Object)} path The key or path to the property. Can also\n * pass in an object of path/value pairs, which will all be set on the target\n * object.\n * @param {*} [value] The value to set.\n */\n set: function (object, path, value) {\n if (utils.isObject(path)) {\n utils.forOwn(path, function (value, _path) {\n utils.set(object, _path, value)\n })\n } else {\n const parts = PATH.exec(path)\n if (parts) {\n mkdirP(object, parts[1])[parts[2]] = value\n } else {\n object[path] = value\n }\n }\n },\n\n /**\n * Check whether the two provided objects are deeply equal.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const objA = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * }\n *\n * const objB = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * }\n *\n * console.log(utils.deepEqual(a,b)) // true\n * objB.nested.colors.add('yellow') // make a change to a nested object's array\n * console.log(utils.deepEqual(a,b)) // false\n *\n * @method utils.deepEqual\n * @param {Object} a First object in the comparison.\n * @param {Object} b Second object in the comparison.\n * @returns {boolean} Whether the two provided objects are deeply equal.\n * @see utils.equal\n * @since 3.0.0\n */\n deepEqual (a, b) {\n if (a === b) {\n return true\n }\n let _equal = true\n if (utils.isArray(a) && utils.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n for (let i = a.length; i--;) {\n if (!utils.deepEqual(a[i], b[i])) {\n // Exit loop early\n return false\n }\n }\n } else if (utils.isObject(a) && utils.isObject(b)) {\n utils.forOwn(a, function (value, key) {\n if (!(_equal = utils.deepEqual(value, b[key]))) {\n // Exit loop early\n return false\n }\n })\n if (_equal) {\n utils.forOwn(b, function (value, key) {\n if (!(_equal = utils.deepEqual(value, a[key]))) {\n // Exit loop early\n return false\n }\n })\n }\n } else {\n return false\n }\n return _equal\n },\n\n /**\n * Proxy for `JSON.stringify`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const a = { name: 'John' }\n * let jsonVal = utils.toJson(a)\n * console.log(jsonVal) // '{\"name\" : \"John\"}'\n *\n * @method utils.toJson\n * @param {*} value Value to serialize to JSON.\n * @returns {string} JSON string.\n * @see utils.fromJson\n * @since 3.0.0\n */\n toJson: JSON.stringify,\n\n /**\n * Unset the value at the provided key or path.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * }\n *\n * utils.unset(john, age)\n * utils.unset(john, parent.age)\n *\n * console.log(john.age) // null\n * console.log(john.parent.age) // null\n *\n * @method utils.unset\n * @param {Object} object The object from which to delete the property.\n * @param {string} path The key or path to the property.\n * @see utils.set\n * @since 3.0.0\n */\n unset (object, path) {\n const parts = path.split('.')\n const last = parts.pop()\n\n while (path = parts.shift()) { // eslint-disable-line\n object = object[path]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n object[last] = undefined\n }\n}\n\nexport const safeSetProp = function (record, field, value) {\n if (record && record._set) {\n record._set(`props.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport const safeSetLink = function (record, field, value) {\n if (record && record._set) {\n record._set(`links.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport default utils\n","import utils from './utils'\n\n/**\n * A base class which gives instances private properties.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Settable.extend} for an example of using {@link Settable} as a\n * base class.\n *\n *```javascript\n * import {Settable} from 'js-data'\n * ```\n *\n * @class Settable\n * @returns {Settable} A new {@link Settable} instance.\n * @since 3.0.0\n */\nexport default function Settable () {\n const _props = {}\n Object.defineProperties(this, {\n /**\n * Get a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method Settable#_get\n * @param {string} key The property to retrieve.\n * @returns {*} The value of the property.\n * @since 3.0.0\n */\n _get: { value (key) { return utils.get(_props, key) } },\n\n /**\n * Set a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_set\n * @param {(string|Object)} key The key or path to the property. Can also\n * pass in an object of key/value pairs, which will all be set on the instance.\n * @param {*} [value] The value to set.\n * @since 3.0.0\n */\n _set: { value (key, value) { return utils.set(_props, key, value) } },\n\n /**\n * Unset a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_unset\n * @param {string} key The property to unset.\n * @since 3.0.0\n */\n _unset: { value (key) { return utils.unset(_props, key) } }\n })\n}\n\n/**\n * Create a subclass of this Settable:\n *\n * @example Settable.extend\n * // Normally you would do: import {Settable} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Settable} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSettableClass extends Settable {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSettable = new CustomSettableClass()\n * console.log(customSettable.foo())\n * console.log(CustomSettableClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSettableClass = Settable.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSettable = new OtherSettableClass()\n * console.log(otherSettable.foo())\n * console.log(OtherSettableClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSettableClass () {\n * Settable.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Settable.extend({\n * constructor: AnotherSettableClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSettable = new AnotherSettableClass()\n * console.log(anotherSettable.created_at)\n * console.log(anotherSettable.foo())\n * console.log(AnotherSettableClass.beep())\n *\n * @method Settable.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Settable class.\n * @since 3.0.0\n */\nSettable.extend = utils.extend\n","import utils from './utils'\nimport Settable from './Settable'\n\n/**\n * The base class from which all JSData components inherit some basic\n * functionality.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Component.extend} for an example of using {@link Component} as a\n * base class.\n *\n *```javascript\n * import {Component} from 'js-data'\n * ```\n *\n * @class Component\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @returns {Component} A new {@link Component} instance.\n * @since 3.0.0\n */\nfunction Component (opts) {\n Settable.call(this)\n opts || (opts = {})\n\n /**\n * Whether to enable debug-level logs for this component. Anything that\n * extends `Component` inherits this option and the corresponding logging\n * functionality.\n *\n * @example Component#debug\n * // Normally you would do: import {Component} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Component} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const component = new Component()\n * component.log('debug', 'some message') // nothing gets logged\n * // Display debug logs:\n * component.debug = true\n * component.log('debug', 'other message') // this DOES get logged\n *\n * @default false\n * @name Component#debug\n * @since 3.0.0\n * @type {boolean}\n */\n this.debug = opts.hasOwnProperty('debug') ? !!opts.debug : false\n\n /**\n * Event listeners attached to this Component. __Do not modify.__ Use\n * {@link Component#on} and {@link Component#off} instead.\n *\n * @name Component#_listeners\n * @private\n * @instance\n * @since 3.0.0\n * @type {Object}\n */\n Object.defineProperty(this, '_listeners', { value: {}, writable: true })\n}\n\nexport default Settable.extend({\n constructor: Component\n})\n\n/**\n * Create a subclass of this Component:\n *\n * @example Component.extend\n * // Normally you would do: import {Component} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Component} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomComponentClass extends Component {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customComponent = new CustomComponentClass()\n * console.log(customComponent.foo())\n * console.log(CustomComponentClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherComponentClass = Component.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherComponent = new OtherComponentClass()\n * console.log(otherComponent.foo())\n * console.log(OtherComponentClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherComponentClass () {\n * Component.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Component.extend({\n * constructor: AnotherComponentClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherComponent = new AnotherComponentClass()\n * console.log(anotherComponent.created_at)\n * console.log(anotherComponent.foo())\n * console.log(AnotherComponentClass.beep())\n *\n * @method Component.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Component class.\n * @since 3.0.0\n */\nComponent.extend = utils.extend\n\n/**\n * Log the provided values at the \"debug\" level. Debug-level logs are only\n * logged if {@link Component#debug} is `true`.\n *\n * `.dbg(...)` is shorthand for `.log('debug', ...)`.\n *\n * @method Component#dbg\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\n/**\n * Log the provided values. By default sends values to `console[level]`.\n * Debug-level logs are only logged if {@link Component#debug} is `true`.\n *\n * Will attempt to use appropriate `console` methods if they are available.\n *\n * @method Component#log\n * @param {string} level Log level.\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\nutils.logify(Component.prototype)\n\n/**\n * Register a new event listener on this Component.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a DataStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName) // \"post\"\n * console.log(props.id) // undefined\n * console.log(result.id) // 1234\n * })\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id) // 1234\n * })\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * collection.on('add', (records) => {\n * console.log(records) // [...]\n * })\n *\n * @example\n * // Listen for \"change\" events on a record\n * post.on('change', (record, changes) => {\n * console.log(changes) // { changed: { title: 'Modeling your data' } }\n * })\n * post.title = 'Modeling your data'\n *\n * @method Component#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n/**\n * Remove an event listener from this Component. If no listener is provided,\n * then all listeners for the specified event will be removed. If no event is\n * specified then all listeners for all events will be removed.\n *\n * @example\n * // Remove a particular listener for a particular event\n * collection.off('add', handler)\n *\n * @example\n * // Remove all listeners for a particular event\n * record.off('change')\n *\n * @example\n * // Remove all listeners to all events\n * store.off()\n *\n * @method Component#off\n * @param {string} [event] Name of event to unsubsribe to.\n * @param {Function} [listener] Listener to remove.\n * @since 3.0.0\n */\n/**\n * Trigger an event on this Component.\n *\n * @example Component#emit\n * // import {Collection, DataStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, DataStore} = JSData\n *\n * const collection = new Collection()\n * collection.on('foo', function (msg) {\n * console.log(msg)\n * })\n * collection.emit('foo', 'bar')\n *\n * const store = new DataStore()\n * store.on('beep', function (msg) {\n * console.log(msg)\n * })\n * store.emit('beep', 'boop')\n *\n * @method Component#emit\n * @param {string} event Name of event to emit.\n * @param {...*} [args] Arguments to pass to any listeners.\n * @since 3.0.0\n */\nutils.eventify(\n Component.prototype,\n function () {\n return this._listeners\n },\n function (value) {\n this._listeners = value\n }\n)\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Query'\nconst INDEX_ERR = 'Index inaccessible after first operation'\n\n// Reserved words used by JSData's Query Syntax\nconst reserved = {\n limit: '',\n offset: '',\n orderBy: '',\n skip: '',\n sort: '',\n where: ''\n}\n\n// Used by our JavaScript implementation of the LIKE operator\nconst escapeRegExp = /([.*+?^=!:${}()|[\\]/\\\\])/g\nconst percentRegExp = /%/g\nconst underscoreRegExp = /_/g\nconst escape = function (pattern) {\n return pattern.replace(escapeRegExp, '\\\\$1')\n}\n\n/**\n * A class used by the {@link Collection} class to build queries to be executed\n * against the collection's data. An instance of `Query` is returned by\n * {@link Collection#query}. Query instances are typically short-lived, and you\n * shouldn't have to create them yourself. Just use {@link Collection#query}.\n *\n * ```javascript\n * import {Query} from 'js-data'\n * ```\n *\n * @example\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run()\n * console.log(drafts)\n *\n * @class Query\n * @extends Component\n * @param {Collection} collection The collection on which this query operates.\n * @since 3.0.0\n */\nfunction Query (collection) {\n utils.classCallCheck(this, Query)\n\n /**\n * The {@link Collection} on which this query operates.\n *\n * @name Query#collection\n * @since 3.0.0\n * @type {Collection}\n */\n this.collection = collection\n\n /**\n * The current data result of this query.\n *\n * @name Query#data\n * @since 3.0.0\n * @type {Array}\n */\n this.data = null\n}\n\nexport default Component.extend({\n constructor: Query,\n\n _applyWhereFromObject (where) {\n const fields = []\n const ops = []\n const predicates = []\n utils.forOwn(where, (clause, field) => {\n if (!utils.isObject(clause)) {\n clause = {\n '==': clause\n }\n }\n utils.forOwn(clause, (expr, op) => {\n fields.push(field)\n ops.push(op)\n predicates.push(expr)\n })\n })\n return {\n fields,\n ops,\n predicates\n }\n },\n\n _applyWhereFromArray (where) {\n const groups = []\n where.forEach((_where, i) => {\n if (utils.isString(_where)) {\n return\n }\n const prev = where[i - 1]\n const parser = utils.isArray(_where) ? this._applyWhereFromArray : this._applyWhereFromObject\n const group = parser.call(this, _where)\n if (prev === 'or') {\n group.isOr = true\n }\n groups.push(group)\n })\n groups.isArray = true\n return groups\n },\n\n _testObjectGroup (keep, first, group, item) {\n let i\n const fields = group.fields\n const ops = group.ops\n const predicates = group.predicates\n const len = ops.length\n for (i = 0; i < len; i++) {\n let op = ops[i]\n const isOr = op.charAt(0) === '|'\n op = isOr ? op.substr(1) : op\n const expr = this.evaluate(utils.get(item, fields[i]), op, predicates[i])\n if (expr !== undefined) {\n keep = first ? expr : (isOr ? keep || expr : keep && expr)\n }\n first = false\n }\n return { keep, first }\n },\n\n _testArrayGroup (keep, first, groups, item) {\n let i\n const len = groups.length\n for (i = 0; i < len; i++) {\n const group = groups[i]\n const parser = group.isArray ? this._testArrayGroup : this._testObjectGroup\n const result = parser.call(this, true, true, group, item)\n if (groups[i - 1]) {\n if (group.isOr) {\n keep = keep || result.keep\n } else {\n keep = keep && result.keep\n }\n } else {\n keep = result.keep\n }\n first = result.first\n }\n return { keep, first }\n },\n\n /**\n * Find all entities between two boundaries.\n *\n * @example Get the users ages 18 to 30.\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const filteredUsers = store.query('user').between(18, 30, { index: 'age' }).run()\n * console.log(filteredUsers)\n *\n * @example Same as above.\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const filteredUsers = store.query('user').between([18], [30], { index: 'age' }).run()\n * console.log(filteredUsers)\n *\n * @method Query#between\n * @param {Array} leftKeys Keys defining the left boundary.\n * @param {Array} rightKeys Keys defining the right boundary.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#between`)(500, 'Cannot access index')\n }\n this.data = this.collection.getIndex(opts.index).between(leftKeys, rightKeys, opts)\n return this\n },\n\n /**\n * The comparison function used by the {@link Query} class.\n *\n * @method Query#compare\n * @param {Array} orderBy An orderBy clause used for sorting and sub-sorting.\n * @param {number} index The index of the current orderBy clause being used.\n * @param {*} a The first item in the comparison.\n * @param {*} b The second item in the comparison.\n * @returns {number} -1 if `b` should preceed `a`. 0 if `a` and `b` are equal.\n * 1 if `a` should preceed `b`.\n * @since 3.0.0\n */\n compare (orderBy, index, a, b) {\n const def = orderBy[index]\n let cA = utils.get(a, def[0])\n let cB = utils.get(b, def[0])\n if (cA && utils.isString(cA)) {\n cA = cA.toUpperCase()\n }\n if (cB && utils.isString(cB)) {\n cB = cB.toUpperCase()\n }\n if (a === undefined) {\n a = null\n }\n if (b === undefined) {\n b = null\n }\n if (def[1].toUpperCase() === 'DESC') {\n const temp = cB\n cB = cA\n cA = temp\n }\n if (cA < cB) {\n return -1\n } else if (cA > cB) {\n return 1\n } else {\n if (index < orderBy.length - 1) {\n return this.compare(orderBy, index + 1, a, b)\n } else {\n return 0\n }\n }\n },\n\n /**\n * Predicate evaluation function used by the {@link Query} class.\n *\n * @method Query#evaluate\n * @param {*} value The value to evaluate.\n * @param {string} op The operator to use in this evaluation.\n * @param {*} predicate The predicate to use in this evaluation.\n * @returns {boolean} Whether the value passed the evaluation or not.\n * @since 3.0.0\n */\n evaluate (value, op, predicate) {\n const ops = this.constructor.ops\n if (ops[op]) {\n return ops[op](value, predicate)\n }\n if (op.indexOf('like') === 0) {\n return this.like(predicate, op.substr(4)).exec(value) !== null\n } else if (op.indexOf('notLike') === 0) {\n return this.like(predicate, op.substr(7)).exec(value) === null\n }\n },\n\n /**\n * Find the record or records that match the provided query or are accepted by\n * the provided filter function.\n *\n * @example Get the draft posts by authors younger than 30\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ]\n * store.add('post', posts)\n * let results = store.query('post').filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * age: {\n * '<': 30\n * }\n * }\n * }).run()\n * console.log(results)\n *\n * @example Use a custom filter function\n * const posts = query.filter(function (post) {\n * return post.isReady()\n * }).run()\n *\n * @method Query#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Function} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n filter (query, thisArg) {\n /**\n * Selection query as defined by JSData's [Query Syntax][querysyntax].\n *\n * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax\n *\n * @example Empty \"findAll\" query\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * store.findAll('post').then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @example Empty \"filter\" query\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = store.filter('post')\n * console.log(posts) // [...]\n *\n * @example Complex \"filter\" query\n * const PAGE_SIZE = 2\n * let currentPage = 3\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ]\n * store.add('post', posts)\n * // Retrieve a filtered page of blog posts\n * // Would typically replace filter with findAll\n * store.filter('post', {\n * where: {\n * status: {\n * // WHERE status = 'published'\n * '==': 'published'\n * },\n * author: {\n * // AND author IN ('bob', 'alice')\n * 'in': ['bob', 'alice'],\n * // OR author IN ('karen')\n * '|in': ['karen']\n * }\n * },\n * orderBy: [\n * // ORDER BY date_published DESC,\n * ['date_published', 'DESC'],\n * // ORDER BY title ASC\n * ['title', 'ASC']\n * ],\n * // LIMIT 2\n * limit: PAGE_SIZE,\n * // SKIP 4\n * offset: PAGE_SIZE * (currentPage - 1)\n * })\n *\n * @namespace query\n * @property {number} [limit] See {@link query.limit}.\n * @property {number} [offset] See {@link query.offset}.\n * @property {string|Array[]} [orderBy] See {@link query.orderBy}.\n * @property {number} [skip] Alias for {@link query.offset}.\n * @property {string|Array[]} [sort] Alias for {@link query.orderBy}.\n * @property {Object} [where] See {@link query.where}.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/query-syntax\",\"JSData's Query Syntax\"]\n */\n query || (query = {})\n this.getData()\n if (utils.isObject(query)) {\n let where = {}\n\n /**\n * Filtering criteria. Records that do not meet this criteria will be exluded\n * from the result.\n *\n * @example Return posts where author is at least 32 years old\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * where: {\n * age: {\n * '>=': 30\n * }\n * }\n * })\n * console.log(results)\n *\n * @name query.where\n * @type {Object}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isObject(query.where) || utils.isArray(query.where)) {\n where = query.where\n }\n utils.forOwn(query, function (value, key) {\n if (!(key in reserved) && !(key in where)) {\n where[key] = {\n '==': value\n }\n }\n })\n let groups\n\n // Apply filter for each field\n if (utils.isObject(where) && Object.keys(where).length !== 0) {\n groups = this._applyWhereFromArray([where])\n } else if (utils.isArray(where)) {\n groups = this._applyWhereFromArray(where)\n }\n\n if (groups) {\n this.data = this.data.filter((item, i) => this._testArrayGroup(true, true, groups, item).keep)\n }\n\n // Sort\n let orderBy = query.orderBy || query.sort\n\n if (utils.isString(orderBy)) {\n orderBy = [\n [orderBy, 'ASC']\n ]\n }\n if (!utils.isArray(orderBy)) {\n orderBy = null\n }\n\n /**\n * Determines how records should be ordered in the result.\n *\n * @example Order posts by `author` then by `id` descending \n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * orderBy:[['author','ASC'],['id','DESC']]\n * })\n * console.log(results)\n *\n * @name query.orderBy\n * @type {string|Array[]}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (orderBy) {\n let index = 0\n orderBy.forEach(function (def, i) {\n if (utils.isString(def)) {\n orderBy[i] = [def, 'ASC']\n }\n })\n this.data.sort((a, b) => this.compare(orderBy, index, a, b))\n }\n\n /**\n * Number of records to skip.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * PostMapper.findAll({\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * console.log(results)\n *\n * @name query.offset\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.skip)) {\n this.skip(query.skip)\n } else if (utils.isNumber(query.offset)) {\n this.skip(query.offset)\n }\n\n /**\n * Maximum number of records to retrieve.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * PostMapper.findAll({\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * console.log(results)\n * @name query.limit\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.limit)) {\n this.limit(query.limit)\n }\n } else if (utils.isFunction(query)) {\n this.data = this.data.filter(query, thisArg)\n }\n return this\n },\n\n /**\n * Iterate over all entities.\n *\n * @method Query#forEach\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n forEach (forEachFn, thisArg) {\n this.getData().forEach(forEachFn, thisArg)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided key.\n *\n * @example Get the entity whose primary key is 25.\n * const entities = query.get(25).run()\n *\n * @example Same as above.\n * const entities = query.get([25]).run()\n *\n * @example Get all users who are active and have the \"admin\" role.\n * const activeAdmins = query.get(['active', 'admin'], {\n * index: 'activityAndRoles'\n * }).run()\n *\n * @example Get all entities that match a certain weather condition.\n * const niceDays = query.get(['sunny', 'humid', 'calm'], {\n * index: 'weatherConditions'\n * }).run()\n *\n * @method Query#get\n * @param {Array} keyList Key(s) defining the entity to retrieve. If\n * `keyList` is not an array (i.e. for a single-value key), it will be\n * wrapped in an array.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.string] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n get (keyList, opts) {\n keyList || (keyList = [])\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#get`)(500, INDEX_ERR)\n }\n if (keyList && !utils.isArray(keyList)) {\n keyList = [keyList]\n }\n if (!keyList.length) {\n this.getData()\n return this\n }\n this.data = this.collection.getIndex(opts.index).get(keyList)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided keyLists.\n *\n * @example Get the posts where \"status\" is \"draft\" or \"inReview\".\n * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run()\n *\n * @example Same as above.\n * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run()\n *\n * @method Query#getAll\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * entities matching each keyList will be retrieved. If no keyLists are\n * provided, all entities will be returned.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n getAll (...args) {\n let opts = {}\n if (this.data) {\n throw utils.err(`${DOMAIN}#getAll`)(500, INDEX_ERR)\n }\n if (!args.length || (args.length === 1 && utils.isObject(args[0]))) {\n this.getData()\n return this\n } else if (args.length && utils.isObject(args[args.length - 1])) {\n opts = args[args.length - 1]\n args.pop()\n }\n const collection = this.collection\n const index = collection.getIndex(opts.index)\n this.data = []\n args.forEach((keyList) => {\n this.data = this.data.concat(index.get(keyList))\n })\n return this\n },\n\n /**\n * Return the current data result of this query.\n *\n * @method Query#getData\n * @returns {Array} The data in this query.\n * @since 3.0.0\n */\n getData () {\n if (!this.data) {\n this.data = this.collection.index.getAll()\n }\n return this.data\n },\n\n /**\n * Implementation used by the `like` operator. Takes a pattern and flags and\n * returns a `RegExp` instance that can test strings.\n *\n * @method Query#like\n * @param {string} pattern Testing pattern.\n * @param {string} flags Flags for the regular expression.\n * @returns {RegExp} Regular expression for testing strings.\n * @since 3.0.0\n */\n like (pattern, flags) {\n return new RegExp(`^${(escape(pattern).replace(percentRegExp, '.*').replace(underscoreRegExp, '.'))}$`, flags)\n },\n\n /**\n * Limit the result.\n *\n * @example Get only the first 2 posts.\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const results = store.query('post').limit(2).run()\n * console.log(results)\n *\n * @method Query#limit\n * @param {number} num The maximum number of entities to keep in the result.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n limit (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#limit`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n this.data = data.slice(0, Math.min(data.length, num))\n return this\n },\n\n /**\n * Apply a mapping function to the result data.\n *\n * @example\n * // Return the age of all users\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const ages = store.query('user').map((user) => {\n * return user.age\n * }).run()\n * console.log(ages)\n *\n * @method Query#map\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n map (mapFn, thisArg) {\n this.data = this.getData().map(mapFn, thisArg)\n return this\n },\n\n /**\n * Return the result of calling the specified function on each item in this\n * collection's main index.\n *\n * @example\n * const stringAges = UserCollection.query().mapCall('toString').run()\n *\n * @method Query#mapCall\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n mapCall (funcName, ...args) {\n this.data = this.getData().map(function (item) {\n return item[funcName](...args)\n })\n return this\n },\n\n /**\n * Complete the execution of the query and return the resulting data.\n *\n * @method Query#run\n * @returns {Array} The result of executing this query.\n * @since 3.0.0\n */\n run () {\n const data = this.data\n this.data = null\n return data\n },\n\n /**\n * Skip a number of results.\n *\n * @example Get all but the first 2 posts.\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const results = store.query('post').skip(2).run()\n * console.log(results)\n *\n * @method Query#skip\n * @param {number} num The number of entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n skip (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#skip`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n if (num < data.length) {\n this.data = data.slice(num)\n } else {\n this.data = []\n }\n return this\n }\n}, {\n /**\n * The filtering operators supported by {@link Query#filter}, and which are\n * implemented by adapters (for the most part).\n *\n * @example Variant 1\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.filter('post', {\n * status: 'published',\n * limit: 2\n * })\n *\n * console.log(publishedPosts)\n *\n *\n * @example Variant 2\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * }\n * },\n * limit: 2\n * })\n *\n * console.log(publishedPosts)\n *\n * @example Variant 3\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.query('post').filter({\n * status: 'published'\n * }).limit(2).run()\n *\n * console.log(publishedPosts)\n *\n * @example Variant 4\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.query('post').filter({\n * where: {\n * status: {\n * '==': 'published'\n * }\n * }\n * }).limit(2).run()\n *\n * console.log(publishedPosts)\n *\n * @example Multiple operators\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const myPublishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * },\n * user_id: {\n * '==': currentUser.id\n * }\n * }\n * })\n *\n * console.log(myPublishedPosts)\n *\n * @name Query.ops\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > Greater than operator.\n * @property {Function} >= Greater than (inclusive) operator.\n * @property {Function} < Less than operator.\n * @property {Function} <= Less than (inclusive) operator.\n * @property {Function} isectEmpty Operator that asserts that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator that asserts that the\n * intersection between two arrays is __not__ empty.\n * @property {Function} in Operator that asserts whether a value is in an\n * array.\n * @property {Function} notIn Operator that asserts whether a value is __not__\n * in an array.\n * @property {Function} contains Operator that asserts whether an array\n * contains a value.\n * @property {Function} notContains Operator that asserts whether an array\n * does __not__ contain a value.\n * @since 3.0.0\n * @type {Object}\n */\n ops: {\n '=': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '==': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '===': function (value, predicate) {\n return value === predicate\n },\n '!=': function (value, predicate) {\n return value != predicate // eslint-disable-line\n },\n '!==': function (value, predicate) {\n return value !== predicate\n },\n '>': function (value, predicate) {\n return value > predicate\n },\n '>=': function (value, predicate) {\n return value >= predicate\n },\n '<': function (value, predicate) {\n return value < predicate\n },\n '<=': function (value, predicate) {\n return value <= predicate\n },\n 'isectEmpty': function (value, predicate) {\n return !utils.intersection((value || []), (predicate || [])).length\n },\n 'isectNotEmpty': function (value, predicate) {\n return utils.intersection((value || []), (predicate || [])).length\n },\n 'in': function (value, predicate) {\n return predicate.indexOf(value) !== -1\n },\n 'notIn': function (value, predicate) {\n return predicate.indexOf(value) === -1\n },\n 'contains': function (value, predicate) {\n return (value || []).indexOf(predicate) !== -1\n },\n 'notContains': function (value, predicate) {\n return (value || []).indexOf(predicate) === -1\n }\n }\n})\n\n/**\n * Create a subclass of this Query:\n * @example Query.extend\n * // Normally you would do: import {Query} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Query} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomQueryClass extends Query {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customQuery = new CustomQueryClass()\n * console.log(customQuery.foo())\n * console.log(CustomQueryClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherQueryClass = Query.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherQuery = new OtherQueryClass()\n * console.log(otherQuery.foo())\n * console.log(OtherQueryClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherQueryClass (collection) {\n * Query.call(this, collection)\n * this.created_at = new Date().getTime()\n * }\n * Query.extend({\n * constructor: AnotherQueryClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherQuery = new AnotherQueryClass()\n * console.log(anotherQuery.created_at)\n * console.log(anotherQuery.foo())\n * console.log(AnotherQueryClass.beep())\n *\n * @method Query.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Query class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\n// TODO: remove this when the rest of the project is cleaned\nexport const belongsToType = 'belongsTo'\nexport const hasManyType = 'hasMany'\nexport const hasOneType = 'hasOne'\n\nconst DOMAIN = 'Relation'\n\nexport function Relation (relatedMapper, options = {}) {\n utils.classCallCheck(this, Relation)\n\n options.type = this.constructor.TYPE_NAME\n this.validateOptions(relatedMapper, options)\n\n if (typeof relatedMapper === 'object') {\n Object.defineProperty(this, 'relatedMapper', { value: relatedMapper })\n }\n\n Object.defineProperty(this, 'inverse', { writable: true })\n utils.fillIn(this, options)\n}\n\nRelation.extend = utils.extend\n\nutils.addHiddenPropsToTarget(Relation.prototype, {\n get canAutoAddLinks () {\n return this.add === undefined || !!this.add\n },\n\n get relatedCollection () {\n return this.mapper.datastore.getCollection(this.relation)\n },\n\n validateOptions (related, opts) {\n const DOMAIN_ERR = `new ${DOMAIN}`\n\n const localField = opts.localField\n if (!localField) {\n throw utils.err(DOMAIN_ERR, 'opts.localField')(400, 'string', localField)\n }\n\n const foreignKey = opts.foreignKey = opts.foreignKey || opts.localKey\n if (!foreignKey && (opts.type === belongsToType || opts.type === hasOneType)) {\n throw utils.err(DOMAIN_ERR, 'opts.foreignKey')(400, 'string', foreignKey)\n }\n\n if (utils.isString(related)) {\n opts.relation = related\n if (!utils.isFunction(opts.getRelation)) {\n throw utils.err(DOMAIN_ERR, 'opts.getRelation')(400, 'function', opts.getRelation)\n }\n } else if (related) {\n opts.relation = related.name\n } else {\n throw utils.err(DOMAIN_ERR, 'related')(400, 'Mapper or string', related)\n }\n },\n\n assignTo (mapper) {\n this.name = mapper.name\n Object.defineProperty(this, 'mapper', { value: mapper })\n\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n mapper.relationFields || Object.defineProperty(mapper, 'relationFields', { value: [] })\n mapper.relationList.push(this)\n mapper.relationFields.push(this.localField)\n },\n\n canFindLinkFor () {\n return !!(this.foreignKey || this.localKey)\n },\n\n getRelation () {\n return this.relatedMapper\n },\n\n getForeignKey (record) {\n return utils.get(record, this.mapper.idAttribute)\n },\n\n setForeignKey (record, relatedRecord) {\n if (!record || !relatedRecord) {\n return\n }\n\n this._setForeignKey(record, relatedRecord)\n },\n\n _setForeignKey (record, relatedRecords) {\n const idAttribute = this.mapper.idAttribute\n\n if (!utils.isArray(relatedRecords)) {\n relatedRecords = [relatedRecords]\n }\n\n relatedRecords.forEach((relatedRecord) => {\n utils.set(relatedRecord, this.foreignKey, utils.get(record, idAttribute))\n })\n },\n\n getLocalField (record) {\n return utils.get(record, this.localField)\n },\n\n setLocalField (record, relatedData) {\n return utils.set(record, this.localField, relatedData)\n },\n\n getInverse (mapper) {\n if (!this.inverse) {\n this.findInverseRelation(mapper)\n }\n\n return this.inverse\n },\n\n findInverseRelation (mapper) {\n this.getRelation().relationList.forEach((def) => {\n if (def.getRelation() === mapper && this.isInversedTo(def) && this !== def) {\n this.inverse = def\n return true\n }\n })\n },\n\n isInversedTo (def) {\n return !def.foreignKey || def.foreignKey === this.foreignKey\n },\n\n addLinkedRecords (records) {\n const datastore = this.mapper.datastore\n\n records.forEach((record) => {\n let relatedData = this.getLocalField(record)\n\n if (utils.isFunction(this.add)) {\n relatedData = this.add(datastore, this, record)\n } else if (relatedData) {\n relatedData = this.linkRecord(record, relatedData)\n }\n\n const isEmptyLinks = !relatedData || (utils.isArray(relatedData) && !relatedData.length)\n\n if (isEmptyLinks && this.canFindLinkFor(record)) {\n relatedData = this.findExistingLinksFor(record)\n }\n\n if (relatedData) {\n this.setLocalField(record, relatedData)\n }\n })\n },\n\n removeLinkedRecords (relatedMapper, records) {\n const localField = this.localField\n records.forEach((record) => {\n utils.set(record, localField, undefined)\n })\n },\n\n linkRecord (record, relatedRecord) {\n const relatedId = utils.get(relatedRecord, this.mapper.idAttribute)\n\n if (relatedId === undefined) {\n const unsaved = this.relatedCollection.unsaved()\n if (unsaved.indexOf(relatedRecord) === -1) {\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n } else {\n if (relatedRecord !== this.relatedCollection.get(relatedId)) {\n this.setForeignKey(record, relatedRecord)\n\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n }\n\n return relatedRecord\n },\n\n // e.g. user hasMany post via \"foreignKey\", so find all posts of user\n findExistingLinksByForeignKey (id) {\n if (id === undefined || id === null) {\n return\n }\n return this.relatedCollection.filter({\n [this.foreignKey]: id\n })\n },\n\n ensureLinkedDataHasProperType (props, opts) {\n const relatedMapper = this.getRelation()\n const relationData = this.getLocalField(props)\n\n if (utils.isArray(relationData) && (!relationData.length || relatedMapper.is(relationData[0]))) {\n return\n }\n\n if (relationData && !relatedMapper.is(relationData)) {\n utils.set(props, this.localField, relatedMapper.createRecord(relationData, opts))\n }\n },\n\n isRequiresParentId () {\n return false\n },\n\n isRequiresChildId () {\n return false\n },\n\n createChildRecord (props, relationData, opts) {\n this.setForeignKey(props, relationData)\n\n return this.createLinked(relationData, opts).then((result) => {\n this.setLocalField(props, result)\n })\n },\n\n createLinked (props, opts) {\n const create = utils.isArray(props) ? 'createMany' : 'create'\n\n return this.getRelation()[create](props, opts)\n }\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const BelongsToRelation = Relation.extend({\n getForeignKey (record) {\n return utils.get(record, this.foreignKey)\n },\n\n _setForeignKey (record, relatedRecord) {\n utils.set(record, this.foreignKey, utils.get(relatedRecord, this.getRelation().idAttribute))\n },\n\n findExistingLinksFor (record) {\n // console.log('\\tBelongsTo#findExistingLinksFor', record)\n if (!record) {\n return\n }\n const relatedId = utils.get(record, this.foreignKey)\n if (relatedId !== undefined && relatedId !== null) {\n return this.relatedCollection.get(relatedId)\n }\n },\n\n isRequiresParentId () {\n return true\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n\n return this.createLinked(relationData, opts).then((record) => {\n this.setForeignKey(props, record)\n })\n },\n\n createChildRecord () {\n throw new Error('\"BelongsTo\" relation does not support child creation as it cannot have children.')\n }\n}, {\n TYPE_NAME: 'belongsTo'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasManyRelation = Relation.extend({\n validateOptions (related, opts) {\n Relation.prototype.validateOptions.call(this, related, opts)\n\n const { localKeys, foreignKeys, foreignKey } = opts\n\n if (!foreignKey && !localKeys && !foreignKeys) {\n throw utils.err('new Relation', 'opts.')(400, 'string', foreignKey)\n }\n },\n\n canFindLinkFor (record) {\n const hasForeignKeys = this.foreignKey || this.foreignKeys\n return !!(hasForeignKeys || (this.localKeys && utils.get(record, this.localKeys)))\n },\n\n linkRecord (record, relatedRecords) {\n const relatedCollection = this.relatedCollection\n const canAutoAddLinks = this.canAutoAddLinks\n const foreignKey = this.foreignKey\n const unsaved = this.relatedCollection.unsaved()\n\n return relatedRecords.map((relatedRecord) => {\n const relatedId = relatedCollection.recordId(relatedRecord)\n\n if ((relatedId === undefined && unsaved.indexOf(relatedRecord) === -1) || relatedRecord !== relatedCollection.get(relatedId)) {\n if (foreignKey) {\n // TODO: slow, could be optimized? But user loses hook\n this.setForeignKey(record, relatedRecord)\n }\n if (canAutoAddLinks) {\n relatedRecord = relatedCollection.add(relatedRecord)\n }\n }\n\n return relatedRecord\n })\n },\n\n findExistingLinksFor (record) {\n const id = utils.get(record, this.mapper.idAttribute)\n const ids = this.localKeys ? utils.get(record, this.localKeys) : null\n let records\n\n if (id !== undefined && this.foreignKey) {\n records = this.findExistingLinksByForeignKey(id)\n } else if (this.localKeys && ids) {\n records = this.findExistingLinksByLocalKeys(ids)\n } else if (id !== undefined && this.foreignKeys) {\n records = this.findExistingLinksByForeignKeys(id)\n }\n\n if (records && records.length) {\n return records\n }\n },\n\n // e.g. user hasMany group via \"foreignKeys\", so find all users of a group\n findExistingLinksByLocalKeys (ids) {\n return this.relatedCollection.filter({\n where: {\n [this.mapper.idAttribute]: {\n 'in': ids\n }\n }\n })\n },\n\n // e.g. group hasMany user via \"localKeys\", so find all groups that own a user\n findExistingLinksByForeignKeys (id) {\n return this.relatedCollection.filter({\n where: {\n [this.foreignKeys]: {\n 'contains': id\n }\n }\n })\n },\n\n isRequiresParentId () {\n return !!this.localKeys && this.localKeys.length > 0\n },\n\n isRequiresChildId () {\n return !!this.foreignKey\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n const foreignIdField = this.getRelation().idAttribute\n\n return this.createLinked(relationData, opts).then((records) => {\n utils.set(props, this.localKeys, records.map((record) => utils.get(record, foreignIdField)))\n })\n },\n\n createLinked (props, opts) {\n return this.getRelation().createMany(props, opts)\n }\n}, {\n TYPE_NAME: 'hasMany'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasOneRelation = Relation.extend({\n findExistingLinksFor (relatedMapper, record) {\n const recordId = utils.get(record, relatedMapper.idAttribute)\n const records = this.findExistingLinksByForeignKey(recordId)\n\n if (records && records.length) {\n return records[0]\n }\n },\n\n isRequiresChildId () {\n return true\n }\n}, {\n TYPE_NAME: 'hasOne'\n})\n","import { Relation } from './Relation'\nimport { BelongsToRelation } from './Relation/BelongsTo'\nimport { HasManyRelation } from './Relation/HasMany'\nimport { HasOneRelation } from './Relation/HasOne'\n\n[BelongsToRelation, HasManyRelation, HasOneRelation].forEach(function (RelationType) {\n Relation[RelationType.TYPE_NAME] = function (related, options) {\n return new RelationType(related, options)\n }\n})\n\nexport { belongsToType, hasManyType, hasOneType, Relation } from './Relation'\n","import { Relation } from './relations'\n\nexport { belongsToType, hasManyType, hasOneType } from './relations'\n/**\n * BelongsTo relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.belongsTo\n * @method\n * @param {Mapper} related The relation the target belongs to.\n * @param {Object} opts Configuration options.\n * @param {string} opts.foreignKey The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const belongsTo = function (related, opts) {\n return function (mapper) {\n Relation.belongsTo(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasMany relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasMany\n * @method\n * @param {Mapper} related The relation of which the target has many.\n * @param {Object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasMany = function (related, opts) {\n return function (mapper) {\n Relation.hasMany(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasOne relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasOne\n * @method\n * @param {Mapper} related The relation of which the target has one.\n * @param {Object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasOne = function (related, opts) {\n return function (mapper) {\n Relation.hasOne(related, opts).assignTo(mapper)\n }\n}\n","import utils, { safeSetLink } from './utils'\nimport Component from './Component'\nimport Settable from './Settable'\nimport {\n hasManyType,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Record'\n\nconst superMethod = function (mapper, name) {\n const store = mapper.datastore\n if (store && store[name]) {\n return function (...args) {\n return store[name](mapper.name, ...args)\n }\n }\n return mapper[name].bind(mapper)\n}\n\n// Cache these strings\nconst creatingPath = 'creating'\nconst noValidatePath = 'noValidate'\nconst keepChangeHistoryPath = 'keepChangeHistory'\nconst previousPath = 'previous'\n\n/**\n * js-data's Record class. An instance of `Record` corresponds to an in-memory\n * representation of a single row or document in a database, Firebase,\n * localstorage, etc. Basically, a `Record` instance represents whatever kind of\n * entity in your persistence layer that has a primary key.\n *\n * ```javascript\n * import {Record} from 'js-data'\n * ```\n *\n * @example Record#constructor\n * // Normally you would do: import {Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Instantiate a plain record\n * let record = new Record()\n * console.log('record: ' + JSON.stringify(record))\n *\n * // You can supply properties on instantiation\n * record = new Record({ name: 'John' })\n * console.log('record: ' + JSON.stringify(record))\n *\n * @example Record#constructor2\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Instantiate a record that's associated with a Mapper:\n * const UserMapper = new Mapper({ name: 'user' })\n * const User = UserMapper.recordClass\n * const user = UserMapper.createRecord({ name: 'John' })\n * const user2 = new User({ name: 'Sally' })\n * console.log('user: ' + JSON.stringify(user))\n * console.log('user2: ' + JSON.stringify(user2))\n *\n * @example Record#constructor3\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n *\n * // Instantiate a record that's associated with a store's Mapper\n * const user = store.createRecord('user', { name: 'John' })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @example Record#constructor4\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * // Validate on instantiation\n * const user = store.createRecord('user', { name: 1234 })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @example Record#constructor5\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * // Skip validation on instantiation\n * const user = store.createRecord('user', { name: 1234 }, { noValidate: true })\n * console.log('user: ' + JSON.stringify(user))\n * console.log('user.isValid(): ' + user.isValid())\n *\n * @class Record\n * @extends Component\n * @param {Object} [props] The initial properties of the new Record instance.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate=false] Whether to skip validation on the\n * initial properties.\n * @param {boolean} [opts.validateOnSet=true] Whether to enable setter\n * validation on properties after the Record has been initialized.\n * @since 3.0.0\n */\nfunction Record (props, opts) {\n utils.classCallCheck(this, Record)\n Settable.call(this)\n props || (props = {})\n opts || (opts = {})\n const _set = this._set\n const mapper = this.constructor.mapper\n\n _set(creatingPath, true)\n _set(noValidatePath, !!opts.noValidate)\n _set(keepChangeHistoryPath, opts.keepChangeHistory === undefined ? (mapper ? mapper.keepChangeHistory : true) : opts.keepChangeHistory)\n\n // Set the idAttribute value first, if it exists.\n const id = mapper ? utils.get(props, mapper.idAttribute) : undefined\n if (id !== undefined) {\n utils.set(this, mapper.idAttribute, id)\n }\n\n utils.fillIn(this, props)\n _set(creatingPath, false)\n if (opts.validateOnSet !== undefined) {\n _set(noValidatePath, !opts.validateOnSet)\n } else if (mapper && mapper.validateOnSet !== undefined) {\n _set(noValidatePath, !mapper.validateOnSet)\n } else {\n _set(noValidatePath, false)\n }\n _set(previousPath, mapper ? mapper.toJSON(props) : utils.plainCopy(props))\n}\n\nexport default Component.extend({\n constructor: Record,\n\n /**\n * Returns the {@link Mapper} paired with this record's class, if any.\n *\n * @method Record#_mapper\n * @returns {Mapper} The {@link Mapper} paired with this record's class, if any.\n * @since 3.0.0\n */\n _mapper () {\n const mapper = this.constructor.mapper\n if (!mapper) {\n throw utils.err(`${DOMAIN}#_mapper`, '')(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Lifecycle hook.\n *\n * @method Record#afterLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n afterLoadRelations () {},\n\n /**\n * Lifecycle hook.\n *\n * @method Record#beforeLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n beforeLoadRelations () {},\n\n /**\n * Return the change history of this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @method Record#changeHistory\n * @since 3.0.0\n */\n changeHistory () {\n return (this._get('history') || []).slice()\n },\n\n /**\n * Return changes to this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#changes\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user changes: ' + JSON.stringify(user.changes()))\n * user.name = 'John'\n * console.log('user changes: ' + JSON.stringify(user.changes()))\n *\n * @method Record#changes\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} Object describing the changes to this record since it was\n * instantiated or its {@link Record#commit} method was last called.\n * @since 3.0.0\n */\n changes (opts) {\n opts || (opts = {})\n return utils.diffObjects(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Make the record's current in-memory state it's only state, with any\n * previous property values being set to current values.\n *\n * @example Record#commit\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.name = 'John'\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.commit()\n * console.log('user hasChanges: ' + user.hasChanges())\n *\n * @method Record#commit\n * @param {Object} [opts] Configuration options. Passed to {@link Record#toJSON}.\n * @since 3.0.0\n */\n commit (opts) {\n this._set('changed') // unset\n this._set('history', []) // clear history\n this._set('previous', this.toJSON(opts))\n },\n\n /**\n * Call {@link Mapper#destroy} using this record's primary key.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('user')\n * store.find('user', 1234).then((user) => {\n * console.log(user.id) // 1234\n *\n * // Destroy this user from the database\n * return user.destroy()\n * })\n *\n * @method Record#destroy\n * @param {Object} [opts] Configuration options passed to {@link Mapper#destroy}.\n * @returns {Promise} The result of calling {@link Mapper#destroy} with the\n * primary key of this record.\n * @since 3.0.0\n */\n destroy (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n return superMethod(mapper, 'destroy')(utils.get(this, mapper.idAttribute), opts)\n },\n\n /**\n * Return the value at the given path for this instance.\n *\n * @example Record#get\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user', { name: 'Bob' })\n * console.log('user.get(\"name\"): ' + user.get('name'))\n *\n * @method Record#get\n * @param {string} key Path of value to retrieve.\n * @returns {*} Value at path.\n * @since 3.0.0\n */\n 'get' (key) {\n return utils.get(this, key)\n },\n\n /**\n * Return whether this record has changed since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#hasChanges\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.name = 'John'\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.commit()\n * console.log('user hasChanges: ' + user.hasChanges())\n *\n * @method Record#hasChanges\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Return whether the record has changed since it was\n * instantiated or since its {@link Record#commit} method was called.\n * @since 3.0.0\n */\n hasChanges (opts) {\n const quickHasChanges = !!(this._get('changed') || []).length\n return quickHasChanges || utils.areDifferent(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Return whether the record is unsaved. Records that have primary keys are\n * considered \"saved\". Records without primary keys are considered \"unsaved\".\n *\n * @example Record#isNew\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * id: 1234\n * })\n * const user2 = store.createRecord('user')\n * console.log('user isNew: ' + user.isNew()) // false\n * console.log('user2 isNew: ' + user2.isNew()) // true\n *\n * @method Record#isNew\n * @returns {boolean} Whether the record is unsaved.\n * @since 3.0.0\n */\n isNew (opts) {\n return utils.get(this, this._mapper().idAttribute) === undefined\n },\n\n /**\n * Return whether the record in its current state passes validation.\n *\n * @example Record#isValid\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * })\n * console.log('user isValid: ' + user.isValid())\n * user.name = 'John'\n * console.log('user isValid: ' + user.isValid())\n *\n * @method Record#isValid\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {boolean} Whether the record in its current state passes\n * validation.\n * @since 3.0.0\n */\n isValid (opts) {\n return !this._mapper().validate(this, opts)\n },\n\n removeInverseRelation (currentParent, id, inverseDef, idAttribute) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n // e.g. remove comment from otherPost.comments\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n setupInverseRelation (record, id, inverseDef, idAttribute) {\n // Update (set) inverse relation\n if (inverseDef.type === hasOneType) {\n // e.g. someUser.profile = profile\n safeSetLink(record, inverseDef.localField, this)\n } else if (inverseDef.type === hasManyType) {\n // e.g. add comment to somePost.comments\n const children = utils.get(record, inverseDef.localField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n /**\n * Lazy load relations of this record, to be attached to the record once their\n * loaded.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('user', {\n * relations: {\n * hasMany: {\n * post: {\n * localField: 'posts',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * })\n * store.defineMapper('post', {\n * relations: {\n * belongsTo: {\n * user: {\n * localField: 'user',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * })\n * store.find('user', 1234).then((user) => {\n * console.log(user.id) // 1234\n *\n * // Load the user's post relations\n * return user.loadRelations(['post'])\n * }).then((user) => {\n * console.log(user.posts) // [{...}, {...}, ...]\n * })\n *\n * @method Record#loadRelations\n * @param {string[]} [relations] List of relations to load. Can use localField\n * names or Mapper names to pick relations.\n * @param {Object} [opts] Configuration options.\n * @returns {Promise} Resolves with the record, with the loaded relations now\n * attached.\n * @since 3.0.0\n */\n loadRelations (relations, opts) {\n let op\n const mapper = this._mapper()\n\n // Default values for arguments\n relations || (relations = [])\n if (utils.isString(relations)) {\n relations = [relations]\n }\n opts || (opts = {})\n opts.with = relations\n\n // Fill in \"opts\" with the Model's configuration\n utils._(opts, mapper)\n opts.adapter = mapper.getAdapterName(opts)\n\n // beforeLoadRelations lifecycle hook\n op = opts.op = 'beforeLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => {\n // Now delegate to the adapter\n op = opts.op = 'loadRelations'\n mapper.dbg(op, this, relations, opts)\n let tasks = []\n let task\n utils.forEachRelation(mapper, opts, (def, optsCopy) => {\n const relatedMapper = def.getRelation()\n optsCopy.raw = false\n if (utils.isFunction(def.load)) {\n task = def.load(mapper, def, this, opts)\n } else if (def.type === 'hasMany' || def.type === 'hasOne') {\n if (def.foreignKey) {\n task = superMethod(relatedMapper, 'findAll')({\n [def.foreignKey]: utils.get(this, mapper.idAttribute)\n }, optsCopy).then(function (relatedData) {\n if (def.type === 'hasOne') {\n return relatedData.length ? relatedData[0] : undefined\n }\n return relatedData\n })\n } else if (def.localKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [relatedMapper.idAttribute]: {\n 'in': utils.get(this, def.localKeys)\n }\n }\n })\n } else if (def.foreignKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [def.foreignKeys]: {\n 'contains': utils.get(this, mapper.idAttribute)\n }\n }\n }, opts)\n }\n } else if (def.type === 'belongsTo') {\n const key = utils.get(this, def.foreignKey)\n if (utils.isSorN(key)) {\n task = superMethod(relatedMapper, 'find')(key, optsCopy)\n }\n }\n if (task) {\n task = task.then((relatedData) => {\n def.setLocalField(this, relatedData)\n })\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(() => {\n // afterLoadRelations lifecycle hook\n op = opts.op = 'afterLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => this)\n })\n },\n\n /**\n * Return the properties with which this record was instantiated.\n *\n * @example Record#previous\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * name: 'William'\n * })\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n * user.name = 'Bob'\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n * user.commit()\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n *\n * @method Record#previous\n * @param {string} [key] If specified, return just the initial value of the\n * given key.\n * @returns {Object} The initial properties of this record.\n * @since 3.0.0\n */\n previous (key) {\n if (key) {\n return this._get(`previous.${key}`)\n }\n return this._get('previous')\n },\n\n /**\n * Revert changes to this record back to the properties it had when it was\n * instantiated.\n *\n * @example Record#revert\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * name: 'William'\n * })\n * console.log('user: ' + JSON.stringify(user))\n * user.name = 'Bob'\n * console.log('user: ' + JSON.stringify(user))\n * user.revert()\n * console.log('user: ' + JSON.stringify(user))\n *\n * @method Record#revert\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.preserve] Array of strings or Regular Expressions\n * denoting properties that should not be reverted.\n * @since 3.0.0\n */\n revert (opts) {\n const previous = this._get('previous')\n opts || (opts = {})\n opts.preserve || (opts.preserve = [])\n utils.forOwn(this, (value, key) => {\n if (key !== this._mapper().idAttribute && !previous.hasOwnProperty(key) && this.hasOwnProperty(key) && opts.preserve.indexOf(key) === -1) {\n delete this[key]\n }\n })\n utils.forOwn(previous, (value, key) => {\n if (opts.preserve.indexOf(key) === -1) {\n this[key] = value\n }\n })\n this.commit()\n },\n\n /**\n * Delegates to {@link Mapper#create} or {@link Mapper#update}.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('session')\n * const session = store.createRecord('session', { topic: 'Node.js' })\n *\n * // Create a new record in the database\n * session.save().then(() => {\n * console.log(session.id) // 1234\n *\n * session.skill_level = 'beginner'\n *\n * // Update the record in the database\n * return session.save()\n * })\n *\n * @method Record#save\n * @param {Object} [opts] Configuration options. See {@link Mapper#create} and\n * {@link Mapper#update}.\n * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`.\n * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @param {Array} [opts.ignore] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @returns {Promise} The result of calling {@link Mapper#create} or\n * {@link Mapper#update}.\n * @since 3.0.0\n */\n save (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n const id = utils.get(this, mapper.idAttribute)\n let props = this\n\n const postProcess = (result) => {\n const record = opts.raw ? result.data : result\n if (record) {\n utils.deepMixIn(this, record)\n this.commit()\n }\n return result\n }\n\n if (id === undefined) {\n return superMethod(mapper, 'create')(props, opts).then(postProcess)\n }\n if (opts.changesOnly) {\n const changes = this.changes(opts)\n props = {}\n utils.fillIn(props, changes.added)\n utils.fillIn(props, changes.changed)\n }\n return superMethod(mapper, 'update')(id, props, opts).then(postProcess)\n },\n\n /**\n * Set the value for a given key, or the values for the given keys if \"key\" is\n * an object. Triggers change events on those properties that have `track: true`\n * in {@link Mapper#schema}.\n *\n * @example Record#set\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user')\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.set('name', 'Bob')\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.set({ age: 30, role: 'admin' })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @fires Record#change\n * @method Record#set\n * @param {(string|Object)} key Key to set or hash of key-value pairs to set.\n * @param {*} [value] Value to set for the given key.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n 'set' (key, value, opts) {\n if (utils.isObject(key)) {\n opts = value\n }\n opts || (opts = {})\n if (opts.silent) {\n this._set('silent', true)\n }\n utils.set(this, key, value)\n if (!this._get('eventId')) {\n this._set('silent') // unset\n }\n },\n\n /**\n * Return a plain object representation of this record. If the class from\n * which this record was created has a Mapper, then {@link Mapper#toJSON} will\n * be called with this record instead.\n *\n * @example Record#toJSON\n * // Normally you would do: import { Container } from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.8')\n * const { Container } = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * const user = store.createRecord('user', {\n * name: 'John',\n * $$hashKey: '1234'\n * })\n * console.log('user: ' + JSON.stringify(user.toJSON()))\n *\n * @method Record#toJSON\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation. Only available as an option if the class\n * from which this record was created has a Mapper and this record resides in\n * an instance of {@link DataStore}.\n * @returns {Object} Plain object representation of this record.\n * @since 3.0.0\n */\n toJSON (opts) {\n const mapper = this.constructor.mapper\n if (mapper) {\n return mapper.toJSON(this, opts)\n } else {\n const json = {}\n utils.forOwn(this, (prop, key) => {\n json[key] = utils.plainCopy(prop)\n })\n return json\n }\n },\n\n /**\n * Unset the value for a given key. Triggers change events on those properties\n * that have `track: true` in {@link Mapper#schema}.\n *\n * @example Record#unset\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user', {\n * name: 'John'\n * })\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.unset('name')\n * console.log('user: ' + JSON.stringify(user))\n *\n * @method Record#unset\n * @param {string} key Key to unset.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n unset (key, opts) {\n this.set(key, undefined, opts)\n },\n\n /**\n * Validate this record based on its current properties.\n *\n * @example Record#validate\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * })\n * console.log('user validation: ' + JSON.stringify(user.validate()))\n * user.name = 'John'\n * console.log('user validation: ' + user.validate())\n *\n * @method Record#validate\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {*} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (opts) {\n return this._mapper().validate(this, opts)\n }\n}, {\n creatingPath,\n noValidatePath,\n keepChangeHistoryPath,\n previousPath\n})\n\n/**\n * Allow records to emit events.\n *\n * An record's registered listeners are stored in the record's private data.\n */\nutils.eventify(\n Record.prototype,\n function () {\n return this._get('events')\n },\n function (value) {\n this._set('events', value)\n }\n)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link Record~changeListener} on how to listen for this event.\n *\n * @event Record#change\n * @see Record~changeListener\n */\n\n/**\n * Callback signature for the {@link Record#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * record.on('change', onChange)\n *\n * @callback Record~changeListener\n * @param {Record} The Record that changed.\n * @param {Object} The changes.\n * @see Record#event:change\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Record:\n * @example Record.extend\n * // Normally you would do: import {Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomRecordClass extends Record {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customRecord = new CustomRecordClass()\n * console.log(customRecord.foo())\n * console.log(CustomRecordClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherRecordClass = Record.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherRecord = new OtherRecordClass()\n * console.log(otherRecord.foo())\n * console.log(OtherRecordClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherRecordClass () {\n * Record.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Record.extend({\n * constructor: AnotherRecordClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherRecord = new AnotherRecordClass()\n * console.log(anotherRecord.created_at)\n * console.log(anotherRecord.foo())\n * console.log(AnotherRecordClass.beep())\n *\n * @method Record.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Record class.\n * @since 3.0.0\n */\n","export function sort (a, b, hashCode) {\n // Short-circuit comparison if a and b are strictly equal\n // This is absolutely necessary for indexed objects that\n // don't have the idAttribute field\n if (a === b) {\n return 0\n }\n if (hashCode) {\n a = hashCode(a)\n b = hashCode(b)\n }\n if ((a === null && b === null) || (a === undefined && b === undefined)) {\n return -1\n }\n\n if (a === null || a === undefined) {\n return -1\n }\n\n if (b === null || b === undefined) {\n return 1\n }\n\n if (a < b) {\n return -1\n }\n\n if (a > b) {\n return 1\n }\n\n return 0\n}\n\nexport function insertAt (array, index, value) {\n array.splice(index, 0, value)\n return array\n}\n\nexport function removeAt (array, index) {\n array.splice(index, 1)\n return array\n}\n\nexport function binarySearch (array, value, field) {\n let lo = 0\n let hi = array.length\n let compared\n let mid\n\n while (lo < hi) {\n mid = ((lo + hi) / 2) | 0\n compared = sort(value, array[mid], field)\n if (compared === 0) {\n return {\n found: true,\n index: mid\n }\n } else if (compared < 0) {\n hi = mid\n } else {\n lo = mid + 1\n }\n }\n\n return {\n found: false,\n index: hi\n }\n}\n","// Copyright (c) 2015, InternalFX.\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose with or\n// without fee is hereby granted, provided that the above copyright notice and this permission\n// notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO\n// THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT\n// SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR\n// ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE\n// USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// Modifications\n// Copyright 2015-2016 Jason Dobry\n//\n// Summary of modifications:\n// Reworked dependencies so as to re-use code already in js-data\n// Removed unused code\nimport utils from '../../src/utils'\nimport {binarySearch, insertAt, removeAt} from './_utils'\n\nexport default function Index (fieldList, opts) {\n utils.classCallCheck(this, Index)\n fieldList || (fieldList = [])\n\n if (!utils.isArray(fieldList)) {\n throw new Error('fieldList must be an array.')\n }\n\n opts || (opts = {})\n this.fieldList = fieldList\n this.fieldGetter = opts.fieldGetter\n this.hashCode = opts.hashCode\n this.isIndex = true\n this.keys = []\n this.values = []\n}\n\nutils.addHiddenPropsToTarget(Index.prototype, {\n 'set' (keyList, value) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n let dataLocation = binarySearch(this.values[pos.index], value, this.hashCode)\n if (!dataLocation.found) {\n insertAt(this.values[pos.index], dataLocation.index, value)\n }\n } else {\n insertAt(this.keys, pos.index, key)\n insertAt(this.values, pos.index, [value])\n }\n } else {\n if (pos.found) {\n this.values[pos.index].set(keyList, value)\n } else {\n insertAt(this.keys, pos.index, key)\n let newIndex = new Index([], { hashCode: this.hashCode })\n newIndex.set(keyList, value)\n insertAt(this.values, pos.index, newIndex)\n }\n }\n },\n\n 'get' (keyList) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n if (this.values[pos.index].isIndex) {\n return this.values[pos.index].getAll()\n } else {\n return this.values[pos.index].slice()\n }\n } else {\n return []\n }\n } else {\n if (pos.found) {\n return this.values[pos.index].get(keyList)\n } else {\n return []\n }\n }\n },\n\n getAll (opts) {\n opts || (opts = {})\n let results = []\n const values = this.values\n if (opts.order === 'desc') {\n for (let i = values.length - 1; i >= 0; i--) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n } else {\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n }\n return results\n },\n\n visitAll (cb, thisArg) {\n this.values.forEach(function (value) {\n if (value.isIndex) {\n value.visitAll(cb, thisArg)\n } else {\n value.forEach(cb, thisArg)\n }\n })\n },\n\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (!utils.isArray(leftKeys)) {\n leftKeys = [leftKeys]\n }\n if (!utils.isArray(rightKeys)) {\n rightKeys = [rightKeys]\n }\n utils.fillIn(opts, {\n leftInclusive: true,\n rightInclusive: false,\n limit: undefined,\n offset: 0\n })\n\n let results = this._between(leftKeys, rightKeys, opts)\n\n if (opts.limit) {\n return results.slice(opts.offset, opts.limit + opts.offset)\n } else {\n return results.slice(opts.offset)\n }\n },\n\n _between (leftKeys, rightKeys, opts) {\n let results = []\n\n let leftKey = leftKeys.shift()\n let rightKey = rightKeys.shift()\n\n let pos\n\n if (leftKey !== undefined) {\n pos = binarySearch(this.keys, leftKey)\n } else {\n pos = {\n found: false,\n index: 0\n }\n }\n\n if (leftKeys.length === 0) {\n if (pos.found && opts.leftInclusive === false) {\n pos.index += 1\n }\n\n for (let i = pos.index; i < this.keys.length; i += 1) {\n if (rightKey !== undefined) {\n if (opts.rightInclusive) {\n if (this.keys[i] > rightKey) { break }\n } else {\n if (this.keys[i] >= rightKey) { break }\n }\n }\n\n if (this.values[i].isIndex) {\n results = results.concat(this.values[i].getAll())\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n } else {\n for (let i = pos.index; i < this.keys.length; i += 1) {\n let currKey = this.keys[i]\n if (currKey > rightKey) { break }\n\n if (this.values[i].isIndex) {\n if (currKey === leftKey) {\n results = results.concat(this.values[i]._between(utils.copy(leftKeys), rightKeys.map(function () { return undefined }), opts))\n } else if (currKey === rightKey) {\n results = results.concat(this.values[i]._between(leftKeys.map(function () { return undefined }), utils.copy(rightKeys), opts))\n } else {\n results = results.concat(this.values[i].getAll())\n }\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n }\n\n if (opts.limit) {\n return results.slice(0, opts.limit + opts.offset)\n } else {\n return results\n }\n },\n\n peek () {\n if (this.values.length) {\n if (this.values[0].isIndex) {\n return this.values[0].peek()\n } else {\n return this.values[0]\n }\n }\n return []\n },\n\n clear () {\n this.keys = []\n this.values = []\n },\n\n insertRecord (data) {\n let keyList = this.fieldList.map(function (field) {\n if (utils.isFunction(field)) {\n return field(data) || undefined\n } else {\n return data[field] || undefined\n }\n })\n this.set(keyList, data)\n },\n\n removeRecord (data) {\n let removed\n const isUnique = this.hashCode(data) !== undefined\n this.values.forEach((value, i) => {\n if (value.isIndex) {\n if (value.removeRecord(data)) {\n if (value.keys.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n } else {\n let dataLocation = {}\n if (this.keys[i] === undefined || !isUnique) {\n for (let j = value.length - 1; j >= 0; j--) {\n if (value[j] === data) {\n dataLocation = {\n found: true,\n index: j\n }\n break\n }\n }\n } else if (isUnique) {\n dataLocation = binarySearch(value, data, this.hashCode)\n }\n if (dataLocation.found) {\n removeAt(value, dataLocation.index)\n if (value.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n }\n })\n return removed ? data : undefined\n },\n\n updateRecord (data) {\n const removed = this.removeRecord(data)\n if (removed !== undefined) {\n this.insertRecord(data)\n }\n }\n})\n","import utils from './utils'\nimport Component from './Component'\nimport Query from './Query'\nimport Record from './Record'\nimport Index from '../lib/mindex/index'\n\nconst { noValidatePath } = Record\n\nconst DOMAIN = 'Collection'\n\nconst COLLECTION_DEFAULTS = {\n /**\n * Whether to call {@link Record#commit} on records that are added to the\n * collection and already exist in the collection.\n *\n * @name Collection#commitOnMerge\n * @type {boolean}\n * @default true\n */\n commitOnMerge: true,\n\n /**\n * Whether record events should bubble up and be emitted by the collection.\n *\n * @name Collection#emitRecordEvents\n * @type {boolean}\n * @default true\n */\n emitRecordEvents: true,\n\n /**\n * Field to be used as the unique identifier for records in this collection.\n * Defaults to `\"id\"` unless {@link Collection#mapper} is set, in which case\n * this will default to {@link Mapper#idAttribute}.\n *\n * @name Collection#idAttribute\n * @type {string}\n * @default \"id\"\n */\n idAttribute: 'id',\n\n /**\n * What to do when inserting a record into this Collection that shares a\n * primary key with a record already in this Collection.\n *\n * Possible values:\n * merge\n * replace\n * skip\n *\n * Merge:\n *\n * Recursively shallow copy properties from the new record onto the existing\n * record.\n *\n * Replace:\n *\n * Shallow copy top-level properties from the new record onto the existing\n * record. Any top-level own properties of the existing record that are _not_\n * on the new record will be removed.\n *\n * Skip:\n *\n * Ignore new record, keep existing record.\n *\n * @name Collection#onConflict\n * @type {string}\n * @default \"merge\"\n */\n onConflict: 'merge'\n}\n\n/**\n * An ordered set of {@link Record} instances.\n *\n * @example Collection#constructor\n * // import {Collection, Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const user1 = new Record({ id: 1 })\n * const user2 = new Record({ id: 2 })\n * const UserCollection = new Collection([user1, user2])\n * console.log(UserCollection.get(1) === user1)\n *\n * @class Collection\n * @extends Component\n * @param {Array} [records] Initial set of records to insert into the\n * collection.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}.\n * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}.\n * @param {string} [opts.onConflict=\"merge\"] See {@link Collection#onConflict}.\n * @param {string} [opts.mapper] See {@link Collection#mapper}.\n * @since 3.0.0\n */\nfunction Collection (records, opts) {\n utils.classCallCheck(this, Collection)\n Component.call(this, opts)\n\n if (records && !utils.isArray(records)) {\n opts = records\n records = []\n }\n if (utils.isString(opts)) {\n opts = { idAttribute: opts }\n }\n\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * Default Mapper for this collection. Optional. If a Mapper is provided, then\n * the collection will use the {@link Mapper#idAttribute} setting, and will\n * wrap records in {@link Mapper#recordClass}.\n *\n * @example Collection#mapper\n * // Normally you would do: import {Collection, Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const myMapper = new MyMapperClass({ name: 'myMapper' })\n * const collection = new Collection(null, { mapper: myMapper })\n *\n * @name Collection#mapper\n * @type {Mapper}\n * @default null\n * @since 3.0.0\n */\n mapper: {\n value: undefined,\n writable: true\n },\n // Query class used by this collection\n queryClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(COLLECTION_DEFAULTS))\n\n if (!this.queryClass) {\n this.queryClass = Query\n }\n\n const idAttribute = this.recordId()\n\n Object.defineProperties(this, {\n /**\n * The main index, which uses @{link Collection#recordId} as the key.\n *\n * @name Collection#index\n * @type {Index}\n */\n index: {\n value: new Index([idAttribute], {\n hashCode (obj) {\n return utils.get(obj, idAttribute)\n }\n })\n },\n\n /**\n * Object that holds the secondary indexes of this collection.\n *\n * @name Collection#indexes\n * @type {Object.}\n */\n indexes: {\n value: {}\n }\n })\n\n // Insert initial data into the collection\n if (utils.isObject(records) || (utils.isArray(records) && records.length)) {\n this.add(records)\n }\n}\n\nexport default Component.extend({\n constructor: Collection,\n\n /**\n * Used to bind to events emitted by records in this Collection.\n *\n * @method Collection#_onRecordEvent\n * @since 3.0.0\n * @private\n * @param {...*} [arg] Args passed to {@link Collection#emit}.\n */\n _onRecordEvent (...args) {\n if (this.emitRecordEvents) {\n this.emit(...args)\n }\n },\n\n /**\n * Insert the provided record or records.\n *\n * If a record is already in the collection then the provided record will\n * either merge with or replace the existing record based on the value of the\n * `onConflict` option.\n *\n * The collection's secondary indexes will be updated as each record is\n * visited.\n *\n * @method Collection#add\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} data The record or records to insert.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}.\n * @param {boolean} [opts.noValidate] See {@link Record#noValidate}.\n * @param {string} [opts.onConflict] See {@link Collection#onConflict}.\n * @returns {(Object|Object[]|Record|Record[])} The added record or records.\n */\n add (records, opts) {\n // Default values for arguments\n opts || (opts = {})\n\n // Fill in \"opts\" with the Collection's configuration\n utils._(opts, this)\n records = this.beforeAdd(records, opts) || records\n\n // Track whether just one record or an array of records is being inserted\n let singular = false\n const idAttribute = this.recordId()\n if (!utils.isArray(records)) {\n if (utils.isObject(records)) {\n records = [records]\n singular = true\n } else {\n throw utils.err(`${DOMAIN}#add`, 'records')(400, 'object or array', records)\n }\n }\n\n // Map the provided records to existing records.\n // New records will be inserted. If any records map to existing records,\n // they will be merged into the existing records according to the onConflict\n // option.\n records = records.map((record) => {\n let id = this.recordId(record)\n // Grab existing record if there is one\n const existing = id === undefined ? id : this.get(id)\n // If the currently visited record is just a reference to an existing\n // record, then there is nothing to be done. Exit early.\n if (record === existing) {\n return existing\n }\n\n if (existing) {\n // Here, the currently visited record corresponds to a record already\n // in the collection, so we need to merge them\n const onConflict = opts.onConflict || this.onConflict\n if (onConflict !== 'merge' && onConflict !== 'replace' && onConflict !== 'skip') {\n throw utils.err(`${DOMAIN}#add`, 'opts.onConflict')(400, 'one of (merge, replace, skip)', onConflict, true)\n }\n const existingNoValidate = existing._get(noValidatePath)\n if (opts.noValidate) {\n // Disable validation\n existing._set(noValidatePath, true)\n }\n if (onConflict === 'merge') {\n utils.deepMixIn(existing, record)\n } else if (onConflict === 'replace') {\n utils.forOwn(existing, (value, key) => {\n if (key !== idAttribute && record[key] === undefined) {\n existing[key] = undefined\n }\n })\n existing.set(record)\n } // else if(onConflict === 'skip'){ do nothing }\n\n if (opts.noValidate) {\n // Restore previous `noValidate` value\n existing._set(noValidatePath, existingNoValidate)\n }\n record = existing\n if (opts.commitOnMerge && utils.isFunction(record.commit)) {\n record.commit()\n }\n // Update all indexes in the collection\n this.updateIndexes(record)\n } else {\n // Here, the currently visted record does not correspond to any record\n // in the collection, so (optionally) instantiate this record and insert\n // it into the collection\n record = this.mapper ? this.mapper.createRecord(record, opts) : record\n this.index.insertRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.insertRecord(record)\n })\n if (record && utils.isFunction(record.on)) {\n record.on('all', this._onRecordEvent, this)\n }\n }\n return record\n })\n // Finally, return the inserted data\n const result = singular ? records[0] : records\n if (!opts.silent) {\n this.emit('add', result)\n }\n return this.afterAdd(records, opts, result) || result\n },\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then {@link Collection#add} will return that same value.\n *\n * @method Collection#method\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} result The record or records\n * that were added to this Collection by {@link Collection#add}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#add}.\n */\n afterAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}. If this method returns\n * a value then {@link Collection#remove} will return that same value.\n *\n * @method Collection#afterRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#remove}.\n * @param {Object} record The result that will be returned by {@link Collection#remove}.\n */\n afterRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}. If this method\n * returns a value then {@link Collection#removeAll} will return that same\n * value.\n *\n * @method Collection#afterRemoveAll\n * @since 3.0.0\n * @param {Object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}.\n * @param {Object} records The result that will be returned by {@link Collection#removeAll}.\n */\n afterRemoveAll () {},\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then the `records` argument in {@link Collection#add} will be\n * re-assigned to the returned value.\n *\n * @method Collection#beforeAdd\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#add}.\n */\n beforeAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}.\n *\n * @method Collection#beforeRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#remove}.\n */\n beforeRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}.\n *\n * @method Collection#beforeRemoveAll\n * @since 3.0.0\n * @param {Object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}.\n */\n beforeRemoveAll () {},\n\n /**\n * Find all records between two boundaries.\n *\n * Shortcut for `collection.query().between(18, 30, { index: 'age' }).run()`\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = collection.between(18, 30, { index: 'age' })\n *\n * @example\n * // Same as above\n * const users = collection.between([18], [30], { index: 'age' })\n *\n * @method Collection#between\n * @since 3.0.0\n * @param {Array} leftKeys Keys defining the left boundary.\n * @param {Array} rightKeys Keys defining the right boundary.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting records to skip.\n * @returns {Object[]|Record[]} The result.\n */\n between (leftKeys, rightKeys, opts) {\n return this.query().between(leftKeys, rightKeys, opts).run()\n },\n\n /**\n * Create a new secondary index on the contents of the collection.\n *\n * @example\n * // Index users by age\n * collection.createIndex('age')\n *\n * @example\n * // Index users by status and role\n * collection.createIndex('statusAndRole', ['status', 'role'])\n *\n * @method Collection#createIndex\n * @since 3.0.0\n * @param {string} name The name of the new secondary index.\n * @param {string[]} [fieldList] Array of field names to use as the key or\n * compound key of the new secondary index. If no fieldList is provided, then\n * the name will also be the field that is used to index the collection.\n */\n createIndex (name, fieldList, opts) {\n if (utils.isString(name) && fieldList === undefined) {\n fieldList = [name]\n }\n opts || (opts = {})\n opts.hashCode || (opts.hashCode = (obj) => this.recordId(obj))\n const index = this.indexes[name] = new Index(fieldList, opts)\n this.index.visitAll(index.insertRecord, index)\n },\n\n /**\n * Find the record or records that match the provided query or pass the\n * provided filter function.\n *\n * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()`\n *\n * @example Collection#filter\n * // Normally you would do: import {Collection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const collection = new Collection([\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * // Get the draft posts created less than three months ago\n * let posts = collection.filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * })\n * console.log(posts)\n *\n * // Use a custom filter function\n * posts = collection.filter(function (post) {\n * return post.id % 2 === 0\n * })\n *\n * @method Collection#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Object} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Array} The result.\n * @see query\n * @since 3.0.0\n */\n filter (query, thisArg) {\n return this.query().filter(query, thisArg).run()\n },\n\n /**\n * Iterate over all records.\n *\n * @example\n * collection.forEach(function (record) {\n * // do something\n * })\n *\n * @method Collection#forEach\n * @since 3.0.0\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Array} The result.\n */\n forEach (cb, thisArg) {\n this.index.visitAll(cb, thisArg)\n },\n\n /**\n * Get the record with the given id.\n *\n * @method Collection#get\n * @since 3.0.0\n * @param {(string|number)} id The primary key of the record to get.\n * @returns {(Object|Record)} The record with the given id.\n */\n get (id) {\n const instances = id === undefined ? [] : this.query().get(id).run()\n return instances.length ? instances[0] : undefined\n },\n\n /**\n * Find the record or records that match the provided keyLists.\n *\n * Shortcut for `collection.query().getAll(keyList1, keyList2, ...).run()`\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = collection.getAll('draft', 'inReview', { index: 'status' })\n *\n * @example\n * // Same as above\n * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' })\n *\n * @method Collection#getAll\n * @since 3.0.0\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * records matching each keyList will be retrieved. If no keyLists are\n * provided, all records will be returned.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Array} The result.\n */\n getAll (...args) {\n return this.query().getAll(...args).run()\n },\n\n /**\n * Return the index with the given name. If no name is provided, return the\n * main index. Throws an error if the specified index does not exist.\n *\n * @method Collection#getIndex\n * @since 3.0.0\n * @param {string} [name] The name of the index to retrieve.\n */\n getIndex (name) {\n const index = name ? this.indexes[name] : this.index\n if (!index) {\n throw utils.err(`${DOMAIN}#getIndex`, name)(404, 'index')\n }\n return index\n },\n\n /**\n * Limit the result.\n *\n * Shortcut for `collection.query().limit(maximumNumber).run()`\n *\n * @example\n * const posts = collection.limit(10)\n *\n * @method Collection#limit\n * @since 3.0.0\n * @param {number} num The maximum number of records to keep in the result.\n * @returns {Array} The result.\n */\n limit (num) {\n return this.query().limit(num).run()\n },\n\n /**\n * Apply a mapping function to all records.\n *\n * @example\n * const names = collection.map(function (user) {\n * return user.name\n * })\n *\n * @method Collection#map\n * @since 3.0.0\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Array} The result of the mapping.\n */\n map (cb, thisArg) {\n const data = []\n this.index.visitAll(function (value) {\n data.push(cb.call(thisArg, value))\n })\n return data\n },\n\n /**\n * Return the result of calling the specified function on each record in this\n * collection's main index.\n *\n * @method Collection#mapCall\n * @since 3.0.0\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Array} The result.\n */\n mapCall (funcName, ...args) {\n const data = []\n this.index.visitAll(function (record) {\n data.push(record[funcName](...args))\n })\n return data\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#prune\n * @param {Object} [opts] Configuration options, passed to {@link Collection#removeAll}.\n * @since 3.0.0\n * @returns {Array} The removed records, if any.\n */\n prune (opts) {\n return this.removeAll(this.unsaved(), opts)\n },\n\n /**\n * Create a new query to be executed against the contents of the collection.\n * The result will be all or a subset of the contents of the collection.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * collection.query()\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run()\n *\n * @method Collection#query\n * @since 3.0.0\n * @returns {Query} New query object.\n */\n query () {\n const Ctor = this.queryClass\n return new Ctor(this)\n },\n\n /**\n * Return the primary key of the given, or if no record is provided, return the\n * name of the field that holds the primary key of records in this Collection.\n *\n * @method Collection#recordId\n * @since 3.0.0\n * @param {(Object|Record)} [record] The record whose primary key is to be\n * returned.\n * @returns {(string|number)} Primary key or name of field that holds primary\n * key.\n */\n recordId (record) {\n if (record) {\n return utils.get(record, this.recordId())\n }\n return this.mapper ? this.mapper.idAttribute : this.idAttribute\n },\n\n /**\n * Reduce the data in the collection to a single value and return the result.\n *\n * @example\n * const totalVotes = collection.reduce(function (prev, record) {\n * return prev + record.upVotes + record.downVotes\n * }, 0)\n *\n * @method Collection#reduce\n * @since 3.0.0\n * @param {Function} cb Reduction callback.\n * @param {*} initialValue Initial value of the reduction.\n * @returns {*} The result.\n */\n reduce (cb, initialValue) {\n const data = this.getAll()\n return data.reduce(cb, initialValue)\n },\n\n /**\n * Remove the record with the given id from this Collection.\n *\n * @method Collection#remove\n * @since 3.0.0\n * @param {(string|number|object|Record)} idOrRecord The primary key of the\n * record to be removed, or a reference to the record that is to be removed.\n * @param {Object} [opts] Configuration options.\n * @returns {Object|Record} The removed record, if any.\n */\n remove (idOrRecord, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemove(idOrRecord, opts)\n let record = utils.isSorN(idOrRecord) ? this.get(idOrRecord) : idOrRecord\n\n // The record is in the collection, remove it\n if (utils.isObject(record)) {\n record = this.index.removeRecord(record)\n if (record) {\n utils.forOwn(this.indexes, function (index, name) {\n index.removeRecord(record)\n })\n if (utils.isFunction(record.off)) {\n record.off('all', this._onRecordEvent, this)\n if (!opts.silent) {\n this.emit('remove', record)\n }\n }\n }\n }\n return this.afterRemove(idOrRecord, opts, record) || record\n },\n\n /**\n * Remove from this collection the given records or the records selected by\n * the given \"query\".\n *\n * @method Collection#removeAll\n * @since 3.0.0\n * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}.\n * @param {Object} [queryOrRecords.where] See {@link query.where}.\n * @param {number} [queryOrRecords.offset] See {@link query.offset}.\n * @param {number} [queryOrRecords.limit] See {@link query.limit}.\n * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options.\n * @returns {(Object[]|Record[])} The removed records, if any.\n */\n removeAll (queryOrRecords, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemoveAll(queryOrRecords, opts)\n let records = utils.isArray(queryOrRecords) ? queryOrRecords.slice() : this.filter(queryOrRecords)\n\n // Remove each selected record from the collection\n const optsCopy = utils.plainCopy(opts)\n optsCopy.silent = true\n records = records\n .map((record) => this.remove(record, optsCopy))\n .filter((record) => record)\n if (!opts.silent) {\n this.emit('remove', records)\n }\n return this.afterRemoveAll(queryOrRecords, opts, records) || records\n },\n\n /**\n * Skip a number of results.\n *\n * Shortcut for `collection.query().skip(numberToSkip).run()`\n *\n * @example\n * const posts = collection.skip(10)\n *\n * @method Collection#skip\n * @since 3.0.0\n * @param {number} num The number of records to skip.\n * @returns {Array} The result.\n */\n skip (num) {\n return this.query().skip(num).run()\n },\n\n /**\n * Return the plain JSON representation of all items in this collection.\n * Assumes records in this collection have a toJSON method.\n *\n * @method Collection#toJSON\n * @since 3.0.0\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation.\n * @returns {Array} The records.\n */\n toJSON (opts) {\n return this.mapCall('toJSON', opts)\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#unsaved\n * @since 3.0.0\n * @returns {Array} The unsaved records, if any.\n */\n unsaved (opts) {\n return this.index.get()\n },\n\n /**\n * Update a record's position in a single index of this collection. See\n * {@link Collection#updateIndexes} to update a record's position in all\n * indexes at once.\n *\n * @method Collection#updateIndex\n * @since 3.0.0\n * @param {Object} record The record to update.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] The index in which to update the record's\n * position. If you don't specify an index then the record will be updated\n * in the main index.\n */\n updateIndex (record, opts) {\n opts || (opts = {})\n this.getIndex(opts.index).updateRecord(record)\n },\n\n /**\n * Updates all indexes in this collection for the provided record. Has no\n * effect if the record is not in the collection.\n *\n * @method Collection#updateIndexes\n * @since 3.0.0\n * @param {Object} record TODO\n */\n updateIndexes (record) {\n this.index.updateRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.updateRecord(record)\n })\n }\n})\n\n/**\n * Fired when a record changes. Only works for records that have tracked changes.\n * See {@link Collection~changeListener} on how to listen for this event.\n *\n * @event Collection#change\n * @see Collection~changeListener\n */\n\n/**\n * Callback signature for the {@link Collection#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * collection.on('change', onChange)\n *\n * @callback Collection~changeListener\n * @param {Record} The Record that changed.\n * @param {Object} The changes.\n * @see Collection#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the Collection. See\n * {@link Collection~addListener} on how to listen for this event.\n *\n * @event Collection#add\n * @see Collection~addListener\n * @see Collection#event:add\n * @see Collection#add\n */\n\n/**\n * Callback signature for the {@link Collection#event:add} event.\n *\n * @example\n * function onAdd (recordOrRecords) {\n * // do something\n * }\n * collection.on('add', onAdd)\n *\n * @callback Collection~addListener\n * @param {Record|Record[]} The Record or Records that were added.\n * @see Collection#event:add\n * @see Collection#add\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the Collection. See\n * {@link Collection~removeListener} for how to listen for this event.\n *\n * @event Collection#remove\n * @see Collection~removeListener\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n */\n\n/**\n * Callback signature for the {@link Collection#event:remove} event.\n *\n * @example\n * function onRemove (recordsOrRecords) {\n * // do something\n * }\n * collection.on('remove', onRemove)\n *\n * @callback Collection~removeListener\n * @param {Record|Record[]} Record or Records that were removed.\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Collection:\n * @example Collection.extend\n * // Normally you would do: import {Collection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomCollectionClass extends Collection {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customCollection = new CustomCollectionClass()\n * console.log(customCollection.foo())\n * console.log(CustomCollectionClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherCollectionClass = Collection.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherCollection = new OtherCollectionClass()\n * console.log(otherCollection.foo())\n * console.log(OtherCollectionClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherCollectionClass () {\n * Collection.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Collection.extend({\n * constructor: AnotherCollectionClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherCollection = new AnotherCollectionClass()\n * console.log(anotherCollection.created_at)\n * console.log(anotherCollection.foo())\n * console.log(AnotherCollectionClass.beep())\n *\n * @method Collection.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Collection class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Schema'\n\n/**\n * A function map for each of the seven primitive JSON types defined by the core specification.\n * Each function will check a given value and return true or false if the value is an instance of that type.\n * ```\n * types.integer(1) // returns true\n * types.string({}) // returns false\n * ```\n * http://json-schema.org/latest/json-schema-core.html#anchor8\n * @name Schema.types\n * @type {object}\n */\nconst types = {\n array: utils.isArray,\n boolean: utils.isBoolean,\n integer: utils.isInteger,\n 'null': utils.isNull,\n number: utils.isNumber,\n object: utils.isObject,\n string: utils.isString\n}\n\n/**\n * @ignore\n */\nconst segmentToString = function (segment, prev) {\n let str = ''\n if (segment) {\n if (utils.isNumber(segment)) {\n str += `[${segment}]`\n } else if (prev) {\n str += `.${segment}`\n } else {\n str += `${segment}`\n }\n }\n return str\n}\n\n/**\n * @ignore\n */\nconst makePath = function (opts) {\n opts || (opts = {})\n let path = ''\n const segments = opts.path || []\n segments.forEach(function (segment) {\n path += segmentToString(segment, path)\n })\n path += segmentToString(opts.prop, path)\n return path\n}\n\n/**\n * @ignore\n */\nconst makeError = function (actual, expected, opts) {\n return {\n expected,\n actual: '' + actual,\n path: makePath(opts)\n }\n}\n\n/**\n * @ignore\n */\nconst addError = function (actual, expected, opts, errors) {\n errors.push(makeError(actual, expected, opts))\n}\n\n/**\n * @ignore\n */\nconst maxLengthCommon = function (keyword, value, schema, opts) {\n const max = schema[keyword]\n if (value.length > max) {\n return makeError(value.length, `length no more than ${max}`, opts)\n }\n}\n\n/**\n * @ignore\n */\nconst minLengthCommon = function (keyword, value, schema, opts) {\n const min = schema[keyword]\n if (value.length < min) {\n return makeError(value.length, `length no less than ${min}`, opts)\n }\n}\n\n/**\n * A map of all object member validation functions for each keyword defined in the JSON Schema.\n * @name Schema.validationKeywords\n * @type {object}\n */\nconst validationKeywords = {\n /**\n * Validates the provided value against all schemas defined in the Schemas `allOf` keyword.\n * The instance is valid against if and only if it is valid against all the schemas declared in the Schema's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be a valid JSON Schema.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor82\n *\n * @name Schema.validationKeywords.allOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `allOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n allOf (value, schema, opts) {\n let allErrors = []\n schema.allOf.forEach(function (_schema) {\n allErrors = allErrors.concat(validate(value, _schema, opts) || [])\n })\n return allErrors.length ? allErrors : undefined\n },\n\n /**\n * Validates the provided value against all schemas defined in the Schemas `anyOf` keyword.\n * The instance is valid against this keyword if and only if it is valid against\n * at least one of the schemas in this keyword's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be an object, and each object MUST be a valid JSON Schema.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor85\n *\n * @name Schema.validationKeywords.anyOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `anyOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n anyOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.anyOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * http://json-schema.org/latest/json-schema-validation.html#anchor70\n *\n * @name Schema.validationKeywords.dependencies\n * @method\n * @param {*} value TODO\n * @param {object} schema TODO\n * @param {object} opts TODO\n */\n dependencies (value, schema, opts) {\n // TODO\n },\n\n /**\n * Validates the provided value against an array of possible values defined by the Schema's `enum` keyword\n * Validation succeeds if the value is deeply equal to one of the values in the array.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor76\n *\n * @name Schema.validationKeywords.enum\n * @method\n * @param {*} value Value to validate\n * @param {object} schema Schema containing the `enum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n enum (value, schema, opts) {\n const possibleValues = schema['enum']\n if (utils.findIndex(possibleValues, (item) => utils.deepEqual(item, value)) === -1) {\n return makeError(value, `one of (${possibleValues.join(', ')})`, opts)\n }\n },\n\n /**\n * Validates each of the provided array values against a schema or an array of schemas defined by the Schema's `items` keyword\n * see http://json-schema.org/latest/json-schema-validation.html#anchor37 for validation rules.\n *\n * @name Schema.validationKeywords.items\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the items keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n items (value, schema, opts) {\n opts || (opts = {})\n // TODO: additionalItems\n let items = schema.items\n let errors = []\n const checkingTuple = utils.isArray(items)\n const length = value.length\n for (var prop = 0; prop < length; prop++) {\n if (checkingTuple) {\n // Validating a tuple, instead of just checking each item against the\n // same schema\n items = schema.items[prop]\n }\n opts.prop = prop\n errors = errors.concat(validate(value[prop], items, opts) || [])\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided number against a maximum value defined by the Schema's `maximum` keyword\n * Validation succeeds if the value is a number, and is less than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor17\n *\n * @name Schema.validationKeywords.maximum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `maximum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maximum (value, schema, opts) {\n // Must be a number\n const maximum = schema.maximum\n // Must be a boolean\n // Depends on maximum\n // default: false\n const exclusiveMaximum = schema.exclusiveMaximum\n if (typeof value === typeof maximum && !(exclusiveMaximum ? maximum > value : maximum >= value)) {\n return exclusiveMaximum\n ? makeError(value, `no more than nor equal to ${maximum}`, opts)\n : makeError(value, `no more than ${maximum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a maximum value defined by the Schema's `maxItems` keyword.\n * Validation succeeds if the length of the array is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor42\n *\n * @name Schema.validationKeywords.maxItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `maxItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return maxLengthCommon('maxItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a maximum value defined in the Schema's `maxLength` keyword.\n * Validation succeeds if the length of the string is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor26\n *\n * @name Schema.validationKeywords.maxLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `maxLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxLength (value, schema, opts) {\n return maxLengthCommon('maxLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a maximum value defined in the Schema's `maxProperties` keyword.\n * Validation succeeds if the object's property count is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor54\n *\n * @name Schema.validationKeywords.maxProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `maxProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const maxProperties = schema.maxProperties\n const length = Object.keys(value).length\n if (length > maxProperties) {\n return makeError(length, `no more than ${maxProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided value against a minimum value defined by the Schema's `minimum` keyword\n * Validation succeeds if the value is a number and is greater than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor21\n *\n * @name Schema.validationKeywords.minimum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `minimum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minimum (value, schema, opts) {\n // Must be a number\n const minimum = schema.minimum\n // Must be a boolean\n // Depends on minimum\n // default: false\n const exclusiveMinimum = schema.exclusiveMinimum\n if (typeof value === typeof minimum && !(exclusiveMinimum ? value > minimum : value >= minimum)) {\n return exclusiveMinimum\n ? makeError(value, `no less than nor equal to ${minimum}`, opts)\n : makeError(value, `no less than ${minimum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a minimum value defined by the Schema's `minItems` keyword.\n * Validation succeeds if the length of the array is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor45\n *\n * @name Schema.validationKeywords.minItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `minItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return minLengthCommon('minItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a minimum value defined in the Schema's `minLength` keyword.\n * Validation succeeds if the length of the string is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor29\n *\n * @name Schema.validationKeywords.minLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `minLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minLength (value, schema, opts) {\n return minLengthCommon('minLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a minimum value defined in the Schema's `minProperties` keyword.\n * Validation succeeds if the object's property count is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor57\n *\n * @name Schema.validationKeywords.minProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `minProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const minProperties = schema.minProperties\n const length = Object.keys(value).length\n if (length < minProperties) {\n return makeError(length, `no more than ${minProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided number is a multiple of the number defined in the Schema's `multipleOf` keyword.\n * Validation succeeds if the number can be divided equally into the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor14\n *\n * @name Schema.validationKeywords.multipleOf\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing the `multipleOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n multipleOf (value, schema, opts) {\n const multipleOf = schema.multipleOf\n if (utils.isNumber(value)) {\n if ((value / multipleOf) % 1 !== 0) {\n return makeError(value, `multipleOf ${multipleOf}`, opts)\n }\n }\n },\n\n /**\n * Validates the provided value is not valid with any of the schemas defined in the Schema's `not` keyword.\n * An instance is valid against this keyword if and only if it is NOT valid against the schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor91\n * @name Schema.validationKeywords.not\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the not keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n not (value, schema, opts) {\n if (!validate(value, schema.not, opts)) {\n // TODO: better messaging\n return makeError('succeeded', 'should have failed', opts)\n }\n },\n\n /**\n * Validates the provided value is valid with one and only one of the schemas defined in the Schema's `oneOf` keyword.\n * An instance is valid against this keyword if and only if it is valid against a single schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor88\n * @name Schema.validationKeywords.oneOf\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the `oneOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n oneOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.oneOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else if (validated) {\n allErrors = [makeError('valid against more than one', 'valid against only one', opts)]\n validated = false\n return false\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * Validates the provided string matches a pattern defined in the Schema's `pattern` keyword.\n * Validation succeeds if the string is a match of the regex value of this keyword.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor33\n * @name Schema.validationKeywords.pattern\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `pattern` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n pattern (value, schema, opts) {\n const pattern = schema.pattern\n if (utils.isString(value) && !value.match(pattern)) {\n return makeError(value, pattern, opts)\n }\n },\n\n /**\n * Validates the provided object's properties against a map of values defined in the Schema's `properties` keyword.\n * Validation succeeds if the object's property are valid with each of the schema's in the provided map.\n * Validation also depends on the additionalProperties and or patternProperties.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor64 for more info.\n *\n * @name Schema.validationKeywords.properties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `properties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n properties (value, schema, opts) {\n opts || (opts = {})\n\n if (utils.isArray(value)) {\n return\n }\n\n // Can be a boolean or an object\n // Technically the default is an \"empty schema\", but here \"true\" is\n // functionally the same\n const additionalProperties = schema.additionalProperties === undefined ? true : schema.additionalProperties\n const validated = []\n // \"p\": The property set from \"properties\".\n // Default is an object\n const properties = schema.properties || {}\n // \"pp\": The property set from \"patternProperties\".\n // Default is an object\n const patternProperties = schema.patternProperties || {}\n let errors = []\n\n utils.forOwn(properties, function (_schema, prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n })\n\n const toValidate = utils.omit(value, validated)\n utils.forOwn(patternProperties, function (_schema, pattern) {\n utils.forOwn(toValidate, function (undef, prop) {\n if (prop.match(pattern)) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n }\n })\n })\n const keys = Object.keys(utils.omit(value, validated))\n // If \"s\" is not empty, validation fails\n if (additionalProperties === false) {\n if (keys.length) {\n const origProp = opts.prop\n opts.prop = ''\n addError(`extra fields: ${keys.join(', ')}`, 'no extra fields', opts, errors)\n opts.prop = origProp\n }\n } else if (utils.isObject(additionalProperties)) {\n // Otherwise, validate according to provided schema\n keys.forEach(function (prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], additionalProperties, opts) || [])\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided object's has all properties listed in the Schema's `properties` keyword array.\n * Validation succeeds if the object contains all properties provided in the array value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor61\n *\n * @name Schema.validationKeywords.required\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `required` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n required (value, schema, opts) {\n opts || (opts = {})\n const required = schema.required\n let errors = []\n if (!opts.existingOnly) {\n required.forEach(function (prop) {\n if (utils.get(value, prop) === undefined) {\n const prevProp = opts.prop\n opts.prop = prop\n addError(undefined, 'a value', opts, errors)\n opts.prop = prevProp\n }\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided value's type is equal to the type, or array of types, defined in the Schema's `type` keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor79\n *\n * @name Schema.validationKeywords.type\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `type` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n type (value, schema, opts) {\n let type = schema.type\n let validType\n // Can be one of several types\n if (utils.isString(type)) {\n type = [type]\n }\n // Try to match the value against an expected type\n type.forEach(function (_type) {\n // TODO: throw an error if type is not defined\n if (types[_type](value, schema, opts)) {\n // Matched a type\n validType = _type\n return false\n }\n })\n // Value did not match any expected type\n if (!validType) {\n return makeError(value !== undefined && value !== null ? typeof value : '' + value, `one of (${type.join(', ')})`, opts)\n }\n // Run keyword validators for matched type\n // http://json-schema.org/latest/json-schema-validation.html#anchor12\n const validator = typeGroupValidators[validType]\n if (validator) {\n return validator(value, schema, opts)\n }\n },\n\n /**\n * Validates the provided array values are unique.\n * Validation succeeds if the items in the array are unique, but only if the value of this keyword is true\n * see http://json-schema.org/latest/json-schema-validation.html#anchor49\n *\n * @name Schema.validationKeywords.uniqueItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `uniqueItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n uniqueItems (value, schema, opts) {\n if (value && value.length && schema.uniqueItems) {\n const length = value.length\n let item, i, j\n // Check n - 1 items\n for (i = length - 1; i > 0; i--) {\n item = value[i]\n // Only compare against unchecked items\n for (j = i - 1; j >= 0; j--) {\n // Found a duplicate\n if (utils.deepEqual(item, value[j])) {\n return makeError(item, 'no duplicates', opts)\n }\n }\n }\n }\n }\n}\n\n/**\n * @ignore\n */\nconst runOps = function (ops, value, schema, opts) {\n let errors = []\n ops.forEach(function (op) {\n if (schema[op] !== undefined) {\n errors = errors.concat(validationKeywords[op](value, schema, opts) || [])\n }\n })\n return errors.length ? errors : undefined\n}\n\n/**\n * Validation keywords validated for any type:\n *\n * - `enum`\n * - `type`\n * - `allOf`\n * - `anyOf`\n * - `oneOf`\n * - `not`\n *\n * @name Schema.ANY_OPS\n * @type {string[]}\n */\nconst ANY_OPS = ['enum', 'type', 'allOf', 'anyOf', 'oneOf', 'not']\n\n/**\n * Validation keywords validated for array types:\n *\n * - `items`\n * - `maxItems`\n * - `minItems`\n * - `uniqueItems`\n *\n * @name Schema.ARRAY_OPS\n * @type {string[]}\n */\nconst ARRAY_OPS = ['items', 'maxItems', 'minItems', 'uniqueItems']\n\n/**\n * Validation keywords validated for numeric (number and integer) types:\n *\n * - `multipleOf`\n * - `maximum`\n * - `minimum`\n *\n * @name Schema.NUMERIC_OPS\n * @type {string[]}\n */\nconst NUMERIC_OPS = ['multipleOf', 'maximum', 'minimum']\n\n/**\n * Validation keywords validated for object types:\n *\n * - `maxProperties`\n * - `minProperties`\n * - `required`\n * - `properties`\n * - `dependencies`\n *\n * @name Schema.OBJECT_OPS\n * @type {string[]}\n */\nconst OBJECT_OPS = ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n\n/**\n * Validation keywords validated for string types:\n *\n * - `maxLength`\n * - `minLength`\n * - `pattern`\n *\n * @name Schema.STRING_OPS\n * @type {string[]}\n */\nconst STRING_OPS = ['maxLength', 'minLength', 'pattern']\n\n/**\n * http://json-schema.org/latest/json-schema-validation.html#anchor75\n * @ignore\n */\nconst validateAny = function (value, schema, opts) {\n return runOps(ANY_OPS, value, schema, opts)\n}\n\n/**\n * Validates the provided value against a given Schema according to the http://json-schema.org/ v4 specification.\n *\n * @name Schema.validate\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Valid Schema according to the http://json-schema.org/ v4 specification.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\nconst validate = function (value, schema, opts) {\n let errors = []\n opts || (opts = {})\n opts.ctx || (opts.ctx = { value, schema })\n let shouldPop\n let prevProp = opts.prop\n if (schema === undefined) {\n return\n }\n if (!utils.isObject(schema)) {\n throw utils.err(`${DOMAIN}#validate`)(500, `Invalid schema at path: \"${opts.path}\"`)\n }\n if (opts.path === undefined) {\n opts.path = []\n }\n // Track our location as we recurse\n if (opts.prop !== undefined) {\n shouldPop = true\n opts.path.push(opts.prop)\n opts.prop = undefined\n }\n // Validate against parent schema\n if (schema['extends']) {\n // opts.path = path\n // opts.prop = prop\n if (utils.isFunction(schema['extends'].validate)) {\n errors = errors.concat(schema['extends'].validate(value, opts) || [])\n } else {\n errors = errors.concat(validate(value, schema['extends'], opts) || [])\n }\n }\n if (value === undefined) {\n // Check if property is required\n if (schema.required === true && !opts.existingOnly) {\n addError(value, 'a value', opts, errors)\n }\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n }\n\n errors = errors.concat(validateAny(value, schema, opts) || [])\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n}\n\n// These strings are cached for optimal performance of the change detection\n// boolean - Whether a Record is changing in the current execution frame\nconst changingPath = 'changing'\n// string[] - Properties that have changed in the current execution frame\nconst changedPath = 'changed'\n// Object[] - History of change records\nconst changeHistoryPath = 'history'\n// boolean - Whether a Record is currently being instantiated\nconst creatingPath = 'creating'\n// number - The setTimeout change event id of a Record, if any\nconst eventIdPath = 'eventId'\n// boolean - Whether to skip validation for a Record's currently changing property\nconst noValidatePath = 'noValidate'\n// boolean - Whether to preserve Change History for a Record\nconst keepChangeHistoryPath = 'keepChangeHistory'\n// boolean - Whether to skip change notification for a Record's currently\n// changing property\nconst silentPath = 'silent'\nconst validationFailureMsg = 'validation failed'\n\n/**\n * A map of validation functions grouped by type.\n *\n * @name Schema.typeGroupValidators\n * @type {object}\n */\nconst typeGroupValidators = {\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an array.\n * The validation keywords for the type `array` are:\n *```\n * ['items', 'maxItems', 'minItems', 'uniqueItems']\n *```\n * see http://json-schema.org/latest/json-schema-validation.html#anchor25\n *\n * @name Schema.typeGroupValidators.array\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing at least one array keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n array: function (value, schema, opts) {\n return runOps(ARRAY_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an integer.\n * The validation keywords for the type `integer` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.integer\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `integer` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n integer: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an number.\n * The validation keywords for the type `number` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.number\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `number` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n number: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of a number or integer.\n * The validation keywords for the type `numeric` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor13.\n *\n * @name Schema.typeGroupValidators.numeric\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `numeric` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n numeric: function (value, schema, opts) {\n return runOps(NUMERIC_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an object.\n * The validation keywords for the type `object` are:\n *```\n * ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor53.\n *\n * @name Schema.typeGroupValidators.object\n * @method\n * @param {*} value Object to be validated.\n * @param {Object} schema Schema containing at least one `object` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n object: function (value, schema, opts) {\n return runOps(OBJECT_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an string.\n * The validation keywords for the type `string` are:\n *```\n * ['maxLength', 'minLength', 'pattern']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor25.\n *\n * @name Schema.typeGroupValidators.string\n * @method\n * @param {*} value String to be validated.\n * @param {Object} schema Schema containing at least one `string` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n string: function (value, schema, opts) {\n return runOps(STRING_OPS, value, schema, opts)\n }\n}\n\n/**\n * js-data's Schema class.\n *\n * @example Schema#constructor\n * // Normally you would do: import {Schema} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Schema} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const PostSchema = new Schema({\n * type: 'object',\n * properties: {\n * title: { type: 'string' }\n * }\n * })\n * PostSchema.validate({ title: 1234 })\n *\n * @class Schema\n * @extends Component\n * @param {object} definition Schema definition according to json-schema.org\n */\nfunction Schema (definition) {\n definition || (definition = {})\n // TODO: schema validation\n utils.fillIn(this, definition)\n\n if (this.type === 'object') {\n this.properties = this.properties || {}\n utils.forOwn(this.properties, (_definition, prop) => {\n if (!(_definition instanceof Schema)) {\n this.properties[prop] = new Schema(_definition)\n }\n })\n } else if (this.type === 'array' && this.items && !(this.items instanceof Schema)) {\n this.items = new Schema(this.items)\n }\n if (this.extends && !(this.extends instanceof Schema)) {\n this.extends = new Schema(this.extends)\n }\n ['allOf', 'anyOf', 'oneOf'].forEach((validationKeyword) => {\n if (this[validationKeyword]) {\n this[validationKeyword].forEach((_definition, i) => {\n if (!(_definition instanceof Schema)) {\n this[validationKeyword][i] = new Schema(_definition)\n }\n })\n }\n })\n}\n\nexport default Component.extend({\n constructor: Schema,\n\n /**\n * This adds ES5 getters/setters to the target based on the \"properties\" in\n * this Schema, which makes possible change tracking and validation on\n * property assignment.\n *\n * @name Schema#apply\n * @method\n * @param {object} target The prototype to which to apply this schema.\n */\n apply (target, opts) {\n opts || (opts = {})\n opts.getter || (opts.getter = '_get')\n opts.setter || (opts.setter = '_set')\n opts.unsetter || (opts.unsetter = '_unset')\n opts.track || (opts.track = this.track)\n const properties = this.properties || {}\n utils.forOwn(properties, (schema, prop) => {\n Object.defineProperty(\n target,\n prop,\n this.makeDescriptor(prop, schema, opts)\n )\n })\n },\n\n /**\n * Apply default values to the target object for missing values.\n *\n * @name Schema#applyDefaults\n * @method\n * @param {object} target The target to which to apply values for missing values.\n */\n applyDefaults (target) {\n if (!target) {\n return\n }\n const properties = this.properties || {}\n const hasSet = utils.isFunction(target.set) || utils.isFunction(target._set)\n utils.forOwn(properties, function (schema, prop) {\n if (schema.hasOwnProperty('default') && utils.get(target, prop) === undefined) {\n if (hasSet) {\n target.set(prop, utils.plainCopy(schema['default']), { silent: true })\n } else {\n utils.set(target, prop, utils.plainCopy(schema['default']))\n }\n }\n if (schema.type === 'object' && schema.properties) {\n if (hasSet) {\n const orig = target._get('noValidate')\n target._set('noValidate', true)\n utils.set(target, prop, utils.get(target, prop) || {}, { silent: true })\n target._set('noValidate', orig)\n } else {\n utils.set(target, prop, utils.get(target, prop) || {})\n }\n schema.applyDefaults(utils.get(target, prop))\n }\n })\n },\n\n /**\n * Assemble a property descriptor for tracking and validating changes to\n * a property according to the given schema. This method is called when\n * {@link Mapper#applySchema} is set to `true`.\n *\n * @name Schema#makeDescriptor\n * @method\n * @param {string} prop The property name.\n * @param {(Schema|object)} schema The schema for the property.\n * @param {object} [opts] Optional configuration.\n * @param {function} [opts.getter] Custom getter function.\n * @param {function} [opts.setter] Custom setter function.\n * @param {function} [opts.track] Whether to track changes.\n * @returns {object} A property descriptor for the given schema.\n */\n makeDescriptor (prop, schema, opts) {\n const descriptor = {\n // Better to allow configurability, but at the user's own risk\n configurable: true,\n // These properties are enumerable by default, but regardless of their\n // enumerability, they won't be \"own\" properties of individual records\n enumerable: schema.enumerable === undefined ? true : !!schema.enumerable\n }\n // Cache a few strings for optimal performance\n const keyPath = `props.${prop}`\n const previousPath = `previous.${prop}`\n const getter = opts.getter\n const setter = opts.setter\n const unsetter = opts.unsetter\n const track = utils.isBoolean(opts.track) ? opts.track : schema.track\n\n descriptor.get = function () {\n return this._get(keyPath)\n }\n\n if (utils.isFunction(schema.get)) {\n const originalGet = descriptor.get\n descriptor.get = function () {\n return schema.get.call(this, originalGet)\n }\n }\n\n descriptor.set = function (value) {\n // These are accessed a lot\n const _get = this[getter]\n const _set = this[setter]\n const _unset = this[unsetter]\n // Optionally check that the new value passes validation\n if (!_get(noValidatePath)) {\n const errors = schema.validate(value, { path: [prop] })\n if (errors) {\n // Immediately throw an error, preventing the record from getting into\n // an invalid state\n const error = new Error(validationFailureMsg)\n error.errors = errors\n throw error\n }\n }\n // TODO: Make it so tracking can be turned on for all properties instead of\n // only per-property\n if (track && !_get(creatingPath)) {\n // previous is versioned on database commit\n // props are versioned on set()\n const previous = _get(previousPath)\n const current = _get(keyPath)\n let changing = _get(changingPath)\n let changed = _get(changedPath)\n\n if (!changing) {\n // Track properties that are changing in the current event loop\n changed = []\n }\n\n // Add changing properties to this array once at most\n const index = changed.indexOf(prop)\n if (current !== value && index === -1) {\n changed.push(prop)\n }\n if (previous === value) {\n if (index >= 0) {\n changed.splice(index, 1)\n }\n }\n // No changes in current event loop\n if (!changed.length) {\n changing = false\n _unset(changingPath)\n _unset(changedPath)\n // Cancel pending change event\n if (_get(eventIdPath)) {\n clearTimeout(_get(eventIdPath))\n _unset(eventIdPath)\n }\n }\n // Changes detected in current event loop\n if (!changing && changed.length) {\n _set(changedPath, changed)\n _set(changingPath, true)\n // Saving the timeout id allows us to batch all changes in the same\n // event loop into a single \"change\"\n // TODO: Optimize\n _set(eventIdPath, setTimeout(() => {\n // Previous event loop where changes were gathered has ended, so\n // notify any listeners of those changes and prepare for any new\n // changes\n _unset(changedPath)\n _unset(eventIdPath)\n _unset(changingPath)\n // TODO: Optimize\n if (!_get(silentPath)) {\n let i\n for (i = 0; i < changed.length; i++) {\n this.emit('change:' + changed[i], this, utils.get(this, changed[i]))\n }\n\n const changes = utils.diffObjects({ [prop]: value }, { [prop]: current })\n\n if (_get(keepChangeHistoryPath)) {\n const changeRecord = utils.plainCopy(changes)\n changeRecord.timestamp = new Date().getTime()\n let changeHistory = _get(changeHistoryPath)\n !changeHistory && _set(changeHistoryPath, (changeHistory = []))\n changeHistory.push(changeRecord)\n }\n this.emit('change', this, changes)\n }\n _unset(silentPath)\n }, 0))\n }\n }\n _set(keyPath, value)\n return value\n }\n\n if (utils.isFunction(schema.set)) {\n const originalSet = descriptor.set\n descriptor.set = function (value) {\n return schema.set.call(this, value, originalSet)\n }\n }\n\n return descriptor\n },\n\n /**\n * Create a copy of the given value that contains only the properties defined\n * in this schema.\n *\n * @name Schema#pick\n * @method\n * @param {*} value The value to copy.\n * @returns {*} The copy.\n */\n pick (value) {\n if (value === undefined) {\n return\n }\n if (this.type === 'object') {\n let copy = {}\n const properties = this.properties\n if (properties) {\n utils.forOwn(properties, (_definition, prop) => {\n copy[prop] = _definition.pick(value[prop])\n })\n }\n if (this.extends) {\n utils.fillIn(copy, this.extends.pick(value))\n }\n // Conditionally copy properties not defined in \"properties\"\n if (this.additionalProperties) {\n for (var key in value) {\n if (!properties[key]) {\n copy[key] = utils.plainCopy(value[key])\n }\n }\n }\n return copy\n } else if (this.type === 'array') {\n return value.map((item) => {\n const _copy = this.items ? this.items.pick(item) : {}\n if (this.extends) {\n utils.fillIn(_copy, this.extends.pick(item))\n }\n return _copy\n })\n }\n return utils.plainCopy(value)\n },\n\n /**\n * Validate the provided value against this schema.\n *\n * @name Schema#validate\n * @method\n * @param {*} value Value to validate.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n validate (value, opts) {\n return validate(value, this, opts)\n }\n}, {\n ANY_OPS,\n ARRAY_OPS,\n NUMERIC_OPS,\n OBJECT_OPS,\n STRING_OPS,\n typeGroupValidators,\n types,\n validate,\n validationKeywords\n})\n\n/**\n * Create a subclass of this Schema:\n * @example Schema.extend\n * // Normally you would do: import {Schema} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Schema} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSchemaClass extends Schema {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSchema = new CustomSchemaClass()\n * console.log(customSchema.foo())\n * console.log(CustomSchemaClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSchemaClass = Schema.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSchema = new OtherSchemaClass()\n * console.log(otherSchema.foo())\n * console.log(OtherSchemaClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSchemaClass () {\n * Schema.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Schema.extend({\n * constructor: AnotherSchemaClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSchema = new AnotherSchemaClass()\n * console.log(anotherSchema.created_at)\n * console.log(anotherSchema.foo())\n * console.log(AnotherSchemaClass.beep())\n *\n * @method Schema.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Schema class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Record from './Record'\nimport Schema from './Schema'\nimport { Relation } from './relations'\nimport {\n belongsTo,\n belongsToType,\n hasMany,\n hasManyType,\n hasOne,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Mapper'\nconst applyDefaultsHooks = [\n 'beforeCreate',\n 'beforeCreateMany'\n]\nconst validatingHooks = [\n 'beforeCreate',\n 'beforeCreateMany',\n 'beforeUpdate',\n 'beforeUpdateAll',\n 'beforeUpdateMany'\n]\nconst makeNotify = function (num) {\n return function (...args) {\n const opts = args[args.length - num]\n const op = opts.op\n this.dbg(op, ...args)\n\n if (applyDefaultsHooks.indexOf(op) !== -1 && opts.applyDefaults !== false) {\n const schema = this.getSchema()\n if (schema && schema.applyDefaults) {\n let toProcess = args[0]\n if (!utils.isArray(toProcess)) {\n toProcess = [toProcess]\n }\n toProcess.forEach((record) => {\n schema.applyDefaults(record)\n })\n }\n }\n\n // Automatic validation\n if (validatingHooks.indexOf(op) !== -1 && !opts.noValidate) {\n // Save current value of option\n const originalExistingOnly = opts.existingOnly\n\n // For updates, ignore required fields if they aren't present\n if (op.indexOf('beforeUpdate') === 0 && opts.existingOnly === undefined) {\n opts.existingOnly = true\n }\n const errors = this.validate(args[op === 'beforeUpdate' ? 1 : 0], utils.pick(opts, ['existingOnly']))\n\n // Restore option\n opts.existingOnly = originalExistingOnly\n\n // Abort lifecycle due to validation errors\n if (errors) {\n const err = new Error('validation failed')\n err.errors = errors\n return utils.reject(err)\n }\n }\n\n // Emit lifecycle event\n if (opts.notify || (opts.notify === undefined && this.notify)) {\n setTimeout(() => {\n this.emit(op, ...args)\n })\n }\n }\n}\n\n// These are the default implementations of all of the lifecycle hooks\nconst notify = makeNotify(1)\nconst notify2 = makeNotify(2)\n\n// This object provides meta information used by Mapper#crud to actually\n// execute each lifecycle method\nconst LIFECYCLE_METHODS = {\n count: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroy: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroyAll: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n find: {\n defaults: [undefined, {}],\n types: []\n },\n findAll: {\n defaults: [{}, {}],\n types: []\n },\n sum: {\n defaults: [undefined, {}, {}],\n skip: true,\n types: []\n },\n update: {\n adapterArgs (mapper, id, props, opts) {\n return [id, mapper.toJSON(props, opts), opts]\n },\n beforeAssign: 1,\n defaults: [undefined, {}, {}],\n types: []\n },\n updateAll: {\n adapterArgs (mapper, props, query, opts) {\n return [mapper.toJSON(props, opts), query, opts]\n },\n beforeAssign: 0,\n defaults: [{}, {}, {}],\n types: []\n },\n updateMany: {\n adapterArgs (mapper, records, opts) {\n return [records.map((record) => mapper.toJSON(record, opts)), opts]\n },\n beforeAssign: 0,\n defaults: [[], {}],\n types: []\n }\n}\n\nconst MAPPER_DEFAULTS = {\n /**\n * Hash of registered adapters. Don't modify directly. Use\n * {@link Mapper#registerAdapter} instead.\n *\n * @default {}\n * @name Mapper#_adapters\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n _adapters: {},\n\n /**\n * Whether {@link Mapper#beforeCreate} and {@link Mapper#beforeCreateMany}\n * should automatically receive default values according to the Mapper's schema.\n *\n * @default true\n * @name Mapper#applyDefaults\n * @since 3.0.0\n * @type {boolean}\n */\n applyDefaults: true,\n\n /**\n * Whether to augment {@link Mapper#recordClass} with ES5 getters and setters\n * according to the properties defined in {@link Mapper#schema}. This makes\n * possible validation and change tracking on individual properties\n * when using the dot (e.g. `user.name = \"Bob\"`) operator to modify a\n * property, and is `true` by default.\n *\n * @default true\n * @name Mapper#applySchema\n * @since 3.0.0\n * @type {boolean}\n */\n applySchema: true,\n\n /**\n * The name of the registered adapter that this Mapper should used by default.\n *\n * @default \"http\"\n * @name Mapper#defaultAdapter\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n * @type {string}\n */\n defaultAdapter: 'http',\n\n /**\n * The field used as the unique identifier on records handled by this Mapper.\n *\n * @default id\n * @name Mapper#idAttribute\n * @since 3.0.0\n * @type {string}\n */\n idAttribute: 'id',\n\n /**\n * Whether records created from this mapper keep changeHistory on property changes.\n *\n * @default true\n * @name Mapper#keepChangeHistory\n * @since 3.0.0\n * @type {boolean}\n */\n keepChangeHistory: true,\n\n /**\n * Whether this Mapper should emit operational events.\n *\n * @default true\n * @name Mapper#notify\n * @since 3.0.0\n * @type {boolean}\n */\n notify: true,\n\n /**\n * Whether to skip validation when the Record instances are created.\n *\n * @default false\n * @name Mapper#noValidate\n * @since 3.0.0\n * @type {boolean}\n */\n noValidate: false,\n\n /**\n * Whether {@link Mapper#create}, {@link Mapper#createMany},\n * {@link Mapper#update}, {@link Mapper#updateAll}, {@link Mapper#updateMany},\n * {@link Mapper#find}, {@link Mapper#findAll}, {@link Mapper#destroy},\n * {@link Mapper#destroyAll}, {@link Mapper#count}, and {@link Mapper#sum}\n * should return a raw result object that contains both the instance data\n * returned by the adapter _and_ metadata about the operation.\n *\n * The default is to NOT return the result object, and instead return just the\n * instance data.\n *\n * @default false\n * @name Mapper#raw\n * @since 3.0.0\n * @type {boolean}\n */\n raw: false,\n\n /**\n * Whether records created from this mapper automatically validate their properties\n * when their properties are modified.\n *\n * @default true\n * @name Mapper#validateOnSet\n * @since 3.0.0\n * @type {boolean}\n */\n validateOnSet: true\n}\n\n/**\n * The core of JSData's [ORM/ODM][orm] implementation. Given a minimum amout of\n * meta information about a resource, a Mapper can perform generic CRUD\n * operations against that resource. Apart from its configuration, a Mapper is\n * stateless. The particulars of various persistence layers have been abstracted\n * into adapters, which a Mapper uses to perform its operations.\n *\n * The term \"Mapper\" comes from the [Data Mapper Pattern][pattern] described in\n * Martin Fowler's [Patterns of Enterprise Application Architecture][book]. A\n * Data Mapper moves data between [in-memory object instances][record] and a\n * relational or document-based database. JSData's Mapper can work with any\n * persistence layer you can write an adapter for.\n *\n * _(\"Model\" is a heavily overloaded term and is avoided in this documentation\n * to prevent confusion.)_\n *\n * [orm]: https://en.wikipedia.org/wiki/Object-relational_mapping\n *\n * @example\n * [pattern]: https://en.wikipedia.org/wiki/Data_mapper_pattern\n * [book]: http://martinfowler.com/books/eaa.html\n * [record]: Record.html\n * // Import and instantiate\n * import {Mapper} from 'js-data'\n * const UserMapper = new Mapper({ name: 'user' })\n *\n * @example\n * // Define a Mapper using the Container component\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n *\n * @class Mapper\n * @extends Component\n * @param {Object} opts Configuration options.\n * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}.\n * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}.\n * @param {Object} [opts.methods] See {@link Mapper#methods}.\n * @param {string} opts.name See {@link Mapper#name}.\n * @param {boolean} [opts.notify] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw=false] See {@link Mapper#raw}.\n * @param {Function|boolean} [opts.recordClass] See {@link Mapper#recordClass}.\n * @param {Object|Schema} [opts.schema] See {@link Mapper#schema}.\n * @returns {Mapper} A new {@link Mapper} instance.\n * @see http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n */\nfunction Mapper (opts) {\n utils.classCallCheck(this, Mapper)\n Component.call(this)\n opts || (opts = {})\n\n // Prepare certain properties to be non-enumerable\n Object.defineProperties(this, {\n _adapters: {\n value: undefined,\n writable: true\n },\n\n /**\n * The {@link Container} that holds this Mapper. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n datastore: {\n value: undefined,\n writable: true\n },\n\n /**\n * The meta information describing this Mapper's available lifecycle\n * methods. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n lifecycleMethods: {\n value: LIFECYCLE_METHODS\n },\n\n /**\n * Set to `false` to force the Mapper to work with POJO objects only.\n *\n * @example\n * // Use POJOs only.\n * import {Mapper, Record} from 'js-data'\n * const UserMapper = new Mapper({ recordClass: false })\n * UserMapper.recordClass // false\n * const user = UserMapper#createRecord()\n * user instanceof Record // false\n *\n * @example\n * // Set to a custom class to have records wrapped in your custom class.\n * import {Mapper, Record} from 'js-data'\n * // Custom class\n * class User {\n * constructor (props = {}) {\n * for (var key in props) {\n * if (props.hasOwnProperty(key)) {\n * this[key] = props[key]\n * }\n * }\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User })\n * UserMapper.recordClass // function User() {}\n * const user = UserMapper#createRecord()\n * user instanceof Record // false\n * user instanceof User // true\n *\n *\n * @example\n * // Extend the {@link Record} class.\n * import {Mapper, Record} from 'js-data'\n * // Custom class\n * class User extends Record {\n * constructor () {\n * super(props)\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User })\n * UserMapper.recordClass // function User() {}\n * const user = UserMapper#createRecord()\n * user instanceof Record // true\n * user instanceof User // true\n *\n * @name Mapper#recordClass\n * @default {@link Record}\n * @see Record\n * @since 3.0.0\n */\n recordClass: {\n value: undefined,\n writable: true\n },\n\n /**\n * This Mapper's {@link Schema}.\n *\n * @example Mapper#schema\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const UserMapper = new Mapper({\n * name: 'user',\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * first: { type: 'string', track: true },\n * last: { type: 'string', track: true },\n * role: { type: 'string', track: true, required: true },\n * age: { type: 'integer', track: true },\n * is_active: { type: 'number' }\n * }\n * }\n * })\n * const user = UserMapper.createRecord({\n * id: 1,\n * name: 'John',\n * role: 'admin'\n * })\n * user.on('change', function (user, changes) {\n * console.log(changes)\n * })\n * user.on('change:role', function (user, value) {\n * console.log('change:role - ' + value)\n * })\n * user.role = 'owner'\n *\n * @name Mapper#schema\n * @see Schema\n * @since 3.0.0\n * @type {Schema}\n */\n schema: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(MAPPER_DEFAULTS))\n\n /**\n * The name for this Mapper. This is the minimum amount of meta information\n * required for a Mapper to be able to execute CRUD operations for a\n * Resource.\n *\n * @name Mapper#name\n * @since 3.0.0\n * @type {string}\n */\n if (!this.name) {\n throw utils.err(`new ${DOMAIN}`, 'opts.name')(400, 'string', this.name)\n }\n\n // Setup schema, with an empty default schema if necessary\n if (this.schema) {\n this.schema.type || (this.schema.type = 'object')\n if (!(this.schema instanceof Schema)) {\n this.schema = new Schema(this.schema || { type: 'object' })\n }\n }\n\n // Create a subclass of Record that's tied to this Mapper\n if (this.recordClass === undefined) {\n const superClass = Record\n this.recordClass = superClass.extend({\n constructor: (function Record () {\n var subClass = function Record (props, opts) {\n utils.classCallCheck(this, subClass)\n superClass.call(this, props, opts)\n }\n return subClass\n })()\n })\n }\n\n if (this.recordClass) {\n this.recordClass.mapper = this\n\n /**\n * Functions that should be added to the prototype of {@link Mapper#recordClass}.\n *\n * @name Mapper#methods\n * @since 3.0.0\n * @type {Object}\n */\n if (utils.isObject(this.methods)) {\n utils.addHiddenPropsToTarget(this.recordClass.prototype, this.methods)\n }\n\n // We can only apply the schema to the prototype of this.recordClass if the\n // class extends Record\n if (Record.prototype.isPrototypeOf(Object.create(this.recordClass.prototype)) && this.schema && this.schema.apply && this.applySchema) {\n this.schema.apply(this.recordClass.prototype)\n }\n }\n}\n\nexport default Component.extend({\n constructor: Mapper,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCount\n * @param {Object} query The `query` argument passed to {@link Mapper#count}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#count}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCount: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreate\n * @param {Object} props The `props` argument passed to {@link Mapper#create}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#create}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroy: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroyAll\n * @param {*} data The `data` returned by the adapter.\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroyAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#find}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFind: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFindAll\n * @param {Object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFindAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterSum\n * @param {Object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterSum: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#update}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateAll\n * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreate\n * @param {Object} props The `props` argument passed to {@link Mapper#create}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#create}.\n * @since 3.0.0\n */\n beforeCreate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @since 3.0.0\n */\n beforeCreateMany: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCount\n * @param {Object} query The `query` argument passed to {@link Mapper#count}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#count}.\n * @since 3.0.0\n */\n beforeCount: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @since 3.0.0\n */\n beforeDestroy: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroyAll\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @since 3.0.0\n */\n beforeDestroyAll: notify,\n\n /**\n * Mappers lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#find}.\n * @since 3.0.0\n */\n beforeFind: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFindAll\n * @param {Object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @since 3.0.0\n */\n beforeFindAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeSum\n * @param {string} field The `field` argument passed to {@link Mapper#sum}.\n * @param {Object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @since 3.0.0\n */\n beforeSum: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#update}.\n * @since 3.0.0\n */\n beforeUpdate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateAll\n * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @since 3.0.0\n */\n beforeUpdateAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @since 3.0.0\n */\n beforeUpdateMany: notify,\n\n /**\n * This method is called at the end of most lifecycle methods. It does the\n * following:\n *\n * 1. If `opts.raw` is `true`, add this Mapper's configuration to the `opts`\n * argument as metadata for the operation.\n * 2. Wrap the result data appropriately using {@link Mapper#wrap}, which\n * calls {@link Mapper#createRecord}.\n *\n * @method Mapper#_end\n * @private\n * @since 3.0.0\n */\n _end (result, opts, skip) {\n if (opts.raw) {\n utils._(result, opts)\n }\n if (skip) {\n return result\n }\n let _data = opts.raw ? result.data : result\n if (_data && utils.isFunction(this.wrap)) {\n _data = this.wrap(_data, opts)\n if (opts.raw) {\n result.data = _data\n } else {\n result = _data\n }\n }\n return result\n },\n\n /**\n * Define a belongsTo relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * PostMapper.belongsTo(UserMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to post records at \"post.user\"\n * localField: 'user'\n * })\n *\n * CommentMapper.belongsTo(UserMapper, {\n * // comment.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to comment records at \"comment.user\"\n * localField: 'user'\n * })\n * CommentMapper.belongsTo(PostMapper, {\n * // comment.post_id points to post.id\n * foreignKey: 'post_id'\n * // post records will be attached to comment records at \"comment.post\"\n * localField: 'post'\n * })\n *\n * @method Mapper#belongsTo\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n belongsTo (relatedMapper, opts) {\n return belongsTo(relatedMapper, opts)(this)\n },\n\n /**\n * Select records according to the `query` argument and return the count.\n *\n * {@link Mapper#beforeCount} will be called before calling the adapter.\n * {@link Mapper#afterCount} will be called after calling the adapter.\n *\n * @example\n * // Get the number of published blog posts\n * PostMapper.count({ status: 'published' }).then((numPublished) => {\n * console.log(numPublished) // e.g. 45\n * })\n *\n * @method Mapper#count\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `count` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the count of the selected records.\n * @since 3.0.0\n */\n count (query, opts) {\n return this.crud('count', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~beforeCreateListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreate\n * @see Mapper~beforeCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback Mapper~beforeCreateListener\n * @param {Object} props The `props` argument passed to {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeCreate}.\n * @see Mapper#event:beforeCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~afterCreateListener} for how to listen for this event.\n *\n * @event Mapper#afterCreate\n * @see Mapper~afterCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback Mapper~afterCreateListener\n * @param {Object} props The `props` argument passed to {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterCreate}.\n * @see Mapper#event:afterCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Create and save a new the record using the provided `props`.\n *\n * {@link Mapper#beforeCreate} will be called before calling the adapter.\n * {@link Mapper#afterCreate} will be called after calling the adapter.\n *\n * @example\n * // Create and save a new blog post\n * PostMapper.create({\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'draft', ... }\n * })\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#create\n * @param {Object} props The properties for the new record.\n * @param {Object} [opts] Configuration options. Refer to the `create` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `props` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#create}\n * or {@link Mapper#createMany} call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created record.\n * @since 3.0.0\n */\n create (props, opts) {\n // Default values for arguments\n props || (props = {})\n opts || (opts = {})\n const originalRecord = props\n let parentRelationMap = {}\n let adapterResponse = {}\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n opts.op = 'beforeCreate'\n return this._runHook(opts.op, props, opts).then((props) => {\n opts.with || (opts.with = [])\n return this._createParentRecordIfRequired(props, opts)\n }).then((relationMap) => {\n parentRelationMap = relationMap\n }).then(() => {\n opts.op = 'create'\n return this._invokeAdapterMethod(opts.op, props, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdProps = opts.raw ? adapterResponse.data : adapterResponse\n\n return this._createOrAssignChildRecordIfRequired(createdProps, {\n opts,\n parentRelationMap,\n originalProps: props\n })\n }).then((createdProps) => {\n return this._commitChanges(originalRecord, createdProps)\n }).then((record) => {\n if (opts.raw) {\n adapterResponse.data = record\n } else {\n adapterResponse = record\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreate'\n return this._runHook(opts.op, props, opts, result)\n })\n },\n\n _commitChanges (recordOrRecords, newValues) {\n if (utils.isArray(recordOrRecords)) {\n return recordOrRecords.map((record, i) => this._commitChanges(record, newValues[i]))\n }\n\n utils.set(recordOrRecords, newValues, { silent: true })\n\n if (utils.isFunction(recordOrRecords.commit)) {\n recordOrRecords.commit()\n }\n\n return recordOrRecords\n },\n\n /**\n * Use {@link Mapper#createRecord} instead.\n * @deprecated\n * @method Mapper#createInstance\n * @param {Object|Array} props See {@link Mapper#createRecord}.\n * @param {Object} [opts] See {@link Mapper#createRecord}.\n * @returns {Object|Array} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n createInstance (props, opts) {\n return this.createRecord(props, opts)\n },\n\n /**\n * Creates parent record for relation types like BelongsTo or HasMany with localKeys\n * in order to satisfy foreignKey dependency (so called child records).\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} opts See {@link Mapper#create}.\n * @returns {Object} cached parent records map\n * @see Mapper#create\n * @since 3.0.0\n */\n _createParentRecordIfRequired (props, opts) {\n const tasks = []\n const relations = []\n\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n if (!def.isRequiresParentId() || !def.getLocalField(props)) {\n return\n }\n\n optsCopy.raw = false\n relations.push(def)\n tasks.push(def.createParentRecord(props, optsCopy))\n })\n\n return utils.Promise.all(tasks).then(records => {\n return relations.reduce((map, relation, index) => {\n relation.setLocalField(map, records[index])\n return map\n }, {})\n })\n },\n\n /**\n * Creates child record for relation types like HasOne or HasMany with foreignKey\n * in order to satisfy foreignKey dependency (so called parent records).\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} context contains collected information.\n * @param {Object} context.opts See {@link Mapper#create}.\n * @param {Object} context.parentRelationMap contains parent records map\n * @param {Object} context.originalProps contains data passed into {@link Mapper#create} method\n * @return {Promise} updated props\n * @see Mapper#create\n * @since 3.0.0\n */\n _createOrAssignChildRecordIfRequired (props, context) {\n const tasks = []\n\n utils.forEachRelation(this, context.opts, (def, optsCopy) => {\n const relationData = def.getLocalField(context.originalProps)\n\n if (!relationData) {\n return\n }\n\n optsCopy.raw = false\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.isRequiresChildId()) {\n tasks.push(def.createChildRecord(props, relationData, optsCopy))\n } else if (def.isRequiresParentId()) {\n const parent = def.getLocalField(context.parentRelationMap)\n\n if (parent) {\n def.setLocalField(props, parent)\n }\n }\n })\n\n return utils.Promise.all(tasks)\n .then(() => props)\n },\n\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreateMany\n * @see Mapper~beforeCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback Mapper~beforeCreateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Mapper#event:beforeCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~afterCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterCreateMany\n * @see Mapper~afterCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback Mapper~afterCreateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Mapper#event:afterCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Given an array of records, batch create them via an adapter.\n *\n * {@link Mapper#beforeCreateMany} will be called before calling the adapter.\n * {@link Mapper#afterCreateMany} will be called after calling the adapter.\n *\n * @example\n * // Create and save several new blog posts\n * PostMapper.createMany([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]) // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]) // { id: 1235, status: 'draft', ... }\n * })\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#createMany\n * @param {Record[]} records Array of records to be created in one batch.\n * @param {Object} [opts] Configuration options. Refer to the `createMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `records` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#createMany}\n * call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created records.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n createMany (records, opts) {\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n const originalRecords = records\n let adapterResponse\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n // beforeCreateMany lifecycle hook\n opts.op = 'beforeCreateMany'\n return this._runHook(opts.op, records, opts).then((records) => {\n // Deep pre-create belongsTo relations\n const belongsToRelationData = {}\n opts.with || (opts.with = [])\n let tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (def.type === belongsToType && relationData.length === records.length) {\n // Create belongsTo relation first because we need a generated id to\n // attach to the child\n optsCopy.raw = false\n tasks.push(def.createLinked(relationData, optsCopy).then((relatedRecords) => {\n records.forEach((record, i) => def.setForeignKey(record, relatedRecords[i]))\n }).then((relatedRecords) => {\n def.setLocalField(belongsToRelationData, relatedRecords)\n }))\n }\n })\n return utils.Promise.all(tasks).then(() => {\n opts.op = 'createMany'\n return this._invokeAdapterMethod(opts.op, records, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdRecordsData = opts.raw ? adapterResponse.data : adapterResponse\n\n // Deep post-create hasOne relations\n tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (relationData.length !== records.length) {\n return\n }\n\n optsCopy.raw = false\n const belongsToData = def.getLocalField(belongsToRelationData)\n let task\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.type === hasManyType) {\n // Not supported\n this.log('warn', 'deep createMany of hasMany type not supported!')\n } else if (def.type === hasOneType) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setForeignKey(createdRecordData, relationData[i])\n })\n task = def.getRelation().createMany(relationData, optsCopy).then((relatedData) => {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, relatedData[i])\n })\n })\n } else if (def.type === belongsToType && belongsToData && belongsToData.length === createdRecordsData.length) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, belongsToData[i])\n })\n }\n if (task) {\n tasks.push(task)\n }\n })\n return utils.Promise.all(tasks).then(() => {\n return this._commitChanges(originalRecords, createdRecordsData)\n })\n })\n }).then((records) => {\n if (opts.raw) {\n adapterResponse.data = records\n } else {\n adapterResponse = records\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreateMany'\n return this._runHook(opts.op, records, opts, result)\n })\n },\n\n /**\n * Create an unsaved, uncached instance of this Mapper's\n * {@link Mapper#recordClass}.\n *\n * Returns `props` if `props` is already an instance of\n * {@link Mapper#recordClass}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * const post = PostMapper.createRecord()\n *\n * @example\n * // Create an unsaved record instance with inital properties\n * const post = PostMapper.createRecord({\n * title: 'Modeling your data',\n * status: 'draft'\n * })\n *\n * @example\n * // Create a record instance that corresponds to a saved record\n * const post = PostMapper.createRecord({\n * // JSData thinks this record has been saved if it has a primary key\n * id: 1234,\n * title: 'Modeling your data',\n * status: 'draft'\n * })\n *\n * @example\n * // Create record instances from an array\n * const posts = PostMapper.createRecord([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }])\n *\n * @example\n * // Records are validated by default\n * import {Mapper} from 'js-data'\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * })\n * try {\n * const post = PostMapper.createRecord({\n * title: 1234,\n * })\n * } catch (err) {\n * console.log(err.errors) // [{ expected: 'one of (string)', actual: 'number', path: 'title' }]\n * }\n *\n * @example\n * // Skip validation\n * import {Mapper} from 'js-data'\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * })\n * const post = PostMapper.createRecord({\n * title: 1234,\n * }, { noValidate: true })\n * console.log(post.isValid()) // false\n *\n * @method Mapper#createRecord\n * @param {Object|Object[]} props The properties for the Record instance or an\n * array of property objects for the Record instances.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @returns {Record|Record[]} The Record instance or Record instances.\n * @since 3.0.0\n */\n createRecord (props, opts) {\n props || (props = {})\n if (utils.isArray(props)) {\n return props.map((_props) => this.createRecord(_props, opts))\n }\n if (!utils.isObject(props)) {\n throw utils.err(`${DOMAIN}#createRecord`, 'props')(400, 'array or object', props)\n }\n\n if (this.relationList) {\n this.relationList.forEach(function (def) {\n def.ensureLinkedDataHasProperType(props, opts)\n })\n }\n const RecordCtor = this.recordClass\n\n return (!RecordCtor || props instanceof RecordCtor) ? props : new RecordCtor(props, opts)\n },\n\n /**\n * Lifecycle invocation method. You probably won't call this method directly.\n *\n * @method Mapper#crud\n * @param {string} method Name of the lifecycle method to invoke.\n * @param {...*} args Arguments to pass to the lifecycle method.\n * @returns {Promise}\n * @since 3.0.0\n */\n crud (method, ...args) {\n const config = this.lifecycleMethods[method]\n if (!config) {\n throw utils.err(`${DOMAIN}#crud`, method)(404, 'method')\n }\n\n const upper = `${method.charAt(0).toUpperCase()}${method.substr(1)}`\n const before = `before${upper}`\n const after = `after${upper}`\n\n let op, adapter\n\n // Default values for arguments\n config.defaults.forEach((value, i) => {\n if (args[i] === undefined) {\n args[i] = utils.copy(value)\n }\n })\n\n const opts = args[args.length - 1]\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n adapter = opts.adapter = this.getAdapterName(opts)\n\n // before lifecycle hook\n op = opts.op = before\n return utils.resolve(this[op](...args)).then((_value) => {\n if (args[config.beforeAssign] !== undefined) {\n // Allow for re-assignment from lifecycle hook\n args[config.beforeAssign] = _value === undefined ? args[config.beforeAssign] : _value\n }\n // Now delegate to the adapter\n op = opts.op = method\n args = config.adapterArgs ? config.adapterArgs(this, ...args) : args\n this.dbg(op, ...args)\n return utils.resolve(this.getAdapter(adapter)[op](this, ...args))\n }).then((result) => {\n result = this._end(result, opts, !!config.skip)\n args.push(result)\n // after lifecycle hook\n op = opts.op = after\n return utils.resolve(this[op](...args)).then((_result) => {\n // Allow for re-assignment from lifecycle hook\n return _result === undefined ? result : _result\n })\n })\n },\n\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~beforeDestroyListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroy\n * @see Mapper~beforeDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback Mapper~beforeDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}.\n * @see Mapper#event:beforeDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~afterDestroyListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroy\n * @see Mapper~afterDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback Mapper~afterDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroy}.\n * @see Mapper#event:afterDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Using an adapter, destroy the record with the given primary key.\n *\n * {@link Mapper#beforeDestroy} will be called before destroying the record.\n * {@link Mapper#afterDestroy} will be called after destroying the record.\n *\n * @example\n * // Destroy a specific blog post\n * PostMapper.destroy(1234).then(() => {\n * // Blog post #1234 has been destroyed\n * })\n *\n * @example\n * // Get full response\n * PostMapper.destroy(1234, { raw: true }).then((result) => {\n * console.log(result.deleted) e.g. 1\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeDestroy\n * @fires Mapper#afterDestroy\n * @method Mapper#destroy\n * @param {(string|number)} id The primary key of the record to destroy.\n * @param {Object} [opts] Configuration options. Refer to the `destroy` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the record has been destroyed. Resolves\n * even if no record was found to be destroyed.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroy (id, opts) {\n return this.crud('destroy', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroyAll\n * @see Mapper~beforeDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback Mapper~beforeDestroyAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}.\n * @see Mapper#event:beforeDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroyAll\n * @see Mapper~afterDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback Mapper~afterDestroyAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroyAll}.\n * @see Mapper#event:afterDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Destroy the records selected by `query` via an adapter. If no `query` is\n * provided then all records will be destroyed.\n *\n * {@link Mapper#beforeDestroyAll} will be called before destroying the records.\n * {@link Mapper#afterDestroyAll} will be called after destroying the records.\n *\n * @example\n * // Destroy all blog posts\n * PostMapper.destroyAll().then(() => {\n * // All blog posts have been destroyed\n * })\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * PostMapper.destroyAll({ status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * })\n *\n * @example\n * // Get full response\n * const query = null\n * const options = { raw: true }\n * PostMapper.destroyAll(query, options).then((result) => {\n * console.log(result.deleted) e.g. 14\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeDestroyAll\n * @fires Mapper#afterDestroyAll\n * @method Mapper#destroyAll\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `destroyAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the records have been destroyed. Resolves\n * even if no records were found to be destroyed.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroyAll (query, opts) {\n return this.crud('destroyAll', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~beforeFindListener} for how to listen for this event.\n *\n * @event Mapper#beforeFind\n * @see Mapper~beforeFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback Mapper~beforeFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFind}.\n * @see Mapper#event:beforeFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~afterFindListener} for how to listen for this event.\n *\n * @event Mapper#afterFind\n * @see Mapper~afterFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFind} event.\n *\n * @example\n * function onAfterFind (id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback Mapper~afterFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterFind}.\n * @see Mapper#event:afterFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Retrieve via an adapter the record with the given primary key.\n *\n * {@link Mapper#beforeFind} will be called before calling the adapter.\n * {@link Mapper#afterFind} will be called after calling the adapter.\n *\n * @example\n * PostMapper.find(1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * })\n *\n * @example\n * // Get full response\n * PostMapper.find(1, { raw: true }).then((result) => {\n * console.log(result.data) // { id: 1, ...}\n * console.log(result.found) // 1\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeFind\n * @fires Mapper#afterFind\n * @method Mapper#find\n * @param {(string|number)} id The primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options. Refer to the `find` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found record. Resolves with\n * `undefined` if no record was found.\n * @see http://www.js-data.io/v3.0/docs/reading-data\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n find (id, opts) {\n return this.crud('find', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~beforeFindAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeFindAll\n * @see Mapper~beforeFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback Mapper~beforeFindAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}.\n * @see Mapper#event:beforeFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~afterFindAllListener} for how to listen for this event.\n *\n * @event Mapper#afterFindAll\n * @see Mapper~afterFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback Mapper~afterFindAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterFindAll}.\n * @see Mapper#event:afterFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, select records to retrieve via an adapter.\n *\n * {@link Mapper#beforeFindAll} will be called before calling the adapter.\n * {@link Mapper#afterFindAll} will be called after calling the adapter.\n *\n * @example\n * // Find all \"published\" blog posts\n * PostMapper.findAll({ status: 'published' }).then((posts) => {\n * console.log(posts) // [{ id: 1, status: 'published', ...}, ...]\n * })\n *\n * @example\n * // Get full response\n * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => {\n * console.log(result.data) // [{ id: 1, status: 'published', ...}, ...]\n * console.log(result.found) // e.g. 13\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeFindAll\n * @fires Mapper#afterFindAll\n * @method Mapper#findAll\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `findAll` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n findAll (query, opts) {\n return this.crud('findAll', query, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Mapper#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapter (name) {\n this.dbg('getAdapter', 'name:', name)\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Mapper#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || opts.defaultAdapter\n },\n\n /**\n * Get the object of registered adapters for this Mapper.\n *\n * @method Mapper#getAdapters\n * @returns {Object} {@link Mapper#_adapters}\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Returns this Mapper's {@link Schema}.\n *\n * @method Mapper#getSchema\n * @returns {Schema} This Mapper's {@link Schema}.\n * @see Mapper#schema\n * @since 3.0.0\n */\n getSchema () {\n return this.schema\n },\n\n /**\n * Defines a hasMany relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * UserMapper.hasMany(PostMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // post records will be attached to user records at \"user.posts\"\n * localField: 'posts'\n * })\n *\n * @method Mapper#hasMany\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasMany (relatedMapper, opts) {\n return hasMany(relatedMapper, opts)(this)\n },\n\n /**\n * Defines a hasOne relationship. Only useful if you're managing your Mappers\n * manually and not using a {@link Container} or {@link DataStore} component.\n *\n * @example\n * UserMapper.hasOne(ProfileMapper, {\n * // profile.user_id points to user.id\n * foreignKey: 'user_id'\n * // profile records will be attached to user records at \"user.profile\"\n * localField: 'profile'\n * })\n *\n * @method Mapper#hasOne\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasOne (relatedMapper, opts) {\n return hasOne(relatedMapper, opts)(this)\n },\n\n /**\n * Return whether `record` is an instance of this Mapper's recordClass.\n *\n * @example\n * const post = PostMapper.createRecord()\n *\n * console.log(PostMapper.is(post)) // true\n * // Equivalent to what's above\n * console.log(post instanceof PostMapper.recordClass) // true\n *\n * @method Mapper#is\n * @param {Object|Record} record The record to check.\n * @returns {boolean} Whether `record` is an instance of this Mapper's\n * {@link Mapper#recordClass}.\n * @since 3.0.0\n */\n is (record) {\n const recordClass = this.recordClass\n return recordClass ? record instanceof recordClass : false\n },\n\n /**\n * Register an adapter on this Mapper under the given name.\n *\n * @method Mapper#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for this Mapper.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.defaultAdapter = name\n }\n },\n\n _runHook (hookName, ...hookArgs) {\n const defaultValueIndex = hookName.indexOf('after') === 0 ? hookArgs.length - 1 : 0\n\n return utils.resolve(this[hookName](...hookArgs))\n .then((overridenResult) => overridenResult === undefined ? hookArgs[defaultValueIndex] : overridenResult)\n },\n\n _invokeAdapterMethod (method, propsOrRecords, opts) {\n const conversionOptions = { with: opts.pass || [] }\n let object\n\n this.dbg(opts.op, propsOrRecords, opts)\n\n if (utils.isArray(propsOrRecords)) {\n object = propsOrRecords.map(record => this.toJSON(record, conversionOptions))\n } else {\n object = this.toJSON(propsOrRecords, conversionOptions)\n }\n\n return this.getAdapter(opts.adapter)[method](this, object, opts)\n },\n\n /**\n * Select records according to the `query` argument, and aggregate the sum\n * value of the property specified by `field`.\n *\n * {@link Mapper#beforeSum} will be called before calling the adapter.\n * {@link Mapper#afterSum} will be called after calling the adapter.\n *\n * @example\n * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid) // e.g. 451125.34\n * })\n *\n * @method Mapper#sum\n * @param {string} field The field to sum.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `sum` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the aggregated sum.\n * @since 3.0.0\n */\n sum (field, query, opts) {\n return this.crud('sum', field, query, opts)\n },\n\n /**\n * Return a plain object representation of the given record. Relations can\n * be optionally be included. Non-schema properties can be excluded.\n *\n * @example\n * import { Mapper, Schema } from 'js-data'\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is stripped by toJSON()\n * console.log(PersonMapper.toJSON(person)) // {\"id\":1,\"name\":\"John\"}\n *\n * const PersonRelaxedMapper = new Mapper({\n * name: 'personRelaxed',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * })\n * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is not stripped by toJSON\n * console.log(PersonRelaxedMapper.toJSON(person2)) // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Mapper#toJSON\n * @param {Record|Record[]} records Record or records from which to create a\n * POJO representation.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the POJO representation.\n * @param {boolean} [opts.withAll] Whether to simply include all relations in\n * the representation. Overrides `opts.with`.\n * @returns {Object|Object[]} POJO representation of the record or records.\n * @since 3.0.0\n */\n toJSON (records, opts) {\n let record\n opts || (opts = {})\n if (utils.isArray(records)) {\n return records.map((record) => this.toJSON(record, opts))\n } else {\n record = records\n }\n const relationFields = (this ? this.relationFields : []) || []\n let json = {}\n\n // Copy properties defined in the schema\n if (this && this.schema) {\n json = this.schema.pick(record)\n } else {\n for (var key in record) {\n if (relationFields.indexOf(key) === -1) {\n json[key] = utils.plainCopy(record[key])\n }\n }\n }\n\n // The user wants to include relations in the resulting plain object representation\n if (this && opts.withAll) {\n opts.with = relationFields.slice()\n }\n if (this && opts.with) {\n if (utils.isString(opts.with)) {\n opts.with = [opts.with]\n }\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = def.getLocalField(record)\n if (relationData) {\n // The actual recursion\n if (utils.isArray(relationData)) {\n def.setLocalField(json, relationData.map((item) => {\n return def.getRelation().toJSON(item, optsCopy)\n }))\n } else {\n def.setLocalField(json, def.getRelation().toJSON(relationData, optsCopy))\n }\n }\n })\n }\n return json\n },\n\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~beforeUpdateListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdate\n * @see Mapper~beforeUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback Mapper~beforeUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument passed to {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}.\n * @see Mapper#event:beforeUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~afterUpdateListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdate\n * @see Mapper~afterUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback Mapper~afterUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterUpdate}.\n * @see Mapper#event:afterUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Using an adapter, update the record with the primary key specified by the\n * `id` argument.\n *\n * {@link Mapper#beforeUpdate} will be called before updating the record.\n * {@link Mapper#afterUpdate} will be called after updating the record.\n *\n * @example\n * // Update a specific post\n * PostMapper.update(1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'published', ... }\n * })\n *\n * @fires Mapper#beforeUpdate\n * @fires Mapper#afterUpdate\n * @method Mapper#update\n * @param {(string|number)} id The primary key of the record to update.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options. Refer to the `update` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * transaction.\n * @returns {Promise} Resolves with the updated record. Rejects if the record\n * could not be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n update (id, props, opts) {\n return this.crud('update', id, props, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateAll\n * @see Mapper~beforeUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback Mapper~beforeUpdateAllListener\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Mapper#event:beforeUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateAll\n * @see Mapper~afterUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback Mapper~afterUpdateAllListener\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Mapper#event:afterUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, perform the a single updated to the selected\n * records.\n *\n * {@link Mapper#beforeUpdateAll} will be called before making the update.\n * {@link Mapper#afterUpdateAll} will be called after making the update.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * const update = { status: draft: published_at: null }\n * const query = { userId: 1234 }\n * PostMapper.updateAll(update, query).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Mapper#beforeUpdateAll\n * @fires Mapper#afterUpdateAll\n * @method Mapper#updateAll\n * @param {Object} props Update to apply to selected records.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `updateAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the update records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateAll (props, query, opts) {\n return this.crud('updateAll', props, query, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateMany\n * @see Mapper~beforeUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback Mapper~beforeUpdateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Mapper#event:beforeUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateMany\n * @see Mapper~afterUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback Mapper~afterUpdateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Mapper#event:afterUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Given an array of updates, perform each of the updates via an adapter. Each\n * \"update\" is a hash of properties with which to update an record. Each\n * update must contain the primary key of the record to be updated.\n *\n * {@link Mapper#beforeUpdateMany} will be called before making the update.\n * {@link Mapper#afterUpdateMany} will be called after making the update.\n *\n * @example\n * PostMapper.updateMany([\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Mapper#beforeUpdateMany\n * @fires Mapper#afterUpdateMany\n * @method Mapper#updateMany\n * @param {Record[]} records Array up record updates.\n * @param {Object} [opts] Configuration options. Refer to the `updateMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the updated records. Rejects if any of the\n * records could be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateMany (records, opts) {\n return this.crud('updateMany', records, opts)\n },\n\n /**\n * Validate the given record or records according to this Mapper's\n * {@link Schema}. If there are no validation errors then the return value\n * will be `undefined`.\n *\n * @example\n * import {Mapper, Schema} from 'js-data'\n * const PersonSchema = new Schema({\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * })\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: PersonSchema\n * })\n * let errors = PersonMapper.validate({ name: 'John' })\n * console.log(errors) // undefined\n * errors = PersonMapper.validate({ name: 123 })\n * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Mapper#validate\n * @param {Object|Object[]} record The record or records to validate.\n * @param {Object} [opts] Configuration options. Passed to\n * {@link Schema#validate}.\n * @returns {Object[]} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (record, opts) {\n opts || (opts = {})\n const schema = this.getSchema()\n if (!schema) {\n return\n }\n const _opts = utils.pick(opts, ['existingOnly'])\n if (utils.isArray(record)) {\n const errors = record.map((_record) => schema.validate(_record, utils.pick(_opts, ['existingOnly'])))\n\n return errors.some(Boolean) ? errors : undefined\n }\n return schema.validate(record, _opts)\n },\n\n /**\n * Method used to wrap data returned by an adapter with this Mapper's\n * {@link Mapper#recordClass}. This method is used by all of a Mapper's CRUD\n * methods. The provided implementation of this method assumes that the `data`\n * passed to it is a record or records that need to be wrapped with\n * {@link Mapper#createRecord}. Override with care.\n *\n * Provided implementation of {@link Mapper#wrap}:\n *\n * ```\n * function (data, opts) {\n * return this.createRecord(data, opts)\n * }\n * ```\n *\n * @example\n * const PostMapper = new Mapper({\n * name: 'post',\n * // Override to customize behavior\n * wrap (data, opts) {\n * const originalWrap = this.constructor.prototype.wrap\n * // Let's say \"GET /post\" doesn't return JSON quite like JSData expects,\n * // but the actual post records are nested under a \"posts\" field. So,\n * // we override Mapper#wrap to handle this special case.\n * if (opts.op === 'findAll') {\n * return originalWrap.call(this, data.posts, opts)\n * }\n * // Otherwise perform original behavior\n * return originalWrap.call(this, data, opts)\n * }\n * })\n *\n * @method Mapper#wrap\n * @param {Object|Object[]} data The record or records to be wrapped.\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#createRecord}.\n * @returns {Record|Record[]} The wrapped record or records.\n * @since 3.0.0\n */\n wrap (data, opts) {\n return this.createRecord(data, opts)\n },\n\n /**\n * @ignore\n */\n defineRelations () {\n // Setup the mapper's relations, including generating Mapper#relationList\n // and Mapper#relationFields\n utils.forOwn(this.relations, (group, type) => {\n utils.forOwn(group, (relations, _name) => {\n if (utils.isObject(relations)) {\n relations = [relations]\n }\n relations.forEach((def) => {\n const relatedMapper = this.datastore.getMapperByName(_name) || _name\n def.getRelation = () => this.datastore.getMapper(_name)\n\n if (typeof Relation[type] !== 'function') {\n throw utils.err(DOMAIN, 'defineRelations')(400, 'relation type (hasOne, hasMany, etc)', type, true)\n }\n\n this[type](relatedMapper, def)\n })\n })\n })\n }\n})\n\n/**\n * Create a subclass of this Mapper:\n *\n * @example Mapper.extend\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMapperClass extends Mapper {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customMapper = new CustomMapperClass()\n * console.log(customMapper.foo())\n * console.log(CustomMapperClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherMapperClass = Mapper.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherMapper = new OtherMapperClass()\n * console.log(otherMapper.foo())\n * console.log(OtherMapperClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMapperClass () {\n * Mapper.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Mapper.extend({\n * constructor: AnotherMapperClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherMapper = new AnotherMapperClass()\n * console.log(anotherMapper.created_at)\n * console.log(anotherMapper.foo())\n * console.log(AnotherMapperClass.beep())\n *\n * @method Mapper.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Mapper class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Mapper from './Mapper'\n\nconst DOMAIN = 'Container'\n\nexport const proxiedMapperMethods = [\n /**\n * Wrapper for {@link Mapper#count}.\n *\n * @example\n * // Get the number of published blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.count('post', { status: 'published' }).then((numPublished) => {\n * console.log(numPublished) // e.g. 45\n * })\n *\n * @method Container#count\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#count}.\n * @param {Object} [opts] See {@link Mapper#count}.\n * @returns {Promise} See {@link Mapper#count}.\n * @see Mapper#count\n * @since 3.0.0\n */\n 'count',\n\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~beforeCreateListener} for how to listen for this event.\n *\n * @event Container#beforeCreate\n * @see Container~beforeCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback Container~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see Container#event:beforeCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~afterCreateListener} for how to listen for this event.\n *\n * @event Container#afterCreate\n * @see Container~afterCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback Container~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see Container#event:afterCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}.\n *\n * @example\n * // Create and save a new blog post\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.create('post', {\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'draft', ... }\n * })\n *\n * @fires Container#beforeCreate\n * @fires Container#afterCreate\n * @method Container#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} [opts] See {@link Mapper#create}.\n * @returns {Promise} See {@link Mapper#create}.\n * @see Mapper#create\n * @since 3.0.0\n */\n 'create',\n\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Container#beforeCreateMany\n * @see Container~beforeCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback Container~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Container#event:beforeCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~afterCreateManyListener} for how to listen for this event.\n *\n * @event Container#afterCreateMany\n * @see Container~afterCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback Container~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Container#event:afterCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}.\n *\n * @example\n * // Create and save several new blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.createMany('post', [{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]) // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]) // { id: 1235, status: 'draft', ... }\n * })\n *\n * @fires Container#beforeCreateMany\n * @fires Container#afterCreateMany\n * @method Container#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record[]} records See {@link Mapper#createMany}.\n * @param {Object} [opts] See {@link Mapper#createMany}.\n * @returns {Promise} See {@link Mapper#createMany}.\n * @see Mapper#createMany\n * @since 3.0.0\n */\n 'createMany',\n\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post')\n * const post = PostMapper.createRecord()\n *\n * @method Container#createRecord\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Object[]} props See {@link Mapper#createRecord}.\n * @param {Object} [opts] See {@link Mapper#createRecord}.\n * @returns {Promise} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n 'createRecord',\n\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~beforeDestroyListener} for how to listen for this event.\n *\n * @event Container#beforeDestroy\n * @see Container~beforeDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback Container~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see Container#event:beforeDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~afterDestroyListener} for how to listen for this event.\n *\n * @event Container#afterDestroy\n * @see Container~afterDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback Container~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see Container#event:afterDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}.\n *\n * @example\n * // Destroy a specific blog post\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.destroy('post', 1234).then(() => {\n * // Blog post #1234 has been destroyed\n * })\n *\n * @fires Container#beforeDestroy\n * @fires Container#afterDestroy\n * @method Container#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#destroy}.\n * @param {Object} [opts] See {@link Mapper#destroy}.\n * @returns {Promise} See {@link Mapper#destroy}.\n * @see Mapper#destroy\n * @since 3.0.0\n */\n 'destroy',\n\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Container#beforeDestroyAll\n * @see Container~beforeDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback Container~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see Container#event:beforeDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Container#afterDestroyAll\n * @see Container~afterDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback Container~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see Container#event:afterDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}.\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.destroyAll('post', { status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * })\n *\n * @fires Container#beforeDestroyAll\n * @fires Container#afterDestroyAll\n * @method Container#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#destroyAll}.\n * @param {Object} [opts] See {@link Mapper#destroyAll}.\n * @returns {Promise} See {@link Mapper#destroyAll}.\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n 'destroyAll',\n\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~beforeFindListener} for how to listen for this event.\n *\n * @event Container#beforeFind\n * @see Container~beforeFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback Container~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see Container#event:beforeFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~afterFindListener} for how to listen for this event.\n *\n * @event Container#afterFind\n * @see Container~afterFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback Container~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see Container#event:afterFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.find('post', 1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * })\n *\n * @fires Container#beforeFind\n * @fires Container#afterFind\n * @method Container#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#find}.\n * @param {Object} [opts] See {@link Mapper#find}.\n * @returns {Promise} See {@link Mapper#find}.\n * @see Mapper#find\n * @since 3.0.0\n */\n 'find',\n\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~beforeFindAllListener} for how to listen for this event.\n *\n * @event Container#beforeFindAll\n * @see Container~beforeFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback Container~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see Container#event:beforeFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~afterFindAllListener} for how to listen for this event.\n *\n * @event Container#afterFindAll\n * @see Container~afterFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback Container~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see Container#event:afterFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * @example\n * // Find all \"published\" blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.findAll('post', { status: 'published' }).then((posts) => {\n * console.log(posts) // [{ id: 1, ...}, ...]\n * })\n *\n * @fires Container#beforeFindAll\n * @fires Container#afterFindAll\n * @method Container#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#findAll}.\n * @param {Object} [opts] See {@link Mapper#findAll}.\n * @returns {Promise} See {@link Mapper#findAll}.\n * @see Mapper#findAll\n * @since 3.0.0\n */\n 'findAll',\n\n /**\n * Wrapper for {@link Mapper#getSchema}.\n *\n * @method Container#getSchema\n * @param {string} name Name of the {@link Mapper} to target.\n * @returns {Schema} See {@link Mapper#getSchema}.\n * @see Mapper#getSchema\n * @since 3.0.0\n */\n 'getSchema',\n\n /**\n * Wrapper for {@link Mapper#is}.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post')\n * const post = store.createRecord()\n *\n * console.log(store.is('post', post)) // true\n * // Equivalent to what's above\n * console.log(post instanceof store.getMapper('post').recordClass) // true\n *\n * @method Container#is\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Record} record See {@link Mapper#is}.\n * @returns {boolean} See {@link Mapper#is}.\n * @see Mapper#is\n * @since 3.0.0\n */\n 'is',\n\n /**\n * Wrapper for {@link Mapper#sum}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('purchase_order')\n *\n * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid) // e.g. 451125.34\n * })\n *\n * @method Container#sum\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {string} field See {@link Mapper#sum}.\n * @param {Object} [query] See {@link Mapper#sum}.\n * @param {Object} [opts] See {@link Mapper#sum}.\n * @returns {Promise} See {@link Mapper#sum}.\n * @see Mapper#sum\n * @since 3.0.0\n */\n 'sum',\n\n /**\n * Wrapper for {@link Mapper#toJSON}.\n *\n * @example\n * import { Container } from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('person', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is stripped by toJSON()\n * console.log(store.toJSON('person', person)) // {\"id\":1,\"name\":\"John\"}\n *\n * store.defineMapper('personRelaxed', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * })\n * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is not stripped by toJSON\n * console.log(store.toJSON('personRelaxed', person2)) // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Container#toJSON\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record|Record[]} records See {@link Mapper#toJSON}.\n * @param {Object} [opts] See {@link Mapper#toJSON}.\n * @returns {Object|Object[]} See {@link Mapper#toJSON}.\n * @see Mapper#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~beforeUpdateListener} for how to listen for this event.\n *\n * @event Container#beforeUpdate\n * @see Container~beforeUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback Container~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see Container#event:beforeUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~afterUpdateListener} for how to listen for this event.\n *\n * @event Container#afterUpdate\n * @see Container~afterUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback Container~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see Container#event:afterUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.update('post', 1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'published', ... }\n * })\n *\n * @fires Container#beforeUpdate\n * @fires Container#afterUpdate\n * @method Container#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#update}.\n * @param {Object} record See {@link Mapper#update}.\n * @param {Object} [opts] See {@link Mapper#update}.\n * @returns {Promise} See {@link Mapper#update}.\n * @see Mapper#update\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n 'update',\n\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateAll\n * @see Container~beforeUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback Container~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Container#event:beforeUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Container#afterUpdateAll\n * @see Container~afterUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback Container~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Container#event:afterUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * const update = { status: draft: published_at: null }\n * const query = { userId: 1234 }\n * store.updateAll('post', update, query).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Container#beforeUpdateAll\n * @fires Container#afterUpdateAll\n * @method Container#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} update See {@link Mapper#updateAll}.\n * @param {Object} [query] See {@link Mapper#updateAll}.\n * @param {Object} [opts] See {@link Mapper#updateAll}.\n * @returns {Promise} See {@link Mapper#updateAll}.\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n 'updateAll',\n\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateMany\n * @see Container~beforeUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback Container~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Container#event:beforeUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Container#afterUpdateMany\n * @see Container~afterUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback Container~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Container#event:afterUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.updateMany('post', [\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Container#beforeUpdateMany\n * @fires Container#afterUpdateMany\n * @method Container#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}.\n * @param {Object} [opts] See {@link Mapper#updateMany}.\n * @returns {Promise} See {@link Mapper#updateMany}.\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n 'updateMany',\n\n /**\n * Wrapper for {@link Mapper#validate}.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * let errors = store.validate('post', { name: 'John' })\n * console.log(errors) // undefined\n * errors = store.validate('post', { name: 123 })\n * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Container#validate\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#validate}.\n * @param {Object} [opts] See {@link Mapper#validate}.\n * @returns {Promise} See {@link Mapper#validate}.\n * @see Mapper#validate\n * @since 3.0.0\n */\n 'validate'\n]\n\n/**\n * The `Container` class is a place to define and store {@link Mapper} instances.\n *\n * `Container` makes it easy to manage your Mappers. Without a container, you\n * need to manage Mappers yourself, including resolving circular dependencies\n * among relations. All Mappers in a container share the same adapters, so you\n * don't have to register adapters for every single Mapper.\n *\n * @example Container#constructor\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n *\n * @class Container\n * @extends Component\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}.\n * @param {Object} [opts.mapperDefaults] See {@link Container#mapperDefaults}.\n * @since 3.0.0\n */\nexport function Container (opts) {\n utils.classCallCheck(this, Container)\n Component.call(this)\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * The adapters registered with this Container, which are also shared by all\n * Mappers in this Container.\n *\n * @name Container#_adapters\n * @see Container#registerAdapter\n * @since 3.0.0\n * @type {Object}\n */\n _adapters: {\n value: {}\n },\n\n /**\n * The the mappers in this container\n *\n * @name Container#_mappers\n * @see Mapper\n * @since 3.0.0\n * @type {Object}\n */\n _mappers: {\n value: {}\n },\n\n /**\n * Constructor function to use in {@link Container#defineMapper} to create new\n * {@link Mapper} instances. {@link Container#mapperClass} should extend\n * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers.\n *\n * @example Container#mapperClass\n * // import {Container, Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const store = new Container({\n * mapperClass: MyMapperClass\n * })\n * store.defineMapper('user')\n * console.log(store.getMapper('user').foo())\n *\n * @name Container#mapperClass\n * @see Mapper\n * @since 3.0.0\n * @type {Constructor}\n */\n mapperClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply options provided by the user\n utils.fillIn(this, opts)\n\n /**\n * Defaults options to pass to {@link Container#mapperClass} when creating a\n * new {@link Mapper}.\n *\n * @example Container#mapperDefaults\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container({\n * mapperDefaults: {\n * idAttribute: '_id'\n * }\n * })\n * store.defineMapper('user')\n * console.log(store.getMapper('user').idAttribute)\n *\n * @default {}\n * @name Container#mapperDefaults\n * @since 3.0.0\n * @type {Object}\n */\n this.mapperDefaults = this.mapperDefaults || {}\n\n // Use the Mapper class if the user didn't provide a mapperClass\n this.mapperClass || (this.mapperClass = Mapper)\n}\n\nconst props = {\n constructor: Container,\n\n /**\n * Register a new event listener on this Container.\n *\n * Proxy for {@link Component#on}. If an event was emitted by a {@link Mapper}\n * in the Container, then the name of the {@link Mapper} will be prepended to\n * the arugments passed to the listener.\n *\n * @example Container#on\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.on('foo', function (...args) { console.log(args.join(':')) })\n * store.defineMapper('user')\n * store.emit('foo', 'arg1', 'arg2')\n * store.getMapper('user').emit('foo', 'arg1', 'arg2')\n *\n * @method Container#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n\n /**\n * Used to bind to events emitted by mappers in this container.\n *\n * @method Container#_onMapperEvent\n * @param {string} name Name of the mapper that emitted the event.\n * @param {...*} [args] Args See {@link Mapper#emit}.\n * @private\n * @since 3.0.0\n */\n _onMapperEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * Return a container scoped to a particular mapper.\n *\n * @example Container#as\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * const UserMapper = store.defineMapper('user')\n * const UserStore = store.as('user')\n *\n * const user1 = store.createRecord('user', { name: 'John' })\n * const user2 = UserStore.createRecord({ name: 'John' })\n * const user3 = UserMapper.createRecord({ name: 'John' })\n * console.log(user1 === user2)\n * console.log(user2 === user3)\n * console.log(user1 === user3)\n *\n * @method Container#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} A container scoped to a particular mapper.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n proxiedMapperMethods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Create a new mapper and register it in this container.\n *\n * @example Container#defineMapper\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container({\n * mapperDefaults: { foo: 'bar' }\n * })\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * console.log(UserMapper.foo)\n *\n * @method Container#defineMapper\n * @param {string} name Name under which to register the new {@link Mapper}.\n * {@link Mapper#name} will be set to this value.\n * @param {Object} [opts] Configuration options. Passed to\n * {@link Container#mapperClass} when creating the new {@link Mapper}.\n * @returns {Mapper} The newly created instance of {@link Mapper}.\n * @see Container#as\n * @since 3.0.0\n */\n defineMapper (name, opts) {\n // For backwards compatibility with defineResource\n if (utils.isObject(name)) {\n opts = name\n name = opts.name\n }\n if (!utils.isString(name)) {\n throw utils.err(`${DOMAIN}#defineMapper`, 'name')(400, 'string', name)\n }\n\n // Default values for arguments\n opts || (opts = {})\n // Set Mapper#name\n opts.name = name\n opts.relations || (opts.relations = {})\n\n // Check if the user is overriding the datastore's default mapperClass\n const mapperClass = opts.mapperClass || this.mapperClass\n delete opts.mapperClass\n\n // Apply the datastore's defaults to the options going into the mapper\n utils.fillIn(opts, this.mapperDefaults)\n\n // Instantiate a mapper\n const mapper = this._mappers[name] = new mapperClass(opts) // eslint-disable-line\n mapper.relations || (mapper.relations = {})\n // Make sure the mapper's name is set\n mapper.name = name\n // All mappers in this datastore will share adapters\n mapper._adapters = this.getAdapters()\n\n mapper.datastore = this\n\n mapper.on('all', (...args) => this._onMapperEvent(name, ...args))\n mapper.defineRelations()\n\n return mapper\n },\n\n defineResource (name, opts) {\n console.warn('DEPRECATED: defineResource is deprecated, use defineMapper instead')\n return this.defineMapper(name, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Container#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n */\n getAdapter (name) {\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Container#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || this.mapperDefaults.defaultAdapter\n },\n\n /**\n * Return the registered adapters of this container.\n *\n * @method Container#getAdapters\n * @returns {Adapter}\n * @since 3.0.0\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Return the mapper registered under the specified name.\n *\n * @example Container#getMapper\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * store.getMapper('profile') // throws Error, there is no mapper with name \"profile\"\n *\n * @method Container#getMapper\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapper (name) {\n const mapper = this.getMapperByName(name)\n if (!mapper) {\n throw utils.err(`${DOMAIN}#getMapper`, name)(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Return the mapper registered under the specified name.\n * Doesn't throw error if mapper doesn't exist.\n *\n * @example Container#getMapperByName\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * console.log(store.getMapper('profile')) // Does NOT throw an error\n *\n * @method Container#getMapperByName\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapperByName (name) {\n return this._mappers[name]\n },\n\n /**\n * Register an adapter on this container under the given name. Adapters\n * registered on a container are shared by all mappers in the container.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n *\n * @method Container#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for all Mappers in this container.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.mapperDefaults.defaultAdapter = name\n utils.forOwn(this._mappers, function (mapper) {\n mapper.defaultAdapter = name\n })\n }\n }\n}\n\nproxiedMapperMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getMapper(name)[method](...args)\n }\n})\n\nComponent.extend(props)\n\n/**\n * Create a subclass of this Container:\n * @example Container.extend\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomContainerClass extends Container {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customContainer = new CustomContainerClass()\n * console.log(customContainer.foo())\n * console.log(CustomContainerClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherContainerClass = Container.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherContainer = new OtherContainerClass()\n * console.log(otherContainer.foo())\n * console.log(OtherContainerClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherContainerClass () {\n * Container.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Container.extend({\n * constructor: AnotherContainerClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherContainer = new AnotherContainerClass()\n * console.log(anotherContainer.created_at)\n * console.log(anotherContainer.foo())\n * console.log(AnotherContainerClass.beep())\n *\n * @method Container.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Container class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport {proxiedMapperMethods, Container} from './Container'\nimport Collection from './Collection'\n\nconst DOMAIN = 'SimpleStore'\nconst proxiedCollectionMethods = [\n /**\n * Wrapper for {@link Collection#add}.\n *\n * @example SimpleStore#add\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('book')\n *\n * // Add one book to the in-memory store:\n * store.add('book', { id: 1, title: 'Respect your Data' })\n * // Add multiple books to the in-memory store:\n * store.add('book', [\n * { id: 2, title: 'Easy data recipes' },\n * { id: 3, title: 'Active Record 101' }\n * ])\n *\n * @fires SimpleStore#add\n * @method SimpleStore#add\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}.\n * @param {Object} [opts] Configuration options. See {@link Collection#add}.\n * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n 'add',\n\n /**\n * Wrapper for {@link Collection#between}.\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = store.between('user', 18, 30, { index: 'age' })\n *\n * @example\n * // Same as above\n * const users = store.between('user', [18], [30], { index: 'age' })\n *\n * @method SimpleStore#between\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {Array} leftKeys See {@link Collection#between}.\n * @param {Array} rightKeys See {@link Collection#between}.\n * @param {Object} [opts] Configuration options. See {@link Collection#between}.\n * @returns {Object[]|Record[]} See {@link Collection#between}.\n * @see Collection#between\n * @see Collection#between\n * @since 3.0.0\n */\n 'between',\n\n /**\n * Wrapper for {@link Collection#createIndex}.\n *\n * @example\n * // Index users by age\n * store.createIndex('user', 'age')\n *\n * @example\n * // Index users by status and role\n * store.createIndex('user', 'statusAndRole', ['status', 'role'])\n *\n * @method SimpleStore#createIndex\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {string} name See {@link Collection#createIndex}.\n * @param {string[]} [fieldList] See {@link Collection#createIndex}.\n * @see Collection#createIndex\n * @see Collection#createIndex\n * @since 3.0.0\n */\n 'createIndex',\n\n /**\n * Wrapper for {@link Collection#filter}.\n *\n * @example SimpleStore#filter\n * // import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('post')\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * // Get the draft posts created less than three months ago\n * let posts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * })\n * console.log(posts)\n *\n * // Use a custom filter function\n * posts = store.filter('post', function (post) { return post.id % 2 === 0 })\n *\n * @method SimpleStore#filter\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}.\n * @param {Object} [thisArg] See {@link Collection#filter}.\n * @returns {Array} See {@link Collection#filter}.\n * @see Collection#filter\n * @see Collection#filter\n * @since 3.0.0\n */\n 'filter',\n\n /**\n * Wrapper for {@link Collection#get}.\n *\n * @example SimpleStore#get\n * // import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('post')\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * console.log(store.get('post', 1)) // {...}\n * console.log(store.get('post', 2)) // undefined\n *\n * @method SimpleStore#get\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Collection#get}.\n * @returns {(Object|Record)} See {@link Collection#get}.\n * @see Collection#get\n * @see Collection#get\n * @since 3.0.0\n */\n 'get',\n\n /**\n * Wrapper for {@link Collection#getAll}.\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' })\n *\n * @example\n * // Same as above\n * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' })\n *\n * @method SimpleStore#getAll\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {...Array} [keyList] See {@link Collection#getAll}.\n * @param {Object} [opts] See {@link Collection#getAll}.\n * @returns {Array} See {@link Collection#getAll}.\n * @see Collection#getAll\n * @see Collection#getAll\n * @since 3.0.0\n */\n 'getAll',\n\n /**\n * Wrapper for {@link Collection#prune}.\n *\n * @method SimpleStore#prune\n * @param {Object} [opts] See {@link Collection#prune}.\n * @returns {Array} See {@link Collection#prune}.\n * @see Collection#prune\n * @see Collection#prune\n * @since 3.0.0\n */\n 'prune',\n\n /**\n * Wrapper for {@link Collection#query}.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * store.query('user')\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run()\n *\n * @method SimpleStore#query\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @returns {Query} See {@link Collection#query}.\n * @see Collection#query\n * @see Collection#query\n * @since 3.0.0\n */\n 'query',\n\n /**\n * Wrapper for {@link Collection#toJSON}.\n *\n * @example\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * title: { type: 'string' }\n * }\n * }\n * })\n * store.add('post', [\n * { id: 1, status: 'published', title: 'Respect your Data' },\n * { id: 2, status: 'draft', title: 'Connecting to a data source' }\n * ])\n * console.log(store.toJSON('post'))\n * const draftsJSON = store.query('post')\n * .filter({ status: 'draft' })\n * .mapCall('toJSON')\n * .run()\n *\n * @method SimpleStore#toJSON\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {Object} [opts] See {@link Collection#toJSON}.\n * @returns {Array} See {@link Collection#toJSON}.\n * @see Collection#toJSON\n * @see Collection#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Wrapper for {@link Collection#unsaved}.\n *\n * @method SimpleStore#unsaved\n * @returns {Array} See {@link Collection#unsaved}.\n * @see Collection#unsaved\n * @see Collection#unsaved\n * @since 3.0.0\n */\n 'unsaved'\n]\nconst ownMethodsForScoping = [\n 'addToCache',\n 'cachedFind',\n 'cachedFindAll',\n 'cacheFind',\n 'cacheFindAll',\n 'hashQuery'\n]\n\nconst cachedFn = function (name, hashOrId, opts) {\n const cached = this._completedQueries[name][hashOrId]\n if (utils.isFunction(cached)) {\n return cached(name, hashOrId, opts)\n }\n return cached\n}\n\nconst SIMPLESTORE_DEFAULTS = {\n /**\n * Whether to use the pending query if a `find` request for the specified\n * record is currently underway. Can be set to `true`, `false`, or to a\n * function that returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFind\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFind: true,\n\n /**\n * Whether to use the pending query if a `findAll` request for the given query\n * is currently underway. Can be set to `true`, `false`, or to a function that\n * returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFindAll\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFindAll: true\n}\n\n/**\n * The `SimpleStore` class is an extension of {@link Container}. Not only does\n * `SimpleStore` manage mappers, but also collections. `SimpleStore` implements the\n * asynchronous {@link Mapper} methods, such as {@link Mapper#find} and\n * {@link Mapper#create}. If you use the asynchronous `SimpleStore` methods\n * instead of calling them directly on the mappers, then the results of the\n * method calls will be inserted into the store's collections. You can think of\n * a `SimpleStore` as an [Identity Map](https://en.wikipedia.org/wiki/Identity_map_pattern)\n * for the [ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)\n * (the Mappers).\n *\n * ```javascript\n * import {SimpleStore} from 'js-data'\n * ```\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import HttpAdapter from 'js-data-http'\n * const store = new SimpleStore()\n *\n * // SimpleStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n *\n * // SimpleStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user')\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful SimpleStore)\n * return store.find('user', 1) // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1)\n * console.log(user === cachedUser) // true\n * })\n *\n * @class SimpleStore\n * @extends Container\n * @param {Object} [opts] Configuration options. See {@link Container}.\n * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link SimpleStore#usePendingFindAll}.\n * @returns {SimpleStore}\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-SimpleStore\",\"Working with the SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction SimpleStore (opts) {\n utils.classCallCheck(this, SimpleStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, SIMPLESTORE_DEFAULTS)\n Container.call(this, opts)\n\n this.collectionClass = this.collectionClass || Collection\n this._collections = {}\n this._pendingQueries = {}\n this._completedQueries = {}\n}\n\nconst props = {\n constructor: SimpleStore,\n\n /**\n * Internal method used to handle Mapper responses.\n *\n * @method SimpleStore#_end\n * @private\n * @param {string} name Name of the {@link Collection} to which to\n * add the data.\n * @param {Object} result The result from a Mapper.\n * @param {Object} [opts] Configuration options.\n * @returns {(Object|Array)} Result.\n */\n _end (name, result, opts) {\n let data = opts.raw ? result.data : result\n if (data && utils.isFunction(this.addToCache)) {\n data = this.addToCache(name, data, opts)\n if (opts.raw) {\n result.data = data\n } else {\n result = data\n }\n }\n return result\n },\n\n /**\n * Register a new event listener on this SimpleStore.\n *\n * Proxy for {@link Container#on}. If an event was emitted by a Mapper or\n * Collection in the SimpleStore, then the name of the Mapper or Collection will\n * be prepended to the arugments passed to the provided event handler.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a SimpleStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName) // \"post\"\n * console.log(props.id) // undefined\n * console.log(result.id) // 1234\n * })\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id) // 1234\n * })\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * store.on('add', (mapperName, records) => {\n * console.log(records) // [...]\n * })\n *\n * @example\n * // Listen for \"change\" events on a record\n * store.on('change', (mapperName, record, changes) => {\n * console.log(changes) // { changed: { title: 'Modeling your data' } }\n * })\n * post.title = 'Modeling your data'\n *\n * @method SimpleStore#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n */\n\n /**\n * Used to bind to events emitted by collections in this store.\n *\n * @method SimpleStore#_onCollectionEvent\n * @private\n * @param {string} name Name of the collection that emitted the event.\n * @param {...*} [args] Args passed to {@link Collection#emit}.\n */\n _onCollectionEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * This method takes the data received from {@link SimpleStore#find},\n * {@link SimpleStore#findAll}, {@link SimpleStore#update}, etc., and adds the\n * data to the store. _You don't need to call this method directly._\n *\n * If you're using the http adapter and your response data is in an unexpected\n * format, you may need to override this method so the right data gets added\n * to the store.\n *\n * @example\n * const store = new SimpleStore({\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items\n * }\n * // Now perform default behavior\n * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items\n * }\n * // Now perform default behavior\n * return super.addToCache(mapperName, data, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#addToCache\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {*} data Data from which data should be selected for add.\n * @param {Object} [opts] Configuration options.\n */\n addToCache (name, data, opts) {\n return this.getCollection(name).add(data, opts)\n },\n\n /**\n * Return the store scoped to a particular mapper/collection pair.\n *\n * @example SimpleStore.as\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * const UserMapper = store.defineMapper('user')\n * const UserStore = store.as('user')\n *\n * const user1 = store.createRecord('user', { name: 'John' })\n * const user2 = UserStore.createRecord({ name: 'John' })\n * const user3 = UserMapper.createRecord({ name: 'John' })\n * console.log(user1 === user2)\n * console.log(user2 === user3)\n * console.log(user1 === user3)\n *\n * @method SimpleStore#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} The store, scoped to a particular Mapper/Collection pair.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n const methods = ownMethodsForScoping\n .concat(proxiedMapperMethods)\n .concat(proxiedCollectionMethods)\n\n methods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n props.getCollection = {\n writable: true,\n value () {\n return original.getCollection(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Retrieve a cached `find` result, if any. This method is called during\n * {@link SimpleStore#find} to determine if {@link Mapper#find} needs to be\n * called. If this method returns `undefined` then {@link Mapper#find} will\n * be called. Otherwise {@link SimpleStore#find} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return\n * }\n * // Otherwise perform default behavior\n * return super.cachedFind(mapperName, id, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cachedFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cachedFind: cachedFn,\n\n /**\n * Retrieve a cached `findAll` result, if any. This method is called during\n * {@link SimpleStore#findAll} to determine if {@link Mapper#findAll} needs to be\n * called. If this method returns `undefined` then {@link Mapper#findAll} will\n * be called. Otherwise {@link SimpleStore#findAll} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined\n * }\n * // Otherwise perform default behavior\n * return super.cachedFindAll(mapperName, hash, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cachedFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cachedFindAll: cachedFn,\n\n /**\n * Mark a {@link Mapper#find} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `find` entry is\n * added it means subsequent calls to the same Resource with the same `id`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#get} instead of delegating to {@link Mapper#find}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior\n * return super.cacheFind(mapperName, data, id, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cacheFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {*} data The result to cache.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cacheFind (name, data, id, opts) {\n this._completedQueries[name][id] = (name, id, opts) => this.get(name, id)\n },\n\n /**\n * Mark a {@link Mapper#findAll} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `findAll` entry is\n * added it means subsequent calls to the same Resource with the same `query`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#filter} instead of delegating to {@link Mapper#findAll}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior.\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior.\n * return super.cachedFindAll(mapperName, data, hash, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cacheFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {*} data The result to cache.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cacheFindAll (name, data, hash, opts) {\n this._completedQueries[name][hash] = (name, hash, opts) => this.filter(name, utils.fromJson(hash))\n },\n\n /**\n * Remove __all__ records from the in-memory store and reset\n * {@link SimpleStore#_completedQueries}.\n *\n * @method SimpleStore#clear\n * @returns {Object} Object containing all records that were in the store.\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n clear () {\n const removed = {}\n utils.forOwn(this._collections, (collection, name) => {\n removed[name] = collection.removeAll()\n this._completedQueries[name] = {}\n })\n return removed\n },\n\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~beforeCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreate\n * @see SimpleStore~beforeCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback SimpleStore~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see SimpleStore#event:beforeCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~afterCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreate\n * @see SimpleStore~afterCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback SimpleStore~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see SimpleStore#event:afterCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}. Adds the created record to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book {\"author_id\":1234,...}\n * store.create('book', {\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }).then((book) => {\n * console.log(book.id) // 120392\n * console.log(book.title) // \"Respect your Data\"\n * })\n *\n * @fires SimpleStore#beforeCreate\n * @fires SimpleStore#afterCreate\n * @fires SimpleStore#add\n * @method SimpleStore#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} record Passed to {@link Mapper#create}.\n * @param {Object} [opts] Passed to {@link Mapper#create}. See\n * {@link Mapper#create} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n create (name, record, opts) {\n opts || (opts = {})\n return Container.prototype.create.call(this, name, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~beforeCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreateMany\n * @see SimpleStore~beforeCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback SimpleStore~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see SimpleStore#event:beforeCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~afterCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreateMany\n * @see SimpleStore~afterCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback SimpleStore~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see SimpleStore#event:afterCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}. Adds the created records to the\n * store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book [{\"author_id\":1234,...},{...}]\n * store.createMany('book', [{\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }, {\n * author_id: 1234,\n * edition: 'Second Edition',\n * title: 'Respect your Data'\n * }]).then((books) => {\n * console.log(books[0].id) // 142394\n * console.log(books[0].title) // \"Respect your Data\"\n * })\n *\n * @fires SimpleStore#beforeCreateMany\n * @fires SimpleStore#afterCreateMany\n * @fires SimpleStore#add\n * @method SimpleStore#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Array} records Passed to {@link Mapper#createMany}.\n * @param {Object} [opts] Passed to {@link Mapper#createMany}. See\n * {@link Mapper#createMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n createMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.createMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n defineMapper (name, opts) {\n const self = this\n const mapper = Container.prototype.defineMapper.call(self, name, opts)\n self._pendingQueries[name] = {}\n self._completedQueries[name] = {}\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n\n let collectionOpts = {\n // Make sure the collection has somewhere to store \"added\" timestamps\n _added: {},\n // Give the collection a reference to this SimpleStore\n datastore: self,\n // The mapper tied to the collection\n mapper\n }\n\n if (opts && ('onConflict' in opts)) {\n collectionOpts.onConflict = opts.onConflict\n }\n\n // The SimpleStore uses a subclass of Collection that is \"SimpleStore-aware\"\n const collection = self._collections[name] = new self.collectionClass(null, collectionOpts) // eslint-disable-line\n\n const schema = mapper.schema || {}\n const properties = schema.properties || {}\n // TODO: Make it possible index nested properties?\n utils.forOwn(properties, function (opts, prop) {\n if (opts.indexed) {\n collection.createIndex(prop)\n }\n })\n\n // Create a secondary index on the \"added\" timestamps of records in the\n // collection\n collection.createIndex('addedTimestamps', ['$'], {\n fieldGetter (obj) {\n return collection._added[collection.recordId(obj)]\n }\n })\n\n collection.on('all', function (...args) {\n self._onCollectionEvent(name, ...args)\n })\n\n return mapper\n },\n\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~beforeDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroy\n * @see SimpleStore~beforeDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback SimpleStore~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see SimpleStore#event:beforeDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~afterDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroy\n * @see SimpleStore~afterDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback SimpleStore~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see SimpleStore#event:afterDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}. Removes any destroyed record from the\n * in-memory store. Clears out any {@link SimpleStore#_completedQueries} entries\n * associated with the provided `id`.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' })\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is no longer in the in-memory store\n * console.log(store.get('book', 1234)) // undefined\n *\n * return store.find('book', 1234)\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book) // undefined\n * })\n *\n * @fires SimpleStore#beforeDestroy\n * @fires SimpleStore#afterDestroy\n * @fires SimpleStore#remove\n * @method SimpleStore#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#destroy}.\n * @param {Object} [opts] Passed to {@link Mapper#destroy}. See\n * {@link Mapper#destroy} for more configuration options.\n * @returns {Promise} Resolves when the destroy operation completes.\n * @since 3.0.0\n */\n destroy (name, id, opts) {\n opts || (opts = {})\n return Container.prototype.destroy.call(this, name, id, opts).then((result) => {\n const record = this.getCollection(name).remove(id, opts)\n\n if (opts.raw) {\n result.data = record\n } else {\n result = record\n }\n delete this._pendingQueries[name][id]\n delete this._completedQueries[name][id]\n return result\n })\n },\n\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroyAll\n * @see SimpleStore~beforeDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback SimpleStore~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see SimpleStore#event:beforeDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~afterDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroyAll\n * @see SimpleStore~afterDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback SimpleStore~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see SimpleStore#event:afterDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}. Removes any destroyed records from\n * the in-memory store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' })\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is gone from the in-memory store\n * console.log(store.get('book', 1234)) // undefined\n * return store.find('book', 1234)\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book) // undefined\n * })\n *\n * @fires SimpleStore#beforeDestroyAll\n * @fires SimpleStore#afterDestroyAll\n * @fires SimpleStore#remove\n * @method SimpleStore#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] Passed to {@link Mapper#destroyAll}.\n * @param {Object} [opts] Passed to {@link Mapper#destroyAll}. See\n * {@link Mapper#destroyAll} for more configuration options.\n * @returns {Promise} Resolves when the delete completes.\n * @since 3.0.0\n */\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return Container.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n const records = this.getCollection(name).removeAll(query, opts)\n\n if (opts.raw) {\n result.data = records\n } else {\n result = records\n }\n const hash = this.hashQuery(name, query, opts)\n delete this._pendingQueries[name][hash]\n delete this._completedQueries[name][hash]\n return result\n })\n },\n\n eject (name, id, opts) {\n console.warn('DEPRECATED: \"eject\" is deprecated, use \"remove\" instead')\n return this.remove(name, id, opts)\n },\n\n ejectAll (name, query, opts) {\n console.warn('DEPRECATED: \"ejectAll\" is deprecated, use \"removeAll\" instead')\n return this.removeAll(name, query, opts)\n },\n\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~beforeFindListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFind\n * @see SimpleStore~beforeFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback SimpleStore~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see SimpleStore#event:beforeFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~afterFindListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFind\n * @see SimpleStore~afterFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback SimpleStore~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see SimpleStore#event:afterFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}. Adds any found record to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /book/1234\n * store.find('book', 1234).then((book) => {\n * // The book record is now in the in-memory store\n * console.log(store.get('book', 1234) === book) // true\n * })\n *\n * @fires SimpleStore#beforeFind\n * @fires SimpleStore#afterFind\n * @fires SimpleStore#add\n * @method SimpleStore#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#find}.\n * @param {Object} [opts] Passed to {@link Mapper#find}.\n * @param {boolean} [opts.force] Bypass cacheFind\n * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n find (name, id, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const pendingQuery = this._pendingQueries[name][id]\n const usePendingFind = opts.usePendingFind === undefined ? this.usePendingFind : opts.usePendingFind\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFind) ? usePendingFind.call(this, name, id, opts) : usePendingFind)) {\n return pendingQuery\n }\n const item = this.cachedFind(name, id, opts)\n\n if (opts.force || !item) {\n const promise = this._pendingQueries[name][id] = Container.prototype.find.call(this, name, id, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][id]\n result = this._end(name, result, opts)\n this.cacheFind(name, result, id, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][id]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(item)\n },\n\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~beforeFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFindAll\n * @see SimpleStore~beforeFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback SimpleStore~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see SimpleStore#event:beforeFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~afterFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFindAll\n * @see SimpleStore~afterFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback SimpleStore~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see SimpleStore#event:afterFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#findAll}. Adds any found records to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('movie')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /movie?rating=PG\n * store.find('movie', { rating: 'PG' }).then((movies) => {\n * // The movie records are now in the in-memory store\n * console.log(store.filter('movie'))\n * })\n *\n * @fires SimpleStore#beforeFindAll\n * @fires SimpleStore#afterFindAll\n * @fires SimpleStore#add\n * @method SimpleStore#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] Passed to {@link Mapper.findAll}.\n * @param {Object} [opts] Passed to {@link Mapper.findAll}.\n * @param {boolean} [opts.force] Bypass cacheFindAll\n * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n findAll (name, query, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const hash = this.hashQuery(name, query, opts)\n const pendingQuery = this._pendingQueries[name][hash]\n const usePendingFindAll = opts.usePendingFindAll === undefined ? this.usePendingFindAll : opts.usePendingFindAll\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFindAll) ? usePendingFindAll.call(this, name, query, opts) : usePendingFindAll)) {\n return pendingQuery\n }\n\n const items = this.cachedFindAll(name, hash, opts)\n\n if (opts.force || !items) {\n const promise = this._pendingQueries[name][hash] = Container.prototype.findAll.call(this, name, query, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][hash]\n result = this._end(name, result, opts)\n this.cacheFindAll(name, result, hash, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][hash]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(items)\n },\n\n /**\n * Return the {@link Collection} with the given name, if for some\n * reason you need a direct reference to the collection.\n *\n * @method SimpleStore#getCollection\n * @param {string} name Name of the {@link Collection} to retrieve.\n * @returns {Collection}\n * @since 3.0.0\n * @throws {Error} Thrown if the specified {@link Collection} does not\n * exist.\n */\n getCollection (name) {\n const collection = this._collections[name]\n if (!collection) {\n throw utils.err(`${DOMAIN}#getCollection`, name)(404, 'collection')\n }\n return collection\n },\n\n /**\n * Hashing function used to cache {@link SimpleStore#find} and\n * {@link SimpleStore#findAll} requests. This method simply JSONifies the\n * `query` argument passed to {@link SimpleStore#find} or\n * {@link SimpleStore#findAll}.\n *\n * Override this method for custom hashing behavior.\n * @method SimpleStore#hashQuery\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @param {Object} query The `query` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @returns {string} The JSONified `query`.\n * @since 3.0.0\n */\n hashQuery (name, query, opts) {\n return utils.toJson(query || {})\n },\n\n inject (name, records, opts) {\n console.warn('DEPRECATED: \"inject\" is deprecated, use \"add\" instead')\n return this.add(name, records, opts)\n },\n\n /**\n * Wrapper for {@link Collection#remove}. Removes the specified\n * {@link Record} from the store.\n *\n * @example SimpleStore#remove\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('book')\n * console.log(store.getAll('book').length)\n * store.add('book', { id: 1234 })\n * console.log(store.getAll('book').length)\n * store.remove('book', 1234)\n * console.log(store.getAll('book').length)\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#remove\n * @param {string} name The name of the {@link Collection} to target.\n * @param {string|number} id The primary key of the {@link Record} to remove.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n remove (name, id, opts) {\n const record = this.getCollection(name).remove(id, opts)\n if (record) {\n this.removeRelated(name, [record], opts)\n }\n return record\n },\n\n /**\n * Wrapper for {@link Collection#removeAll}. Removes the selected\n * {@link Record}s from the store.\n *\n * @example SimpleStore#removeAll\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('movie')\n * console.log(store.getAll('movie').length)\n * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' })\n * console.log(store.getAll('movie').length)\n * store.removeAll('movie', { rating: 'R' })\n * console.log(store.getAll('movie').length)\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeAll\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}s, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n removeAll (name, query, opts) {\n if (!query || !Object.keys(query).length) {\n this._completedQueries[name] = {}\n } else {\n this._completedQueries[name][this.hashQuery(name, query, opts)] = undefined\n }\n const records = this.getCollection(name).removeAll(query, opts)\n if (records.length) {\n this.removeRelated(name, records, opts)\n }\n return records\n },\n\n /**\n * Remove from the store {@link Record}s that are related to the provided\n * {@link Record}(s).\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeRelated\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Record|Record[]} records {@link Record}s whose relations are to be\n * removed.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove\n * from the store.\n * @since 3.0.0\n */\n removeRelated (name, records, opts) {\n if (!utils.isArray(records)) {\n records = [records]\n }\n utils.forEachRelation(this.getMapper(name), opts, (def, optsCopy) => {\n records.forEach((record) => {\n let relatedData\n let query\n if (def.foreignKey && (def.type === hasOneType || def.type === hasManyType)) {\n query = { [def.foreignKey]: def.getForeignKey(record) }\n } else if (def.type === hasManyType && def.localKeys) {\n query = {\n where: {\n [def.getRelation().idAttribute]: {\n 'in': utils.get(record, def.localKeys)\n }\n }\n }\n } else if (def.type === hasManyType && def.foreignKeys) {\n query = {\n where: {\n [def.foreignKeys]: {\n 'contains': def.getForeignKey(record)\n }\n }\n }\n } else if (def.type === belongsToType) {\n relatedData = this.remove(def.relation, def.getForeignKey(record), optsCopy)\n }\n if (query) {\n relatedData = this.removeAll(def.relation, query, optsCopy)\n }\n if (relatedData) {\n if (utils.isArray(relatedData) && !relatedData.length) {\n return\n }\n if (def.type === hasOneType) {\n relatedData = relatedData[0]\n }\n def.setLocalField(record, relatedData)\n }\n })\n })\n },\n\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~beforeUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdate\n * @see SimpleStore~beforeUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback SimpleStore~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see SimpleStore#event:beforeUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~afterUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdate\n * @see SimpleStore~afterUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback SimpleStore~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see SimpleStore#event:afterUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}. Adds the updated {@link Record} to the\n * store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post/1234 {\"status\":\"published\"}\n * store.update('post', 1, { status: 'published' }).then((post) => {\n * // The post record has also been updated in the in-memory store\n * console.log(store.get('post', 1234))\n * })\n *\n * @fires SimpleStore#beforeUpdate\n * @fires SimpleStore#afterUpdate\n * @fires SimpleStore#add\n * @method SimpleStore#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#update}.\n * @param {Object} record Passed to {@link Mapper#update}.\n * @param {Object} [opts] Passed to {@link Mapper#update}. See\n * {@link Mapper#update} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n update (name, id, record, opts) {\n opts || (opts = {})\n return Container.prototype.update.call(this, name, id, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateAll\n * @see SimpleStore~beforeUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback SimpleStore~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see SimpleStore#event:beforeUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~afterUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateAll\n * @see SimpleStore~afterUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback SimpleStore~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see SimpleStore#event:afterUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post?author_id=1234 {\"status\":\"published\"}\n * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.filter('posts', { author_id: 1234 }))\n * })\n *\n * @fires SimpleStore#beforeUpdateAll\n * @fires SimpleStore#afterUpdateAll\n * @fires SimpleStore#add\n * @method SimpleStore#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} props Passed to {@link Mapper#updateAll}.\n * @param {Object} [query] Passed to {@link Mapper#updateAll}.\n * @param {Object} [opts] Passed to {@link Mapper#updateAll}. See\n * {@link Mapper#updateAll} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateAll (name, props, query, opts) {\n opts || (opts = {})\n return Container.prototype.updateAll.call(this, name, props, query, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateMany\n * @see SimpleStore~beforeUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback SimpleStore~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see SimpleStore#event:beforeUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~afterUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateMany\n * @see SimpleStore~afterUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback SimpleStore~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see SimpleStore#event:afterUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post [{\"id\":3,status\":\"published\"},{\"id\":4,status\":\"published\"}]\n * store.updateMany('post', [\n * { id: 3, status: 'published' },\n * { id: 4, status: 'published' }\n * ]).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.getAll('post', 3, 4))\n * })\n *\n * @fires SimpleStore#beforeUpdateMany\n * @fires SimpleStore#afterUpdateMany\n * @fires SimpleStore#add\n * @method SimpleStore#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}.\n * @param {Object} [opts] Passed to {@link Mapper#updateMany}. See\n * {@link Mapper#updateMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.updateMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n }\n}\n\nproxiedCollectionMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getCollection(name)[method](...args)\n }\n})\n\nexport default Container.extend(props)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link SimpleStore~changeListener} on how to listen for this event.\n *\n * @event SimpleStore#change\n * @see SimpleStore~changeListener\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:change} event.\n *\n * @example\n * function onChange (mapperName, record, changes) {\n * // do something\n * }\n * store.on('change', onChange)\n *\n * @callback SimpleStore~changeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record} record The Record that changed.\n * @param {Object} changes The changes.\n * @see SimpleStore#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the in-memory store. See\n * {@link SimpleStore~addListener} on how to listen for this event.\n *\n * @event SimpleStore#add\n * @see SimpleStore~addListener\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:add} event.\n *\n * @example\n * function onAdd (mapperName, recordOrRecords) {\n * // do something\n * }\n * store.on('add', onAdd)\n *\n * @callback SimpleStore~addListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} The Record or Records that were added.\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the in-memory store. See\n * {@link SimpleStore~removeListener} for how to listen for this event.\n *\n * @event SimpleStore#remove\n * @see SimpleStore~removeListener\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:remove} event.\n *\n * @example\n * function onRemove (mapperName, recordsOrRecords) {\n * // do something\n * }\n * store.on('remove', onRemove)\n *\n * @callback SimpleStore~removeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} Record or Records that were removed.\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this SimpleStore:\n * @example SimpleStore.extend\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSimpleStoreClass extends SimpleStore {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSimpleStore = new CustomSimpleStoreClass()\n * console.log(customSimpleStore.foo())\n * console.log(CustomSimpleStoreClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSimpleStoreClass = SimpleStore.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSimpleStore = new OtherSimpleStoreClass()\n * console.log(otherSimpleStore.foo())\n * console.log(OtherSimpleStoreClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSimpleStoreClass () {\n * SimpleStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * SimpleStore.extend({\n * constructor: AnotherSimpleStoreClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSimpleStore = new AnotherSimpleStoreClass()\n * console.log(anotherSimpleStore.created_at)\n * console.log(anotherSimpleStore.foo())\n * console.log(AnotherSimpleStoreClass.beep())\n *\n * @method SimpleStore.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this SimpleStore class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport './decorators'\nimport Collection from './Collection'\n\nconst DOMAIN = 'LinkedCollection'\n\n/**\n * Extends {@link Collection}. Used by a {@link DataStore} to implement an\n * Identity Map.\n *\n * ```javascript\n * import {LinkedCollection} from 'js-data'\n * ```\n *\n * @class LinkedCollection\n * @extends Collection\n * @param {Array} [records] Initial set of records to insert into the\n * collection. See {@link Collection}.\n * @param {Object} [opts] Configuration options. See {@link Collection}.\n * @returns {Mapper}\n */\nfunction LinkedCollection (records, opts) {\n utils.classCallCheck(this, LinkedCollection)\n // Make sure this collection has somewhere to store \"added\" timestamps\n Object.defineProperties(this, {\n _added: {\n value: {}\n },\n datastore: {\n writable: true,\n value: undefined\n }\n })\n\n Collection.call(this, records, opts)\n\n // Make sure this collection has a reference to a datastore\n if (!this.datastore) {\n throw utils.err(`new ${DOMAIN}`, 'opts.datastore')(400, 'DataStore', this.datastore)\n }\n}\n\nexport default Collection.extend({\n constructor: LinkedCollection,\n\n _addMeta (record, timestamp) {\n // Track when this record was added\n this._added[this.recordId(record)] = timestamp\n\n if (utils.isFunction(record._set)) {\n record._set('$', timestamp)\n }\n },\n\n _clearMeta (record) {\n delete this._added[this.recordId(record)]\n if (utils.isFunction(record._set)) {\n record._set('$') // unset\n }\n },\n\n _onRecordEvent (...args) {\n Collection.prototype._onRecordEvent.apply(this, args)\n const event = args[0]\n // This is a very brute force method\n // Lots of room for optimization\n if (utils.isString(event) && event.indexOf('change') === 0) {\n this.updateIndexes(args[1])\n }\n },\n\n add (records, opts) {\n const mapper = this.mapper\n const timestamp = new Date().getTime()\n const singular = utils.isObject(records) && !utils.isArray(records)\n\n if (singular) {\n records = [records]\n }\n records = Collection.prototype.add.call(this, records, opts)\n\n if (mapper.relationList.length && records.length) {\n // Check the currently visited record for relations that need to be\n // inserted into their respective collections.\n mapper.relationList.forEach(function (def) {\n def.addLinkedRecords(records)\n })\n }\n\n records.forEach((record) => this._addMeta(record, timestamp))\n\n return singular ? records[0] : records\n },\n\n remove (idOrRecord, opts) {\n const mapper = this.mapper\n const record = Collection.prototype.remove.call(this, idOrRecord, opts)\n if (record) {\n this._clearMeta(record)\n }\n\n if (mapper.relationList.length && record) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, [record])\n })\n }\n\n return record\n },\n\n removeAll (query, opts) {\n const mapper = this.mapper\n const records = Collection.prototype.removeAll.call(this, query, opts)\n records.forEach(this._clearMeta, this)\n\n if (mapper.relationList.length && records.length) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, records)\n })\n }\n\n return records\n }\n})\n\n/**\n * Create a subclass of this LinkedCollection:\n *\n * @example LinkedCollection.extend\n * // Normally you would do: import {LinkedCollection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {LinkedCollection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomLinkedCollectionClass extends LinkedCollection {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customLinkedCollection = new CustomLinkedCollectionClass()\n * console.log(customLinkedCollection.foo())\n * console.log(CustomLinkedCollectionClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherLinkedCollectionClass = LinkedCollection.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherLinkedCollection = new OtherLinkedCollectionClass()\n * console.log(otherLinkedCollection.foo())\n * console.log(OtherLinkedCollectionClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherLinkedCollectionClass () {\n * LinkedCollection.call(this)\n * this.created_at = new Date().getTime()\n * }\n * LinkedCollection.extend({\n * constructor: AnotherLinkedCollectionClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherLinkedCollection = new AnotherLinkedCollectionClass()\n * console.log(anotherLinkedCollection.created_at)\n * console.log(anotherLinkedCollection.foo())\n * console.log(AnotherLinkedCollectionClass.beep())\n *\n * @method LinkedCollection.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this LinkedCollection class.\n * @since 3.0.0\n */\n","import utils, { safeSetLink, safeSetProp } from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport SimpleStore from './SimpleStore'\nimport LinkedCollection from './LinkedCollection'\n\nconst DATASTORE_DEFAULTS = {\n /**\n * Whether in-memory relations should be unlinked from records after they are\n * destroyed.\n *\n * @default true\n * @name DataStore#unlinkOnDestroy\n * @since 3.0.0\n * @type {boolean}\n */\n unlinkOnDestroy: true\n}\n\n/**\n * The `DataStore` class is an extension of {@link SimpleStore}. Not only does\n * `DataStore` manage mappers and store data in collections, it uses the\n * {@link LinkedCollection} class to link related records together in memory.\n *\n * ```javascript\n * import {DataStore} from 'js-data'\n * ```\n *\n * @example\n * import {DataStore} from 'js-data'\n * import HttpAdapter from 'js-data-http'\n * const store = new DataStore()\n *\n * // DataStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n *\n * // DataStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user')\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful DataStore)\n * return store.find('user', 1) // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1)\n * console.log(user === cachedUser) // true\n * })\n *\n * @class DataStore\n * @extends SimpleStore\n * @param {Object} [opts] Configuration options. See {@link SimpleStore}.\n * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link DataStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link DataStore#usePendingFindAll}.\n * @returns {DataStore}\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-datastore\",\"Working with the DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction DataStore (opts) {\n utils.classCallCheck(this, DataStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, DATASTORE_DEFAULTS)\n opts.collectionClass || (opts.collectionClass = LinkedCollection)\n SimpleStore.call(this, opts)\n}\n\nconst props = {\n constructor: DataStore,\n\n defineMapper (name, opts) {\n // Complexity of this method is beyond simply using => functions to bind context\n const self = this\n const mapper = SimpleStore.prototype.defineMapper.call(self, name, opts)\n const idAttribute = mapper.idAttribute\n const collection = this.getCollection(name)\n\n mapper.relationList.forEach(function (def) {\n const relation = def.relation\n const localField = def.localField\n const path = `links.${localField}`\n const foreignKey = def.foreignKey\n const type = def.type\n const updateOpts = { index: foreignKey }\n let descriptor\n\n const getter = function () { return this._get(path) }\n\n if (type === belongsToType) {\n if (!collection.indexes[foreignKey]) {\n collection.createIndex(foreignKey)\n }\n\n descriptor = {\n get: getter,\n // e.g. profile.user = someUser\n // or comment.post = somePost\n set (record) {\n // e.g. const otherUser = profile.user\n const currentParent = this._get(path)\n // e.g. profile.user === someUser\n if (record === currentParent) {\n return currentParent\n }\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n\n // e.g. profile.user !== someUser\n // or comment.post !== somePost\n if (currentParent && inverseDef) {\n this.removeInverseRelation(currentParent, id, inverseDef, idAttribute)\n }\n if (record) {\n // e.g. profile.user = someUser\n const relatedIdAttribute = def.getRelation().idAttribute\n const relatedId = utils.get(record, relatedIdAttribute)\n\n // Prefer store record\n if (relatedId !== undefined && this._get('$')) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n // e.g. profile.user = someUser\n // or comment.post = somePost\n safeSetLink(this, localField, record)\n safeSetProp(this, foreignKey, relatedId)\n collection.updateIndex(this, updateOpts)\n\n if (inverseDef) {\n this.setupInverseRelation(record, id, inverseDef, idAttribute)\n }\n } else {\n // Unset in-memory link only\n // e.g. profile.user = undefined\n // or comment.post = undefined\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n\n let foreignKeyDescriptor = Object.getOwnPropertyDescriptor(mapper.recordClass.prototype, foreignKey)\n if (!foreignKeyDescriptor) {\n foreignKeyDescriptor = {\n enumerable: true\n }\n }\n const originalGet = foreignKeyDescriptor.get\n foreignKeyDescriptor.get = function () {\n if (originalGet) {\n return originalGet.call(this)\n }\n return this._get(`props.${foreignKey}`)\n }\n const originalSet = foreignKeyDescriptor.set\n foreignKeyDescriptor.set = function (value) {\n if (originalSet) {\n originalSet.call(this, value)\n }\n const currentParent = utils.get(this, localField)\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n const currentParentId = currentParent ? utils.get(currentParent, def.getRelation().idAttribute) : undefined\n\n if (currentParent && currentParentId !== undefined && currentParentId !== value) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n }\n\n safeSetProp(this, foreignKey, value)\n collection.updateIndex(this, updateOpts)\n\n if ((value === undefined || value === null)) {\n if (currentParentId !== undefined) {\n // Unset locals\n utils.set(this, localField, undefined)\n }\n } else if (this._get('$')) {\n const storeRecord = self.get(relation, value)\n if (storeRecord) {\n utils.set(this, localField, storeRecord)\n }\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, foreignKey, foreignKeyDescriptor)\n } else if (type === hasManyType) {\n const localKeys = def.localKeys\n const foreignKeys = def.foreignKeys\n\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n\n descriptor = {\n get () {\n let current = getter.call(this)\n if (!current) {\n this._set(path, [])\n }\n return getter.call(this)\n },\n // e.g. post.comments = someComments\n // or user.groups = someGroups\n // or group.users = someUsers\n set (records) {\n if (records && !utils.isArray(records)) {\n records = [records]\n }\n const id = utils.get(this, idAttribute)\n const relatedIdAttribute = def.getRelation().idAttribute\n const inverseDef = def.getInverse(mapper)\n const inverseLocalField = inverseDef.localField\n const current = this._get(path) || []\n const toLink = []\n const toLinkIds = {}\n\n if (records) {\n records.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n const currentParent = utils.get(record, inverseLocalField)\n if (currentParent && currentParent !== this) {\n const currentChildrenOfParent = utils.get(currentParent, localField)\n // e.g. somePost.comments.remove(comment)\n if (relatedId === undefined) {\n utils.remove(currentChildrenOfParent, (child) => child === record)\n } else {\n utils.remove(currentChildrenOfParent, (child) => child === record || relatedId === utils.get(child, relatedIdAttribute))\n }\n }\n if (relatedId !== undefined) {\n if (this._get('$')) {\n // Prefer store record\n record = self.get(relation, relatedId) || record\n }\n // e.g. toLinkIds[comment.id] = comment\n toLinkIds[relatedId] = record\n }\n toLink.push(record)\n })\n }\n\n // e.g. post.comments = someComments\n if (foreignKey) {\n current.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(record) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update (unset) inverse relation\n if (records) {\n // e.g. comment.post_id = undefined\n safeSetProp(record, foreignKey, undefined)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n }\n // e.g. comment.post = undefined\n safeSetLink(record, inverseLocalField, undefined)\n }\n })\n toLink.forEach((record) => {\n // Update (set) inverse relation\n // e.g. comment.post_id = post.id\n safeSetProp(record, foreignKey, id)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n // e.g. comment.post = post\n safeSetLink(record, inverseLocalField, this)\n })\n } else if (localKeys) {\n // Update locals\n // e.g. group.users = someUsers\n // Update (set) inverse relation\n const ids = toLink.map((child) => utils.get(child, relatedIdAttribute)).filter((id) => id !== undefined)\n // e.g. group.user_ids = [1,2,3,...]\n utils.set(this, localKeys, ids)\n // Update (unset) inverse relation\n if (inverseDef.foreignKeys) {\n current.forEach((child) => {\n const relatedId = utils.get(child, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(child) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update inverse relation\n // safeSetLink(child, inverseLocalField, undefined)\n const parents = utils.get(child, inverseLocalField) || []\n // e.g. someUser.groups.remove(group)\n if (id === undefined) {\n utils.remove(parents, (parent) => parent === this)\n } else {\n utils.remove(parents, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n }\n })\n toLink.forEach((child) => {\n // Update (set) inverse relation\n const parents = utils.get(child, inverseLocalField)\n // e.g. someUser.groups.push(group)\n if (id === undefined) {\n utils.noDupeAdd(parents, this, (parent) => parent === this)\n } else {\n utils.noDupeAdd(parents, this, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n })\n }\n } else if (foreignKeys) {\n // e.g. user.groups = someGroups\n // Update (unset) inverse relation\n current.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n // e.g. someGroup.user_ids.remove(user.id)\n utils.remove(ids, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n // e.g. someGroup.users.remove(user)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n // Update (set) inverse relation\n toLink.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n utils.noDupeAdd(ids, id, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n }\n\n this._set(path, toLink)\n return toLink\n }\n }\n } else if (type === hasOneType) {\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n descriptor = {\n get: getter,\n // e.g. user.profile = someProfile\n set (record) {\n const current = this._get(path)\n if (record === current) {\n return current\n }\n const inverseLocalField = def.getInverse(mapper).localField\n // Update (unset) inverse relation\n if (current) {\n safeSetProp(current, foreignKey, undefined)\n self.getCollection(relation).updateIndex(current, updateOpts)\n safeSetLink(current, inverseLocalField, undefined)\n }\n if (record) {\n const relatedId = utils.get(record, def.getRelation().idAttribute)\n // Prefer store record\n if (relatedId !== undefined) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n safeSetLink(this, localField, record)\n\n // Update (set) inverse relation\n safeSetProp(record, foreignKey, utils.get(this, idAttribute))\n self.getCollection(relation).updateIndex(record, updateOpts)\n safeSetLink(record, inverseLocalField, this)\n } else {\n // Unset locals\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n }\n\n if (descriptor) {\n descriptor.enumerable = def.enumerable === undefined ? false : def.enumerable\n if (def.get) {\n let origGet = descriptor.get\n descriptor.get = function () {\n return def.get(def, this, (...args) => origGet.apply(this, args))\n }\n }\n if (def.set) {\n let origSet = descriptor.set\n descriptor.set = function (related) {\n return def.set(def, this, related, (value) => origSet.call(this, value === undefined ? related : value))\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, localField, descriptor)\n }\n })\n\n return mapper\n },\n\n destroy (name, id, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroy.call(this, name, id, opts).then((result) => {\n let record\n if (opts.raw) {\n record = result.data\n } else {\n record = result\n }\n\n if (record && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n utils.set(record, def.localField, undefined)\n })\n }\n return result\n })\n },\n\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n let records\n if (opts.raw) {\n records = result.data\n } else {\n records = result\n }\n\n if (records && records.length && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n records.forEach((record) => {\n utils.set(record, def.localField, undefined)\n })\n })\n }\n return result\n })\n }\n}\n\nexport default SimpleStore.extend(props)\n\n/**\n * Create a subclass of this DataStore:\n * @example DataStore.extend\n * // Normally you would do: import {DataStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {DataStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomDataStoreClass extends DataStore {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customDataStore = new CustomDataStoreClass()\n * console.log(customDataStore.foo())\n * console.log(CustomDataStoreClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherDataStoreClass = DataStore.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherDataStore = new OtherDataStoreClass()\n * console.log(otherDataStore.foo())\n * console.log(OtherDataStoreClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherDataStoreClass () {\n * DataStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * DataStore.extend({\n * constructor: AnotherDataStoreClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherDataStore = new AnotherDataStoreClass()\n * console.log(anotherDataStore.created_at)\n * console.log(anotherDataStore.foo())\n * console.log(AnotherDataStoreClass.beep())\n *\n * @method DataStore.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this DataStore class.\n * @since 3.0.0\n */\n","/**\n * Registered as `js-data` in NPM and Bower.\n *\n * Also available from CDN.JS and JSDelivr.\n *\n * @module js-data\n *\n * @example Install from NPM\n * npm i --save js-data@beta\n * @example Install from Bower\n * bower i --save js-data@3.0.0-beta.1\n * @example Install from CDN.JS\n * \n * @example Install from JSDelivr\n * \n * @example Load into your app via script tag\n * \n * \n * @example Load into your app via CommonJS\n * var JSData = require('js-data');\n * @example Load into your app via ES2015 Modules\n * import * as JSData from 'js-data';\n * @example Load into your app via AMD\n * define('myApp', ['js-data'], function (JSData) { ... })\n */\n\n/**\n * JSData's utility methods.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('foo')) // true\n *\n * @name module:js-data.utils\n * @property {Function} Promise See {@link utils.Promise}.\n * @see utils\n * @since 3.0.0\n * @type {Object}\n */\nimport utils from './utils'\n\n/**\n * JSData's {@link Collection} class.\n *\n * @example\n * import {Collection} from 'js-data'\n * const collection = new Collection()\n *\n * @name module:js-data.Collection\n * @see Collection\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#collection\",\"Components of JSData: Collection\"]\n * @type {Constructor}\n */\nimport Collection from './Collection'\n\n/**\n * JSData's {@link Component} class. Most components in JSData extend this\n * class.\n *\n * @example\n * import {Component} from 'js-data'\n * // Make a custom component.\n * const MyComponent = Component.extend({\n * myMethod (someArg) { ... }\n * })\n *\n * @name module:js-data.Component\n * @see Component\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Component from './Component'\n\n/**\n * JSData's {@link Container} class. Defines and manages {@link Mapper}s. Used\n * in Node.js and in the browser, though in the browser you may want to use\n * {@link DataStore} instead.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n *\n * @name module:js-data.Container\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#container\",\"Components of JSData: Container\"]\n * @type {Constructor}\n */\nimport {Container} from './Container'\n\n/**\n * JSData's {@link DataStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import {DataStore} from 'js-data'\n * const store = new DataStore()\n *\n * @name module:js-data.DataStore\n * @see DataStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @type {Constructor}\n */\nimport DataStore from './DataStore'\n\n/**\n * JSData's {@link Index} class, based on [mindex]{@link https://github.com/internalfx/mindex}.\n *\n * @name module:js-data.Index\n * @see Index\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Index from '../lib/mindex/index'\n\n/**\n * JSData's {@link LinkedCollection} class. Used by the {@link DataStore}\n * component. If you need to create a collection manually, you should probably\n * use the {@link Collection} class.\n *\n * @name module:js-data.LinkedCollection\n * @see DataStore\n * @see LinkedCollection\n * @since 3.0.0\n * @type {Constructor}\n */\nimport LinkedCollection from './LinkedCollection'\n\n/**\n * JSData's {@link Mapper} class. The core of the ORM.\n *\n * @example Recommended use\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n *\n * @example Create Mapper manually\n * import {Mapper} from 'js-data'\n * const UserMapper = new Mapper({ name: 'user' })\n *\n * @name module:js-data.Mapper\n * @see Container\n * @see Mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @type {Constructor}\n */\nimport Mapper from './Mapper'\n\n/**\n * JSData's {@link Query} class. Used by the {@link Collection} component.\n *\n * @name module:js-data.Query\n * @see Query\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Query from './Query'\n\n/**\n * JSData's {@link Record} class.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n *\n * @name module:js-data.Record\n * @see Record\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#record\",\"Components of JSData: Record\"]\n * @type {Constructor}\n */\nimport Record from './Record'\n\n/**\n * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04.\n *\n * @example\n * import {Container, Schema} from 'js-data'\n * const userSchema = new Schema({\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * })\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: userSchema\n * })\n *\n * @name module:js-data.Schema\n * @see Schema\n * @see http://json-schema.org/\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#schema\",\"Components of JSData: schema\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/schemas\",\"JSData's Schema Syntax\"]\n * @type {Constructor}\n */\nimport Schema from './Schema'\n\n/**\n * JSData's {@link Settable} class.\n *\n * @example\n * import {Settable} from 'js-data'\n * const obj = new Settable()\n * obj.set('secret', 'value')\n * console.log(JSON.stringify(obj)) // {}\n *\n * @name module:js-data.Settable\n * @see Settable\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Settable from './Settable'\n\n/**\n * JSData's {@link SimpleStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * const store = new SimpleStore()\n *\n * @name module:js-data.SimpleStore\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @type {Constructor}\n */\nimport SimpleStore from './SimpleStore'\n\n/**\n * Describes the version of this `JSData` object.\n *\n * @example\n * console.log(JSData.version.full) // \"3.0.0-beta.1\"\n *\n * @name version\n * @memberof module:js-data\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n * @since 2.0.0\n * @type {Object}\n */\nexport const version = '<%= version %>'\n\nexport * from './decorators'\n\nexport {\n Collection,\n Component,\n Container,\n DataStore,\n Index,\n LinkedCollection,\n Mapper,\n Query,\n Record,\n Schema,\n Settable,\n SimpleStore,\n utils\n}\n"],"names":["DOMAIN","INFINITY","MAX_INTEGER","BOOL_TAG","DATE_TAG","FUNC_TAG","NUMBER_TAG","OBJECT_TAG","REGEXP_TAG","STRING_TAG","objToString","Object","prototype","toString","PATH","ERRORS","arguments","toInteger","value","sign","remainder","toStr","call","isPlainObject","constructor","mkdirP","object","path","parts","split","forEach","key","utils","Promise","dest","src","forOwn","undefined","isFunction","indexOf","opts","def","fn","thisArg","relationName","relation","containedName","index","with","_getIndex","localField","withAll","optsCopy","fillIn","getRelation","slice","_activeWith","splice","i","length","substr","list","_relation","isObject","target","props","map","keys","propName","descriptor","getOwnPropertyDescriptor","enumerable","defineProperties","newObject","oldObject","diff","diffObjects","diffCount","added","removed","changed","instance","ctor","err","name","from","to","stackFrom","stackTo","blacklist","plain","isArray","copy","isDate","Date","getTime","isRegExp","RegExp","source","match","lastIndex","create","getPrototypeOf","push","result","hasOwnProperty","isBlacklisted","existing","deepFillIn","deepMixIn","equalsFn","ignore","deepEqual","newKeys","filter","oldKeys","oldValue","newValue","a","b","domain","code","prefix","message","apply","Array","Error","getter","setter","_events","events","args","type","shift","listeners","f","c","all","unshift","func","classProps","superClass","subClass","classCallCheck","obj","setPrototypeOf","strictEs6Class","__proto__","defineProperty","addHiddenPropsToTarget","array","record","mapper","relationList","_forRelation","len","json","isString","JSON","parse","prop","last","pop","isCtor","__super__","array1","array2","item","matches","test","isNumber","log","level","debug","toUpperCase","console","findIndex","_props","reduce","reject","resolve","_path","set","exec","_equal","stringify","safeSetProp","field","_set","safeSetLink","Settable","get","unset","extend","Component","writable","logify","eventify","_listeners","INDEX_ERR","reserved","escapeRegExp","percentRegExp","underscoreRegExp","escape","pattern","replace","Query","collection","data","where","fields","ops","predicates","clause","expr","op","groups","_where","prev","parser","_applyWhereFromArray","_applyWhereFromObject","group","isOr","keep","first","charAt","evaluate","_testArrayGroup","_testObjectGroup","leftKeys","rightKeys","getIndex","between","orderBy","cA","cB","temp","compare","predicate","like","query","getData","sort","skip","offset","limit","forEachFn","keyList","concat","getAll","flags","num","Math","min","mapFn","funcName","intersection","belongsToType","hasManyType","hasOneType","Relation","relatedMapper","options","TYPE_NAME","validateOptions","canAutoAddLinks","add","relatedCollection","datastore","getCollection","related","DOMAIN_ERR","foreignKey","localKey","relationFields","idAttribute","relatedRecord","_setForeignKey","relatedRecords","relatedData","inverse","findInverseRelation","isInversedTo","records","getLocalField","linkRecord","isEmptyLinks","canFindLinkFor","findExistingLinksFor","setLocalField","relatedId","unsaved","setForeignKey","id","relationData","is","createRecord","createLinked","then","BelongsToRelation","HasManyRelation","localKeys","foreignKeys","hasForeignKeys","recordId","ids","findExistingLinksByForeignKey","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","HasOneRelation","RelationType","belongsTo","assignTo","hasMany","hasOne","superMethod","store","bind","creatingPath","noValidatePath","keepChangeHistoryPath","previousPath","Record","noValidate","keepChangeHistory","validateOnSet","toJSON","plainCopy","_get","_mapper","quickHasChanges","areDifferent","validate","currentParent","inverseDef","children","remove","child","noDupeAdd","relations","_","adapter","getAdapterName","dbg","tasks","task","forEachRelation","raw","load","isSorN","previous","preserve","commit","postProcess","changesOnly","changes","silent","hashCode","insertAt","removeAt","binarySearch","lo","hi","compared","mid","Index","fieldList","fieldGetter","isIndex","values","pos","found","dataLocation","newIndex","results","order","cb","visitAll","_between","leftKey","rightKey","leftInclusive","rightInclusive","currKey","peek","isUnique","removeRecord","j","insertRecord","COLLECTION_DEFAULTS","Collection","queryClass","emitRecordEvents","emit","beforeAdd","singular","onConflict","existingNoValidate","commitOnMerge","updateIndexes","indexes","on","_onRecordEvent","afterAdd","run","instances","removeAll","Ctor","initialValue","idOrRecord","beforeRemove","off","afterRemove","queryOrRecords","beforeRemoveAll","afterRemoveAll","mapCall","updateRecord","types","isBoolean","isInteger","isNull","segmentToString","segment","str","makePath","segments","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","schema","max","minLengthCommon","validationKeywords","allErrors","allOf","_schema","validated","anyOf","possibleValues","join","items","checkingTuple","maximum","exclusiveMaximum","maxProperties","minimum","exclusiveMinimum","minProperties","multipleOf","not","oneOf","additionalProperties","properties","patternProperties","toValidate","omit","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","changingPath","changedPath","changeHistoryPath","eventIdPath","silentPath","validationFailureMsg","numeric","Schema","definition","_definition","extends","validationKeyword","unsetter","track","makeDescriptor","hasSet","orig","applyDefaults","keyPath","originalGet","_unset","error","current","changing","setTimeout","changeRecord","timestamp","changeHistory","originalSet","pick","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","LIFECYCLE_METHODS","MAPPER_DEFAULTS","Mapper","recordClass","methods","isPrototypeOf","applySchema","_data","wrap","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","_commitChanges","_end","recordOrRecords","newValues","isRequiresParentId","createParentRecord","context","originalProps","isRequiresChildId","createChildRecord","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","ensureLinkedDataHasProperType","RecordCtor","method","config","lifecycleMethods","upper","before","after","defaults","_value","beforeAssign","adapterArgs","getAdapter","_result","getAdapters","defaultAdapter","_adapters","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","conversionOptions","pass","_opts","_record","some","_name","getMapperByName","getMapper","proxiedMapperMethods","Container","mapperDefaults","mapperClass","original","_mappers","_onMapperEvent","defineRelations","warn","defineMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","_completedQueries","SIMPLESTORE_DEFAULTS","SimpleStore","collectionClass","_collections","_pendingQueries","addToCache","hash","fromJson","self","collectionOpts","indexed","createIndex","_added","_onCollectionEvent","destroy","destroyAll","hashQuery","pendingQuery","usePendingFind","cachedFind","force","promise","find","cacheFind","usePendingFindAll","cachedFindAll","findAll","cacheFindAll","toJson","removeRelated","getForeignKey","update","updateAll","updateMany","LinkedCollection","event","addLinkedRecords","_addMeta","_clearMeta","removeLinkedRecords","DATASTORE_DEFAULTS","DataStore","updateOpts","getInverse","removeInverseRelation","relatedIdAttribute","updateIndex","setupInverseRelation","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","_key","origGet","origSet","unlinkOnDestroy","version"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;AAWA,IAAMA,SAAS,OAAf;;AAEA,IAAMC,WAAW,IAAI,CAArB;AACA,IAAMC,cAAc,uBAApB;AACA,IAAMC,WAAW,kBAAjB;AACA,IAAMC,WAAW,eAAjB;AACA,IAAMC,WAAW,mBAAjB;AACA,IAAMC,aAAa,iBAAnB;AACA,IAAMC,aAAa,iBAAnB;AACA,IAAMC,aAAa,iBAAnB;AACA,IAAMC,aAAa,iBAAnB;AACA,IAAMC,cAAcC,OAAOC,SAAP,CAAiBC,QAArC;AACA,IAAMC,OAAO,cAAb;;AAEA,IAAMC,SAAS;OAAA,eACJ;0BAAsBC,UAAU,CAAV,CAApB,kBAA4CA,UAAU,CAAV,IAAeA,UAAU,CAAV,CAAf,WAAqCA,UAAU,CAAV,CAArC,CAA5C;GADE;OAAA,eAEJ;WAAYA,UAAU,CAAV,CAAV;;CAFb;;AAKA,IAAMC,YAAY,SAAZA,SAAY,CAAUC,KAAV,EAAiB;MAC7B,CAACA,KAAL,EAAY;WACH,CAAP;;;UAGM,CAACA,KAAT;MACIA,UAAUjB,QAAV,IAAsBiB,UAAU,CAACjB,QAArC,EAA+C;QACvCkB,OAAQD,QAAQ,CAAR,GAAY,CAAC,CAAb,GAAiB,CAA/B;WACOC,OAAOjB,WAAd;;MAEIkB,YAAYF,QAAQ,CAA1B;SACOA,UAAUA,KAAV,GAAmBE,YAAYF,QAAQE,SAApB,GAAgCF,KAAnD,GAA4D,CAAnE,CAXiC;CAAnC;;AAcA,IAAMG,QAAQ,SAARA,KAAQ,CAAUH,KAAV,EAAiB;SACtBR,YAAYY,IAAZ,CAAiBJ,KAAjB,CAAP;CADF;;AAIA,IAAMK,gBAAgB,SAAhBA,aAAgB,CAAUL,KAAV,EAAiB;SAC7B,CAAC,CAACA,KAAF,IAAW,QAAOA,KAAP,yCAAOA,KAAP,OAAiB,QAA5B,IAAwCA,MAAMM,WAAN,KAAsBb,MAAtE;CADF;;AAIA,IAAMc,SAAS,SAATA,MAAS,CAAUC,MAAV,EAAkBC,IAAlB,EAAwB;MACjC,CAACA,IAAL,EAAW;WACFD,MAAP;;MAEIE,QAAQD,KAAKE,KAAL,CAAW,GAAX,CAAd;QACMC,OAAN,CAAc,UAAUC,GAAV,EAAe;QACvB,CAACL,OAAOK,GAAP,CAAL,EAAkB;aACTA,GAAP,IAAc,EAAd;;aAEOL,OAAOK,GAAP,CAAT;GAJF;SAMOL,MAAP;CAXF;;AAcA,IAAMM,QAAQ;;;;;;;;;;;;;;WAcHC,OAdG;;;;;;;;;;;;;;;;GAAA,aA8BTC,IA9BS,EA8BHC,GA9BG,EA8BE;UACNC,MAAN,CAAaD,GAAb,EAAkB,UAAUjB,KAAV,EAAiBa,GAAjB,EAAsB;UAClCA,OAAOG,KAAKH,GAAL,MAAcM,SAArB,IAAkC,CAACL,MAAMM,UAAN,CAAiBpB,KAAjB,CAAnC,IAA8Da,IAAIQ,OAAJ,CAAY,GAAZ,MAAqB,CAAvF,EAA0F;aACnFR,GAAL,IAAYb,KAAZ;;KAFJ;GA/BU;;;;;;;;;;;;;;cAAA,wBAiDEsB,IAjDF,EAiDQC,GAjDR,EAiDaC,EAjDb,EAiDiBC,OAjDjB,EAiD0B;QAC9BC,eAAeH,IAAII,QAAzB;QACIC,gBAAgB,IAApB;QACIC,cAAJ;aACSP,OAAO,EAAhB;SACKQ,IAAL,KAAcR,KAAKQ,IAAL,GAAY,EAA1B;;QAEI,CAACD,QAAQf,MAAMiB,SAAN,CAAgBT,KAAKQ,IAArB,EAA2BJ,YAA3B,CAAT,KAAsD,CAA1D,EAA6D;sBAC3CA,YAAhB;KADF,MAEO,IAAI,CAACG,QAAQf,MAAMiB,SAAN,CAAgBT,KAAKQ,IAArB,EAA2BP,IAAIS,UAA/B,CAAT,KAAwD,CAA5D,EAA+D;sBACpDT,IAAIS,UAApB;;;QAGEV,KAAKW,OAAT,EAAkB;SACb7B,IAAH,CAAQqB,OAAR,EAAiBF,GAAjB,EAAsB,EAAtB;;KADF,MAGO,IAAI,CAACK,aAAL,EAAoB;;;QAGvBM,WAAW,EAAf;UACMC,MAAN,CAAaD,QAAb,EAAuBX,IAAIa,WAAJ,EAAvB;UACMD,MAAN,CAAaD,QAAb,EAAuBZ,IAAvB;aACSQ,IAAT,GAAgBR,KAAKQ,IAAL,CAAUO,KAAV,EAAhB;aACSC,WAAT,GAAuBJ,SAASJ,IAAT,CAAcS,MAAd,CAAqBV,KAArB,EAA4B,CAA5B,EAA+B,CAA/B,CAAvB;aACSC,IAAT,CAAclB,OAAd,CAAsB,UAAUe,QAAV,EAAoBa,CAApB,EAAuB;UACvCb,YAAYA,SAASN,OAAT,CAAiBO,aAAjB,MAAoC,CAAhD,IAAqDD,SAASc,MAAT,IAAmBb,cAAca,MAAtF,IAAgGd,SAASC,cAAca,MAAvB,MAAmC,GAAvI,EAA4I;iBACjIX,IAAT,CAAcU,CAAd,IAAmBb,SAASe,MAAT,CAAgBd,cAAca,MAAd,GAAuB,CAAvC,CAAnB;OADF,MAEO;iBACIX,IAAT,CAAcU,CAAd,IAAmB,EAAnB;;KAJJ;OAOGpC,IAAH,CAAQqB,OAAR,EAAiBF,GAAjB,EAAsBW,QAAtB;GAhFU;;;;;;;;;;;;WAAA,qBA4FDS,IA5FC,EA4FKhB,QA5FL,EA4Fe;QACrBE,QAAQ,CAAC,CAAb;SACKjB,OAAL,CAAa,UAAUgC,SAAV,EAAqBJ,CAArB,EAAwB;UAC/BI,cAAcjB,QAAlB,EAA4B;gBAClBa,CAAR;eACO,KAAP;OAFF,MAGO,IAAI1B,MAAM+B,QAAN,CAAeD,SAAf,CAAJ,EAA+B;YAChCA,UAAUjB,QAAV,KAAuBA,QAA3B,EAAqC;kBAC3Ba,CAAR;iBACO,KAAP;;;KAPN;WAWOX,KAAP;GAzGU;;;;;;;;;;;;;;;;;;;;;;;wBAAA,kCAgIYiB,MAhIZ,EAgIoBC,KAhIpB,EAgI2B;QAC/BC,MAAM,EAAZ;WACOC,IAAP,CAAYF,KAAZ,EAAmBnC,OAAnB,CAA2B,UAAUsC,QAAV,EAAoB;UACvCC,aAAa1D,OAAO2D,wBAAP,CAAgCL,KAAhC,EAAuCG,QAAvC,CAAnB;;iBAEWG,UAAX,GAAwB,KAAxB;UACIH,QAAJ,IAAgBC,UAAhB;KAJF;WAMOG,gBAAP,CAAwBR,MAAxB,EAAgCE,GAAhC;GAxIU;;;;;;;;;;;;;;;;;;;;;;cAAA,wBA8JEO,SA9JF,EA8JaC,SA9Jb,EA8JwBlC,IA9JxB,EA8J8B;aAC/BA,OAAO,EAAhB;QACMmC,OAAO3C,MAAM4C,WAAN,CAAkBH,SAAlB,EAA6BC,SAA7B,EAAwClC,IAAxC,CAAb;QACMqC,YAAYlE,OAAOwD,IAAP,CAAYQ,KAAKG,KAAjB,EAAwBnB,MAAxB,GAClBhD,OAAOwD,IAAP,CAAYQ,KAAKI,OAAjB,EAA0BpB,MADR,GAElBhD,OAAOwD,IAAP,CAAYQ,KAAKK,OAAjB,EAA0BrB,MAF1B;WAGOkB,YAAY,CAAnB;GApKU;;;;;;;;;;;;;;;;;;;;;;;gBAAA,6BA2LII,QA3LJ,EA2LcC,IA3Ld,EA2LoB;QAC1B,EAAED,oBAAoBC,IAAtB,CAAJ,EAAiC;YACzBlD,MAAMmD,GAAN,MAAaD,KAAKE,IAAlB,EAA0B,GAA1B,EAA+B,mCAA/B,CAAN;;GA7LQ;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBAsNNC,IAtNM,EAsNAC,EAtNA,EAsNIC,SAtNJ,EAsNeC,OAtNf,EAsNwBC,SAtNxB,EAsNmCC,KAtNnC,EAsN0C;QAChD,CAACJ,EAAL,EAAS;WACFD,IAAL;UACIA,IAAJ,EAAU;YACJrD,MAAM2D,OAAN,CAAcN,IAAd,CAAJ,EAAyB;eAClBrD,MAAM4D,IAAN,CAAWP,IAAX,EAAiB,EAAjB,EAAqBE,SAArB,EAAgCC,OAAhC,EAAyCC,SAAzC,EAAoDC,KAApD,CAAL;SADF,MAEO,IAAI1D,MAAM6D,MAAN,CAAaR,IAAb,CAAJ,EAAwB;eACxB,IAAIS,IAAJ,CAAST,KAAKU,OAAL,EAAT,CAAL;SADK,MAEA,IAAI/D,MAAMgE,QAAN,CAAeX,IAAf,CAAJ,EAA0B;eAC1B,IAAIY,MAAJ,CAAWZ,KAAKa,MAAhB,EAAwBb,KAAKxE,QAAL,GAAgBsF,KAAhB,CAAsB,QAAtB,EAAgC,CAAhC,CAAxB,CAAL;aACGC,SAAH,GAAef,KAAKe,SAApB;SAFK,MAGA,IAAIpE,MAAM+B,QAAN,CAAesB,IAAf,CAAJ,EAA0B;cAC3BK,KAAJ,EAAW;iBACJ1D,MAAM4D,IAAN,CAAWP,IAAX,EAAiB,EAAjB,EAAqBE,SAArB,EAAgCC,OAAhC,EAAyCC,SAAzC,EAAoDC,KAApD,CAAL;WADF,MAEO;iBACA1D,MAAM4D,IAAN,CAAWP,IAAX,EAAiB1E,OAAO0F,MAAP,CAAc1F,OAAO2F,cAAP,CAAsBjB,IAAtB,CAAd,CAAjB,EAA6DE,SAA7D,EAAwEC,OAAxE,EAAiFC,SAAjF,EAA4FC,KAA5F,CAAL;;;;KAdR,MAkBO;UACDL,SAASC,EAAb,EAAiB;cACTtD,MAAMmD,GAAN,CAAanF,MAAb,YAA4B,GAA5B,EAAiC,oDAAjC,CAAN;;;kBAGUuF,aAAa,EAAzB;gBACUC,WAAW,EAArB;;UAEIxD,MAAM+B,QAAN,CAAesB,IAAf,CAAJ,EAA0B;YACpBtC,QAAQwC,UAAUhD,OAAV,CAAkB8C,IAAlB,CAAZ;YACItC,UAAU,CAAC,CAAf,EAAkB;iBACTyC,QAAQzC,KAAR,CAAP;;;kBAGQwD,IAAV,CAAelB,IAAf;gBACQkB,IAAR,CAAajB,EAAb;;;UAGEkB,eAAJ;UACIxE,MAAM2D,OAAN,CAAcN,IAAd,CAAJ,EAAyB;YACnB3B,UAAJ;WACGC,MAAH,GAAY,CAAZ;aACKD,IAAI,CAAT,EAAYA,IAAI2B,KAAK1B,MAArB,EAA6BD,GAA7B,EAAkC;mBACvB1B,MAAM4D,IAAN,CAAWP,KAAK3B,CAAL,CAAX,EAAoB,IAApB,EAA0B6B,SAA1B,EAAqCC,OAArC,EAA8CC,SAA9C,EAAyDC,KAAzD,CAAT;cACI1D,MAAM+B,QAAN,CAAesB,KAAK3B,CAAL,CAAf,CAAJ,EAA6B;sBACjB6C,IAAV,CAAelB,KAAK3B,CAAL,CAAf;oBACQ6C,IAAR,CAAaC,MAAb;;aAECD,IAAH,CAAQC,MAAR;;OATJ,MAWO;YACDxE,MAAM2D,OAAN,CAAcL,EAAd,CAAJ,EAAuB;aAClB3B,MAAH,GAAY,CAAZ;SADF,MAEO;gBACCvB,MAAN,CAAakD,EAAb,EAAiB,UAAUpE,KAAV,EAAiBa,GAAjB,EAAsB;mBAC9BuD,GAAGvD,GAAH,CAAP;WADF;;aAIG,IAAIA,GAAT,IAAgBsD,IAAhB,EAAsB;cAChBA,KAAKoB,cAAL,CAAoB1E,GAApB,CAAJ,EAA8B;gBACxBC,MAAM0E,aAAN,CAAoB3E,GAApB,EAAyB0D,SAAzB,CAAJ,EAAyC;;;qBAGhCzD,MAAM4D,IAAN,CAAWP,KAAKtD,GAAL,CAAX,EAAsB,IAAtB,EAA4BwD,SAA5B,EAAuCC,OAAvC,EAAgDC,SAAhD,EAA2DC,KAA3D,CAAT;gBACI1D,MAAM+B,QAAN,CAAesB,KAAKtD,GAAL,CAAf,CAAJ,EAA+B;wBACnBwE,IAAV,CAAelB,KAAKtD,GAAL,CAAf;sBACQwE,IAAR,CAAaC,MAAb;;eAECzE,GAAH,IAAUyE,MAAV;;;;;WAKDlB,EAAP;GA9RU;;;;;;;;;;;;;;;;;;;;;YAAA,sBAmTApD,IAnTA,EAmTMgE,MAnTN,EAmTc;QACpBA,MAAJ,EAAY;YACJ9D,MAAN,CAAa8D,MAAb,EAAqB,UAAUhF,KAAV,EAAiBa,GAAjB,EAAsB;YACnC4E,WAAWzE,KAAKH,GAAL,CAAjB;YACIR,cAAcL,KAAd,KAAwBK,cAAcoF,QAAd,CAA5B,EAAqD;gBAC7CC,UAAN,CAAiBD,QAAjB,EAA2BzF,KAA3B;SADF,MAEO,IAAI,CAACgB,KAAKuE,cAAL,CAAoB1E,GAApB,CAAD,IAA6BG,KAAKH,GAAL,MAAcM,SAA/C,EAA0D;eAC1DN,GAAL,IAAYb,KAAZ;;OALJ;;WASKgB,IAAP;GA9TU;;;;;;;;;;;;;;;;;;;;WAAA,qBAkVDA,IAlVC,EAkVKgE,MAlVL,EAkVa;QACnBA,MAAJ,EAAY;WACL,IAAInE,GAAT,IAAgBmE,MAAhB,EAAwB;YAChBhF,QAAQgF,OAAOnE,GAAP,CAAd;YACM4E,WAAWzE,KAAKH,GAAL,CAAjB;YACIR,cAAcL,KAAd,KAAwBK,cAAcoF,QAAd,CAA5B,EAAqD;gBAC7CE,SAAN,CAAgBF,QAAhB,EAA0BzF,KAA1B;SADF,MAEO;eACAa,GAAL,IAAYb,KAAZ;;;;WAICgB,IAAP;GA9VU;;;;;;;;;;;;;;;;;;;;;;;;;aAAA,uBAuXCuC,SAvXD,EAuXYC,SAvXZ,EAuXuBlC,IAvXvB,EAuX6B;aAC9BA,OAAO,EAAhB;QACIsE,WAAWtE,KAAKsE,QAApB;QACIrB,YAAYjD,KAAKuE,MAArB;QACMpC,OAAO;aACJ,EADI;eAEF,EAFE;eAGF;KAHX;QAKI,CAAC3C,MAAMM,UAAN,CAAiBwE,QAAjB,CAAL,EAAiC;iBACpB9E,MAAMgF,SAAjB;;;QAGIC,UAAUtG,OAAOwD,IAAP,CAAYM,SAAZ,EAAuByC,MAAvB,CAA8B,UAAUnF,GAAV,EAAe;aACpD,CAACC,MAAM0E,aAAN,CAAoB3E,GAApB,EAAyB0D,SAAzB,CAAR;KADc,CAAhB;QAGM0B,UAAUxG,OAAOwD,IAAP,CAAYO,SAAZ,EAAuBwC,MAAvB,CAA8B,UAAUnF,GAAV,EAAe;aACpD,CAACC,MAAM0E,aAAN,CAAoB3E,GAApB,EAAyB0D,SAAzB,CAAR;KADc,CAAhB;;;YAKQ3D,OAAR,CAAgB,UAAUC,GAAV,EAAe;UACvBqF,WAAW1C,UAAU3C,GAAV,CAAjB;UACMsF,WAAW5C,UAAU1C,GAAV,CAAjB;UACI+E,SAASM,QAAT,EAAmBC,QAAnB,CAAJ,EAAkC;;;UAG9BD,aAAa/E,SAAjB,EAA4B;aACrByC,KAAL,CAAW/C,GAAX,IAAkBsF,QAAlB;OADF,MAEO;aACArC,OAAL,CAAajD,GAAb,IAAoBsF,QAApB;;KATJ;;;YAcQvF,OAAR,CAAgB,UAAUC,GAAV,EAAe;UACvBqF,WAAW1C,UAAU3C,GAAV,CAAjB;UACMsF,WAAW5C,UAAU1C,GAAV,CAAjB;UACIsF,aAAahF,SAAb,IAA0B+E,aAAa/E,SAA3C,EAAsD;aAC/C0C,OAAL,CAAahD,GAAb,IAAoBM,SAApB;;KAJJ;;WAQOsC,IAAP;GAlaU;;;;;;;;;;;;;;;;;;OAAA,iBAobL2C,CApbK,EAobFC,CApbE,EAobC;WACJD,KAAKC,CAAZ,CADW;GApbD;;;;;;;;;;;;;;;;;;;KAAA,eAwcPC,MAxcO,EAwcCxD,MAxcD,EAwcS;WACZ,UAAUyD,IAAV,EAAgB;UACfC,eAAaF,MAAb,SAAuBxD,MAAvB,OAAN;UACI2D,UAAU5G,OAAO0G,IAAP,EAAaG,KAAb,CAAmB,IAAnB,EAAyBC,MAAMjH,SAAN,CAAgB2C,KAAhB,CAAsBjC,IAAtB,CAA2BN,SAA3B,EAAsC,CAAtC,CAAzB,CAAd;qBACa0G,MAAb,GAAsBC,OAAtB,iDACmCF,IADnC;aAEO,IAAIK,KAAJ,CAAUH,OAAV,CAAP;KALF;GAzcU;;;;;;;;;;;;;;;;;;;;;UAAA,oBAoeF3D,MApeE,EAoeM+D,MApeN,EAoecC,MAped,EAoesB;aACvBhE,UAAU,IAAnB;QACIiE,UAAU,EAAd;QACI,CAACF,MAAD,IAAW,CAACC,MAAhB,EAAwB;eACb,kBAAY;eAASC,OAAP;OAAvB;eACS,gBAAU/G,KAAV,EAAiB;kBAAYA,KAAV;OAA5B;;WAEKsD,gBAAP,CAAwBR,MAAxB,EAAgC;YACxB;aAAA,mBACY;cACRkE,SAASH,OAAOzG,IAAP,CAAY,IAAZ,KAAqB,EAApC;;4CADQ6G,IAAM;gBAAA;;;cAERC,OAAOD,KAAKE,KAAL,EAAb;cACIC,YAAYJ,OAAOE,IAAP,KAAgB,EAAhC;cACI1E,UAAJ;eACKA,IAAI,CAAT,EAAYA,IAAI4E,UAAU3E,MAA1B,EAAkCD,GAAlC,EAAuC;sBAC3BA,CAAV,EAAa6E,CAAb,CAAeX,KAAf,CAAqBU,UAAU5E,CAAV,EAAa8E,CAAlC,EAAqCL,IAArC;;sBAEUD,OAAOO,GAAP,IAAc,EAA1B;eACKC,OAAL,CAAaN,IAAb;eACK1E,IAAI,CAAT,EAAYA,IAAI4E,UAAU3E,MAA1B,EAAkCD,GAAlC,EAAuC;sBAC3BA,CAAV,EAAa6E,CAAb,CAAeX,KAAf,CAAqBU,UAAU5E,CAAV,EAAa8E,CAAlC,EAAqCL,IAArC;;;OAbwB;WAiBzB;aAAA,iBACIC,IADJ,EACUO,IADV,EACgB;cACXT,SAASH,OAAOzG,IAAP,CAAY,IAAZ,CAAf;cACMgH,YAAYJ,OAAOE,IAAP,CAAlB;cACI,CAACE,SAAL,EAAgB;mBACPhH,IAAP,CAAY,IAAZ,EAAkB,EAAlB;WADF,MAEO,IAAIqH,IAAJ,EAAU;iBACV,IAAIjF,IAAI,CAAb,EAAgBA,IAAI4E,UAAU3E,MAA9B,EAAsCD,GAAtC,EAA2C;kBACrC4E,UAAU5E,CAAV,EAAa6E,CAAb,KAAmBI,IAAvB,EAA6B;0BACjBlF,MAAV,CAAiBC,CAAjB,EAAoB,CAApB;;;;WAHC,MAOA;sBACKD,MAAV,CAAiB,CAAjB,EAAoB6E,UAAU3E,MAA9B;;;OA/BwB;UAmC1B;aAAA,iBACKyE,IADL,EACWO,IADX,EACiBhG,OADjB,EAC0B;cACtB,CAACoF,OAAOzG,IAAP,CAAY,IAAZ,CAAL,EAAwB;mBACfA,IAAP,CAAY,IAAZ,EAAkB,EAAlB;;cAEI4G,SAASH,OAAOzG,IAAP,CAAY,IAAZ,CAAf;iBACO8G,IAAP,IAAeF,OAAOE,IAAP,KAAgB,EAA/B;iBACOA,IAAP,EAAa7B,IAAb,CAAkB;eACb5D,OADa;eAEbgG;WAFL;;;KA1CN;GA3eU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAwjBJ1E,KAxjBI,EAwjBG2E,UAxjBH,EAwjBe;QACnBC,aAAa,IAAnB;QACIC,kBAAJ;;cAEU7E,QAAQ,EAAlB;mBACe2E,aAAa,EAA5B;;QAEI3E,MAAMwC,cAAN,CAAqB,aAArB,CAAJ,EAAyC;kBAC5BxC,MAAMzC,WAAjB;aACOyC,MAAMzC,WAAb;KAFF,MAGO;kBACM,oBAAmB;cACtBuH,cAAN,CAAqB,IAArB,EAA2BD,SAA3B;;2CADsBX,IAAM;cAAA;;;mBAEjBP,KAAX,CAAiB,IAAjB,EAAuBO,IAAvB;OAFF;;;;cAOOvH,SAAT,GAAqBD,OAAO0F,MAAP,CAAcwC,cAAcA,WAAWjI,SAAvC,EAAkD;mBACxD;sBACG,IADH;oBAEC,KAFD;eAGJkI,SAHI;kBAID;;KALO,CAArB;;QASME,MAAMrI,MAAZ;;QAEIqI,IAAIC,cAAR,EAAwB;UAClBA,cAAJ,CAAmBH,SAAnB,EAA6BD,UAA7B;KADF,MAEO,IAAID,WAAWM,cAAf,EAA+B;gBAC3BC,SAAT,GAAqBN,UAArB,CADoC;KAA/B,MAEA;YACCzG,MAAN,CAAayG,UAAb,EAAyB,UAAU3H,KAAV,EAAiBa,GAAjB,EAAsB;kBACpCA,GAAT,IAAgBb,KAAhB;OADF;;QAIE,CAAC4H,UAASrC,cAAT,CAAwB,WAAxB,CAAL,EAA2C;aAClC2C,cAAP,CAAsBN,SAAtB,EAAgC,WAAhC,EAA6C;sBAC7B,IAD6B;eAEpCD;OAFT;;;UAMIQ,sBAAN,CAA6BP,UAASlI,SAAtC,EAAiDqD,KAAjD;UACMZ,MAAN,CAAayF,SAAb,EAAuBF,UAAvB;;WAEOE,SAAP;GAxmBU;;;;;;;;;;;;;;;;;;;;;QAAA,kBA6nBJ5G,IA7nBI,EA6nBEC,GA7nBF,EA6nBO;UACXC,MAAN,CAAaD,GAAb,EAAkB,UAAUjB,KAAV,EAAiBa,GAAjB,EAAsB;UAClC,CAACG,KAAKuE,cAAL,CAAoB1E,GAApB,CAAD,IAA6BG,KAAKH,GAAL,MAAcM,SAA/C,EAA0D;aACnDN,GAAL,IAAYb,KAAZ;;KAFJ;GA9nBU;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBA2pBDoI,KA3pBC,EA2pBM5G,EA3pBN,EA2pBU;QAChBK,QAAQ,CAAC,CAAb;QACI,CAACuG,KAAL,EAAY;aACHvG,KAAP;;UAEIjB,OAAN,CAAc,UAAUyH,MAAV,EAAkB7F,CAAlB,EAAqB;UAC7BhB,GAAG6G,MAAH,CAAJ,EAAgB;gBACN7F,CAAR;eACO,KAAP;;KAHJ;WAMOX,KAAP;GAtqBU;;;;;;;;;;;;;;iBAAA,2BAorBKyG,MAprBL,EAorBahH,IAprBb,EAorBmBE,EAprBnB,EAorBuBC,OAprBvB,EAorBgC;QACpC8G,eAAeD,OAAOC,YAAP,IAAuB,EAA5C;QACI,CAACA,aAAa9F,MAAlB,EAA0B;;;iBAGb7B,OAAb,CAAqB,UAAUW,GAAV,EAAe;YAC5BiH,YAAN,CAAmBlH,IAAnB,EAAyBC,GAAzB,EAA8BC,EAA9B,EAAkCC,OAAlC;KADF;GAzrBU;;;;;;;;;;;;;;;;;;;;;QAAA,kBAgtBJqG,GAhtBI,EAgtBCtG,EAhtBD,EAgtBKC,OAhtBL,EAgtBc;QAClBwB,OAAOxD,OAAOwD,IAAP,CAAY6E,GAAZ,CAAb;QACMW,MAAMxF,KAAKR,MAAjB;QACID,UAAJ;SACKA,IAAI,CAAT,EAAYA,IAAIiG,GAAhB,EAAqBjG,GAArB,EAA0B;UACpBhB,GAAGpB,IAAH,CAAQqB,OAAR,EAAiBqG,IAAI7E,KAAKT,CAAL,CAAJ,CAAjB,EAA+BS,KAAKT,CAAL,CAA/B,EAAwCsF,GAAxC,MAAiD,KAArD,EAA4D;;;;GArtBpD;;;;;;;;;;;;;;;;;;UAAA,oBA0uBFY,IA1uBE,EA0uBI;WACP5H,MAAM6H,QAAN,CAAeD,IAAf,IAAuBE,KAAKC,KAAL,CAAWH,IAAX,CAAvB,GAA0CA,IAAjD;GA3uBU;;;;;;;;;;;;;;;;;;;;SA+vBL,gBAAUlI,MAAV,EAAkBsI,IAAlB,EAAwB;QACzB,CAACA,IAAL,EAAW;;;QAGLpI,QAAQoI,KAAKnI,KAAL,CAAW,GAAX,CAAd;QACMoI,OAAOrI,MAAMsI,GAAN,EAAb;;WAEOF,OAAOpI,MAAMyG,KAAN,EAAd,EAA6B;;eAClB3G,OAAOsI,IAAP,CAAT;UACItI,UAAU,IAAd,EAAoB;;;;;;WAKfA,OAAOuI,IAAP,CAAP;GA7wBU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAA,oBA2yBFhF,QA3yBE,EA2yBQkF,MA3yBR,EA2yBgB;QACpBjF,OAAOiF,SAASlF,QAAT,GAAoBA,SAASzD,WAA1C;QACI0D,KAAKuB,cAAL,CAAoB,WAApB,CAAJ,EAAsC;aAC7BvB,KAAKkF,SAAZ;;WAEKzJ,OAAO2F,cAAP,CAAsBpB,IAAtB,KAA+BA,KAAKiE,SAA3C,CAL0B;GA3yBhB;;;;;;;;;;;;;;;;;;;;cAAA,wBAo0BEkB,MAp0BF,EAo0BUC,MAp0BV,EAo0BkB;QACxB,CAACD,MAAD,IAAW,CAACC,MAAhB,EAAwB;aACf,EAAP;;QAEI9D,SAAS,EAAf;QACI+D,aAAJ;QACI7G,UAAJ;QACMiG,MAAMU,OAAO1G,MAAnB;SACKD,IAAI,CAAT,EAAYA,IAAIiG,GAAhB,EAAqBjG,GAArB,EAA0B;aACjB2G,OAAO3G,CAAP,CAAP;UACI8C,OAAOjE,OAAP,CAAegI,IAAf,MAAyB,CAAC,CAA9B,EAAiC;;;UAG7BD,OAAO/H,OAAP,CAAegI,IAAf,MAAyB,CAAC,CAA9B,EAAiC;eACxBhE,IAAP,CAAYgE,IAAZ;;;WAGG/D,MAAP;GAr1BU;;;;;;;;;;;;;;;;;;WAu2BHqB,MAAMlC,OAv2BH;;;;;;;;;;;;;;;;;;;;eAAA,yBA23BGqE,IA33BH,EA23BSvE,SA33BT,EA23BoB;QAC1B,CAACA,SAAD,IAAc,CAACA,UAAU9B,MAA7B,EAAqC;aAC5B,KAAP;;QAEE6G,gBAAJ;SACK,IAAI9G,IAAI,CAAb,EAAgBA,IAAI+B,UAAU9B,MAA9B,EAAsCD,GAAtC,EAA2C;UACpCrC,MAAMoE,UAAU/B,CAAV,CAAN,MAAwBlD,UAAxB,IAAsCiF,UAAU/B,CAAV,EAAa+G,IAAb,CAAkBT,IAAlB,CAAvC,IAAmEvE,UAAU/B,CAAV,MAAiBsG,IAAxF,EAA8F;kBAClFA,IAAV;eACO,CAAC,CAACQ,OAAT;;;WAGG,CAAC,CAACA,OAAT;GAt4BU;;;;;;;;;;;;;;;;;;WAAA,qBAw5BDtJ,KAx5BC,EAw5BM;WACTG,MAAMH,KAAN,MAAiBf,QAAxB;GAz5BU;;;;;;;;;;;;;;;;;;QAAA,kBA26BJe,KA36BI,EA26BG;WACLA,SAAS,QAAOA,KAAP,yCAAOA,KAAP,OAAiB,QAA1B,IAAsCG,MAAMH,KAAN,MAAiBd,QAA/D;GA56BU;;;;;;;;;;;;;;;;;;YAAA,sBA87BAc,KA97BA,EA87BO;WACV,OAAOA,KAAP,KAAiB,UAAjB,IAAgCA,SAASG,MAAMH,KAAN,MAAiBb,QAAjE;GA/7BU;;;;;;;;;;;;;;;;;;;;WAAA,qBAm9BDa,KAn9BC,EAm9BM;WACTG,MAAMH,KAAN,MAAiBZ,UAAjB,IAA+BY,SAASD,UAAUC,KAAV,CAA/C,CADgB;GAn9BN;;;;;;;;;;;;;;;;;;QAAA,kBAs+BJA,KAt+BI,EAs+BG;WACNA,UAAU,IAAjB;GAv+BU;;;;;;;;;;;;;;;;;;;;UAAA,oBA2/BFA,KA3/BE,EA2/BK;QACTkH,cAAclH,KAAd,yCAAcA,KAAd,CAAN;WACOkH,SAAS,QAAT,IAAsBlH,SAASkH,SAAS,QAAlB,IAA8B/G,MAAMH,KAAN,MAAiBZ,UAA5E;GA7/BU;;;;;;;;;;;;;;;;;;UAAA,oBA+gCFY,KA/gCE,EA+gCK;WACRG,MAAMH,KAAN,MAAiBX,UAAxB;GAhhCU;;;;;;;;;;;;;;;;;;;;UAAA,oBAoiCFW,KApiCE,EAoiCK;WACRG,MAAMH,KAAN,MAAiBV,UAAxB;GAriCU;;;;;;;;;;;;;;;;;;;QAAA,kBAwjCJU,KAxjCI,EAwjCG;WACNc,MAAM6H,QAAN,CAAe3I,KAAf,KAAyBc,MAAM0I,QAAN,CAAexJ,KAAf,CAAhC;GAzjCU;;;;;;;;;;;;;;;;;;UAAA,oBA2kCFA,KA3kCE,EA2kCK;WACR,OAAOA,KAAP,KAAiB,QAAjB,IAA8BA,SAAS,QAAOA,KAAP,yCAAOA,KAAP,OAAiB,QAA1B,IAAsCG,MAAMH,KAAN,MAAiBT,UAA5F;GA5kCU;;;;;;;;;;;;;;;;;;;;aAAA,uBAgmCCS,KAhmCD,EAgmCQ;WACXA,UAAUmB,SAAjB;GAjmCU;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAwnCJ2B,MAxnCI,EAwnCI;UACRqF,sBAAN,CAA6BrF,MAA7B,EAAqC;SAAA,iBACrB;YACRhC,MAAMM,UAAN,CAAiB,KAAKqI,GAAtB,CAAJ,EAAgC;6CAD1BxC,IAC0B;gBAAA;;;eACzBwC,GAAL,cAAS,OAAT,SAAqBxC,IAArB;;OAH+B;SAAA,eAM9ByC,KAN8B,EAMd;2CAANzC,IAAM;cAAA;;;YACfyC,SAAS,CAACzC,KAAKxE,MAAnB,EAA2B;eACpB4C,IAAL,CAAUqE,KAAV;kBACQ,OAAR;;YAEEA,UAAU,OAAV,IAAqB,CAAC,KAAKC,KAA/B,EAAsC;;;YAGhCnD,SAAYkD,MAAME,WAAN,EAAZ,YAAqC,KAAK1F,IAAL,IAAa,KAAK5D,WAAL,CAAiB4D,IAAnE,OAAN;YACIpD,MAAMM,UAAN,CAAiByI,QAAQH,KAAR,CAAjB,CAAJ,EAAsC;;;+BAC5BA,KAAR,mBAAelD,MAAf,SAA0BS,IAA1B;SADF,MAEO;;;gCACGwC,GAAR,mBAAYjD,MAAZ,SAAuBS,IAAvB;;;KAlBN;GAznCU;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBAsqCDmB,KAtqCC,EAsqCMC,MAtqCN,EAsqCc7G,EAtqCd,EAsqCkB;QACxB,CAAC4G,KAAL,EAAY;;;QAGNvG,QAAQ,KAAKiI,SAAL,CAAe1B,KAAf,EAAsB5G,EAAtB,CAAd;QACIK,QAAQ,CAAZ,EAAe;YACPwD,IAAN,CAAWgD,MAAX;;GA5qCQ;;;;;;;;;;;;;;;;;;;;MAAA,gBAisCNtF,KAjsCM,EAisCCE,IAjsCD,EAisCO;QACX8G,SAAS,EAAf;UACM7I,MAAN,CAAa6B,KAAb,EAAoB,UAAU/C,KAAV,EAAiBa,GAAjB,EAAsB;UACpCoC,KAAK5B,OAAL,CAAaR,GAAb,MAAsB,CAAC,CAA3B,EAA8B;eACrBA,GAAP,IAAcb,KAAd;;KAFJ;WAKO+J,MAAP;GAxsCU;;;;;;;;;;;;;;;;;;;;MAAA,gBA4tCNhH,KA5tCM,EA4tCCE,IA5tCD,EA4tCO;WACVA,KAAK+G,MAAL,CAAY,UAAChH,GAAD,EAAMnC,GAAN,EAAc;UAC3BA,GAAJ,IAAWkC,MAAMlC,GAAN,CAAX;aACOmC,GAAP;KAFK,EAGJ,EAHI,CAAP;GA7tCU;;;;;;;;;;;;;;;;;;WAAA,qBAkvCDhD,KAlvCC,EAkvCM;WACTc,MAAM4D,IAAN,CAAW1E,KAAX,EAAkBmB,SAAlB,EAA6BA,SAA7B,EAAwCA,SAAxC,EAAmDA,SAAnD,EAA8D,IAA9D,CAAP;GAnvCU;;;;;;;;;;;;;;;;;;;;;QAAA,kBAwwCJnB,KAxwCI,EAwwCG;WACNc,MAAMC,OAAN,CAAckJ,MAAd,CAAqBjK,KAArB,CAAP;GAzwCU;;;;;;;;;;;;;;;;;QAAA,kBA0xCJoI,KA1xCI,EA0xCG5G,EA1xCH,EA0xCO;QACb,CAAC4G,KAAD,IAAU,CAACA,MAAM3F,MAArB,EAA6B;;;QAGvBZ,QAAQ,KAAKiI,SAAL,CAAe1B,KAAf,EAAsB5G,EAAtB,CAAd;QACIK,SAAS,CAAb,EAAgB;YACRU,MAAN,CAAaV,KAAb,EAAoB,CAApB,EADc;;GA/xCN;;;;;;;;;;;;;;;;;;;;SAAA,mBAqzCH7B,KArzCG,EAqzCI;WACPc,MAAMC,OAAN,CAAcmJ,OAAd,CAAsBlK,KAAtB,CAAP;GAtzCU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAg2CP,gBAAUQ,MAAV,EAAkBC,IAAlB,EAAwBT,KAAxB,EAA+B;QAC9Bc,MAAM+B,QAAN,CAAepC,IAAf,CAAJ,EAA0B;YAClBS,MAAN,CAAaT,IAAb,EAAmB,UAAUT,KAAV,EAAiBmK,KAAjB,EAAwB;cACnCC,GAAN,CAAU5J,MAAV,EAAkB2J,KAAlB,EAAyBnK,KAAzB;OADF;KADF,MAIO;UACCU,QAAQd,KAAKyK,IAAL,CAAU5J,IAAV,CAAd;UACIC,KAAJ,EAAW;eACFF,MAAP,EAAeE,MAAM,CAAN,CAAf,EAAyBA,MAAM,CAAN,CAAzB,IAAqCV,KAArC;OADF,MAEO;eACES,IAAP,IAAeT,KAAf;;;GA12CM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBAk5CDoG,CAl5CC,EAk5CEC,CAl5CF,EAk5CK;QACXD,MAAMC,CAAV,EAAa;aACJ,IAAP;;QAEEiE,SAAS,IAAb;QACIxJ,MAAM2D,OAAN,CAAc2B,CAAd,KAAoBtF,MAAM2D,OAAN,CAAc4B,CAAd,CAAxB,EAA0C;UACpCD,EAAE3D,MAAF,KAAa4D,EAAE5D,MAAnB,EAA2B;eAClB,KAAP;;WAEG,IAAID,IAAI4D,EAAE3D,MAAf,EAAuBD,GAAvB,GAA6B;YACvB,CAAC1B,MAAMgF,SAAN,CAAgBM,EAAE5D,CAAF,CAAhB,EAAsB6D,EAAE7D,CAAF,CAAtB,CAAL,EAAkC;;iBAEzB,KAAP;;;KAPN,MAUO,IAAI1B,MAAM+B,QAAN,CAAeuD,CAAf,KAAqBtF,MAAM+B,QAAN,CAAewD,CAAf,CAAzB,EAA4C;YAC3CnF,MAAN,CAAakF,CAAb,EAAgB,UAAUpG,KAAV,EAAiBa,GAAjB,EAAsB;YAChC,EAAEyJ,SAASxJ,MAAMgF,SAAN,CAAgB9F,KAAhB,EAAuBqG,EAAExF,GAAF,CAAvB,CAAX,CAAJ,EAAgD;;iBAEvC,KAAP;;OAHJ;UAMIyJ,MAAJ,EAAY;cACJpJ,MAAN,CAAamF,CAAb,EAAgB,UAAUrG,KAAV,EAAiBa,GAAjB,EAAsB;cAChC,EAAEyJ,SAASxJ,MAAMgF,SAAN,CAAgB9F,KAAhB,EAAuBoG,EAAEvF,GAAF,CAAvB,CAAX,CAAJ,EAAgD;;mBAEvC,KAAP;;SAHJ;;KARG,MAeA;aACE,KAAP;;WAEKyJ,MAAP;GAn7CU;;;;;;;;;;;;;;;;;;;UAs8CJ1B,KAAK2B,SAt8CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,iBAm+CL/J,MAn+CK,EAm+CGC,IAn+CH,EAm+CS;QACbC,QAAQD,KAAKE,KAAL,CAAW,GAAX,CAAd;QACMoI,OAAOrI,MAAMsI,GAAN,EAAb;;WAEOvI,OAAOC,MAAMyG,KAAN,EAAd,EAA6B;;eAClB3G,OAAOC,IAAP,CAAT;UACID,UAAU,IAAd,EAAoB;;;;;;WAKfuI,IAAP,IAAe5H,SAAf;;CA9+CJ;;AAk/CA,AAAO,IAAMqJ,cAAc,SAAdA,WAAc,CAAUnC,MAAV,EAAkBoC,KAAlB,EAAyBzK,KAAzB,EAAgC;MACrDqI,UAAUA,OAAOqC,IAArB,EAA2B;WAClBA,IAAP,YAAqBD,KAArB,EAA8BzK,KAA9B;GADF,MAEO;UACCoK,GAAN,CAAU/B,MAAV,EAAkBoC,KAAlB,EAAyBzK,KAAzB;;CAJG;;AAQP,AAAO,IAAM2K,cAAc,SAAdA,WAAc,CAAUtC,MAAV,EAAkBoC,KAAlB,EAAyBzK,KAAzB,EAAgC;MACrDqI,UAAUA,OAAOqC,IAArB,EAA2B;WAClBA,IAAP,YAAqBD,KAArB,EAA8BzK,KAA9B;GADF,MAEO;UACCoK,GAAN,CAAU/B,MAAV,EAAkBoC,KAAlB,EAAyBzK,KAAzB;;CAJG;;AC1jDP;;;;;;;;;;;;;;;;;AAiBA,AAAe,SAAS4K,QAAT,GAAqB;MAC5Bb,SAAS,EAAf;SACOzG,gBAAP,CAAwB,IAAxB,EAA8B;;;;;;;;;;;UAWtB;WAAA,iBAASzC,GAAT,EAAc;eAASC,MAAM+J,GAAN,CAAUd,MAAV,EAAkBlJ,GAAlB,CAAP;;KAXM;;;;;;;;;;;;;UAwBtB;WAAA,iBAASA,GAAT,EAAcb,MAAd,EAAqB;eAASc,MAAMsJ,GAAN,CAAUL,MAAV,EAAkBlJ,GAAlB,EAAuBb,MAAvB,CAAP;;KAxBD;;;;;;;;;;;YAmCpB;WAAA,iBAASa,GAAT,EAAc;eAASC,MAAMgK,KAAN,CAAYf,MAAZ,EAAoBlJ,GAApB,CAAP;;;GAnC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4FF+J,SAASG,MAAT,GAAkBjK,MAAMiK,MAAxB;;AC9GA;;;;;;;;;;;;;;;;;;;;AAoBA,SAASC,SAAT,CAAoB1J,IAApB,EAA0B;WACflB,IAAT,CAAc,IAAd;WACSkB,OAAO,EAAhB;;;;;;;;;;;;;;;;;;;;;;;;OAwBKqI,KAAL,GAAarI,KAAKiE,cAAL,CAAoB,OAApB,IAA+B,CAAC,CAACjE,KAAKqI,KAAtC,GAA8C,KAA3D;;;;;;;;;;;;SAYOzB,cAAP,CAAsB,IAAtB,EAA4B,YAA5B,EAA0C,EAAElI,OAAO,EAAT,EAAaiL,UAAU,IAAvB,EAA1C;;;AAGF,kBAAeL,SAASG,MAAT,CAAgB;eAChBC;CADA,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDAA,UAAUD,MAAV,GAAmBjK,MAAMiK,MAAzB;;;;;;;;;;;;;;;;;;;;;;;AAuBAjK,MAAMoK,MAAN,CAAaF,UAAUtL,SAAvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkFAoB,MAAMqK,QAAN,CACEH,UAAUtL,SADZ,EAEE,YAAY;SACH,KAAK0L,UAAZ;CAHJ,EAKE,UAAUpL,KAAV,EAAiB;OACVoL,UAAL,GAAkBpL,KAAlB;CANJ;;AC/NA,IAAMlB,WAAS,OAAf;AACA,IAAMuM,YAAY,0CAAlB;;;AAGA,IAAMC,WAAW;SACR,EADQ;UAEP,EAFO;WAGN,EAHM;QAIT,EAJS;QAKT,EALS;SAMR;;;CANT,CAUA,IAAMC,eAAe,2BAArB;AACA,IAAMC,gBAAgB,IAAtB;AACA,IAAMC,mBAAmB,IAAzB;AACA,IAAMC,SAAS,SAATA,MAAS,CAAUC,OAAV,EAAmB;SACzBA,QAAQC,OAAR,CAAgBL,YAAhB,EAA8B,MAA9B,CAAP;CADF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,SAASM,KAAT,CAAgBC,UAAhB,EAA4B;QACpBjE,cAAN,CAAqB,IAArB,EAA2BgE,KAA3B;;;;;;;;;OASKC,UAAL,GAAkBA,UAAlB;;;;;;;;;OASKC,IAAL,GAAY,IAAZ;;;AAGF,cAAef,YAAUD,MAAV,CAAiB;eACjBc,KADiB;;uBAAA,iCAGPG,KAHO,EAGA;QACtBC,SAAS,EAAf;QACMC,MAAM,EAAZ;QACMC,aAAa,EAAnB;UACMjL,MAAN,CAAa8K,KAAb,EAAoB,UAACI,MAAD,EAAS3B,KAAT,EAAmB;UACjC,CAAC3J,MAAM+B,QAAN,CAAeuJ,MAAf,CAAL,EAA6B;iBAClB;gBACDA;SADR;;YAIIlL,MAAN,CAAakL,MAAb,EAAqB,UAACC,IAAD,EAAOC,EAAP,EAAc;eAC1BjH,IAAP,CAAYoF,KAAZ;YACIpF,IAAJ,CAASiH,EAAT;mBACWjH,IAAX,CAAgBgH,IAAhB;OAHF;KANF;WAYO;oBAAA;cAAA;;KAAP;GAnB4B;sBAAA,gCA0BRL,KA1BQ,EA0BD;;;QACrBO,SAAS,EAAf;UACM3L,OAAN,CAAc,UAAC4L,MAAD,EAAShK,CAAT,EAAe;UACvB1B,MAAM6H,QAAN,CAAe6D,MAAf,CAAJ,EAA4B;;;UAGtBC,OAAOT,MAAMxJ,IAAI,CAAV,CAAb;UACMkK,SAAS5L,MAAM2D,OAAN,CAAc+H,MAAd,IAAwB,MAAKG,oBAA7B,GAAoD,MAAKC,qBAAxE;UACMC,QAAQH,OAAOtM,IAAP,QAAkBoM,MAAlB,CAAd;UACIC,SAAS,IAAb,EAAmB;cACXK,IAAN,GAAa,IAAb;;aAEKzH,IAAP,CAAYwH,KAAZ;KAVF;WAYOpI,OAAP,GAAiB,IAAjB;WACO8H,MAAP;GAzC4B;kBAAA,4BA4CZQ,IA5CY,EA4CNC,KA5CM,EA4CCH,KA5CD,EA4CQxD,IA5CR,EA4Cc;QACtC7G,UAAJ;QACMyJ,SAASY,MAAMZ,MAArB;QACMC,MAAMW,MAAMX,GAAlB;QACMC,aAAaU,MAAMV,UAAzB;QACM1D,MAAMyD,IAAIzJ,MAAhB;SACKD,IAAI,CAAT,EAAYA,IAAIiG,GAAhB,EAAqBjG,GAArB,EAA0B;UACpB8J,KAAKJ,IAAI1J,CAAJ,CAAT;UACMsK,OAAOR,GAAGW,MAAH,CAAU,CAAV,MAAiB,GAA9B;WACKH,OAAOR,GAAG5J,MAAH,CAAU,CAAV,CAAP,GAAsB4J,EAA3B;UACMD,OAAO,KAAKa,QAAL,CAAcpM,MAAM+J,GAAN,CAAUxB,IAAV,EAAgB4C,OAAOzJ,CAAP,CAAhB,CAAd,EAA0C8J,EAA1C,EAA8CH,WAAW3J,CAAX,CAA9C,CAAb;UACI6J,SAASlL,SAAb,EAAwB;eACf6L,QAAQX,IAAR,GAAgBS,OAAOC,QAAQV,IAAf,GAAsBU,QAAQV,IAArD;;cAEM,KAAR;;WAEK,EAAEU,UAAF,EAAQC,YAAR,EAAP;GA5D4B;iBAAA,2BA+DbD,IA/Da,EA+DPC,KA/DO,EA+DAT,MA/DA,EA+DQlD,IA/DR,EA+Dc;QACtC7G,UAAJ;QACMiG,MAAM8D,OAAO9J,MAAnB;SACKD,IAAI,CAAT,EAAYA,IAAIiG,GAAhB,EAAqBjG,GAArB,EAA0B;UAClBqK,QAAQN,OAAO/J,CAAP,CAAd;UACMkK,SAASG,MAAMpI,OAAN,GAAgB,KAAK0I,eAArB,GAAuC,KAAKC,gBAA3D;UACM9H,SAASoH,OAAOtM,IAAP,CAAY,IAAZ,EAAkB,IAAlB,EAAwB,IAAxB,EAA8ByM,KAA9B,EAAqCxD,IAArC,CAAf;UACIkD,OAAO/J,IAAI,CAAX,CAAJ,EAAmB;YACbqK,MAAMC,IAAV,EAAgB;iBACPC,QAAQzH,OAAOyH,IAAtB;SADF,MAEO;iBACEA,QAAQzH,OAAOyH,IAAtB;;OAJJ,MAMO;eACEzH,OAAOyH,IAAd;;cAEMzH,OAAO0H,KAAf;;WAEK,EAAED,UAAF,EAAQC,YAAR,EAAP;GAjF4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBAkIrBK,QAlIqB,EAkIXC,SAlIW,EAkIAhM,IAlIA,EAkIM;aACzBA,OAAO,EAAhB;QACI,KAAKyK,IAAT,EAAe;YACPjL,MAAMmD,GAAN,CAAanF,QAAb,eAA+B,GAA/B,EAAoC,qBAApC,CAAN;;SAEGiN,IAAL,GAAY,KAAKD,UAAL,CAAgByB,QAAhB,CAAyBjM,KAAKO,KAA9B,EAAqC2L,OAArC,CAA6CH,QAA7C,EAAuDC,SAAvD,EAAkEhM,IAAlE,CAAZ;WACO,IAAP;GAxI4B;;;;;;;;;;;;;;;SAAA,mBAuJrBmM,OAvJqB,EAuJZ5L,KAvJY,EAuJLuE,CAvJK,EAuJFC,CAvJE,EAuJC;QACvB9E,MAAMkM,QAAQ5L,KAAR,CAAZ;QACI6L,KAAK5M,MAAM+J,GAAN,CAAUzE,CAAV,EAAa7E,IAAI,CAAJ,CAAb,CAAT;QACIoM,KAAK7M,MAAM+J,GAAN,CAAUxE,CAAV,EAAa9E,IAAI,CAAJ,CAAb,CAAT;QACImM,MAAM5M,MAAM6H,QAAN,CAAe+E,EAAf,CAAV,EAA8B;WACvBA,GAAG9D,WAAH,EAAL;;QAEE+D,MAAM7M,MAAM6H,QAAN,CAAegF,EAAf,CAAV,EAA8B;WACvBA,GAAG/D,WAAH,EAAL;;QAEExD,MAAMjF,SAAV,EAAqB;UACf,IAAJ;;QAEEkF,MAAMlF,SAAV,EAAqB;UACf,IAAJ;;QAEEI,IAAI,CAAJ,EAAOqI,WAAP,OAAyB,MAA7B,EAAqC;UAC7BgE,OAAOD,EAAb;WACKD,EAAL;WACKE,IAAL;;QAEEF,KAAKC,EAAT,EAAa;aACJ,CAAC,CAAR;KADF,MAEO,IAAID,KAAKC,EAAT,EAAa;aACX,CAAP;KADK,MAEA;UACD9L,QAAQ4L,QAAQhL,MAAR,GAAiB,CAA7B,EAAgC;eACvB,KAAKoL,OAAL,CAAaJ,OAAb,EAAsB5L,QAAQ,CAA9B,EAAiCuE,CAAjC,EAAoCC,CAApC,CAAP;OADF,MAEO;eACE,CAAP;;;GApLwB;;;;;;;;;;;;;UAAA,oBAmMpBrG,KAnMoB,EAmMbsM,EAnMa,EAmMTwB,SAnMS,EAmME;QACxB5B,MAAM,KAAK5L,WAAL,CAAiB4L,GAA7B;QACIA,IAAII,EAAJ,CAAJ,EAAa;aACJJ,IAAII,EAAJ,EAAQtM,KAAR,EAAe8N,SAAf,CAAP;;QAEExB,GAAGjL,OAAH,CAAW,MAAX,MAAuB,CAA3B,EAA8B;aACrB,KAAK0M,IAAL,CAAUD,SAAV,EAAqBxB,GAAG5J,MAAH,CAAU,CAAV,CAArB,EAAmC2H,IAAnC,CAAwCrK,KAAxC,MAAmD,IAA1D;KADF,MAEO,IAAIsM,GAAGjL,OAAH,CAAW,SAAX,MAA0B,CAA9B,EAAiC;aAC/B,KAAK0M,IAAL,CAAUD,SAAV,EAAqBxB,GAAG5J,MAAH,CAAU,CAAV,CAArB,EAAmC2H,IAAnC,CAAwCrK,KAAxC,MAAmD,IAA1D;;GA3M0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBA4PtBgO,KA5PsB,EA4PfvM,OA5Pe,EA4PN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2EZuM,QAAQ,EAAlB;SACKC,OAAL;QACInN,MAAM+B,QAAN,CAAemL,KAAf,CAAJ,EAA2B;UACrBhC,QAAQ,EAAZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BIlL,MAAM+B,QAAN,CAAemL,MAAMhC,KAArB,KAA+BlL,MAAM2D,OAAN,CAAcuJ,MAAMhC,KAApB,CAAnC,EAA+D;gBACrDgC,MAAMhC,KAAd;;YAEI9K,MAAN,CAAa8M,KAAb,EAAoB,UAAUhO,KAAV,EAAiBa,GAAjB,EAAsB;YACpC,EAAEA,OAAOyK,QAAT,KAAsB,EAAEzK,OAAOmL,KAAT,CAA1B,EAA2C;gBACnCnL,GAAN,IAAa;kBACLb;WADR;;OAFJ;UAOIuM,eAAJ;;;UAGIzL,MAAM+B,QAAN,CAAemJ,KAAf,KAAyBvM,OAAOwD,IAAP,CAAY+I,KAAZ,EAAmBvJ,MAAnB,KAA8B,CAA3D,EAA8D;iBACnD,KAAKkK,oBAAL,CAA0B,CAACX,KAAD,CAA1B,CAAT;OADF,MAEO,IAAIlL,MAAM2D,OAAN,CAAcuH,KAAd,CAAJ,EAA0B;iBACtB,KAAKW,oBAAL,CAA0BX,KAA1B,CAAT;;;UAGEO,MAAJ,EAAY;aACLR,IAAL,GAAY,KAAKA,IAAL,CAAU/F,MAAV,CAAiB,UAACqD,IAAD,EAAO7G,CAAP;iBAAa,OAAK2K,eAAL,CAAqB,IAArB,EAA2B,IAA3B,EAAiCZ,MAAjC,EAAyClD,IAAzC,EAA+C0D,IAA5D;SAAjB,CAAZ;;;;UAIEU,UAAUO,MAAMP,OAAN,IAAiBO,MAAME,IAArC;;UAEIpN,MAAM6H,QAAN,CAAe8E,OAAf,CAAJ,EAA6B;kBACjB,CACR,CAACA,OAAD,EAAU,KAAV,CADQ,CAAV;;UAIE,CAAC3M,MAAM2D,OAAN,CAAcgJ,OAAd,CAAL,EAA6B;kBACjB,IAAV;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2BEA,OAAJ,EAAa;YACP5L,QAAQ,CAAZ;gBACQjB,OAAR,CAAgB,UAAUW,GAAV,EAAeiB,CAAf,EAAkB;cAC5B1B,MAAM6H,QAAN,CAAepH,GAAf,CAAJ,EAAyB;oBACfiB,CAAR,IAAa,CAACjB,GAAD,EAAM,KAAN,CAAb;;SAFJ;aAKKwK,IAAL,CAAUmC,IAAV,CAAe,UAAC9H,CAAD,EAAIC,CAAJ;iBAAU,OAAKwH,OAAL,CAAaJ,OAAb,EAAsB5L,KAAtB,EAA6BuE,CAA7B,EAAgCC,CAAhC,CAAV;SAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4CEvF,MAAM0I,QAAN,CAAewE,MAAMG,IAArB,CAAJ,EAAgC;aACzBA,IAAL,CAAUH,MAAMG,IAAhB;OADF,MAEO,IAAIrN,MAAM0I,QAAN,CAAewE,MAAMI,MAArB,CAAJ,EAAkC;aAClCD,IAAL,CAAUH,MAAMI,MAAhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA2CEtN,MAAM0I,QAAN,CAAewE,MAAMK,KAArB,CAAJ,EAAiC;aAC1BA,KAAL,CAAWL,MAAMK,KAAjB;;KA7LJ,MA+LO,IAAIvN,MAAMM,UAAN,CAAiB4M,KAAjB,CAAJ,EAA6B;WAC7BjC,IAAL,GAAY,KAAKA,IAAL,CAAU/F,MAAV,CAAiBgI,KAAjB,EAAwBvM,OAAxB,CAAZ;;WAEK,IAAP;GA3gB4B;;;;;;;;;;;;SAAA,mBAuhBrB6M,SAvhBqB,EAuhBV7M,OAvhBU,EAuhBD;SACtBwM,OAAL,GAAerN,OAAf,CAAuB0N,SAAvB,EAAkC7M,OAAlC;WACO,IAAP;GAzhB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAA,eAyjBzB8M,OAzjByB,EAyjBhBjN,IAzjBgB,EAyjBV;gBACNiN,UAAU,EAAtB;aACSjN,OAAO,EAAhB;QACI,KAAKyK,IAAT,EAAe;YACPjL,MAAMmD,GAAN,CAAanF,QAAb,WAA2B,GAA3B,EAAgCuM,SAAhC,CAAN;;QAEEkD,WAAW,CAACzN,MAAM2D,OAAN,CAAc8J,OAAd,CAAhB,EAAwC;gBAC5B,CAACA,OAAD,CAAV;;QAEE,CAACA,QAAQ9L,MAAb,EAAqB;WACdwL,OAAL;aACO,IAAP;;SAEGlC,IAAL,GAAY,KAAKD,UAAL,CAAgByB,QAAhB,CAAyBjM,KAAKO,KAA9B,EAAqCgJ,GAArC,CAAyC0D,OAAzC,CAAZ;WACO,IAAP;GAvkB4B;;;;;;;;;;;;;;;;;;;;;;QAAA,oBA6lBb;;;QACXjN,OAAO,EAAX;QACI,KAAKyK,IAAT,EAAe;YACPjL,MAAMmD,GAAN,CAAanF,QAAb,cAA8B,GAA9B,EAAmCuM,SAAnC,CAAN;;;sCAHOpE,IAAM;UAAA;;;QAKX,CAACA,KAAKxE,MAAN,IAAiBwE,KAAKxE,MAAL,KAAgB,CAAhB,IAAqB3B,MAAM+B,QAAN,CAAeoE,KAAK,CAAL,CAAf,CAA1C,EAAoE;WAC7DgH,OAAL;aACO,IAAP;KAFF,MAGO,IAAIhH,KAAKxE,MAAL,IAAe3B,MAAM+B,QAAN,CAAeoE,KAAKA,KAAKxE,MAAL,GAAc,CAAnB,CAAf,CAAnB,EAA0D;aACxDwE,KAAKA,KAAKxE,MAAL,GAAc,CAAnB,CAAP;WACKuG,GAAL;;QAEI8C,aAAa,KAAKA,UAAxB;QACMjK,QAAQiK,WAAWyB,QAAX,CAAoBjM,KAAKO,KAAzB,CAAd;SACKkK,IAAL,GAAY,EAAZ;SACKnL,OAAL,CAAa,UAAC2N,OAAD,EAAa;aACnBxC,IAAL,GAAY,OAAKA,IAAL,CAAUyC,MAAV,CAAiB3M,MAAMgJ,GAAN,CAAU0D,OAAV,CAAjB,CAAZ;KADF;WAGO,IAAP;GA/mB4B;;;;;;;;;;SAAA,qBAynBnB;QACL,CAAC,KAAKxC,IAAV,EAAgB;WACTA,IAAL,GAAY,KAAKD,UAAL,CAAgBjK,KAAhB,CAAsB4M,MAAtB,EAAZ;;WAEK,KAAK1C,IAAZ;GA7nB4B;;;;;;;;;;;;;MAAA,gBA0oBxBJ,OA1oBwB,EA0oBf+C,KA1oBe,EA0oBR;WACb,IAAI3J,MAAJ,OAAgB2G,OAAOC,OAAP,EAAgBC,OAAhB,CAAwBJ,aAAxB,EAAuC,IAAvC,EAA6CI,OAA7C,CAAqDH,gBAArD,EAAuE,GAAvE,CAAhB,QAAiGiD,KAAjG,CAAP;GA3oB4B;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,iBAoqBvBC,GApqBuB,EAoqBlB;QACN,CAAC7N,MAAM0I,QAAN,CAAemF,GAAf,CAAL,EAA0B;YAClB7N,MAAMmD,GAAN,CAAanF,QAAb,aAA6B,KAA7B,EAAoC,GAApC,EAAyC,QAAzC,EAAmD6P,GAAnD,CAAN;;QAEI5C,OAAO,KAAKkC,OAAL,EAAb;SACKlC,IAAL,GAAYA,KAAK1J,KAAL,CAAW,CAAX,EAAcuM,KAAKC,GAAL,CAAS9C,KAAKtJ,MAAd,EAAsBkM,GAAtB,CAAd,CAAZ;WACO,IAAP;GA1qB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAA,eAusBzBG,KAvsByB,EAusBlBrN,OAvsBkB,EAusBT;SACdsK,IAAL,GAAY,KAAKkC,OAAL,GAAejL,GAAf,CAAmB8L,KAAnB,EAA0BrN,OAA1B,CAAZ;WACO,IAAP;GAzsB4B;;;;;;;;;;;;;;;;SAAA,mBAytBrBsN,QAztBqB,EAytBF;uCAAN9H,IAAM;UAAA;;;SACrB8E,IAAL,GAAY,KAAKkC,OAAL,GAAejL,GAAf,CAAmB,UAAUqG,IAAV,EAAgB;aACtCA,KAAK0F,QAAL,cAAkB9H,IAAlB,CAAP;KADU,CAAZ;WAGO,IAAP;GA7tB4B;;;;;;;;;;KAAA,iBAuuBvB;QACC8E,OAAO,KAAKA,IAAlB;SACKA,IAAL,GAAY,IAAZ;WACOA,IAAP;GA1uB4B;;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBAmwBxB4C,GAnwBwB,EAmwBnB;QACL,CAAC7N,MAAM0I,QAAN,CAAemF,GAAf,CAAL,EAA0B;YAClB7N,MAAMmD,GAAN,CAAanF,QAAb,YAA4B,KAA5B,EAAmC,GAAnC,EAAwC,QAAxC,EAAkD6P,GAAlD,CAAN;;QAEI5C,OAAO,KAAKkC,OAAL,EAAb;QACIU,MAAM5C,KAAKtJ,MAAf,EAAuB;WAChBsJ,IAAL,GAAYA,KAAK1J,KAAL,CAAWsM,GAAX,CAAZ;KADF,MAEO;WACA5C,IAAL,GAAY,EAAZ;;WAEK,IAAP;;CA7wBW,EA+wBZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4II;SACE,WAAU/L,KAAV,EAAiB8N,SAAjB,EAA4B;aACxB9N,SAAS8N,SAAhB,CAD+B;KAD9B;UAIG,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACzB9N,SAAS8N,SAAhB,CADgC;KAJ/B;WAOI,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aAC1B9N,UAAU8N,SAAjB;KARC;UAUG,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACzB9N,SAAS8N,SAAhB,CADgC;KAV/B;WAaI,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aAC1B9N,UAAU8N,SAAjB;KAdC;SAgBE,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACxB9N,QAAQ8N,SAAf;KAjBC;UAmBG,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACzB9N,SAAS8N,SAAhB;KApBC;SAsBE,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACxB9N,QAAQ8N,SAAf;KAvBC;UAyBG,WAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACzB9N,SAAS8N,SAAhB;KA1BC;kBA4BW,oBAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aACjC,CAAChN,MAAMkO,YAAN,CAAoBhP,SAAS,EAA7B,EAAmC8N,aAAa,EAAhD,EAAqDrL,MAA7D;KA7BC;qBA+Bc,uBAAUzC,KAAV,EAAiB8N,SAAjB,EAA4B;aACpChN,MAAMkO,YAAN,CAAoBhP,SAAS,EAA7B,EAAmC8N,aAAa,EAAhD,EAAqDrL,MAA5D;KAhCC;UAkCG,aAAUzC,KAAV,EAAiB8N,SAAjB,EAA4B;aACzBA,UAAUzM,OAAV,CAAkBrB,KAAlB,MAA6B,CAAC,CAArC;KAnCC;aAqCM,eAAUA,KAAV,EAAiB8N,SAAjB,EAA4B;aAC5BA,UAAUzM,OAAV,CAAkBrB,KAAlB,MAA6B,CAAC,CAArC;KAtCC;gBAwCS,kBAAUA,KAAV,EAAiB8N,SAAjB,EAA4B;aAC/B,CAAC9N,SAAS,EAAV,EAAcqB,OAAd,CAAsByM,SAAtB,MAAqC,CAAC,CAA7C;KAzCC;mBA2CY,qBAAU9N,KAAV,EAAiB8N,SAAjB,EAA4B;aAClC,CAAC9N,SAAS,EAAV,EAAcqB,OAAd,CAAsByM,SAAtB,MAAqC,CAAC,CAA7C;;;CAv8BS,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzEA;AACA,AAAO,IAAMmB,gBAAgB,WAAtB;AACP,AAAO,IAAMC,cAAc,SAApB;AACP,AAAO,IAAMC,aAAa,QAAnB;;AAEP,IAAMrQ,WAAS,UAAf;;AAEA,AAAO,SAASsQ,QAAT,CAAmBC,aAAnB,EAAgD;MAAdC,OAAc,uEAAJ,EAAI;;QAC/CzH,cAAN,CAAqB,IAArB,EAA2BuH,QAA3B;;UAEQlI,IAAR,GAAe,KAAK5G,WAAL,CAAiBiP,SAAhC;OACKC,eAAL,CAAqBH,aAArB,EAAoCC,OAApC;;MAEI,QAAOD,aAAP,yCAAOA,aAAP,OAAyB,QAA7B,EAAuC;WAC9BnH,cAAP,CAAsB,IAAtB,EAA4B,eAA5B,EAA6C,EAAElI,OAAOqP,aAAT,EAA7C;;;SAGKnH,cAAP,CAAsB,IAAtB,EAA4B,SAA5B,EAAuC,EAAE+C,UAAU,IAAZ,EAAvC;QACM9I,MAAN,CAAa,IAAb,EAAmBmN,OAAnB;;;AAGFF,SAASrE,MAAT,GAAkBjK,MAAMiK,MAAxB;;AAEAjK,MAAMqH,sBAAN,CAA6BiH,SAAS1P,SAAtC,EAAiD;MAC3C+P,eAAJ,GAAuB;WACd,KAAKC,GAAL,KAAavO,SAAb,IAA0B,CAAC,CAAC,KAAKuO,GAAxC;GAF6C;;MAK3CC,iBAAJ,GAAyB;WAChB,KAAKrH,MAAL,CAAYsH,SAAZ,CAAsBC,aAAtB,CAAoC,KAAKlO,QAAzC,CAAP;GAN6C;;iBAAA,2BAS9BmO,OAT8B,EASrBxO,IATqB,EASf;QACxByO,sBAAoBjR,QAA1B;;QAEMkD,aAAaV,KAAKU,UAAxB;QACI,CAACA,UAAL,EAAiB;YACTlB,MAAMmD,GAAN,CAAU8L,UAAV,EAAsB,iBAAtB,EAAyC,GAAzC,EAA8C,QAA9C,EAAwD/N,UAAxD,CAAN;;;QAGIgO,aAAa1O,KAAK0O,UAAL,GAAkB1O,KAAK0O,UAAL,IAAmB1O,KAAK2O,QAA7D;QACI,CAACD,UAAD,KAAgB1O,KAAK4F,IAAL,KAAc+H,aAAd,IAA+B3N,KAAK4F,IAAL,KAAciI,UAA7D,CAAJ,EAA8E;YACtErO,MAAMmD,GAAN,CAAU8L,UAAV,EAAsB,iBAAtB,EAAyC,GAAzC,EAA8C,QAA9C,EAAwDC,UAAxD,CAAN;;;QAGElP,MAAM6H,QAAN,CAAemH,OAAf,CAAJ,EAA6B;WACtBnO,QAAL,GAAgBmO,OAAhB;UACI,CAAChP,MAAMM,UAAN,CAAiBE,KAAKc,WAAtB,CAAL,EAAyC;cACjCtB,MAAMmD,GAAN,CAAU8L,UAAV,EAAsB,kBAAtB,EAA0C,GAA1C,EAA+C,UAA/C,EAA2DzO,KAAKc,WAAhE,CAAN;;KAHJ,MAKO,IAAI0N,OAAJ,EAAa;WACbnO,QAAL,GAAgBmO,QAAQ5L,IAAxB;KADK,MAEA;YACCpD,MAAMmD,GAAN,CAAU8L,UAAV,EAAsB,SAAtB,EAAiC,GAAjC,EAAsC,kBAAtC,EAA0DD,OAA1D,CAAN;;GA9B2C;UAAA,oBAkCrCxH,MAlCqC,EAkC7B;SACXpE,IAAL,GAAYoE,OAAOpE,IAAnB;WACOgE,cAAP,CAAsB,IAAtB,EAA4B,QAA5B,EAAsC,EAAElI,OAAOsI,MAAT,EAAtC;;WAEOC,YAAP,IAAuB9I,OAAOyI,cAAP,CAAsBI,MAAtB,EAA8B,cAA9B,EAA8C,EAAEtI,OAAO,EAAT,EAA9C,CAAvB;WACOkQ,cAAP,IAAyBzQ,OAAOyI,cAAP,CAAsBI,MAAtB,EAA8B,gBAA9B,EAAgD,EAAEtI,OAAO,EAAT,EAAhD,CAAzB;WACOuI,YAAP,CAAoBlD,IAApB,CAAyB,IAAzB;WACO6K,cAAP,CAAsB7K,IAAtB,CAA2B,KAAKrD,UAAhC;GAzC6C;gBAAA,4BA4C7B;WACT,CAAC,EAAE,KAAKgO,UAAL,IAAmB,KAAKC,QAA1B,CAAR;GA7C6C;aAAA,yBAgDhC;WACN,KAAKZ,aAAZ;GAjD6C;eAAA,yBAoDhChH,MApDgC,EAoDxB;WACdvH,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAKC,MAAL,CAAY6H,WAA9B,CAAP;GArD6C;eAAA,yBAwDhC9H,MAxDgC,EAwDxB+H,aAxDwB,EAwDT;QAChC,CAAC/H,MAAD,IAAW,CAAC+H,aAAhB,EAA+B;;;;SAI1BC,cAAL,CAAoBhI,MAApB,EAA4B+H,aAA5B;GA7D6C;gBAAA,0BAgE/B/H,MAhE+B,EAgEvBiI,cAhEuB,EAgEP;;;QAChCH,cAAc,KAAK7H,MAAL,CAAY6H,WAAhC;;QAEI,CAACrP,MAAM2D,OAAN,CAAc6L,cAAd,CAAL,EAAoC;uBACjB,CAACA,cAAD,CAAjB;;;mBAGa1P,OAAf,CAAuB,UAACwP,aAAD,EAAmB;YAClChG,GAAN,CAAUgG,aAAV,EAAyB,MAAKJ,UAA9B,EAA0ClP,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB8H,WAAlB,CAA1C;KADF;GAvE6C;eAAA,yBA4EhC9H,MA5EgC,EA4ExB;WACdvH,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAKrG,UAAvB,CAAP;GA7E6C;eAAA,yBAgFhCqG,MAhFgC,EAgFxBkI,WAhFwB,EAgFX;WAC3BzP,MAAMsJ,GAAN,CAAU/B,MAAV,EAAkB,KAAKrG,UAAvB,EAAmCuO,WAAnC,CAAP;GAjF6C;YAAA,sBAoFnCjI,MApFmC,EAoF3B;QACd,CAAC,KAAKkI,OAAV,EAAmB;WACZC,mBAAL,CAAyBnI,MAAzB;;;WAGK,KAAKkI,OAAZ;GAzF6C;qBAAA,+BA4F1BlI,MA5F0B,EA4FlB;;;SACtBlG,WAAL,GAAmBmG,YAAnB,CAAgC3H,OAAhC,CAAwC,UAACW,GAAD,EAAS;UAC3CA,IAAIa,WAAJ,OAAsBkG,MAAtB,IAAgC,OAAKoI,YAAL,CAAkBnP,GAAlB,CAAhC,IAA0D,WAASA,GAAvE,EAA4E;eACrEiP,OAAL,GAAejP,GAAf;eACO,IAAP;;KAHJ;GA7F6C;cAAA,wBAqGjCA,GArGiC,EAqG5B;WACV,CAACA,IAAIyO,UAAL,IAAmBzO,IAAIyO,UAAJ,KAAmB,KAAKA,UAAlD;GAtG6C;kBAAA,4BAyG7BW,OAzG6B,EAyGpB;;;QACnBf,YAAY,KAAKtH,MAAL,CAAYsH,SAA9B;;YAEQhP,OAAR,CAAgB,UAACyH,MAAD,EAAY;UACtBkI,cAAc,OAAKK,aAAL,CAAmBvI,MAAnB,CAAlB;;UAEIvH,MAAMM,UAAN,CAAiB,OAAKsO,GAAtB,CAAJ,EAAgC;sBAChB,OAAKA,GAAL,CAASE,SAAT,UAA0BvH,MAA1B,CAAd;OADF,MAEO,IAAIkI,WAAJ,EAAiB;sBACR,OAAKM,UAAL,CAAgBxI,MAAhB,EAAwBkI,WAAxB,CAAd;;;UAGIO,eAAe,CAACP,WAAD,IAAiBzP,MAAM2D,OAAN,CAAc8L,WAAd,KAA8B,CAACA,YAAY9N,MAAjF;;UAEIqO,gBAAgB,OAAKC,cAAL,CAAoB1I,MAApB,CAApB,EAAiD;sBACjC,OAAK2I,oBAAL,CAA0B3I,MAA1B,CAAd;;;UAGEkI,WAAJ,EAAiB;eACVU,aAAL,CAAmB5I,MAAnB,EAA2BkI,WAA3B;;KAhBJ;GA5G6C;qBAAA,+BAiI1BlB,aAjI0B,EAiIXsB,OAjIW,EAiIF;QACrC3O,aAAa,KAAKA,UAAxB;YACQpB,OAAR,CAAgB,UAACyH,MAAD,EAAY;YACpB+B,GAAN,CAAU/B,MAAV,EAAkBrG,UAAlB,EAA8Bb,SAA9B;KADF;GAnI6C;YAAA,sBAwInCkH,MAxImC,EAwI3B+H,aAxI2B,EAwIZ;QAC3Bc,YAAYpQ,MAAM+J,GAAN,CAAUuF,aAAV,EAAyB,KAAK9H,MAAL,CAAY6H,WAArC,CAAlB;;QAEIe,cAAc/P,SAAlB,EAA6B;UACrBgQ,UAAU,KAAKxB,iBAAL,CAAuBwB,OAAvB,EAAhB;UACIA,QAAQ9P,OAAR,CAAgB+O,aAAhB,MAAmC,CAAC,CAAxC,EAA2C;YACrC,KAAKX,eAAT,EAA0B;0BACR,KAAKE,iBAAL,CAAuBD,GAAvB,CAA2BU,aAA3B,CAAhB;;;KAJN,MAOO;UACDA,kBAAkB,KAAKT,iBAAL,CAAuB9E,GAAvB,CAA2BqG,SAA3B,CAAtB,EAA6D;aACtDE,aAAL,CAAmB/I,MAAnB,EAA2B+H,aAA3B;;YAEI,KAAKX,eAAT,EAA0B;0BACR,KAAKE,iBAAL,CAAuBD,GAAvB,CAA2BU,aAA3B,CAAhB;;;;;WAKCA,aAAP;GA5J6C;;;;+BAAA,yCAgKhBiB,EAhKgB,EAgKZ;QAC7BA,OAAOlQ,SAAP,IAAoBkQ,OAAO,IAA/B,EAAqC;;;WAG9B,KAAK1B,iBAAL,CAAuB3J,MAAvB,oBACJ,KAAKgK,UADD,EACcqB,EADd,EAAP;GApK6C;+BAAA,yCAyKhBtO,KAzKgB,EAyKTzB,IAzKS,EAyKH;QACpC+N,gBAAgB,KAAKjN,WAAL,EAAtB;QACMkP,eAAe,KAAKV,aAAL,CAAmB7N,KAAnB,CAArB;;QAEIjC,MAAM2D,OAAN,CAAc6M,YAAd,MAAgC,CAACA,aAAa7O,MAAd,IAAwB4M,cAAckC,EAAd,CAAiBD,aAAa,CAAb,CAAjB,CAAxD,CAAJ,EAAgG;;;;QAI5FA,gBAAgB,CAACjC,cAAckC,EAAd,CAAiBD,YAAjB,CAArB,EAAqD;YAC7ClH,GAAN,CAAUrH,KAAV,EAAiB,KAAKf,UAAtB,EAAkCqN,cAAcmC,YAAd,CAA2BF,YAA3B,EAAyChQ,IAAzC,CAAlC;;GAlL2C;oBAAA,gCAsLzB;WACb,KAAP;GAvL6C;mBAAA,+BA0L1B;WACZ,KAAP;GA3L6C;mBAAA,6BA8L5ByB,KA9L4B,EA8LrBuO,YA9LqB,EA8LPhQ,IA9LO,EA8LD;;;SACvC8P,aAAL,CAAmBrO,KAAnB,EAA0BuO,YAA1B;;WAEO,KAAKG,YAAL,CAAkBH,YAAlB,EAAgChQ,IAAhC,EAAsCoQ,IAAtC,CAA2C,UAACpM,MAAD,EAAY;aACvD2L,aAAL,CAAmBlO,KAAnB,EAA0BuC,MAA1B;KADK,CAAP;GAjM6C;cAAA,wBAsMjCvC,KAtMiC,EAsM1BzB,IAtM0B,EAsMpB;QACnB6D,SAASrE,MAAM2D,OAAN,CAAc1B,KAAd,IAAuB,YAAvB,GAAsC,QAArD;;WAEO,KAAKX,WAAL,GAAmB+C,MAAnB,EAA2BpC,KAA3B,EAAkCzB,IAAlC,CAAP;;CAzMJ;;ACtBO,IAAMqQ,oBAAoBvC,SAASrE,MAAT,CAAgB;eAAA,yBAChC1C,MADgC,EACxB;WACdvH,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAK2H,UAAvB,CAAP;GAF6C;gBAAA,0BAK/B3H,MAL+B,EAKvB+H,aALuB,EAKR;UAC/BhG,GAAN,CAAU/B,MAAV,EAAkB,KAAK2H,UAAvB,EAAmClP,MAAM+J,GAAN,CAAUuF,aAAV,EAAyB,KAAKhO,WAAL,GAAmB+N,WAA5C,CAAnC;GAN6C;sBAAA,gCASzB9H,MATyB,EASjB;;QAExB,CAACA,MAAL,EAAa;;;QAGP6I,YAAYpQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAK2H,UAAvB,CAAlB;QACIkB,cAAc/P,SAAd,IAA2B+P,cAAc,IAA7C,EAAmD;aAC1C,KAAKvB,iBAAL,CAAuB9E,GAAvB,CAA2BqG,SAA3B,CAAP;;GAhB2C;oBAAA,gCAoBzB;WACb,IAAP;GArB6C;oBAAA,8BAwB3BnO,KAxB2B,EAwBpBzB,IAxBoB,EAwBd;;;QACzBgQ,eAAe,KAAKV,aAAL,CAAmB7N,KAAnB,CAArB;;WAEO,KAAK0O,YAAL,CAAkBH,YAAlB,EAAgChQ,IAAhC,EAAsCoQ,IAAtC,CAA2C,UAACrJ,MAAD,EAAY;YACvD+I,aAAL,CAAmBrO,KAAnB,EAA0BsF,MAA1B;KADK,CAAP;GA3B6C;mBAAA,+BAgC1B;UACb,IAAIzB,KAAJ,CAAU,kFAAV,CAAN;;CAjC6B,EAmC9B;aACU;CApCoB,CAA1B;;ACAA,IAAMgL,kBAAkBxC,SAASrE,MAAT,CAAgB;iBAAA,2BAC5B+E,OAD4B,EACnBxO,IADmB,EACb;aACrB5B,SAAT,CAAmB8P,eAAnB,CAAmCpP,IAAnC,CAAwC,IAAxC,EAA8C0P,OAA9C,EAAuDxO,IAAvD;;QAEQuQ,SAHsB,GAGiBvQ,IAHjB,CAGtBuQ,SAHsB;QAGXC,WAHW,GAGiBxQ,IAHjB,CAGXwQ,WAHW;QAGE9B,UAHF,GAGiB1O,IAHjB,CAGE0O,UAHF;;;QAK1B,CAACA,UAAD,IAAe,CAAC6B,SAAhB,IAA6B,CAACC,WAAlC,EAA+C;YACvChR,MAAMmD,GAAN,CAAU,cAAV,EAA0B,yCAA1B,EAAqE,GAArE,EAA0E,QAA1E,EAAoF+L,UAApF,CAAN;;GAPyC;gBAAA,0BAW7B3H,MAX6B,EAWrB;QAChB0J,iBAAiB,KAAK/B,UAAL,IAAmB,KAAK8B,WAA/C;WACO,CAAC,EAAEC,kBAAmB,KAAKF,SAAL,IAAkB/Q,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAKwJ,SAAvB,CAAvC,CAAR;GAb2C;YAAA,sBAgBjCxJ,MAhBiC,EAgBzBiI,cAhByB,EAgBT;;;QAC5BX,oBAAoB,KAAKA,iBAA/B;QACMF,kBAAkB,KAAKA,eAA7B;QACMO,aAAa,KAAKA,UAAxB;QACMmB,UAAU,KAAKxB,iBAAL,CAAuBwB,OAAvB,EAAhB;;WAEOb,eAAetN,GAAf,CAAmB,UAACoN,aAAD,EAAmB;UACrCc,YAAYvB,kBAAkBqC,QAAlB,CAA2B5B,aAA3B,CAAlB;;UAEKc,cAAc/P,SAAd,IAA2BgQ,QAAQ9P,OAAR,CAAgB+O,aAAhB,MAAmC,CAAC,CAAhE,IAAsEA,kBAAkBT,kBAAkB9E,GAAlB,CAAsBqG,SAAtB,CAA5F,EAA8H;YACxHlB,UAAJ,EAAgB;;gBAEToB,aAAL,CAAmB/I,MAAnB,EAA2B+H,aAA3B;;YAEEX,eAAJ,EAAqB;0BACHE,kBAAkBD,GAAlB,CAAsBU,aAAtB,CAAhB;;;;aAIGA,aAAP;KAbK,CAAP;GAtB2C;sBAAA,gCAuCvB/H,MAvCuB,EAuCf;QACtBgJ,KAAKvQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAKC,MAAL,CAAY6H,WAA9B,CAAX;QACM8B,MAAM,KAAKJ,SAAL,GAAiB/Q,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAKwJ,SAAvB,CAAjB,GAAqD,IAAjE;QACIlB,gBAAJ;;QAEIU,OAAOlQ,SAAP,IAAoB,KAAK6O,UAA7B,EAAyC;gBAC7B,KAAKkC,6BAAL,CAAmCb,EAAnC,CAAV;KADF,MAEO,IAAI,KAAKQ,SAAL,IAAkBI,GAAtB,EAA2B;gBACtB,KAAKE,4BAAL,CAAkCF,GAAlC,CAAV;KADK,MAEA,IAAIZ,OAAOlQ,SAAP,IAAoB,KAAK2Q,WAA7B,EAA0C;gBACrC,KAAKM,8BAAL,CAAoCf,EAApC,CAAV;;;QAGEV,WAAWA,QAAQlO,MAAvB,EAA+B;aACtBkO,OAAP;;GArDyC;;;;8BAAA,wCA0DfsB,GA1De,EA0DV;WAC1B,KAAKtC,iBAAL,CAAuB3J,MAAvB,CAA8B;gCAEhC,KAAKsC,MAAL,CAAY6H,WADf,EAC6B;cACnB8B;OAFV;KADK,CAAP;GA3D2C;;;;gCAAA,0CAqEbZ,EArEa,EAqET;WAC3B,KAAK1B,iBAAL,CAAuB3J,MAAvB,CAA8B;gCAEhC,KAAK8L,WADR,EACsB;oBACNT;OAFhB;KADK,CAAP;GAtE2C;oBAAA,gCA+EvB;WACb,CAAC,CAAC,KAAKQ,SAAP,IAAoB,KAAKA,SAAL,CAAepP,MAAf,GAAwB,CAAnD;GAhF2C;mBAAA,+BAmFxB;WACZ,CAAC,CAAC,KAAKuN,UAAd;GApF2C;oBAAA,8BAuFzBjN,KAvFyB,EAuFlBzB,IAvFkB,EAuFZ;;;QACzBgQ,eAAe,KAAKV,aAAL,CAAmB7N,KAAnB,CAArB;QACMsP,iBAAiB,KAAKjQ,WAAL,GAAmB+N,WAA1C;;WAEO,KAAKsB,YAAL,CAAkBH,YAAlB,EAAgChQ,IAAhC,EAAsCoQ,IAAtC,CAA2C,UAACf,OAAD,EAAa;YACvDvG,GAAN,CAAUrH,KAAV,EAAiB,OAAK8O,SAAtB,EAAiClB,QAAQ3N,GAAR,CAAY,UAACqF,MAAD;eAAYvH,MAAM+J,GAAN,CAAUxC,MAAV,EAAkBgK,cAAlB,CAAZ;OAAZ,CAAjC;KADK,CAAP;GA3F2C;cAAA,wBAgG/BtP,KAhG+B,EAgGxBzB,IAhGwB,EAgGlB;WAClB,KAAKc,WAAL,GAAmBkQ,UAAnB,CAA8BvP,KAA9B,EAAqCzB,IAArC,CAAP;;CAjG2B,EAmG5B;aACU;CApGkB,CAAxB;;ACAA,IAAMiR,iBAAiBnD,SAASrE,MAAT,CAAgB;sBAAA,gCACtBsE,aADsB,EACPhH,MADO,EACC;QACrC2J,WAAWlR,MAAM+J,GAAN,CAAUxC,MAAV,EAAkBgH,cAAcc,WAAhC,CAAjB;QACMQ,UAAU,KAAKuB,6BAAL,CAAmCF,QAAnC,CAAhB;;QAEIrB,WAAWA,QAAQlO,MAAvB,EAA+B;aACtBkO,QAAQ,CAAR,CAAP;;GANwC;mBAAA,+BAUvB;WACZ,IAAP;;CAX0B,EAa3B;aACU;CAdiB,CAAvB;;ACEP,CAACgB,iBAAD,EAAoBC,eAApB,EAAqCW,cAArC,EAAqD3R,OAArD,CAA6D,UAAU4R,YAAV,EAAwB;WAC1EA,aAAajD,SAAtB,IAAmC,UAAUO,OAAV,EAAmBR,OAAnB,EAA4B;WACtD,IAAIkD,YAAJ,CAAiB1C,OAAjB,EAA0BR,OAA1B,CAAP;GADF;CADF;;ACFA;;;;;;;;;;;;;;AAcA,AAAO,IAAMmD,YAAY,SAAZA,SAAY,CAAU3C,OAAV,EAAmBxO,IAAnB,EAAyB;SACzC,UAAUgH,MAAV,EAAkB;aACdmK,SAAT,CAAmB3C,OAAnB,EAA4BxO,IAA5B,EAAkCoR,QAAlC,CAA2CpK,MAA3C;GADF;CADK;;;;;;;;;;;;;;;;AAoBP,AAAO,IAAMqK,UAAU,SAAVA,OAAU,CAAU7C,OAAV,EAAmBxO,IAAnB,EAAyB;SACvC,UAAUgH,MAAV,EAAkB;aACdqK,OAAT,CAAiB7C,OAAjB,EAA0BxO,IAA1B,EAAgCoR,QAAhC,CAAyCpK,MAAzC;GADF;CADK;;;;;;;;;;;;;;;;AAoBP,AAAO,IAAMsK,SAAS,SAATA,MAAS,CAAU9C,OAAV,EAAmBxO,IAAnB,EAAyB;SACtC,UAAUgH,MAAV,EAAkB;aACdsK,MAAT,CAAgB9C,OAAhB,EAAyBxO,IAAzB,EAA+BoR,QAA/B,CAAwCpK,MAAxC;GADF;CADK;;ACjDP,IAAMxJ,WAAS,QAAf;;AAEA,IAAM+T,cAAc,SAAdA,WAAc,CAAUvK,MAAV,EAAkBpE,IAAlB,EAAwB;MACpC4O,QAAQxK,OAAOsH,SAArB;MACIkD,SAASA,MAAM5O,IAAN,CAAb,EAA0B;WACjB,YAAmB;wCAAN+C,IAAM;YAAA;;;aACjB6L,MAAM5O,IAAN,gBAAYoE,OAAOpE,IAAnB,SAA4B+C,IAA5B,EAAP;KADF;;SAIKqB,OAAOpE,IAAP,EAAa6O,IAAb,CAAkBzK,MAAlB,CAAP;CAPF;;;AAWA,IAAM0K,eAAe,UAArB;AACA,IAAMC,mBAAiB,YAAvB;AACA,IAAMC,wBAAwB,mBAA9B;AACA,IAAMC,eAAe,UAArB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGA,SAASC,MAAT,CAAiBrQ,KAAjB,EAAwBzB,IAAxB,EAA8B;QACtBuG,cAAN,CAAqB,IAArB,EAA2BuL,MAA3B;WACShT,IAAT,CAAc,IAAd;YACU2C,QAAQ,EAAlB;WACSzB,OAAO,EAAhB;MACMoJ,OAAO,KAAKA,IAAlB;MACMpC,SAAS,KAAKhI,WAAL,CAAiBgI,MAAhC;;OAEK0K,YAAL,EAAmB,IAAnB;OACKC,gBAAL,EAAqB,CAAC,CAAC3R,KAAK+R,UAA5B;OACKH,qBAAL,EAA4B5R,KAAKgS,iBAAL,KAA2BnS,SAA3B,GAAwCmH,SAASA,OAAOgL,iBAAhB,GAAoC,IAA5E,GAAoFhS,KAAKgS,iBAArH;;;MAGMjC,KAAK/I,SAASxH,MAAM+J,GAAN,CAAU9H,KAAV,EAAiBuF,OAAO6H,WAAxB,CAAT,GAAgDhP,SAA3D;MACIkQ,OAAOlQ,SAAX,EAAsB;UACdiJ,GAAN,CAAU,IAAV,EAAgB9B,OAAO6H,WAAvB,EAAoCkB,EAApC;;;QAGIlP,MAAN,CAAa,IAAb,EAAmBY,KAAnB;OACKiQ,YAAL,EAAmB,KAAnB;MACI1R,KAAKiS,aAAL,KAAuBpS,SAA3B,EAAsC;SAC/B8R,gBAAL,EAAqB,CAAC3R,KAAKiS,aAA3B;GADF,MAEO,IAAIjL,UAAUA,OAAOiL,aAAP,KAAyBpS,SAAvC,EAAkD;SAClD8R,gBAAL,EAAqB,CAAC3K,OAAOiL,aAA7B;GADK,MAEA;SACAN,gBAAL,EAAqB,KAArB;;OAEGE,YAAL,EAAmB7K,SAASA,OAAOkL,MAAP,CAAczQ,KAAd,CAAT,GAAgCjC,MAAM2S,SAAN,CAAgB1Q,KAAhB,CAAnD;;;AAGF,eAAeiI,YAAUD,MAAV,CAAiB;eACjBqI,MADiB;;;;;;;;;SAAA,qBAUnB;QACH9K,SAAS,KAAKhI,WAAL,CAAiBgI,MAAhC;QACI,CAACA,MAAL,EAAa;YACLxH,MAAMmD,GAAN,CAAanF,QAAb,eAA+B,EAA/B,EAAmC,GAAnC,EAAwC,QAAxC,CAAN;;WAEKwJ,MAAP;GAf4B;;;;;;;;;;;oBAAA,gCA0BR,EA1BQ;;;;;;;;;;;qBAAA,iCAoCP,EApCO;;;;;;;;;;eAAA,2BA6Cb;WACR,CAAC,KAAKoL,IAAL,CAAU,SAAV,KAAwB,EAAzB,EAA6BrR,KAA7B,EAAP;GA9C4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBA0ErBf,IA1EqB,EA0Ef;aACJA,OAAO,EAAhB;WACOR,MAAM4C,WAAN,CAAkB,OAAO,KAAK8P,MAAZ,KAAuB,UAAvB,GAAoC,KAAKA,MAAL,CAAYlS,IAAZ,CAApC,GAAwD,IAA1E,EAAgF,KAAKoS,IAAL,CAAU,UAAV,CAAhF,EAAuGpS,IAAvG,CAAP;GA5E4B;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAsGtBA,IAtGsB,EAsGhB;SACPoJ,IAAL,CAAU,SAAV,EADY;SAEPA,IAAL,CAAU,SAAV,EAAqB,EAArB,EAFY;SAGPA,IAAL,CAAU,UAAV,EAAsB,KAAK8I,MAAL,CAAYlS,IAAZ,CAAtB;GAzG4B;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBAmIrBA,IAnIqB,EAmIf;aACJA,OAAO,EAAhB;QACMgH,SAAS,KAAKqL,OAAL,EAAf;WACOd,YAAYvK,MAAZ,EAAoB,SAApB,EAA+BxH,MAAM+J,GAAN,CAAU,IAAV,EAAgBvC,OAAO6H,WAAvB,CAA/B,EAAoE7O,IAApE,CAAP;GAtI4B;;;;;;;;;;;;;;;;;;;;;;OAAA,kBA4JvBT,GA5JuB,EA4JlB;WACHC,MAAM+J,GAAN,CAAU,IAAV,EAAgBhK,GAAhB,CAAP;GA7J4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBA0LlBS,IA1LkB,EA0LZ;QACVsS,kBAAkB,CAAC,CAAC,CAAC,KAAKF,IAAL,CAAU,SAAV,KAAwB,EAAzB,EAA6BjR,MAAvD;WACOmR,mBAAmB9S,MAAM+S,YAAN,CAAmB,OAAO,KAAKL,MAAZ,KAAuB,UAAvB,GAAoC,KAAKA,MAAL,CAAYlS,IAAZ,CAApC,GAAwD,IAA3E,EAAiF,KAAKoS,IAAL,CAAU,UAAV,CAAjF,EAAwGpS,IAAxG,CAA1B;GA5L4B;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,iBAqNvBA,IArNuB,EAqNjB;WACJR,MAAM+J,GAAN,CAAU,IAAV,EAAgB,KAAK8I,OAAL,GAAexD,WAA/B,MAAgDhP,SAAvD;GAtN4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBAwPrBG,IAxPqB,EAwPf;WACN,CAAC,KAAKqS,OAAL,GAAeG,QAAf,CAAwB,IAAxB,EAA8BxS,IAA9B,CAAR;GAzP4B;uBAAA,iCA4PPyS,aA5PO,EA4PQ1C,EA5PR,EA4PY2C,UA5PZ,EA4PwB7D,WA5PxB,EA4PqC;;;QAC7D6D,WAAW9M,IAAX,KAAoBiI,UAAxB,EAAoC;kBACtB4E,aAAZ,EAA2BC,WAAWhS,UAAtC,EAAkDb,SAAlD;KADF,MAEO,IAAI6S,WAAW9M,IAAX,KAAoBgI,WAAxB,EAAqC;;UAEpC+E,WAAWnT,MAAM+J,GAAN,CAAUkJ,aAAV,EAAyBC,WAAWhS,UAApC,CAAjB;UACIqP,OAAOlQ,SAAX,EAAsB;cACd+S,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;iBAAWA,eAAX;SAAvB;OADF,MAEO;cACCD,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;iBAAWA,mBAAkB9C,OAAOvQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBhE,WAAjB,CAApC;SAAvB;;;GArQwB;sBAAA,gCA0QR9H,MA1QQ,EA0QAgJ,EA1QA,EA0QI2C,UA1QJ,EA0QgB7D,WA1QhB,EA0Q6B;;;;QAErD6D,WAAW9M,IAAX,KAAoBiI,UAAxB,EAAoC;;kBAEtB9G,MAAZ,EAAoB2L,WAAWhS,UAA/B,EAA2C,IAA3C;KAFF,MAGO,IAAIgS,WAAW9M,IAAX,KAAoBgI,WAAxB,EAAqC;;UAEpC+E,WAAWnT,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB2L,WAAWhS,UAA7B,CAAjB;UACIqP,OAAOlQ,SAAX,EAAsB;cACdiT,SAAN,CAAgBH,QAAhB,EAA0B,IAA1B,EAAgC,UAACE,KAAD;iBAAWA,gBAAX;SAAhC;OADF,MAEO;cACCC,SAAN,CAAgBH,QAAhB,EAA0B,IAA1B,EAAgC,UAACE,KAAD;iBAAWA,oBAAkB9C,OAAOvQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBhE,WAAjB,CAApC;SAAhC;;;GArRwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAA,yBAyUfkE,SAzUe,EAyUJ/S,IAzUI,EAyUE;;;QAC1BgL,WAAJ;QACMhE,SAAS,KAAKqL,OAAL,EAAf;;;kBAGcU,YAAY,EAA1B;QACIvT,MAAM6H,QAAN,CAAe0L,SAAf,CAAJ,EAA+B;kBACjB,CAACA,SAAD,CAAZ;;aAEO/S,OAAO,EAAhB;SACKQ,IAAL,GAAYuS,SAAZ;;;UAGMC,CAAN,CAAQhT,IAAR,EAAcgH,MAAd;SACKiM,OAAL,GAAejM,OAAOkM,cAAP,CAAsBlT,IAAtB,CAAf;;;SAGKA,KAAKgL,EAAL,GAAU,qBAAf;WACOxL,MAAMoJ,OAAN,CAAc,KAAKoC,EAAL,EAAS+H,SAAT,EAAoB/S,IAApB,CAAd,EAAyCoQ,IAAzC,CAA8C,YAAM;;WAEpDpQ,KAAKgL,EAAL,GAAU,eAAf;aACOmI,GAAP,CAAWnI,EAAX,UAAqB+H,SAArB,EAAgC/S,IAAhC;UACIoT,QAAQ,EAAZ;UACIC,aAAJ;YACMC,eAAN,CAAsBtM,MAAtB,EAA8BhH,IAA9B,EAAoC,UAACC,GAAD,EAAMW,QAAN,EAAmB;YAC/CmN,gBAAgB9N,IAAIa,WAAJ,EAAtB;iBACSyS,GAAT,GAAe,KAAf;YACI/T,MAAMM,UAAN,CAAiBG,IAAIuT,IAArB,CAAJ,EAAgC;iBACvBvT,IAAIuT,IAAJ,CAASxM,MAAT,EAAiB/G,GAAjB,UAA4BD,IAA5B,CAAP;SADF,MAEO,IAAIC,IAAI2F,IAAJ,KAAa,SAAb,IAA0B3F,IAAI2F,IAAJ,KAAa,QAA3C,EAAqD;cACtD3F,IAAIyO,UAAR,EAAoB;mBACX6C,YAAYxD,aAAZ,EAA2B,SAA3B,qBACJ9N,IAAIyO,UADA,EACalP,MAAM+J,GAAN,SAAgBvC,OAAO6H,WAAvB,CADb,GAEJjO,QAFI,EAEMwP,IAFN,CAEW,UAAUnB,WAAV,EAAuB;kBACnChP,IAAI2F,IAAJ,KAAa,QAAjB,EAA2B;uBAClBqJ,YAAY9N,MAAZ,GAAqB8N,YAAY,CAAZ,CAArB,GAAsCpP,SAA7C;;qBAEKoP,WAAP;aANK,CAAP;WADF,MASO,IAAIhP,IAAIsQ,SAAR,EAAmB;mBACjBgB,YAAYxD,aAAZ,EAA2B,SAA3B,EAAsC;wCAExCA,cAAcc,WADjB,EAC+B;sBACrBrP,MAAM+J,GAAN,SAAgBtJ,IAAIsQ,SAApB;eAFV;aADK,CAAP;WADK,MAQA,IAAItQ,IAAIuQ,WAAR,EAAqB;mBACnBe,YAAYxD,aAAZ,EAA2B,SAA3B,EAAsC;wCAExC9N,IAAIuQ,WADP,EACqB;4BACLhR,MAAM+J,GAAN,SAAgBvC,OAAO6H,WAAvB;eAFhB;aADK,EAMJ7O,IANI,CAAP;;SAnBG,MA2BA,IAAIC,IAAI2F,IAAJ,KAAa,WAAjB,EAA8B;cAC7BrG,MAAMC,MAAM+J,GAAN,SAAgBtJ,IAAIyO,UAApB,CAAZ;cACIlP,MAAMiU,MAAN,CAAalU,GAAb,CAAJ,EAAuB;mBACdgS,YAAYxD,aAAZ,EAA2B,MAA3B,EAAmCxO,GAAnC,EAAwCqB,QAAxC,CAAP;;;YAGAyS,IAAJ,EAAU;iBACDA,KAAKjD,IAAL,CAAU,UAACnB,WAAD,EAAiB;gBAC5BU,aAAJ,SAAwBV,WAAxB;WADK,CAAP;gBAGMlL,IAAN,CAAWsP,IAAX;;OA1CJ;aA6CO5T,QAAQwG,GAAR,CAAYmN,KAAZ,CAAP;KAnDK,EAoDJhD,IApDI,CAoDC,YAAM;;WAEPpQ,KAAKgL,EAAL,GAAU,oBAAf;aACOxL,MAAMoJ,OAAN,CAAc,OAAKoC,EAAL,EAAS+H,SAAT,EAAoB/S,IAApB,CAAd,EAAyCoQ,IAAzC,CAA8C;;OAA9C,CAAP;KAvDK,CAAP;GA3V4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAA,oBA+apB7Q,GA/aoB,EA+af;QACTA,GAAJ,EAAS;aACA,KAAK6S,IAAL,eAAsB7S,GAAtB,CAAP;;WAEK,KAAK6S,IAAL,CAAU,UAAV,CAAP;GAnb4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAgdtBpS,IAhdsB,EAgdhB;;;QACN0T,WAAW,KAAKtB,IAAL,CAAU,UAAV,CAAjB;aACSpS,OAAO,EAAhB;SACK2T,QAAL,KAAkB3T,KAAK2T,QAAL,GAAgB,EAAlC;UACM/T,MAAN,CAAa,IAAb,EAAmB,UAAClB,KAAD,EAAQa,GAAR,EAAgB;UAC7BA,QAAQ,OAAK8S,OAAL,GAAexD,WAAvB,IAAsC,CAAC6E,SAASzP,cAAT,CAAwB1E,GAAxB,CAAvC,IAAuE,OAAK0E,cAAL,CAAoB1E,GAApB,CAAvE,IAAmGS,KAAK2T,QAAL,CAAc5T,OAAd,CAAsBR,GAAtB,MAA+B,CAAC,CAAvI,EAA0I;eACjI,OAAKA,GAAL,CAAP;;KAFJ;UAKMK,MAAN,CAAa8T,QAAb,EAAuB,UAAChV,KAAD,EAAQa,GAAR,EAAgB;UACjCS,KAAK2T,QAAL,CAAc5T,OAAd,CAAsBR,GAAtB,MAA+B,CAAC,CAApC,EAAuC;eAChCA,GAAL,IAAYb,KAAZ;;KAFJ;SAKKkV,MAAL;GA9d4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBAmgBxB5T,IAngBwB,EAmgBlB;;;aACDA,OAAO,EAAhB;QACMgH,SAAS,KAAKqL,OAAL,EAAf;QACMtC,KAAKvQ,MAAM+J,GAAN,CAAU,IAAV,EAAgBvC,OAAO6H,WAAvB,CAAX;QACIpN,QAAQ,IAAZ;;QAEMoS,cAAc,SAAdA,WAAc,CAAC7P,MAAD,EAAY;UACxB+C,SAAS/G,KAAKuT,GAAL,GAAWvP,OAAOyG,IAAlB,GAAyBzG,MAAxC;UACI+C,MAAJ,EAAY;cACJ1C,SAAN,SAAsB0C,MAAtB;eACK6M,MAAL;;aAEK5P,MAAP;KANF;;QASI+L,OAAOlQ,SAAX,EAAsB;aACb0R,YAAYvK,MAAZ,EAAoB,QAApB,EAA8BvF,KAA9B,EAAqCzB,IAArC,EAA2CoQ,IAA3C,CAAgDyD,WAAhD,CAAP;;QAEE7T,KAAK8T,WAAT,EAAsB;UACdC,UAAU,KAAKA,OAAL,CAAa/T,IAAb,CAAhB;cACQ,EAAR;YACMa,MAAN,CAAaY,KAAb,EAAoBsS,QAAQzR,KAA5B;YACMzB,MAAN,CAAaY,KAAb,EAAoBsS,QAAQvR,OAA5B;;WAEK+O,YAAYvK,MAAZ,EAAoB,QAApB,EAA8B+I,EAA9B,EAAkCtO,KAAlC,EAAyCzB,IAAzC,EAA+CoQ,IAA/C,CAAoDyD,WAApD,CAAP;GA3hB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,kBA4jBvBtU,GA5jBuB,EA4jBlBb,KA5jBkB,EA4jBXsB,IA5jBW,EA4jBL;QACnBR,MAAM+B,QAAN,CAAehC,GAAf,CAAJ,EAAyB;aAChBb,KAAP;;aAEOsB,OAAO,EAAhB;QACIA,KAAKgU,MAAT,EAAiB;WACV5K,IAAL,CAAU,QAAV,EAAoB,IAApB;;UAEIN,GAAN,CAAU,IAAV,EAAgBvJ,GAAhB,EAAqBb,KAArB;QACI,CAAC,KAAK0T,IAAL,CAAU,SAAV,CAAL,EAA2B;WACpBhJ,IAAL,CAAU,QAAV,EADyB;;GArkBC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBA4mBtBpJ,IA5mBsB,EA4mBhB;QACNgH,SAAS,KAAKhI,WAAL,CAAiBgI,MAAhC;QACIA,MAAJ,EAAY;aACHA,OAAOkL,MAAP,CAAc,IAAd,EAAoBlS,IAApB,CAAP;KADF,MAEO;UACCoH,OAAO,EAAb;YACMxH,MAAN,CAAa,IAAb,EAAmB,UAAC4H,IAAD,EAAOjI,GAAP,EAAe;aAC3BA,GAAL,IAAYC,MAAM2S,SAAN,CAAgB3K,IAAhB,CAAZ;OADF;aAGOJ,IAAP;;GArnB0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,iBAmpBvB7H,GAnpBuB,EAmpBlBS,IAnpBkB,EAmpBZ;SACX8I,GAAL,CAASvJ,GAAT,EAAcM,SAAd,EAAyBG,IAAzB;GAppB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAA,oBAqrBpBA,IArrBoB,EAqrBd;WACP,KAAKqS,OAAL,GAAeG,QAAf,CAAwB,IAAxB,EAA8BxS,IAA9B,CAAP;;CAtrBW,EAwrBZ;4BAAA;kCAAA;8CAAA;;CAxrBY,CAAf;;;;;;;AAosBAR,MAAMqK,QAAN,CACEiI,OAAO1T,SADT,EAEE,YAAY;SACH,KAAKgU,IAAL,CAAU,QAAV,CAAP;CAHJ,EAKE,UAAU1T,KAAV,EAAiB;OACV0K,IAAL,CAAU,QAAV,EAAoB1K,KAApB;CANJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACh2BO,SAASkO,IAAT,CAAe9H,CAAf,EAAkBC,CAAlB,EAAqBkP,QAArB,EAA+B;;;;MAIhCnP,MAAMC,CAAV,EAAa;WACJ,CAAP;;MAEEkP,QAAJ,EAAc;QACRA,SAASnP,CAAT,CAAJ;QACImP,SAASlP,CAAT,CAAJ;;MAEGD,MAAM,IAAN,IAAcC,MAAM,IAArB,IAA+BD,MAAMjF,SAAN,IAAmBkF,MAAMlF,SAA5D,EAAwE;WAC/D,CAAC,CAAR;;;MAGEiF,MAAM,IAAN,IAAcA,MAAMjF,SAAxB,EAAmC;WAC1B,CAAC,CAAR;;;MAGEkF,MAAM,IAAN,IAAcA,MAAMlF,SAAxB,EAAmC;WAC1B,CAAP;;;MAGEiF,IAAIC,CAAR,EAAW;WACF,CAAC,CAAR;;;MAGED,IAAIC,CAAR,EAAW;WACF,CAAP;;;SAGK,CAAP;;;AAGF,AAAO,SAASmP,QAAT,CAAmBpN,KAAnB,EAA0BvG,KAA1B,EAAiC7B,KAAjC,EAAwC;QACvCuC,MAAN,CAAaV,KAAb,EAAoB,CAApB,EAAuB7B,KAAvB;SACOoI,KAAP;;;AAGF,AAAO,SAASqN,QAAT,CAAmBrN,KAAnB,EAA0BvG,KAA1B,EAAiC;QAChCU,MAAN,CAAaV,KAAb,EAAoB,CAApB;SACOuG,KAAP;;;AAGF,AAAO,SAASsN,YAAT,CAAuBtN,KAAvB,EAA8BpI,KAA9B,EAAqCyK,KAArC,EAA4C;MAC7CkL,KAAK,CAAT;MACIC,KAAKxN,MAAM3F,MAAf;MACIoT,iBAAJ;MACIC,YAAJ;;SAEOH,KAAKC,EAAZ,EAAgB;UACP,CAACD,KAAKC,EAAN,IAAY,CAAb,GAAkB,CAAxB;eACW1H,KAAKlO,KAAL,EAAYoI,MAAM0N,GAAN,CAAZ,EAAwBrL,KAAxB,CAAX;QACIoL,aAAa,CAAjB,EAAoB;aACX;eACE,IADF;eAEEC;OAFT;KADF,MAKO,IAAID,WAAW,CAAf,EAAkB;WAClBC,GAAL;KADK,MAEA;WACAA,MAAM,CAAX;;;;SAIG;WACE,KADF;WAEEF;GAFT;;;ACjEF;;;;;;;;;;;;;;;;;;;AAmBA,AAGe,SAASG,KAAT,CAAgBC,SAAhB,EAA2B1U,IAA3B,EAAiC;QACxCuG,cAAN,CAAqB,IAArB,EAA2BkO,KAA3B;gBACcC,YAAY,EAA1B;;MAEI,CAAClV,MAAM2D,OAAN,CAAcuR,SAAd,CAAL,EAA+B;UACvB,IAAIpP,KAAJ,CAAU,6BAAV,CAAN;;;WAGOtF,OAAO,EAAhB;OACK0U,SAAL,GAAiBA,SAAjB;OACKC,WAAL,GAAmB3U,KAAK2U,WAAxB;OACKV,QAAL,GAAgBjU,KAAKiU,QAArB;OACKW,OAAL,GAAe,IAAf;OACKjT,IAAL,GAAY,EAAZ;OACKkT,MAAL,GAAc,EAAd;;;AAGFrV,MAAMqH,sBAAN,CAA6B4N,MAAMrW,SAAnC,EAA8C;OAAA,eACrC6O,OADqC,EAC5BvO,KAD4B,EACrB;QACjB,CAACc,MAAM2D,OAAN,CAAc8J,OAAd,CAAL,EAA6B;gBACjB,CAACA,OAAD,CAAV;;;QAGE1N,MAAM0N,QAAQpH,KAAR,MAAmBhG,SAA7B;QACIiV,MAAMV,aAAa,KAAKzS,IAAlB,EAAwBpC,GAAxB,CAAV;;QAEI0N,QAAQ9L,MAAR,KAAmB,CAAvB,EAA0B;UACpB2T,IAAIC,KAAR,EAAe;YACTC,eAAeZ,aAAa,KAAKS,MAAL,CAAYC,IAAIvU,KAAhB,CAAb,EAAqC7B,KAArC,EAA4C,KAAKuV,QAAjD,CAAnB;YACI,CAACe,aAAaD,KAAlB,EAAyB;mBACd,KAAKF,MAAL,CAAYC,IAAIvU,KAAhB,CAAT,EAAiCyU,aAAazU,KAA9C,EAAqD7B,KAArD;;OAHJ,MAKO;iBACI,KAAKiD,IAAd,EAAoBmT,IAAIvU,KAAxB,EAA+BhB,GAA/B;iBACS,KAAKsV,MAAd,EAAsBC,IAAIvU,KAA1B,EAAiC,CAAC7B,KAAD,CAAjC;;KARJ,MAUO;UACDoW,IAAIC,KAAR,EAAe;aACRF,MAAL,CAAYC,IAAIvU,KAAhB,EAAuBuI,GAAvB,CAA2BmE,OAA3B,EAAoCvO,KAApC;OADF,MAEO;iBACI,KAAKiD,IAAd,EAAoBmT,IAAIvU,KAAxB,EAA+BhB,GAA/B;YACI0V,WAAW,IAAIR,KAAJ,CAAU,EAAV,EAAc,EAAER,UAAU,KAAKA,QAAjB,EAAd,CAAf;iBACSnL,GAAT,CAAamE,OAAb,EAAsBvO,KAAtB;iBACS,KAAKmW,MAAd,EAAsBC,IAAIvU,KAA1B,EAAiC0U,QAAjC;;;GA1BsC;OAAA,eA+BrChI,OA/BqC,EA+B5B;QACV,CAACzN,MAAM2D,OAAN,CAAc8J,OAAd,CAAL,EAA6B;gBACjB,CAACA,OAAD,CAAV;;;QAGE1N,MAAM0N,QAAQpH,KAAR,MAAmBhG,SAA7B;QACIiV,MAAMV,aAAa,KAAKzS,IAAlB,EAAwBpC,GAAxB,CAAV;;QAEI0N,QAAQ9L,MAAR,KAAmB,CAAvB,EAA0B;UACpB2T,IAAIC,KAAR,EAAe;YACT,KAAKF,MAAL,CAAYC,IAAIvU,KAAhB,EAAuBqU,OAA3B,EAAoC;iBAC3B,KAAKC,MAAL,CAAYC,IAAIvU,KAAhB,EAAuB4M,MAAvB,EAAP;SADF,MAEO;iBACE,KAAK0H,MAAL,CAAYC,IAAIvU,KAAhB,EAAuBQ,KAAvB,EAAP;;OAJJ,MAMO;eACE,EAAP;;KARJ,MAUO;UACD+T,IAAIC,KAAR,EAAe;eACN,KAAKF,MAAL,CAAYC,IAAIvU,KAAhB,EAAuBgJ,GAAvB,CAA2B0D,OAA3B,CAAP;OADF,MAEO;eACE,EAAP;;;GArDsC;QAAA,kBA0DpCjN,IA1DoC,EA0D9B;aACHA,OAAO,EAAhB;QACIkV,UAAU,EAAd;QACML,SAAS,KAAKA,MAApB;QACI7U,KAAKmV,KAAL,KAAe,MAAnB,EAA2B;WACpB,IAAIjU,IAAI2T,OAAO1T,MAAP,GAAgB,CAA7B,EAAgCD,KAAK,CAArC,EAAwCA,GAAxC,EAA6C;YACrCxC,QAAQmW,OAAO3T,CAAP,CAAd;YACIxC,MAAMkW,OAAV,EAAmB;oBACPM,QAAQhI,MAAR,CAAexO,MAAMyO,MAAN,CAAanN,IAAb,CAAf,CAAV;SADF,MAEO;oBACKkV,QAAQhI,MAAR,CAAexO,KAAf,CAAV;;;KANN,MASO;WACA,IAAIwC,KAAI,CAAb,EAAgBA,KAAI2T,OAAO1T,MAA3B,EAAmCD,IAAnC,EAAwC;YAChCxC,SAAQmW,OAAO3T,EAAP,CAAd;YACIxC,OAAMkW,OAAV,EAAmB;oBACPM,QAAQhI,MAAR,CAAexO,OAAMyO,MAAN,CAAanN,IAAb,CAAf,CAAV;SADF,MAEO;oBACKkV,QAAQhI,MAAR,CAAexO,MAAf,CAAV;;;;WAICwW,OAAP;GAjF0C;UAAA,oBAoFlCE,EApFkC,EAoF9BjV,OApF8B,EAoFrB;SAChB0U,MAAL,CAAYvV,OAAZ,CAAoB,UAAUZ,KAAV,EAAiB;UAC/BA,MAAMkW,OAAV,EAAmB;cACXS,QAAN,CAAeD,EAAf,EAAmBjV,OAAnB;OADF,MAEO;cACCb,OAAN,CAAc8V,EAAd,EAAkBjV,OAAlB;;KAJJ;GArF0C;SAAA,mBA8FnC4L,QA9FmC,EA8FzBC,SA9FyB,EA8FdhM,IA9Fc,EA8FR;aACzBA,OAAO,EAAhB;QACI,CAACR,MAAM2D,OAAN,CAAc4I,QAAd,CAAL,EAA8B;iBACjB,CAACA,QAAD,CAAX;;QAEE,CAACvM,MAAM2D,OAAN,CAAc6I,SAAd,CAAL,EAA+B;kBACjB,CAACA,SAAD,CAAZ;;UAEInL,MAAN,CAAab,IAAb,EAAmB;qBACF,IADE;sBAED,KAFC;aAGVH,SAHU;cAIT;KAJV;;QAOIqV,UAAU,KAAKI,QAAL,CAAcvJ,QAAd,EAAwBC,SAAxB,EAAmChM,IAAnC,CAAd;;QAEIA,KAAK+M,KAAT,EAAgB;aACPmI,QAAQnU,KAAR,CAAcf,KAAK8M,MAAnB,EAA2B9M,KAAK+M,KAAL,GAAa/M,KAAK8M,MAA7C,CAAP;KADF,MAEO;aACEoI,QAAQnU,KAAR,CAAcf,KAAK8M,MAAnB,CAAP;;GAlHwC;UAAA,oBAsHlCf,QAtHkC,EAsHxBC,SAtHwB,EAsHbhM,IAtHa,EAsHP;QAC/BkV,UAAU,EAAd;;QAEIK,UAAUxJ,SAASlG,KAAT,EAAd;QACI2P,WAAWxJ,UAAUnG,KAAV,EAAf;;QAEIiP,YAAJ;;QAEIS,YAAY1V,SAAhB,EAA2B;YACnBuU,aAAa,KAAKzS,IAAlB,EAAwB4T,OAAxB,CAAN;KADF,MAEO;YACC;eACG,KADH;eAEG;OAFT;;;QAMExJ,SAAS5K,MAAT,KAAoB,CAAxB,EAA2B;UACrB2T,IAAIC,KAAJ,IAAa/U,KAAKyV,aAAL,KAAuB,KAAxC,EAA+C;YACzClV,KAAJ,IAAa,CAAb;;;WAGG,IAAIW,IAAI4T,IAAIvU,KAAjB,EAAwBW,IAAI,KAAKS,IAAL,CAAUR,MAAtC,EAA8CD,KAAK,CAAnD,EAAsD;YAChDsU,aAAa3V,SAAjB,EAA4B;cACtBG,KAAK0V,cAAT,EAAyB;gBACnB,KAAK/T,IAAL,CAAUT,CAAV,IAAesU,QAAnB,EAA6B;;;WAD/B,MAEO;gBACD,KAAK7T,IAAL,CAAUT,CAAV,KAAgBsU,QAApB,EAA8B;;;;;;YAI9B,KAAKX,MAAL,CAAY3T,CAAZ,EAAe0T,OAAnB,EAA4B;oBAChBM,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,CAAZ,EAAeiM,MAAf,EAAf,CAAV;SADF,MAEO;oBACK+H,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,CAAZ,CAAf,CAAV;;;YAGElB,KAAK+M,KAAT,EAAgB;cACVmI,QAAQ/T,MAAR,IAAmBnB,KAAK+M,KAAL,GAAa/M,KAAK8M,MAAzC,EAAkD;;;;;KArBxD,MA0BO;WACA,IAAI5L,MAAI4T,IAAIvU,KAAjB,EAAwBW,MAAI,KAAKS,IAAL,CAAUR,MAAtC,EAA8CD,OAAK,CAAnD,EAAsD;YAChDyU,UAAU,KAAKhU,IAAL,CAAUT,GAAV,CAAd;YACIyU,UAAUH,QAAd,EAAwB;;;;YAEpB,KAAKX,MAAL,CAAY3T,GAAZ,EAAe0T,OAAnB,EAA4B;cACtBe,YAAYJ,OAAhB,EAAyB;sBACbL,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,GAAZ,EAAeoU,QAAf,CAAwB9V,MAAM4D,IAAN,CAAW2I,QAAX,CAAxB,EAA8CC,UAAUtK,GAAV,CAAc,YAAY;qBAAS7B,SAAP;aAA5B,CAA9C,EAA+FG,IAA/F,CAAf,CAAV;WADF,MAEO,IAAI2V,YAAYH,QAAhB,EAA0B;sBACrBN,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,GAAZ,EAAeoU,QAAf,CAAwBvJ,SAASrK,GAAT,CAAa,YAAY;qBAAS7B,SAAP;aAA3B,CAAxB,EAAwEL,MAAM4D,IAAN,CAAW4I,SAAX,CAAxE,EAA+FhM,IAA/F,CAAf,CAAV;WADK,MAEA;sBACKkV,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,GAAZ,EAAeiM,MAAf,EAAf,CAAV;;SANJ,MAQO;oBACK+H,QAAQhI,MAAR,CAAe,KAAK2H,MAAL,CAAY3T,GAAZ,CAAf,CAAV;;;YAGElB,KAAK+M,KAAT,EAAgB;cACVmI,QAAQ/T,MAAR,IAAmBnB,KAAK+M,KAAL,GAAa/M,KAAK8M,MAAzC,EAAkD;;;;;;;QAOpD9M,KAAK+M,KAAT,EAAgB;aACPmI,QAAQnU,KAAR,CAAc,CAAd,EAAiBf,KAAK+M,KAAL,GAAa/M,KAAK8M,MAAnC,CAAP;KADF,MAEO;aACEoI,OAAP;;GA7LwC;MAAA,kBAiMpC;QACF,KAAKL,MAAL,CAAY1T,MAAhB,EAAwB;UAClB,KAAK0T,MAAL,CAAY,CAAZ,EAAeD,OAAnB,EAA4B;eACnB,KAAKC,MAAL,CAAY,CAAZ,EAAee,IAAf,EAAP;OADF,MAEO;eACE,KAAKf,MAAL,CAAY,CAAZ,CAAP;;;WAGG,EAAP;GAzM0C;OAAA,mBA4MnC;SACFlT,IAAL,GAAY,EAAZ;SACKkT,MAAL,GAAc,EAAd;GA9M0C;cAAA,wBAiN9BpK,IAjN8B,EAiNxB;QACdwC,UAAU,KAAKyH,SAAL,CAAehT,GAAf,CAAmB,UAAUyH,KAAV,EAAiB;UAC5C3J,MAAMM,UAAN,CAAiBqJ,KAAjB,CAAJ,EAA6B;eACpBA,MAAMsB,IAAN,KAAe5K,SAAtB;OADF,MAEO;eACE4K,KAAKtB,KAAL,KAAetJ,SAAtB;;KAJU,CAAd;SAOKiJ,GAAL,CAASmE,OAAT,EAAkBxC,IAAlB;GAzN0C;cAAA,wBA4N9BA,IA5N8B,EA4NxB;;;QACdlI,gBAAJ;QACMsT,WAAW,KAAK5B,QAAL,CAAcxJ,IAAd,MAAwB5K,SAAzC;SACKgV,MAAL,CAAYvV,OAAZ,CAAoB,UAACZ,KAAD,EAAQwC,CAAR,EAAc;UAC5BxC,MAAMkW,OAAV,EAAmB;YACblW,MAAMoX,YAAN,CAAmBrL,IAAnB,CAAJ,EAA8B;cACxB/L,MAAMiD,IAAN,CAAWR,MAAX,KAAsB,CAA1B,EAA6B;qBAClB,MAAKQ,IAAd,EAAoBT,CAApB;qBACS,MAAK2T,MAAd,EAAsB3T,CAAtB;;oBAEQ,IAAV;iBACO,KAAP;;OAPJ,MASO;YACD8T,eAAe,EAAnB;YACI,MAAKrT,IAAL,CAAUT,CAAV,MAAiBrB,SAAjB,IAA8B,CAACgW,QAAnC,EAA6C;eACtC,IAAIE,IAAIrX,MAAMyC,MAAN,GAAe,CAA5B,EAA+B4U,KAAK,CAApC,EAAuCA,GAAvC,EAA4C;gBACtCrX,MAAMqX,CAAN,MAAatL,IAAjB,EAAuB;6BACN;uBACN,IADM;uBAENsL;eAFT;;;;SAHN,MAUO,IAAIF,QAAJ,EAAc;yBACJzB,aAAa1V,KAAb,EAAoB+L,IAApB,EAA0B,MAAKwJ,QAA/B,CAAf;;YAEEe,aAAaD,KAAjB,EAAwB;mBACbrW,KAAT,EAAgBsW,aAAazU,KAA7B;cACI7B,MAAMyC,MAAN,KAAiB,CAArB,EAAwB;qBACb,MAAKQ,IAAd,EAAoBT,CAApB;qBACS,MAAK2T,MAAd,EAAsB3T,CAAtB;;oBAEQ,IAAV;iBACO,KAAP;;;KAhCN;WAoCOqB,UAAUkI,IAAV,GAAiB5K,SAAxB;GAnQ0C;cAAA,wBAsQ9B4K,IAtQ8B,EAsQxB;QACZlI,UAAU,KAAKuT,YAAL,CAAkBrL,IAAlB,CAAhB;QACIlI,YAAY1C,SAAhB,EAA2B;WACpBmW,YAAL,CAAkBvL,IAAlB;;;CAzQN;;ICjCQkH,iBAAmBG,SAAnBH;;;AAER,IAAMnU,WAAS,YAAf;;AAEA,IAAMyY,sBAAsB;;;;;;;;;iBASX,IATW;;;;;;;;;oBAkBR,IAlBQ;;;;;;;;;;;eA6Bb,IA7Ba;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA2Dd;;;;;;;;;;;;;;;;;;;;;;;;;;;CA3Dd,CAuFA,SAASC,UAAT,CAAqB7G,OAArB,EAA8BrP,IAA9B,EAAoC;QAC5BuG,cAAN,CAAqB,IAArB,EAA2B2P,UAA3B;cACUpX,IAAV,CAAe,IAAf,EAAqBkB,IAArB;;MAEIqP,WAAW,CAAC7P,MAAM2D,OAAN,CAAckM,OAAd,CAAhB,EAAwC;WAC/BA,OAAP;cACU,EAAV;;MAEE7P,MAAM6H,QAAN,CAAerH,IAAf,CAAJ,EAA0B;WACjB,EAAE6O,aAAa7O,IAAf,EAAP;;;;cAIUqP,UAAU,EAAtB;WACSrP,OAAO,EAAhB;;SAEOgC,gBAAP,CAAwB,IAAxB,EAA8B;;;;;;;;;;;;;;;;;;;;;;;YAuBpB;aACCnC,SADD;gBAEI;KAzBgB;;gBA4BhB;aACHA,SADG;gBAEA;;GA9Bd;;;QAmCMgB,MAAN,CAAa,IAAb,EAAmBb,IAAnB;;QAEMa,MAAN,CAAa,IAAb,EAAmBrB,MAAM4D,IAAN,CAAW6S,mBAAX,CAAnB;;MAEI,CAAC,KAAKE,UAAV,EAAsB;SACfA,UAAL,GAAkB5L,OAAlB;;;MAGIsE,cAAc,KAAK6B,QAAL,EAApB;;SAEO1O,gBAAP,CAAwB,IAAxB,EAA8B;;;;;;;WAOrB;aACE,IAAIyS,KAAJ,CAAU,CAAC5F,WAAD,CAAV,EAAyB;gBAAA,oBACpBrI,GADoB,EACf;iBACNhH,MAAM+J,GAAN,CAAU/C,GAAV,EAAeqI,WAAf,CAAP;;OAFG;KARmB;;;;;;;;aAqBnB;aACA;;GAtBX;;;MA2BIrP,MAAM+B,QAAN,CAAe8N,OAAf,KAA4B7P,MAAM2D,OAAN,CAAckM,OAAd,KAA0BA,QAAQlO,MAAlE,EAA2E;SACpEiN,GAAL,CAASiB,OAAT;;;;AAIJ,mBAAe3F,YAAUD,MAAV,CAAiB;eACjByM,UADiB;;;;;;;;;;gBAAA,4BAWL;QACnB,KAAKE,gBAAT,EAA2B;WACpBC,IAAL;;GAb0B;;;;;;;;;;;;;;;;;;;;;;KAAA,eAoCzBhH,OApCyB,EAoChBrP,IApCgB,EAoCV;;;;aAETA,OAAO,EAAhB;;;UAGMgT,CAAN,CAAQhT,IAAR,EAAc,IAAd;cACU,KAAKsW,SAAL,CAAejH,OAAf,EAAwBrP,IAAxB,KAAiCqP,OAA3C;;;QAGIkH,WAAW,KAAf;QACM1H,cAAc,KAAK6B,QAAL,EAApB;QACI,CAAClR,MAAM2D,OAAN,CAAckM,OAAd,CAAL,EAA6B;UACvB7P,MAAM+B,QAAN,CAAe8N,OAAf,CAAJ,EAA6B;kBACjB,CAACA,OAAD,CAAV;mBACW,IAAX;OAFF,MAGO;cACC7P,MAAMmD,GAAN,CAAanF,QAAb,WAA2B,SAA3B,EAAsC,GAAtC,EAA2C,iBAA3C,EAA8D6R,OAA9D,CAAN;;;;;;;;cAQMA,QAAQ3N,GAAR,CAAY,UAACqF,MAAD,EAAY;UAC5BgJ,KAAK,MAAKW,QAAL,CAAc3J,MAAd,CAAT;;UAEM5C,WAAW4L,OAAOlQ,SAAP,GAAmBkQ,EAAnB,GAAwB,MAAKxG,GAAL,CAASwG,EAAT,CAAzC;;;UAGIhJ,WAAW5C,QAAf,EAAyB;eAChBA,QAAP;;;UAGEA,QAAJ,EAAc;;;YAGNqS,aAAaxW,KAAKwW,UAAL,IAAmB,MAAKA,UAA3C;YACIA,eAAe,OAAf,IAA0BA,eAAe,SAAzC,IAAsDA,eAAe,MAAzE,EAAiF;gBACzEhX,MAAMmD,GAAN,CAAanF,QAAb,WAA2B,iBAA3B,EAA8C,GAA9C,EAAmD,+BAAnD,EAAoFgZ,UAApF,EAAgG,IAAhG,CAAN;;YAEIC,qBAAqBtS,SAASiO,IAAT,CAAcT,cAAd,CAA3B;YACI3R,KAAK+R,UAAT,EAAqB;;mBAEV3I,IAAT,CAAcuI,cAAd,EAA8B,IAA9B;;YAEE6E,eAAe,OAAnB,EAA4B;gBACpBnS,SAAN,CAAgBF,QAAhB,EAA0B4C,MAA1B;SADF,MAEO,IAAIyP,eAAe,SAAnB,EAA8B;gBAC7B5W,MAAN,CAAauE,QAAb,EAAuB,UAACzF,KAAD,EAAQa,GAAR,EAAgB;gBACjCA,QAAQsP,WAAR,IAAuB9H,OAAOxH,GAAP,MAAgBM,SAA3C,EAAsD;uBAC3CN,GAAT,IAAgBM,SAAhB;;WAFJ;mBAKSiJ,GAAT,CAAa/B,MAAb;SApBU;;YAuBR/G,KAAK+R,UAAT,EAAqB;;mBAEV3I,IAAT,CAAcuI,cAAd,EAA8B8E,kBAA9B;;iBAEOtS,QAAT;YACInE,KAAK0W,aAAL,IAAsBlX,MAAMM,UAAN,CAAiBiH,OAAO6M,MAAxB,CAA1B,EAA2D;iBAClDA,MAAP;;;cAGG+C,aAAL,CAAmB5P,MAAnB;OAhCF,MAiCO;;;;iBAII,MAAKC,MAAL,GAAc,MAAKA,MAAL,CAAYkJ,YAAZ,CAAyBnJ,MAAzB,EAAiC/G,IAAjC,CAAd,GAAuD+G,MAAhE;cACKxG,KAAL,CAAWyV,YAAX,CAAwBjP,MAAxB;cACMnH,MAAN,CAAa,MAAKgX,OAAlB,EAA2B,UAAUrW,KAAV,EAAiBqC,IAAjB,EAAuB;gBAC1CoT,YAAN,CAAmBjP,MAAnB;SADF;YAGIA,UAAUvH,MAAMM,UAAN,CAAiBiH,OAAO8P,EAAxB,CAAd,EAA2C;iBAClCA,EAAP,CAAU,KAAV,EAAiB,MAAKC,cAAtB;;;aAGG/P,MAAP;KAxDQ,CAAV;;QA2DM/C,SAASuS,WAAWlH,QAAQ,CAAR,CAAX,GAAwBA,OAAvC;QACI,CAACrP,KAAKgU,MAAV,EAAkB;WACXqC,IAAL,CAAU,KAAV,EAAiBrS,MAAjB;;WAEK,KAAK+S,QAAL,CAAc1H,OAAd,EAAuBrP,IAAvB,EAA6BgE,MAA7B,KAAwCA,MAA/C;GA3H4B;;;;;;;;;;;;;UAAA,sBAwIlB,EAxIkB;;;;;;;;;;;;;aAAA,yBAoJf,EApJe;;;;;;;;;;;;;;gBAAA,4BAiKZ,EAjKY;;;;;;;;;;;;;WAAA,uBA6KjB,EA7KiB;;;;;;;;;;;cAAA,0BAuLd,EAvLc;;;;;;;;;;;iBAAA,6BAiMX,EAjMW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBA+NrB+H,QA/NqB,EA+NXC,SA/NW,EA+NAhM,IA/NA,EA+NM;WAC3B,KAAK0M,KAAL,GAAaR,OAAb,CAAqBH,QAArB,EAA+BC,SAA/B,EAA0ChM,IAA1C,EAAgDgX,GAAhD,EAAP;GAhO4B;;;;;;;;;;;;;;;;;;;;;aAAA,uBAqPjBpU,IArPiB,EAqPX8R,SArPW,EAqPA1U,IArPA,EAqPM;;;QAC9BR,MAAM6H,QAAN,CAAezE,IAAf,KAAwB8R,cAAc7U,SAA1C,EAAqD;kBACvC,CAAC+C,IAAD,CAAZ;;aAEO5C,OAAO,EAAhB;SACKiU,QAAL,KAAkBjU,KAAKiU,QAAL,GAAgB,UAACzN,GAAD;aAAS,OAAKkK,QAAL,CAAclK,GAAd,CAAT;KAAlC;QACMjG,QAAQ,KAAKqW,OAAL,CAAahU,IAAb,IAAqB,IAAI6R,KAAJ,CAAUC,SAAV,EAAqB1U,IAArB,CAAnC;SACKO,KAAL,CAAW8U,QAAX,CAAoB9U,MAAMyV,YAA1B,EAAwCzV,KAAxC;GA5P4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBA0StBmM,KA1SsB,EA0SfvM,OA1Se,EA0SN;WACf,KAAKuM,KAAL,GAAahI,MAAb,CAAoBgI,KAApB,EAA2BvM,OAA3B,EAAoC6W,GAApC,EAAP;GA3S4B;;;;;;;;;;;;;;;;;SAAA,mBA4TrB5B,EA5TqB,EA4TjBjV,OA5TiB,EA4TR;SACfI,KAAL,CAAW8U,QAAX,CAAoBD,EAApB,EAAwBjV,OAAxB;GA7T4B;;;;;;;;;;;KAAA,eAwUzB4P,EAxUyB,EAwUrB;QACDkH,YAAYlH,OAAOlQ,SAAP,GAAmB,EAAnB,GAAwB,KAAK6M,KAAL,GAAanD,GAAb,CAAiBwG,EAAjB,EAAqBiH,GAArB,EAA1C;WACOC,UAAU9V,MAAV,GAAmB8V,UAAU,CAAV,CAAnB,GAAkCpX,SAAzC;GA1U4B;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,oBAoWb;;;WACR,eAAK6M,KAAL,IAAaS,MAAb,0BAA6B6J,GAA7B,EAAP;GArW4B;;;;;;;;;;;UAAA,oBAgXpBpU,IAhXoB,EAgXd;QACRrC,QAAQqC,OAAO,KAAKgU,OAAL,CAAahU,IAAb,CAAP,GAA4B,KAAKrC,KAA/C;QACI,CAACA,KAAL,EAAY;YACJf,MAAMmD,GAAN,CAAanF,QAAb,gBAAgCoF,IAAhC,EAAsC,GAAtC,EAA2C,OAA3C,CAAN;;WAEKrC,KAAP;GArX4B;;;;;;;;;;;;;;;;OAAA,iBAqYvB8M,GArYuB,EAqYlB;WACH,KAAKX,KAAL,GAAaK,KAAb,CAAmBM,GAAnB,EAAwB2J,GAAxB,EAAP;GAtY4B;;;;;;;;;;;;;;;;;KAAA,eAuZzB5B,EAvZyB,EAuZrBjV,OAvZqB,EAuZZ;QACVsK,OAAO,EAAb;SACKlK,KAAL,CAAW8U,QAAX,CAAoB,UAAU3W,KAAV,EAAiB;WAC9BqF,IAAL,CAAUqR,GAAGtW,IAAH,CAAQqB,OAAR,EAAiBzB,KAAjB,CAAV;KADF;WAGO+L,IAAP;GA5Z4B;;;;;;;;;;;;;SAAA,mBAyarBgD,QAzaqB,EAyaF;sCAAN9H,IAAM;UAAA;;;QACpB8E,OAAO,EAAb;SACKlK,KAAL,CAAW8U,QAAX,CAAoB,UAAUtO,MAAV,EAAkB;WAC/BhD,IAAL,CAAUgD,OAAO0G,QAAP,gBAAoB9H,IAApB,CAAV;KADF;WAGO8E,IAAP;GA9a4B;;;;;;;;;;;OAAA,iBAybvBzK,IAzbuB,EAybjB;WACJ,KAAKkX,SAAL,CAAe,KAAKrH,OAAL,EAAf,EAA+B7P,IAA/B,CAAP;GA1b4B;;;;;;;;;;;;;;;;;;;OAAA,mBA6crB;QACDmX,OAAO,KAAKhB,UAAlB;WACO,IAAIgB,IAAJ,CAAS,IAAT,CAAP;GA/c4B;;;;;;;;;;;;;;UAAA,oBA6dpBpQ,MA7doB,EA6dZ;QACZA,MAAJ,EAAY;aACHvH,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB,KAAK2J,QAAL,EAAlB,CAAP;;WAEK,KAAK1J,MAAL,GAAc,KAAKA,MAAL,CAAY6H,WAA1B,GAAwC,KAAKA,WAApD;GAje4B;;;;;;;;;;;;;;;;;QAAA,kBAkftBuG,EAlfsB,EAkflBgC,YAlfkB,EAkfJ;QAClB3M,OAAO,KAAK0C,MAAL,EAAb;WACO1C,KAAK/B,MAAL,CAAY0M,EAAZ,EAAgBgC,YAAhB,CAAP;GApf4B;;;;;;;;;;;;;QAAA,kBAigBtBC,UAjgBsB,EAigBVrX,IAjgBU,EAigBJ;;aAEfA,OAAO,EAAhB;SACKsX,YAAL,CAAkBD,UAAlB,EAA8BrX,IAA9B;QACI+G,SAASvH,MAAMiU,MAAN,CAAa4D,UAAb,IAA2B,KAAK9N,GAAL,CAAS8N,UAAT,CAA3B,GAAkDA,UAA/D;;;QAGI7X,MAAM+B,QAAN,CAAewF,MAAf,CAAJ,EAA4B;eACjB,KAAKxG,KAAL,CAAWuV,YAAX,CAAwB/O,MAAxB,CAAT;UACIA,MAAJ,EAAY;cACJnH,MAAN,CAAa,KAAKgX,OAAlB,EAA2B,UAAUrW,KAAV,EAAiBqC,IAAjB,EAAuB;gBAC1CkT,YAAN,CAAmB/O,MAAnB;SADF;YAGIvH,MAAMM,UAAN,CAAiBiH,OAAOwQ,GAAxB,CAAJ,EAAkC;iBACzBA,GAAP,CAAW,KAAX,EAAkB,KAAKT,cAAvB,EAAuC,IAAvC;cACI,CAAC9W,KAAKgU,MAAV,EAAkB;iBACXqC,IAAL,CAAU,QAAV,EAAoBtP,MAApB;;;;;WAKD,KAAKyQ,WAAL,CAAiBH,UAAjB,EAA6BrX,IAA7B,EAAmC+G,MAAnC,KAA8CA,MAArD;GAthB4B;;;;;;;;;;;;;;;;;WAAA,qBAuiBnB0Q,cAviBmB,EAuiBHzX,IAviBG,EAuiBG;;;;aAEtBA,OAAO,EAAhB;SACK0X,eAAL,CAAqBD,cAArB,EAAqCzX,IAArC;QACIqP,UAAU7P,MAAM2D,OAAN,CAAcsU,cAAd,IAAgCA,eAAe1W,KAAf,EAAhC,GAAyD,KAAK2D,MAAL,CAAY+S,cAAZ,CAAvE;;;QAGM7W,WAAWpB,MAAM2S,SAAN,CAAgBnS,IAAhB,CAAjB;aACSgU,MAAT,GAAkB,IAAlB;cACU3E,QACP3N,GADO,CACH,UAACqF,MAAD;aAAY,OAAK6L,MAAL,CAAY7L,MAAZ,EAAoBnG,QAApB,CAAZ;KADG,EAEP8D,MAFO,CAEA,UAACqC,MAAD;aAAYA,MAAZ;KAFA,CAAV;QAGI,CAAC/G,KAAKgU,MAAV,EAAkB;WACXqC,IAAL,CAAU,QAAV,EAAoBhH,OAApB;;WAEK,KAAKsI,cAAL,CAAoBF,cAApB,EAAoCzX,IAApC,EAA0CqP,OAA1C,KAAsDA,OAA7D;GAtjB4B;;;;;;;;;;;;;;;;MAAA,gBAskBxBhC,GAtkBwB,EAskBnB;WACF,KAAKX,KAAL,GAAaG,IAAb,CAAkBQ,GAAlB,EAAuB2J,GAAvB,EAAP;GAvkB4B;;;;;;;;;;;;;;QAAA,kBAqlBtBhX,IArlBsB,EAqlBhB;WACL,KAAK4X,OAAL,CAAa,QAAb,EAAuB5X,IAAvB,CAAP;GAtlB4B;;;;;;;;;;SAAA,mBAgmBrBA,IAhmBqB,EAgmBf;WACN,KAAKO,KAAL,CAAWgJ,GAAX,EAAP;GAjmB4B;;;;;;;;;;;;;;;;aAAA,uBAinBjBxC,MAjnBiB,EAinBT/G,IAjnBS,EAinBH;aAChBA,OAAO,EAAhB;SACKiM,QAAL,CAAcjM,KAAKO,KAAnB,EAA0BsX,YAA1B,CAAuC9Q,MAAvC;GAnnB4B;;;;;;;;;;;eAAA,yBA8nBfA,MA9nBe,EA8nBP;SAChBxG,KAAL,CAAWsX,YAAX,CAAwB9Q,MAAxB;UACMnH,MAAN,CAAa,KAAKgX,OAAlB,EAA2B,UAAUrW,KAAV,EAAiBqC,IAAjB,EAAuB;YAC1CiV,YAAN,CAAmB9Q,MAAnB;KADF;;CAhoBW,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3LA,IAAMvJ,WAAS,QAAf;;;;;;;;;;;;;AAaA,IAAMsa,QAAQ;SACLtY,MAAM2D,OADD;WAEH3D,MAAMuY,SAFH;WAGHvY,MAAMwY,SAHH;UAIJxY,MAAMyY,MAJF;UAKJzY,MAAM0I,QALF;UAMJ1I,MAAM+B,QANF;UAOJ/B,MAAM6H;;;;;CAPhB,CAaA,IAAM6Q,kBAAkB,SAAlBA,eAAkB,CAAUC,OAAV,EAAmBhN,IAAnB,EAAyB;MAC3CiN,MAAM,EAAV;MACID,OAAJ,EAAa;QACP3Y,MAAM0I,QAAN,CAAeiQ,OAAf,CAAJ,EAA6B;mBAChBA,OAAX;KADF,MAEO,IAAIhN,IAAJ,EAAU;mBACJgN,OAAX;KADK,MAEA;kBACKA,OAAV;;;SAGGC,GAAP;CAXF;;;;;AAiBA,IAAMC,WAAW,SAAXA,QAAW,CAAUrY,IAAV,EAAgB;WACtBA,OAAO,EAAhB;MACIb,OAAO,EAAX;MACMmZ,WAAWtY,KAAKb,IAAL,IAAa,EAA9B;WACSG,OAAT,CAAiB,UAAU6Y,OAAV,EAAmB;YAC1BD,gBAAgBC,OAAhB,EAAyBhZ,IAAzB,CAAR;GADF;UAGQ+Y,gBAAgBlY,KAAKwH,IAArB,EAA2BrI,IAA3B,CAAR;SACOA,IAAP;CARF;;;;;AAcA,IAAMoZ,YAAY,SAAZA,SAAY,CAAUC,MAAV,EAAkBC,QAAlB,EAA4BzY,IAA5B,EAAkC;SAC3C;sBAAA;YAEG,KAAKwY,MAFR;UAGCH,SAASrY,IAAT;GAHR;CADF;;;;;AAWA,IAAM0Y,WAAW,SAAXA,QAAW,CAAUF,MAAV,EAAkBC,QAAlB,EAA4BzY,IAA5B,EAAkC2Y,MAAlC,EAA0C;SAClD5U,IAAP,CAAYwU,UAAUC,MAAV,EAAkBC,QAAlB,EAA4BzY,IAA5B,CAAZ;CADF;;;;;AAOA,IAAM4Y,kBAAkB,SAAlBA,eAAkB,CAAUC,OAAV,EAAmBna,KAAnB,EAA0Boa,MAA1B,EAAkC9Y,IAAlC,EAAwC;MACxD+Y,MAAMD,OAAOD,OAAP,CAAZ;MACIna,MAAMyC,MAAN,GAAe4X,GAAnB,EAAwB;WACfR,UAAU7Z,MAAMyC,MAAhB,2BAA+C4X,GAA/C,EAAsD/Y,IAAtD,CAAP;;CAHJ;;;;;AAUA,IAAMgZ,kBAAkB,SAAlBA,eAAkB,CAAUH,OAAV,EAAmBna,KAAnB,EAA0Boa,MAA1B,EAAkC9Y,IAAlC,EAAwC;MACxDuN,MAAMuL,OAAOD,OAAP,CAAZ;MACIna,MAAMyC,MAAN,GAAeoM,GAAnB,EAAwB;WACfgL,UAAU7Z,MAAMyC,MAAhB,2BAA+CoM,GAA/C,EAAsDvN,IAAtD,CAAP;;CAHJ;;;;;;;AAYA,IAAMiZ,qBAAqB;;;;;;;;;;;;;;;;;OAAA,iBAiBlBva,KAjBkB,EAiBXoa,MAjBW,EAiBH9Y,IAjBG,EAiBG;QACtBkZ,YAAY,EAAhB;WACOC,KAAP,CAAa7Z,OAAb,CAAqB,UAAU8Z,OAAV,EAAmB;kBAC1BF,UAAUhM,MAAV,CAAiBsF,UAAS9T,KAAT,EAAgB0a,OAAhB,EAAyBpZ,IAAzB,KAAkC,EAAnD,CAAZ;KADF;WAGOkZ,UAAU/X,MAAV,GAAmB+X,SAAnB,GAA+BrZ,SAAtC;GAtBuB;;;;;;;;;;;;;;;;;;;OAAA,iBAyClBnB,KAzCkB,EAyCXoa,MAzCW,EAyCH9Y,IAzCG,EAyCG;QACtBqZ,YAAY,KAAhB;QACIH,YAAY,EAAhB;WACOI,KAAP,CAAaha,OAAb,CAAqB,UAAU8Z,OAAV,EAAmB;UAChCT,SAASnG,UAAS9T,KAAT,EAAgB0a,OAAhB,EAAyBpZ,IAAzB,CAAf;UACI2Y,MAAJ,EAAY;oBACEO,UAAUhM,MAAV,CAAiByL,MAAjB,CAAZ;OADF,MAEO;oBACO,IAAZ;;KALJ;WAQOU,YAAYxZ,SAAZ,GAAwBqZ,SAA/B;GApDuB;;;;;;;;;;;;cAAA,wBAgEXxa,KAhEW,EAgEJoa,MAhEI,EAgEI9Y,IAhEJ,EAgEU;;GAhEV;;;;;;;;;;;;;;;MAAA,iBAgFnBtB,KAhFmB,EAgFZoa,MAhFY,EAgFJ9Y,IAhFI,EAgFE;QACnBuZ,iBAAiBT,OAAO,MAAP,CAAvB;QACItZ,MAAMgJ,SAAN,CAAgB+Q,cAAhB,EAAgC,UAACxR,IAAD;aAAUvI,MAAMgF,SAAN,CAAgBuD,IAAhB,EAAsBrJ,KAAtB,CAAV;KAAhC,MAA4E,CAAC,CAAjF,EAAoF;aAC3E6Z,UAAU7Z,KAAV,eAA4B6a,eAAeC,IAAf,CAAoB,IAApB,CAA5B,QAA0DxZ,IAA1D,CAAP;;GAnFqB;;;;;;;;;;;;;;OAAA,iBAkGlBtB,KAlGkB,EAkGXoa,MAlGW,EAkGH9Y,IAlGG,EAkGG;aACjBA,OAAO,EAAhB;;QAEIyZ,QAAQX,OAAOW,KAAnB;QACId,SAAS,EAAb;QACMe,gBAAgBla,MAAM2D,OAAN,CAAcsW,KAAd,CAAtB;QACMtY,SAASzC,MAAMyC,MAArB;SACK,IAAIqG,OAAO,CAAhB,EAAmBA,OAAOrG,MAA1B,EAAkCqG,MAAlC,EAA0C;UACpCkS,aAAJ,EAAmB;;;gBAGTZ,OAAOW,KAAP,CAAajS,IAAb,CAAR;;WAEGA,IAAL,GAAYA,IAAZ;eACSmR,OAAOzL,MAAP,CAAcsF,UAAS9T,MAAM8I,IAAN,CAAT,EAAsBiS,KAAtB,EAA6BzZ,IAA7B,KAAsC,EAApD,CAAT;;WAEK2Y,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;GAlHuB;;;;;;;;;;;;;;;SAAA,mBAiIhBnB,KAjIgB,EAiIToa,MAjIS,EAiID9Y,IAjIC,EAiIK;;QAEtB2Z,UAAUb,OAAOa,OAAvB;;;;QAIMC,mBAAmBd,OAAOc,gBAAhC;QACI,QAAOlb,KAAP,yCAAOA,KAAP,eAAwBib,OAAxB,yCAAwBA,OAAxB,MAAmC,EAAEC,mBAAmBD,UAAUjb,KAA7B,GAAqCib,WAAWjb,KAAlD,CAAvC,EAAiG;aACxFkb,mBACHrB,UAAU7Z,KAAV,iCAA8Cib,OAA9C,EAAyD3Z,IAAzD,CADG,GAEHuY,UAAU7Z,KAAV,oBAAiCib,OAAjC,EAA4C3Z,IAA5C,CAFJ;;GAzIqB;;;;;;;;;;;;;;;UAAA,oBA2JftB,KA3Je,EA2JRoa,MA3JQ,EA2JA9Y,IA3JA,EA2JM;QACzBR,MAAM2D,OAAN,CAAczE,KAAd,CAAJ,EAA0B;aACjBka,gBAAgB,UAAhB,EAA4Bla,KAA5B,EAAmCoa,MAAnC,EAA2C9Y,IAA3C,CAAP;;GA7JqB;;;;;;;;;;;;;;;WAAA,qBA6KdtB,KA7Kc,EA6KPoa,MA7KO,EA6KC9Y,IA7KD,EA6KO;WACvB4Y,gBAAgB,WAAhB,EAA6Bla,KAA7B,EAAoCoa,MAApC,EAA4C9Y,IAA5C,CAAP;GA9KuB;;;;;;;;;;;;;;;eAAA,yBA6LVtB,KA7LU,EA6LHoa,MA7LG,EA6LK9Y,IA7LL,EA6LW;;QAE9B,CAACR,MAAM+B,QAAN,CAAe7C,KAAf,CAAL,EAA4B;QACtBmb,gBAAgBf,OAAOe,aAA7B;QACM1Y,SAAShD,OAAOwD,IAAP,CAAYjD,KAAZ,EAAmByC,MAAlC;QACIA,SAAS0Y,aAAb,EAA4B;aACnBtB,UAAUpX,MAAV,oBAAkC0Y,aAAlC,kBAA8D7Z,IAA9D,CAAP;;GAnMqB;;;;;;;;;;;;;;;SAAA,mBAmNhBtB,KAnNgB,EAmNToa,MAnNS,EAmND9Y,IAnNC,EAmNK;;QAEtB8Z,UAAUhB,OAAOgB,OAAvB;;;;QAIMC,mBAAmBjB,OAAOiB,gBAAhC;QACI,QAAOrb,KAAP,yCAAOA,KAAP,eAAwBob,OAAxB,yCAAwBA,OAAxB,MAAmC,EAAEC,mBAAmBrb,QAAQob,OAA3B,GAAqCpb,SAASob,OAAhD,CAAvC,EAAiG;aACxFC,mBACHxB,UAAU7Z,KAAV,iCAA8Cob,OAA9C,EAAyD9Z,IAAzD,CADG,GAEHuY,UAAU7Z,KAAV,oBAAiCob,OAAjC,EAA4C9Z,IAA5C,CAFJ;;GA3NqB;;;;;;;;;;;;;;;UAAA,oBA6OftB,KA7Oe,EA6ORoa,MA7OQ,EA6OA9Y,IA7OA,EA6OM;QACzBR,MAAM2D,OAAN,CAAczE,KAAd,CAAJ,EAA0B;aACjBsa,gBAAgB,UAAhB,EAA4Bta,KAA5B,EAAmCoa,MAAnC,EAA2C9Y,IAA3C,CAAP;;GA/OqB;;;;;;;;;;;;;;;WAAA,qBA+PdtB,KA/Pc,EA+PPoa,MA/PO,EA+PC9Y,IA/PD,EA+PO;WACvBgZ,gBAAgB,WAAhB,EAA6Bta,KAA7B,EAAoCoa,MAApC,EAA4C9Y,IAA5C,CAAP;GAhQuB;;;;;;;;;;;;;;;eAAA,yBA+QVtB,KA/QU,EA+QHoa,MA/QG,EA+QK9Y,IA/QL,EA+QW;;QAE9B,CAACR,MAAM+B,QAAN,CAAe7C,KAAf,CAAL,EAA4B;QACtBsb,gBAAgBlB,OAAOkB,aAA7B;QACM7Y,SAAShD,OAAOwD,IAAP,CAAYjD,KAAZ,EAAmByC,MAAlC;QACIA,SAAS6Y,aAAb,EAA4B;aACnBzB,UAAUpX,MAAV,oBAAkC6Y,aAAlC,kBAA8Dha,IAA9D,CAAP;;GArRqB;;;;;;;;;;;;;;;YAAA,sBAqSbtB,KArSa,EAqSNoa,MArSM,EAqSE9Y,IArSF,EAqSQ;QACzBia,aAAanB,OAAOmB,UAA1B;QACIza,MAAM0I,QAAN,CAAexJ,KAAf,CAAJ,EAA2B;UACpBA,QAAQub,UAAT,GAAuB,CAAvB,KAA6B,CAAjC,EAAoC;eAC3B1B,UAAU7Z,KAAV,kBAA+Bub,UAA/B,EAA6Cja,IAA7C,CAAP;;;GAzSmB;;;;;;;;;;;;;;;KAAA,eA0TpBtB,KA1ToB,EA0Tboa,MA1Ta,EA0TL9Y,IA1TK,EA0TC;QACpB,CAACwS,UAAS9T,KAAT,EAAgBoa,OAAOoB,GAAvB,EAA4Bla,IAA5B,CAAL,EAAwC;;aAE/BuY,UAAU,WAAV,EAAuB,oBAAvB,EAA6CvY,IAA7C,CAAP;;GA7TqB;;;;;;;;;;;;;;;OAAA,iBA6UlBtB,KA7UkB,EA6UXoa,MA7UW,EA6UH9Y,IA7UG,EA6UG;QACtBqZ,YAAY,KAAhB;QACIH,YAAY,EAAhB;WACOiB,KAAP,CAAa7a,OAAb,CAAqB,UAAU8Z,OAAV,EAAmB;UAChCT,SAASnG,UAAS9T,KAAT,EAAgB0a,OAAhB,EAAyBpZ,IAAzB,CAAf;UACI2Y,MAAJ,EAAY;oBACEO,UAAUhM,MAAV,CAAiByL,MAAjB,CAAZ;OADF,MAEO,IAAIU,SAAJ,EAAe;oBACR,CAACd,UAAU,6BAAV,EAAyC,wBAAzC,EAAmEvY,IAAnE,CAAD,CAAZ;oBACY,KAAZ;eACO,KAAP;OAHK,MAIA;oBACO,IAAZ;;KATJ;WAYOqZ,YAAYxZ,SAAZ,GAAwBqZ,SAA/B;GA5VuB;;;;;;;;;;;;;;;SAAA,mBA2WhBxa,KA3WgB,EA2WToa,MA3WS,EA2WD9Y,IA3WC,EA2WK;QACtBqK,UAAUyO,OAAOzO,OAAvB;QACI7K,MAAM6H,QAAN,CAAe3I,KAAf,KAAyB,CAACA,MAAMiF,KAAN,CAAY0G,OAAZ,CAA9B,EAAoD;aAC3CkO,UAAU7Z,KAAV,EAAiB2L,OAAjB,EAA0BrK,IAA1B,CAAP;;GA9WqB;;;;;;;;;;;;;;;;;YAAA,sBAgYbtB,KAhYa,EAgYNoa,MAhYM,EAgYE9Y,IAhYF,EAgYQ;aACtBA,OAAO,EAAhB;;QAEIR,MAAM2D,OAAN,CAAczE,KAAd,CAAJ,EAA0B;;;;;;;QAOpB0b,uBAAuBtB,OAAOsB,oBAAP,KAAgCva,SAAhC,GAA4C,IAA5C,GAAmDiZ,OAAOsB,oBAAvF;QACMf,YAAY,EAAlB;;;QAGMgB,aAAavB,OAAOuB,UAAP,IAAqB,EAAxC;;;QAGMC,oBAAoBxB,OAAOwB,iBAAP,IAA4B,EAAtD;QACI3B,SAAS,EAAb;;UAEM/Y,MAAN,CAAaya,UAAb,EAAyB,UAAUjB,OAAV,EAAmB5R,IAAnB,EAAyB;WAC3CA,IAAL,GAAYA,IAAZ;eACSmR,OAAOzL,MAAP,CAAcsF,UAAS9T,MAAM8I,IAAN,CAAT,EAAsB4R,OAAtB,EAA+BpZ,IAA/B,KAAwC,EAAtD,CAAT;gBACU+D,IAAV,CAAeyD,IAAf;KAHF;;QAMM+S,aAAa/a,MAAMgb,IAAN,CAAW9b,KAAX,EAAkB2a,SAAlB,CAAnB;UACMzZ,MAAN,CAAa0a,iBAAb,EAAgC,UAAUlB,OAAV,EAAmB/O,OAAnB,EAA4B;YACpDzK,MAAN,CAAa2a,UAAb,EAAyB,UAAUE,KAAV,EAAiBjT,IAAjB,EAAuB;YAC1CA,KAAK7D,KAAL,CAAW0G,OAAX,CAAJ,EAAyB;eAClB7C,IAAL,GAAYA,IAAZ;mBACSmR,OAAOzL,MAAP,CAAcsF,UAAS9T,MAAM8I,IAAN,CAAT,EAAsB4R,OAAtB,EAA+BpZ,IAA/B,KAAwC,EAAtD,CAAT;oBACU+D,IAAV,CAAeyD,IAAf;;OAJJ;KADF;QASM7F,OAAOxD,OAAOwD,IAAP,CAAYnC,MAAMgb,IAAN,CAAW9b,KAAX,EAAkB2a,SAAlB,CAAZ,CAAb;;QAEIe,yBAAyB,KAA7B,EAAoC;UAC9BzY,KAAKR,MAAT,EAAiB;YACTuZ,WAAW1a,KAAKwH,IAAtB;aACKA,IAAL,GAAY,EAAZ;oCAC0B7F,KAAK6X,IAAL,CAAU,IAAV,CAA1B,EAA6C,iBAA7C,EAAgExZ,IAAhE,EAAsE2Y,MAAtE;aACKnR,IAAL,GAAYkT,QAAZ;;KALJ,MAOO,IAAIlb,MAAM+B,QAAN,CAAe6Y,oBAAf,CAAJ,EAA0C;;WAE1C9a,OAAL,CAAa,UAAUkI,IAAV,EAAgB;aACtBA,IAAL,GAAYA,IAAZ;iBACSmR,OAAOzL,MAAP,CAAcsF,UAAS9T,MAAM8I,IAAN,CAAT,EAAsB4S,oBAAtB,EAA4Cpa,IAA5C,KAAqD,EAAnE,CAAT;OAFF;;WAKK2Y,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;GApbuB;;;;;;;;;;;;;;;UAAA,oBAmcfnB,KAnce,EAmcRoa,MAncQ,EAmcA9Y,IAncA,EAmcM;aACpBA,OAAO,EAAhB;QACM2a,WAAW7B,OAAO6B,QAAxB;QACIhC,SAAS,EAAb;QACI,CAAC3Y,KAAK4a,YAAV,EAAwB;eACbtb,OAAT,CAAiB,UAAUkI,IAAV,EAAgB;YAC3BhI,MAAM+J,GAAN,CAAU7K,KAAV,EAAiB8I,IAAjB,MAA2B3H,SAA/B,EAA0C;cAClCgb,WAAW7a,KAAKwH,IAAtB;eACKA,IAAL,GAAYA,IAAZ;mBACS3H,SAAT,EAAoB,SAApB,EAA+BG,IAA/B,EAAqC2Y,MAArC;eACKnR,IAAL,GAAYqT,QAAZ;;OALJ;;WASKlC,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;GAjduB;;;;;;;;;;;;;;MAAA,gBA+dnBnB,KA/dmB,EA+dZoa,MA/dY,EA+dJ9Y,IA/dI,EA+dE;QACrB4F,OAAOkT,OAAOlT,IAAlB;QACIkV,kBAAJ;;QAEItb,MAAM6H,QAAN,CAAezB,IAAf,CAAJ,EAA0B;aACjB,CAACA,IAAD,CAAP;;;SAGGtG,OAAL,CAAa,UAAUyb,KAAV,EAAiB;;UAExBjD,MAAMiD,KAAN,EAAarc,KAAb,EAAoBoa,MAApB,EAA4B9Y,IAA5B,CAAJ,EAAuC;;oBAEzB+a,KAAZ;eACO,KAAP;;KALJ;;QASI,CAACD,SAAL,EAAgB;aACPvC,UAAU7Z,UAAUmB,SAAV,IAAuBnB,UAAU,IAAjC,UAA+CA,KAA/C,yCAA+CA,KAA/C,IAAuD,KAAKA,KAAtE,eAAwFkH,KAAK4T,IAAL,CAAU,IAAV,CAAxF,QAA4GxZ,IAA5G,CAAP;;;;QAIIgb,YAAYC,oBAAoBH,SAApB,CAAlB;QACIE,SAAJ,EAAe;aACNA,UAAUtc,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,CAAP;;GAvfqB;;;;;;;;;;;;;;;aAAA,uBAugBZtB,KAvgBY,EAugBLoa,MAvgBK,EAugBG9Y,IAvgBH,EAugBS;QAC5BtB,SAASA,MAAMyC,MAAf,IAAyB2X,OAAOoC,WAApC,EAAiD;UACzC/Z,SAASzC,MAAMyC,MAArB;UACI4G,aAAJ;UAAU7G,UAAV;UAAa6U,UAAb;;WAEK7U,IAAIC,SAAS,CAAlB,EAAqBD,IAAI,CAAzB,EAA4BA,GAA5B,EAAiC;eACxBxC,MAAMwC,CAAN,CAAP;;aAEK6U,IAAI7U,IAAI,CAAb,EAAgB6U,KAAK,CAArB,EAAwBA,GAAxB,EAA6B;;cAEvBvW,MAAMgF,SAAN,CAAgBuD,IAAhB,EAAsBrJ,MAAMqX,CAAN,CAAtB,CAAJ,EAAqC;mBAC5BwC,UAAUxQ,IAAV,EAAgB,eAAhB,EAAiC/H,IAAjC,CAAP;;;;;;CAlhBZ;;;;;AA6hBA,IAAMmb,SAAS,SAATA,MAAS,CAAUvQ,GAAV,EAAelM,KAAf,EAAsBoa,MAAtB,EAA8B9Y,IAA9B,EAAoC;MAC7C2Y,SAAS,EAAb;MACIrZ,OAAJ,CAAY,UAAU0L,EAAV,EAAc;QACpB8N,OAAO9N,EAAP,MAAenL,SAAnB,EAA8B;eACnB8Y,OAAOzL,MAAP,CAAc+L,mBAAmBjO,EAAnB,EAAuBtM,KAAvB,EAA8Boa,MAA9B,EAAsC9Y,IAAtC,KAA+C,EAA7D,CAAT;;GAFJ;SAKO2Y,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;CAPF;;;;;;;;;;;;;;;AAuBA,IAAMub,UAAU,CAAC,MAAD,EAAS,MAAT,EAAiB,OAAjB,EAA0B,OAA1B,EAAmC,OAAnC,EAA4C,KAA5C,CAAhB;;;;;;;;;;;;;AAaA,IAAMC,YAAY,CAAC,OAAD,EAAU,UAAV,EAAsB,UAAtB,EAAkC,aAAlC,CAAlB;;;;;;;;;;;;AAYA,IAAMC,cAAc,CAAC,YAAD,EAAe,SAAf,EAA0B,SAA1B,CAApB;;;;;;;;;;;;;;AAcA,IAAMC,aAAa,CAAC,eAAD,EAAkB,eAAlB,EAAmC,UAAnC,EAA+C,YAA/C,EAA6D,cAA7D,CAAnB;;;;;;;;;;;;AAYA,IAAMC,aAAa,CAAC,WAAD,EAAc,WAAd,EAA2B,SAA3B,CAAnB;;;;;;AAMA,IAAMC,cAAc,SAAdA,WAAc,CAAU/c,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;SAC1Cmb,OAAOC,OAAP,EAAgB1c,KAAhB,EAAuBoa,MAAvB,EAA+B9Y,IAA/B,CAAP;CADF;;;;;;;;;;;;AAcA,IAAMwS,YAAW,SAAXA,SAAW,CAAU9T,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;MAC1C2Y,SAAS,EAAb;WACS3Y,OAAO,EAAhB;OACK0b,GAAL,KAAa1b,KAAK0b,GAAL,GAAW,EAAEhd,YAAF,EAASoa,cAAT,EAAxB;MACI6C,kBAAJ;MACId,WAAW7a,KAAKwH,IAApB;MACIsR,WAAWjZ,SAAf,EAA0B;;;MAGtB,CAACL,MAAM+B,QAAN,CAAeuX,MAAf,CAAL,EAA6B;UACrBtZ,MAAMmD,GAAN,CAAanF,QAAb,gBAAgC,GAAhC,gCAAiEwC,KAAKb,IAAtE,OAAN;;MAEEa,KAAKb,IAAL,KAAcU,SAAlB,EAA6B;SACtBV,IAAL,GAAY,EAAZ;;;MAGEa,KAAKwH,IAAL,KAAc3H,SAAlB,EAA6B;gBACf,IAAZ;SACKV,IAAL,CAAU4E,IAAV,CAAe/D,KAAKwH,IAApB;SACKA,IAAL,GAAY3H,SAAZ;;;MAGEiZ,OAAO,SAAP,CAAJ,EAAuB;;;QAGjBtZ,MAAMM,UAAN,CAAiBgZ,OAAO,SAAP,EAAkBtG,QAAnC,CAAJ,EAAkD;eACvCmG,OAAOzL,MAAP,CAAc4L,OAAO,SAAP,EAAkBtG,QAAlB,CAA2B9T,KAA3B,EAAkCsB,IAAlC,KAA2C,EAAzD,CAAT;KADF,MAEO;eACI2Y,OAAOzL,MAAP,CAAcsF,UAAS9T,KAAT,EAAgBoa,OAAO,SAAP,CAAhB,EAAmC9Y,IAAnC,KAA4C,EAA1D,CAAT;;;MAGAtB,UAAUmB,SAAd,EAAyB;;QAEnBiZ,OAAO6B,QAAP,KAAoB,IAApB,IAA4B,CAAC3a,KAAK4a,YAAtC,EAAoD;eACzClc,KAAT,EAAgB,SAAhB,EAA2BsB,IAA3B,EAAiC2Y,MAAjC;;QAEEgD,SAAJ,EAAe;WACRxc,IAAL,CAAUuI,GAAV;WACKF,IAAL,GAAYqT,QAAZ;;WAEKlC,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;;;WAGO8Y,OAAOzL,MAAP,CAAcuO,YAAY/c,KAAZ,EAAmBoa,MAAnB,EAA2B9Y,IAA3B,KAAoC,EAAlD,CAAT;MACI2b,SAAJ,EAAe;SACRxc,IAAL,CAAUuI,GAAV;SACKF,IAAL,GAAYqT,QAAZ;;SAEKlC,OAAOxX,MAAP,GAAgBwX,MAAhB,GAAyB9Y,SAAhC;CAhDF;;;;AAqDA,IAAM+b,eAAe,UAArB;;AAEA,IAAMC,cAAc,SAApB;;AAEA,IAAMC,oBAAoB,SAA1B;;AAEA,IAAMpK,iBAAe,UAArB;;AAEA,IAAMqK,cAAc,SAApB;;AAEA,IAAMpK,mBAAiB,YAAvB;;AAEA,IAAMC,0BAAwB,mBAA9B;;;AAGA,IAAMoK,aAAa,QAAnB;AACA,IAAMC,uBAAuB,mBAA7B;;;;;;;;AAQA,IAAMhB,sBAAsB;;;;;;;;;;;;;;;;SAgBnB,eAAUvc,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;WAC7Bmb,OAAOE,SAAP,EAAkB3c,KAAlB,EAAyBoa,MAAzB,EAAiC9Y,IAAjC,CAAP;GAjBwB;;;;;;;;;;;;;;;WAiCjB,iBAAUtB,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;;WAE/Bib,oBAAoBiB,OAApB,CAA4Bxd,KAA5B,EAAmCoa,MAAnC,EAA2C9Y,IAA3C,CAAP;GAnCwB;;;;;;;;;;;;;;;UAmDlB,gBAAUtB,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;;WAE9Bib,oBAAoBiB,OAApB,CAA4Bxd,KAA5B,EAAmCoa,MAAnC,EAA2C9Y,IAA3C,CAAP;GArDwB;;;;;;;;;;;;;;;;;WAuEjB,iBAAUtB,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;WAC/Bmb,OAAOG,WAAP,EAAoB5c,KAApB,EAA2Boa,MAA3B,EAAmC9Y,IAAnC,CAAP;GAxEwB;;;;;;;;;;;;;;;;;UA0FlB,gBAAUtB,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;WAC9Bmb,OAAOI,UAAP,EAAmB7c,KAAnB,EAA0Boa,MAA1B,EAAkC9Y,IAAlC,CAAP;GA3FwB;;;;;;;;;;;;;;;;;UA6GlB,gBAAUtB,KAAV,EAAiBoa,MAAjB,EAAyB9Y,IAAzB,EAA+B;WAC9Bmb,OAAOK,UAAP,EAAmB9c,KAAnB,EAA0Boa,MAA1B,EAAkC9Y,IAAlC,CAAP;;;;;;;;;;;;;;;;;;;;;;;;CA9GJ,CAuIA,SAASmc,MAAT,CAAiBC,UAAjB,EAA6B;;;iBACZA,aAAa,EAA5B;;QAEMvb,MAAN,CAAa,IAAb,EAAmBub,UAAnB;;MAEI,KAAKxW,IAAL,KAAc,QAAlB,EAA4B;SACrByU,UAAL,GAAkB,KAAKA,UAAL,IAAmB,EAArC;UACMza,MAAN,CAAa,KAAKya,UAAlB,EAA8B,UAACgC,WAAD,EAAc7U,IAAd,EAAuB;UAC/C,EAAE6U,uBAAuBF,MAAzB,CAAJ,EAAsC;cAC/B9B,UAAL,CAAgB7S,IAAhB,IAAwB,IAAI2U,MAAJ,CAAWE,WAAX,CAAxB;;KAFJ;GAFF,MAOO,IAAI,KAAKzW,IAAL,KAAc,OAAd,IAAyB,KAAK6T,KAA9B,IAAuC,EAAE,KAAKA,KAAL,YAAsB0C,MAAxB,CAA3C,EAA4E;SAC5E1C,KAAL,GAAa,IAAI0C,MAAJ,CAAW,KAAK1C,KAAhB,CAAb;;MAEE,KAAK6C,OAAL,IAAgB,EAAE,KAAKA,OAAL,YAAwBH,MAA1B,CAApB,EAAuD;SAChDG,OAAL,GAAe,IAAIH,MAAJ,CAAW,KAAKG,OAAhB,CAAf;;GAED,OAAD,EAAU,OAAV,EAAmB,OAAnB,EAA4Bhd,OAA5B,CAAoC,UAACid,iBAAD,EAAuB;QACrD,MAAKA,iBAAL,CAAJ,EAA6B;YACtBA,iBAAL,EAAwBjd,OAAxB,CAAgC,UAAC+c,WAAD,EAAcnb,CAAd,EAAoB;YAC9C,EAAEmb,uBAAuBF,MAAzB,CAAJ,EAAsC;gBAC/BI,iBAAL,EAAwBrb,CAAxB,IAA6B,IAAIib,MAAJ,CAAWE,WAAX,CAA7B;;OAFJ;;GAFJ;;;AAWF,eAAe3S,YAAUD,MAAV,CAAiB;eACjB0S,MADiB;;;;;;;;;;;OAAA,iBAYvB3a,MAZuB,EAYfxB,IAZe,EAYT;;;aACVA,OAAO,EAAhB;SACKuF,MAAL,KAAgBvF,KAAKuF,MAAL,GAAc,MAA9B;SACKC,MAAL,KAAgBxF,KAAKwF,MAAL,GAAc,MAA9B;SACKgX,QAAL,KAAkBxc,KAAKwc,QAAL,GAAgB,QAAlC;SACKC,KAAL,KAAezc,KAAKyc,KAAL,GAAa,KAAKA,KAAjC;QACMpC,aAAa,KAAKA,UAAL,IAAmB,EAAtC;UACMza,MAAN,CAAaya,UAAb,EAAyB,UAACvB,MAAD,EAAStR,IAAT,EAAkB;aAClCZ,cAAP,CACEpF,MADF,EAEEgG,IAFF,EAGE,OAAKkV,cAAL,CAAoBlV,IAApB,EAA0BsR,MAA1B,EAAkC9Y,IAAlC,CAHF;KADF;GAnB4B;;;;;;;;;;eAAA,yBAmCfwB,MAnCe,EAmCP;QACjB,CAACA,MAAL,EAAa;;;QAGP6Y,aAAa,KAAKA,UAAL,IAAmB,EAAtC;QACMsC,SAASnd,MAAMM,UAAN,CAAiB0B,OAAOsH,GAAxB,KAAgCtJ,MAAMM,UAAN,CAAiB0B,OAAO4H,IAAxB,CAA/C;UACMxJ,MAAN,CAAaya,UAAb,EAAyB,UAAUvB,MAAV,EAAkBtR,IAAlB,EAAwB;UAC3CsR,OAAO7U,cAAP,CAAsB,SAAtB,KAAoCzE,MAAM+J,GAAN,CAAU/H,MAAV,EAAkBgG,IAAlB,MAA4B3H,SAApE,EAA+E;YACzE8c,MAAJ,EAAY;iBACH7T,GAAP,CAAWtB,IAAX,EAAiBhI,MAAM2S,SAAN,CAAgB2G,OAAO,SAAP,CAAhB,CAAjB,EAAqD,EAAE9E,QAAQ,IAAV,EAArD;SADF,MAEO;gBACClL,GAAN,CAAUtH,MAAV,EAAkBgG,IAAlB,EAAwBhI,MAAM2S,SAAN,CAAgB2G,OAAO,SAAP,CAAhB,CAAxB;;;UAGAA,OAAOlT,IAAP,KAAgB,QAAhB,IAA4BkT,OAAOuB,UAAvC,EAAmD;YAC7CsC,MAAJ,EAAY;cACJC,OAAOpb,OAAO4Q,IAAP,CAAY,YAAZ,CAAb;iBACOhJ,IAAP,CAAY,YAAZ,EAA0B,IAA1B;gBACMN,GAAN,CAAUtH,MAAV,EAAkBgG,IAAlB,EAAwBhI,MAAM+J,GAAN,CAAU/H,MAAV,EAAkBgG,IAAlB,KAA2B,EAAnD,EAAuD,EAAEwM,QAAQ,IAAV,EAAvD;iBACO5K,IAAP,CAAY,YAAZ,EAA0BwT,IAA1B;SAJF,MAKO;gBACC9T,GAAN,CAAUtH,MAAV,EAAkBgG,IAAlB,EAAwBhI,MAAM+J,GAAN,CAAU/H,MAAV,EAAkBgG,IAAlB,KAA2B,EAAnD;;eAEKqV,aAAP,CAAqBrd,MAAM+J,GAAN,CAAU/H,MAAV,EAAkBgG,IAAlB,CAArB;;KAjBJ;GAzC4B;;;;;;;;;;;;;;;;;;gBAAA,0BA8EdA,IA9Ec,EA8ERsR,MA9EQ,EA8EA9Y,IA9EA,EA8EM;QAC5B6B,aAAa;;oBAEH,IAFG;;;kBAKLiX,OAAO/W,UAAP,KAAsBlC,SAAtB,GAAkC,IAAlC,GAAyC,CAAC,CAACiZ,OAAO/W;;KALhE,CAQA,IAAM+a,qBAAmBtV,IAAzB;QACMqK,6BAA2BrK,IAAjC;QACMjC,SAASvF,KAAKuF,MAApB;QACMC,SAASxF,KAAKwF,MAApB;QACMgX,WAAWxc,KAAKwc,QAAtB;QACMC,QAAQjd,MAAMuY,SAAN,CAAgB/X,KAAKyc,KAArB,IAA8Bzc,KAAKyc,KAAnC,GAA2C3D,OAAO2D,KAAhE;;eAEWlT,GAAX,GAAiB,YAAY;aACpB,KAAK6I,IAAL,CAAU0K,OAAV,CAAP;KADF;;QAIItd,MAAMM,UAAN,CAAiBgZ,OAAOvP,GAAxB,CAAJ,EAAkC;UAC1BwT,cAAclb,WAAW0H,GAA/B;iBACWA,GAAX,GAAiB,YAAY;eACpBuP,OAAOvP,GAAP,CAAWzK,IAAX,CAAgB,IAAhB,EAAsBie,WAAtB,CAAP;OADF;;;eAKSjU,GAAX,GAAiB,UAAUpK,KAAV,EAAiB;;;;UAE1B0T,OAAO,KAAK7M,MAAL,CAAb;UACM6D,OAAO,KAAK5D,MAAL,CAAb;UACMwX,SAAS,KAAKR,QAAL,CAAf;;UAEI,CAACpK,KAAKT,gBAAL,CAAL,EAA2B;YACnBgH,SAASG,OAAOtG,QAAP,CAAgB9T,KAAhB,EAAuB,EAAES,MAAM,CAACqI,IAAD,CAAR,EAAvB,CAAf;YACImR,MAAJ,EAAY;;;cAGJsE,QAAQ,IAAI3X,KAAJ,CAAU2W,oBAAV,CAAd;gBACMtD,MAAN,GAAeA,MAAf;gBACMsE,KAAN;;;;;UAKAR,SAAS,CAACrK,KAAKV,cAAL,CAAd,EAAkC;;;YAG1BgC,WAAWtB,KAAKP,YAAL,CAAjB;YACMqL,UAAU9K,KAAK0K,OAAL,CAAhB;YACIK,WAAW/K,KAAKwJ,YAAL,CAAf;YACIpZ,UAAU4P,KAAKyJ,WAAL,CAAd;;YAEI,CAACsB,QAAL,EAAe;;oBAEH,EAAV;;;;YAII5c,QAAQiC,QAAQzC,OAAR,CAAgByH,IAAhB,CAAd;YACI0V,YAAYxe,KAAZ,IAAqB6B,UAAU,CAAC,CAApC,EAAuC;kBAC7BwD,IAAR,CAAayD,IAAb;;YAEEkM,aAAahV,KAAjB,EAAwB;cAClB6B,SAAS,CAAb,EAAgB;oBACNU,MAAR,CAAeV,KAAf,EAAsB,CAAtB;;;;YAIA,CAACiC,QAAQrB,MAAb,EAAqB;qBACR,KAAX;iBACOya,YAAP;iBACOC,WAAP;;cAEIzJ,KAAK2J,WAAL,CAAJ,EAAuB;yBACR3J,KAAK2J,WAAL,CAAb;mBACOA,WAAP;;;;YAIA,CAACoB,QAAD,IAAa3a,QAAQrB,MAAzB,EAAiC;eAC1B0a,WAAL,EAAkBrZ,OAAlB;eACKoZ,YAAL,EAAmB,IAAnB;;;;eAIKG,WAAL,EAAkBqB,WAAW,YAAM;;;;mBAI1BvB,WAAP;mBACOE,WAAP;mBACOH,YAAP;;gBAEI,CAACxJ,KAAK4J,UAAL,CAAL,EAAuB;kBACjB9a,UAAJ;mBACKA,IAAI,CAAT,EAAYA,IAAIsB,QAAQrB,MAAxB,EAAgCD,GAAhC,EAAqC;uBAC9BmV,IAAL,CAAU,YAAY7T,QAAQtB,CAAR,CAAtB,UAAwC1B,MAAM+J,GAAN,SAAgB/G,QAAQtB,CAAR,CAAhB,CAAxC;;;kBAGI6S,UAAUvU,MAAM4C,WAAN,oBAAqBoF,IAArB,EAA4B9I,KAA5B,sBAAwC8I,IAAxC,EAA+C0V,OAA/C,EAAhB;;kBAEI9K,KAAKR,uBAAL,CAAJ,EAAiC;oBACzByL,eAAe7d,MAAM2S,SAAN,CAAgB4B,OAAhB,CAArB;6BACauJ,SAAb,GAAyB,IAAIha,IAAJ,GAAWC,OAAX,EAAzB;oBACIga,gBAAgBnL,KAAK0J,iBAAL,CAApB;iBACCyB,aAAD,IAAkBnU,KAAK0S,iBAAL,EAAyByB,gBAAgB,EAAzC,CAAlB;8BACcxZ,IAAd,CAAmBsZ,YAAnB;;qBAEGhH,IAAL,CAAU,QAAV,UAA0BtC,OAA1B;;mBAEKiI,UAAP;WAzBgB,EA0Bf,CA1Be,CAAlB;;;WA6BCc,OAAL,EAAcpe,KAAd;aACOA,KAAP;KAzFF;;QA4FIc,MAAMM,UAAN,CAAiBgZ,OAAOhQ,GAAxB,CAAJ,EAAkC;UAC1B0U,cAAc3b,WAAWiH,GAA/B;iBACWA,GAAX,GAAiB,UAAUpK,KAAV,EAAiB;eACzBoa,OAAOhQ,GAAP,CAAWhK,IAAX,CAAgB,IAAhB,EAAsBJ,KAAtB,EAA6B8e,WAA7B,CAAP;OADF;;;WAKK3b,UAAP;GA5M4B;;;;;;;;;;;;MAAA,gBAwNxBnD,KAxNwB,EAwNjB;;;QACPA,UAAUmB,SAAd,EAAyB;;;QAGrB,KAAK+F,IAAL,KAAc,QAAlB,EAA4B;UACtBxC,OAAO,EAAX;UACMiX,aAAa,KAAKA,UAAxB;UACIA,UAAJ,EAAgB;cACRza,MAAN,CAAaya,UAAb,EAAyB,UAACgC,WAAD,EAAc7U,IAAd,EAAuB;eACzCA,IAAL,IAAa6U,YAAYoB,IAAZ,CAAiB/e,MAAM8I,IAAN,CAAjB,CAAb;SADF;;UAIE,KAAK8U,OAAT,EAAkB;cACVzb,MAAN,CAAauC,IAAb,EAAmB,KAAKkZ,OAAL,CAAamB,IAAb,CAAkB/e,KAAlB,CAAnB;;;UAGE,KAAK0b,oBAAT,EAA+B;aACxB,IAAI7a,GAAT,IAAgBb,KAAhB,EAAuB;cACjB,CAAC2b,WAAW9a,GAAX,CAAL,EAAsB;iBACfA,GAAL,IAAYC,MAAM2S,SAAN,CAAgBzT,MAAMa,GAAN,CAAhB,CAAZ;;;;aAIC6D,IAAP;KAnBF,MAoBO,IAAI,KAAKwC,IAAL,KAAc,OAAlB,EAA2B;aACzBlH,MAAMgD,GAAN,CAAU,UAACqG,IAAD,EAAU;YACnB2V,QAAQ,OAAKjE,KAAL,GAAa,OAAKA,KAAL,CAAWgE,IAAX,CAAgB1V,IAAhB,CAAb,GAAqC,EAAnD;YACI,OAAKuU,OAAT,EAAkB;gBACVzb,MAAN,CAAa6c,KAAb,EAAoB,OAAKpB,OAAL,CAAamB,IAAb,CAAkB1V,IAAlB,CAApB;;eAEK2V,KAAP;OALK,CAAP;;WAQKle,MAAM2S,SAAN,CAAgBzT,KAAhB,CAAP;GAzP4B;;;;;;;;;;;;UAAA,oBAqQpBA,KArQoB,EAqQbsB,IArQa,EAqQP;WACdwS,UAAS9T,KAAT,EAAgB,IAAhB,EAAsBsB,IAAtB,CAAP;;CAtQW,EAwQZ;kBAAA;sBAAA;0BAAA;wBAAA;wBAAA;0CAAA;cAAA;qBAAA;;CAxQY,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACl8BA,IAAMxC,WAAS,QAAf;AACA,IAAMmgB,qBAAqB,CACzB,cADyB,EAEzB,kBAFyB,CAA3B;AAIA,IAAMC,kBAAkB,CACtB,cADsB,EAEtB,kBAFsB,EAGtB,cAHsB,EAItB,iBAJsB,EAKtB,kBALsB,CAAxB;AAOA,IAAMC,aAAa,SAAbA,UAAa,CAAUxQ,GAAV,EAAe;SACzB,YAAmB;;;sCAAN1H,IAAM;UAAA;;;QAClB3F,OAAO2F,KAAKA,KAAKxE,MAAL,GAAckM,GAAnB,CAAb;QACMrC,KAAKhL,KAAKgL,EAAhB;SACKmI,GAAL,cAASnI,EAAT,SAAgBrF,IAAhB;;QAEIgY,mBAAmB5d,OAAnB,CAA2BiL,EAA3B,MAAmC,CAAC,CAApC,IAAyChL,KAAK6c,aAAL,KAAuB,KAApE,EAA2E;UACnE/D,SAAS,KAAKgF,SAAL,EAAf;UACIhF,UAAUA,OAAO+D,aAArB,EAAoC;YAC9BkB,YAAYpY,KAAK,CAAL,CAAhB;YACI,CAACnG,MAAM2D,OAAN,CAAc4a,SAAd,CAAL,EAA+B;sBACjB,CAACA,SAAD,CAAZ;;kBAEQze,OAAV,CAAkB,UAACyH,MAAD,EAAY;iBACrB8V,aAAP,CAAqB9V,MAArB;SADF;;;;;QAOA6W,gBAAgB7d,OAAhB,CAAwBiL,EAAxB,MAAgC,CAAC,CAAjC,IAAsC,CAAChL,KAAK+R,UAAhD,EAA4D;;UAEpDiM,uBAAuBhe,KAAK4a,YAAlC;;;UAGI5P,GAAGjL,OAAH,CAAW,cAAX,MAA+B,CAA/B,IAAoCC,KAAK4a,YAAL,KAAsB/a,SAA9D,EAAyE;aAClE+a,YAAL,GAAoB,IAApB;;UAEIjC,SAAS,KAAKnG,QAAL,CAAc7M,KAAKqF,OAAO,cAAP,GAAwB,CAAxB,GAA4B,CAAjC,CAAd,EAAmDxL,MAAMie,IAAN,CAAWzd,IAAX,EAAiB,CAAC,cAAD,CAAjB,CAAnD,CAAf;;;WAGK4a,YAAL,GAAoBoD,oBAApB;;;UAGIrF,MAAJ,EAAY;YACJhW,MAAM,IAAI2C,KAAJ,CAAU,mBAAV,CAAZ;YACIqT,MAAJ,GAAaA,MAAb;eACOnZ,MAAMmJ,MAAN,CAAahG,GAAb,CAAP;;;;;QAKA3C,KAAKie,MAAL,IAAgBje,KAAKie,MAAL,KAAgBpe,SAAhB,IAA6B,KAAKoe,MAAtD,EAA+D;iBAClD,YAAM;cACV5H,IAAL,eAAUrL,EAAV,SAAiBrF,IAAjB;OADF;;GA1CJ;CADF;;;AAmDA,IAAMsY,SAASJ,WAAW,CAAX,CAAf;AACA,IAAMK,UAAUL,WAAW,CAAX,CAAhB;;;;AAIA,IAAMM,oBAAoB;SACjB;cACK,CAAC,EAAD,EAAK,EAAL,CADL;UAEC,IAFD;WAGE;GAJe;WAMf;cACG,CAAC,EAAD,EAAK,EAAL,CADH;UAED,IAFC;WAGA;GATe;cAWZ;cACA,CAAC,EAAD,EAAK,EAAL,CADA;UAEJ,IAFI;WAGH;GAde;QAgBlB;cACM,CAACte,SAAD,EAAY,EAAZ,CADN;WAEG;GAlBe;WAoBf;cACG,CAAC,EAAD,EAAK,EAAL,CADH;WAEA;GAtBe;OAwBnB;cACO,CAACA,SAAD,EAAY,EAAZ,EAAgB,EAAhB,CADP;UAEG,IAFH;WAGI;GA3Be;UA6BhB;eAAA,uBACOmH,MADP,EACe+I,EADf,EACmBtO,KADnB,EAC0BzB,IAD1B,EACgC;aAC7B,CAAC+P,EAAD,EAAK/I,OAAOkL,MAAP,CAAczQ,KAAd,EAAqBzB,IAArB,CAAL,EAAiCA,IAAjC,CAAP;KAFI;;kBAIQ,CAJR;cAKI,CAACH,SAAD,EAAY,EAAZ,EAAgB,EAAhB,CALJ;WAMC;GAnCe;aAqCb;eAAA,uBACImH,MADJ,EACYvF,KADZ,EACmBiL,KADnB,EAC0B1M,IAD1B,EACgC;aAChC,CAACgH,OAAOkL,MAAP,CAAczQ,KAAd,EAAqBzB,IAArB,CAAD,EAA6B0M,KAA7B,EAAoC1M,IAApC,CAAP;KAFO;;kBAIK,CAJL;cAKC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,CALD;WAMF;GA3Ce;cA6CZ;eAAA,uBACGgH,MADH,EACWqI,OADX,EACoBrP,IADpB,EAC0B;aAC3B,CAACqP,QAAQ3N,GAAR,CAAY,UAACqF,MAAD;eAAYC,OAAOkL,MAAP,CAAcnL,MAAd,EAAsB/G,IAAtB,CAAZ;OAAZ,CAAD,EAAuDA,IAAvD,CAAP;KAFQ;;kBAII,CAJJ;cAKA,CAAC,EAAD,EAAK,EAAL,CALA;WAMH;;CAnDX;;AAuDA,IAAMoe,kBAAkB;;;;;;;;;;aAUX,EAVW;;;;;;;;;;;iBAqBP,IArBO;;;;;;;;;;;;;;eAmCT,IAnCS;;;;;;;;;;;kBA8CN,MA9CM;;;;;;;;;;eAwDT,IAxDS;;;;;;;;;;qBAkEH,IAlEG;;;;;;;;;;UA4Ed,IA5Ec;;;;;;;;;;cAsFV,KAtFU;;;;;;;;;;;;;;;;;;OAwGjB,KAxGiB;;;;;;;;;;;iBAmHP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAnHjB,CAyKA,SAASC,MAAT,CAAiBre,IAAjB,EAAuB;QACfuG,cAAN,CAAqB,IAArB,EAA2B8X,MAA3B;cACUvf,IAAV,CAAe,IAAf;WACSkB,OAAO,EAAhB;;;SAGOgC,gBAAP,CAAwB,IAAxB,EAA8B;eACjB;aACFnC,SADE;gBAEC;KAHgB;;;;;;;;;eAajB;aACFA,SADE;gBAEC;KAfgB;;;;;;;;;;sBA0BV;aACTse;KA3BmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiFf;aACJte,SADI;gBAED;KAnFgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA8HpB;aACCA,SADD;gBAEI;;GAhId;;;QAqIMgB,MAAN,CAAa,IAAb,EAAmBb,IAAnB;;QAEMa,MAAN,CAAa,IAAb,EAAmBrB,MAAM4D,IAAN,CAAWgb,eAAX,CAAnB;;;;;;;;;;;MAWI,CAAC,KAAKxb,IAAV,EAAgB;UACRpD,MAAMmD,GAAN,UAAiBnF,QAAjB,EAA2B,WAA3B,EAAwC,GAAxC,EAA6C,QAA7C,EAAuD,KAAKoF,IAA5D,CAAN;;;;MAIE,KAAKkW,MAAT,EAAiB;SACVA,MAAL,CAAYlT,IAAZ,KAAqB,KAAKkT,MAAL,CAAYlT,IAAZ,GAAmB,QAAxC;QACI,EAAE,KAAKkT,MAAL,YAAuBqD,QAAzB,CAAJ,EAAsC;WAC/BrD,MAAL,GAAc,IAAIqD,QAAJ,CAAW,KAAKrD,MAAL,IAAe,EAAElT,MAAM,QAAR,EAA1B,CAAd;;;;;MAKA,KAAK0Y,WAAL,KAAqBze,SAAzB,EAAoC;QAC5BwG,aAAayL,QAAnB;SACKwM,WAAL,GAAmBjY,WAAWoD,MAAX,CAAkB;mBACrB,SAASqI,MAAT,GAAmB;YAC3BxL,WAAW,SAASwL,MAAT,CAAiBrQ,KAAjB,EAAwBzB,IAAxB,EAA8B;gBACrCuG,cAAN,CAAqB,IAArB,EAA2BD,QAA3B;qBACWxH,IAAX,CAAgB,IAAhB,EAAsB2C,KAAtB,EAA6BzB,IAA7B;SAFF;eAIOsG,QAAP;OALW;KADI,CAAnB;;;MAWE,KAAKgY,WAAT,EAAsB;SACfA,WAAL,CAAiBtX,MAAjB,GAA0B,IAA1B;;;;;;;;;QASIxH,MAAM+B,QAAN,CAAe,KAAKgd,OAApB,CAAJ,EAAkC;YAC1B1X,sBAAN,CAA6B,KAAKyX,WAAL,CAAiBlgB,SAA9C,EAAyD,KAAKmgB,OAA9D;;;;;QAKEzM,SAAO1T,SAAP,CAAiBogB,aAAjB,CAA+BrgB,OAAO0F,MAAP,CAAc,KAAKya,WAAL,CAAiBlgB,SAA/B,CAA/B,KAA6E,KAAK0a,MAAlF,IAA4F,KAAKA,MAAL,CAAY1T,KAAxG,IAAiH,KAAKqZ,WAA1H,EAAuI;WAChI3F,MAAL,CAAY1T,KAAZ,CAAkB,KAAKkZ,WAAL,CAAiBlgB,SAAnC;;;;;AAKN,eAAesL,YAAUD,MAAV,CAAiB;eACjB4U,MADiB;;;;;;;;;;;;;cAclBH,OAdkB;;;;;;;;;;;;;eA2BjBA,OA3BiB;;;;;;;;;;;;;mBAwCbA,OAxCa;;;;;;;;;;;;;gBAqDhBA,OArDgB;;;;;;;;;;;;;;mBAmEbA,OAnEa;;;;;;;;;;;;;aAgFnBA,OAhFmB;;;;;;;;;;;;;gBA6FhBA,OA7FgB;;;;;;;;;;;;;YA0GpBA,OA1GoB;;;;;;;;;;;;;;eAwHjBA,OAxHiB;;;;;;;;;;;;;;kBAsIdA,OAtIc;;;;;;;;;;;;;mBAmJbA,OAnJa;;;;;;;;;;;;gBA+JhBD,MA/JgB;;;;;;;;;;;;oBA2KZA,MA3KY;;;;;;;;;;;;eAuLjBA,MAvLiB;;;;;;;;;;;;iBAmMfA,MAnMe;;;;;;;;;;;;oBA+MZA,MA/MY;;;;;;;;;;;;cA2NlBA,MA3NkB;;;;;;;;;;;;iBAuOfA,MAvOe;;;;;;;;;;;;;aAoPnBA,MApPmB;;;;;;;;;;;;;gBAiQhBA,MAjQgB;;;;;;;;;;;;;mBA8QbA,MA9Qa;;;;;;;;;;;;oBA0RZA,MA1RY;;;;;;;;;;;;;;;MAAA,gBAySxBja,MAzSwB,EAyShBhE,IAzSgB,EAySV6M,IAzSU,EAySJ;QACpB7M,KAAKuT,GAAT,EAAc;YACNP,CAAN,CAAQhP,MAAR,EAAgBhE,IAAhB;;QAEE6M,IAAJ,EAAU;aACD7I,MAAP;;QAEE0a,QAAQ1e,KAAKuT,GAAL,GAAWvP,OAAOyG,IAAlB,GAAyBzG,MAArC;QACI0a,SAASlf,MAAMM,UAAN,CAAiB,KAAK6e,IAAtB,CAAb,EAA0C;cAChC,KAAKA,IAAL,CAAUD,KAAV,EAAiB1e,IAAjB,CAAR;UACIA,KAAKuT,GAAT,EAAc;eACL9I,IAAP,GAAciU,KAAd;OADF,MAEO;iBACIA,KAAT;;;WAGG1a,MAAP;GAzT4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,wBAyVnB+J,aAzVmB,EAyVJ/N,IAzVI,EAyVE;WACvBmR,UAAUpD,aAAV,EAAyB/N,IAAzB,EAA+B,IAA/B,CAAP;GA1V4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAA,iBAwXvB0M,KAxXuB,EAwXhB1M,IAxXgB,EAwXV;WACX,KAAK4e,IAAL,CAAU,OAAV,EAAmBlS,KAAnB,EAA0B1M,IAA1B,CAAP;GAzX4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAgdtByB,KAhdsB,EAgdfzB,IAhde,EAgdT;;;;cAETyB,QAAQ,EAAlB;aACSzB,OAAO,EAAhB;QACM6e,iBAAiBpd,KAAvB;QACIqd,oBAAoB,EAAxB;QACIC,kBAAkB,EAAtB;;;UAGM/L,CAAN,CAAQhT,IAAR,EAAc,IAAd;SACKiT,OAAL,GAAe,KAAKC,cAAL,CAAoBlT,IAApB,CAAf;;SAEKgL,EAAL,GAAU,cAAV;WACO,KAAKgU,QAAL,CAAchf,KAAKgL,EAAnB,EAAuBvJ,KAAvB,EAA8BzB,IAA9B,EAAoCoQ,IAApC,CAAyC,UAAC3O,KAAD,EAAW;WACpDjB,IAAL,KAAcR,KAAKQ,IAAL,GAAY,EAA1B;aACO,OAAKye,6BAAL,CAAmCxd,KAAnC,EAA0CzB,IAA1C,CAAP;KAFK,EAGJoQ,IAHI,CAGC,UAAC8O,WAAD,EAAiB;0BACHA,WAApB;KAJK,EAKJ9O,IALI,CAKC,YAAM;WACPpF,EAAL,GAAU,QAAV;aACO,OAAKmU,oBAAL,CAA0Bnf,KAAKgL,EAA/B,EAAmCvJ,KAAnC,EAA0CzB,IAA1C,CAAP;KAPK,EAQJoQ,IARI,CAQC,UAACpM,MAAD,EAAY;wBACAA,MAAlB;KATK,EAUJoM,IAVI,CAUC,YAAM;UACNgP,eAAepf,KAAKuT,GAAL,GAAWwL,gBAAgBtU,IAA3B,GAAkCsU,eAAvD;;aAEO,OAAKM,oCAAL,CAA0CD,YAA1C,EAAwD;kBAAA;4CAAA;uBAG9C3d;OAHV,CAAP;KAbK,EAkBJ2O,IAlBI,CAkBC,UAACgP,YAAD,EAAkB;aACjB,OAAKE,cAAL,CAAoBT,cAApB,EAAoCO,YAApC,CAAP;KAnBK,EAoBJhP,IApBI,CAoBC,UAACrJ,MAAD,EAAY;UACd/G,KAAKuT,GAAT,EAAc;wBACI9I,IAAhB,GAAuB1D,MAAvB;OADF,MAEO;0BACaA,MAAlB;;UAEI/C,SAAS,OAAKub,IAAL,CAAUR,eAAV,EAA2B/e,IAA3B,CAAf;WACKgL,EAAL,GAAU,aAAV;aACO,OAAKgU,QAAL,CAAchf,KAAKgL,EAAnB,EAAuBvJ,KAAvB,EAA8BzB,IAA9B,EAAoCgE,MAApC,CAAP;KA5BK,CAAP;GA7d4B;gBAAA,0BA6fdwb,eA7fc,EA6fGC,SA7fH,EA6fc;;;QACtCjgB,MAAM2D,OAAN,CAAcqc,eAAd,CAAJ,EAAoC;aAC3BA,gBAAgB9d,GAAhB,CAAoB,UAACqF,MAAD,EAAS7F,CAAT;eAAe,OAAKoe,cAAL,CAAoBvY,MAApB,EAA4B0Y,UAAUve,CAAV,CAA5B,CAAf;OAApB,CAAP;;;UAGI4H,GAAN,CAAU0W,eAAV,EAA2BC,SAA3B,EAAsC,EAAEzL,QAAQ,IAAV,EAAtC;;QAEIxU,MAAMM,UAAN,CAAiB0f,gBAAgB5L,MAAjC,CAAJ,EAA8C;sBAC5BA,MAAhB;;;WAGK4L,eAAP;GAxgB4B;;;;;;;;;;;;;gBAAA,0BAqhBd/d,KArhBc,EAqhBPzB,IArhBO,EAqhBD;WACpB,KAAKkQ,YAAL,CAAkBzO,KAAlB,EAAyBzB,IAAzB,CAAP;GAthB4B;;;;;;;;;;;;+BAAA,yCAkiBCyB,KAliBD,EAkiBQzB,IAliBR,EAkiBc;QACpCoT,QAAQ,EAAd;QACML,YAAY,EAAlB;;UAEMO,eAAN,CAAsB,IAAtB,EAA4BtT,IAA5B,EAAkC,UAACC,GAAD,EAAMW,QAAN,EAAmB;UAC/C,CAACX,IAAIyf,kBAAJ,EAAD,IAA6B,CAACzf,IAAIqP,aAAJ,CAAkB7N,KAAlB,CAAlC,EAA4D;;;;eAInD8R,GAAT,GAAe,KAAf;gBACUxP,IAAV,CAAe9D,GAAf;YACM8D,IAAN,CAAW9D,IAAI0f,kBAAJ,CAAuBle,KAAvB,EAA8Bb,QAA9B,CAAX;KAPF;;WAUOpB,MAAMC,OAAN,CAAcwG,GAAd,CAAkBmN,KAAlB,EAAyBhD,IAAzB,CAA8B,mBAAW;aACvC2C,UAAUrK,MAAV,CAAiB,UAAChH,GAAD,EAAMrB,QAAN,EAAgBE,KAAhB,EAA0B;iBACvCoP,aAAT,CAAuBjO,GAAvB,EAA4B2N,QAAQ9O,KAAR,CAA5B;eACOmB,GAAP;OAFK,EAGJ,EAHI,CAAP;KADK,CAAP;GAhjB4B;;;;;;;;;;;;;;;sCAAA,gDAokBQD,KApkBR,EAokBeme,OApkBf,EAokBwB;QAC9CxM,QAAQ,EAAd;;UAEME,eAAN,CAAsB,IAAtB,EAA4BsM,QAAQ5f,IAApC,EAA0C,UAACC,GAAD,EAAMW,QAAN,EAAmB;UACrDoP,eAAe/P,IAAIqP,aAAJ,CAAkBsQ,QAAQC,aAA1B,CAArB;;UAEI,CAAC7P,YAAL,EAAmB;;;;eAIVuD,GAAT,GAAe,KAAf;;;UAGItT,IAAI6f,iBAAJ,EAAJ,EAA6B;cACrB/b,IAAN,CAAW9D,IAAI8f,iBAAJ,CAAsBte,KAAtB,EAA6BuO,YAA7B,EAA2CpP,QAA3C,CAAX;OADF,MAEO,IAAIX,IAAIyf,kBAAJ,EAAJ,EAA8B;YAC7BM,SAAS/f,IAAIqP,aAAJ,CAAkBsQ,QAAQd,iBAA1B,CAAf;;YAEIkB,MAAJ,EAAY;cACNrQ,aAAJ,CAAkBlO,KAAlB,EAAyBue,MAAzB;;;KAhBN;;WAqBOxgB,MAAMC,OAAN,CAAcwG,GAAd,CAAkBmN,KAAlB,EACJhD,IADI,CACC;aAAM3O,KAAN;KADD,CAAP;GA5lB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBAyrBlB4N,OAzrBkB,EAyrBTrP,IAzrBS,EAyrBH;;;;gBAEbqP,UAAU,EAAtB;aACSrP,OAAO,EAAhB;QACMigB,kBAAkB5Q,OAAxB;QACI0P,wBAAJ;;;UAGM/L,CAAN,CAAQhT,IAAR,EAAc,IAAd;SACKiT,OAAL,GAAe,KAAKC,cAAL,CAAoBlT,IAApB,CAAf;;;SAGKgL,EAAL,GAAU,kBAAV;WACO,KAAKgU,QAAL,CAAchf,KAAKgL,EAAnB,EAAuBqE,OAAvB,EAAgCrP,IAAhC,EAAsCoQ,IAAtC,CAA2C,UAACf,OAAD,EAAa;;UAEvD6Q,wBAAwB,EAA9B;WACK1f,IAAL,KAAcR,KAAKQ,IAAL,GAAY,EAA1B;UACI4S,QAAQ,EAAZ;YACME,eAAN,SAA4BtT,IAA5B,EAAkC,UAACC,GAAD,EAAMW,QAAN,EAAmB;YAC7CoP,eAAeX,QAClB3N,GADkB,CACd,UAACqF,MAAD;iBAAY9G,IAAIqP,aAAJ,CAAkBvI,MAAlB,CAAZ;SADc,EAElBrC,MAFkB,CAEXyb,OAFW,CAArB;YAGIlgB,IAAI2F,IAAJ,KAAa+H,aAAb,IAA8BqC,aAAa7O,MAAb,KAAwBkO,QAAQlO,MAAlE,EAA0E;;;mBAG/DoS,GAAT,GAAe,KAAf;gBACMxP,IAAN,CAAW9D,IAAIkQ,YAAJ,CAAiBH,YAAjB,EAA+BpP,QAA/B,EAAyCwP,IAAzC,CAA8C,UAACpB,cAAD,EAAoB;oBACnE1P,OAAR,CAAgB,UAACyH,MAAD,EAAS7F,CAAT;qBAAejB,IAAI6P,aAAJ,CAAkB/I,MAAlB,EAA0BiI,eAAe9N,CAAf,CAA1B,CAAf;aAAhB;WADS,EAERkP,IAFQ,CAEH,UAACpB,cAAD,EAAoB;gBACtBW,aAAJ,CAAkBuQ,qBAAlB,EAAyClR,cAAzC;WAHS,CAAX;;OARJ;aAeOxP,MAAMC,OAAN,CAAcwG,GAAd,CAAkBmN,KAAlB,EAAyBhD,IAAzB,CAA8B,YAAM;aACpCpF,EAAL,GAAU,YAAV;eACO,OAAKmU,oBAAL,CAA0Bnf,KAAKgL,EAA/B,EAAmCqE,OAAnC,EAA4CrP,IAA5C,CAAP;OAFK,EAGJoQ,IAHI,CAGC,UAACpM,MAAD,EAAY;0BACAA,MAAlB;OAJK,EAKJoM,IALI,CAKC,YAAM;YACNgQ,qBAAqBpgB,KAAKuT,GAAL,GAAWwL,gBAAgBtU,IAA3B,GAAkCsU,eAA7D;;;gBAGQ,EAAR;cACMzL,eAAN,SAA4BtT,IAA5B,EAAkC,UAACC,GAAD,EAAMW,QAAN,EAAmB;cAC7CoP,eAAeX,QAClB3N,GADkB,CACd,UAACqF,MAAD;mBAAY9G,IAAIqP,aAAJ,CAAkBvI,MAAlB,CAAZ;WADc,EAElBrC,MAFkB,CAEXyb,OAFW,CAArB;cAGInQ,aAAa7O,MAAb,KAAwBkO,QAAQlO,MAApC,EAA4C;;;;mBAInCoS,GAAT,GAAe,KAAf;cACM8M,gBAAgBpgB,IAAIqP,aAAJ,CAAkB4Q,qBAAlB,CAAtB;cACI7M,aAAJ;;;cAGIpT,IAAI2F,IAAJ,KAAagI,WAAjB,EAA8B;;mBAEvBzF,GAAL,CAAS,MAAT,EAAiB,gDAAjB;WAFF,MAGO,IAAIlI,IAAI2F,IAAJ,KAAaiI,UAAjB,EAA6B;+BACfvO,OAAnB,CAA2B,UAACghB,iBAAD,EAAoBpf,CAApB,EAA0B;kBAC/C4O,aAAJ,CAAkBwQ,iBAAlB,EAAqCtQ,aAAa9O,CAAb,CAArC;aADF;mBAGOjB,IAAIa,WAAJ,GAAkBkQ,UAAlB,CAA6BhB,YAA7B,EAA2CpP,QAA3C,EAAqDwP,IAArD,CAA0D,UAACnB,WAAD,EAAiB;iCAC7D3P,OAAnB,CAA2B,UAACghB,iBAAD,EAAoBpf,CAApB,EAA0B;oBAC/CyO,aAAJ,CAAkB2Q,iBAAlB,EAAqCrR,YAAY/N,CAAZ,CAArC;eADF;aADK,CAAP;WAJK,MASA,IAAIjB,IAAI2F,IAAJ,KAAa+H,aAAb,IAA8B0S,aAA9B,IAA+CA,cAAclf,MAAd,KAAyBif,mBAAmBjf,MAA/F,EAAuG;+BACzF7B,OAAnB,CAA2B,UAACghB,iBAAD,EAAoBpf,CAApB,EAA0B;kBAC/CyO,aAAJ,CAAkB2Q,iBAAlB,EAAqCD,cAAcnf,CAAd,CAArC;aADF;;cAIEmS,IAAJ,EAAU;kBACFtP,IAAN,CAAWsP,IAAX;;SA/BJ;eAkCO7T,MAAMC,OAAN,CAAcwG,GAAd,CAAkBmN,KAAlB,EAAyBhD,IAAzB,CAA8B,YAAM;iBAClC,OAAKkP,cAAL,CAAoBW,eAApB,EAAqCG,kBAArC,CAAP;SADK,CAAP;OA5CK,CAAP;KApBK,EAoEJhQ,IApEI,CAoEC,UAACf,OAAD,EAAa;UACfrP,KAAKuT,GAAT,EAAc;wBACI9I,IAAhB,GAAuB4E,OAAvB;OADF,MAEO;0BACaA,OAAlB;;UAEIrL,SAAS,OAAKub,IAAL,CAAUR,eAAV,EAA2B/e,IAA3B,CAAf;WACKgL,EAAL,GAAU,iBAAV;aACO,OAAKgU,QAAL,CAAchf,KAAKgL,EAAnB,EAAuBqE,OAAvB,EAAgCrP,IAAhC,EAAsCgE,MAAtC,CAAP;KA5EK,CAAP;GAtsB4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAA,wBAi2BhBvC,KAj2BgB,EAi2BTzB,IAj2BS,EAi2BH;;;cACfyB,QAAQ,EAAlB;QACIjC,MAAM2D,OAAN,CAAc1B,KAAd,CAAJ,EAA0B;aACjBA,MAAMC,GAAN,CAAU,UAAC+G,MAAD;eAAY,OAAKyH,YAAL,CAAkBzH,MAAlB,EAA0BzI,IAA1B,CAAZ;OAAV,CAAP;;QAEE,CAACR,MAAM+B,QAAN,CAAeE,KAAf,CAAL,EAA4B;YACpBjC,MAAMmD,GAAN,CAAanF,QAAb,oBAAoC,OAApC,EAA6C,GAA7C,EAAkD,iBAAlD,EAAqEiE,KAArE,CAAN;;;QAGE,KAAKwF,YAAT,EAAuB;WAChBA,YAAL,CAAkB3H,OAAlB,CAA0B,UAAUW,GAAV,EAAe;YACnCsgB,6BAAJ,CAAkC9e,KAAlC,EAAyCzB,IAAzC;OADF;;QAIIwgB,aAAa,KAAKlC,WAAxB;;WAEQ,CAACkC,UAAD,IAAe/e,iBAAiB+e,UAAjC,GAA+C/e,KAA/C,GAAuD,IAAI+e,UAAJ,CAAe/e,KAAf,EAAsBzB,IAAtB,CAA9D;GAj3B4B;;;;;;;;;;;;MAAA,gBA63BxBygB,MA73BwB,EA63BP;;;uCAAN9a,IAAM;UAAA;;;QACf+a,SAAS,KAAKC,gBAAL,CAAsBF,MAAtB,CAAf;QACI,CAACC,MAAL,EAAa;YACLlhB,MAAMmD,GAAN,CAAanF,QAAb,YAA4BijB,MAA5B,EAAoC,GAApC,EAAyC,QAAzC,CAAN;;;QAGIG,aAAWH,OAAO9U,MAAP,CAAc,CAAd,EAAiBrD,WAAjB,EAAX,GAA4CmY,OAAOrf,MAAP,CAAc,CAAd,CAAlD;QACMyf,oBAAkBD,KAAxB;QACME,kBAAgBF,KAAtB;;QAEI5V,WAAJ;QAAQiI,gBAAR;;;WAGO8N,QAAP,CAAgBzhB,OAAhB,CAAwB,UAACZ,KAAD,EAAQwC,CAAR,EAAc;UAChCyE,KAAKzE,CAAL,MAAYrB,SAAhB,EAA2B;aACpBqB,CAAL,IAAU1B,MAAM4D,IAAN,CAAW1E,KAAX,CAAV;;KAFJ;;QAMMsB,OAAO2F,KAAKA,KAAKxE,MAAL,GAAc,CAAnB,CAAb;;;UAGM6R,CAAN,CAAQhT,IAAR,EAAc,IAAd;cACUA,KAAKiT,OAAL,GAAe,KAAKC,cAAL,CAAoBlT,IAApB,CAAzB;;;SAGKA,KAAKgL,EAAL,GAAU6V,MAAf;WACOrhB,MAAMoJ,OAAN,CAAc,KAAKoC,EAAL,gCAAYrF,IAAZ,EAAd,EAAiCyK,IAAjC,CAAsC,UAAC4Q,MAAD,EAAY;;;UACnDrb,KAAK+a,OAAOO,YAAZ,MAA8BphB,SAAlC,EAA6C;;aAEtC6gB,OAAOO,YAAZ,IAA4BD,WAAWnhB,SAAX,GAAuB8F,KAAK+a,OAAOO,YAAZ,CAAvB,GAAmDD,MAA/E;;;WAGGhhB,KAAKgL,EAAL,GAAUyV,MAAf;aACOC,OAAOQ,WAAP,GAAqBR,OAAOQ,WAAP,iDAA4Bvb,IAA5B,GAArB,GAAyDA,IAAhE;aACKwN,GAAL,gBAASnI,EAAT,2BAAgBrF,IAAhB;aACOnG,MAAMoJ,OAAN,CAAc,sBAAKuY,UAAL,CAAgBlO,OAAhB,GAAyBjI,EAAzB,uDAAsCrF,IAAtC,GAAd,CAAP;KATK,EAUJyK,IAVI,CAUC,UAACpM,MAAD,EAAY;eACT,OAAKub,IAAL,CAAUvb,MAAV,EAAkBhE,IAAlB,EAAwB,CAAC,CAAC0gB,OAAO7T,IAAjC,CAAT;WACK9I,IAAL,CAAUC,MAAV;;WAEKhE,KAAKgL,EAAL,GAAU8V,KAAf;aACOthB,MAAMoJ,OAAN,CAAc,OAAKoC,EAAL,kCAAYrF,IAAZ,EAAd,EAAiCyK,IAAjC,CAAsC,UAACgR,OAAD,EAAa;;eAEjDA,YAAYvhB,SAAZ,GAAwBmE,MAAxB,GAAiCod,OAAxC;OAFK,CAAP;KAfK,CAAP;GAx5B4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBAigCrBrR,EAjgCqB,EAigCjB/P,IAjgCiB,EAigCX;WACV,KAAK4e,IAAL,CAAU,SAAV,EAAqB7O,EAArB,EAAyB/P,IAAzB,CAAP;GAlgC4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBAsmClB0M,KAtmCkB,EAsmCX1M,IAtmCW,EAsmCL;WAChB,KAAK4e,IAAL,CAAU,YAAV,EAAwBlS,KAAxB,EAA+B1M,IAA/B,CAAP;GAvmC4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBA+rCxB+P,EA/rCwB,EA+rCpB/P,IA/rCoB,EA+rCd;WACP,KAAK4e,IAAL,CAAU,MAAV,EAAkB7O,EAAlB,EAAsB/P,IAAtB,CAAP;GAhsC4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBA4xCrB0M,KA5xCqB,EA4xCd1M,IA5xCc,EA4xCR;WACb,KAAK4e,IAAL,CAAU,SAAV,EAAqBlS,KAArB,EAA4B1M,IAA5B,CAAP;GA7xC4B;;;;;;;;;;;;;YAAA,sBA0yClB4C,IA1yCkB,EA0yCZ;SACXuQ,GAAL,CAAS,YAAT,EAAuB,OAAvB,EAAgCvQ,IAAhC;QACMqQ,UAAU,KAAKC,cAAL,CAAoBtQ,IAApB,CAAhB;QACI,CAACqQ,OAAL,EAAc;YACNzT,MAAMmD,GAAN,CAAanF,QAAb,kBAAkC,MAAlC,EAA0C,GAA1C,EAA+C,QAA/C,EAAyDoF,IAAzD,CAAN;;WAEK,KAAKye,WAAL,GAAmBpO,OAAnB,CAAP;GAhzC4B;;;;;;;;;;;;;gBAAA,0BA6zCdjT,IA7zCc,EA6zCR;aACXA,OAAO,EAAhB;QACIR,MAAM6H,QAAN,CAAerH,IAAf,CAAJ,EAA0B;aACjB,EAAEiT,SAASjT,IAAX,EAAP;;WAEKA,KAAKiT,OAAL,IAAgBjT,KAAKshB,cAA5B;GAl0C4B;;;;;;;;;;;aAAA,yBA60Cf;WACN,KAAKC,SAAZ;GA90C4B;;;;;;;;;;;WAAA,uBAy1CjB;WACJ,KAAKzI,MAAZ;GA11C4B;;;;;;;;;;;;;;;;;;;SAAA,sBA62CrB/K,aA72CqB,EA62CN/N,IA72CM,EA62CA;WACrBqR,QAAQtD,aAAR,EAAuB/N,IAAvB,EAA6B,IAA7B,CAAP;GA92C4B;;;;;;;;;;;;;;;;;;;QAAA,qBAi4CtB+N,aAj4CsB,EAi4CP/N,IAj4CO,EAi4CD;WACpBsR,OAAOvD,aAAP,EAAsB/N,IAAtB,EAA4B,IAA5B,CAAP;GAl4C4B;;;;;;;;;;;;;;;;;;;IAAA,cAq5C1B+G,MAr5C0B,EAq5ClB;QACJuX,cAAc,KAAKA,WAAzB;WACOA,cAAcvX,kBAAkBuX,WAAhC,GAA8C,KAArD;GAv5C4B;;;;;;;;;;;;;;;iBAAA,2BAs6Cb1b,IAt6Ca,EAs6CPqQ,OAt6CO,EAs6CEjT,IAt6CF,EAs6CQ;aAC3BA,OAAO,EAAhB;SACKqhB,WAAL,GAAmBze,IAAnB,IAA2BqQ,OAA3B;;QAEIjT,SAAS,IAAT,IAAiBA,KAAKwhB,OAA1B,EAAmC;WAC5BF,cAAL,GAAsB1e,IAAtB;;GA36C0B;UAAA,oBA+6CpB6e,QA/6CoB,EA+6CG;uCAAVC,QAAU;cAAA;;;QACzBC,oBAAoBF,SAAS1hB,OAAT,CAAiB,OAAjB,MAA8B,CAA9B,GAAkC2hB,SAASvgB,MAAT,GAAkB,CAApD,GAAwD,CAAlF;;WAEO3B,MAAMoJ,OAAN,CAAc,KAAK6Y,QAAL,cAAkBC,QAAlB,CAAd,EACJtR,IADI,CACC,UAACwR,eAAD;aAAqBA,oBAAoB/hB,SAApB,GAAgC6hB,SAASC,iBAAT,CAAhC,GAA8DC,eAAnF;KADD,CAAP;GAl7C4B;sBAAA,gCAs7CRnB,MAt7CQ,EAs7CAoB,cAt7CA,EAs7CgB7hB,IAt7ChB,EAs7CsB;;;QAC5C8hB,oBAAoB,EAAEthB,MAAMR,KAAK+hB,IAAL,IAAa,EAArB,EAA1B;QACI7iB,eAAJ;;SAEKiU,GAAL,CAASnT,KAAKgL,EAAd,EAAkB6W,cAAlB,EAAkC7hB,IAAlC;;QAEIR,MAAM2D,OAAN,CAAc0e,cAAd,CAAJ,EAAmC;eACxBA,eAAengB,GAAf,CAAmB;eAAU,OAAKwQ,MAAL,CAAYnL,MAAZ,EAAoB+a,iBAApB,CAAV;OAAnB,CAAT;KADF,MAEO;eACI,KAAK5P,MAAL,CAAY2P,cAAZ,EAA4BC,iBAA5B,CAAT;;;WAGK,KAAKX,UAAL,CAAgBnhB,KAAKiT,OAArB,EAA8BwN,MAA9B,EAAsC,IAAtC,EAA4CvhB,MAA5C,EAAoDc,IAApD,CAAP;GAl8C4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAA,eAi+CzBmJ,KAj+CyB,EAi+ClBuD,KAj+CkB,EAi+CX1M,IAj+CW,EAi+CL;WAChB,KAAK4e,IAAL,CAAU,KAAV,EAAiBzV,KAAjB,EAAwBuD,KAAxB,EAA+B1M,IAA/B,CAAP;GAl+C4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAihDtBqP,OAjhDsB,EAihDbrP,IAjhDa,EAihDP;;;QACjB+G,eAAJ;aACS/G,OAAO,EAAhB;QACIR,MAAM2D,OAAN,CAAckM,OAAd,CAAJ,EAA4B;aACnBA,QAAQ3N,GAAR,CAAY,UAACqF,MAAD;eAAY,OAAKmL,MAAL,CAAYnL,MAAZ,EAAoB/G,IAApB,CAAZ;OAAZ,CAAP;KADF,MAEO;eACIqP,OAAT;;QAEIT,iBAAiB,CAAC,OAAO,KAAKA,cAAZ,GAA6B,EAA9B,KAAqC,EAA5D;QACIxH,OAAO,EAAX;;;QAGI,QAAQ,KAAK0R,MAAjB,EAAyB;aAChB,KAAKA,MAAL,CAAY2E,IAAZ,CAAiB1W,MAAjB,CAAP;KADF,MAEO;WACA,IAAIxH,GAAT,IAAgBwH,MAAhB,EAAwB;YAClB6H,eAAe7O,OAAf,CAAuBR,GAAvB,MAAgC,CAAC,CAArC,EAAwC;eACjCA,GAAL,IAAYC,MAAM2S,SAAN,CAAgBpL,OAAOxH,GAAP,CAAhB,CAAZ;;;;;;QAMF,QAAQS,KAAKW,OAAjB,EAA0B;WACnBH,IAAL,GAAYoO,eAAe7N,KAAf,EAAZ;;QAEE,QAAQf,KAAKQ,IAAjB,EAAuB;UACjBhB,MAAM6H,QAAN,CAAerH,KAAKQ,IAApB,CAAJ,EAA+B;aACxBA,IAAL,GAAY,CAACR,KAAKQ,IAAN,CAAZ;;YAEI8S,eAAN,CAAsB,IAAtB,EAA4BtT,IAA5B,EAAkC,UAACC,GAAD,EAAMW,QAAN,EAAmB;YAC7CoP,eAAe/P,IAAIqP,aAAJ,CAAkBvI,MAAlB,CAArB;YACIiJ,YAAJ,EAAkB;;cAEZxQ,MAAM2D,OAAN,CAAc6M,YAAd,CAAJ,EAAiC;gBAC3BL,aAAJ,CAAkBvI,IAAlB,EAAwB4I,aAAatO,GAAb,CAAiB,UAACqG,IAAD,EAAU;qBAC1C9H,IAAIa,WAAJ,GAAkBoR,MAAlB,CAAyBnK,IAAzB,EAA+BnH,QAA/B,CAAP;aADsB,CAAxB;WADF,MAIO;gBACD+O,aAAJ,CAAkBvI,IAAlB,EAAwBnH,IAAIa,WAAJ,GAAkBoR,MAAlB,CAAyBlC,YAAzB,EAAuCpP,QAAvC,CAAxB;;;OATN;;WAcKwG,IAAP;GA7jD4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAqpDtB2I,EArpDsB,EAqpDlBtO,KArpDkB,EAqpDXzB,IArpDW,EAqpDL;WAChB,KAAK4e,IAAL,CAAU,QAAV,EAAoB7O,EAApB,EAAwBtO,KAAxB,EAA+BzB,IAA/B,CAAP;GAtpD4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBAgvDnByB,KAhvDmB,EAgvDZiL,KAhvDY,EAgvDL1M,IAhvDK,EAgvDC;WACtB,KAAK4e,IAAL,CAAU,WAAV,EAAuBnd,KAAvB,EAA8BiL,KAA9B,EAAqC1M,IAArC,CAAP;GAjvD4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBAq0DlBqP,OAr0DkB,EAq0DTrP,IAr0DS,EAq0DH;WAClB,KAAK4e,IAAL,CAAU,YAAV,EAAwBvP,OAAxB,EAAiCrP,IAAjC,CAAP;GAt0D4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAAA,oBAs2DpB+G,MAt2DoB,EAs2DZ/G,IAt2DY,EAs2DN;aACbA,OAAO,EAAhB;QACM8Y,SAAS,KAAKgF,SAAL,EAAf;QACI,CAAChF,MAAL,EAAa;;;QAGPkJ,QAAQxiB,MAAMie,IAAN,CAAWzd,IAAX,EAAiB,CAAC,cAAD,CAAjB,CAAd;QACIR,MAAM2D,OAAN,CAAc4D,MAAd,CAAJ,EAA2B;UACnB4R,SAAS5R,OAAOrF,GAAP,CAAW,UAACugB,OAAD;eAAanJ,OAAOtG,QAAP,CAAgByP,OAAhB,EAAyBziB,MAAMie,IAAN,CAAWuE,KAAX,EAAkB,CAAC,cAAD,CAAlB,CAAzB,CAAb;OAAX,CAAf;;aAEOrJ,OAAOuJ,IAAP,CAAY/B,OAAZ,IAAuBxH,MAAvB,GAAgC9Y,SAAvC;;WAEKiZ,OAAOtG,QAAP,CAAgBzL,MAAhB,EAAwBib,KAAxB,CAAP;GAl3D4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBA25DxBvX,IA35DwB,EA25DlBzK,IA35DkB,EA25DZ;WACT,KAAKkQ,YAAL,CAAkBzF,IAAlB,EAAwBzK,IAAxB,CAAP;GA55D4B;;;;;;iBAAA,6BAk6DX;;;;;UAGXJ,MAAN,CAAa,KAAKmT,SAAlB,EAA6B,UAACxH,KAAD,EAAQ3F,IAAR,EAAiB;YACtChG,MAAN,CAAa2L,KAAb,EAAoB,UAACwH,SAAD,EAAYoP,KAAZ,EAAsB;YACpC3iB,MAAM+B,QAAN,CAAewR,SAAf,CAAJ,EAA+B;sBACjB,CAACA,SAAD,CAAZ;;kBAEQzT,OAAV,CAAkB,UAACW,GAAD,EAAS;cACnB8N,gBAAgB,OAAKO,SAAL,CAAe8T,eAAf,CAA+BD,KAA/B,KAAyCA,KAA/D;cACIrhB,WAAJ,GAAkB;mBAAM,OAAKwN,SAAL,CAAe+T,SAAf,CAAyBF,KAAzB,CAAN;WAAlB;;cAEI,OAAOrU,SAASlI,IAAT,CAAP,KAA0B,UAA9B,EAA0C;kBAClCpG,MAAMmD,GAAN,CAAUnF,QAAV,EAAkB,iBAAlB,EAAqC,GAArC,EAA0C,sCAA1C,EAAkFoI,IAAlF,EAAwF,IAAxF,CAAN;;;iBAGGA,IAAL,EAAWmI,aAAX,EAA0B9N,GAA1B;SARF;OAJF;KADF;;CAr6DW,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtfA,IAAMzC,WAAS,WAAf;;AAEA,AAAO,IAAM8kB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;AAwBlC,OAxBkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyGlC,QAzGkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8LlC,YA9LkC;;;;;;;;;;;;;;;;;;;;;;;AAqNlC,cArNkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmSlC,SAnSkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiXlC,YAjXkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8blC,MA9bkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4gBlC,SA5gBkC;;;;;;;;;;;AAuhBlC,WAvhBkC;;;;;;;;;;;;;;;;;;;;;;AA6iBlC,IA7iBkC;;;;;;;;;;;;;;;;;;;;;;;;;AAskBlC,KAtkBkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAinBlC,QAjnBkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqsBlC,QArsBkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwxBlC,WAxxBkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAw2BlC,YAx2BkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAq4BlC,UAr4BkC,CAA7B;;;;;;;;;;;;;;;;;;;;;;;;;;AAg6BP,AAAO,SAASC,SAAT,CAAoBviB,IAApB,EAA0B;QACzBuG,cAAN,CAAqB,IAArB,EAA2Bgc,SAA3B;cACUzjB,IAAV,CAAe,IAAf;WACSkB,OAAO,EAAhB;;SAEOgC,gBAAP,CAAwB,IAAxB,EAA8B;;;;;;;;;;eAUjB;aACF;KAXmB;;;;;;;;;;cAsBlB;aACD;KAvBmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDf;aACJnC,SADI;gBAED;;GArDd;;;QA0DMgB,MAAN,CAAa,IAAb,EAAmBb,IAAnB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBKwiB,cAAL,GAAsB,KAAKA,cAAL,IAAuB,EAA7C;;;OAGKC,WAAL,KAAqB,KAAKA,WAAL,GAAmBpE,QAAxC;;;AAGF,IAAM5c,QAAQ;eACC8gB,SADD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAAA,0BAsCI3f,IAtCJ,EAsCmB;sCAAN+C,IAAM;UAAA;;;QACvBC,OAAOD,KAAKE,KAAL,EAAb;SACKwQ,IAAL,cAAUzQ,IAAV,EAAgBhD,IAAhB,SAAyB+C,IAAzB;GAxCU;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAA,cAoER/C,IApEQ,EAoEF;QACFnB,QAAQ,EAAd;QACMihB,WAAW,IAAjB;yBACqBpjB,OAArB,CAA6B,UAAUmhB,MAAV,EAAkB;YACvCA,MAAN,IAAgB;kBACJ,IADI;aAAA,mBAEE;6CAAN9a,IAAM;gBAAA;;;iBACP+c,SAASjC,MAAT,mBAAiB7d,IAAjB,SAA0B+C,IAA1B,EAAP;;OAHJ;KADF;UAQM0c,SAAN,GAAkB;gBACN,IADM;WAAA,mBAEP;eACAK,SAASL,SAAT,CAAmBzf,IAAnB,CAAP;;KAHJ;WAMOzE,OAAO0F,MAAP,CAAc,IAAd,EAAoBpC,KAApB,CAAP;GArFU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAA,wBAoHEmB,IApHF,EAoHQ5C,IApHR,EAoHc;;;;QAEpBR,MAAM+B,QAAN,CAAeqB,IAAf,CAAJ,EAA0B;aACjBA,IAAP;aACO5C,KAAK4C,IAAZ;;QAEE,CAACpD,MAAM6H,QAAN,CAAezE,IAAf,CAAL,EAA2B;YACnBpD,MAAMmD,GAAN,CAAanF,QAAb,oBAAoC,MAApC,EAA4C,GAA5C,EAAiD,QAAjD,EAA2DoF,IAA3D,CAAN;;;;aAIO5C,OAAO,EAAhB;;SAEK4C,IAAL,GAAYA,IAAZ;SACKmQ,SAAL,KAAmB/S,KAAK+S,SAAL,GAAiB,EAApC;;;QAGM0P,cAAcziB,KAAKyiB,WAAL,IAAoB,KAAKA,WAA7C;WACOziB,KAAKyiB,WAAZ;;;UAGM5hB,MAAN,CAAab,IAAb,EAAmB,KAAKwiB,cAAxB;;;QAGMxb,SAAS,KAAK2b,QAAL,CAAc/f,IAAd,IAAsB,IAAI6f,WAAJ,CAAgBziB,IAAhB,CAArC,CAxBwB;WAyBjB+S,SAAP,KAAqB/L,OAAO+L,SAAP,GAAmB,EAAxC;;WAEOnQ,IAAP,GAAcA,IAAd;;WAEO2e,SAAP,GAAmB,KAAKF,WAAL,EAAnB;;WAEO/S,SAAP,GAAmB,IAAnB;;WAEOuI,EAAP,CAAU,KAAV,EAAiB;yCAAIlR,IAAJ;YAAA;;;aAAa,MAAKid,cAAL,eAAoBhgB,IAApB,SAA6B+C,IAA7B,EAAb;KAAjB;WACOkd,eAAP;;WAEO7b,MAAP;GAxJU;gBAAA,0BA2JIpE,IA3JJ,EA2JU5C,IA3JV,EA2JgB;YAClB8iB,IAAR,CAAa,oEAAb;WACO,KAAKC,YAAL,CAAkBngB,IAAlB,EAAwB5C,IAAxB,CAAP;GA7JU;;;;;;;;;;;;YAAA,sBAyKA4C,IAzKA,EAyKM;QACVqQ,UAAU,KAAKC,cAAL,CAAoBtQ,IAApB,CAAhB;QACI,CAACqQ,OAAL,EAAc;YACNzT,MAAMmD,GAAN,CAAanF,QAAb,kBAAkC,MAAlC,EAA0C,GAA1C,EAA+C,QAA/C,EAAyDoF,IAAzD,CAAN;;WAEK,KAAKye,WAAL,GAAmBpO,OAAnB,CAAP;GA9KU;;;;;;;;;;;;gBAAA,0BA0LIjT,IA1LJ,EA0LU;aACXA,OAAO,EAAhB;QACIR,MAAM6H,QAAN,CAAerH,IAAf,CAAJ,EAA0B;aACjB,EAAEiT,SAASjT,IAAX,EAAP;;WAEKA,KAAKiT,OAAL,IAAgB,KAAKuP,cAAL,CAAoBlB,cAA3C;GA/LU;;;;;;;;;;aAAA,yBAyMG;WACN,KAAKC,SAAZ;GA1MU;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBAmOD3e,IAnOC,EAmOK;QACToE,SAAS,KAAKob,eAAL,CAAqBxf,IAArB,CAAf;QACI,CAACoE,MAAL,EAAa;YACLxH,MAAMmD,GAAN,CAAanF,QAAb,iBAAiCoF,IAAjC,EAAuC,GAAvC,EAA4C,QAA5C,CAAN;;WAEKoE,MAAP;GAxOU;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAA,2BAkQKpE,IAlQL,EAkQW;WACd,KAAK+f,QAAL,CAAc/f,IAAd,CAAP;GAnQU;;;;;;;;;;;;;;;;;;;;;;iBAAA,2BAyRKA,IAzRL,EAyRWqQ,OAzRX,EAyRoBjT,IAzRpB,EAyR0B;aAC3BA,OAAO,EAAhB;SACKqhB,WAAL,GAAmBze,IAAnB,IAA2BqQ,OAA3B;;QAEIjT,SAAS,IAAT,IAAiBA,KAAKwhB,OAA1B,EAAmC;WAC5BgB,cAAL,CAAoBlB,cAApB,GAAqC1e,IAArC;YACMhD,MAAN,CAAa,KAAK+iB,QAAlB,EAA4B,UAAU3b,MAAV,EAAkB;eACrCsa,cAAP,GAAwB1e,IAAxB;OADF;;;CA/RN;;AAsSA0f,qBAAqBhjB,OAArB,CAA6B,UAAUmhB,MAAV,EAAkB;QACvCA,MAAN,IAAgB,UAAU7d,IAAV,EAAyB;;;uCAAN+C,IAAM;UAAA;;;WAChC,mBAAK0c,SAAL,CAAezf,IAAf,GAAqB6d,MAArB,oBAAgC9a,IAAhC,CAAP;GADF;CADF;;AAMA+D,YAAUD,MAAV,CAAiBhI,KAAjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACtyCA,IAAMjE,WAAS,aAAf;AACA,IAAMwlB,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+B/B,KA/B+B;;;;;;;;;;;;;;;;;;;;;;;AAsD/B,SAtD+B;;;;;;;;;;;;;;;;;;;;;AA2E/B,aA3E+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqH/B,QArH+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiJ/B,KAjJ+B;;;;;;;;;;;;;;;;;;;;;;AAuK/B,QAvK+B;;;;;;;;;;;;AAmL/B,OAnL+B;;;;;;;;;;;;;;;;;;;;AAuM/B,OAvM+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuO/B,QAvO+B;;;;;;;;;;;AAkP/B,SAlP+B,CAAjC;AAoPA,IAAMC,uBAAuB,CAC3B,YAD2B,EAE3B,YAF2B,EAG3B,eAH2B,EAI3B,WAJ2B,EAK3B,cAL2B,EAM3B,WAN2B,CAA7B;;AASA,IAAMC,WAAW,SAAXA,QAAW,CAAUtgB,IAAV,EAAgBugB,QAAhB,EAA0BnjB,IAA1B,EAAgC;MACzCojB,SAAS,KAAKC,iBAAL,CAAuBzgB,IAAvB,EAA6BugB,QAA7B,CAAf;MACI3jB,MAAMM,UAAN,CAAiBsjB,MAAjB,CAAJ,EAA8B;WACrBA,OAAOxgB,IAAP,EAAaugB,QAAb,EAAuBnjB,IAAvB,CAAP;;SAEKojB,MAAP;CALF;;AAQA,IAAME,uBAAuB;;;;;;;;;;;kBAWX,IAXW;;;;;;;;;;;;qBAuBR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAvBrB,CAgFA,SAASC,WAAT,CAAsBvjB,IAAtB,EAA4B;QACpBuG,cAAN,CAAqB,IAArB,EAA2Bgd,WAA3B;;WAESvjB,OAAO,EAAhB;;QAEMa,MAAN,CAAab,IAAb,EAAmBsjB,oBAAnB;YACUxkB,IAAV,CAAe,IAAf,EAAqBkB,IAArB;;OAEKwjB,eAAL,GAAuB,KAAKA,eAAL,IAAwBtN,YAA/C;OACKuN,YAAL,GAAoB,EAApB;OACKC,eAAL,GAAuB,EAAvB;OACKL,iBAAL,GAAyB,EAAzB;;;AAGF,IAAM5hB,UAAQ;eACC8hB,WADD;;;;;;;;;;;;;MAAA,gBAcN3gB,IAdM,EAcAoB,MAdA,EAcQhE,IAdR,EAcc;QACpByK,OAAOzK,KAAKuT,GAAL,GAAWvP,OAAOyG,IAAlB,GAAyBzG,MAApC;QACIyG,QAAQjL,MAAMM,UAAN,CAAiB,KAAK6jB,UAAtB,CAAZ,EAA+C;aACtC,KAAKA,UAAL,CAAgB/gB,IAAhB,EAAsB6H,IAAtB,EAA4BzK,IAA5B,CAAP;UACIA,KAAKuT,GAAT,EAAc;eACL9I,IAAP,GAAcA,IAAd;OADF,MAEO;iBACIA,IAAT;;;WAGGzG,MAAP;GAxBU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAAA,8BAwEQpB,IAxER,EAwEuB;sCAAN+C,IAAM;UAAA;;;QAC3BC,OAAOD,KAAKE,KAAL,EAAb;SACKwQ,IAAL,cAAUzQ,IAAV,EAAgBhD,IAAhB,SAAyB+C,IAAzB;GA1EU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBAuHA/C,IAvHA,EAuHM6H,IAvHN,EAuHYzK,IAvHZ,EAuHkB;WACrB,KAAKuO,aAAL,CAAmB3L,IAAnB,EAAyBwL,GAAzB,CAA6B3D,IAA7B,EAAmCzK,IAAnC,CAAP;GAxHU;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAA,cAoJR4C,IApJQ,EAoJF;QACFnB,QAAQ,EAAd;QACMihB,WAAW,IAAjB;QACMnE,UAAU0E,qBACb/V,MADa,CACNoV,oBADM,EAEbpV,MAFa,CAEN8V,wBAFM,CAAhB;;YAIQ1jB,OAAR,CAAgB,UAAUmhB,MAAV,EAAkB;YAC1BA,MAAN,IAAgB;kBACJ,IADI;aAAA,mBAEE;6CAAN9a,IAAM;gBAAA;;;iBACP+c,SAASjC,MAAT,mBAAiB7d,IAAjB,SAA0B+C,IAA1B,EAAP;;OAHJ;KADF;UAQM0c,SAAN,GAAkB;gBACN,IADM;WAAA,mBAEP;eACAK,SAASL,SAAT,CAAmBzf,IAAnB,CAAP;;KAHJ;UAMM2L,aAAN,GAAsB;gBACV,IADU;WAAA,mBAEX;eACAmU,SAASnU,aAAT,CAAuB3L,IAAvB,CAAP;;KAHJ;WAMOzE,OAAO0F,MAAP,CAAc,IAAd,EAAoBpC,KAApB,CAAP;GA/KU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA8NAyhB,QA9NA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA6QGA,QA7QH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBA4TDtgB,IA5TC,EA4TK6H,IA5TL,EA4TWsF,EA5TX,EA4Te/P,IA5Tf,EA4TqB;;;SAC1BqjB,iBAAL,CAAuBzgB,IAAvB,EAA6BmN,EAA7B,IAAmC,UAACnN,IAAD,EAAOmN,EAAP,EAAW/P,IAAX;aAAoB,MAAKuJ,GAAL,CAAS3G,IAAT,EAAemN,EAAf,CAApB;KAAnC;GA7TU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAAA,wBA8WEnN,IA9WF,EA8WQ6H,IA9WR,EA8WcmZ,IA9Wd,EA8WoB5jB,IA9WpB,EA8W0B;;;SAC/BqjB,iBAAL,CAAuBzgB,IAAvB,EAA6BghB,IAA7B,IAAqC,UAAChhB,IAAD,EAAOghB,IAAP,EAAa5jB,IAAb;aAAsB,OAAK0E,MAAL,CAAY9B,IAAZ,EAAkBpD,MAAMqkB,QAAN,CAAeD,IAAf,CAAlB,CAAtB;KAArC;GA/WU;;;;;;;;;;;;;OAAA,mBA4XH;;;QACDrhB,UAAU,EAAhB;UACM3C,MAAN,CAAa,KAAK6jB,YAAlB,EAAgC,UAACjZ,UAAD,EAAa5H,IAAb,EAAsB;cAC5CA,IAAR,IAAgB4H,WAAW0M,SAAX,EAAhB;aACKmM,iBAAL,CAAuBzgB,IAAvB,IAA+B,EAA/B;KAFF;WAIOL,OAAP;GAlYU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBA2dJK,IA3dI,EA2dEmE,MA3dF,EA2dU/G,IA3dV,EA2dgB;;;aACjBA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoByF,MAApB,CAA2B/E,IAA3B,CAAgC,IAAhC,EAAsC8D,IAAtC,EAA4CmE,MAA5C,EAAoD/G,IAApD,EACJoQ,IADI,CACC,UAACpM,MAAD;aAAY,OAAKub,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAZ;KADD,CAAP;GA7dU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBA4jBA4C,IA5jBA,EA4jBMyM,OA5jBN,EA4jBerP,IA5jBf,EA4jBqB;;;aACtBA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoB4S,UAApB,CAA+BlS,IAA/B,CAAoC,IAApC,EAA0C8D,IAA1C,EAAgDyM,OAAhD,EAAyDrP,IAAzD,EACJoQ,IADI,CACC,UAACpM,MAAD;aAAY,OAAKub,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAZ;KADD,CAAP;GA9jBU;cAAA,wBAkkBE4C,IAlkBF,EAkkBQ5C,IAlkBR,EAkkBc;QAClB8jB,OAAO,IAAb;QACM9c,SAASub,UAAUnkB,SAAV,CAAoB2kB,YAApB,CAAiCjkB,IAAjC,CAAsCglB,IAAtC,EAA4ClhB,IAA5C,EAAkD5C,IAAlD,CAAf;SACK0jB,eAAL,CAAqB9gB,IAArB,IAA6B,EAA7B;SACKygB,iBAAL,CAAuBzgB,IAAvB,IAA+B,EAA/B;WACOqE,YAAP,IAAuB9I,OAAOyI,cAAP,CAAsBI,MAAtB,EAA8B,cAA9B,EAA8C,EAAEtI,OAAO,EAAT,EAA9C,CAAvB;;QAEIqlB,iBAAiB;;cAEX,EAFW;;iBAIRD,IAJQ;;;KAArB;;QASI9jB,QAAS,gBAAgBA,IAA7B,EAAoC;qBACnBwW,UAAf,GAA4BxW,KAAKwW,UAAjC;;;;QAIIhM,aAAasZ,KAAKL,YAAL,CAAkB7gB,IAAlB,IAA0B,IAAIkhB,KAAKN,eAAT,CAAyB,IAAzB,EAA+BO,cAA/B,CAA7C,CArBwB;;QAuBlBjL,SAAS9R,OAAO8R,MAAP,IAAiB,EAAhC;QACMuB,aAAavB,OAAOuB,UAAP,IAAqB,EAAxC;;UAEMza,MAAN,CAAaya,UAAb,EAAyB,UAAUra,IAAV,EAAgBwH,IAAhB,EAAsB;UACzCxH,KAAKgkB,OAAT,EAAkB;mBACLC,WAAX,CAAuBzc,IAAvB;;KAFJ;;;;eAQWyc,WAAX,CAAuB,iBAAvB,EAA0C,CAAC,GAAD,CAA1C,EAAiD;iBAAA,uBAClCzd,GADkC,EAC7B;eACTgE,WAAW0Z,MAAX,CAAkB1Z,WAAWkG,QAAX,CAAoBlK,GAApB,CAAlB,CAAP;;KAFJ;;eAMWqQ,EAAX,CAAc,KAAd,EAAqB,YAAmB;yCAANlR,IAAM;YAAA;;;WACjCwe,kBAAL,cAAwBvhB,IAAxB,SAAiC+C,IAAjC;KADF;;WAIOqB,MAAP;GA9mBU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBA4sBHpE,IA5sBG,EA4sBGmN,EA5sBH,EA4sBO/P,IA5sBP,EA4sBa;;;aACdA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoBgmB,OAApB,CAA4BtlB,IAA5B,CAAiC,IAAjC,EAAuC8D,IAAvC,EAA6CmN,EAA7C,EAAiD/P,IAAjD,EAAuDoQ,IAAvD,CAA4D,UAACpM,MAAD,EAAY;UACvE+C,SAAS,OAAKwH,aAAL,CAAmB3L,IAAnB,EAAyBgQ,MAAzB,CAAgC7C,EAAhC,EAAoC/P,IAApC,CAAf;;UAEIA,KAAKuT,GAAT,EAAc;eACL9I,IAAP,GAAc1D,MAAd;OADF,MAEO;iBACIA,MAAT;;aAEK,OAAK2c,eAAL,CAAqB9gB,IAArB,EAA2BmN,EAA3B,CAAP;aACO,OAAKsT,iBAAL,CAAuBzgB,IAAvB,EAA6BmN,EAA7B,CAAP;aACO/L,MAAP;KAVK,CAAP;GA9sBU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBAqzBApB,IArzBA,EAqzBM8J,KArzBN,EAqzBa1M,IArzBb,EAqzBmB;;;aACpBA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoBimB,UAApB,CAA+BvlB,IAA/B,CAAoC,IAApC,EAA0C8D,IAA1C,EAAgD8J,KAAhD,EAAuD1M,IAAvD,EAA6DoQ,IAA7D,CAAkE,UAACpM,MAAD,EAAY;UAC7EqL,UAAU,OAAKd,aAAL,CAAmB3L,IAAnB,EAAyBsU,SAAzB,CAAmCxK,KAAnC,EAA0C1M,IAA1C,CAAhB;;UAEIA,KAAKuT,GAAT,EAAc;eACL9I,IAAP,GAAc4E,OAAd;OADF,MAEO;iBACIA,OAAT;;UAEIuU,OAAO,OAAKU,SAAL,CAAe1hB,IAAf,EAAqB8J,KAArB,EAA4B1M,IAA5B,CAAb;aACO,OAAK0jB,eAAL,CAAqB9gB,IAArB,EAA2BghB,IAA3B,CAAP;aACO,OAAKP,iBAAL,CAAuBzgB,IAAvB,EAA6BghB,IAA7B,CAAP;aACO5f,MAAP;KAXK,CAAP;GAvzBU;OAAA,iBAs0BLpB,IAt0BK,EAs0BCmN,EAt0BD,EAs0BK/P,IAt0BL,EAs0BW;YACb8iB,IAAR,CAAa,yDAAb;WACO,KAAKlQ,MAAL,CAAYhQ,IAAZ,EAAkBmN,EAAlB,EAAsB/P,IAAtB,CAAP;GAx0BU;UAAA,oBA20BF4C,IA30BE,EA20BI8J,KA30BJ,EA20BW1M,IA30BX,EA20BiB;YACnB8iB,IAAR,CAAa,+DAAb;WACO,KAAK5L,SAAL,CAAetU,IAAf,EAAqB8J,KAArB,EAA4B1M,IAA5B,CAAP;GA70BU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAA,gBAm6BN4C,IAn6BM,EAm6BAmN,EAn6BA,EAm6BI/P,IAn6BJ,EAm6BU;;;aACXA,OAAO,EAAhB;QACMgH,SAAS,KAAKqb,SAAL,CAAezf,IAAf,CAAf;QACM2hB,eAAe,KAAKb,eAAL,CAAqB9gB,IAArB,EAA2BmN,EAA3B,CAArB;QACMyU,iBAAiBxkB,KAAKwkB,cAAL,KAAwB3kB,SAAxB,GAAoC,KAAK2kB,cAAzC,GAA0DxkB,KAAKwkB,cAAtF;UACMxR,CAAN,CAAQhT,IAAR,EAAcgH,MAAd;;QAEIud,iBAAiB/kB,MAAMM,UAAN,CAAiB0kB,cAAjB,IAAmCA,eAAe1lB,IAAf,CAAoB,IAApB,EAA0B8D,IAA1B,EAAgCmN,EAAhC,EAAoC/P,IAApC,CAAnC,GAA+EwkB,cAAhG,CAAJ,EAAqH;aAC5GD,YAAP;;QAEIxc,OAAO,KAAK0c,UAAL,CAAgB7hB,IAAhB,EAAsBmN,EAAtB,EAA0B/P,IAA1B,CAAb;;QAEIA,KAAK0kB,KAAL,IAAc,CAAC3c,IAAnB,EAAyB;UACjB4c,UAAU,KAAKjB,eAAL,CAAqB9gB,IAArB,EAA2BmN,EAA3B,IAAiCwS,UAAUnkB,SAAV,CAAoBwmB,IAApB,CAAyB9lB,IAAzB,CAA8B,IAA9B,EAAoC8D,IAApC,EAA0CmN,EAA1C,EAA8C/P,IAA9C,CAAjD;aACO2kB,QACJvU,IADI,CACC,UAACpM,MAAD,EAAY;eACT,OAAK0f,eAAL,CAAqB9gB,IAArB,EAA2BmN,EAA3B,CAAP;iBACS,OAAKwP,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAT;eACK6kB,SAAL,CAAejiB,IAAf,EAAqBoB,MAArB,EAA6B+L,EAA7B,EAAiC/P,IAAjC;eACOgE,MAAP;OALG,EAMF,UAACrB,GAAD,EAAS;eACH,OAAK+gB,eAAL,CAAqB9gB,IAArB,EAA2BmN,EAA3B,CAAP;eACOvQ,MAAMmJ,MAAN,CAAahG,GAAb,CAAP;OARG,CAAP;;;WAYKnD,MAAMoJ,OAAN,CAAcb,IAAd,CAAP;GA77BU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAA,mBAmhCHnF,IAnhCG,EAmhCG8J,KAnhCH,EAmhCU1M,IAnhCV,EAmhCgB;;;aACjBA,OAAO,EAAhB;QACMgH,SAAS,KAAKqb,SAAL,CAAezf,IAAf,CAAf;QACMghB,OAAO,KAAKU,SAAL,CAAe1hB,IAAf,EAAqB8J,KAArB,EAA4B1M,IAA5B,CAAb;QACMukB,eAAe,KAAKb,eAAL,CAAqB9gB,IAArB,EAA2BghB,IAA3B,CAArB;QACMkB,oBAAoB9kB,KAAK8kB,iBAAL,KAA2BjlB,SAA3B,GAAuC,KAAKilB,iBAA5C,GAAgE9kB,KAAK8kB,iBAA/F;UACM9R,CAAN,CAAQhT,IAAR,EAAcgH,MAAd;;QAEIud,iBAAiB/kB,MAAMM,UAAN,CAAiBglB,iBAAjB,IAAsCA,kBAAkBhmB,IAAlB,CAAuB,IAAvB,EAA6B8D,IAA7B,EAAmC8J,KAAnC,EAA0C1M,IAA1C,CAAtC,GAAwF8kB,iBAAzG,CAAJ,EAAiI;aACxHP,YAAP;;;QAGI9K,QAAQ,KAAKsL,aAAL,CAAmBniB,IAAnB,EAAyBghB,IAAzB,EAA+B5jB,IAA/B,CAAd;;QAEIA,KAAK0kB,KAAL,IAAc,CAACjL,KAAnB,EAA0B;UAClBkL,UAAU,KAAKjB,eAAL,CAAqB9gB,IAArB,EAA2BghB,IAA3B,IAAmCrB,UAAUnkB,SAAV,CAAoB4mB,OAApB,CAA4BlmB,IAA5B,CAAiC,IAAjC,EAAuC8D,IAAvC,EAA6C8J,KAA7C,EAAoD1M,IAApD,CAAnD;aACO2kB,QACJvU,IADI,CACC,UAACpM,MAAD,EAAY;eACT,OAAK0f,eAAL,CAAqB9gB,IAArB,EAA2BghB,IAA3B,CAAP;iBACS,OAAKrE,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAT;eACKilB,YAAL,CAAkBriB,IAAlB,EAAwBoB,MAAxB,EAAgC4f,IAAhC,EAAsC5jB,IAAtC;eACOgE,MAAP;OALG,EAMF,UAACrB,GAAD,EAAS;eACH,OAAK+gB,eAAL,CAAqB9gB,IAArB,EAA2BghB,IAA3B,CAAP;eACOpkB,MAAMmJ,MAAN,CAAahG,GAAb,CAAP;OARG,CAAP;;;WAYKnD,MAAMoJ,OAAN,CAAc6Q,KAAd,CAAP;GA/iCU;;;;;;;;;;;;;;eAAA,yBA6jCG7W,IA7jCH,EA6jCS;QACb4H,aAAa,KAAKiZ,YAAL,CAAkB7gB,IAAlB,CAAnB;QACI,CAAC4H,UAAL,EAAiB;YACThL,MAAMmD,GAAN,CAAanF,QAAb,qBAAqCoF,IAArC,EAA2C,GAA3C,EAAgD,YAAhD,CAAN;;WAEK4H,UAAP;GAlkCU;;;;;;;;;;;;;;;;;;WAAA,qBAolCD5H,IAplCC,EAolCK8J,KAplCL,EAolCY1M,IAplCZ,EAolCkB;WACrBR,MAAM0lB,MAAN,CAAaxY,SAAS,EAAtB,CAAP;GArlCU;QAAA,kBAwlCJ9J,IAxlCI,EAwlCEyM,OAxlCF,EAwlCWrP,IAxlCX,EAwlCiB;YACnB8iB,IAAR,CAAa,uDAAb;WACO,KAAK1U,GAAL,CAASxL,IAAT,EAAeyM,OAAf,EAAwBrP,IAAxB,CAAP;GA1lCU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBA2nCJ4C,IA3nCI,EA2nCEmN,EA3nCF,EA2nCM/P,IA3nCN,EA2nCY;QAChB+G,SAAS,KAAKwH,aAAL,CAAmB3L,IAAnB,EAAyBgQ,MAAzB,CAAgC7C,EAAhC,EAAoC/P,IAApC,CAAf;QACI+G,MAAJ,EAAY;WACLoe,aAAL,CAAmBviB,IAAnB,EAAyB,CAACmE,MAAD,CAAzB,EAAmC/G,IAAnC;;WAEK+G,MAAP;GAhoCU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBAqqCDnE,IArqCC,EAqqCK8J,KArqCL,EAqqCY1M,IArqCZ,EAqqCkB;QACxB,CAAC0M,KAAD,IAAU,CAACvO,OAAOwD,IAAP,CAAY+K,KAAZ,EAAmBvL,MAAlC,EAA0C;WACnCkiB,iBAAL,CAAuBzgB,IAAvB,IAA+B,EAA/B;KADF,MAEO;WACAygB,iBAAL,CAAuBzgB,IAAvB,EAA6B,KAAK0hB,SAAL,CAAe1hB,IAAf,EAAqB8J,KAArB,EAA4B1M,IAA5B,CAA7B,IAAkEH,SAAlE;;QAEIwP,UAAU,KAAKd,aAAL,CAAmB3L,IAAnB,EAAyBsU,SAAzB,CAAmCxK,KAAnC,EAA0C1M,IAA1C,CAAhB;QACIqP,QAAQlO,MAAZ,EAAoB;WACbgkB,aAAL,CAAmBviB,IAAnB,EAAyByM,OAAzB,EAAkCrP,IAAlC;;WAEKqP,OAAP;GA/qCU;;;;;;;;;;;;;;;;;eAAA,yBAgsCGzM,IAhsCH,EAgsCSyM,OAhsCT,EAgsCkBrP,IAhsClB,EAgsCwB;;;QAC9B,CAACR,MAAM2D,OAAN,CAAckM,OAAd,CAAL,EAA6B;gBACjB,CAACA,OAAD,CAAV;;UAEIiE,eAAN,CAAsB,KAAK+O,SAAL,CAAezf,IAAf,CAAtB,EAA4C5C,IAA5C,EAAkD,UAACC,GAAD,EAAMW,QAAN,EAAmB;cAC3DtB,OAAR,CAAgB,UAACyH,MAAD,EAAY;YACtBkI,oBAAJ;YACIvC,cAAJ;YACIzM,IAAIyO,UAAJ,KAAmBzO,IAAI2F,IAAJ,KAAaiI,UAAb,IAA2B5N,IAAI2F,IAAJ,KAAagI,WAA3D,CAAJ,EAA6E;qCAChE3N,IAAIyO,UAAf,EAA4BzO,IAAImlB,aAAJ,CAAkBre,MAAlB,CAA5B;SADF,MAEO,IAAI9G,IAAI2F,IAAJ,KAAagI,WAAb,IAA4B3N,IAAIsQ,SAApC,EAA+C;kBAC5C;sCAEHtQ,IAAIa,WAAJ,GAAkB+N,WADrB,EACmC;oBACzBrP,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB9G,IAAIsQ,SAAtB;aAFV;WADF;SADK,MAQA,IAAItQ,IAAI2F,IAAJ,KAAagI,WAAb,IAA4B3N,IAAIuQ,WAApC,EAAiD;kBAC9C;sCAEHvQ,IAAIuQ,WADP,EACqB;0BACLvQ,IAAImlB,aAAJ,CAAkBre,MAAlB;aAFhB;WADF;SADK,MAQA,IAAI9G,IAAI2F,IAAJ,KAAa+H,aAAjB,EAAgC;wBACvB,QAAKiF,MAAL,CAAY3S,IAAII,QAAhB,EAA0BJ,IAAImlB,aAAJ,CAAkBre,MAAlB,CAA1B,EAAqDnG,QAArD,CAAd;;YAEE8L,KAAJ,EAAW;wBACK,QAAKwK,SAAL,CAAejX,IAAII,QAAnB,EAA6BqM,KAA7B,EAAoC9L,QAApC,CAAd;;YAEEqO,WAAJ,EAAiB;cACXzP,MAAM2D,OAAN,CAAc8L,WAAd,KAA8B,CAACA,YAAY9N,MAA/C,EAAuD;;;cAGnDlB,IAAI2F,IAAJ,KAAaiI,UAAjB,EAA6B;0BACboB,YAAY,CAAZ,CAAd;;cAEEU,aAAJ,CAAkB5I,MAAlB,EAA0BkI,WAA1B;;OAlCJ;KADF;GApsCU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAAA,kBAm0CJrM,IAn0CI,EAm0CEmN,EAn0CF,EAm0CMhJ,MAn0CN,EAm0Cc/G,IAn0Cd,EAm0CoB;;;aACrBA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoBinB,MAApB,CAA2BvmB,IAA3B,CAAgC,IAAhC,EAAsC8D,IAAtC,EAA4CmN,EAA5C,EAAgDhJ,MAAhD,EAAwD/G,IAAxD,EACJoQ,IADI,CACC,UAACpM,MAAD;aAAY,QAAKub,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAZ;KADD,CAAP;GAr0CU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAA,qBA+5CD4C,IA/5CC,EA+5CKnB,KA/5CL,EA+5CYiL,KA/5CZ,EA+5CmB1M,IA/5CnB,EA+5CyB;;;aAC1BA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoBknB,SAApB,CAA8BxmB,IAA9B,CAAmC,IAAnC,EAAyC8D,IAAzC,EAA+CnB,KAA/C,EAAsDiL,KAAtD,EAA6D1M,IAA7D,EACJoQ,IADI,CACC,UAACpM,MAAD;aAAY,QAAKub,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAZ;KADD,CAAP;GAj6CU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAA,sBA2/CA4C,IA3/CA,EA2/CMyM,OA3/CN,EA2/CerP,IA3/Cf,EA2/CqB;;;aACtBA,OAAO,EAAhB;WACOuiB,UAAUnkB,SAAV,CAAoBmnB,UAApB,CAA+BzmB,IAA/B,CAAoC,IAApC,EAA0C8D,IAA1C,EAAgDyM,OAAhD,EAAyDrP,IAAzD,EACJoQ,IADI,CACC,UAACpM,MAAD;aAAY,QAAKub,IAAL,CAAU3c,IAAV,EAAgBoB,MAAhB,EAAwBhE,IAAxB,CAAZ;KADD,CAAP;;CA7/CJ;;AAkgDAgjB,yBAAyB1jB,OAAzB,CAAiC,UAAUmhB,MAAV,EAAkB;UAC3CA,MAAN,IAAgB,UAAU7d,IAAV,EAAyB;;;uCAAN+C,IAAM;UAAA;;;WAChC,uBAAK4I,aAAL,CAAmB3L,IAAnB,GAAyB6d,MAAzB,wBAAoC9a,IAApC,CAAP;GADF;CADF;;AAMA,oBAAe4c,UAAU9Y,MAAV,CAAiBhI,OAAjB,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACl3DA,IAAMjE,WAAS,kBAAf;;;;;;;;;;;;;;;;;AAiBA,SAASgoB,gBAAT,CAA2BnW,OAA3B,EAAoCrP,IAApC,EAA0C;QAClCuG,cAAN,CAAqB,IAArB,EAA2Bif,gBAA3B;;SAEOxjB,gBAAP,CAAwB,IAAxB,EAA8B;YACpB;aACC;KAFmB;eAIjB;gBACC,IADD;aAEFnC;;GANX;;eAUWf,IAAX,CAAgB,IAAhB,EAAsBuQ,OAAtB,EAA+BrP,IAA/B;;;MAGI,CAAC,KAAKsO,SAAV,EAAqB;UACb9O,MAAMmD,GAAN,UAAiBnF,QAAjB,EAA2B,gBAA3B,EAA6C,GAA7C,EAAkD,WAAlD,EAA+D,KAAK8Q,SAApE,CAAN;;;;AAIJ,yBAAe4H,aAAWzM,MAAX,CAAkB;eAClB+b,gBADkB;;UAAA,oBAGrBze,MAHqB,EAGbuW,SAHa,EAGF;;SAEtB4G,MAAL,CAAY,KAAKxT,QAAL,CAAc3J,MAAd,CAAZ,IAAqCuW,SAArC;;QAEI9d,MAAMM,UAAN,CAAiBiH,OAAOqC,IAAxB,CAAJ,EAAmC;aAC1BA,IAAP,CAAY,GAAZ,EAAiBkU,SAAjB;;GAR2B;YAAA,sBAYnBvW,MAZmB,EAYX;WACX,KAAKmd,MAAL,CAAY,KAAKxT,QAAL,CAAc3J,MAAd,CAAZ,CAAP;QACIvH,MAAMM,UAAN,CAAiBiH,OAAOqC,IAAxB,CAAJ,EAAmC;aAC1BA,IAAP,CAAY,GAAZ,EADiC;;GAdN;gBAAA,4BAmBN;sCAANzD,IAAM;UAAA;;;iBACZvH,SAAX,CAAqB0Y,cAArB,CAAoC1R,KAApC,CAA0C,IAA1C,EAAgDO,IAAhD;QACM8f,QAAQ9f,KAAK,CAAL,CAAd;;;QAGInG,MAAM6H,QAAN,CAAeoe,KAAf,KAAyBA,MAAM1lB,OAAN,CAAc,QAAd,MAA4B,CAAzD,EAA4D;WACrD4W,aAAL,CAAmBhR,KAAK,CAAL,CAAnB;;GAzB2B;KAAA,eA6B1B0J,OA7B0B,EA6BjBrP,IA7BiB,EA6BX;;;QACZgH,SAAS,KAAKA,MAApB;QACMsW,YAAY,IAAIha,IAAJ,GAAWC,OAAX,EAAlB;QACMgT,WAAW/W,MAAM+B,QAAN,CAAe8N,OAAf,KAA2B,CAAC7P,MAAM2D,OAAN,CAAckM,OAAd,CAA7C;;QAEIkH,QAAJ,EAAc;gBACF,CAAClH,OAAD,CAAV;;cAEQ6G,aAAW9X,SAAX,CAAqBgQ,GAArB,CAAyBtP,IAAzB,CAA8B,IAA9B,EAAoCuQ,OAApC,EAA6CrP,IAA7C,CAAV;;QAEIgH,OAAOC,YAAP,CAAoB9F,MAApB,IAA8BkO,QAAQlO,MAA1C,EAAkD;;;aAGzC8F,YAAP,CAAoB3H,OAApB,CAA4B,UAAUW,GAAV,EAAe;YACrCylB,gBAAJ,CAAqBrW,OAArB;OADF;;;YAKM/P,OAAR,CAAgB,UAACyH,MAAD;aAAY,MAAK4e,QAAL,CAAc5e,MAAd,EAAsBuW,SAAtB,CAAZ;KAAhB;;WAEO/G,WAAWlH,QAAQ,CAAR,CAAX,GAAwBA,OAA/B;GAjD6B;QAAA,kBAoDvBgI,UApDuB,EAoDXrX,IApDW,EAoDL;QAClBgH,SAAS,KAAKA,MAApB;QACMD,SAASmP,aAAW9X,SAAX,CAAqBwU,MAArB,CAA4B9T,IAA5B,CAAiC,IAAjC,EAAuCuY,UAAvC,EAAmDrX,IAAnD,CAAf;QACI+G,MAAJ,EAAY;WACL6e,UAAL,CAAgB7e,MAAhB;;;QAGEC,OAAOC,YAAP,CAAoB9F,MAApB,IAA8B4F,MAAlC,EAA0C;aACjCE,YAAP,CAAoB3H,OAApB,CAA4B,UAAUW,GAAV,EAAe;YACrC4lB,mBAAJ,CAAwB7e,MAAxB,EAAgC,CAACD,MAAD,CAAhC;OADF;;;WAKKA,MAAP;GAjE6B;WAAA,qBAoEpB2F,KApEoB,EAoEb1M,IApEa,EAoEP;QAChBgH,SAAS,KAAKA,MAApB;QACMqI,UAAU6G,aAAW9X,SAAX,CAAqB8Y,SAArB,CAA+BpY,IAA/B,CAAoC,IAApC,EAA0C4N,KAA1C,EAAiD1M,IAAjD,CAAhB;YACQV,OAAR,CAAgB,KAAKsmB,UAArB,EAAiC,IAAjC;;QAEI5e,OAAOC,YAAP,CAAoB9F,MAApB,IAA8BkO,QAAQlO,MAA1C,EAAkD;aACzC8F,YAAP,CAAoB3H,OAApB,CAA4B,UAAUW,GAAV,EAAe;YACrC4lB,mBAAJ,CAAwB7e,MAAxB,EAAgCqI,OAAhC;OADF;;;WAKKA,OAAP;;CA/EW,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AChCA,IAAMyW,qBAAqB;;;;;;;;;;mBAUR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAVnB,CA8DA,SAASC,SAAT,CAAoB/lB,IAApB,EAA0B;QAClBuG,cAAN,CAAqB,IAArB,EAA2Bwf,SAA3B;;WAES/lB,OAAO,EAAhB;;QAEMa,MAAN,CAAab,IAAb,EAAmB8lB,kBAAnB;OACKtC,eAAL,KAAyBxjB,KAAKwjB,eAAL,GAAuBgC,kBAAhD;gBACY1mB,IAAZ,CAAiB,IAAjB,EAAuBkB,IAAvB;;;AAGF,IAAMyB,UAAQ;eACCskB,SADD;;cAAA,wBAGEnjB,IAHF,EAGQ5C,IAHR,EAGc;;QAElB8jB,OAAO,IAAb;QACM9c,SAASuc,cAAYnlB,SAAZ,CAAsB2kB,YAAtB,CAAmCjkB,IAAnC,CAAwCglB,IAAxC,EAA8ClhB,IAA9C,EAAoD5C,IAApD,CAAf;QACM6O,cAAc7H,OAAO6H,WAA3B;QACMrE,aAAa,KAAK+D,aAAL,CAAmB3L,IAAnB,CAAnB;;WAEOqE,YAAP,CAAoB3H,OAApB,CAA4B,UAAUW,GAAV,EAAe;UACnCI,WAAWJ,IAAII,QAArB;UACMK,aAAaT,IAAIS,UAAvB;UACMvB,kBAAgBuB,UAAtB;UACMgO,aAAazO,IAAIyO,UAAvB;UACM9I,OAAO3F,IAAI2F,IAAjB;UACMogB,aAAa,EAAEzlB,OAAOmO,UAAT,EAAnB;UACI7M,mBAAJ;;UAEM0D,SAAS,SAATA,MAAS,GAAY;eAAS,KAAK6M,IAAL,CAAUjT,IAAV,CAAP;OAA7B;;UAEIyG,SAAS+H,aAAb,EAA4B;YACtB,CAACnD,WAAWoM,OAAX,CAAmBlI,UAAnB,CAAL,EAAqC;qBACxBuV,WAAX,CAAuBvV,UAAvB;;;qBAGW;eACNnJ,MADM;;;aAAA,eAINwB,MAJM,EAIE;;gBAEL0L,gBAAgB,KAAKL,IAAL,CAAUjT,IAAV,CAAtB;;gBAEI4H,WAAW0L,aAAf,EAA8B;qBACrBA,aAAP;;gBAEI1C,KAAKvQ,MAAM+J,GAAN,CAAU,IAAV,EAAgBsF,WAAhB,CAAX;gBACM6D,aAAazS,IAAIgmB,UAAJ,CAAejf,MAAf,CAAnB;;;;gBAIIyL,iBAAiBC,UAArB,EAAiC;mBAC1BwT,qBAAL,CAA2BzT,aAA3B,EAA0C1C,EAA1C,EAA8C2C,UAA9C,EAA0D7D,WAA1D;;gBAEE9H,MAAJ,EAAY;;kBAEJof,qBAAqBlmB,IAAIa,WAAJ,GAAkB+N,WAA7C;kBACMe,YAAYpQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkBof,kBAAlB,CAAlB;;;kBAGIvW,cAAc/P,SAAd,IAA2B,KAAKuS,IAAL,CAAU,GAAV,CAA/B,EAA+C;yBACpC0R,KAAKva,GAAL,CAASlJ,QAAT,EAAmBuP,SAAnB,KAAiC7I,MAA1C;;;;;;0BAMU,IAAZ,EAAkBrG,UAAlB,EAA8BqG,MAA9B;0BACY,IAAZ,EAAkB2H,UAAlB,EAA8BkB,SAA9B;yBACWwW,WAAX,CAAuB,IAAvB,EAA6BJ,UAA7B;;kBAEItT,UAAJ,EAAgB;qBACT2T,oBAAL,CAA0Btf,MAA1B,EAAkCgJ,EAAlC,EAAsC2C,UAAtC,EAAkD7D,WAAlD;;aAlBJ,MAoBO;;;;0BAIO,IAAZ,EAAkBnO,UAAlB,EAA8Bb,SAA9B;;mBAEKkH,MAAP;;SA7CJ;;YAiDIuf,uBAAuBnoB,OAAO2D,wBAAP,CAAgCkF,OAAOsX,WAAP,CAAmBlgB,SAAnD,EAA8DsQ,UAA9D,CAA3B;YACI,CAAC4X,oBAAL,EAA2B;iCACF;wBACT;WADd;;YAIIvJ,cAAcuJ,qBAAqB/c,GAAzC;6BACqBA,GAArB,GAA2B,YAAY;cACjCwT,WAAJ,EAAiB;mBACRA,YAAYje,IAAZ,CAAiB,IAAjB,CAAP;;iBAEK,KAAKsT,IAAL,YAAmB1D,UAAnB,CAAP;SAJF;YAMM8O,cAAc8I,qBAAqBxd,GAAzC;6BACqBA,GAArB,GAA2B,UAAUpK,KAAV,EAAiB;;;cACtC8e,WAAJ,EAAiB;wBACH1e,IAAZ,CAAiB,IAAjB,EAAuBJ,KAAvB;;cAEI+T,gBAAgBjT,MAAM+J,GAAN,CAAU,IAAV,EAAgB7I,UAAhB,CAAtB;cACMqP,KAAKvQ,MAAM+J,GAAN,CAAU,IAAV,EAAgBsF,WAAhB,CAAX;cACM6D,aAAazS,IAAIgmB,UAAJ,CAAejf,MAAf,CAAnB;cACMuf,kBAAkB9T,gBAAgBjT,MAAM+J,GAAN,CAAUkJ,aAAV,EAAyBxS,IAAIa,WAAJ,GAAkB+N,WAA3C,CAAhB,GAA0EhP,SAAlG;;cAEI4S,iBAAiB8T,oBAAoB1mB,SAArC,IAAkD0mB,oBAAoB7nB,KAA1E,EAAiF;gBAC3EgU,WAAW9M,IAAX,KAAoBiI,UAAxB,EAAoC;0BACtB4E,aAAZ,EAA2BC,WAAWhS,UAAtC,EAAkDb,SAAlD;aADF,MAEO,IAAI6S,WAAW9M,IAAX,KAAoBgI,WAAxB,EAAqC;kBACpC+E,WAAWnT,MAAM+J,GAAN,CAAUkJ,aAAV,EAAyBC,WAAWhS,UAApC,CAAjB;kBACIqP,OAAOlQ,SAAX,EAAsB;sBACd+S,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;yBAAWA,eAAX;iBAAvB;eADF,MAEO;sBACCD,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;yBAAWA,mBAAkB9C,OAAOvQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBhE,WAAjB,CAApC;iBAAvB;;;;;sBAKM,IAAZ,EAAkBH,UAAlB,EAA8BhQ,KAA9B;qBACW0nB,WAAX,CAAuB,IAAvB,EAA6BJ,UAA7B;;cAEKtnB,UAAUmB,SAAV,IAAuBnB,UAAU,IAAtC,EAA6C;gBACvC6nB,oBAAoB1mB,SAAxB,EAAmC;;oBAE3BiJ,GAAN,CAAU,IAAV,EAAgBpI,UAAhB,EAA4Bb,SAA5B;;WAHJ,MAKO,IAAI,KAAKuS,IAAL,CAAU,GAAV,CAAJ,EAAoB;gBACnBoU,cAAc1C,KAAKva,GAAL,CAASlJ,QAAT,EAAmB3B,KAAnB,CAApB;gBACI8nB,WAAJ,EAAiB;oBACT1d,GAAN,CAAU,IAAV,EAAgBpI,UAAhB,EAA4B8lB,WAA5B;;;SAjCN;eAqCO5f,cAAP,CAAsBI,OAAOsX,WAAP,CAAmBlgB,SAAzC,EAAoDsQ,UAApD,EAAgE4X,oBAAhE;OAzGF,MA0GO,IAAI1gB,SAASgI,WAAb,EAA0B;YACzB2C,YAAYtQ,IAAIsQ,SAAtB;YACMC,cAAcvQ,IAAIuQ,WAAxB;;;YAGIsT,KAAKL,YAAL,CAAkBpjB,QAAlB,KAA+BqO,UAA/B,IAA6C,CAACoV,KAAKvV,aAAL,CAAmBlO,QAAnB,EAA6BuW,OAA7B,CAAqClI,UAArC,CAAlD,EAAoG;eAC7FH,aAAL,CAAmBlO,QAAnB,EAA6B4jB,WAA7B,CAAyCvV,UAAzC;;;qBAGW;aAAA,iBACJ;gBACDwO,UAAU3X,OAAOzG,IAAP,CAAY,IAAZ,CAAd;gBACI,CAACoe,OAAL,EAAc;mBACP9T,IAAL,CAAUjK,IAAV,EAAgB,EAAhB;;mBAEKoG,OAAOzG,IAAP,CAAY,IAAZ,CAAP;WANS;;;;;aAAA,eAWNuQ,OAXM,EAWG;;;gBACRA,WAAW,CAAC7P,MAAM2D,OAAN,CAAckM,OAAd,CAAhB,EAAwC;wBAC5B,CAACA,OAAD,CAAV;;gBAEIU,KAAKvQ,MAAM+J,GAAN,CAAU,IAAV,EAAgBsF,WAAhB,CAAX;gBACMsX,qBAAqBlmB,IAAIa,WAAJ,GAAkB+N,WAA7C;gBACM6D,aAAazS,IAAIgmB,UAAJ,CAAejf,MAAf,CAAnB;gBACMyf,oBAAoB/T,WAAWhS,UAArC;gBACMwc,UAAU,KAAK9K,IAAL,CAAUjT,IAAV,KAAmB,EAAnC;gBACMunB,SAAS,EAAf;gBACMC,YAAY,EAAlB;;gBAEItX,OAAJ,EAAa;sBACH/P,OAAR,CAAgB,UAACyH,MAAD,EAAY;;oBAEpB6I,YAAYpQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkBof,kBAAlB,CAAlB;oBACM1T,gBAAgBjT,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB0f,iBAAlB,CAAtB;oBACIhU,iBAAiBA,wBAArB,EAA6C;sBACrCmU,0BAA0BpnB,MAAM+J,GAAN,CAAUkJ,aAAV,EAAyB/R,UAAzB,CAAhC;;sBAEIkP,cAAc/P,SAAlB,EAA6B;0BACrB+S,MAAN,CAAagU,uBAAb,EAAsC,UAAC/T,KAAD;6BAAWA,UAAU9L,MAArB;qBAAtC;mBADF,MAEO;0BACC6L,MAAN,CAAagU,uBAAb,EAAsC,UAAC/T,KAAD;6BAAWA,UAAU9L,MAAV,IAAoB6I,cAAcpQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBsT,kBAAjB,CAA7C;qBAAtC;;;oBAGAvW,cAAc/P,SAAlB,EAA6B;sBACvB,OAAKuS,IAAL,CAAU,GAAV,CAAJ,EAAoB;;6BAET0R,KAAKva,GAAL,CAASlJ,QAAT,EAAmBuP,SAAnB,KAAiC7I,MAA1C;;;4BAGQ6I,SAAV,IAAuB7I,MAAvB;;uBAEKhD,IAAP,CAAYgD,MAAZ;eArBF;;;;gBA0BE2H,UAAJ,EAAgB;sBACNpP,OAAR,CAAgB,UAACyH,MAAD,EAAY;;oBAEpB6I,YAAYpQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkBof,kBAAlB,CAAlB;oBACKvW,cAAc/P,SAAd,IAA2B6mB,OAAO3mB,OAAP,CAAegH,MAAf,MAA2B,CAAC,CAAxD,IAA+D6I,cAAc/P,SAAd,IAA2B,EAAE+P,aAAa+W,SAAf,CAA9F,EAA0H;;sBAEpHtX,OAAJ,EAAa;;gCAECtI,MAAZ,EAAoB2H,UAApB,EAAgC7O,SAAhC;;yBAEK0O,aAAL,CAAmBlO,QAAnB,EAA6B+lB,WAA7B,CAAyCrf,MAAzC,EAAiDif,UAAjD;;;8BAGUjf,MAAZ,EAAoB0f,iBAApB,EAAuC5mB,SAAvC;;eAZJ;qBAeOP,OAAP,CAAe,UAACyH,MAAD,EAAY;;;4BAGbA,MAAZ,EAAoB2H,UAApB,EAAgCqB,EAAhC;;qBAEKxB,aAAL,CAAmBlO,QAAnB,EAA6B+lB,WAA7B,CAAyCrf,MAAzC,EAAiDif,UAAjD;;4BAEYjf,MAAZ,EAAoB0f,iBAApB;eAPF;aAhBF,MAyBO,IAAIlW,SAAJ,EAAe;;;;kBAIdI,MAAM+V,OAAOhlB,GAAP,CAAW,UAACmR,KAAD;uBAAWrT,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBsT,kBAAjB,CAAX;eAAX,EAA4DzhB,MAA5D,CAAmE,UAACqL,EAAD;uBAAQA,OAAOlQ,SAAf;eAAnE,CAAZ;;oBAEMiJ,GAAN,CAAU,IAAV,EAAgByH,SAAhB,EAA2BI,GAA3B;;kBAEI+B,WAAWlC,WAAf,EAA4B;wBAClBlR,OAAR,CAAgB,UAACuT,KAAD,EAAW;sBACnBjD,YAAYpQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBsT,kBAAjB,CAAlB;sBACKvW,cAAc/P,SAAd,IAA2B6mB,OAAO3mB,OAAP,CAAe8S,KAAf,MAA0B,CAAC,CAAvD,IAA8DjD,cAAc/P,SAAd,IAA2B,EAAE+P,aAAa+W,SAAf,CAA7F,EAAyH;;;wBAGjHE,UAAUrnB,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiB4T,iBAAjB,KAAuC,EAAvD;;wBAEI1W,OAAOlQ,SAAX,EAAsB;4BACd+S,MAAN,CAAaiU,OAAb,EAAsB,UAAC7G,MAAD;+BAAYA,iBAAZ;uBAAtB;qBADF,MAEO;4BACCpN,MAAN,CAAaiU,OAAb,EAAsB,UAAC7G,MAAD;+BAAYA,qBAAmBjQ,OAAOvQ,MAAM+J,GAAN,CAAUyW,MAAV,EAAkBnR,WAAlB,CAAtC;uBAAtB;;;iBAVN;uBAcOvP,OAAP,CAAe,UAACuT,KAAD,EAAW;;sBAElBgU,UAAUrnB,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiB4T,iBAAjB,CAAhB;;sBAEI1W,OAAOlQ,SAAX,EAAsB;0BACdiT,SAAN,CAAgB+T,OAAhB,UAA+B,UAAC7G,MAAD;6BAAYA,iBAAZ;qBAA/B;mBADF,MAEO;0BACClN,SAAN,CAAgB+T,OAAhB,UAA+B,UAAC7G,MAAD;6BAAYA,qBAAmBjQ,OAAOvQ,MAAM+J,GAAN,CAAUyW,MAAV,EAAkBnR,WAAlB,CAAtC;qBAA/B;;iBAPJ;;aAvBG,MAkCA,IAAI2B,WAAJ,EAAiB;;;sBAGdlR,OAAR,CAAgB,UAAC0gB,MAAD,EAAY;oBACpBrP,MAAMnR,MAAM+J,GAAN,CAAUyW,MAAV,EAAkBxP,WAAlB,KAAkC,EAA9C;;sBAEMoC,MAAN,CAAajC,GAAb,EAAkB,UAACmW,IAAD;yBAAU/W,OAAO+W,IAAjB;iBAAlB;oBACMnU,WAAWnT,MAAM+J,GAAN,CAAUyW,MAAV,EAAkByG,iBAAlB,CAAjB;;oBAEI1W,OAAOlQ,SAAX,EAAsB;wBACd+S,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;2BAAWA,gBAAX;mBAAvB;iBADF,MAEO;wBACCD,MAAN,CAAaD,QAAb,EAAuB,UAACE,KAAD;2BAAWA,oBAAkB9C,OAAOvQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBhE,WAAjB,CAApC;mBAAvB;;eATJ;;qBAaOvP,OAAP,CAAe,UAAC0gB,MAAD,EAAY;oBACnBrP,MAAMnR,MAAM+J,GAAN,CAAUyW,MAAV,EAAkBxP,WAAlB,KAAkC,EAA9C;sBACMsC,SAAN,CAAgBnC,GAAhB,EAAqBZ,EAArB,EAAyB,UAAC+W,IAAD;yBAAU/W,OAAO+W,IAAjB;iBAAzB;oBACMnU,WAAWnT,MAAM+J,GAAN,CAAUyW,MAAV,EAAkByG,iBAAlB,CAAjB;oBACI1W,OAAOlQ,SAAX,EAAsB;wBACdiT,SAAN,CAAgBH,QAAhB,UAAgC,UAACE,KAAD;2BAAWA,gBAAX;mBAAhC;iBADF,MAEO;wBACCC,SAAN,CAAgBH,QAAhB,UAAgC,UAACE,KAAD;2BAAWA,oBAAkB9C,OAAOvQ,MAAM+J,GAAN,CAAUsJ,KAAV,EAAiBhE,WAAjB,CAApC;mBAAhC;;eAPJ;;;iBAYGzF,IAAL,CAAUjK,IAAV,EAAgBunB,MAAhB;mBACOA,MAAP;;SA1IJ;OATK,MAsJA,IAAI9gB,SAASiI,UAAb,EAAyB;;YAE1BiW,KAAKL,YAAL,CAAkBpjB,QAAlB,KAA+BqO,UAA/B,IAA6C,CAACoV,KAAKvV,aAAL,CAAmBlO,QAAnB,EAA6BuW,OAA7B,CAAqClI,UAArC,CAAlD,EAAoG;eAC7FH,aAAL,CAAmBlO,QAAnB,EAA6B4jB,WAA7B,CAAyCvV,UAAzC;;qBAEW;eACNnJ,MADM;;aAAA,eAGNwB,MAHM,EAGE;gBACLmW,UAAU,KAAK9K,IAAL,CAAUjT,IAAV,CAAhB;gBACI4H,WAAWmW,OAAf,EAAwB;qBACfA,OAAP;;gBAEIuJ,oBAAoBxmB,IAAIgmB,UAAJ,CAAejf,MAAf,EAAuBtG,UAAjD;;gBAEIwc,OAAJ,EAAa;0BACCA,OAAZ,EAAqBxO,UAArB,EAAiC7O,SAAjC;mBACK0O,aAAL,CAAmBlO,QAAnB,EAA6B+lB,WAA7B,CAAyClJ,OAAzC,EAAkD8I,UAAlD;0BACY9I,OAAZ,EAAqBuJ,iBAArB,EAAwC5mB,SAAxC;;gBAEEkH,MAAJ,EAAY;kBACJ6I,YAAYpQ,MAAM+J,GAAN,CAAUxC,MAAV,EAAkB9G,IAAIa,WAAJ,GAAkB+N,WAApC,CAAlB;;kBAEIe,cAAc/P,SAAlB,EAA6B;yBAClBikB,KAAKva,GAAL,CAASlJ,QAAT,EAAmBuP,SAAnB,KAAiC7I,MAA1C;;;;0BAIU,IAAZ,EAAkBrG,UAAlB,EAA8BqG,MAA9B;;;0BAGYA,MAAZ,EAAoB2H,UAApB,EAAgClP,MAAM+J,GAAN,CAAU,IAAV,EAAgBsF,WAAhB,CAAhC;mBACKN,aAAL,CAAmBlO,QAAnB,EAA6B+lB,WAA7B,CAAyCrf,MAAzC,EAAiDif,UAAjD;0BACYjf,MAAZ,EAAoB0f,iBAApB,EAAuC,IAAvC;aAbF,MAcO;;0BAEO,IAAZ,EAAkB/lB,UAAlB,EAA8Bb,SAA9B;;mBAEKkH,MAAP;;SAjCJ;;;UAsCElF,UAAJ,EAAgB;mBACHE,UAAX,GAAwB9B,IAAI8B,UAAJ,KAAmBlC,SAAnB,GAA+B,KAA/B,GAAuCI,IAAI8B,UAAnE;YACI9B,IAAIsJ,GAAR,EAAa;cACPwd,UAAUllB,WAAW0H,GAAzB;qBACWA,GAAX,GAAiB,YAAY;;;mBACpBtJ,IAAIsJ,GAAJ,CAAQtJ,GAAR,EAAa,IAAb,EAAmB;gDAAI0F,IAAJ;oBAAA;;;qBAAaohB,QAAQ3hB,KAAR,SAAoBO,IAApB,CAAb;aAAnB,CAAP;WADF;;YAIE1F,IAAI6I,GAAR,EAAa;cACPke,UAAUnlB,WAAWiH,GAAzB;qBACWA,GAAX,GAAiB,UAAU0F,OAAV,EAAmB;;;mBAC3BvO,IAAI6I,GAAJ,CAAQ7I,GAAR,EAAa,IAAb,EAAmBuO,OAAnB,EAA4B,UAAC9P,KAAD;qBAAWsoB,QAAQloB,IAAR,SAAmBJ,UAAUmB,SAAV,GAAsB2O,OAAtB,GAAgC9P,KAAnD,CAAX;aAA5B,CAAP;WADF;;eAIKkI,cAAP,CAAsBI,OAAOsX,WAAP,CAAmBlgB,SAAzC,EAAoDsC,UAApD,EAAgEmB,UAAhE;;KApUJ;;WAwUOmF,MAAP;GAlVU;SAAA,mBAqVHpE,IArVG,EAqVGmN,EArVH,EAqVO/P,IArVP,EAqVa;;;aACdA,OAAO,EAAhB;WACOujB,cAAYnlB,SAAZ,CAAsBgmB,OAAtB,CAA8BtlB,IAA9B,CAAmC,IAAnC,EAAyC8D,IAAzC,EAA+CmN,EAA/C,EAAmD/P,IAAnD,EAAyDoQ,IAAzD,CAA8D,UAACpM,MAAD,EAAY;UAC3E+C,eAAJ;UACI/G,KAAKuT,GAAT,EAAc;iBACHvP,OAAOyG,IAAhB;OADF,MAEO;iBACIzG,MAAT;;;UAGE+C,UAAU,OAAKkgB,eAAnB,EAAoC;YAC5BjF,QAAQxiB,MAAM2S,SAAN,CAAgBnS,IAAhB,CAAd;cACMW,OAAN,GAAgB,IAAhB;cACM2S,eAAN,CAAsB,OAAK+O,SAAL,CAAezf,IAAf,CAAtB,EAA4Cof,KAA5C,EAAmD,UAAC/hB,GAAD,EAAS;gBACpD6I,GAAN,CAAU/B,MAAV,EAAkB9G,IAAIS,UAAtB,EAAkCb,SAAlC;SADF;;aAIKmE,MAAP;KAfK,CAAP;GAvVU;YAAA,sBA0WApB,IA1WA,EA0WM8J,KA1WN,EA0Wa1M,IA1Wb,EA0WmB;;;aACpBA,OAAO,EAAhB;WACOujB,cAAYnlB,SAAZ,CAAsBimB,UAAtB,CAAiCvlB,IAAjC,CAAsC,IAAtC,EAA4C8D,IAA5C,EAAkD8J,KAAlD,EAAyD1M,IAAzD,EAA+DoQ,IAA/D,CAAoE,UAACpM,MAAD,EAAY;UACjFqL,gBAAJ;UACIrP,KAAKuT,GAAT,EAAc;kBACFvP,OAAOyG,IAAjB;OADF,MAEO;kBACKzG,MAAV;;;UAGEqL,WAAWA,QAAQlO,MAAnB,IAA6B,OAAK8lB,eAAtC,EAAuD;YAC/CjF,QAAQxiB,MAAM2S,SAAN,CAAgBnS,IAAhB,CAAd;cACMW,OAAN,GAAgB,IAAhB;cACM2S,eAAN,CAAsB,OAAK+O,SAAL,CAAezf,IAAf,CAAtB,EAA4Cof,KAA5C,EAAmD,UAAC/hB,GAAD,EAAS;kBAClDX,OAAR,CAAgB,UAACyH,MAAD,EAAY;kBACpB+B,GAAN,CAAU/B,MAAV,EAAkB9G,IAAIS,UAAtB,EAAkCb,SAAlC;WADF;SADF;;aAMKmE,MAAP;KAjBK,CAAP;;CA5WJ;;AAkYA,kBAAeuf,cAAY9Z,MAAZ,CAAmBhI,OAAnB,CAAf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpdA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,AAEA;;;;;;;;;;;;;AAaA,AAEA;;;;;;;;;;;;;;;;AAgBA,AAEA;;;;;;;;;;;;;;;AAeA,AAEA;;;;;;;;;;;;;;AAcA,AAEA;;;;;;;;AAQA,AAEA;;;;;;;;;;;AAWA,AAEA;;;;;;;;;;;;;;;;;;;;AAoBA,AAEA;;;;;;;;AAQA,AAEA;;;;;;;;;;;;;;;AAeA,AAEA;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,AAEA;;;;;;;;;;;;;;AAcA,AAEA;;;;;;;;;;;;;;AAcA,AAEA;;;;;;;;;;;;;;;;;;;AAmBA,AAAO,IAAMylB,UAAU,gBAAhB;;;;"} \ No newline at end of file +{"version":3,"file":"js-data.es2015.js","sources":["../src/utils.js","../src/Settable.js","../src/Component.js","../src/Query.js","../src/Relation.js","../src/Relation/BelongsTo.js","../src/Relation/HasMany.js","../src/Relation/HasOne.js","../src/relations.js","../src/decorators.js","../src/Record.js","../lib/mindex/_utils.js","../lib/mindex/index.js","../src/Collection.js","../src/Schema.js","../src/Mapper.js","../src/Container.js","../src/SimpleStore.js","../src/LinkedCollection.js","../src/DataStore.js","../src/index.js"],"sourcesContent":["/**\n * Utility methods used by JSData.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('foo')); // true\n *\n * @namespace utils\n * @type {Object}\n */\n\nconst DOMAIN = 'utils'\n\nconst INFINITY = 1 / 0\nconst MAX_INTEGER = 1.7976931348623157e+308\nconst BOOL_TAG = '[object Boolean]'\nconst DATE_TAG = '[object Date]'\nconst FUNC_TAG = '[object Function]'\nconst NUMBER_TAG = '[object Number]'\nconst OBJECT_TAG = '[object Object]'\nconst REGEXP_TAG = '[object RegExp]'\nconst STRING_TAG = '[object String]'\nconst objToString = Object.prototype.toString\nconst PATH = /^(.+)\\.(.+)$/\n\nconst ERRORS = {\n '400' () { return `expected: ${arguments[0]}, found: ${arguments[2] ? arguments[1] : typeof arguments[1]}` },\n '404' () { return `${arguments[0]} not found` }\n}\n\nconst toInteger = function (value) {\n if (!value) {\n return 0\n }\n // Coerce to number\n value = +value\n if (value === INFINITY || value === -INFINITY) {\n const sign = (value < 0 ? -1 : 1)\n return sign * MAX_INTEGER\n }\n const remainder = value % 1\n return value === value ? (remainder ? value - remainder : value) : 0 // eslint-disable-line\n}\n\nconst toStr = function (value) {\n return objToString.call(value)\n}\n\nconst isPlainObject = function (value) {\n return (!!value && typeof value === 'object' && value.constructor === Object)\n}\n\nconst mkdirP = function (object, path) {\n if (!path) {\n return object\n }\n const parts = path.split('.')\n parts.forEach(function (key) {\n if (!object[key]) {\n object[key] = {}\n }\n object = object[key]\n })\n return object\n}\n\nconst utils = {\n /**\n * Reference to the Promise constructor used by JSData. Defaults to\n * `window.Promise` or `global.Promise`.\n *\n * @example Make JSData use a different `Promise` constructor\n * import Promise from 'bluebird';\n * import { utils } from 'js-data';\n * utils.Promise = Promise;\n *\n * @name utils.Promise\n * @since 3.0.0\n * @type {Function}\n */\n Promise: Promise,\n\n /**\n * Shallow copy properties that meet the following criteria from `src` to\n * `dest`:\n *\n * - own enumerable\n * - not a function\n * - does not start with \"_\"\n *\n * @method utils._\n * @param {object} dest Destination object.\n * @param {object} src Source object.\n * @private\n * @since 3.0.0\n */\n _ (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (key && dest[key] === undefined && !utils.isFunction(value) && key.indexOf('_') !== 0) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Recursively iterates over relations found in `opts.with`.\n *\n * @method utils._forRelation\n * @param {object} opts Configuration options.\n * @param {Relation} def Relation definition.\n * @param {Function} fn Callback function.\n * @param {*} [thisArg] Execution context for the callback function.\n * @private\n * @since 3.0.0\n */\n _forRelation (opts, def, fn, thisArg) {\n const relationName = def.relation\n let containedName = null\n let index\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n if ((index = utils._getIndex(opts.with, relationName)) >= 0) {\n containedName = relationName\n } else if ((index = utils._getIndex(opts.with, def.localField)) >= 0) {\n containedName = def.localField\n }\n\n if (opts.withAll) {\n fn.call(thisArg, def, {})\n return\n } else if (!containedName) {\n return\n }\n let optsCopy = {}\n utils.fillIn(optsCopy, def.getRelation())\n utils.fillIn(optsCopy, opts)\n optsCopy.with = opts.with.slice()\n optsCopy._activeWith = optsCopy.with.splice(index, 1)[0]\n optsCopy.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n optsCopy.with[i] = relation.substr(containedName.length + 1)\n } else {\n optsCopy.with[i] = ''\n }\n })\n fn.call(thisArg, def, optsCopy)\n },\n\n /**\n * Find the index of a relation in the given list\n *\n * @method utils._getIndex\n * @param {string[]} list List to search.\n * @param {string} relation Relation to find.\n * @private\n * @returns {number}\n */\n _getIndex (list, relation) {\n let index = -1\n list.forEach(function (_relation, i) {\n if (_relation === relation) {\n index = i\n return false\n } else if (utils.isObject(_relation)) {\n if (_relation.relation === relation) {\n index = i\n return false\n }\n }\n })\n return index\n },\n\n /**\n * Define hidden (non-enumerable), writable properties on `target` from the\n * provided `props`.\n *\n * @example\n * import { utils } from 'js-data';\n * function Cat () {}\n * utils.addHiddenPropsToTarget(Cat.prototype, {\n * say () {\n * console.log('meow');\n * }\n * });\n * const cat = new Cat();\n * cat.say(); // \"meow\"\n *\n * @method utils.addHiddenPropsToTarget\n * @param {object} target That to which `props` should be added.\n * @param {object} props Properties to be added to `target`.\n * @since 3.0.0\n */\n addHiddenPropsToTarget (target, props) {\n const map = {}\n Object.keys(props).forEach(function (propName) {\n const descriptor = Object.getOwnPropertyDescriptor(props, propName)\n\n descriptor.enumerable = false\n map[propName] = descriptor\n })\n Object.defineProperties(target, map)\n },\n\n /**\n * Return whether the two objects are deeply different.\n *\n * @example\n * import { utils } from 'js-data';\n * utils.areDifferent({}, {}); // false\n * utils.areDifferent({ a: 1 }, { a: 1 }); // false\n * utils.areDifferent({ foo: 'bar' }, {}); // true\n *\n * @method utils.areDifferent\n * @param {object} a Base object.\n * @param {object} b Comparison object.\n * @param {object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Whether the two objects are deeply different.\n * @see utils.diffObjects\n * @since 3.0.0\n */\n areDifferent (newObject, oldObject, opts) {\n opts || (opts = {})\n const diff = utils.diffObjects(newObject, oldObject, opts)\n const diffCount = Object.keys(diff.added).length +\n Object.keys(diff.removed).length +\n Object.keys(diff.changed).length\n return diffCount > 0\n },\n\n /**\n * Verified that the given constructor is being invoked via `new`, as opposed\n * to just being called like a normal function.\n *\n * @example\n * import { utils } from 'js-data';\n * function Cat () {\n * utils.classCallCheck(this, Cat);\n * }\n * const cat = new Cat(); // this is ok\n * Cat(); // this throws an error\n *\n * @method utils.classCallCheck\n * @param {*} instance Instance that is being constructed.\n * @param {Constructor} ctor Constructor function used to construct the\n * instance.\n * @since 3.0.0\n * @throws {Error} Throws an error if the constructor is being improperly\n * invoked.\n */\n classCallCheck (instance, ctor) {\n if (!(instance instanceof ctor)) {\n throw utils.err(`${ctor.name}`)(500, 'Cannot call a class as a function')\n }\n },\n\n /**\n * Deep copy a value.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' } };\n * const b = utils.copy(a);\n * a === b; // false\n * utils.areDifferent(a, b); // false\n *\n * @param {*} from Value to deep copy.\n * @param {*} [to] Destination object for the copy operation.\n * @param {*} [stackFrom] For internal use.\n * @param {*} [stackTo] For internal use.\n * @param {string[]|RegExp[]} [blacklist] List of strings or RegExp of\n * properties to skip.\n * @param {boolean} [plain] Whether to make a plain copy (don't try to use\n * original prototype).\n * @returns {*} Deep copy of `from`.\n * @since 3.0.0\n */\n copy (from, to, stackFrom, stackTo, blacklist, plain) {\n if (!to) {\n to = from\n if (from) {\n if (utils.isArray(from)) {\n to = utils.copy(from, [], stackFrom, stackTo, blacklist, plain)\n } else if (utils.isDate(from)) {\n to = new Date(from.getTime())\n } else if (utils.isRegExp(from)) {\n to = new RegExp(from.source, from.toString().match(/[^/]*$/)[0])\n to.lastIndex = from.lastIndex\n } else if (utils.isObject(from)) {\n if (plain) {\n to = utils.copy(from, {}, stackFrom, stackTo, blacklist, plain)\n } else {\n to = utils.copy(from, Object.create(Object.getPrototypeOf(from)), stackFrom, stackTo, blacklist, plain)\n }\n }\n }\n } else {\n if (from === to) {\n throw utils.err(`${DOMAIN}.copy`)(500, 'Cannot copy! Source and destination are identical.')\n }\n\n stackFrom = stackFrom || []\n stackTo = stackTo || []\n\n if (utils.isObject(from)) {\n let index = stackFrom.indexOf(from)\n if (index !== -1) {\n return stackTo[index]\n }\n\n stackFrom.push(from)\n stackTo.push(to)\n }\n\n let result\n if (utils.isArray(from)) {\n let i\n to.length = 0\n for (i = 0; i < from.length; i++) {\n result = utils.copy(from[i], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[i])) {\n stackFrom.push(from[i])\n stackTo.push(result)\n }\n to.push(result)\n }\n } else {\n if (utils.isArray(to)) {\n to.length = 0\n } else {\n utils.forOwn(to, function (value, key) {\n delete to[key]\n })\n }\n for (var key in from) {\n if (from.hasOwnProperty(key)) {\n if (utils.isBlacklisted(key, blacklist)) {\n continue\n }\n result = utils.copy(from[key], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[key])) {\n stackFrom.push(from[key])\n stackTo.push(result)\n }\n to[key] = result\n }\n }\n }\n }\n return to\n },\n\n /**\n * Recursively shallow fill in own enumerable properties from `source` to\n * `dest`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.deepFillIn(b, a);\n * console.log(b); // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"bip\"}\n *\n * @method utils.deepFillIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.fillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n deepFillIn (dest, source) {\n if (source) {\n utils.forOwn(source, function (value, key) {\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepFillIn(existing, value)\n } else if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n }\n return dest\n },\n\n /**\n * Recursively shallow copy enumerable properties from `source` to `dest`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.deepFillIn(b, a);\n * console.log(b); // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"boop\"}\n *\n * @method utils.deepMixIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.fillIn\n * @see utils.deepFillIn\n * @since 3.0.0\n */\n deepMixIn (dest, source) {\n if (source) {\n for (var key in source) {\n const value = source[key]\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepMixIn(existing, value)\n } else {\n dest[key] = value\n }\n }\n }\n return dest\n },\n\n /**\n * Return a diff of the base object to the comparison object.\n *\n * @example\n * import { utils } from 'js-data';\n * const oldObject = { foo: 'bar', a: 1234 };\n * const newObject = { beep: 'boop', a: 5678 };\n * const diff = utils.diffObjects(oldObject, newObject);\n * console.log(diff.added); // {\"beep\":\"boop\"}\n * console.log(diff.changed); // {\"a\":5678}\n * console.log(diff.removed); // {\"foo\":undefined}\n *\n * @method utils.diffObjects\n * @param {object} newObject Comparison object.\n * @param {object} oldObject Base object.\n * @param {object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} The diff from the base object to the comparison object.\n * @see utils.areDifferent\n * @since 3.0.0\n */\n diffObjects (newObject, oldObject, opts) {\n opts || (opts = {})\n let equalsFn = opts.equalsFn\n let blacklist = opts.ignore\n const diff = {\n added: {},\n changed: {},\n removed: {}\n }\n if (!utils.isFunction(equalsFn)) {\n equalsFn = utils.deepEqual\n }\n\n const newKeys = Object.keys(newObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n const oldKeys = Object.keys(oldObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n\n // Check for properties that were added or changed\n newKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (equalsFn(oldValue, newValue)) {\n return\n }\n if (oldValue === undefined) {\n diff.added[key] = newValue\n } else {\n diff.changed[key] = newValue\n }\n })\n\n // Check for properties that were removed\n oldKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (newValue === undefined && oldValue !== undefined) {\n diff.removed[key] = undefined\n }\n })\n\n return diff\n },\n\n /**\n * Return whether the two values are equal according to the `==` operator.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.equal(1,1)); // true\n * console.log(utils.equal(1,'1')); // true\n * console.log(utils.equal(93, 66)); // false\n *\n * @method utils.equal\n * @param {*} a First value in the comparison.\n * @param {*} b Second value in the comparison.\n * @returns {boolean} Whether the two values are equal according to `==`.\n * @since 3.0.0\n */\n equal (a, b) {\n return a == b // eslint-disable-line\n },\n\n /**\n * Produce a factory function for making Error objects with the provided\n * metadata. Used throughout the various js-data components.\n *\n * @example\n * import { utils } from 'js-data';\n * const errorFactory = utils.err('domain', 'target');\n * const error400 = errorFactory(400, 'expected type', 'actual type');\n * console.log(error400); // [Error: [domain:target] expected: expected type, found: string\nhttp://www.js-data.io/v3.0/docs/errors#400]\n * @method utils.err\n * @param {string} domain Namespace.\n * @param {string} target Target.\n * @returns {Function} Factory function.\n * @since 3.0.0\n */\n err (domain, target) {\n return function (code) {\n const prefix = `[${domain}:${target}] `\n let message = ERRORS[code].apply(null, Array.prototype.slice.call(arguments, 1))\n message = `${prefix}${message}\nhttp://www.js-data.io/v3.0/docs/errors#${code}`\n return new Error(message)\n }\n },\n\n /**\n * Add eventing capabilities into the target object.\n *\n * @example\n * import { utils } from 'js-data';\n * const user = { name: 'John' };\n * utils.eventify(user);\n * user.on('foo', () => console.log(arguments));\n * user.emit('foo', 1, 'bar'); // should log to console values (1, \"bar\")\n *\n * @method utils.eventify\n * @param {object} target Target object.\n * @param {Function} [getter] Custom getter for retrieving the object's event\n * listeners.\n * @param {Function} [setter] Custom setter for setting the object's event\n * listeners.\n * @since 3.0.0\n */\n eventify (target, getter, setter) {\n target = target || this\n let _events = {}\n if (!getter && !setter) {\n getter = function () { return _events }\n setter = function (value) { _events = value }\n }\n Object.defineProperties(target, {\n emit: {\n value (...args) {\n const events = getter.call(this) || {}\n const type = args.shift()\n let listeners = events[type] || []\n let i\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n listeners = events.all || []\n args.unshift(type)\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n }\n },\n off: {\n value (type, func) {\n const events = getter.call(this)\n const listeners = events[type]\n if (!listeners) {\n setter.call(this, {})\n } else if (func) {\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i].f === func) {\n listeners.splice(i, 1)\n break\n }\n }\n } else {\n listeners.splice(0, listeners.length)\n }\n }\n },\n on: {\n value (type, func, thisArg) {\n if (!getter.call(this)) {\n setter.call(this, {})\n }\n const events = getter.call(this)\n events[type] = events[type] || []\n events[type].push({\n c: thisArg,\n f: func\n })\n }\n }\n })\n },\n\n /**\n * Used for sublcassing. Invoke this method in the context of a superclass to\n * to produce a subclass based on `props` and `classProps`.\n *\n * @example\n * import { utils } from 'js-data';\n * function Animal () {}\n * Animal.extend = utils.extend;\n * const Cat = Animal.extend({\n * say () {\n * console.log('meow');\n * }\n * });\n * const cat = new Cat();\n * cat instanceof Animal; // true\n * cat instanceof Cat; // true\n * cat.say(); // \"meow\"\n *\n * @method utils.extend\n * @param {object} props Instance properties for the subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to use as the subclass.\n * @param {object} props Static properties for the subclass.\n * @returns {Constructor} A new subclass.\n * @since 3.0.0\n */\n extend (props, classProps) {\n const superClass = this\n let subClass\n\n props || (props = {})\n classProps || (classProps = {})\n\n if (props.hasOwnProperty('constructor')) {\n subClass = props.constructor\n delete props.constructor\n } else {\n subClass = function (...args) {\n utils.classCallCheck(this, subClass)\n superClass.apply(this, args)\n }\n }\n\n // Setup inheritance of instance members\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n configurable: true,\n enumerable: false,\n value: subClass,\n writable: true\n }\n })\n\n const obj = Object\n // Setup inheritance of static members\n if (obj.setPrototypeOf) {\n obj.setPrototypeOf(subClass, superClass)\n } else if (classProps.strictEs6Class) {\n subClass.__proto__ = superClass // eslint-disable-line\n } else {\n utils.forOwn(superClass, function (value, key) {\n subClass[key] = value\n })\n }\n if (!subClass.hasOwnProperty('__super__')) {\n Object.defineProperty(subClass, '__super__', {\n configurable: true,\n value: superClass\n })\n }\n\n utils.addHiddenPropsToTarget(subClass.prototype, props)\n utils.fillIn(subClass, classProps)\n\n return subClass\n },\n\n /**\n * Shallow copy own enumerable properties from `src` to `dest` that are on\n * `src` but are missing from `dest.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: 'bar', beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.fillIn(b, a);\n * console.log(b); // {\"foo\":\"bar\",\"beep\":\"bip\"}\n *\n * @method utils.fillIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.deepFillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n fillIn (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Find the last index of an item in an array according to the given checker function.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = { name: 'John', age: 20 };\n * const sara = { name: 'Sara', age: 25 };\n * const dan = { name: 'Dan', age: 20 };\n * const users = [john, sara, dan];\n *\n * console.log(utils.findIndex(users, (user) => user.age === 25)); // 1\n * console.log(utils.findIndex(users, (user) => user.age > 19)); // 2\n * console.log(utils.findIndex(users, (user) => user.name === 'John')); // 0\n * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')); // -1\n *\n * @method utils.findIndex\n * @param {array} array The array to search.\n * @param {Function} fn Checker function.\n * @returns {number} Index if found or -1 if not found.\n * @since 3.0.0\n */\n findIndex (array, fn) {\n let index = -1\n if (!array) {\n return index\n }\n array.forEach(function (record, i) {\n if (fn(record)) {\n index = i\n return false\n }\n })\n return index\n },\n\n /**\n * Recursively iterate over a {@link Mapper}'s relations according to\n * `opts.with`.\n *\n * @method utils.forEachRelation\n * @param {Mapper} mapper Mapper.\n * @param {object} opts Configuration options.\n * @param {Function} fn Callback function.\n * @param {*} thisArg Execution context for the callback function.\n * @since 3.0.0\n */\n forEachRelation (mapper, opts, fn, thisArg) {\n const relationList = mapper.relationList || []\n if (!relationList.length) {\n return\n }\n relationList.forEach(function (def) {\n utils._forRelation(opts, def, fn, thisArg)\n })\n },\n\n /**\n * Iterate over an object's own enumerable properties.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { b: 1, c: 4 };\n * let sum = 0;\n * utils.forOwn(a, function (value, key) {\n * sum += value;\n * });\n * console.log(sum); // 5\n *\n * @method utils.forOwn\n * @param {object} object The object whose properties are to be enumerated.\n * @param {Function} fn Iteration function.\n * @param {object} [thisArg] Content to which to bind `fn`.\n * @since 3.0.0\n */\n forOwn (obj, fn, thisArg) {\n const keys = Object.keys(obj)\n const len = keys.length\n let i\n for (i = 0; i < len; i++) {\n if (fn.call(thisArg, obj[keys[i]], keys[i], obj) === false) {\n break\n }\n }\n },\n\n /**\n * Proxy for `JSON.parse`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const a = utils.fromJson('{\"name\" : \"John\"}');\n * console.log(a); // { name: 'John' }\n *\n * @method utils.fromJson\n * @param {string} json JSON to parse.\n * @returns {Object} Parsed object.\n * @see utils.toJson\n * @since 3.0.0\n */\n fromJson (json) {\n return utils.isString(json) ? JSON.parse(json) : json\n },\n\n /**\n * Retrieve the specified property from the given object. Supports retrieving\n * nested properties.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * console.log(utils.get(a, 'beep')); // \"boop\"\n * console.log(utils.get(a, 'foo.bar')); // \"baz\"\n *\n * @method utils.get\n * @param {object} object Object from which to retrieve a property's value.\n * @param {string} prop Property to retrieve.\n * @returns {*} Value of the specified property.\n * @see utils.set\n * @since 3.0.0\n */\n 'get': function (object, prop) {\n if (!prop) {\n return\n }\n const parts = prop.split('.')\n const last = parts.pop()\n\n while (prop = parts.shift()) { // eslint-disable-line\n object = object[prop]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n return object[last]\n },\n\n /**\n * Return the superclass for the given instance or subclass. If an instance is\n * provided, then finds the parent class of the instance's constructor.\n *\n * @example\n * import { utils } from 'js-data';\n * // using ES2015 classes\n * class Foo {}\n * class Bar extends Foo {}\n * const barInstance = new Bar();\n * let baseType = utils.getSuper(barInstance);\n * console.log(Foo === baseType); // true\n *\n * // using Function constructor with utils.extend\n * function Foo () {}\n * Foo.extend = utils.extend;\n * const Bar = Foo.extend();\n * const barInstance = new Bar();\n * let baseType = utils.getSuper(barInstance);\n * console.log(Foo === baseType); // true\n *\n * @method utils.getSuper\n * @param {Object|Function} instance Instance or constructor.\n * @param {boolean} [isCtor=false] Whether `instance` is a constructor.\n * @returns {Constructor} The superclass (grandparent constructor).\n * @since 3.0.0\n */\n getSuper (instance, isCtor) {\n const ctor = isCtor ? instance : instance.constructor\n if (ctor.hasOwnProperty('__super__')) {\n return ctor.__super__\n }\n return Object.getPrototypeOf(ctor) || ctor.__proto__ // eslint-disable-line\n },\n\n /**\n * Return the intersection of two arrays.\n *\n * @example\n * import { utils } from 'js-data';\n * const arrA = ['green', 'red', 'blue', 'red'];\n * const arrB = ['green', 'yellow', 'red'];\n * const intersected = utils.intersection(arrA, arrB);\n *\n * console.log(intersected); // ['green', 'red'])\n *\n * @method utils.intersection\n * @param {array} array1 First array.\n * @param {array} array2 Second array.\n * @returns {Array} Array of elements common to both arrays.\n * @since 3.0.0\n */\n intersection (array1, array2) {\n if (!array1 || !array2) {\n return []\n }\n const result = []\n let item\n let i\n const len = array1.length\n for (i = 0; i < len; i++) {\n item = array1[i]\n if (result.indexOf(item) !== -1) {\n continue\n }\n if (array2.indexOf(item) !== -1) {\n result.push(item)\n }\n }\n return result\n },\n\n /**\n * Proxy for `Array.isArray`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = [1,2,3,4,5];\n * const b = { foo: \"bar\" };\n * console.log(utils.isArray(a)); // true\n * console.log(utils.isArray(b)); // false\n *\n * @method utils.isArray\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an array.\n * @since 3.0.0\n */\n isArray: Array.isArray,\n\n /**\n * Return whether `prop` is matched by any string or regular expression in\n * `blacklist`.\n *\n * @example\n * import { utils } from 'js-data';\n * const blacklist = [/^\\$hashKey/g, /^_/g, 'id'];\n * console.log(utils.isBlacklisted(\"$hashKey\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"id\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"_myProp\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"my_id\", blacklist)); // false\n *\n * @method utils.isBlacklisted\n * @param {string} prop The name of a property to check.\n * @param {array} blacklist Array of strings and regular expressions.\n * @returns {boolean} Whether `prop` was matched.\n * @since 3.0.0\n */\n isBlacklisted (prop, blacklist) {\n if (!blacklist || !blacklist.length) {\n return false\n }\n let matches\n for (var i = 0; i < blacklist.length; i++) {\n if ((toStr(blacklist[i]) === REGEXP_TAG && blacklist[i].test(prop)) || blacklist[i] === prop) {\n matches = prop\n return !!matches\n }\n }\n return !!matches\n },\n\n /**\n * Return whether the provided value is a boolean.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = true;\n * const b = { foo: \"bar\" };\n * console.log(utils.isBoolean(a)); // true\n * console.log(utils.isBoolean(b)); // false\n *\n * @method utils.isBoolean\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a boolean.\n * @since 3.0.0\n */\n isBoolean (value) {\n return toStr(value) === BOOL_TAG\n },\n\n /**\n * Return whether the provided value is a date.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = new Date();\n * const b = { foo: \"bar\" };\n * console.log(utils.isDate(a)); // true\n * console.log(utils.isDate(b)); // false\n *\n * @method utils.isDate\n * @param {*} value The value to test.\n * @returns {Date} Whether the provided value is a date.\n * @since 3.0.0\n */\n isDate (value) {\n return (value && typeof value === 'object' && toStr(value) === DATE_TAG)\n },\n\n /**\n * Return whether the provided value is a function.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = function () { console.log('foo bar'); };\n * const b = { foo: \"bar\" };\n * console.log(utils.isFunction(a)); // true\n * console.log(utils.isFunction(b)); // false\n *\n * @method utils.isFunction\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a function.\n * @since 3.0.0\n */\n isFunction (value) {\n return typeof value === 'function' || (value && toStr(value) === FUNC_TAG)\n },\n\n /**\n * Return whether the provided value is an integer.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = 1;\n * const b = 1.25;\n * const c = '1';\n * console.log(utils.isInteger(a)); // true\n * console.log(utils.isInteger(b)); // false\n * console.log(utils.isInteger(c)); // false\n *\n * @method utils.isInteger\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an integer.\n * @since 3.0.0\n */\n isInteger (value) {\n return toStr(value) === NUMBER_TAG && value == toInteger(value) // eslint-disable-line\n },\n\n /**\n * Return whether the provided value is `null`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = null;\n * const b = { foo: \"bar\" };\n * console.log(utils.isNull(a)); // true\n * console.log(utils.isNull(b)); // false\n *\n * @method utils.isNull\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is `null`.\n * @since 3.0.0\n */\n isNull (value) {\n return value === null\n },\n\n /**\n * Return whether the provided value is a number.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = 1;\n * const b = -1.25;\n * const c = '1';\n * console.log(utils.isNumber(a)); // true\n * console.log(utils.isNumber(b)); // true\n * console.log(utils.isNumber(c)); // false\n *\n * @method utils.isNumber\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a number.\n * @since 3.0.0\n */\n isNumber (value) {\n const type = typeof value\n return type === 'number' || (value && type === 'object' && toStr(value) === NUMBER_TAG)\n },\n\n /**\n * Return whether the provided value is an object.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: \"bar\" };\n * const b = 'foo bar';\n * console.log(utils.isObject(a)); // true\n * console.log(utils.isObject(b)); // false\n *\n * @method utils.isObject\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an object.\n * @since 3.0.0\n */\n isObject (value) {\n return toStr(value) === OBJECT_TAG\n },\n\n /**\n * Return whether the provided value is a regular expression.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = /^\\$.+$/ig;\n * const b = new RegExp('^\\$.+$', 'ig');\n * const c = { foo: \"bar\" };\n * console.log(utils.isRegExp(a)); // true\n * console.log(utils.isRegExp(b)); // true\n * console.log(utils.isRegExp(c)); // false\n *\n * @method utils.isRegExp\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a regular expression.\n * @since 3.0.0\n */\n isRegExp (value) {\n return toStr(value) === REGEXP_TAG\n },\n\n /**\n * Return whether the provided value is a string or a number.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isSorN('')); // true\n * console.log(utils.isSorN(-1.65)); // true\n * console.log(utils.isSorN('my string')); // true\n * console.log(utils.isSorN({})); // false\n * console.log(utils.isSorN([1,2,4])); // false\n *\n * @method utils.isSorN\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string or a number.\n * @since 3.0.0\n */\n isSorN (value) {\n return utils.isString(value) || utils.isNumber(value)\n },\n\n /**\n * Return whether the provided value is a string.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('')); // true\n * console.log(utils.isString('my string')); // true\n * console.log(utils.isString(100)); // false\n * console.log(utils.isString([1,2,4])); // false\n *\n * @method utils.isString\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string.\n * @since 3.0.0\n */\n isString (value) {\n return typeof value === 'string' || (value && typeof value === 'object' && toStr(value) === STRING_TAG)\n },\n\n /**\n * Return whether the provided value is a `undefined`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = undefined;\n * const b = { foo: \"bar\"};\n * console.log(utils.isUndefined(a)); // true\n * console.log(utils.isUndefined(b.baz)); // true\n * console.log(utils.isUndefined(b)); // false\n * console.log(utils.isUndefined(b.foo)); // false\n *\n * @method utils.isUndefined\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a `undefined`.\n * @since 3.0.0\n */\n isUndefined (value) {\n return value === undefined\n },\n\n /**\n * Mix in logging capabilities to the target.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: \"bar\"};\n *\n * // Add standard logging to an object\n * utils.logify(a);\n * a.log('info', 'test log info'); // output 'test log info' to console.\n *\n * // Toggle debug output of an object\n * a.dbg('test debug output'); // does not output because debug is off.\n * a.debug = true;\n * a.dbg('test debug output'); // output 'test debug output' to console.\n *\n * @method utils.logify\n * @param {*} target The target.\n * @since 3.0.0\n */\n logify (target) {\n utils.addHiddenPropsToTarget(target, {\n dbg (...args) {\n if (utils.isFunction(this.log)) {\n this.log('debug', ...args)\n }\n },\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (${this.name || this.constructor.name})`\n if (utils.isFunction(console[level])) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n }\n })\n },\n\n /**\n * Adds the given record to the provided array only if it's not already in the\n * array.\n *\n * @example\n * import { utils } from 'js-data';\n * const colors = ['red', 'green', 'yellow'];\n *\n * console.log(colors.length); // 3\n * utils.noDupeAdd(colors, 'red');\n * console.log(colors.length); // 3, red already exists\n *\n * utils.noDupeAdd(colors, 'blue');\n * console.log(colors.length); // 4, blue was added\n *\n * @method utils.noDupeAdd\n * @param {array} array The array.\n * @param {*} record The value to add.\n * @param {Function} fn Callback function passed to {@link utils.findIndex}.\n * @since 3.0.0\n */\n noDupeAdd (array, record, fn) {\n if (!array) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index < 0) {\n array.push(record)\n }\n },\n\n /**\n * Return a shallow copy of the provided object, minus the properties\n * specified in `keys`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John', $hashKey: 1214910 };\n *\n * let b = utils.omit(a, ['$hashKey']);\n * console.log(b); // { name: 'John' }\n *\n * @method utils.omit\n * @param {object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to skip.\n * @returns {Object} Shallow copy of `props`, minus `keys`.\n * @since 3.0.0\n */\n omit (props, keys) {\n const _props = {}\n utils.forOwn(props, function (value, key) {\n if (keys.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n },\n\n /**\n * Return a shallow copy of the provided object, but only include the\n * properties specified in `keys`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John', $hashKey: 1214910 };\n *\n * let b = utils.pick(a, ['$hashKey']);\n * console.log(b); // { $hashKey: 1214910 }\n *\n * @method utils.pick\n * @param {object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to keep.\n * @returns {Object} Shallow copy of `props`, but only including `keys`.\n * @since 3.0.0\n */\n pick (props, keys) {\n return keys.reduce((map, key) => {\n map[key] = props[key]\n return map\n }, {})\n },\n\n /**\n * Return a plain copy of the given value.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John' };\n * let b = utils.plainCopy(a);\n * console.log(a === b); // false\n *\n * @method utils.plainCopy\n * @param {*} value The value to copy.\n * @returns {*} Plain copy of `value`.\n * @see utils.copy\n * @since 3.0.0\n */\n plainCopy (value) {\n return utils.copy(value, undefined, undefined, undefined, undefined, true)\n },\n\n /**\n * Shortcut for `utils.Promise.reject(value)`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * utils.reject(\"Testing static reject\").then(function (data) {\n * // not called\n * }).catch(function (reason) {\n * console.log(reason); // \"Testing static reject\"\n * });\n *\n * @method utils.reject\n * @param {*} [value] Value with which to reject the Promise.\n * @returns {Promise} Promise reject with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n reject (value) {\n return utils.Promise.reject(value)\n },\n\n /**\n * Remove the last item found in array according to the given checker function.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const colors = ['red', 'green', 'yellow', 'red'];\n * utils.remove(colors, (color) => color === 'red');\n * console.log(colors); // ['red', 'green', 'yellow']\n *\n * @method utils.remove\n * @param {array} array The array to search.\n * @param {Function} fn Checker function.\n */\n remove (array, fn) {\n if (!array || !array.length) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index >= 0) {\n array.splice(index, 1) // todo should this be recursive?\n }\n },\n\n /**\n * Shortcut for `utils.Promise.resolve(value)`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * utils.resolve(\"Testing static resolve\").then(function (data) {\n * console.log(data); // \"Testing static resolve\"\n * }).catch(function (reason) {\n * // not called\n * });\n *\n * @param {*} [value] Value with which to resolve the Promise.\n * @returns {Promise} Promise resolved with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n resolve (value) {\n return utils.Promise.resolve(value)\n },\n\n /**\n * Set the value at the provided key or path.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * };\n * // set value by key\n * utils.set(john, 'id', 98);\n * console.log(john.id); // 98\n *\n * // set value by path\n * utils.set(john, 'parent.id', 20);\n * console.log(john.parent.id); // 20\n *\n * // set value by path/value map\n * utils.set(john, {\n * 'id': 1098,\n * 'parent': { id: 1020 },\n * 'parent.age': '55'\n * });\n * console.log(john.id); // 1098\n * console.log(john.parent.id); // 1020\n * console.log(john.parent.age); // 55\n *\n * @method utils.set\n * @param {object} object The object on which to set a property.\n * @param {(string|Object)} path The key or path to the property. Can also\n * pass in an object of path/value pairs, which will all be set on the target\n * object.\n * @param {*} [value] The value to set.\n */\n set: function (object, path, value) {\n if (utils.isObject(path)) {\n utils.forOwn(path, function (value, _path) {\n utils.set(object, _path, value)\n })\n } else {\n const parts = PATH.exec(path)\n if (parts) {\n mkdirP(object, parts[1])[parts[2]] = value\n } else {\n object[path] = value\n }\n }\n },\n\n /**\n * Check whether the two provided objects are deeply equal.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const objA = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * };\n *\n * const objB = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * };\n *\n * console.log(utils.deepEqual(a,b)); // true\n * objB.nested.colors.add('yellow'); // make a change to a nested object's array\n * console.log(utils.deepEqual(a,b)); // false\n *\n * @method utils.deepEqual\n * @param {object} a First object in the comparison.\n * @param {object} b Second object in the comparison.\n * @returns {boolean} Whether the two provided objects are deeply equal.\n * @see utils.equal\n * @since 3.0.0\n */\n deepEqual (a, b) {\n if (a === b) {\n return true\n }\n let _equal = true\n if (utils.isArray(a) && utils.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n for (let i = a.length; i--;) {\n if (!utils.deepEqual(a[i], b[i])) {\n // Exit loop early\n return false\n }\n }\n } else if (utils.isObject(a) && utils.isObject(b)) {\n utils.forOwn(a, function (value, key) {\n if (!(_equal = utils.deepEqual(value, b[key]))) {\n // Exit loop early\n return false\n }\n })\n if (_equal) {\n utils.forOwn(b, function (value, key) {\n if (!(_equal = utils.deepEqual(value, a[key]))) {\n // Exit loop early\n return false\n }\n })\n }\n } else {\n return false\n }\n return _equal\n },\n\n /**\n * Proxy for `JSON.stringify`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const a = { name: 'John' };\n * let jsonVal = utils.toJson(a);\n * console.log(jsonVal); // '{\"name\" : \"John\"}'\n *\n * @method utils.toJson\n * @param {*} value Value to serialize to JSON.\n * @returns {string} JSON string.\n * @see utils.fromJson\n * @since 3.0.0\n */\n toJson: JSON.stringify,\n\n /**\n * Unset the value at the provided key or path.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * };\n *\n * utils.unset(john, age);\n * utils.unset(john, parent.age);\n *\n * console.log(john.age); // null\n * console.log(john.parent.age); // null\n *\n * @method utils.unset\n * @param {object} object The object from which to delete the property.\n * @param {string} path The key or path to the property.\n * @see utils.set\n * @since 3.0.0\n */\n unset (object, path) {\n const parts = path.split('.')\n const last = parts.pop()\n\n while (path = parts.shift()) { // eslint-disable-line\n object = object[path]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n object[last] = undefined\n }\n}\n\nexport const safeSetProp = function (record, field, value) {\n if (record && record._set) {\n record._set(`props.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport const safeSetLink = function (record, field, value) {\n if (record && record._set) {\n record._set(`links.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport default utils\n","import utils from './utils'\n\n/**\n * A base class which gives instances private properties.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Settable.extend} for an example of using {@link Settable} as a\n * base class.\n *\n *```javascript\n * import {Settable} from 'js-data'\n * ```\n *\n * @class Settable\n * @returns {Settable} A new {@link Settable} instance.\n * @since 3.0.0\n */\nexport default function Settable () {\n const _props = {}\n Object.defineProperties(this, {\n /**\n * Get a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method Settable#_get\n * @param {string} key The property to retrieve.\n * @returns {*} The value of the property.\n * @since 3.0.0\n */\n _get: { value (key) { return utils.get(_props, key) } },\n\n /**\n * Set a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_set\n * @param {(string|Object)} key The key or path to the property. Can also\n * pass in an object of key/value pairs, which will all be set on the instance.\n * @param {*} [value] The value to set.\n * @since 3.0.0\n */\n _set: { value (key, value) { return utils.set(_props, key, value) } },\n\n /**\n * Unset a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_unset\n * @param {string} key The property to unset.\n * @since 3.0.0\n */\n _unset: { value (key) { return utils.unset(_props, key) } }\n })\n}\n\n/**\n * Create a subclass of this Settable:\n *\n * @example Settable.extend\n * const JSData = require('js-data');\n * const { Settable } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSettableClass extends Settable {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSettable = new CustomSettableClass();\n * console.log(customSettable.foo());\n * console.log(CustomSettableClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSettableClass = Settable.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherSettable = new OtherSettableClass();\n * console.log(otherSettable.foo());\n * console.log(OtherSettableClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSettableClass () {\n * Settable.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Settable.extend({\n * constructor: AnotherSettableClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherSettable = new AnotherSettableClass();\n * console.log(anotherSettable.created_at);\n * console.log(anotherSettable.foo());\n * console.log(AnotherSettableClass.beep());\n *\n * @method Settable.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Settable class.\n * @since 3.0.0\n */\nSettable.extend = utils.extend\n","import utils from './utils'\nimport Settable from './Settable'\n\n/**\n * The base class from which all JSData components inherit some basic\n * functionality.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Component.extend} for an example of using {@link Component} as a\n * base class.\n *\n *```javascript\n * import {Component} from 'js-data'\n * ```\n *\n * @class Component\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @returns {Component} A new {@link Component} instance.\n * @since 3.0.0\n */\nfunction Component (opts) {\n Settable.call(this)\n opts || (opts = {})\n\n /**\n * Whether to enable debug-level logs for this component. Anything that\n * extends `Component` inherits this option and the corresponding logging\n * functionality.\n *\n * @example Component#debug\n * const JSData = require('js-data');\n * const { Component } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const component = new Component();\n * component.log('debug', 'some message'); // nothing gets logged\n * // Display debug logs:\n * component.debug = true;\n * component.log('debug', 'other message'); // this DOES get logged\n *\n * @default false\n * @name Component#debug\n * @since 3.0.0\n * @type {boolean}\n */\n this.debug = opts.hasOwnProperty('debug') ? !!opts.debug : false\n\n /**\n * Event listeners attached to this Component. __Do not modify.__ Use\n * {@link Component#on} and {@link Component#off} instead.\n *\n * @name Component#_listeners\n * @private\n * @instance\n * @since 3.0.0\n * @type {Object}\n */\n Object.defineProperty(this, '_listeners', { value: {}, writable: true })\n}\n\nexport default Settable.extend({\n constructor: Component\n})\n\n/**\n * Create a subclass of this Component:\n *\n * @example Component.extend\n * const JSData = require('js-data');\n * const { Component } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomComponentClass extends Component {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customComponent = new CustomComponentClass();\n * console.log(customComponent.foo());\n * console.log(CustomComponentClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherComponentClass = Component.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherComponent = new OtherComponentClass();\n * console.log(otherComponent.foo());\n * console.log(OtherComponentClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherComponentClass () {\n * Component.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Component.extend({\n * constructor: AnotherComponentClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherComponent = new AnotherComponentClass();\n * console.log(anotherComponent.created_at);\n * console.log(anotherComponent.foo());\n * console.log(AnotherComponentClass.beep());\n *\n * @method Component.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Component class.\n * @since 3.0.0\n */\nComponent.extend = utils.extend\n\n/**\n * Log the provided values at the \"debug\" level. Debug-level logs are only\n * logged if {@link Component#debug} is `true`.\n *\n * `.dbg(...)` is shorthand for `.log('debug', ...)`.\n *\n * @method Component#dbg\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\n/**\n * Log the provided values. By default sends values to `console[level]`.\n * Debug-level logs are only logged if {@link Component#debug} is `true`.\n *\n * Will attempt to use appropriate `console` methods if they are available.\n *\n * @method Component#log\n * @param {string} level Log level.\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\nutils.logify(Component.prototype)\n\n/**\n * Register a new event listener on this Component.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a DataStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName); // \"post\"\n * console.log(props.id); // undefined\n * console.log(result.id); // 1234\n * });\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id); // 1234\n * });\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * collection.on('add', (records) => {\n * console.log(records); // [...]\n * });\n *\n * @example\n * // Listen for \"change\" events on a record\n * post.on('change', (record, changes) => {\n * console.log(changes); // { changed: { title: 'Modeling your data' } }\n * });\n * post.title = 'Modeling your data';\n *\n * @method Component#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n/**\n * Remove an event listener from this Component. If no listener is provided,\n * then all listeners for the specified event will be removed. If no event is\n * specified then all listeners for all events will be removed.\n *\n * @example\n * // Remove a particular listener for a particular event\n * collection.off('add', handler);\n *\n * @example\n * // Remove all listeners for a particular event\n * record.off('change');\n *\n * @example\n * // Remove all listeners to all events\n * store.off();\n *\n * @method Component#off\n * @param {string} [event] Name of event to unsubsribe to.\n * @param {Function} [listener] Listener to remove.\n * @since 3.0.0\n */\n/**\n * Trigger an event on this Component.\n *\n * @example Component#emit\n * // import { Collection, DataStore } from 'js-data';\n * const JSData = require('js-data');\n * const { Collection, DataStore } = JSData;\n *\n * const collection = new Collection();\n * collection.on('foo', function (msg) {\n * console.log(msg);\n * });\n * collection.emit('foo', 'bar');\n *\n * const store = new DataStore();\n * store.on('beep', function (msg) {\n * console.log(msg);\n * });\n * store.emit('beep', 'boop');\n *\n * @method Component#emit\n * @param {string} event Name of event to emit.\n * @param {...*} [args] Arguments to pass to any listeners.\n * @since 3.0.0\n */\nutils.eventify(\n Component.prototype,\n function () {\n return this._listeners\n },\n function (value) {\n this._listeners = value\n }\n)\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Query'\nconst INDEX_ERR = 'Index inaccessible after first operation'\n\n// Reserved words used by JSData's Query Syntax\nconst reserved = {\n limit: '',\n offset: '',\n orderBy: '',\n skip: '',\n sort: '',\n where: ''\n}\n\n// Used by our JavaScript implementation of the LIKE operator\nconst escapeRegExp = /([.*+?^=!:${}()|[\\]/\\\\])/g\nconst percentRegExp = /%/g\nconst underscoreRegExp = /_/g\nconst escape = function (pattern) {\n return pattern.replace(escapeRegExp, '\\\\$1')\n}\n\n/**\n * A class used by the {@link Collection} class to build queries to be executed\n * against the collection's data. An instance of `Query` is returned by\n * {@link Collection#query}. Query instances are typically short-lived, and you\n * shouldn't have to create them yourself. Just use {@link Collection#query}.\n *\n * ```javascript\n * import { Query } from 'js-data';\n * ```\n *\n * @example Query intro\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts);\n * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run();\n * console.log(drafts);\n *\n * @class Query\n * @extends Component\n * @param {Collection} collection The collection on which this query operates.\n * @since 3.0.0\n */\nfunction Query (collection) {\n utils.classCallCheck(this, Query)\n\n /**\n * The {@link Collection} on which this query operates.\n *\n * @name Query#collection\n * @since 3.0.0\n * @type {Collection}\n */\n this.collection = collection\n\n /**\n * The current data result of this query.\n *\n * @name Query#data\n * @since 3.0.0\n * @type {Array}\n */\n this.data = null\n}\n\nexport default Component.extend({\n constructor: Query,\n\n _applyWhereFromObject (where) {\n const fields = []\n const ops = []\n const predicates = []\n utils.forOwn(where, (clause, field) => {\n if (!utils.isObject(clause)) {\n clause = {\n '==': clause\n }\n }\n utils.forOwn(clause, (expr, op) => {\n fields.push(field)\n ops.push(op)\n predicates.push(expr)\n })\n })\n return {\n fields,\n ops,\n predicates\n }\n },\n\n _applyWhereFromArray (where) {\n const groups = []\n where.forEach((_where, i) => {\n if (utils.isString(_where)) {\n return\n }\n const prev = where[i - 1]\n const parser = utils.isArray(_where) ? this._applyWhereFromArray : this._applyWhereFromObject\n const group = parser.call(this, _where)\n if (prev === 'or') {\n group.isOr = true\n }\n groups.push(group)\n })\n groups.isArray = true\n return groups\n },\n\n _testObjectGroup (keep, first, group, item) {\n let i\n const fields = group.fields\n const ops = group.ops\n const predicates = group.predicates\n const len = ops.length\n for (i = 0; i < len; i++) {\n let op = ops[i]\n const isOr = op.charAt(0) === '|'\n op = isOr ? op.substr(1) : op\n const expr = this.evaluate(utils.get(item, fields[i]), op, predicates[i])\n if (expr !== undefined) {\n keep = first ? expr : (isOr ? keep || expr : keep && expr)\n }\n first = false\n }\n return { keep, first }\n },\n\n _testArrayGroup (keep, first, groups, item) {\n let i\n const len = groups.length\n for (i = 0; i < len; i++) {\n const group = groups[i]\n const parser = group.isArray ? this._testArrayGroup : this._testObjectGroup\n const result = parser.call(this, true, true, group, item)\n if (groups[i - 1]) {\n if (group.isOr) {\n keep = keep || result.keep\n } else {\n keep = keep && result.keep\n }\n } else {\n keep = result.keep\n }\n first = result.first\n }\n return { keep, first }\n },\n\n /**\n * Find all entities between two boundaries.\n *\n * @example Get the users ages 18 to 30.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users)\n * const filteredUsers = store\n * .query('user')\n * .between(18, 30, { index: 'age' })\n * .run();\n * console.log(filteredUsers);\n *\n * @example Same as above.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users)\n * const filteredUsers = store\n * .query('user')\n * .between([18], [30], { index: 'age' })\n * .run();\n * console.log(filteredUsers);\n *\n * @method Query#between\n * @param {array} leftKeys Keys defining the left boundary.\n * @param {array} rightKeys Keys defining the right boundary.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#between`)(500, 'Cannot access index')\n }\n this.data = this.collection.getIndex(opts.index).between(leftKeys, rightKeys, opts)\n return this\n },\n\n /**\n * The comparison function used by the {@link Query} class.\n *\n * @method Query#compare\n * @param {array} orderBy An orderBy clause used for sorting and sub-sorting.\n * @param {number} index The index of the current orderBy clause being used.\n * @param {*} a The first item in the comparison.\n * @param {*} b The second item in the comparison.\n * @returns {number} -1 if `b` should preceed `a`. 0 if `a` and `b` are equal.\n * 1 if `a` should preceed `b`.\n * @since 3.0.0\n */\n compare (orderBy, index, a, b) {\n const def = orderBy[index]\n let cA = utils.get(a, def[0])\n let cB = utils.get(b, def[0])\n if (cA && utils.isString(cA)) {\n cA = cA.toUpperCase()\n }\n if (cB && utils.isString(cB)) {\n cB = cB.toUpperCase()\n }\n if (a === undefined) {\n a = null\n }\n if (b === undefined) {\n b = null\n }\n if (def[1].toUpperCase() === 'DESC') {\n const temp = cB\n cB = cA\n cA = temp\n }\n if (cA < cB) {\n return -1\n } else if (cA > cB) {\n return 1\n } else {\n if (index < orderBy.length - 1) {\n return this.compare(orderBy, index + 1, a, b)\n } else {\n return 0\n }\n }\n },\n\n /**\n * Predicate evaluation function used by the {@link Query} class.\n *\n * @method Query#evaluate\n * @param {*} value The value to evaluate.\n * @param {string} op The operator to use in this evaluation.\n * @param {*} predicate The predicate to use in this evaluation.\n * @returns {boolean} Whether the value passed the evaluation or not.\n * @since 3.0.0\n */\n evaluate (value, op, predicate) {\n const ops = this.constructor.ops\n if (ops[op]) {\n return ops[op](value, predicate)\n }\n if (op.indexOf('like') === 0) {\n return this.like(predicate, op.substr(4)).exec(value) !== null\n } else if (op.indexOf('notLike') === 0) {\n return this.like(predicate, op.substr(7)).exec(value) === null\n }\n },\n\n /**\n * Find the record or records that match the provided query or are accepted by\n * the provided filter function.\n *\n * @example Get the draft posts by authors younger than 30\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store\n * .query('post')\n * .filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * age: {\n * '<': 30\n * }\n * }\n * })\n * .run();\n * console.log(results);\n *\n * @example Use a custom filter function\n * const posts = query\n * .filter(function (post) {\n * return post.isReady();\n * })\n * .run();\n *\n * @method Query#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Function} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n filter (query, thisArg) {\n /**\n * Selection query as defined by JSData's [Query Syntax][querysyntax].\n *\n * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax\n *\n * @example Empty \"findAll\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * store.findAll('post').then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @example Empty \"filter\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = store.filter('post');\n * console.log(posts); // [...]\n *\n * @example Complex \"filter\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * const PAGE_SIZE = 2;\n * let currentPage = 3;\n *\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ];\n * store.add('post', posts);\n * // Retrieve a filtered page of blog posts\n * // Would typically replace filter with findAll\n * const results = store.filter('post', {\n * where: {\n * status: {\n * // WHERE status = 'published'\n * '==': 'published'\n * },\n * author: {\n * // AND author IN ('bob', 'alice')\n * 'in': ['bob', 'alice'],\n * // OR author IN ('karen')\n * '|in': ['karen']\n * }\n * },\n * orderBy: [\n * // ORDER BY date_published DESC,\n * ['date_published', 'DESC'],\n * // ORDER BY title ASC\n * ['title', 'ASC']\n * ],\n * // LIMIT 2\n * limit: PAGE_SIZE,\n * // SKIP 4\n * offset: PAGE_SIZE * (currentPage - 1)\n * });\n * console.log(results);\n *\n * @namespace query\n * @property {number} [limit] See {@link query.limit}.\n * @property {number} [offset] See {@link query.offset}.\n * @property {string|Array[]} [orderBy] See {@link query.orderBy}.\n * @property {number} [skip] Alias for {@link query.offset}.\n * @property {string|Array[]} [sort] Alias for {@link query.orderBy}.\n * @property {Object} [where] See {@link query.where}.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/query-syntax\",\"JSData's Query Syntax\"]\n */\n query || (query = {})\n this.getData()\n if (utils.isObject(query)) {\n let where = {}\n\n /**\n * Filtering criteria. Records that do not meet this criteria will be exluded\n * from the result.\n *\n * @example Return posts where author is at least 32 years old\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * where: {\n * age: {\n * '>=': 30\n * }\n * }\n * });\n * console.log(results);\n *\n * @name query.where\n * @type {Object}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isObject(query.where) || utils.isArray(query.where)) {\n where = query.where\n }\n utils.forOwn(query, function (value, key) {\n if (!(key in reserved) && !(key in where)) {\n where[key] = {\n '==': value\n }\n }\n })\n let groups\n\n // Apply filter for each field\n if (utils.isObject(where) && Object.keys(where).length !== 0) {\n groups = this._applyWhereFromArray([where])\n } else if (utils.isArray(where)) {\n groups = this._applyWhereFromArray(where)\n }\n\n if (groups) {\n this.data = this.data.filter((item, i) => this._testArrayGroup(true, true, groups, item).keep)\n }\n\n // Sort\n let orderBy = query.orderBy || query.sort\n\n if (utils.isString(orderBy)) {\n orderBy = [\n [orderBy, 'ASC']\n ]\n }\n if (!utils.isArray(orderBy)) {\n orderBy = null\n }\n\n /**\n * Determines how records should be ordered in the result.\n *\n * @example Order posts by `author` then by `id` descending \n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * orderBy:[['author','ASC'],['id','DESC']]\n * });\n * console.log(results);\n *\n * @name query.orderBy\n * @type {string|Array[]}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (orderBy) {\n let index = 0\n orderBy.forEach(function (def, i) {\n if (utils.isString(def)) {\n orderBy[i] = [def, 'ASC']\n }\n })\n this.data.sort((a, b) => this.compare(orderBy, index, a, b))\n }\n\n /**\n * Number of records to skip.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const PAGE_SIZE = 10;\n * let currentPage = 1;\n * store.findAll('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n *\n * const PAGE_SIZE = 5;\n * let currentPage = 2;\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n * console.log(results)\n *\n * @name query.offset\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.skip)) {\n this.skip(query.skip)\n } else if (utils.isNumber(query.offset)) {\n this.skip(query.offset)\n }\n\n /**\n * Maximum number of records to retrieve.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n *\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * store.findAll('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n *\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n * console.log(results)\n *\n * @name query.limit\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.limit)) {\n this.limit(query.limit)\n }\n } else if (utils.isFunction(query)) {\n this.data = this.data.filter(query, thisArg)\n }\n return this\n },\n\n /**\n * Iterate over all entities.\n *\n * @method Query#forEach\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n forEach (forEachFn, thisArg) {\n this.getData().forEach(forEachFn, thisArg)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided key.\n *\n * @example Get the entity whose primary key is 25.\n * const entities = query.get(25).run();\n *\n * @example Same as above.\n * const entities = query.get([25]).run();\n *\n * @example Get all users who are active and have the \"admin\" role.\n * const activeAdmins = query.get(['active', 'admin'], {\n * index: 'activityAndRoles'\n * }).run();\n *\n * @example Get all entities that match a certain weather condition.\n * const niceDays = query.get(['sunny', 'humid', 'calm'], {\n * index: 'weatherConditions'\n * }).run();\n *\n * @method Query#get\n * @param {array} keyList Key(s) defining the entity to retrieve. If\n * `keyList` is not an array (i.e. for a single-value key), it will be\n * wrapped in an array.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.string] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n get (keyList, opts) {\n keyList || (keyList = [])\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#get`)(500, INDEX_ERR)\n }\n if (keyList && !utils.isArray(keyList)) {\n keyList = [keyList]\n }\n if (!keyList.length) {\n this.getData()\n return this\n }\n this.data = this.collection.getIndex(opts.index).get(keyList)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided keyLists.\n *\n * @example Get the posts where \"status\" is \"draft\" or \"inReview\".\n * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run();\n *\n * @example Same as above.\n * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run();\n *\n * @method Query#getAll\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * entities matching each keyList will be retrieved. If no keyLists are\n * provided, all entities will be returned.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n getAll (...args) {\n let opts = {}\n if (this.data) {\n throw utils.err(`${DOMAIN}#getAll`)(500, INDEX_ERR)\n }\n if (!args.length || (args.length === 1 && utils.isObject(args[0]))) {\n this.getData()\n return this\n } else if (args.length && utils.isObject(args[args.length - 1])) {\n opts = args[args.length - 1]\n args.pop()\n }\n const collection = this.collection\n const index = collection.getIndex(opts.index)\n this.data = []\n args.forEach((keyList) => {\n this.data = this.data.concat(index.get(keyList))\n })\n return this\n },\n\n /**\n * Return the current data result of this query.\n *\n * @method Query#getData\n * @returns {Array} The data in this query.\n * @since 3.0.0\n */\n getData () {\n if (!this.data) {\n this.data = this.collection.index.getAll()\n }\n return this.data\n },\n\n /**\n * Implementation used by the `like` operator. Takes a pattern and flags and\n * returns a `RegExp` instance that can test strings.\n *\n * @method Query#like\n * @param {string} pattern Testing pattern.\n * @param {string} flags Flags for the regular expression.\n * @returns {RegExp} Regular expression for testing strings.\n * @since 3.0.0\n */\n like (pattern, flags) {\n return new RegExp(`^${(escape(pattern).replace(percentRegExp, '.*').replace(underscoreRegExp, '.'))}$`, flags)\n },\n\n /**\n * Limit the result.\n *\n * @example Get only the first 2 posts.\n * const store = new JSData.DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ];\n * store.add('post', posts);\n * const results = store.query('post').limit(2).run();\n * console.log(results);\n *\n * @method Query#limit\n * @param {number} num The maximum number of entities to keep in the result.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n limit (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#limit`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n this.data = data.slice(0, Math.min(data.length, num))\n return this\n },\n\n /**\n * Apply a mapping function to the result data.\n *\n * @example\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users);\n * const ages = store\n * .query('user')\n * .map(function (user) {\n * return user.age;\n * })\n * .run();\n * console.log(ages);\n *\n * @method Query#map\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n map (mapFn, thisArg) {\n this.data = this.getData().map(mapFn, thisArg)\n return this\n },\n\n /**\n * Return the result of calling the specified function on each item in this\n * collection's main index.\n *\n * @example\n * const stringAges = UserCollection.query().mapCall('toString').run();\n *\n * @method Query#mapCall\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n mapCall (funcName, ...args) {\n this.data = this.getData().map(function (item) {\n return item[funcName](...args)\n })\n return this\n },\n\n /**\n * Complete the execution of the query and return the resulting data.\n *\n * @method Query#run\n * @returns {Array} The result of executing this query.\n * @since 3.0.0\n */\n run () {\n const data = this.data\n this.data = null\n return data\n },\n\n /**\n * Skip a number of results.\n *\n * @example Get all but the first 2 posts.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ];\n * store.add('post', posts);\n * const results = store.query('post').skip(2).run();\n * console.log(results);\n *\n * @method Query#skip\n * @param {number} num The number of entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n skip (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#skip`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n if (num < data.length) {\n this.data = data.slice(num)\n } else {\n this.data = []\n }\n return this\n }\n}, {\n /**\n * The filtering operators supported by {@link Query#filter}, and which are\n * implemented by adapters (for the most part).\n *\n * @example Variant 1\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store.filter('post', {\n * status: 'published',\n * limit: 2\n * });\n * console.log(publishedPosts);\n *\n *\n * @example Variant 2\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * }\n * },\n * limit: 2\n * });\n * console.log(publishedPosts);\n *\n * @example Variant 3\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store\n * .query('post')\n * .filter({ status: 'published' })\n * .limit(2)\n * .run();\n * console.log(publishedPosts);\n *\n * @example Variant 4\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store\n * .query('post')\n * .filter({\n * where: {\n * status: {\n * '==': 'published'\n * }\n * }\n * })\n * .limit(2)\n * .run();\n * console.log(publishedPosts);\n *\n * @example Multiple operators\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n *\n * const myPublishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * },\n * user_id: {\n * '==': currentUser.id\n * }\n * }\n * });\n *\n * console.log(myPublishedPosts);\n *\n * @name Query.ops\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > Greater than operator.\n * @property {Function} >= Greater than (inclusive) operator.\n * @property {Function} < Less than operator.\n * @property {Function} <= Less than (inclusive) operator.\n * @property {Function} isectEmpty Operator that asserts that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator that asserts that the\n * intersection between two arrays is __not__ empty.\n * @property {Function} in Operator that asserts whether a value is in an\n * array.\n * @property {Function} notIn Operator that asserts whether a value is __not__\n * in an array.\n * @property {Function} contains Operator that asserts whether an array\n * contains a value.\n * @property {Function} notContains Operator that asserts whether an array\n * does __not__ contain a value.\n * @since 3.0.0\n * @type {Object}\n */\n ops: {\n '=': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '==': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '===': function (value, predicate) {\n return value === predicate\n },\n '!=': function (value, predicate) {\n return value != predicate // eslint-disable-line\n },\n '!==': function (value, predicate) {\n return value !== predicate\n },\n '>': function (value, predicate) {\n return value > predicate\n },\n '>=': function (value, predicate) {\n return value >= predicate\n },\n '<': function (value, predicate) {\n return value < predicate\n },\n '<=': function (value, predicate) {\n return value <= predicate\n },\n 'isectEmpty': function (value, predicate) {\n return !utils.intersection((value || []), (predicate || [])).length\n },\n 'isectNotEmpty': function (value, predicate) {\n return utils.intersection((value || []), (predicate || [])).length\n },\n 'in': function (value, predicate) {\n return predicate.indexOf(value) !== -1\n },\n 'notIn': function (value, predicate) {\n return predicate.indexOf(value) === -1\n },\n 'contains': function (value, predicate) {\n return (value || []).indexOf(predicate) !== -1\n },\n 'notContains': function (value, predicate) {\n return (value || []).indexOf(predicate) === -1\n }\n }\n})\n\n/**\n * Create a subclass of this Query:\n * @example Query.extend\n * const JSData = require('js-data');\n * const { Query } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomQueryClass extends Query {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customQuery = new CustomQueryClass();\n * console.log(customQuery.foo());\n * console.log(CustomQueryClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherQueryClass = Query.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherQuery = new OtherQueryClass();\n * console.log(otherQuery.foo());\n * console.log(OtherQueryClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherQueryClass (collection) {\n * Query.call(this, collection);\n * this.created_at = new Date().getTime();\n * }\n * Query.extend({\n * constructor: AnotherQueryClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherQuery = new AnotherQueryClass();\n * console.log(anotherQuery.created_at);\n * console.log(anotherQuery.foo());\n * console.log(AnotherQueryClass.beep());\n *\n * @method Query.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Query class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\n// TODO: remove this when the rest of the project is cleaned\nexport const belongsToType = 'belongsTo'\nexport const hasManyType = 'hasMany'\nexport const hasOneType = 'hasOne'\n\nconst DOMAIN = 'Relation'\n\nexport function Relation (relatedMapper, options = {}) {\n utils.classCallCheck(this, Relation)\n\n options.type = this.constructor.TYPE_NAME\n this.validateOptions(relatedMapper, options)\n\n if (typeof relatedMapper === 'object') {\n Object.defineProperty(this, 'relatedMapper', { value: relatedMapper })\n }\n\n Object.defineProperty(this, 'inverse', { writable: true })\n utils.fillIn(this, options)\n}\n\nRelation.extend = utils.extend\n\nutils.addHiddenPropsToTarget(Relation.prototype, {\n get canAutoAddLinks () {\n return this.add === undefined || !!this.add\n },\n\n get relatedCollection () {\n return this.mapper.datastore.getCollection(this.relation)\n },\n\n validateOptions (related, opts) {\n const DOMAIN_ERR = `new ${DOMAIN}`\n\n const localField = opts.localField\n if (!localField) {\n throw utils.err(DOMAIN_ERR, 'opts.localField')(400, 'string', localField)\n }\n\n const foreignKey = opts.foreignKey = opts.foreignKey || opts.localKey\n if (!foreignKey && (opts.type === belongsToType || opts.type === hasOneType)) {\n throw utils.err(DOMAIN_ERR, 'opts.foreignKey')(400, 'string', foreignKey)\n }\n\n if (utils.isString(related)) {\n opts.relation = related\n if (!utils.isFunction(opts.getRelation)) {\n throw utils.err(DOMAIN_ERR, 'opts.getRelation')(400, 'function', opts.getRelation)\n }\n } else if (related) {\n opts.relation = related.name\n } else {\n throw utils.err(DOMAIN_ERR, 'related')(400, 'Mapper or string', related)\n }\n },\n\n assignTo (mapper) {\n this.name = mapper.name\n Object.defineProperty(this, 'mapper', { value: mapper })\n\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n mapper.relationFields || Object.defineProperty(mapper, 'relationFields', { value: [] })\n mapper.relationList.push(this)\n mapper.relationFields.push(this.localField)\n },\n\n canFindLinkFor () {\n return !!(this.foreignKey || this.localKey)\n },\n\n getRelation () {\n return this.relatedMapper\n },\n\n getForeignKey (record) {\n return utils.get(record, this.mapper.idAttribute)\n },\n\n setForeignKey (record, relatedRecord) {\n if (!record || !relatedRecord) {\n return\n }\n\n this._setForeignKey(record, relatedRecord)\n },\n\n _setForeignKey (record, relatedRecords) {\n const idAttribute = this.mapper.idAttribute\n\n if (!utils.isArray(relatedRecords)) {\n relatedRecords = [relatedRecords]\n }\n\n relatedRecords.forEach((relatedRecord) => {\n utils.set(relatedRecord, this.foreignKey, utils.get(record, idAttribute))\n })\n },\n\n getLocalField (record) {\n return utils.get(record, this.localField)\n },\n\n setLocalField (record, relatedData) {\n return utils.set(record, this.localField, relatedData)\n },\n\n getInverse (mapper) {\n if (!this.inverse) {\n this.findInverseRelation(mapper)\n }\n\n return this.inverse\n },\n\n findInverseRelation (mapper) {\n this.getRelation().relationList.forEach((def) => {\n if (def.getRelation() === mapper && this.isInversedTo(def) && this !== def) {\n this.inverse = def\n return true\n }\n })\n },\n\n isInversedTo (def) {\n return !def.foreignKey || def.foreignKey === this.foreignKey\n },\n\n addLinkedRecords (records) {\n const datastore = this.mapper.datastore\n\n records.forEach((record) => {\n let relatedData = this.getLocalField(record)\n\n if (utils.isFunction(this.add)) {\n relatedData = this.add(datastore, this, record)\n } else if (relatedData) {\n relatedData = this.linkRecord(record, relatedData)\n }\n\n const isEmptyLinks = !relatedData || (utils.isArray(relatedData) && !relatedData.length)\n\n if (isEmptyLinks && this.canFindLinkFor(record)) {\n relatedData = this.findExistingLinksFor(record)\n }\n\n if (relatedData) {\n this.setLocalField(record, relatedData)\n }\n })\n },\n\n removeLinkedRecords (relatedMapper, records) {\n const localField = this.localField\n records.forEach((record) => {\n utils.set(record, localField, undefined)\n })\n },\n\n linkRecord (record, relatedRecord) {\n const relatedId = utils.get(relatedRecord, this.mapper.idAttribute)\n\n if (relatedId === undefined) {\n const unsaved = this.relatedCollection.unsaved()\n if (unsaved.indexOf(relatedRecord) === -1) {\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n } else {\n if (relatedRecord !== this.relatedCollection.get(relatedId)) {\n this.setForeignKey(record, relatedRecord)\n\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n }\n\n return relatedRecord\n },\n\n // e.g. user hasMany post via \"foreignKey\", so find all posts of user\n findExistingLinksByForeignKey (id) {\n if (id === undefined || id === null) {\n return\n }\n return this.relatedCollection.filter({\n [this.foreignKey]: id\n })\n },\n\n ensureLinkedDataHasProperType (props, opts) {\n const relatedMapper = this.getRelation()\n const relationData = this.getLocalField(props)\n\n if (utils.isArray(relationData) && (!relationData.length || relatedMapper.is(relationData[0]))) {\n return\n }\n\n if (relationData && !relatedMapper.is(relationData)) {\n utils.set(props, this.localField, relatedMapper.createRecord(relationData, opts))\n }\n },\n\n isRequiresParentId () {\n return false\n },\n\n isRequiresChildId () {\n return false\n },\n\n createChildRecord (props, relationData, opts) {\n this.setForeignKey(props, relationData)\n\n return this.createLinked(relationData, opts).then((result) => {\n this.setLocalField(props, result)\n })\n },\n\n createLinked (props, opts) {\n const create = utils.isArray(props) ? 'createMany' : 'create'\n\n return this.getRelation()[create](props, opts)\n }\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const BelongsToRelation = Relation.extend({\n getForeignKey (record) {\n return utils.get(record, this.foreignKey)\n },\n\n _setForeignKey (record, relatedRecord) {\n utils.set(record, this.foreignKey, utils.get(relatedRecord, this.getRelation().idAttribute))\n },\n\n findExistingLinksFor (record) {\n // console.log('\\tBelongsTo#findExistingLinksFor', record)\n if (!record) {\n return\n }\n const relatedId = utils.get(record, this.foreignKey)\n if (relatedId !== undefined && relatedId !== null) {\n return this.relatedCollection.get(relatedId)\n }\n },\n\n isRequiresParentId () {\n return true\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n\n return this.createLinked(relationData, opts).then((record) => {\n this.setForeignKey(props, record)\n })\n },\n\n createChildRecord () {\n throw new Error('\"BelongsTo\" relation does not support child creation as it cannot have children.')\n }\n}, {\n TYPE_NAME: 'belongsTo'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasManyRelation = Relation.extend({\n validateOptions (related, opts) {\n Relation.prototype.validateOptions.call(this, related, opts)\n\n const { localKeys, foreignKeys, foreignKey } = opts\n\n if (!foreignKey && !localKeys && !foreignKeys) {\n throw utils.err('new Relation', 'opts.')(400, 'string', foreignKey)\n }\n },\n\n canFindLinkFor (record) {\n const hasForeignKeys = this.foreignKey || this.foreignKeys\n return !!(hasForeignKeys || (this.localKeys && utils.get(record, this.localKeys)))\n },\n\n linkRecord (record, relatedRecords) {\n const relatedCollection = this.relatedCollection\n const canAutoAddLinks = this.canAutoAddLinks\n const foreignKey = this.foreignKey\n const unsaved = this.relatedCollection.unsaved()\n\n return relatedRecords.map((relatedRecord) => {\n const relatedId = relatedCollection.recordId(relatedRecord)\n\n if ((relatedId === undefined && unsaved.indexOf(relatedRecord) === -1) || relatedRecord !== relatedCollection.get(relatedId)) {\n if (foreignKey) {\n // TODO: slow, could be optimized? But user loses hook\n this.setForeignKey(record, relatedRecord)\n }\n if (canAutoAddLinks) {\n relatedRecord = relatedCollection.add(relatedRecord)\n }\n }\n\n return relatedRecord\n })\n },\n\n findExistingLinksFor (record) {\n const id = utils.get(record, this.mapper.idAttribute)\n const ids = this.localKeys ? utils.get(record, this.localKeys) : null\n let records\n\n if (id !== undefined && this.foreignKey) {\n records = this.findExistingLinksByForeignKey(id)\n } else if (this.localKeys && ids) {\n records = this.findExistingLinksByLocalKeys(ids)\n } else if (id !== undefined && this.foreignKeys) {\n records = this.findExistingLinksByForeignKeys(id)\n }\n\n if (records && records.length) {\n return records\n }\n },\n\n // e.g. user hasMany group via \"foreignKeys\", so find all users of a group\n findExistingLinksByLocalKeys (ids) {\n return this.relatedCollection.filter({\n where: {\n [this.mapper.idAttribute]: {\n 'in': ids\n }\n }\n })\n },\n\n // e.g. group hasMany user via \"localKeys\", so find all groups that own a user\n findExistingLinksByForeignKeys (id) {\n return this.relatedCollection.filter({\n where: {\n [this.foreignKeys]: {\n 'contains': id\n }\n }\n })\n },\n\n isRequiresParentId () {\n return !!this.localKeys && this.localKeys.length > 0\n },\n\n isRequiresChildId () {\n return !!this.foreignKey\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n const foreignIdField = this.getRelation().idAttribute\n\n return this.createLinked(relationData, opts).then((records) => {\n utils.set(props, this.localKeys, records.map((record) => utils.get(record, foreignIdField)))\n })\n },\n\n createLinked (props, opts) {\n return this.getRelation().createMany(props, opts)\n }\n}, {\n TYPE_NAME: 'hasMany'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasOneRelation = Relation.extend({\n findExistingLinksFor (relatedMapper, record) {\n const recordId = utils.get(record, relatedMapper.idAttribute)\n const records = this.findExistingLinksByForeignKey(recordId)\n\n if (records && records.length) {\n return records[0]\n }\n },\n\n isRequiresChildId () {\n return true\n }\n}, {\n TYPE_NAME: 'hasOne'\n})\n","import { Relation } from './Relation'\nimport { BelongsToRelation } from './Relation/BelongsTo'\nimport { HasManyRelation } from './Relation/HasMany'\nimport { HasOneRelation } from './Relation/HasOne'\n\n[BelongsToRelation, HasManyRelation, HasOneRelation].forEach(function (RelationType) {\n Relation[RelationType.TYPE_NAME] = function (related, options) {\n return new RelationType(related, options)\n }\n})\n\nexport { belongsToType, hasManyType, hasOneType, Relation } from './Relation'\n","import { Relation } from './relations'\n\nexport { belongsToType, hasManyType, hasOneType } from './relations'\n/**\n * BelongsTo relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.belongsTo\n * @method\n * @param {Mapper} related The relation the target belongs to.\n * @param {object} opts Configuration options.\n * @param {string} opts.foreignKey The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const belongsTo = function (related, opts) {\n return function (mapper) {\n Relation.belongsTo(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasMany relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasMany\n * @method\n * @param {Mapper} related The relation of which the target has many.\n * @param {object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasMany = function (related, opts) {\n return function (mapper) {\n Relation.hasMany(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasOne relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasOne\n * @method\n * @param {Mapper} related The relation of which the target has one.\n * @param {object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasOne = function (related, opts) {\n return function (mapper) {\n Relation.hasOne(related, opts).assignTo(mapper)\n }\n}\n","import utils, { safeSetLink } from './utils'\nimport Component from './Component'\nimport Settable from './Settable'\nimport {\n hasManyType,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Record'\n\nconst superMethod = function (mapper, name) {\n const store = mapper.datastore\n if (store && store[name]) {\n return function (...args) {\n return store[name](mapper.name, ...args)\n }\n }\n return mapper[name].bind(mapper)\n}\n\n// Cache these strings\nconst creatingPath = 'creating'\nconst noValidatePath = 'noValidate'\nconst keepChangeHistoryPath = 'keepChangeHistory'\nconst previousPath = 'previous'\n\n/**\n * js-data's Record class. An instance of `Record` corresponds to an in-memory\n * representation of a single row or document in a database, Firebase,\n * localstorage, etc. Basically, a `Record` instance represents whatever kind of\n * entity in your persistence layer that has a primary key.\n *\n * ```javascript\n * import {Record} from 'js-data'\n * ```\n *\n * @example Record#constructor\n * const JSData = require('js-data');\n * const { Record } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Instantiate a plain record\n * let record = new Record();\n * console.log('record: ' + JSON.stringify(record));\n *\n * // You can supply properties on instantiation\n * record = new Record({ name: 'John' });\n * console.log('record: ' + JSON.stringify(record));\n *\n * @example Record#constructor2\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Instantiate a record that's associated with a Mapper:\n * const UserMapper = new Mapper({ name: 'user' });\n * const User = UserMapper.recordClass;\n * const user = UserMapper.createRecord({ name: 'John' });\n * const user2 = new User({ name: 'Sally' });\n * console.log('user: ' + JSON.stringify(user));\n * console.log('user2: ' + JSON.stringify(user2));\n *\n * @example Record#constructor3\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n *\n * // Instantiate a record that's associated with a store's Mapper\n * const user = store.createRecord('user', { name: 'John' });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @example Record#constructor4\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * // Validate on instantiation\n * const user = store.createRecord('user', { name: 1234 });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @example Record#constructor5\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * // Skip validation on instantiation\n * const user = store.createRecord('user', { name: 1234 }, { noValidate: true });\n * console.log('user: ' + JSON.stringify(user));\n * console.log('user.isValid(): ' + user.isValid());\n *\n * @class Record\n * @extends Component\n * @param {object} [props] The initial properties of the new Record instance.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate=false] Whether to skip validation on the\n * initial properties.\n * @param {boolean} [opts.validateOnSet=true] Whether to enable setter\n * validation on properties after the Record has been initialized.\n * @since 3.0.0\n */\nfunction Record (props, opts) {\n utils.classCallCheck(this, Record)\n Settable.call(this)\n props || (props = {})\n opts || (opts = {})\n const _set = this._set\n const mapper = this.constructor.mapper\n\n _set(creatingPath, true)\n _set(noValidatePath, !!opts.noValidate)\n _set(keepChangeHistoryPath, opts.keepChangeHistory === undefined ? (mapper ? mapper.keepChangeHistory : true) : opts.keepChangeHistory)\n\n // Set the idAttribute value first, if it exists.\n const id = mapper ? utils.get(props, mapper.idAttribute) : undefined\n if (id !== undefined) {\n utils.set(this, mapper.idAttribute, id)\n }\n\n utils.fillIn(this, props)\n _set(creatingPath, false)\n if (opts.validateOnSet !== undefined) {\n _set(noValidatePath, !opts.validateOnSet)\n } else if (mapper && mapper.validateOnSet !== undefined) {\n _set(noValidatePath, !mapper.validateOnSet)\n } else {\n _set(noValidatePath, false)\n }\n _set(previousPath, mapper ? mapper.toJSON(props) : utils.plainCopy(props))\n}\n\nexport default Component.extend({\n constructor: Record,\n\n /**\n * Returns the {@link Mapper} paired with this record's class, if any.\n *\n * @method Record#_mapper\n * @returns {Mapper} The {@link Mapper} paired with this record's class, if any.\n * @since 3.0.0\n */\n _mapper () {\n const mapper = this.constructor.mapper\n if (!mapper) {\n throw utils.err(`${DOMAIN}#_mapper`, '')(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Lifecycle hook.\n *\n * @method Record#afterLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n afterLoadRelations () {},\n\n /**\n * Lifecycle hook.\n *\n * @method Record#beforeLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n beforeLoadRelations () {},\n\n /**\n * Return the change history of this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @method Record#changeHistory\n * @since 3.0.0\n */\n changeHistory () {\n return (this._get('history') || []).slice()\n },\n\n /**\n * Return changes to this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#changes\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user changes: ' + JSON.stringify(user.changes()));\n * user.name = 'John';\n * console.log('user changes: ' + JSON.stringify(user.changes()));\n *\n * @method Record#changes\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} Object describing the changes to this record since it was\n * instantiated or its {@link Record#commit} method was last called.\n * @since 3.0.0\n */\n changes (opts) {\n opts || (opts = {})\n return utils.diffObjects(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Make the record's current in-memory state it's only state, with any\n * previous property values being set to current values.\n *\n * @example Record#commit\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.name = 'John';\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.commit();\n * console.log('user hasChanges: ' + user.hasChanges());\n *\n * @method Record#commit\n * @param {object} [opts] Configuration options. Passed to {@link Record#toJSON}.\n * @since 3.0.0\n */\n commit (opts) {\n this._set('changed') // unset\n this._set('changing', false)\n this._set('history', []) // clear history\n this._set('previous', this.toJSON(opts))\n },\n\n /**\n * Call {@link Mapper#destroy} using this record's primary key.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('user');\n * store.find('user', 1234).then((user) => {\n * console.log(user.id); // 1234\n *\n * // Destroy this user from the database\n * return user.destroy();\n * });\n *\n * @method Record#destroy\n * @param {object} [opts] Configuration options passed to {@link Mapper#destroy}.\n * @returns {Promise} The result of calling {@link Mapper#destroy} with the\n * primary key of this record.\n * @since 3.0.0\n */\n destroy (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n return superMethod(mapper, 'destroy')(utils.get(this, mapper.idAttribute), opts)\n },\n\n /**\n * Return the value at the given path for this instance.\n *\n * @example Record#get\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user', { name: 'Bob' });\n * console.log('user.get(\"name\"): ' + user.get('name'));\n *\n * @method Record#get\n * @param {string} key Path of value to retrieve.\n * @returns {*} Value at path.\n * @since 3.0.0\n */\n 'get' (key) {\n return utils.get(this, key)\n },\n\n /**\n * Return whether this record has changed since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#hasChanges\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.name = 'John';\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.commit();\n * console.log('user hasChanges: ' + user.hasChanges());\n *\n * @method Record#hasChanges\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Return whether the record has changed since it was\n * instantiated or since its {@link Record#commit} method was called.\n * @since 3.0.0\n */\n hasChanges (opts) {\n const quickHasChanges = !!(this._get('changed') || []).length\n return quickHasChanges || utils.areDifferent(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Return whether the record is unsaved. Records that have primary keys are\n * considered \"saved\". Records without primary keys are considered \"unsaved\".\n *\n * @example Record#isNew\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * id: 1234\n * });\n * const user2 = store.createRecord('user');\n * console.log('user isNew: ' + user.isNew()); // false\n * console.log('user2 isNew: ' + user2.isNew()); // true\n *\n * @method Record#isNew\n * @returns {boolean} Whether the record is unsaved.\n * @since 3.0.0\n */\n isNew (opts) {\n return utils.get(this, this._mapper().idAttribute) === undefined\n },\n\n /**\n * Return whether the record in its current state passes validation.\n *\n * @example Record#isValid\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * });\n * console.log('user isValid: ' + user.isValid());\n * user.name = 'John';\n * console.log('user isValid: ' + user.isValid());\n *\n * @method Record#isValid\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {boolean} Whether the record in its current state passes\n * validation.\n * @since 3.0.0\n */\n isValid (opts) {\n return !this._mapper().validate(this, opts)\n },\n\n removeInverseRelation (currentParent, id, inverseDef, idAttribute) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n // e.g. remove comment from otherPost.comments\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n setupInverseRelation (record, id, inverseDef, idAttribute) {\n // Update (set) inverse relation\n if (inverseDef.type === hasOneType) {\n // e.g. someUser.profile = profile\n safeSetLink(record, inverseDef.localField, this)\n } else if (inverseDef.type === hasManyType) {\n // e.g. add comment to somePost.comments\n const children = utils.get(record, inverseDef.localField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n /**\n * Lazy load relations of this record, to be attached to the record once their\n * loaded.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('user', {\n * relations: {\n * hasMany: {\n * post: {\n * localField: 'posts',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * });\n * store.defineMapper('post', {\n * relations: {\n * belongsTo: {\n * user: {\n * localField: 'user',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * });\n * store.find('user', 1234).then((user) => {\n * console.log(user.id); // 1234\n *\n * // Load the user's post relations\n * return user.loadRelations(['post']);\n * }).then((user) => {\n * console.log(user.posts); // [{...}, {...}, ...]\n * });\n *\n * @method Record#loadRelations\n * @param {string[]} [relations] List of relations to load. Can use localField\n * names or Mapper names to pick relations.\n * @param {object} [opts] Configuration options.\n * @returns {Promise} Resolves with the record, with the loaded relations now\n * attached.\n * @since 3.0.0\n */\n loadRelations (relations, opts) {\n let op\n const mapper = this._mapper()\n\n // Default values for arguments\n relations || (relations = [])\n if (utils.isString(relations)) {\n relations = [relations]\n }\n opts || (opts = {})\n opts.with = relations\n\n // Fill in \"opts\" with the Model's configuration\n utils._(opts, mapper)\n opts.adapter = mapper.getAdapterName(opts)\n\n // beforeLoadRelations lifecycle hook\n op = opts.op = 'beforeLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => {\n // Now delegate to the adapter\n op = opts.op = 'loadRelations'\n mapper.dbg(op, this, relations, opts)\n let tasks = []\n let task\n utils.forEachRelation(mapper, opts, (def, optsCopy) => {\n const relatedMapper = def.getRelation()\n optsCopy.raw = false\n if (utils.isFunction(def.load)) {\n task = def.load(mapper, def, this, opts)\n } else if (def.type === 'hasMany' || def.type === 'hasOne') {\n if (def.foreignKey) {\n task = superMethod(relatedMapper, 'findAll')({\n [def.foreignKey]: utils.get(this, mapper.idAttribute)\n }, optsCopy).then(function (relatedData) {\n if (def.type === 'hasOne') {\n return relatedData.length ? relatedData[0] : undefined\n }\n return relatedData\n })\n } else if (def.localKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [relatedMapper.idAttribute]: {\n 'in': utils.get(this, def.localKeys)\n }\n }\n })\n } else if (def.foreignKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [def.foreignKeys]: {\n 'contains': utils.get(this, mapper.idAttribute)\n }\n }\n }, opts)\n }\n } else if (def.type === 'belongsTo') {\n const key = utils.get(this, def.foreignKey)\n if (utils.isSorN(key)) {\n task = superMethod(relatedMapper, 'find')(key, optsCopy)\n }\n }\n if (task) {\n task = task.then((relatedData) => {\n def.setLocalField(this, relatedData)\n })\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(() => {\n // afterLoadRelations lifecycle hook\n op = opts.op = 'afterLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => this)\n })\n },\n\n /**\n * Return the properties with which this record was instantiated.\n *\n * @example Record#previous\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * name: 'William'\n * });\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n * user.name = 'Bob';\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n * user.commit();\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n *\n * @method Record#previous\n * @param {string} [key] If specified, return just the initial value of the\n * given key.\n * @returns {Object} The initial properties of this record.\n * @since 3.0.0\n */\n previous (key) {\n if (key) {\n return this._get(`previous.${key}`)\n }\n return this._get('previous')\n },\n\n /**\n * Revert changes to this record back to the properties it had when it was\n * instantiated.\n *\n * @example Record#revert\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * name: 'William'\n * });\n * console.log('user: ' + JSON.stringify(user));\n * user.name = 'Bob';\n * console.log('user: ' + JSON.stringify(user));\n * user.revert();\n * console.log('user: ' + JSON.stringify(user));\n *\n * @method Record#revert\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.preserve] Array of strings or Regular Expressions\n * denoting properties that should not be reverted.\n * @since 3.0.0\n */\n revert (opts) {\n const previous = this._get('previous')\n opts || (opts = {})\n opts.preserve || (opts.preserve = [])\n utils.forOwn(this, (value, key) => {\n if (key !== this._mapper().idAttribute && !previous.hasOwnProperty(key) && this.hasOwnProperty(key) && opts.preserve.indexOf(key) === -1) {\n delete this[key]\n }\n })\n utils.forOwn(previous, (value, key) => {\n if (opts.preserve.indexOf(key) === -1) {\n this[key] = value\n }\n })\n this.commit()\n },\n\n /**\n * Delegates to {@link Mapper#create} or {@link Mapper#update}.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('session');\n * const session = store.createRecord('session', { topic: 'Node.js' });\n *\n * // Create a new record in the database\n * session.save().then(() => {\n * console.log(session.id); // 1234\n *\n * session.skill_level = 'beginner';\n *\n * // Update the record in the database\n * return session.save();\n * });\n *\n * @method Record#save\n * @param {object} [opts] Configuration options. See {@link Mapper#create} and\n * {@link Mapper#update}.\n * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`.\n * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @param {array} [opts.ignore] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @returns {Promise} The result of calling {@link Mapper#create} or\n * {@link Mapper#update}.\n * @since 3.0.0\n */\n save (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n const id = utils.get(this, mapper.idAttribute)\n let props = this\n\n const postProcess = (result) => {\n const record = opts.raw ? result.data : result\n if (record) {\n utils.deepMixIn(this, record)\n this.commit()\n }\n return result\n }\n\n if (id === undefined) {\n return superMethod(mapper, 'create')(props, opts).then(postProcess)\n }\n if (opts.changesOnly) {\n const changes = this.changes(opts)\n props = {}\n utils.fillIn(props, changes.added)\n utils.fillIn(props, changes.changed)\n }\n return superMethod(mapper, 'update')(id, props, opts).then(postProcess)\n },\n\n /**\n * Set the value for a given key, or the values for the given keys if \"key\" is\n * an object. Triggers change events on those properties that have `track: true`\n * in {@link Mapper#schema}.\n *\n * @example Record#set\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user');\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.set('name', 'Bob');\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.set({ age: 30, role: 'admin' });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @fires Record#change\n * @method Record#set\n * @param {(string|Object)} key Key to set or hash of key-value pairs to set.\n * @param {*} [value] Value to set for the given key.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n 'set' (key, value, opts) {\n if (utils.isObject(key)) {\n opts = value\n }\n opts || (opts = {})\n if (opts.silent) {\n this._set('silent', true)\n }\n utils.set(this, key, value)\n if (!this._get('eventId')) {\n this._set('silent') // unset\n }\n },\n\n /**\n * Return a plain object representation of this record. If the class from\n * which this record was created has a Mapper, then {@link Mapper#toJSON} will\n * be called with this record instead.\n *\n * @example Record#toJSON\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * const user = store.createRecord('user', {\n * name: 'John',\n * $$hashKey: '1234'\n * });\n * console.log('user: ' + JSON.stringify(user.toJSON()));\n *\n * @method Record#toJSON\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation. Only available as an option if the class\n * from which this record was created has a Mapper and this record resides in\n * an instance of {@link DataStore}.\n * @returns {Object} Plain object representation of this record.\n * @since 3.0.0\n */\n toJSON (opts) {\n const mapper = this.constructor.mapper\n if (mapper) {\n return mapper.toJSON(this, opts)\n } else {\n const json = {}\n utils.forOwn(this, (prop, key) => {\n json[key] = utils.plainCopy(prop)\n })\n return json\n }\n },\n\n /**\n * Unset the value for a given key. Triggers change events on those properties\n * that have `track: true` in {@link Mapper#schema}.\n *\n * @example Record#unset\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user', {\n * name: 'John'\n * });\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.unset('name');\n * console.log('user: ' + JSON.stringify(user));\n *\n * @method Record#unset\n * @param {string} key Key to unset.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n unset (key, opts) {\n this.set(key, undefined, opts)\n },\n\n /**\n * Validate this record based on its current properties.\n *\n * @example Record#validate\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * });\n * console.log('user validation: ' + JSON.stringify(user.validate()));\n * user.name = 'John';\n * console.log('user validation: ' + user.validate());\n *\n * @method Record#validate\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {*} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (opts) {\n return this._mapper().validate(this, opts)\n }\n}, {\n creatingPath,\n noValidatePath,\n keepChangeHistoryPath,\n previousPath\n})\n\n/**\n * Allow records to emit events.\n *\n * An record's registered listeners are stored in the record's private data.\n */\nutils.eventify(\n Record.prototype,\n function () {\n return this._get('events')\n },\n function (value) {\n this._set('events', value)\n }\n)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link Record~changeListener} on how to listen for this event.\n *\n * @event Record#change\n * @see Record~changeListener\n */\n\n/**\n * Callback signature for the {@link Record#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * record.on('change', onChange);\n *\n * @callback Record~changeListener\n * @param {Record} The Record that changed.\n * @param {object} The changes.\n * @see Record#event:change\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Record:\n * @example Record.extend\n * const JSData = require('js-data');\n * const { Record } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomRecordClass extends Record {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customRecord = new CustomRecordClass();\n * console.log(customRecord.foo());\n * console.log(CustomRecordClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherRecordClass = Record.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherRecord = new OtherRecordClass();\n * console.log(otherRecord.foo());\n * console.log(OtherRecordClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherRecordClass () {\n * Record.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Record.extend({\n * constructor: AnotherRecordClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherRecord = new AnotherRecordClass();\n * console.log(anotherRecord.created_at);\n * console.log(anotherRecord.foo());\n * console.log(AnotherRecordClass.beep());\n *\n * @method Record.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Record class.\n * @since 3.0.0\n */\n","export function sort (a, b, hashCode) {\n // Short-circuit comparison if a and b are strictly equal\n // This is absolutely necessary for indexed objects that\n // don't have the idAttribute field\n if (a === b) {\n return 0\n }\n if (hashCode) {\n a = hashCode(a)\n b = hashCode(b)\n }\n if ((a === null && b === null) || (a === undefined && b === undefined)) {\n return -1\n }\n\n if (a === null || a === undefined) {\n return -1\n }\n\n if (b === null || b === undefined) {\n return 1\n }\n\n if (a < b) {\n return -1\n }\n\n if (a > b) {\n return 1\n }\n\n return 0\n}\n\nexport function insertAt (array, index, value) {\n array.splice(index, 0, value)\n return array\n}\n\nexport function removeAt (array, index) {\n array.splice(index, 1)\n return array\n}\n\nexport function binarySearch (array, value, field) {\n let lo = 0\n let hi = array.length\n let compared\n let mid\n\n while (lo < hi) {\n mid = ((lo + hi) / 2) | 0\n compared = sort(value, array[mid], field)\n if (compared === 0) {\n return {\n found: true,\n index: mid\n }\n } else if (compared < 0) {\n hi = mid\n } else {\n lo = mid + 1\n }\n }\n\n return {\n found: false,\n index: hi\n }\n}\n","// Copyright (c) 2015, InternalFX.\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose with or\n// without fee is hereby granted, provided that the above copyright notice and this permission\n// notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO\n// THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT\n// SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR\n// ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE\n// USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// Modifications\n// Copyright 2015-2016 Jason Dobry\n//\n// Summary of modifications:\n// Reworked dependencies so as to re-use code already in js-data\n// Removed unused code\nimport utils from '../../src/utils'\nimport {binarySearch, insertAt, removeAt} from './_utils'\n\nexport default function Index (fieldList, opts) {\n utils.classCallCheck(this, Index)\n fieldList || (fieldList = [])\n\n if (!utils.isArray(fieldList)) {\n throw new Error('fieldList must be an array.')\n }\n\n opts || (opts = {})\n this.fieldList = fieldList\n this.fieldGetter = opts.fieldGetter\n this.hashCode = opts.hashCode\n this.isIndex = true\n this.keys = []\n this.values = []\n}\n\nutils.addHiddenPropsToTarget(Index.prototype, {\n 'set' (keyList, value) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n let dataLocation = binarySearch(this.values[pos.index], value, this.hashCode)\n if (!dataLocation.found) {\n insertAt(this.values[pos.index], dataLocation.index, value)\n }\n } else {\n insertAt(this.keys, pos.index, key)\n insertAt(this.values, pos.index, [value])\n }\n } else {\n if (pos.found) {\n this.values[pos.index].set(keyList, value)\n } else {\n insertAt(this.keys, pos.index, key)\n let newIndex = new Index([], { hashCode: this.hashCode })\n newIndex.set(keyList, value)\n insertAt(this.values, pos.index, newIndex)\n }\n }\n },\n\n 'get' (keyList) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n if (this.values[pos.index].isIndex) {\n return this.values[pos.index].getAll()\n } else {\n return this.values[pos.index].slice()\n }\n } else {\n return []\n }\n } else {\n if (pos.found) {\n return this.values[pos.index].get(keyList)\n } else {\n return []\n }\n }\n },\n\n getAll (opts) {\n opts || (opts = {})\n let results = []\n const values = this.values\n if (opts.order === 'desc') {\n for (let i = values.length - 1; i >= 0; i--) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n } else {\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n }\n return results\n },\n\n visitAll (cb, thisArg) {\n this.values.forEach(function (value) {\n if (value.isIndex) {\n value.visitAll(cb, thisArg)\n } else {\n value.forEach(cb, thisArg)\n }\n })\n },\n\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (!utils.isArray(leftKeys)) {\n leftKeys = [leftKeys]\n }\n if (!utils.isArray(rightKeys)) {\n rightKeys = [rightKeys]\n }\n utils.fillIn(opts, {\n leftInclusive: true,\n rightInclusive: false,\n limit: undefined,\n offset: 0\n })\n\n let results = this._between(leftKeys, rightKeys, opts)\n\n if (opts.limit) {\n return results.slice(opts.offset, opts.limit + opts.offset)\n } else {\n return results.slice(opts.offset)\n }\n },\n\n _between (leftKeys, rightKeys, opts) {\n let results = []\n\n let leftKey = leftKeys.shift()\n let rightKey = rightKeys.shift()\n\n let pos\n\n if (leftKey !== undefined) {\n pos = binarySearch(this.keys, leftKey)\n } else {\n pos = {\n found: false,\n index: 0\n }\n }\n\n if (leftKeys.length === 0) {\n if (pos.found && opts.leftInclusive === false) {\n pos.index += 1\n }\n\n for (let i = pos.index; i < this.keys.length; i += 1) {\n if (rightKey !== undefined) {\n if (opts.rightInclusive) {\n if (this.keys[i] > rightKey) { break }\n } else {\n if (this.keys[i] >= rightKey) { break }\n }\n }\n\n if (this.values[i].isIndex) {\n results = results.concat(this.values[i].getAll())\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n } else {\n for (let i = pos.index; i < this.keys.length; i += 1) {\n let currKey = this.keys[i]\n if (currKey > rightKey) { break }\n\n if (this.values[i].isIndex) {\n if (currKey === leftKey) {\n results = results.concat(this.values[i]._between(utils.copy(leftKeys), rightKeys.map(function () { return undefined }), opts))\n } else if (currKey === rightKey) {\n results = results.concat(this.values[i]._between(leftKeys.map(function () { return undefined }), utils.copy(rightKeys), opts))\n } else {\n results = results.concat(this.values[i].getAll())\n }\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n }\n\n if (opts.limit) {\n return results.slice(0, opts.limit + opts.offset)\n } else {\n return results\n }\n },\n\n peek () {\n if (this.values.length) {\n if (this.values[0].isIndex) {\n return this.values[0].peek()\n } else {\n return this.values[0]\n }\n }\n return []\n },\n\n clear () {\n this.keys = []\n this.values = []\n },\n\n insertRecord (data) {\n let keyList = this.fieldList.map(function (field) {\n if (utils.isFunction(field)) {\n return field(data) || undefined\n } else {\n return data[field] || undefined\n }\n })\n this.set(keyList, data)\n },\n\n removeRecord (data) {\n let removed\n const isUnique = this.hashCode(data) !== undefined\n this.values.forEach((value, i) => {\n if (value.isIndex) {\n if (value.removeRecord(data)) {\n if (value.keys.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n } else {\n let dataLocation = {}\n if (this.keys[i] === undefined || !isUnique) {\n for (let j = value.length - 1; j >= 0; j--) {\n if (value[j] === data) {\n dataLocation = {\n found: true,\n index: j\n }\n break\n }\n }\n } else if (isUnique) {\n dataLocation = binarySearch(value, data, this.hashCode)\n }\n if (dataLocation.found) {\n removeAt(value, dataLocation.index)\n if (value.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n }\n })\n return removed ? data : undefined\n },\n\n updateRecord (data) {\n const removed = this.removeRecord(data)\n if (removed !== undefined) {\n this.insertRecord(data)\n }\n }\n})\n","import utils from './utils'\nimport Component from './Component'\nimport Query from './Query'\nimport Record from './Record'\nimport Index from '../lib/mindex/index'\n\nconst { noValidatePath } = Record\n\nconst DOMAIN = 'Collection'\n\nconst COLLECTION_DEFAULTS = {\n /**\n * Whether to call {@link Record#commit} on records that are added to the\n * collection and already exist in the collection.\n *\n * @name Collection#commitOnMerge\n * @type {boolean}\n * @default true\n */\n commitOnMerge: true,\n\n /**\n * Whether record events should bubble up and be emitted by the collection.\n *\n * @name Collection#emitRecordEvents\n * @type {boolean}\n * @default true\n */\n emitRecordEvents: true,\n\n /**\n * Field to be used as the unique identifier for records in this collection.\n * Defaults to `\"id\"` unless {@link Collection#mapper} is set, in which case\n * this will default to {@link Mapper#idAttribute}.\n *\n * @name Collection#idAttribute\n * @type {string}\n * @default \"id\"\n */\n idAttribute: 'id',\n\n /**\n * What to do when inserting a record into this Collection that shares a\n * primary key with a record already in this Collection.\n *\n * Possible values:\n * merge\n * replace\n * skip\n *\n * Merge:\n *\n * Recursively shallow copy properties from the new record onto the existing\n * record.\n *\n * Replace:\n *\n * Shallow copy top-level properties from the new record onto the existing\n * record. Any top-level own properties of the existing record that are _not_\n * on the new record will be removed.\n *\n * Skip:\n *\n * Ignore new record, keep existing record.\n *\n * @name Collection#onConflict\n * @type {string}\n * @default \"merge\"\n */\n onConflict: 'merge'\n}\n\n/**\n * An ordered set of {@link Record} instances.\n *\n * @example Collection#constructor\n * // import { Collection, Record } from 'js-data';\n * const JSData = require('js-data');\n * const {Collection, Record} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const user1 = new Record({ id: 1 });\n * const user2 = new Record({ id: 2 });\n * const UserCollection = new Collection([user1, user2]);\n * console.log(UserCollection.get(1) === user1);\n *\n * @class Collection\n * @extends Component\n * @param {array} [records] Initial set of records to insert into the\n * collection.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}.\n * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}.\n * @param {string} [opts.onConflict=\"merge\"] See {@link Collection#onConflict}.\n * @param {string} [opts.mapper] See {@link Collection#mapper}.\n * @since 3.0.0\n */\nfunction Collection (records, opts) {\n utils.classCallCheck(this, Collection)\n Component.call(this, opts)\n\n if (records && !utils.isArray(records)) {\n opts = records\n records = []\n }\n if (utils.isString(opts)) {\n opts = { idAttribute: opts }\n }\n\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * Default Mapper for this collection. Optional. If a Mapper is provided, then\n * the collection will use the {@link Mapper#idAttribute} setting, and will\n * wrap records in {@link Mapper#recordClass}.\n *\n * @example Collection#mapper\n * const JSData = require('js-data');\n * const {Collection, Mapper} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar'; }\n * }\n * const myMapper = new MyMapperClass({ name: 'myMapper' });\n * const collection = new Collection(null, { mapper: myMapper });\n *\n * @name Collection#mapper\n * @type {Mapper}\n * @default null\n * @since 3.0.0\n */\n mapper: {\n value: undefined,\n writable: true\n },\n // Query class used by this collection\n queryClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(COLLECTION_DEFAULTS))\n\n if (!this.queryClass) {\n this.queryClass = Query\n }\n\n const idAttribute = this.recordId()\n\n Object.defineProperties(this, {\n /**\n * The main index, which uses @{link Collection#recordId} as the key.\n *\n * @name Collection#index\n * @type {Index}\n */\n index: {\n value: new Index([idAttribute], {\n hashCode (obj) {\n return utils.get(obj, idAttribute)\n }\n })\n },\n\n /**\n * Object that holds the secondary indexes of this collection.\n *\n * @name Collection#indexes\n * @type {Object.}\n */\n indexes: {\n value: {}\n }\n })\n\n // Insert initial data into the collection\n if (utils.isObject(records) || (utils.isArray(records) && records.length)) {\n this.add(records)\n }\n}\n\nexport default Component.extend({\n constructor: Collection,\n\n /**\n * Used to bind to events emitted by records in this Collection.\n *\n * @method Collection#_onRecordEvent\n * @since 3.0.0\n * @private\n * @param {...*} [arg] Args passed to {@link Collection#emit}.\n */\n _onRecordEvent (...args) {\n if (this.emitRecordEvents) {\n this.emit(...args)\n }\n },\n\n /**\n * Insert the provided record or records.\n *\n * If a record is already in the collection then the provided record will\n * either merge with or replace the existing record based on the value of the\n * `onConflict` option.\n *\n * The collection's secondary indexes will be updated as each record is\n * visited.\n *\n * @method Collection#add\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} data The record or records to insert.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}.\n * @param {boolean} [opts.noValidate] See {@link Record#noValidate}.\n * @param {string} [opts.onConflict] See {@link Collection#onConflict}.\n * @returns {(Object|Object[]|Record|Record[])} The added record or records.\n */\n add (records, opts) {\n // Default values for arguments\n opts || (opts = {})\n\n // Fill in \"opts\" with the Collection's configuration\n utils._(opts, this)\n records = this.beforeAdd(records, opts) || records\n\n // Track whether just one record or an array of records is being inserted\n let singular = false\n const idAttribute = this.recordId()\n if (!utils.isArray(records)) {\n if (utils.isObject(records)) {\n records = [records]\n singular = true\n } else {\n throw utils.err(`${DOMAIN}#add`, 'records')(400, 'object or array', records)\n }\n }\n\n // Map the provided records to existing records.\n // New records will be inserted. If any records map to existing records,\n // they will be merged into the existing records according to the onConflict\n // option.\n records = records.map((record) => {\n let id = this.recordId(record)\n // Grab existing record if there is one\n const existing = id === undefined ? id : this.get(id)\n // If the currently visited record is just a reference to an existing\n // record, then there is nothing to be done. Exit early.\n if (record === existing) {\n return existing\n }\n\n if (existing) {\n // Here, the currently visited record corresponds to a record already\n // in the collection, so we need to merge them\n const onConflict = opts.onConflict || this.onConflict\n if (onConflict !== 'merge' && onConflict !== 'replace' && onConflict !== 'skip') {\n throw utils.err(`${DOMAIN}#add`, 'opts.onConflict')(400, 'one of (merge, replace, skip)', onConflict, true)\n }\n const existingNoValidate = existing._get(noValidatePath)\n if (opts.noValidate) {\n // Disable validation\n existing._set(noValidatePath, true)\n }\n if (onConflict === 'merge') {\n utils.deepMixIn(existing, record)\n } else if (onConflict === 'replace') {\n utils.forOwn(existing, (value, key) => {\n if (key !== idAttribute && record[key] === undefined) {\n existing[key] = undefined\n }\n })\n existing.set(record)\n } // else if(onConflict === 'skip'){ do nothing }\n\n if (opts.noValidate) {\n // Restore previous `noValidate` value\n existing._set(noValidatePath, existingNoValidate)\n }\n record = existing\n if (opts.commitOnMerge && utils.isFunction(record.commit)) {\n record.commit()\n }\n // Update all indexes in the collection\n this.updateIndexes(record)\n } else {\n // Here, the currently visted record does not correspond to any record\n // in the collection, so (optionally) instantiate this record and insert\n // it into the collection\n record = this.mapper ? this.mapper.createRecord(record, opts) : record\n this.index.insertRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.insertRecord(record)\n })\n if (record && utils.isFunction(record.on)) {\n record.on('all', this._onRecordEvent, this)\n }\n }\n return record\n })\n // Finally, return the inserted data\n const result = singular ? records[0] : records\n if (!opts.silent) {\n this.emit('add', result)\n }\n return this.afterAdd(records, opts, result) || result\n },\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then {@link Collection#add} will return that same value.\n *\n * @method Collection#method\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} result The record or records\n * that were added to this Collection by {@link Collection#add}.\n * @param {object} opts The `opts` argument passed to {@link Collection#add}.\n */\n afterAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}. If this method returns\n * a value then {@link Collection#remove} will return that same value.\n *\n * @method Collection#afterRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {object} opts The `opts` argument passed to {@link Collection#remove}.\n * @param {object} record The result that will be returned by {@link Collection#remove}.\n */\n afterRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}. If this method\n * returns a value then {@link Collection#removeAll} will return that same\n * value.\n *\n * @method Collection#afterRemoveAll\n * @since 3.0.0\n * @param {object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}.\n * @param {object} records The result that will be returned by {@link Collection#removeAll}.\n */\n afterRemoveAll () {},\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then the `records` argument in {@link Collection#add} will be\n * re-assigned to the returned value.\n *\n * @method Collection#beforeAdd\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}.\n * @param {object} opts The `opts` argument passed to {@link Collection#add}.\n */\n beforeAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}.\n *\n * @method Collection#beforeRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {object} opts The `opts` argument passed to {@link Collection#remove}.\n */\n beforeRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}.\n *\n * @method Collection#beforeRemoveAll\n * @since 3.0.0\n * @param {object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}.\n */\n beforeRemoveAll () {},\n\n /**\n * Find all records between two boundaries.\n *\n * Shortcut for `collection.query().between(18, 30, { index: 'age' }).run()`\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = collection.between(18, 30, { index: 'age' });\n *\n * @example\n * // Same as above\n * const users = collection.between([18], [30], { index: 'age' });\n *\n * @method Collection#between\n * @since 3.0.0\n * @param {array} leftKeys Keys defining the left boundary.\n * @param {array} rightKeys Keys defining the right boundary.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting records to skip.\n * @returns {Object[]|Record[]} The result.\n */\n between (leftKeys, rightKeys, opts) {\n return this.query().between(leftKeys, rightKeys, opts).run()\n },\n\n /**\n * Create a new secondary index on the contents of the collection.\n *\n * @example\n * // Index users by age\n * collection.createIndex('age');\n *\n * @example\n * // Index users by status and role\n * collection.createIndex('statusAndRole', ['status', 'role']);\n *\n * @method Collection#createIndex\n * @since 3.0.0\n * @param {string} name The name of the new secondary index.\n * @param {string[]} [fieldList] Array of field names to use as the key or\n * compound key of the new secondary index. If no fieldList is provided, then\n * the name will also be the field that is used to index the collection.\n */\n createIndex (name, fieldList, opts) {\n if (utils.isString(name) && fieldList === undefined) {\n fieldList = [name]\n }\n opts || (opts = {})\n opts.hashCode || (opts.hashCode = (obj) => this.recordId(obj))\n const index = this.indexes[name] = new Index(fieldList, opts)\n this.index.visitAll(index.insertRecord, index)\n },\n\n /**\n * Find the record or records that match the provided query or pass the\n * provided filter function.\n *\n * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()`\n *\n * @example Collection#filter\n * const JSData = require('js-data');\n * const { Collection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const collection = new Collection([\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * // Get the draft posts created less than three months ago\n * let posts = collection.filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * });\n * console.log(posts);\n *\n * // Use a custom filter function\n * posts = collection.filter((post) => post.id % 2 === 0);\n *\n * @method Collection#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {object} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Array} The result.\n * @see query\n * @since 3.0.0\n */\n filter (query, thisArg) {\n return this.query().filter(query, thisArg).run()\n },\n\n /**\n * Iterate over all records.\n *\n * @example\n * collection.forEach(function (record) {\n * // do something\n * });\n *\n * @method Collection#forEach\n * @since 3.0.0\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Array} The result.\n */\n forEach (cb, thisArg) {\n this.index.visitAll(cb, thisArg)\n },\n\n /**\n * Get the record with the given id.\n *\n * @method Collection#get\n * @since 3.0.0\n * @param {(string|number)} id The primary key of the record to get.\n * @returns {(Object|Record)} The record with the given id.\n */\n get (id) {\n const instances = id === undefined ? [] : this.query().get(id).run()\n return instances.length ? instances[0] : undefined\n },\n\n /**\n * Find the record or records that match the provided keyLists.\n *\n * Shortcut for `collection.query().getAll(keyList1, keyList2, ...).run()`\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = collection.getAll('draft', 'inReview', { index: 'status' });\n *\n * @example\n * // Same as above\n * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' });\n *\n * @method Collection#getAll\n * @since 3.0.0\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * records matching each keyList will be retrieved. If no keyLists are\n * provided, all records will be returned.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Array} The result.\n */\n getAll (...args) {\n return this.query().getAll(...args).run()\n },\n\n /**\n * Return the index with the given name. If no name is provided, return the\n * main index. Throws an error if the specified index does not exist.\n *\n * @method Collection#getIndex\n * @since 3.0.0\n * @param {string} [name] The name of the index to retrieve.\n */\n getIndex (name) {\n const index = name ? this.indexes[name] : this.index\n if (!index) {\n throw utils.err(`${DOMAIN}#getIndex`, name)(404, 'index')\n }\n return index\n },\n\n /**\n * Limit the result.\n *\n * Shortcut for `collection.query().limit(maximumNumber).run()`\n *\n * @example\n * const posts = collection.limit(10);\n *\n * @method Collection#limit\n * @since 3.0.0\n * @param {number} num The maximum number of records to keep in the result.\n * @returns {Array} The result.\n */\n limit (num) {\n return this.query().limit(num).run()\n },\n\n /**\n * Apply a mapping function to all records.\n *\n * @example\n * const names = collection.map((user) => user.name);\n *\n * @method Collection#map\n * @since 3.0.0\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Array} The result of the mapping.\n */\n map (cb, thisArg) {\n const data = []\n this.index.visitAll(function (value) {\n data.push(cb.call(thisArg, value))\n })\n return data\n },\n\n /**\n * Return the result of calling the specified function on each record in this\n * collection's main index.\n *\n * @method Collection#mapCall\n * @since 3.0.0\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Array} The result.\n */\n mapCall (funcName, ...args) {\n const data = []\n this.index.visitAll(function (record) {\n data.push(record[funcName](...args))\n })\n return data\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#prune\n * @param {object} [opts] Configuration options, passed to {@link Collection#removeAll}.\n * @since 3.0.0\n * @returns {Array} The removed records, if any.\n */\n prune (opts) {\n return this.removeAll(this.unsaved(), opts)\n },\n\n /**\n * Create a new query to be executed against the contents of the collection.\n * The result will be all or a subset of the contents of the collection.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * collection.query()\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run();\n *\n * @method Collection#query\n * @since 3.0.0\n * @returns {Query} New query object.\n */\n query () {\n const Ctor = this.queryClass\n return new Ctor(this)\n },\n\n /**\n * Return the primary key of the given, or if no record is provided, return the\n * name of the field that holds the primary key of records in this Collection.\n *\n * @method Collection#recordId\n * @since 3.0.0\n * @param {(Object|Record)} [record] The record whose primary key is to be\n * returned.\n * @returns {(string|number)} Primary key or name of field that holds primary\n * key.\n */\n recordId (record) {\n if (record) {\n return utils.get(record, this.recordId())\n }\n return this.mapper ? this.mapper.idAttribute : this.idAttribute\n },\n\n /**\n * Reduce the data in the collection to a single value and return the result.\n *\n * @example\n * const totalVotes = collection.reduce((prev, record) => {\n * return prev + record.upVotes + record.downVotes;\n * }, 0);\n *\n * @method Collection#reduce\n * @since 3.0.0\n * @param {Function} cb Reduction callback.\n * @param {*} initialValue Initial value of the reduction.\n * @returns {*} The result.\n */\n reduce (cb, initialValue) {\n const data = this.getAll()\n return data.reduce(cb, initialValue)\n },\n\n /**\n * Remove the record with the given id from this Collection.\n *\n * @method Collection#remove\n * @since 3.0.0\n * @param {(string|number|object|Record)} idOrRecord The primary key of the\n * record to be removed, or a reference to the record that is to be removed.\n * @param {object} [opts] Configuration options.\n * @returns {Object|Record} The removed record, if any.\n */\n remove (idOrRecord, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemove(idOrRecord, opts)\n let record = utils.isSorN(idOrRecord) ? this.get(idOrRecord) : idOrRecord\n\n // The record is in the collection, remove it\n if (utils.isObject(record)) {\n record = this.index.removeRecord(record)\n if (record) {\n utils.forOwn(this.indexes, function (index, name) {\n index.removeRecord(record)\n })\n if (utils.isFunction(record.off)) {\n record.off('all', this._onRecordEvent, this)\n if (!opts.silent) {\n this.emit('remove', record)\n }\n }\n }\n }\n return this.afterRemove(idOrRecord, opts, record) || record\n },\n\n /**\n * Remove from this collection the given records or the records selected by\n * the given \"query\".\n *\n * @method Collection#removeAll\n * @since 3.0.0\n * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}.\n * @param {object} [queryOrRecords.where] See {@link query.where}.\n * @param {number} [queryOrRecords.offset] See {@link query.offset}.\n * @param {number} [queryOrRecords.limit] See {@link query.limit}.\n * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options.\n * @returns {(Object[]|Record[])} The removed records, if any.\n */\n removeAll (queryOrRecords, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemoveAll(queryOrRecords, opts)\n let records = utils.isArray(queryOrRecords) ? queryOrRecords.slice() : this.filter(queryOrRecords)\n\n // Remove each selected record from the collection\n const optsCopy = utils.plainCopy(opts)\n optsCopy.silent = true\n records = records\n .map((record) => this.remove(record, optsCopy))\n .filter((record) => record)\n if (!opts.silent) {\n this.emit('remove', records)\n }\n return this.afterRemoveAll(queryOrRecords, opts, records) || records\n },\n\n /**\n * Skip a number of results.\n *\n * Shortcut for `collection.query().skip(numberToSkip).run()`\n *\n * @example\n * const posts = collection.skip(10);\n *\n * @method Collection#skip\n * @since 3.0.0\n * @param {number} num The number of records to skip.\n * @returns {Array} The result.\n */\n skip (num) {\n return this.query().skip(num).run()\n },\n\n /**\n * Return the plain JSON representation of all items in this collection.\n * Assumes records in this collection have a toJSON method.\n *\n * @method Collection#toJSON\n * @since 3.0.0\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation.\n * @returns {Array} The records.\n */\n toJSON (opts) {\n return this.mapCall('toJSON', opts)\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#unsaved\n * @since 3.0.0\n * @returns {Array} The unsaved records, if any.\n */\n unsaved (opts) {\n return this.index.get()\n },\n\n /**\n * Update a record's position in a single index of this collection. See\n * {@link Collection#updateIndexes} to update a record's position in all\n * indexes at once.\n *\n * @method Collection#updateIndex\n * @since 3.0.0\n * @param {object} record The record to update.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] The index in which to update the record's\n * position. If you don't specify an index then the record will be updated\n * in the main index.\n */\n updateIndex (record, opts) {\n opts || (opts = {})\n this.getIndex(opts.index).updateRecord(record)\n },\n\n /**\n * Updates all indexes in this collection for the provided record. Has no\n * effect if the record is not in the collection.\n *\n * @method Collection#updateIndexes\n * @since 3.0.0\n * @param {object} record TODO\n */\n updateIndexes (record) {\n this.index.updateRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.updateRecord(record)\n })\n }\n})\n\n/**\n * Fired when a record changes. Only works for records that have tracked changes.\n * See {@link Collection~changeListener} on how to listen for this event.\n *\n * @event Collection#change\n * @see Collection~changeListener\n */\n\n/**\n * Callback signature for the {@link Collection#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * collection.on('change', onChange);\n *\n * @callback Collection~changeListener\n * @param {Record} The Record that changed.\n * @param {object} The changes.\n * @see Collection#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the Collection. See\n * {@link Collection~addListener} on how to listen for this event.\n *\n * @event Collection#add\n * @see Collection~addListener\n * @see Collection#event:add\n * @see Collection#add\n */\n\n/**\n * Callback signature for the {@link Collection#event:add} event.\n *\n * @example\n * function onAdd (recordOrRecords) {\n * // do something\n * }\n * collection.on('add', onAdd);\n *\n * @callback Collection~addListener\n * @param {Record|Record[]} The Record or Records that were added.\n * @see Collection#event:add\n * @see Collection#add\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the Collection. See\n * {@link Collection~removeListener} for how to listen for this event.\n *\n * @event Collection#remove\n * @see Collection~removeListener\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n */\n\n/**\n * Callback signature for the {@link Collection#event:remove} event.\n *\n * @example\n * function onRemove (recordsOrRecords) {\n * // do something\n * }\n * collection.on('remove', onRemove);\n *\n * @callback Collection~removeListener\n * @param {Record|Record[]} Record or Records that were removed.\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Collection:\n * @example Collection.extend\n * const JSData = require('js-data');\n * const { Collection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomCollectionClass extends Collection {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customCollection = new CustomCollectionClass();\n * console.log(customCollection.foo());\n * console.log(CustomCollectionClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherCollectionClass = Collection.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherCollection = new OtherCollectionClass();\n * console.log(otherCollection.foo());\n * console.log(OtherCollectionClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherCollectionClass () {\n * Collection.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Collection.extend({\n * constructor: AnotherCollectionClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherCollection = new AnotherCollectionClass();\n * console.log(anotherCollection.created_at);\n * console.log(anotherCollection.foo());\n * console.log(AnotherCollectionClass.beep());\n *\n * @method Collection.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Collection class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Schema'\n\n/**\n * A function map for each of the seven primitive JSON types defined by the core specification.\n * Each function will check a given value and return true or false if the value is an instance of that type.\n * ```\n * types.integer(1) // returns true\n * types.string({}) // returns false\n * ```\n * http://json-schema.org/latest/json-schema-core.html#anchor8\n * @name Schema.types\n * @type {object}\n */\nconst types = {\n array: utils.isArray,\n boolean: utils.isBoolean,\n integer: utils.isInteger,\n 'null': utils.isNull,\n number: utils.isNumber,\n object: utils.isObject,\n string: utils.isString\n}\n\n/**\n * @ignore\n */\nconst segmentToString = function (segment, prev) {\n let str = ''\n if (segment) {\n if (utils.isNumber(segment)) {\n str += `[${segment}]`\n } else if (prev) {\n str += `.${segment}`\n } else {\n str += `${segment}`\n }\n }\n return str\n}\n\n/**\n * @ignore\n */\nconst makePath = function (opts) {\n opts || (opts = {})\n let path = ''\n const segments = opts.path || []\n segments.forEach(function (segment) {\n path += segmentToString(segment, path)\n })\n path += segmentToString(opts.prop, path)\n return path\n}\n\n/**\n * @ignore\n */\nconst makeError = function (actual, expected, opts) {\n return {\n expected,\n actual: '' + actual,\n path: makePath(opts)\n }\n}\n\n/**\n * @ignore\n */\nconst addError = function (actual, expected, opts, errors) {\n errors.push(makeError(actual, expected, opts))\n}\n\n/**\n * @ignore\n */\nconst maxLengthCommon = function (keyword, value, schema, opts) {\n const max = schema[keyword]\n if (value.length > max) {\n return makeError(value.length, `length no more than ${max}`, opts)\n }\n}\n\n/**\n * @ignore\n */\nconst minLengthCommon = function (keyword, value, schema, opts) {\n const min = schema[keyword]\n if (value.length < min) {\n return makeError(value.length, `length no less than ${min}`, opts)\n }\n}\n\n/**\n * A map of all object member validation functions for each keyword defined in the JSON Schema.\n * @name Schema.validationKeywords\n * @type {object}\n */\nconst validationKeywords = {\n /**\n * Validates the provided value against all schemas defined in the Schemas `allOf` keyword.\n * The instance is valid against if and only if it is valid against all the schemas declared in the Schema's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be a valid JSON Schema.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor82\n *\n * @name Schema.validationKeywords.allOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `allOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n allOf (value, schema, opts) {\n let allErrors = []\n schema.allOf.forEach(function (_schema) {\n allErrors = allErrors.concat(validate(value, _schema, opts) || [])\n })\n return allErrors.length ? allErrors : undefined\n },\n\n /**\n * Validates the provided value against all schemas defined in the Schemas `anyOf` keyword.\n * The instance is valid against this keyword if and only if it is valid against\n * at least one of the schemas in this keyword's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be an object, and each object MUST be a valid JSON Schema.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor85\n *\n * @name Schema.validationKeywords.anyOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `anyOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n anyOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.anyOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * http://json-schema.org/latest/json-schema-validation.html#anchor70\n *\n * @name Schema.validationKeywords.dependencies\n * @method\n * @param {*} value TODO\n * @param {object} schema TODO\n * @param {object} opts TODO\n */\n dependencies (value, schema, opts) {\n // TODO\n },\n\n /**\n * Validates the provided value against an array of possible values defined by the Schema's `enum` keyword\n * Validation succeeds if the value is deeply equal to one of the values in the array.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor76\n *\n * @name Schema.validationKeywords.enum\n * @method\n * @param {*} value Value to validate\n * @param {object} schema Schema containing the `enum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n enum (value, schema, opts) {\n const possibleValues = schema['enum']\n if (utils.findIndex(possibleValues, (item) => utils.deepEqual(item, value)) === -1) {\n return makeError(value, `one of (${possibleValues.join(', ')})`, opts)\n }\n },\n\n /**\n * Validates each of the provided array values against a schema or an array of schemas defined by the Schema's `items` keyword\n * see http://json-schema.org/latest/json-schema-validation.html#anchor37 for validation rules.\n *\n * @name Schema.validationKeywords.items\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the items keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n items (value, schema, opts) {\n opts || (opts = {})\n // TODO: additionalItems\n let items = schema.items\n let errors = []\n const checkingTuple = utils.isArray(items)\n const length = value.length\n for (var prop = 0; prop < length; prop++) {\n if (checkingTuple) {\n // Validating a tuple, instead of just checking each item against the\n // same schema\n items = schema.items[prop]\n }\n opts.prop = prop\n errors = errors.concat(validate(value[prop], items, opts) || [])\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided number against a maximum value defined by the Schema's `maximum` keyword\n * Validation succeeds if the value is a number, and is less than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor17\n *\n * @name Schema.validationKeywords.maximum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `maximum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maximum (value, schema, opts) {\n // Must be a number\n const maximum = schema.maximum\n // Must be a boolean\n // Depends on maximum\n // default: false\n const exclusiveMaximum = schema.exclusiveMaximum\n if (typeof value === typeof maximum && !(exclusiveMaximum ? maximum > value : maximum >= value)) {\n return exclusiveMaximum\n ? makeError(value, `no more than nor equal to ${maximum}`, opts)\n : makeError(value, `no more than ${maximum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a maximum value defined by the Schema's `maxItems` keyword.\n * Validation succeeds if the length of the array is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor42\n *\n * @name Schema.validationKeywords.maxItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `maxItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return maxLengthCommon('maxItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a maximum value defined in the Schema's `maxLength` keyword.\n * Validation succeeds if the length of the string is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor26\n *\n * @name Schema.validationKeywords.maxLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `maxLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxLength (value, schema, opts) {\n return maxLengthCommon('maxLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a maximum value defined in the Schema's `maxProperties` keyword.\n * Validation succeeds if the object's property count is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor54\n *\n * @name Schema.validationKeywords.maxProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `maxProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const maxProperties = schema.maxProperties\n const length = Object.keys(value).length\n if (length > maxProperties) {\n return makeError(length, `no more than ${maxProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided value against a minimum value defined by the Schema's `minimum` keyword\n * Validation succeeds if the value is a number and is greater than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor21\n *\n * @name Schema.validationKeywords.minimum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `minimum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minimum (value, schema, opts) {\n // Must be a number\n const minimum = schema.minimum\n // Must be a boolean\n // Depends on minimum\n // default: false\n const exclusiveMinimum = schema.exclusiveMinimum\n if (typeof value === typeof minimum && !(exclusiveMinimum ? value > minimum : value >= minimum)) {\n return exclusiveMinimum\n ? makeError(value, `no less than nor equal to ${minimum}`, opts)\n : makeError(value, `no less than ${minimum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a minimum value defined by the Schema's `minItems` keyword.\n * Validation succeeds if the length of the array is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor45\n *\n * @name Schema.validationKeywords.minItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `minItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return minLengthCommon('minItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a minimum value defined in the Schema's `minLength` keyword.\n * Validation succeeds if the length of the string is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor29\n *\n * @name Schema.validationKeywords.minLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `minLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minLength (value, schema, opts) {\n return minLengthCommon('minLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a minimum value defined in the Schema's `minProperties` keyword.\n * Validation succeeds if the object's property count is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor57\n *\n * @name Schema.validationKeywords.minProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `minProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const minProperties = schema.minProperties\n const length = Object.keys(value).length\n if (length < minProperties) {\n return makeError(length, `no more than ${minProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided number is a multiple of the number defined in the Schema's `multipleOf` keyword.\n * Validation succeeds if the number can be divided equally into the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor14\n *\n * @name Schema.validationKeywords.multipleOf\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing the `multipleOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n multipleOf (value, schema, opts) {\n const multipleOf = schema.multipleOf\n if (utils.isNumber(value)) {\n if ((value / multipleOf) % 1 !== 0) {\n return makeError(value, `multipleOf ${multipleOf}`, opts)\n }\n }\n },\n\n /**\n * Validates the provided value is not valid with any of the schemas defined in the Schema's `not` keyword.\n * An instance is valid against this keyword if and only if it is NOT valid against the schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor91\n * @name Schema.validationKeywords.not\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the not keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n not (value, schema, opts) {\n if (!validate(value, schema.not, opts)) {\n // TODO: better messaging\n return makeError('succeeded', 'should have failed', opts)\n }\n },\n\n /**\n * Validates the provided value is valid with one and only one of the schemas defined in the Schema's `oneOf` keyword.\n * An instance is valid against this keyword if and only if it is valid against a single schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor88\n * @name Schema.validationKeywords.oneOf\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the `oneOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n oneOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.oneOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else if (validated) {\n allErrors = [makeError('valid against more than one', 'valid against only one', opts)]\n validated = false\n return false\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * Validates the provided string matches a pattern defined in the Schema's `pattern` keyword.\n * Validation succeeds if the string is a match of the regex value of this keyword.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor33\n * @name Schema.validationKeywords.pattern\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `pattern` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n pattern (value, schema, opts) {\n const pattern = schema.pattern\n if (utils.isString(value) && !value.match(pattern)) {\n return makeError(value, pattern, opts)\n }\n },\n\n /**\n * Validates the provided object's properties against a map of values defined in the Schema's `properties` keyword.\n * Validation succeeds if the object's property are valid with each of the schema's in the provided map.\n * Validation also depends on the additionalProperties and or patternProperties.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor64 for more info.\n *\n * @name Schema.validationKeywords.properties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `properties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n properties (value, schema, opts) {\n opts || (opts = {})\n\n if (utils.isArray(value)) {\n return\n }\n\n // Can be a boolean or an object\n // Technically the default is an \"empty schema\", but here \"true\" is\n // functionally the same\n const additionalProperties = schema.additionalProperties === undefined ? true : schema.additionalProperties\n const validated = []\n // \"p\": The property set from \"properties\".\n // Default is an object\n const properties = schema.properties || {}\n // \"pp\": The property set from \"patternProperties\".\n // Default is an object\n const patternProperties = schema.patternProperties || {}\n let errors = []\n\n utils.forOwn(properties, function (_schema, prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n })\n\n const toValidate = utils.omit(value, validated)\n utils.forOwn(patternProperties, function (_schema, pattern) {\n utils.forOwn(toValidate, function (undef, prop) {\n if (prop.match(pattern)) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n }\n })\n })\n const keys = Object.keys(utils.omit(value, validated))\n // If \"s\" is not empty, validation fails\n if (additionalProperties === false) {\n if (keys.length) {\n const origProp = opts.prop\n opts.prop = ''\n addError(`extra fields: ${keys.join(', ')}`, 'no extra fields', opts, errors)\n opts.prop = origProp\n }\n } else if (utils.isObject(additionalProperties)) {\n // Otherwise, validate according to provided schema\n keys.forEach(function (prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], additionalProperties, opts) || [])\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided object's has all properties listed in the Schema's `properties` keyword array.\n * Validation succeeds if the object contains all properties provided in the array value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor61\n *\n * @name Schema.validationKeywords.required\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `required` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n required (value, schema, opts) {\n opts || (opts = {})\n const required = schema.required\n let errors = []\n if (!opts.existingOnly) {\n required.forEach(function (prop) {\n if (utils.get(value, prop) === undefined) {\n const prevProp = opts.prop\n opts.prop = prop\n addError(undefined, 'a value', opts, errors)\n opts.prop = prevProp\n }\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided value's type is equal to the type, or array of types, defined in the Schema's `type` keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor79\n *\n * @name Schema.validationKeywords.type\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `type` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n type (value, schema, opts) {\n let type = schema.type\n let validType\n // Can be one of several types\n if (utils.isString(type)) {\n type = [type]\n }\n // Try to match the value against an expected type\n type.forEach(function (_type) {\n // TODO: throw an error if type is not defined\n if (types[_type](value, schema, opts)) {\n // Matched a type\n validType = _type\n return false\n }\n })\n // Value did not match any expected type\n if (!validType) {\n return makeError(value !== undefined && value !== null ? typeof value : '' + value, `one of (${type.join(', ')})`, opts)\n }\n // Run keyword validators for matched type\n // http://json-schema.org/latest/json-schema-validation.html#anchor12\n const validator = typeGroupValidators[validType]\n if (validator) {\n return validator(value, schema, opts)\n }\n },\n\n /**\n * Validates the provided array values are unique.\n * Validation succeeds if the items in the array are unique, but only if the value of this keyword is true\n * see http://json-schema.org/latest/json-schema-validation.html#anchor49\n *\n * @name Schema.validationKeywords.uniqueItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `uniqueItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n uniqueItems (value, schema, opts) {\n if (value && value.length && schema.uniqueItems) {\n const length = value.length\n let item, i, j\n // Check n - 1 items\n for (i = length - 1; i > 0; i--) {\n item = value[i]\n // Only compare against unchecked items\n for (j = i - 1; j >= 0; j--) {\n // Found a duplicate\n if (utils.deepEqual(item, value[j])) {\n return makeError(item, 'no duplicates', opts)\n }\n }\n }\n }\n }\n}\n\n/**\n * @ignore\n */\nconst runOps = function (ops, value, schema, opts) {\n let errors = []\n ops.forEach(function (op) {\n if (schema[op] !== undefined) {\n errors = errors.concat(validationKeywords[op](value, schema, opts) || [])\n }\n })\n return errors.length ? errors : undefined\n}\n\n/**\n * Validation keywords validated for any type:\n *\n * - `enum`\n * - `type`\n * - `allOf`\n * - `anyOf`\n * - `oneOf`\n * - `not`\n *\n * @name Schema.ANY_OPS\n * @type {string[]}\n */\nconst ANY_OPS = ['enum', 'type', 'allOf', 'anyOf', 'oneOf', 'not']\n\n/**\n * Validation keywords validated for array types:\n *\n * - `items`\n * - `maxItems`\n * - `minItems`\n * - `uniqueItems`\n *\n * @name Schema.ARRAY_OPS\n * @type {string[]}\n */\nconst ARRAY_OPS = ['items', 'maxItems', 'minItems', 'uniqueItems']\n\n/**\n * Validation keywords validated for numeric (number and integer) types:\n *\n * - `multipleOf`\n * - `maximum`\n * - `minimum`\n *\n * @name Schema.NUMERIC_OPS\n * @type {string[]}\n */\nconst NUMERIC_OPS = ['multipleOf', 'maximum', 'minimum']\n\n/**\n * Validation keywords validated for object types:\n *\n * - `maxProperties`\n * - `minProperties`\n * - `required`\n * - `properties`\n * - `dependencies`\n *\n * @name Schema.OBJECT_OPS\n * @type {string[]}\n */\nconst OBJECT_OPS = ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n\n/**\n * Validation keywords validated for string types:\n *\n * - `maxLength`\n * - `minLength`\n * - `pattern`\n *\n * @name Schema.STRING_OPS\n * @type {string[]}\n */\nconst STRING_OPS = ['maxLength', 'minLength', 'pattern']\n\n/**\n * http://json-schema.org/latest/json-schema-validation.html#anchor75\n * @ignore\n */\nconst validateAny = function (value, schema, opts) {\n return runOps(ANY_OPS, value, schema, opts)\n}\n\n/**\n * Validates the provided value against a given Schema according to the http://json-schema.org/ v4 specification.\n *\n * @name Schema.validate\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Valid Schema according to the http://json-schema.org/ v4 specification.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\nconst validate = function (value, schema, opts) {\n let errors = []\n opts || (opts = {})\n opts.ctx || (opts.ctx = { value, schema })\n let shouldPop\n let prevProp = opts.prop\n if (schema === undefined) {\n return\n }\n if (!utils.isObject(schema)) {\n throw utils.err(`${DOMAIN}#validate`)(500, `Invalid schema at path: \"${opts.path}\"`)\n }\n if (opts.path === undefined) {\n opts.path = []\n }\n // Track our location as we recurse\n if (opts.prop !== undefined) {\n shouldPop = true\n opts.path.push(opts.prop)\n opts.prop = undefined\n }\n // Validate against parent schema\n if (schema['extends']) {\n // opts.path = path\n // opts.prop = prop\n if (utils.isFunction(schema['extends'].validate)) {\n errors = errors.concat(schema['extends'].validate(value, opts) || [])\n } else {\n errors = errors.concat(validate(value, schema['extends'], opts) || [])\n }\n }\n if (value === undefined) {\n // Check if property is required\n if (schema.required === true && !opts.existingOnly) {\n addError(value, 'a value', opts, errors)\n }\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n }\n\n errors = errors.concat(validateAny(value, schema, opts) || [])\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n}\n\n// These strings are cached for optimal performance of the change detection\n// boolean - Whether a Record is changing in the current execution frame\nconst changingPath = 'changing'\n// string[] - Properties that have changed in the current execution frame\nconst changedPath = 'changed'\n// Object[] - History of change records\nconst changeHistoryPath = 'history'\n// boolean - Whether a Record is currently being instantiated\nconst creatingPath = 'creating'\n// number - The setTimeout change event id of a Record, if any\nconst eventIdPath = 'eventId'\n// boolean - Whether to skip validation for a Record's currently changing property\nconst noValidatePath = 'noValidate'\n// boolean - Whether to preserve Change History for a Record\nconst keepChangeHistoryPath = 'keepChangeHistory'\n// boolean - Whether to skip change notification for a Record's currently\n// changing property\nconst silentPath = 'silent'\nconst validationFailureMsg = 'validation failed'\n\n/**\n * A map of validation functions grouped by type.\n *\n * @name Schema.typeGroupValidators\n * @type {object}\n */\nconst typeGroupValidators = {\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an array.\n * The validation keywords for the type `array` are:\n *```\n * ['items', 'maxItems', 'minItems', 'uniqueItems']\n *```\n * see http://json-schema.org/latest/json-schema-validation.html#anchor25\n *\n * @name Schema.typeGroupValidators.array\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing at least one array keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n array: function (value, schema, opts) {\n return runOps(ARRAY_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an integer.\n * The validation keywords for the type `integer` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.integer\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `integer` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n integer: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an number.\n * The validation keywords for the type `number` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.number\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `number` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n number: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of a number or integer.\n * The validation keywords for the type `numeric` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor13.\n *\n * @name Schema.typeGroupValidators.numeric\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `numeric` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n numeric: function (value, schema, opts) {\n return runOps(NUMERIC_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an object.\n * The validation keywords for the type `object` are:\n *```\n * ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor53.\n *\n * @name Schema.typeGroupValidators.object\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing at least one `object` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n object: function (value, schema, opts) {\n return runOps(OBJECT_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an string.\n * The validation keywords for the type `string` are:\n *```\n * ['maxLength', 'minLength', 'pattern']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor25.\n *\n * @name Schema.typeGroupValidators.string\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing at least one `string` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n string: function (value, schema, opts) {\n return runOps(STRING_OPS, value, schema, opts)\n }\n}\n\n/**\n * js-data's Schema class.\n *\n * @example Schema#constructor\n * const JSData = require('js-data');\n * const { Schema } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const PostSchema = new Schema({\n * type: 'object',\n * properties: {\n * title: { type: 'string' }\n * }\n * });\n * PostSchema.validate({ title: 1234 });\n *\n * @class Schema\n * @extends Component\n * @param {object} definition Schema definition according to json-schema.org\n */\nfunction Schema (definition) {\n definition || (definition = {})\n // TODO: schema validation\n utils.fillIn(this, definition)\n\n if (this.type === 'object') {\n this.properties = this.properties || {}\n utils.forOwn(this.properties, (_definition, prop) => {\n if (!(_definition instanceof Schema)) {\n this.properties[prop] = new Schema(_definition)\n }\n })\n } else if (this.type === 'array' && this.items && !(this.items instanceof Schema)) {\n this.items = new Schema(this.items)\n }\n if (this.extends && !(this.extends instanceof Schema)) {\n this.extends = new Schema(this.extends)\n }\n ['allOf', 'anyOf', 'oneOf'].forEach((validationKeyword) => {\n if (this[validationKeyword]) {\n this[validationKeyword].forEach((_definition, i) => {\n if (!(_definition instanceof Schema)) {\n this[validationKeyword][i] = new Schema(_definition)\n }\n })\n }\n })\n}\n\nexport default Component.extend({\n constructor: Schema,\n\n /**\n * This adds ES5 getters/setters to the target based on the \"properties\" in\n * this Schema, which makes possible change tracking and validation on\n * property assignment.\n *\n * @name Schema#apply\n * @method\n * @param {object} target The prototype to which to apply this schema.\n */\n apply (target, opts) {\n opts || (opts = {})\n opts.getter || (opts.getter = '_get')\n opts.setter || (opts.setter = '_set')\n opts.unsetter || (opts.unsetter = '_unset')\n opts.track || (opts.track = this.track)\n const properties = this.properties || {}\n utils.forOwn(properties, (schema, prop) => {\n Object.defineProperty(\n target,\n prop,\n this.makeDescriptor(prop, schema, opts)\n )\n })\n },\n\n /**\n * Apply default values to the target object for missing values.\n *\n * @name Schema#applyDefaults\n * @method\n * @param {object} target The target to which to apply values for missing values.\n */\n applyDefaults (target) {\n if (!target) {\n return\n }\n const properties = this.properties || {}\n const hasSet = utils.isFunction(target.set) || utils.isFunction(target._set)\n utils.forOwn(properties, function (schema, prop) {\n if (schema.hasOwnProperty('default') && utils.get(target, prop) === undefined) {\n if (hasSet) {\n target.set(prop, utils.plainCopy(schema['default']), { silent: true })\n } else {\n utils.set(target, prop, utils.plainCopy(schema['default']))\n }\n }\n if (schema.type === 'object' && schema.properties) {\n if (hasSet) {\n const orig = target._get('noValidate')\n target._set('noValidate', true)\n utils.set(target, prop, utils.get(target, prop) || {}, { silent: true })\n target._set('noValidate', orig)\n } else {\n utils.set(target, prop, utils.get(target, prop) || {})\n }\n schema.applyDefaults(utils.get(target, prop))\n }\n })\n },\n\n /**\n * Assemble a property descriptor for tracking and validating changes to\n * a property according to the given schema. This method is called when\n * {@link Mapper#applySchema} is set to `true`.\n *\n * @name Schema#makeDescriptor\n * @method\n * @param {string} prop The property name.\n * @param {(Schema|object)} schema The schema for the property.\n * @param {object} [opts] Optional configuration.\n * @param {function} [opts.getter] Custom getter function.\n * @param {function} [opts.setter] Custom setter function.\n * @param {function} [opts.track] Whether to track changes.\n * @returns {object} A property descriptor for the given schema.\n */\n makeDescriptor (prop, schema, opts) {\n const descriptor = {\n // Better to allow configurability, but at the user's own risk\n configurable: true,\n // These properties are enumerable by default, but regardless of their\n // enumerability, they won't be \"own\" properties of individual records\n enumerable: schema.enumerable === undefined ? true : !!schema.enumerable\n }\n // Cache a few strings for optimal performance\n const keyPath = `props.${prop}`\n const previousPath = `previous.${prop}`\n const getter = opts.getter\n const setter = opts.setter\n const unsetter = opts.unsetter\n const track = utils.isBoolean(opts.track) ? opts.track : schema.track\n\n descriptor.get = function () {\n return this._get(keyPath)\n }\n\n if (utils.isFunction(schema.get)) {\n const originalGet = descriptor.get\n descriptor.get = function () {\n return schema.get.call(this, originalGet)\n }\n }\n\n descriptor.set = function (value) {\n // These are accessed a lot\n const _get = this[getter]\n const _set = this[setter]\n const _unset = this[unsetter]\n // Optionally check that the new value passes validation\n if (!_get(noValidatePath)) {\n const errors = schema.validate(value, { path: [prop] })\n if (errors) {\n // Immediately throw an error, preventing the record from getting into\n // an invalid state\n const error = new Error(validationFailureMsg)\n error.errors = errors\n throw error\n }\n }\n // TODO: Make it so tracking can be turned on for all properties instead of\n // only per-property\n if (track && !_get(creatingPath)) {\n // previous is versioned on database commit\n // props are versioned on set()\n const previous = _get(previousPath)\n const current = _get(keyPath)\n let changing = _get(changingPath)\n let changed = _get(changedPath)\n\n if (!changing) {\n // Track properties that are changing in the current event loop\n changed = []\n }\n\n // Add changing properties to this array once at most\n const index = changed.indexOf(prop)\n if (current !== value && index === -1) {\n changed.push(prop)\n }\n if (previous === value) {\n if (index >= 0) {\n changed.splice(index, 1)\n }\n }\n // No changes in current event loop\n if (!changed.length) {\n changing = false\n _unset(changingPath)\n _unset(changedPath)\n // Cancel pending change event\n if (_get(eventIdPath)) {\n clearTimeout(_get(eventIdPath))\n _unset(eventIdPath)\n }\n }\n // Changes detected in current event loop\n if (!changing && changed.length) {\n _set(changedPath, changed)\n _set(changingPath, true)\n // Saving the timeout id allows us to batch all changes in the same\n // event loop into a single \"change\"\n // TODO: Optimize\n _set(eventIdPath, setTimeout(() => {\n // Previous event loop where changes were gathered has ended, so\n // notify any listeners of those changes and prepare for any new\n // changes\n _unset(changedPath)\n _unset(eventIdPath)\n _unset(changingPath)\n // TODO: Optimize\n if (!_get(silentPath)) {\n let i\n for (i = 0; i < changed.length; i++) {\n this.emit('change:' + changed[i], this, utils.get(this, changed[i]))\n }\n\n const changes = utils.diffObjects({ [prop]: value }, { [prop]: current })\n\n if (_get(keepChangeHistoryPath)) {\n const changeRecord = utils.plainCopy(changes)\n changeRecord.timestamp = new Date().getTime()\n let changeHistory = _get(changeHistoryPath)\n !changeHistory && _set(changeHistoryPath, (changeHistory = []))\n changeHistory.push(changeRecord)\n }\n this.emit('change', this, changes)\n }\n _unset(silentPath)\n }, 0))\n }\n }\n _set(keyPath, value)\n return value\n }\n\n if (utils.isFunction(schema.set)) {\n const originalSet = descriptor.set\n descriptor.set = function (value) {\n return schema.set.call(this, value, originalSet)\n }\n }\n\n return descriptor\n },\n\n /**\n * Create a copy of the given value that contains only the properties defined\n * in this schema.\n *\n * @name Schema#pick\n * @method\n * @param {*} value The value to copy.\n * @returns {*} The copy.\n */\n pick (value) {\n if (value === undefined) {\n return\n }\n if (this.type === 'object') {\n let copy = {}\n const properties = this.properties\n if (properties) {\n utils.forOwn(properties, (_definition, prop) => {\n copy[prop] = _definition.pick(value[prop])\n })\n }\n if (this.extends) {\n utils.fillIn(copy, this.extends.pick(value))\n }\n // Conditionally copy properties not defined in \"properties\"\n if (this.additionalProperties) {\n for (var key in value) {\n if (!properties[key]) {\n copy[key] = utils.plainCopy(value[key])\n }\n }\n }\n return copy\n } else if (this.type === 'array') {\n return value.map((item) => {\n const _copy = this.items ? this.items.pick(item) : {}\n if (this.extends) {\n utils.fillIn(_copy, this.extends.pick(item))\n }\n return _copy\n })\n }\n return utils.plainCopy(value)\n },\n\n /**\n * Validate the provided value against this schema.\n *\n * @name Schema#validate\n * @method\n * @param {*} value Value to validate.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n validate (value, opts) {\n return validate(value, this, opts)\n }\n}, {\n ANY_OPS,\n ARRAY_OPS,\n NUMERIC_OPS,\n OBJECT_OPS,\n STRING_OPS,\n typeGroupValidators,\n types,\n validate,\n validationKeywords\n})\n\n/**\n * Create a subclass of this Schema:\n * @example Schema.extend\n * const JSData = require('js-data');\n * const { Schema } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSchemaClass extends Schema {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSchema = new CustomSchemaClass();\n * console.log(customSchema.foo());\n * console.log(CustomSchemaClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSchemaClass = Schema.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherSchema = new OtherSchemaClass();\n * console.log(otherSchema.foo());\n * console.log(OtherSchemaClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSchemaClass () {\n * Schema.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Schema.extend({\n * constructor: AnotherSchemaClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherSchema = new AnotherSchemaClass();\n * console.log(anotherSchema.created_at);\n * console.log(anotherSchema.foo());\n * console.log(AnotherSchemaClass.beep());\n *\n * @method Schema.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Schema class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Record from './Record'\nimport Schema from './Schema'\nimport { Relation } from './relations'\nimport {\n belongsTo,\n belongsToType,\n hasMany,\n hasManyType,\n hasOne,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Mapper'\nconst applyDefaultsHooks = [\n 'beforeCreate',\n 'beforeCreateMany'\n]\nconst validatingHooks = [\n 'beforeCreate',\n 'beforeCreateMany',\n 'beforeUpdate',\n 'beforeUpdateAll',\n 'beforeUpdateMany'\n]\nconst makeNotify = function (num) {\n return function (...args) {\n const opts = args[args.length - num]\n const op = opts.op\n this.dbg(op, ...args)\n\n if (applyDefaultsHooks.indexOf(op) !== -1 && opts.applyDefaults !== false) {\n const schema = this.getSchema()\n if (schema && schema.applyDefaults) {\n let toProcess = args[0]\n if (!utils.isArray(toProcess)) {\n toProcess = [toProcess]\n }\n toProcess.forEach((record) => {\n schema.applyDefaults(record)\n })\n }\n }\n\n // Automatic validation\n if (validatingHooks.indexOf(op) !== -1 && !opts.noValidate) {\n // Save current value of option\n const originalExistingOnly = opts.existingOnly\n\n // For updates, ignore required fields if they aren't present\n if (op.indexOf('beforeUpdate') === 0 && opts.existingOnly === undefined) {\n opts.existingOnly = true\n }\n const errors = this.validate(args[op === 'beforeUpdate' ? 1 : 0], utils.pick(opts, ['existingOnly']))\n\n // Restore option\n opts.existingOnly = originalExistingOnly\n\n // Abort lifecycle due to validation errors\n if (errors) {\n const err = new Error('validation failed')\n err.errors = errors\n return utils.reject(err)\n }\n }\n\n // Emit lifecycle event\n if (opts.notify || (opts.notify === undefined && this.notify)) {\n setTimeout(() => {\n this.emit(op, ...args)\n })\n }\n }\n}\n\n// These are the default implementations of all of the lifecycle hooks\nconst notify = makeNotify(1)\nconst notify2 = makeNotify(2)\n\n// This object provides meta information used by Mapper#crud to actually\n// execute each lifecycle method\nconst LIFECYCLE_METHODS = {\n count: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroy: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroyAll: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n find: {\n defaults: [undefined, {}],\n types: []\n },\n findAll: {\n defaults: [{}, {}],\n types: []\n },\n sum: {\n defaults: [undefined, {}, {}],\n skip: true,\n types: []\n },\n update: {\n adapterArgs (mapper, id, props, opts) {\n return [id, mapper.toJSON(props, opts), opts]\n },\n beforeAssign: 1,\n defaults: [undefined, {}, {}],\n types: []\n },\n updateAll: {\n adapterArgs (mapper, props, query, opts) {\n return [mapper.toJSON(props, opts), query, opts]\n },\n beforeAssign: 0,\n defaults: [{}, {}, {}],\n types: []\n },\n updateMany: {\n adapterArgs (mapper, records, opts) {\n return [records.map((record) => mapper.toJSON(record, opts)), opts]\n },\n beforeAssign: 0,\n defaults: [[], {}],\n types: []\n }\n}\n\nconst MAPPER_DEFAULTS = {\n /**\n * Hash of registered adapters. Don't modify directly. Use\n * {@link Mapper#registerAdapter} instead.\n *\n * @default {}\n * @name Mapper#_adapters\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n _adapters: {},\n\n /**\n * Whether {@link Mapper#beforeCreate} and {@link Mapper#beforeCreateMany}\n * should automatically receive default values according to the Mapper's schema.\n *\n * @default true\n * @name Mapper#applyDefaults\n * @since 3.0.0\n * @type {boolean}\n */\n applyDefaults: true,\n\n /**\n * Whether to augment {@link Mapper#recordClass} with ES5 getters and setters\n * according to the properties defined in {@link Mapper#schema}. This makes\n * possible validation and change tracking on individual properties\n * when using the dot (e.g. `user.name = \"Bob\"`) operator to modify a\n * property, and is `true` by default.\n *\n * @default true\n * @name Mapper#applySchema\n * @since 3.0.0\n * @type {boolean}\n */\n applySchema: true,\n\n /**\n * The name of the registered adapter that this Mapper should used by default.\n *\n * @default \"http\"\n * @name Mapper#defaultAdapter\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n * @type {string}\n */\n defaultAdapter: 'http',\n\n /**\n * The field used as the unique identifier on records handled by this Mapper.\n *\n * @default id\n * @name Mapper#idAttribute\n * @since 3.0.0\n * @type {string}\n */\n idAttribute: 'id',\n\n /**\n * Whether records created from this mapper keep changeHistory on property changes.\n *\n * @default true\n * @name Mapper#keepChangeHistory\n * @since 3.0.0\n * @type {boolean}\n */\n keepChangeHistory: true,\n\n /**\n * Whether this Mapper should emit operational events.\n *\n * @default true\n * @name Mapper#notify\n * @since 3.0.0\n * @type {boolean}\n */\n notify: true,\n\n /**\n * Whether to skip validation when the Record instances are created.\n *\n * @default false\n * @name Mapper#noValidate\n * @since 3.0.0\n * @type {boolean}\n */\n noValidate: false,\n\n /**\n * Whether {@link Mapper#create}, {@link Mapper#createMany},\n * {@link Mapper#update}, {@link Mapper#updateAll}, {@link Mapper#updateMany},\n * {@link Mapper#find}, {@link Mapper#findAll}, {@link Mapper#destroy},\n * {@link Mapper#destroyAll}, {@link Mapper#count}, and {@link Mapper#sum}\n * should return a raw result object that contains both the instance data\n * returned by the adapter _and_ metadata about the operation.\n *\n * The default is to NOT return the result object, and instead return just the\n * instance data.\n *\n * @default false\n * @name Mapper#raw\n * @since 3.0.0\n * @type {boolean}\n */\n raw: false,\n\n /**\n * Whether records created from this mapper automatically validate their properties\n * when their properties are modified.\n *\n * @default true\n * @name Mapper#validateOnSet\n * @since 3.0.0\n * @type {boolean}\n */\n validateOnSet: true\n}\n\n/**\n * The core of JSData's [ORM/ODM][orm] implementation. Given a minimum amout of\n * meta information about a resource, a Mapper can perform generic CRUD\n * operations against that resource. Apart from its configuration, a Mapper is\n * stateless. The particulars of various persistence layers have been abstracted\n * into adapters, which a Mapper uses to perform its operations.\n *\n * The term \"Mapper\" comes from the [Data Mapper Pattern][pattern] described in\n * Martin Fowler's [Patterns of Enterprise Application Architecture][book]. A\n * Data Mapper moves data between [in-memory object instances][record] and a\n * relational or document-based database. JSData's Mapper can work with any\n * persistence layer you can write an adapter for.\n *\n * _(\"Model\" is a heavily overloaded term and is avoided in this documentation\n * to prevent confusion.)_\n *\n * [orm]: https://en.wikipedia.org/wiki/Object-relational_mapping\n *\n * @example\n * [pattern]: https://en.wikipedia.org/wiki/Data_mapper_pattern\n * [book]: http://martinfowler.com/books/eaa.html\n * [record]: Record.html\n * // Import and instantiate\n * import { Mapper } from 'js-data';\n * const UserMapper = new Mapper({ name: 'user' });\n *\n * @example\n * // Define a Mapper using the Container component\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n *\n * @class Mapper\n * @extends Component\n * @param {object} opts Configuration options.\n * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}.\n * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}.\n * @param {object} [opts.methods] See {@link Mapper#methods}.\n * @param {string} opts.name See {@link Mapper#name}.\n * @param {boolean} [opts.notify] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw=false] See {@link Mapper#raw}.\n * @param {Function|boolean} [opts.recordClass] See {@link Mapper#recordClass}.\n * @param {Object|Schema} [opts.schema] See {@link Mapper#schema}.\n * @returns {Mapper} A new {@link Mapper} instance.\n * @see http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n */\nfunction Mapper (opts) {\n utils.classCallCheck(this, Mapper)\n Component.call(this)\n opts || (opts = {})\n\n // Prepare certain properties to be non-enumerable\n Object.defineProperties(this, {\n _adapters: {\n value: undefined,\n writable: true\n },\n\n /**\n * The {@link Container} that holds this Mapper. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n datastore: {\n value: undefined,\n writable: true\n },\n\n /**\n * The meta information describing this Mapper's available lifecycle\n * methods. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n lifecycleMethods: {\n value: LIFECYCLE_METHODS\n },\n\n /**\n * Set to `false` to force the Mapper to work with POJO objects only.\n *\n * @example\n * // Use POJOs only.\n * import { Mapper, Record } from 'js-data';\n * const UserMapper = new Mapper({ recordClass: false });\n * UserMapper.recordClass // false;\n * const user = UserMapper.createRecord();\n * user instanceof Record; // false\n *\n * @example\n * // Set to a custom class to have records wrapped in your custom class.\n * import { Mapper, Record } from 'js-data';\n * // Custom class\n * class User {\n * constructor (props = {}) {\n * for (var key in props) {\n * if (props.hasOwnProperty(key)) {\n * this[key] = props[key];\n * }\n * }\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User });\n * UserMapper.recordClass; // function User() {}\n * const user = UserMapper.createRecord();\n * user instanceof Record; // false\n * user instanceof User; // true\n *\n *\n * @example\n * // Extend the {@link Record} class.\n * import { Mapper, Record } from 'js-data';\n * // Custom class\n * class User extends Record {\n * constructor () {\n * super(props);\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User });\n * UserMapper.recordClass; // function User() {}\n * const user = UserMapper.createRecord();\n * user instanceof Record; // true\n * user instanceof User; // true\n *\n * @name Mapper#recordClass\n * @default {@link Record}\n * @see Record\n * @since 3.0.0\n */\n recordClass: {\n value: undefined,\n writable: true\n },\n\n /**\n * This Mapper's {@link Schema}.\n *\n * @example Mapper#schema\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const UserMapper = new Mapper({\n * name: 'user',\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * first: { type: 'string', track: true },\n * last: { type: 'string', track: true },\n * role: { type: 'string', track: true, required: true },\n * age: { type: 'integer', track: true },\n * is_active: { type: 'number' }\n * }\n * }\n * });\n * const user = UserMapper.createRecord({\n * id: 1,\n * name: 'John',\n * role: 'admin'\n * });\n * user.on('change', function (user, changes) {\n * console.log(changes);\n * });\n * user.on('change:role', function (user, value) {\n * console.log('change:role - ' + value);\n * });\n * user.role = 'owner';\n *\n * @name Mapper#schema\n * @see Schema\n * @since 3.0.0\n * @type {Schema}\n */\n schema: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(MAPPER_DEFAULTS))\n\n /**\n * The name for this Mapper. This is the minimum amount of meta information\n * required for a Mapper to be able to execute CRUD operations for a\n * Resource.\n *\n * @name Mapper#name\n * @since 3.0.0\n * @type {string}\n */\n if (!this.name) {\n throw utils.err(`new ${DOMAIN}`, 'opts.name')(400, 'string', this.name)\n }\n\n // Setup schema, with an empty default schema if necessary\n if (this.schema) {\n this.schema.type || (this.schema.type = 'object')\n if (!(this.schema instanceof Schema)) {\n this.schema = new Schema(this.schema || { type: 'object' })\n }\n }\n\n // Create a subclass of Record that's tied to this Mapper\n if (this.recordClass === undefined) {\n const superClass = Record\n this.recordClass = superClass.extend({\n constructor: (function Record () {\n var subClass = function Record (props, opts) {\n utils.classCallCheck(this, subClass)\n superClass.call(this, props, opts)\n }\n return subClass\n })()\n })\n }\n\n if (this.recordClass) {\n this.recordClass.mapper = this\n\n /**\n * Functions that should be added to the prototype of {@link Mapper#recordClass}.\n *\n * @name Mapper#methods\n * @since 3.0.0\n * @type {Object}\n */\n if (utils.isObject(this.methods)) {\n utils.addHiddenPropsToTarget(this.recordClass.prototype, this.methods)\n }\n\n // We can only apply the schema to the prototype of this.recordClass if the\n // class extends Record\n if (Record.prototype.isPrototypeOf(Object.create(this.recordClass.prototype)) && this.schema && this.schema.apply && this.applySchema) {\n this.schema.apply(this.recordClass.prototype)\n }\n }\n}\n\nexport default Component.extend({\n constructor: Mapper,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCount\n * @param {object} query The `query` argument passed to {@link Mapper#count}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#count}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCount: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreate\n * @param {object} props The `props` argument passed to {@link Mapper#create}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#create}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreateMany\n * @param {array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroy: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroyAll\n * @param {*} data The `data` returned by the adapter.\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroyAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#find}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFind: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFindAll\n * @param {object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFindAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterSum\n * @param {object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterSum: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#update}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateAll\n * @param {object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateMany\n * @param {array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreate\n * @param {object} props The `props` argument passed to {@link Mapper#create}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#create}.\n * @since 3.0.0\n */\n beforeCreate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreateMany\n * @param {array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @since 3.0.0\n */\n beforeCreateMany: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCount\n * @param {object} query The `query` argument passed to {@link Mapper#count}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#count}.\n * @since 3.0.0\n */\n beforeCount: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @since 3.0.0\n */\n beforeDestroy: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroyAll\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @since 3.0.0\n */\n beforeDestroyAll: notify,\n\n /**\n * Mappers lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#find}.\n * @since 3.0.0\n */\n beforeFind: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFindAll\n * @param {object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @since 3.0.0\n */\n beforeFindAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeSum\n * @param {string} field The `field` argument passed to {@link Mapper#sum}.\n * @param {object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @since 3.0.0\n */\n beforeSum: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#update}.\n * @since 3.0.0\n */\n beforeUpdate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateAll\n * @param {object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @since 3.0.0\n */\n beforeUpdateAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateMany\n * @param {array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @since 3.0.0\n */\n beforeUpdateMany: notify,\n\n /**\n * This method is called at the end of most lifecycle methods. It does the\n * following:\n *\n * 1. If `opts.raw` is `true`, add this Mapper's configuration to the `opts`\n * argument as metadata for the operation.\n * 2. Wrap the result data appropriately using {@link Mapper#wrap}, which\n * calls {@link Mapper#createRecord}.\n *\n * @method Mapper#_end\n * @private\n * @since 3.0.0\n */\n _end (result, opts, skip) {\n if (opts.raw) {\n utils._(result, opts)\n }\n if (skip) {\n return result\n }\n let _data = opts.raw ? result.data : result\n if (_data && utils.isFunction(this.wrap)) {\n _data = this.wrap(_data, opts)\n if (opts.raw) {\n result.data = _data\n } else {\n result = _data\n }\n }\n return result\n },\n\n /**\n * Define a belongsTo relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * PostMapper.belongsTo(UserMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to post records at \"post.user\"\n * localField: 'user'\n * });\n *\n * CommentMapper.belongsTo(UserMapper, {\n * // comment.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to comment records at \"comment.user\"\n * localField: 'user'\n * });\n * CommentMapper.belongsTo(PostMapper, {\n * // comment.post_id points to post.id\n * foreignKey: 'post_id'\n * // post records will be attached to comment records at \"comment.post\"\n * localField: 'post'\n * });\n *\n * @method Mapper#belongsTo\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n belongsTo (relatedMapper, opts) {\n return belongsTo(relatedMapper, opts)(this)\n },\n\n /**\n * Select records according to the `query` argument and return the count.\n *\n * {@link Mapper#beforeCount} will be called before calling the adapter.\n * {@link Mapper#afterCount} will be called after calling the adapter.\n *\n * @example\n * // Get the number of published blog posts\n * PostMapper.count({ status: 'published' }).then((numPublished) => {\n * console.log(numPublished); // e.g. 45\n * });\n *\n * @method Mapper#count\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `count` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the count of the selected records.\n * @since 3.0.0\n */\n count (query, opts) {\n return this.crud('count', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~beforeCreateListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreate\n * @see Mapper~beforeCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback Mapper~beforeCreateListener\n * @param {object} props The `props` argument passed to {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeCreate}.\n * @see Mapper#event:beforeCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~afterCreateListener} for how to listen for this event.\n *\n * @event Mapper#afterCreate\n * @see Mapper~afterCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback Mapper~afterCreateListener\n * @param {object} props The `props` argument passed to {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterCreate}.\n * @see Mapper#event:afterCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Create and save a new the record using the provided `props`.\n *\n * {@link Mapper#beforeCreate} will be called before calling the adapter.\n * {@link Mapper#afterCreate} will be called after calling the adapter.\n *\n * @example\n * // Create and save a new blog post\n * PostMapper.create({\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'draft', ... }\n * });\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#create\n * @param {object} props The properties for the new record.\n * @param {object} [opts] Configuration options. Refer to the `create` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `props` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#create}\n * or {@link Mapper#createMany} call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created record.\n * @since 3.0.0\n */\n create (props, opts) {\n // Default values for arguments\n props || (props = {})\n opts || (opts = {})\n const originalRecord = props\n let parentRelationMap = {}\n let adapterResponse = {}\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n opts.op = 'beforeCreate'\n return this._runHook(opts.op, props, opts).then((props) => {\n opts.with || (opts.with = [])\n return this._createParentRecordIfRequired(props, opts)\n }).then((relationMap) => {\n parentRelationMap = relationMap\n }).then(() => {\n opts.op = 'create'\n return this._invokeAdapterMethod(opts.op, props, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdProps = opts.raw ? adapterResponse.data : adapterResponse\n\n return this._createOrAssignChildRecordIfRequired(createdProps, {\n opts,\n parentRelationMap,\n originalProps: props\n })\n }).then((createdProps) => {\n return this._commitChanges(originalRecord, createdProps)\n }).then((record) => {\n if (opts.raw) {\n adapterResponse.data = record\n } else {\n adapterResponse = record\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreate'\n return this._runHook(opts.op, props, opts, result)\n })\n },\n\n _commitChanges (recordOrRecords, newValues) {\n if (utils.isArray(recordOrRecords)) {\n return recordOrRecords.map((record, i) => this._commitChanges(record, newValues[i]))\n }\n\n utils.set(recordOrRecords, newValues, { silent: true })\n\n if (utils.isFunction(recordOrRecords.commit)) {\n recordOrRecords.commit()\n }\n\n return recordOrRecords\n },\n\n /**\n * Use {@link Mapper#createRecord} instead.\n * @deprecated\n * @method Mapper#createInstance\n * @param {Object|Array} props See {@link Mapper#createRecord}.\n * @param {object} [opts] See {@link Mapper#createRecord}.\n * @returns {Object|Array} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n createInstance (props, opts) {\n return this.createRecord(props, opts)\n },\n\n /**\n * Creates parent record for relation types like BelongsTo or HasMany with localKeys\n * in order to satisfy foreignKey dependency (so called child records).\n * @param {object} props See {@link Mapper#create}.\n * @param {object} opts See {@link Mapper#create}.\n * @returns {Object} cached parent records map\n * @see Mapper#create\n * @since 3.0.0\n */\n _createParentRecordIfRequired (props, opts) {\n const tasks = []\n const relations = []\n\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n if (!def.isRequiresParentId() || !def.getLocalField(props)) {\n return\n }\n\n optsCopy.raw = false\n relations.push(def)\n tasks.push(def.createParentRecord(props, optsCopy))\n })\n\n return utils.Promise.all(tasks).then(records => {\n return relations.reduce((map, relation, index) => {\n relation.setLocalField(map, records[index])\n return map\n }, {})\n })\n },\n\n /**\n * Creates child record for relation types like HasOne or HasMany with foreignKey\n * in order to satisfy foreignKey dependency (so called parent records).\n * @param {object} props See {@link Mapper#create}.\n * @param {object} context contains collected information.\n * @param {object} context.opts See {@link Mapper#create}.\n * @param {object} context.parentRelationMap contains parent records map\n * @param {object} context.originalProps contains data passed into {@link Mapper#create} method\n * @return {Promise} updated props\n * @see Mapper#create\n * @since 3.0.0\n */\n _createOrAssignChildRecordIfRequired (props, context) {\n const tasks = []\n\n utils.forEachRelation(this, context.opts, (def, optsCopy) => {\n const relationData = def.getLocalField(context.originalProps)\n\n if (!relationData) {\n return\n }\n\n optsCopy.raw = false\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.isRequiresChildId()) {\n tasks.push(def.createChildRecord(props, relationData, optsCopy))\n } else if (def.isRequiresParentId()) {\n const parent = def.getLocalField(context.parentRelationMap)\n\n if (parent) {\n def.setLocalField(props, parent)\n }\n }\n })\n\n return utils.Promise.all(tasks)\n .then(() => props)\n },\n\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreateMany\n * @see Mapper~beforeCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback Mapper~beforeCreateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Mapper#event:beforeCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~afterCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterCreateMany\n * @see Mapper~afterCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback Mapper~afterCreateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Mapper#event:afterCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Given an array of records, batch create them via an adapter.\n *\n * {@link Mapper#beforeCreateMany} will be called before calling the adapter.\n * {@link Mapper#afterCreateMany} will be called after calling the adapter.\n *\n * @example\n * // Create and save several new blog posts\n * PostMapper.createMany([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]); // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]); // { id: 1235, status: 'draft', ... }\n * });\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#createMany\n * @param {Record[]} records Array of records to be created in one batch.\n * @param {object} [opts] Configuration options. Refer to the `createMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `records` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#createMany}\n * call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created records.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n createMany (records, opts) {\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n const originalRecords = records\n let adapterResponse\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n // beforeCreateMany lifecycle hook\n opts.op = 'beforeCreateMany'\n return this._runHook(opts.op, records, opts).then((records) => {\n // Deep pre-create belongsTo relations\n const belongsToRelationData = {}\n opts.with || (opts.with = [])\n let tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (def.type === belongsToType && relationData.length === records.length) {\n // Create belongsTo relation first because we need a generated id to\n // attach to the child\n optsCopy.raw = false\n tasks.push(def.createLinked(relationData, optsCopy).then((relatedRecords) => {\n records.forEach((record, i) => def.setForeignKey(record, relatedRecords[i]))\n }).then((relatedRecords) => {\n def.setLocalField(belongsToRelationData, relatedRecords)\n }))\n }\n })\n return utils.Promise.all(tasks).then(() => {\n opts.op = 'createMany'\n return this._invokeAdapterMethod(opts.op, records, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdRecordsData = opts.raw ? adapterResponse.data : adapterResponse\n\n // Deep post-create hasOne relations\n tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (relationData.length !== records.length) {\n return\n }\n\n optsCopy.raw = false\n const belongsToData = def.getLocalField(belongsToRelationData)\n let task\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.type === hasManyType) {\n // Not supported\n this.log('warn', 'deep createMany of hasMany type not supported!')\n } else if (def.type === hasOneType) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setForeignKey(createdRecordData, relationData[i])\n })\n task = def.getRelation().createMany(relationData, optsCopy).then((relatedData) => {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, relatedData[i])\n })\n })\n } else if (def.type === belongsToType && belongsToData && belongsToData.length === createdRecordsData.length) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, belongsToData[i])\n })\n }\n if (task) {\n tasks.push(task)\n }\n })\n return utils.Promise.all(tasks).then(() => {\n return this._commitChanges(originalRecords, createdRecordsData)\n })\n })\n }).then((records) => {\n if (opts.raw) {\n adapterResponse.data = records\n } else {\n adapterResponse = records\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreateMany'\n return this._runHook(opts.op, records, opts, result)\n })\n },\n\n /**\n * Create an unsaved, uncached instance of this Mapper's\n * {@link Mapper#recordClass}.\n *\n * Returns `props` if `props` is already an instance of\n * {@link Mapper#recordClass}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * const post = PostMapper.createRecord();\n *\n * @example\n * // Create an unsaved record instance with inital properties\n * const post = PostMapper.createRecord({\n * title: 'Modeling your data',\n * status: 'draft'\n * });\n *\n * @example\n * // Create a record instance that corresponds to a saved record\n * const post = PostMapper.createRecord({\n * // JSData thinks this record has been saved if it has a primary key\n * id: 1234,\n * title: 'Modeling your data',\n * status: 'draft'\n * });\n *\n * @example\n * // Create record instances from an array\n * const posts = PostMapper.createRecord([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]);\n *\n * @example\n * // Records are validated by default\n * import { Mapper } from 'js-data';\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * });\n * try {\n * const post = PostMapper.createRecord({\n * title: 1234,\n * });\n * } catch (err) {\n * console.log(err.errors); // [{ expected: 'one of (string)', actual: 'number', path: 'title' }]\n * }\n *\n * @example\n * // Skip validation\n * import { Mapper } from 'js-data';\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * });\n * const post = PostMapper.createRecord({\n * title: 1234,\n * }, { noValidate: true });\n * console.log(post.isValid()); // false\n *\n * @method Mapper#createRecord\n * @param {Object|Object[]} props The properties for the Record instance or an\n * array of property objects for the Record instances.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @returns {Record|Record[]} The Record instance or Record instances.\n * @since 3.0.0\n */\n createRecord (props, opts) {\n props || (props = {})\n if (utils.isArray(props)) {\n return props.map((_props) => this.createRecord(_props, opts))\n }\n if (!utils.isObject(props)) {\n throw utils.err(`${DOMAIN}#createRecord`, 'props')(400, 'array or object', props)\n }\n\n if (this.relationList) {\n this.relationList.forEach(function (def) {\n def.ensureLinkedDataHasProperType(props, opts)\n })\n }\n const RecordCtor = this.recordClass\n\n return (!RecordCtor || props instanceof RecordCtor) ? props : new RecordCtor(props, opts)\n },\n\n /**\n * Lifecycle invocation method. You probably won't call this method directly.\n *\n * @method Mapper#crud\n * @param {string} method Name of the lifecycle method to invoke.\n * @param {...*} args Arguments to pass to the lifecycle method.\n * @returns {Promise}\n * @since 3.0.0\n */\n crud (method, ...args) {\n const config = this.lifecycleMethods[method]\n if (!config) {\n throw utils.err(`${DOMAIN}#crud`, method)(404, 'method')\n }\n\n const upper = `${method.charAt(0).toUpperCase()}${method.substr(1)}`\n const before = `before${upper}`\n const after = `after${upper}`\n\n let op, adapter\n\n // Default values for arguments\n config.defaults.forEach((value, i) => {\n if (args[i] === undefined) {\n args[i] = utils.copy(value)\n }\n })\n\n const opts = args[args.length - 1]\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n adapter = opts.adapter = this.getAdapterName(opts)\n\n // before lifecycle hook\n op = opts.op = before\n return utils.resolve(this[op](...args)).then((_value) => {\n if (args[config.beforeAssign] !== undefined) {\n // Allow for re-assignment from lifecycle hook\n args[config.beforeAssign] = _value === undefined ? args[config.beforeAssign] : _value\n }\n // Now delegate to the adapter\n op = opts.op = method\n args = config.adapterArgs ? config.adapterArgs(this, ...args) : args\n this.dbg(op, ...args)\n return utils.resolve(this.getAdapter(adapter)[op](this, ...args))\n }).then((result) => {\n result = this._end(result, opts, !!config.skip)\n args.push(result)\n // after lifecycle hook\n op = opts.op = after\n return utils.resolve(this[op](...args)).then((_result) => {\n // Allow for re-assignment from lifecycle hook\n return _result === undefined ? result : _result\n })\n })\n },\n\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~beforeDestroyListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroy\n * @see Mapper~beforeDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback Mapper~beforeDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}.\n * @see Mapper#event:beforeDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~afterDestroyListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroy\n * @see Mapper~afterDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback Mapper~afterDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterDestroy}.\n * @see Mapper#event:afterDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Using an adapter, destroy the record with the given primary key.\n *\n * {@link Mapper#beforeDestroy} will be called before destroying the record.\n * {@link Mapper#afterDestroy} will be called after destroying the record.\n *\n * @example\n * // Destroy a specific blog post\n * PostMapper.destroy(1234).then(() => {\n * // Blog post #1234 has been destroyed\n * });\n *\n * @example\n * // Get full response\n * PostMapper.destroy(1234, { raw: true }).then((result) => {\n * console.log(result.deleted); e.g. 1\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeDestroy\n * @fires Mapper#afterDestroy\n * @method Mapper#destroy\n * @param {(string|number)} id The primary key of the record to destroy.\n * @param {object} [opts] Configuration options. Refer to the `destroy` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the record has been destroyed. Resolves\n * even if no record was found to be destroyed.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroy (id, opts) {\n return this.crud('destroy', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroyAll\n * @see Mapper~beforeDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback Mapper~beforeDestroyAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}.\n * @see Mapper#event:beforeDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroyAll\n * @see Mapper~afterDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback Mapper~afterDestroyAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterDestroyAll}.\n * @see Mapper#event:afterDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Destroy the records selected by `query` via an adapter. If no `query` is\n * provided then all records will be destroyed.\n *\n * {@link Mapper#beforeDestroyAll} will be called before destroying the records.\n * {@link Mapper#afterDestroyAll} will be called after destroying the records.\n *\n * @example\n * // Destroy all blog posts\n * PostMapper.destroyAll().then(() => {\n * // All blog posts have been destroyed\n * });\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * PostMapper.destroyAll({ status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * });\n *\n * @example\n * // Get full response\n * const query = null;\n * const options = { raw: true };\n * PostMapper.destroyAll(query, options).then((result) => {\n * console.log(result.deleted); e.g. 14\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeDestroyAll\n * @fires Mapper#afterDestroyAll\n * @method Mapper#destroyAll\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `destroyAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the records have been destroyed. Resolves\n * even if no records were found to be destroyed.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroyAll (query, opts) {\n return this.crud('destroyAll', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~beforeFindListener} for how to listen for this event.\n *\n * @event Mapper#beforeFind\n * @see Mapper~beforeFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback Mapper~beforeFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFind}.\n * @see Mapper#event:beforeFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~afterFindListener} for how to listen for this event.\n *\n * @event Mapper#afterFind\n * @see Mapper~afterFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFind} event.\n *\n * @example\n * function onAfterFind (id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback Mapper~afterFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterFind}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterFind}.\n * @see Mapper#event:afterFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Retrieve via an adapter the record with the given primary key.\n *\n * {@link Mapper#beforeFind} will be called before calling the adapter.\n * {@link Mapper#afterFind} will be called after calling the adapter.\n *\n * @example\n * PostMapper.find(1).then((post) => {\n * console.log(post); // { id: 1, ...}\n * });\n *\n * @example\n * // Get full response\n * PostMapper.find(1, { raw: true }).then((result) => {\n * console.log(result.data); // { id: 1, ...}\n * console.log(result.found); // 1\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeFind\n * @fires Mapper#afterFind\n * @method Mapper#find\n * @param {(string|number)} id The primary key of the record to retrieve.\n * @param {object} [opts] Configuration options. Refer to the `find` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found record. Resolves with\n * `undefined` if no record was found.\n * @see http://www.js-data.io/v3.0/docs/reading-data\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n find (id, opts) {\n return this.crud('find', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~beforeFindAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeFindAll\n * @see Mapper~beforeFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback Mapper~beforeFindAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}.\n * @see Mapper#event:beforeFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~afterFindAllListener} for how to listen for this event.\n *\n * @event Mapper#afterFindAll\n * @see Mapper~afterFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback Mapper~afterFindAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterFindAll}.\n * @see Mapper#event:afterFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, select records to retrieve via an adapter.\n *\n * {@link Mapper#beforeFindAll} will be called before calling the adapter.\n * {@link Mapper#afterFindAll} will be called after calling the adapter.\n *\n * @example\n * // Find all \"published\" blog posts\n * PostMapper.findAll({ status: 'published' }).then((posts) => {\n * console.log(posts); // [{ id: 1, status: 'published', ...}, ...]\n * });\n *\n * @example\n * // Get full response\n * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => {\n * console.log(result.data); // [{ id: 1, status: 'published', ...}, ...]\n * console.log(result.found); // e.g. 13\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeFindAll\n * @fires Mapper#afterFindAll\n * @method Mapper#findAll\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `findAll` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n findAll (query, opts) {\n return this.crud('findAll', query, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Mapper#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapter (name) {\n this.dbg('getAdapter', 'name:', name)\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Mapper#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || opts.defaultAdapter\n },\n\n /**\n * Get the object of registered adapters for this Mapper.\n *\n * @method Mapper#getAdapters\n * @returns {Object} {@link Mapper#_adapters}\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Returns this Mapper's {@link Schema}.\n *\n * @method Mapper#getSchema\n * @returns {Schema} This Mapper's {@link Schema}.\n * @see Mapper#schema\n * @since 3.0.0\n */\n getSchema () {\n return this.schema\n },\n\n /**\n * Defines a hasMany relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * UserMapper.hasMany(PostMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // post records will be attached to user records at \"user.posts\"\n * localField: 'posts'\n * });\n *\n * @method Mapper#hasMany\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasMany (relatedMapper, opts) {\n return hasMany(relatedMapper, opts)(this)\n },\n\n /**\n * Defines a hasOne relationship. Only useful if you're managing your Mappers\n * manually and not using a {@link Container} or {@link DataStore} component.\n *\n * @example\n * UserMapper.hasOne(ProfileMapper, {\n * // profile.user_id points to user.id\n * foreignKey: 'user_id'\n * // profile records will be attached to user records at \"user.profile\"\n * localField: 'profile'\n * });\n *\n * @method Mapper#hasOne\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasOne (relatedMapper, opts) {\n return hasOne(relatedMapper, opts)(this)\n },\n\n /**\n * Return whether `record` is an instance of this Mapper's recordClass.\n *\n * @example\n * const post = PostMapper.createRecord();\n *\n * console.log(PostMapper.is(post)); // true\n * // Equivalent to what's above\n * console.log(post instanceof PostMapper.recordClass); // true\n *\n * @method Mapper#is\n * @param {Object|Record} record The record to check.\n * @returns {boolean} Whether `record` is an instance of this Mapper's\n * {@link Mapper#recordClass}.\n * @since 3.0.0\n */\n is (record) {\n const recordClass = this.recordClass\n return recordClass ? record instanceof recordClass : false\n },\n\n /**\n * Register an adapter on this Mapper under the given name.\n *\n * @method Mapper#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for this Mapper.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.defaultAdapter = name\n }\n },\n\n _runHook (hookName, ...hookArgs) {\n const defaultValueIndex = hookName.indexOf('after') === 0 ? hookArgs.length - 1 : 0\n\n return utils.resolve(this[hookName](...hookArgs))\n .then((overridenResult) => overridenResult === undefined ? hookArgs[defaultValueIndex] : overridenResult)\n },\n\n _invokeAdapterMethod (method, propsOrRecords, opts) {\n const conversionOptions = { with: opts.pass || [] }\n let object\n\n this.dbg(opts.op, propsOrRecords, opts)\n\n if (utils.isArray(propsOrRecords)) {\n object = propsOrRecords.map(record => this.toJSON(record, conversionOptions))\n } else {\n object = this.toJSON(propsOrRecords, conversionOptions)\n }\n\n return this.getAdapter(opts.adapter)[method](this, object, opts)\n },\n\n /**\n * Select records according to the `query` argument, and aggregate the sum\n * value of the property specified by `field`.\n *\n * {@link Mapper#beforeSum} will be called before calling the adapter.\n * {@link Mapper#afterSum} will be called after calling the adapter.\n *\n * @example\n * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid); // e.g. 451125.34\n * });\n *\n * @method Mapper#sum\n * @param {string} field The field to sum.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `sum` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the aggregated sum.\n * @since 3.0.0\n */\n sum (field, query, opts) {\n return this.crud('sum', field, query, opts)\n },\n\n /**\n * Return a plain object representation of the given record. Relations can\n * be optionally be included. Non-schema properties can be excluded.\n *\n * @example\n * import { Mapper, Schema } from 'js-data';\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is stripped by toJSON()\n * console.log(PersonMapper.toJSON(person)); // {\"id\":1,\"name\":\"John\"}\n *\n * const PersonRelaxedMapper = new Mapper({\n * name: 'personRelaxed',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * });\n * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is not stripped by toJSON\n * console.log(PersonRelaxedMapper.toJSON(person2)); // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Mapper#toJSON\n * @param {Record|Record[]} records Record or records from which to create a\n * POJO representation.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the POJO representation.\n * @param {boolean} [opts.withAll] Whether to simply include all relations in\n * the representation. Overrides `opts.with`.\n * @returns {Object|Object[]} POJO representation of the record or records.\n * @since 3.0.0\n */\n toJSON (records, opts) {\n let record\n opts || (opts = {})\n if (utils.isArray(records)) {\n return records.map((record) => this.toJSON(record, opts))\n } else {\n record = records\n }\n const relationFields = (this ? this.relationFields : []) || []\n let json = {}\n\n // Copy properties defined in the schema\n if (this && this.schema) {\n json = this.schema.pick(record)\n } else {\n for (var key in record) {\n if (relationFields.indexOf(key) === -1) {\n json[key] = utils.plainCopy(record[key])\n }\n }\n }\n\n // The user wants to include relations in the resulting plain object representation\n if (this && opts.withAll) {\n opts.with = relationFields.slice()\n }\n if (this && opts.with) {\n if (utils.isString(opts.with)) {\n opts.with = [opts.with]\n }\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = def.getLocalField(record)\n if (relationData) {\n // The actual recursion\n if (utils.isArray(relationData)) {\n def.setLocalField(json, relationData.map((item) => {\n return def.getRelation().toJSON(item, optsCopy)\n }))\n } else {\n def.setLocalField(json, def.getRelation().toJSON(relationData, optsCopy))\n }\n }\n })\n }\n return json\n },\n\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~beforeUpdateListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdate\n * @see Mapper~beforeUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback Mapper~beforeUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument passed to {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}.\n * @see Mapper#event:beforeUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~afterUpdateListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdate\n * @see Mapper~afterUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback Mapper~afterUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterUpdate}.\n * @see Mapper#event:afterUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Using an adapter, update the record with the primary key specified by the\n * `id` argument.\n *\n * {@link Mapper#beforeUpdate} will be called before updating the record.\n * {@link Mapper#afterUpdate} will be called after updating the record.\n *\n * @example\n * // Update a specific post\n * PostMapper.update(1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'published', ... }\n * });\n *\n * @fires Mapper#beforeUpdate\n * @fires Mapper#afterUpdate\n * @method Mapper#update\n * @param {(string|number)} id The primary key of the record to update.\n * @param {object} props The update to apply to the record.\n * @param {object} [opts] Configuration options. Refer to the `update` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * transaction.\n * @returns {Promise} Resolves with the updated record. Rejects if the record\n * could not be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n update (id, props, opts) {\n return this.crud('update', id, props, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateAll\n * @see Mapper~beforeUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback Mapper~beforeUpdateAllListener\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Mapper#event:beforeUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateAll\n * @see Mapper~afterUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback Mapper~afterUpdateAllListener\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Mapper#event:afterUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, perform the a single updated to the selected\n * records.\n *\n * {@link Mapper#beforeUpdateAll} will be called before making the update.\n * {@link Mapper#afterUpdateAll} will be called after making the update.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * const update = { status: draft: published_at: null };\n * const query = { userId: 1234 };\n * PostMapper.updateAll(update, query).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Mapper#beforeUpdateAll\n * @fires Mapper#afterUpdateAll\n * @method Mapper#updateAll\n * @param {object} props Update to apply to selected records.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `updateAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the update records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateAll (props, query, opts) {\n return this.crud('updateAll', props, query, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateMany\n * @see Mapper~beforeUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback Mapper~beforeUpdateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Mapper#event:beforeUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateMany\n * @see Mapper~afterUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback Mapper~afterUpdateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Mapper#event:afterUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Given an array of updates, perform each of the updates via an adapter. Each\n * \"update\" is a hash of properties with which to update an record. Each\n * update must contain the primary key of the record to be updated.\n *\n * {@link Mapper#beforeUpdateMany} will be called before making the update.\n * {@link Mapper#afterUpdateMany} will be called after making the update.\n *\n * @example\n * PostMapper.updateMany([\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Mapper#beforeUpdateMany\n * @fires Mapper#afterUpdateMany\n * @method Mapper#updateMany\n * @param {Record[]} records Array up record updates.\n * @param {object} [opts] Configuration options. Refer to the `updateMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the updated records. Rejects if any of the\n * records could be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateMany (records, opts) {\n return this.crud('updateMany', records, opts)\n },\n\n /**\n * Validate the given record or records according to this Mapper's\n * {@link Schema}. If there are no validation errors then the return value\n * will be `undefined`.\n *\n * @example\n * import {Mapper, Schema} from 'js-data'\n * const PersonSchema = new Schema({\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * });\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: PersonSchema\n * });\n * let errors = PersonMapper.validate({ name: 'John' });\n * console.log(errors); // undefined\n * errors = PersonMapper.validate({ name: 123 });\n * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Mapper#validate\n * @param {Object|Object[]} record The record or records to validate.\n * @param {object} [opts] Configuration options. Passed to\n * {@link Schema#validate}.\n * @returns {Object[]} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (record, opts) {\n opts || (opts = {})\n const schema = this.getSchema()\n if (!schema) {\n return\n }\n const _opts = utils.pick(opts, ['existingOnly'])\n if (utils.isArray(record)) {\n const errors = record.map((_record) => schema.validate(_record, utils.pick(_opts, ['existingOnly'])))\n\n return errors.some(Boolean) ? errors : undefined\n }\n return schema.validate(record, _opts)\n },\n\n /**\n * Method used to wrap data returned by an adapter with this Mapper's\n * {@link Mapper#recordClass}. This method is used by all of a Mapper's CRUD\n * methods. The provided implementation of this method assumes that the `data`\n * passed to it is a record or records that need to be wrapped with\n * {@link Mapper#createRecord}. Override with care.\n *\n * Provided implementation of {@link Mapper#wrap}:\n *\n * ```\n * function (data, opts) {\n * return this.createRecord(data, opts);\n * }\n * ```\n *\n * @example\n * const PostMapper = new Mapper({\n * name: 'post',\n * // Override to customize behavior\n * wrap (data, opts) {\n * const originalWrap = this.constructor.prototype.wrap;\n * // Let's say \"GET /post\" doesn't return JSON quite like JSData expects,\n * // but the actual post records are nested under a \"posts\" field. So,\n * // we override Mapper#wrap to handle this special case.\n * if (opts.op === 'findAll') {\n * return originalWrap.call(this, data.posts, opts);\n * }\n * // Otherwise perform original behavior\n * return originalWrap.call(this, data, opts);\n * }\n * });\n *\n * @method Mapper#wrap\n * @param {Object|Object[]} data The record or records to be wrapped.\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#createRecord}.\n * @returns {Record|Record[]} The wrapped record or records.\n * @since 3.0.0\n */\n wrap (data, opts) {\n return this.createRecord(data, opts)\n },\n\n /**\n * @ignore\n */\n defineRelations () {\n // Setup the mapper's relations, including generating Mapper#relationList\n // and Mapper#relationFields\n utils.forOwn(this.relations, (group, type) => {\n utils.forOwn(group, (relations, _name) => {\n if (utils.isObject(relations)) {\n relations = [relations]\n }\n relations.forEach((def) => {\n const relatedMapper = this.datastore.getMapperByName(_name) || _name\n def.getRelation = () => this.datastore.getMapper(_name)\n\n if (typeof Relation[type] !== 'function') {\n throw utils.err(DOMAIN, 'defineRelations')(400, 'relation type (hasOne, hasMany, etc)', type, true)\n }\n\n this[type](relatedMapper, def)\n })\n })\n })\n }\n})\n\n/**\n * Create a subclass of this Mapper:\n *\n * @example Mapper.extend\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMapperClass extends Mapper {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * };\n * const customMapper = new CustomMapperClass();\n * console.log(customMapper.foo());\n * console.log(CustomMapperClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherMapperClass = Mapper.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherMapper = new OtherMapperClass();\n * console.log(otherMapper.foo());\n * console.log(OtherMapperClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMapperClass () {\n * Mapper.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Mapper.extend({\n * constructor: AnotherMapperClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherMapper = new AnotherMapperClass();\n * console.log(anotherMapper.created_at);\n * console.log(anotherMapper.foo());\n * console.log(AnotherMapperClass.beep());\n *\n * @method Mapper.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Mapper class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Mapper from './Mapper'\n\nconst DOMAIN = 'Container'\n\nexport const proxiedMapperMethods = [\n /**\n * Wrapper for {@link Mapper#count}.\n *\n * @example\n * // Get the number of published blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.count('post', { status: 'published' }).then((numPublished) => {\n * console.log(numPublished); // e.g. 45\n * });\n *\n * @method Container#count\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#count}.\n * @param {object} [opts] See {@link Mapper#count}.\n * @returns {Promise} See {@link Mapper#count}.\n * @see Mapper#count\n * @since 3.0.0\n */\n 'count',\n\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~beforeCreateListener} for how to listen for this event.\n *\n * @event Container#beforeCreate\n * @see Container~beforeCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback Container~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see Container#event:beforeCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~afterCreateListener} for how to listen for this event.\n *\n * @event Container#afterCreate\n * @see Container~afterCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback Container~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see Container#event:afterCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}.\n *\n * @example\n * // Create and save a new blog post\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.create('post', {\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'draft', ... }\n * });\n *\n * @fires Container#beforeCreate\n * @fires Container#afterCreate\n * @method Container#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} props See {@link Mapper#create}.\n * @param {object} [opts] See {@link Mapper#create}.\n * @returns {Promise} See {@link Mapper#create}.\n * @see Mapper#create\n * @since 3.0.0\n */\n 'create',\n\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Container#beforeCreateMany\n * @see Container~beforeCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback Container~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Container#event:beforeCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~afterCreateManyListener} for how to listen for this event.\n *\n * @event Container#afterCreateMany\n * @see Container~afterCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback Container~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Container#event:afterCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}.\n *\n * @example\n * // Create and save several new blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.createMany('post', [{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]); // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]); // { id: 1235, status: 'draft', ... }\n * });\n *\n * @fires Container#beforeCreateMany\n * @fires Container#afterCreateMany\n * @method Container#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record[]} records See {@link Mapper#createMany}.\n * @param {object} [opts] See {@link Mapper#createMany}.\n * @returns {Promise} See {@link Mapper#createMany}.\n * @see Mapper#createMany\n * @since 3.0.0\n */\n 'createMany',\n\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post');\n * const post = PostMapper.createRecord();\n *\n * @method Container#createRecord\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Object[]} props See {@link Mapper#createRecord}.\n * @param {object} [opts] See {@link Mapper#createRecord}.\n * @returns {Promise} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n 'createRecord',\n\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~beforeDestroyListener} for how to listen for this event.\n *\n * @event Container#beforeDestroy\n * @see Container~beforeDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback Container~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see Container#event:beforeDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~afterDestroyListener} for how to listen for this event.\n *\n * @event Container#afterDestroy\n * @see Container~afterDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback Container~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see Container#event:afterDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}.\n *\n * @example\n * // Destroy a specific blog post\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.destroy('post', 1234).then(() => {\n * // Blog post #1234 has been destroyed\n * });\n *\n * @fires Container#beforeDestroy\n * @fires Container#afterDestroy\n * @method Container#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#destroy}.\n * @param {object} [opts] See {@link Mapper#destroy}.\n * @returns {Promise} See {@link Mapper#destroy}.\n * @see Mapper#destroy\n * @since 3.0.0\n */\n 'destroy',\n\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Container#beforeDestroyAll\n * @see Container~beforeDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback Container~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see Container#event:beforeDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Container#afterDestroyAll\n * @see Container~afterDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback Container~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see Container#event:afterDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}.\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.destroyAll('post', { status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * });\n *\n * @fires Container#beforeDestroyAll\n * @fires Container#afterDestroyAll\n * @method Container#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#destroyAll}.\n * @param {object} [opts] See {@link Mapper#destroyAll}.\n * @returns {Promise} See {@link Mapper#destroyAll}.\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n 'destroyAll',\n\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~beforeFindListener} for how to listen for this event.\n *\n * @event Container#beforeFind\n * @see Container~beforeFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback Container~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see Container#event:beforeFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~afterFindListener} for how to listen for this event.\n *\n * @event Container#afterFind\n * @see Container~afterFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback Container~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see Container#event:afterFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.find('post', 1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * });\n *\n * @fires Container#beforeFind\n * @fires Container#afterFind\n * @method Container#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#find}.\n * @param {object} [opts] See {@link Mapper#find}.\n * @returns {Promise} See {@link Mapper#find}.\n * @see Mapper#find\n * @since 3.0.0\n */\n 'find',\n\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~beforeFindAllListener} for how to listen for this event.\n *\n * @event Container#beforeFindAll\n * @see Container~beforeFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback Container~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see Container#event:beforeFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~afterFindAllListener} for how to listen for this event.\n *\n * @event Container#afterFindAll\n * @see Container~afterFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback Container~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see Container#event:afterFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * @example\n * // Find all \"published\" blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.findAll('post', { status: 'published' }).then((posts) => {\n * console.log(posts); // [{ id: 1, ...}, ...]\n * });\n *\n * @fires Container#beforeFindAll\n * @fires Container#afterFindAll\n * @method Container#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#findAll}.\n * @param {object} [opts] See {@link Mapper#findAll}.\n * @returns {Promise} See {@link Mapper#findAll}.\n * @see Mapper#findAll\n * @since 3.0.0\n */\n 'findAll',\n\n /**\n * Wrapper for {@link Mapper#getSchema}.\n *\n * @method Container#getSchema\n * @param {string} name Name of the {@link Mapper} to target.\n * @returns {Schema} See {@link Mapper#getSchema}.\n * @see Mapper#getSchema\n * @since 3.0.0\n */\n 'getSchema',\n\n /**\n * Wrapper for {@link Mapper#is}.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post');\n * const post = store.createRecord();\n *\n * console.log(store.is('post', post)); // true\n * // Equivalent to what's above\n * console.log(post instanceof store.getMapper('post').recordClass); // true\n *\n * @method Container#is\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Record} record See {@link Mapper#is}.\n * @returns {boolean} See {@link Mapper#is}.\n * @see Mapper#is\n * @since 3.0.0\n */\n 'is',\n\n /**\n * Wrapper for {@link Mapper#sum}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('purchase_order');\n *\n * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid); // e.g. 451125.34\n * });\n *\n * @method Container#sum\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {string} field See {@link Mapper#sum}.\n * @param {object} [query] See {@link Mapper#sum}.\n * @param {object} [opts] See {@link Mapper#sum}.\n * @returns {Promise} See {@link Mapper#sum}.\n * @see Mapper#sum\n * @since 3.0.0\n */\n 'sum',\n\n /**\n * Wrapper for {@link Mapper#toJSON}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('person', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is stripped by toJSON()\n * console.log(store.toJSON('person', person)); // {\"id\":1,\"name\":\"John\"}\n *\n * store.defineMapper('personRelaxed', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * });\n * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is not stripped by toJSON\n * console.log(store.toJSON('personRelaxed', person2)); // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Container#toJSON\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record|Record[]} records See {@link Mapper#toJSON}.\n * @param {object} [opts] See {@link Mapper#toJSON}.\n * @returns {Object|Object[]} See {@link Mapper#toJSON}.\n * @see Mapper#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~beforeUpdateListener} for how to listen for this event.\n *\n * @event Container#beforeUpdate\n * @see Container~beforeUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback Container~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see Container#event:beforeUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~afterUpdateListener} for how to listen for this event.\n *\n * @event Container#afterUpdate\n * @see Container~afterUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback Container~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see Container#event:afterUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.update('post', 1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'published', ... }\n * });\n *\n * @fires Container#beforeUpdate\n * @fires Container#afterUpdate\n * @method Container#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#update}.\n * @param {object} record See {@link Mapper#update}.\n * @param {object} [opts] See {@link Mapper#update}.\n * @returns {Promise} See {@link Mapper#update}.\n * @see Mapper#update\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n 'update',\n\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateAll\n * @see Container~beforeUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback Container~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Container#event:beforeUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Container#afterUpdateAll\n * @see Container~afterUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback Container~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Container#event:afterUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * const update = { status: draft: published_at: null };\n * const query = { userId: 1234 };\n * store.updateAll('post', update, query).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Container#beforeUpdateAll\n * @fires Container#afterUpdateAll\n * @method Container#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} update See {@link Mapper#updateAll}.\n * @param {object} [query] See {@link Mapper#updateAll}.\n * @param {object} [opts] See {@link Mapper#updateAll}.\n * @returns {Promise} See {@link Mapper#updateAll}.\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n 'updateAll',\n\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateMany\n * @see Container~beforeUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback Container~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Container#event:beforeUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Container#afterUpdateMany\n * @see Container~afterUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback Container~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Container#event:afterUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.updateMany('post', [\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Container#beforeUpdateMany\n * @fires Container#afterUpdateMany\n * @method Container#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}.\n * @param {object} [opts] See {@link Mapper#updateMany}.\n * @returns {Promise} See {@link Mapper#updateMany}.\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n 'updateMany',\n\n /**\n * Wrapper for {@link Mapper#validate}.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * let errors = store.validate('post', { name: 'John' });\n * console.log(errors); // undefined\n * errors = store.validate('post', { name: 123 });\n * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Container#validate\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#validate}.\n * @param {object} [opts] See {@link Mapper#validate}.\n * @returns {Promise} See {@link Mapper#validate}.\n * @see Mapper#validate\n * @since 3.0.0\n */\n 'validate'\n]\n\n/**\n * The `Container` class is a place to define and store {@link Mapper} instances.\n *\n * `Container` makes it easy to manage your Mappers. Without a container, you\n * need to manage Mappers yourself, including resolving circular dependencies\n * among relations. All Mappers in a container share the same adapters, so you\n * don't have to register adapters for every single Mapper.\n *\n * @example Container#constructor\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const {Container} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n *\n * @class Container\n * @extends Component\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}.\n * @param {object} [opts.mapperDefaults] See {@link Container#mapperDefaults}.\n * @since 3.0.0\n */\nexport function Container (opts) {\n utils.classCallCheck(this, Container)\n Component.call(this)\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * The adapters registered with this Container, which are also shared by all\n * Mappers in this Container.\n *\n * @name Container#_adapters\n * @see Container#registerAdapter\n * @since 3.0.0\n * @type {Object}\n */\n _adapters: {\n value: {}\n },\n\n /**\n * The the mappers in this container\n *\n * @name Container#_mappers\n * @see Mapper\n * @since 3.0.0\n * @type {Object}\n */\n _mappers: {\n value: {}\n },\n\n /**\n * Constructor function to use in {@link Container#defineMapper} to create new\n * {@link Mapper} instances. {@link Container#mapperClass} should extend\n * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers.\n *\n * @example Container#mapperClass\n * // import { Container, Mapper } from 'js-data';\n * const JSData = require('js-data');\n * const { Container, Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const store = new Container({\n * mapperClass: MyMapperClass\n * });\n * store.defineMapper('user');\n * console.log(store.getMapper('user').foo());\n *\n * @name Container#mapperClass\n * @see Mapper\n * @since 3.0.0\n * @type {Constructor}\n */\n mapperClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply options provided by the user\n utils.fillIn(this, opts)\n\n /**\n * Defaults options to pass to {@link Container#mapperClass} when creating a\n * new {@link Mapper}.\n *\n * @example Container#mapperDefaults\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container({\n * mapperDefaults: {\n * idAttribute: '_id'\n * }\n * });\n * store.defineMapper('user');\n * console.log(store.getMapper('user').idAttribute);\n *\n * @default {}\n * @name Container#mapperDefaults\n * @since 3.0.0\n * @type {Object}\n */\n this.mapperDefaults = this.mapperDefaults || {}\n\n // Use the Mapper class if the user didn't provide a mapperClass\n this.mapperClass || (this.mapperClass = Mapper)\n}\n\nconst props = {\n constructor: Container,\n\n /**\n * Register a new event listener on this Container.\n *\n * Proxy for {@link Component#on}. If an event was emitted by a {@link Mapper}\n * in the Container, then the name of the {@link Mapper} will be prepended to\n * the arugments passed to the listener.\n *\n * @example Container#on\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.on('foo', function (...args) { console.log(args.join(':')) });\n * store.defineMapper('user');\n * store.emit('foo', 'arg1', 'arg2');\n * store.getMapper('user').emit('foo', 'arg1', 'arg2');\n *\n * @method Container#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n\n /**\n * Used to bind to events emitted by mappers in this container.\n *\n * @method Container#_onMapperEvent\n * @param {string} name Name of the mapper that emitted the event.\n * @param {...*} [args] Args See {@link Mapper#emit}.\n * @private\n * @since 3.0.0\n */\n _onMapperEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * Return a container scoped to a particular mapper.\n *\n * @example Container#as\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * const UserMapper = store.defineMapper('user');\n * const UserStore = store.as('user');\n *\n * const user1 = store.createRecord('user', { name: 'John' });\n * const user2 = UserStore.createRecord({ name: 'John' });\n * const user3 = UserMapper.createRecord({ name: 'John' });\n * console.log(user1 === user2);\n * console.log(user2 === user3);\n * console.log(user1 === user3);\n *\n * @method Container#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} A container scoped to a particular mapper.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n proxiedMapperMethods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Create a new mapper and register it in this container.\n *\n * @example Container#defineMapper\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container({\n * mapperDefaults: { foo: 'bar' }\n * });\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * console.log(UserMapper.foo);\n *\n * @method Container#defineMapper\n * @param {string} name Name under which to register the new {@link Mapper}.\n * {@link Mapper#name} will be set to this value.\n * @param {object} [opts] Configuration options. Passed to\n * {@link Container#mapperClass} when creating the new {@link Mapper}.\n * @returns {Mapper} The newly created instance of {@link Mapper}.\n * @see Container#as\n * @since 3.0.0\n */\n defineMapper (name, opts) {\n // For backwards compatibility with defineResource\n if (utils.isObject(name)) {\n opts = name\n name = opts.name\n }\n if (!utils.isString(name)) {\n throw utils.err(`${DOMAIN}#defineMapper`, 'name')(400, 'string', name)\n }\n\n // Default values for arguments\n opts || (opts = {})\n // Set Mapper#name\n opts.name = name\n opts.relations || (opts.relations = {})\n\n // Check if the user is overriding the datastore's default mapperClass\n const mapperClass = opts.mapperClass || this.mapperClass\n delete opts.mapperClass\n\n // Apply the datastore's defaults to the options going into the mapper\n utils.fillIn(opts, this.mapperDefaults)\n\n // Instantiate a mapper\n const mapper = this._mappers[name] = new mapperClass(opts) // eslint-disable-line\n mapper.relations || (mapper.relations = {})\n // Make sure the mapper's name is set\n mapper.name = name\n // All mappers in this datastore will share adapters\n mapper._adapters = this.getAdapters()\n\n mapper.datastore = this\n\n mapper.on('all', (...args) => this._onMapperEvent(name, ...args))\n mapper.defineRelations()\n\n return mapper\n },\n\n defineResource (name, opts) {\n console.warn('DEPRECATED: defineResource is deprecated, use defineMapper instead')\n return this.defineMapper(name, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Container#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n */\n getAdapter (name) {\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Container#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || this.mapperDefaults.defaultAdapter\n },\n\n /**\n * Return the registered adapters of this container.\n *\n * @method Container#getAdapters\n * @returns {Adapter}\n * @since 3.0.0\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Return the mapper registered under the specified name.\n *\n * @example Container#getMapper\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * store.getMapper('profile'); // throws Error, there is no mapper with name \"profile\"\n *\n * @method Container#getMapper\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapper (name) {\n const mapper = this.getMapperByName(name)\n if (!mapper) {\n throw utils.err(`${DOMAIN}#getMapper`, name)(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Return the mapper registered under the specified name.\n * Doesn't throw error if mapper doesn't exist.\n *\n * @example Container#getMapperByName\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * console.log(store.getMapper('profile')); // Does NOT throw an error\n *\n * @method Container#getMapperByName\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapperByName (name) {\n return this._mappers[name]\n },\n\n /**\n * Register an adapter on this container under the given name. Adapters\n * registered on a container are shared by all mappers in the container.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n *\n * @method Container#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for all Mappers in this container.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.mapperDefaults.defaultAdapter = name\n utils.forOwn(this._mappers, function (mapper) {\n mapper.defaultAdapter = name\n })\n }\n }\n}\n\nproxiedMapperMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getMapper(name)[method](...args)\n }\n})\n\nComponent.extend(props)\n\n/**\n * Create a subclass of this Container:\n * @example Container.extend\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomContainerClass extends Container {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customContainer = new CustomContainerClass();\n * console.log(customContainer.foo());\n * console.log(CustomContainerClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherContainerClass = Container.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherContainer = new OtherContainerClass();\n * console.log(otherContainer.foo());\n * console.log(OtherContainerClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherContainerClass () {\n * Container.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Container.extend({\n * constructor: AnotherContainerClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherContainer = new AnotherContainerClass();\n * console.log(anotherContainer.created_at);\n * console.log(anotherContainer.foo());\n * console.log(AnotherContainerClass.beep());\n *\n * @method Container.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Container class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport {proxiedMapperMethods, Container} from './Container'\nimport Collection from './Collection'\n\nconst DOMAIN = 'SimpleStore'\nconst proxiedCollectionMethods = [\n /**\n * Wrapper for {@link Collection#add}.\n *\n * @example SimpleStore#add\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('book');\n *\n * // Add one book to the in-memory store:\n * store.add('book', { id: 1, title: 'Respect your Data' });\n * // Add multiple books to the in-memory store:\n * store.add('book', [\n * { id: 2, title: 'Easy data recipes' },\n * { id: 3, title: 'Active Record 101' }\n * ]);\n *\n * @fires SimpleStore#add\n * @method SimpleStore#add\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}.\n * @param {object} [opts] Configuration options. See {@link Collection#add}.\n * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n 'add',\n\n /**\n * Wrapper for {@link Collection#between}.\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = store.between('user', 18, 30, { index: 'age' });\n *\n * @example\n * // Same as above\n * const users = store.between('user', [18], [30], { index: 'age' });\n *\n * @method SimpleStore#between\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {array} leftKeys See {@link Collection#between}.\n * @param {array} rightKeys See {@link Collection#between}.\n * @param {object} [opts] Configuration options. See {@link Collection#between}.\n * @returns {Object[]|Record[]} See {@link Collection#between}.\n * @see Collection#between\n * @see Collection#between\n * @since 3.0.0\n */\n 'between',\n\n /**\n * Wrapper for {@link Collection#createIndex}.\n *\n * @example\n * // Index users by age\n * store.createIndex('user', 'age');\n *\n * @example\n * // Index users by status and role\n * store.createIndex('user', 'statusAndRole', ['status', 'role']);\n *\n * @method SimpleStore#createIndex\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {string} name See {@link Collection#createIndex}.\n * @param {string[]} [fieldList] See {@link Collection#createIndex}.\n * @see Collection#createIndex\n * @see Collection#createIndex\n * @since 3.0.0\n */\n 'createIndex',\n\n /**\n * Wrapper for {@link Collection#filter}.\n *\n * @example SimpleStore#filter\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('post');\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * // Get the draft posts created less than three months ago\n * let posts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * });\n * console.log(posts);\n *\n * // Use a custom filter function\n * posts = store.filter('post', function (post) { return post.id % 2 === 0 });\n *\n * @method SimpleStore#filter\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}.\n * @param {object} [thisArg] See {@link Collection#filter}.\n * @returns {Array} See {@link Collection#filter}.\n * @see Collection#filter\n * @see Collection#filter\n * @since 3.0.0\n */\n 'filter',\n\n /**\n * Wrapper for {@link Collection#get}.\n *\n * @example SimpleStore#get\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('post');\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * console.log(store.get('post', 1)); // {...}\n * console.log(store.get('post', 2)); // undefined\n *\n * @method SimpleStore#get\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Collection#get}.\n * @returns {(Object|Record)} See {@link Collection#get}.\n * @see Collection#get\n * @see Collection#get\n * @since 3.0.0\n */\n 'get',\n\n /**\n * Wrapper for {@link Collection#getAll}.\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' });\n *\n * @example\n * // Same as above\n * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' });\n *\n * @method SimpleStore#getAll\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {...Array} [keyList] See {@link Collection#getAll}.\n * @param {object} [opts] See {@link Collection#getAll}.\n * @returns {Array} See {@link Collection#getAll}.\n * @see Collection#getAll\n * @see Collection#getAll\n * @since 3.0.0\n */\n 'getAll',\n\n /**\n * Wrapper for {@link Collection#prune}.\n *\n * @method SimpleStore#prune\n * @param {object} [opts] See {@link Collection#prune}.\n * @returns {Array} See {@link Collection#prune}.\n * @see Collection#prune\n * @see Collection#prune\n * @since 3.0.0\n */\n 'prune',\n\n /**\n * Wrapper for {@link Collection#query}.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * store.query('user')\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run();\n *\n * @method SimpleStore#query\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @returns {Query} See {@link Collection#query}.\n * @see Collection#query\n * @see Collection#query\n * @since 3.0.0\n */\n 'query',\n\n /**\n * Wrapper for {@link Collection#toJSON}.\n *\n * @example\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * title: { type: 'string' }\n * }\n * }\n * });\n * store.add('post', [\n * { id: 1, status: 'published', title: 'Respect your Data' },\n * { id: 2, status: 'draft', title: 'Connecting to a data source' }\n * ]);\n * console.log(store.toJSON('post'));\n * const draftsJSON = store.query('post')\n * .filter({ status: 'draft' })\n * .mapCall('toJSON')\n * .run();\n *\n * @method SimpleStore#toJSON\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {object} [opts] See {@link Collection#toJSON}.\n * @returns {Array} See {@link Collection#toJSON}.\n * @see Collection#toJSON\n * @see Collection#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Wrapper for {@link Collection#unsaved}.\n *\n * @method SimpleStore#unsaved\n * @returns {Array} See {@link Collection#unsaved}.\n * @see Collection#unsaved\n * @see Collection#unsaved\n * @since 3.0.0\n */\n 'unsaved'\n]\nconst ownMethodsForScoping = [\n 'addToCache',\n 'cachedFind',\n 'cachedFindAll',\n 'cacheFind',\n 'cacheFindAll',\n 'hashQuery'\n]\n\nconst cachedFn = function (name, hashOrId, opts) {\n const cached = this._completedQueries[name][hashOrId]\n if (utils.isFunction(cached)) {\n return cached(name, hashOrId, opts)\n }\n return cached\n}\n\nconst SIMPLESTORE_DEFAULTS = {\n /**\n * Whether to use the pending query if a `find` request for the specified\n * record is currently underway. Can be set to `true`, `false`, or to a\n * function that returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFind\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFind: true,\n\n /**\n * Whether to use the pending query if a `findAll` request for the given query\n * is currently underway. Can be set to `true`, `false`, or to a function that\n * returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFindAll\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFindAll: true\n}\n\n/**\n * The `SimpleStore` class is an extension of {@link Container}. Not only does\n * `SimpleStore` manage mappers, but also collections. `SimpleStore` implements the\n * asynchronous {@link Mapper} methods, such as {@link Mapper#find} and\n * {@link Mapper#create}. If you use the asynchronous `SimpleStore` methods\n * instead of calling them directly on the mappers, then the results of the\n * method calls will be inserted into the store's collections. You can think of\n * a `SimpleStore` as an [Identity Map](https://en.wikipedia.org/wiki/Identity_map_pattern)\n * for the [ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)\n * (the Mappers).\n *\n * ```javascript\n * import { SimpleStore } from 'js-data';\n * ```\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n * const store = new SimpleStore();\n *\n * // SimpleStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n *\n * // SimpleStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user');\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful SimpleStore)\n * return store.find('user', 1); // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1);\n * console.log(user === cachedUser); // true\n * });\n *\n * @class SimpleStore\n * @extends Container\n * @param {object} [opts] Configuration options. See {@link Container}.\n * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link SimpleStore#usePendingFindAll}.\n * @returns {SimpleStore}\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-SimpleStore\",\"Working with the SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction SimpleStore (opts) {\n utils.classCallCheck(this, SimpleStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, SIMPLESTORE_DEFAULTS)\n Container.call(this, opts)\n\n this.collectionClass = this.collectionClass || Collection\n this._collections = {}\n this._pendingQueries = {}\n this._completedQueries = {}\n}\n\nconst props = {\n constructor: SimpleStore,\n\n /**\n * Internal method used to handle Mapper responses.\n *\n * @method SimpleStore#_end\n * @private\n * @param {string} name Name of the {@link Collection} to which to\n * add the data.\n * @param {object} result The result from a Mapper.\n * @param {object} [opts] Configuration options.\n * @returns {(Object|Array)} Result.\n */\n _end (name, result, opts) {\n let data = opts.raw ? result.data : result\n if (data && utils.isFunction(this.addToCache)) {\n data = this.addToCache(name, data, opts)\n if (opts.raw) {\n result.data = data\n } else {\n result = data\n }\n }\n return result\n },\n\n /**\n * Register a new event listener on this SimpleStore.\n *\n * Proxy for {@link Container#on}. If an event was emitted by a Mapper or\n * Collection in the SimpleStore, then the name of the Mapper or Collection will\n * be prepended to the arugments passed to the provided event handler.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a SimpleStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName); // \"post\"\n * console.log(props.id); // undefined\n * console.log(result.id); // 1234\n * });\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id); // 1234\n * });\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * store.on('add', (mapperName, records) => {\n * console.log(records); // [...]\n * });\n *\n * @example\n * // Listen for \"change\" events on a record\n * store.on('change', (mapperName, record, changes) => {\n * console.log(changes); // { changed: { title: 'Modeling your data' } }\n * });\n * post.title = 'Modeling your data';\n *\n * @method SimpleStore#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n */\n\n /**\n * Used to bind to events emitted by collections in this store.\n *\n * @method SimpleStore#_onCollectionEvent\n * @private\n * @param {string} name Name of the collection that emitted the event.\n * @param {...*} [args] Args passed to {@link Collection#emit}.\n */\n _onCollectionEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * This method takes the data received from {@link SimpleStore#find},\n * {@link SimpleStore#findAll}, {@link SimpleStore#update}, etc., and adds the\n * data to the store. _You don't need to call this method directly._\n *\n * If you're using the http adapter and your response data is in an unexpected\n * format, you may need to override this method so the right data gets added\n * to the store.\n *\n * @example\n * const store = new SimpleStore({\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items;\n * }\n * // Now perform default behavior\n * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items;\n * }\n * // Now perform default behavior\n * return super.addToCache(mapperName, data, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#addToCache\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {*} data Data from which data should be selected for add.\n * @param {object} [opts] Configuration options.\n */\n addToCache (name, data, opts) {\n return this.getCollection(name).add(data, opts)\n },\n\n /**\n * Return the store scoped to a particular mapper/collection pair.\n *\n * @example SimpleStore.as\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * const UserMapper = store.defineMapper('user');\n * const UserStore = store.as('user');\n *\n * const user1 = store.createRecord('user', { name: 'John' });\n * const user2 = UserStore.createRecord({ name: 'John' });\n * const user3 = UserMapper.createRecord({ name: 'John' });\n * console.log(user1 === user2);\n * console.log(user2 === user3);\n * console.log(user1 === user3);\n *\n * @method SimpleStore#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} The store, scoped to a particular Mapper/Collection pair.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n const methods = ownMethodsForScoping\n .concat(proxiedMapperMethods)\n .concat(proxiedCollectionMethods)\n\n methods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n props.getCollection = {\n writable: true,\n value () {\n return original.getCollection(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Retrieve a cached `find` result, if any. This method is called during\n * {@link SimpleStore#find} to determine if {@link Mapper#find} needs to be\n * called. If this method returns `undefined` then {@link Mapper#find} will\n * be called. Otherwise {@link SimpleStore#find} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return;\n * }\n * // Otherwise perform default behavior\n * return super.cachedFind(mapperName, id, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cachedFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cachedFind: cachedFn,\n\n /**\n * Retrieve a cached `findAll` result, if any. This method is called during\n * {@link SimpleStore#findAll} to determine if {@link Mapper#findAll} needs to be\n * called. If this method returns `undefined` then {@link Mapper#findAll} will\n * be called. Otherwise {@link SimpleStore#findAll} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined;\n * }\n * // Otherwise perform default behavior\n * return super.cachedFindAll(mapperName, hash, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cachedFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cachedFindAll: cachedFn,\n\n /**\n * Mark a {@link Mapper#find} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `find` entry is\n * added it means subsequent calls to the same Resource with the same `id`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#get} instead of delegating to {@link Mapper#find}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior\n * return super.cacheFind(mapperName, data, id, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cacheFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {*} data The result to cache.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cacheFind (name, data, id, opts) {\n this._completedQueries[name][id] = (name, id, opts) => this.get(name, id)\n },\n\n /**\n * Mark a {@link Mapper#findAll} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `findAll` entry is\n * added it means subsequent calls to the same Resource with the same `query`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#filter} instead of delegating to {@link Mapper#findAll}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior.\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior.\n * return super.cachedFindAll(mapperName, data, hash, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cacheFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {*} data The result to cache.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cacheFindAll (name, data, hash, opts) {\n this._completedQueries[name][hash] = (name, hash, opts) => this.filter(name, utils.fromJson(hash))\n },\n\n /**\n * Remove __all__ records from the in-memory store and reset\n * {@link SimpleStore#_completedQueries}.\n *\n * @method SimpleStore#clear\n * @returns {Object} Object containing all records that were in the store.\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n clear () {\n const removed = {}\n utils.forOwn(this._collections, (collection, name) => {\n removed[name] = collection.removeAll()\n this._completedQueries[name] = {}\n })\n return removed\n },\n\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~beforeCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreate\n * @see SimpleStore~beforeCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback SimpleStore~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see SimpleStore#event:beforeCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~afterCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreate\n * @see SimpleStore~afterCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback SimpleStore~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see SimpleStore#event:afterCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}. Adds the created record to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book {\"author_id\":1234,...}\n * store.create('book', {\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }).then((book) => {\n * console.log(book.id); // 120392\n * console.log(book.title); // \"Respect your Data\"\n * });\n *\n * @fires SimpleStore#beforeCreate\n * @fires SimpleStore#afterCreate\n * @fires SimpleStore#add\n * @method SimpleStore#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} record Passed to {@link Mapper#create}.\n * @param {object} [opts] Passed to {@link Mapper#create}. See\n * {@link Mapper#create} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n create (name, record, opts) {\n opts || (opts = {})\n return Container.prototype.create.call(this, name, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~beforeCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreateMany\n * @see SimpleStore~beforeCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback SimpleStore~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see SimpleStore#event:beforeCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~afterCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreateMany\n * @see SimpleStore~afterCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback SimpleStore~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see SimpleStore#event:afterCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}. Adds the created records to the\n * store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book [{\"author_id\":1234,...},{...}]\n * store.createMany('book', [{\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }, {\n * author_id: 1234,\n * edition: 'Second Edition',\n * title: 'Respect your Data'\n * }]).then((books) => {\n * console.log(books[0].id); // 142394\n * console.log(books[0].title); // \"Respect your Data\"\n * });\n *\n * @fires SimpleStore#beforeCreateMany\n * @fires SimpleStore#afterCreateMany\n * @fires SimpleStore#add\n * @method SimpleStore#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {array} records Passed to {@link Mapper#createMany}.\n * @param {object} [opts] Passed to {@link Mapper#createMany}. See\n * {@link Mapper#createMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n createMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.createMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n defineMapper (name, opts) {\n const self = this\n const mapper = Container.prototype.defineMapper.call(self, name, opts)\n self._pendingQueries[name] = {}\n self._completedQueries[name] = {}\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n\n let collectionOpts = {\n // Make sure the collection has somewhere to store \"added\" timestamps\n _added: {},\n // Give the collection a reference to this SimpleStore\n datastore: self,\n // The mapper tied to the collection\n mapper\n }\n\n if (opts && ('onConflict' in opts)) {\n collectionOpts.onConflict = opts.onConflict\n }\n\n // The SimpleStore uses a subclass of Collection that is \"SimpleStore-aware\"\n const collection = self._collections[name] = new self.collectionClass(null, collectionOpts) // eslint-disable-line\n\n const schema = mapper.schema || {}\n const properties = schema.properties || {}\n // TODO: Make it possible index nested properties?\n utils.forOwn(properties, function (opts, prop) {\n if (opts.indexed) {\n collection.createIndex(prop)\n }\n })\n\n // Create a secondary index on the \"added\" timestamps of records in the\n // collection\n collection.createIndex('addedTimestamps', ['$'], {\n fieldGetter (obj) {\n return collection._added[collection.recordId(obj)]\n }\n })\n\n collection.on('all', function (...args) {\n self._onCollectionEvent(name, ...args)\n })\n\n return mapper\n },\n\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~beforeDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroy\n * @see SimpleStore~beforeDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback SimpleStore~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see SimpleStore#event:beforeDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~afterDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroy\n * @see SimpleStore~afterDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback SimpleStore~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see SimpleStore#event:afterDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}. Removes any destroyed record from the\n * in-memory store. Clears out any {@link SimpleStore#_completedQueries} entries\n * associated with the provided `id`.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' });\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is no longer in the in-memory store\n * console.log(store.get('book', 1234)); // undefined\n *\n * return store.find('book', 1234);\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book); // undefined\n * });\n *\n * @fires SimpleStore#beforeDestroy\n * @fires SimpleStore#afterDestroy\n * @fires SimpleStore#remove\n * @method SimpleStore#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#destroy}.\n * @param {object} [opts] Passed to {@link Mapper#destroy}. See\n * {@link Mapper#destroy} for more configuration options.\n * @returns {Promise} Resolves when the destroy operation completes.\n * @since 3.0.0\n */\n destroy (name, id, opts) {\n opts || (opts = {})\n return Container.prototype.destroy.call(this, name, id, opts).then((result) => {\n const record = this.getCollection(name).remove(id, opts)\n\n if (opts.raw) {\n result.data = record\n } else {\n result = record\n }\n delete this._pendingQueries[name][id]\n delete this._completedQueries[name][id]\n return result\n })\n },\n\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroyAll\n * @see SimpleStore~beforeDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback SimpleStore~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see SimpleStore#event:beforeDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~afterDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroyAll\n * @see SimpleStore~afterDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback SimpleStore~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see SimpleStore#event:afterDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}. Removes any destroyed records from\n * the in-memory store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' });\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is gone from the in-memory store\n * console.log(store.get('book', 1234)); // undefined\n * return store.find('book', 1234);\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book); // undefined\n * });\n *\n * @fires SimpleStore#beforeDestroyAll\n * @fires SimpleStore#afterDestroyAll\n * @fires SimpleStore#remove\n * @method SimpleStore#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] Passed to {@link Mapper#destroyAll}.\n * @param {object} [opts] Passed to {@link Mapper#destroyAll}. See\n * {@link Mapper#destroyAll} for more configuration options.\n * @returns {Promise} Resolves when the delete completes.\n * @since 3.0.0\n */\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return Container.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n const records = this.getCollection(name).removeAll(query, opts)\n\n if (opts.raw) {\n result.data = records\n } else {\n result = records\n }\n const hash = this.hashQuery(name, query, opts)\n delete this._pendingQueries[name][hash]\n delete this._completedQueries[name][hash]\n return result\n })\n },\n\n eject (name, id, opts) {\n console.warn('DEPRECATED: \"eject\" is deprecated, use \"remove\" instead')\n return this.remove(name, id, opts)\n },\n\n ejectAll (name, query, opts) {\n console.warn('DEPRECATED: \"ejectAll\" is deprecated, use \"removeAll\" instead')\n return this.removeAll(name, query, opts)\n },\n\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~beforeFindListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFind\n * @see SimpleStore~beforeFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback SimpleStore~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see SimpleStore#event:beforeFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~afterFindListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFind\n * @see SimpleStore~afterFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback SimpleStore~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see SimpleStore#event:afterFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}. Adds any found record to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /book/1234\n * store.find('book', 1234).then((book) => {\n * // The book record is now in the in-memory store\n * console.log(store.get('book', 1234) === book); // true\n * });\n *\n * @fires SimpleStore#beforeFind\n * @fires SimpleStore#afterFind\n * @fires SimpleStore#add\n * @method SimpleStore#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#find}.\n * @param {object} [opts] Passed to {@link Mapper#find}.\n * @param {boolean} [opts.force] Bypass cacheFind\n * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n find (name, id, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const pendingQuery = this._pendingQueries[name][id]\n const usePendingFind = opts.usePendingFind === undefined ? this.usePendingFind : opts.usePendingFind\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFind) ? usePendingFind.call(this, name, id, opts) : usePendingFind)) {\n return pendingQuery\n }\n const item = this.cachedFind(name, id, opts)\n\n if (opts.force || !item) {\n const promise = this._pendingQueries[name][id] = Container.prototype.find.call(this, name, id, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][id]\n result = this._end(name, result, opts)\n this.cacheFind(name, result, id, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][id]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(item)\n },\n\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~beforeFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFindAll\n * @see SimpleStore~beforeFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback SimpleStore~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see SimpleStore#event:beforeFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~afterFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFindAll\n * @see SimpleStore~afterFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback SimpleStore~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see SimpleStore#event:afterFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#findAll}. Adds any found records to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('movie');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /movie?rating=PG\n * store.find('movie', { rating: 'PG' }).then((movies) => {\n * // The movie records are now in the in-memory store\n * console.log(store.filter('movie'));\n * });\n *\n * @fires SimpleStore#beforeFindAll\n * @fires SimpleStore#afterFindAll\n * @fires SimpleStore#add\n * @method SimpleStore#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] Passed to {@link Mapper.findAll}.\n * @param {object} [opts] Passed to {@link Mapper.findAll}.\n * @param {boolean} [opts.force] Bypass cacheFindAll\n * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n findAll (name, query, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const hash = this.hashQuery(name, query, opts)\n const pendingQuery = this._pendingQueries[name][hash]\n const usePendingFindAll = opts.usePendingFindAll === undefined ? this.usePendingFindAll : opts.usePendingFindAll\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFindAll) ? usePendingFindAll.call(this, name, query, opts) : usePendingFindAll)) {\n return pendingQuery\n }\n\n const items = this.cachedFindAll(name, hash, opts)\n\n if (opts.force || !items) {\n const promise = this._pendingQueries[name][hash] = Container.prototype.findAll.call(this, name, query, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][hash]\n result = this._end(name, result, opts)\n this.cacheFindAll(name, result, hash, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][hash]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(items)\n },\n\n /**\n * Return the {@link Collection} with the given name, if for some\n * reason you need a direct reference to the collection.\n *\n * @method SimpleStore#getCollection\n * @param {string} name Name of the {@link Collection} to retrieve.\n * @returns {Collection}\n * @since 3.0.0\n * @throws {Error} Thrown if the specified {@link Collection} does not\n * exist.\n */\n getCollection (name) {\n const collection = this._collections[name]\n if (!collection) {\n throw utils.err(`${DOMAIN}#getCollection`, name)(404, 'collection')\n }\n return collection\n },\n\n /**\n * Hashing function used to cache {@link SimpleStore#find} and\n * {@link SimpleStore#findAll} requests. This method simply JSONifies the\n * `query` argument passed to {@link SimpleStore#find} or\n * {@link SimpleStore#findAll}.\n *\n * Override this method for custom hashing behavior.\n * @method SimpleStore#hashQuery\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @param {object} query The `query` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @returns {string} The JSONified `query`.\n * @since 3.0.0\n */\n hashQuery (name, query, opts) {\n return utils.toJson(query || {})\n },\n\n inject (name, records, opts) {\n console.warn('DEPRECATED: \"inject\" is deprecated, use \"add\" instead')\n return this.add(name, records, opts)\n },\n\n /**\n * Wrapper for {@link Collection#remove}. Removes the specified\n * {@link Record} from the store.\n *\n * @example SimpleStore#remove\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('book');\n * console.log(store.getAll('book').length);\n * store.add('book', { id: 1234 });\n * console.log(store.getAll('book').length);\n * store.remove('book', 1234);\n * console.log(store.getAll('book').length);\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#remove\n * @param {string} name The name of the {@link Collection} to target.\n * @param {string|number} id The primary key of the {@link Record} to remove.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n remove (name, id, opts) {\n const record = this.getCollection(name).remove(id, opts)\n if (record) {\n this.removeRelated(name, [record], opts)\n }\n return record\n },\n\n /**\n * Wrapper for {@link Collection#removeAll}. Removes the selected\n * {@link Record}s from the store.\n *\n * @example SimpleStore#removeAll\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('movie');\n * console.log(store.getAll('movie').length);\n * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' });\n * console.log(store.getAll('movie').length);\n * store.removeAll('movie', { rating: 'R' });\n * console.log(store.getAll('movie').length);\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeAll\n * @param {string} name The name of the {@link Collection} to target.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}s, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n removeAll (name, query, opts) {\n if (!query || !Object.keys(query).length) {\n this._completedQueries[name] = {}\n } else {\n this._completedQueries[name][this.hashQuery(name, query, opts)] = undefined\n }\n const records = this.getCollection(name).removeAll(query, opts)\n if (records.length) {\n this.removeRelated(name, records, opts)\n }\n return records\n },\n\n /**\n * Remove from the store {@link Record}s that are related to the provided\n * {@link Record}(s).\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeRelated\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Record|Record[]} records {@link Record}s whose relations are to be\n * removed.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove\n * from the store.\n * @since 3.0.0\n */\n removeRelated (name, records, opts) {\n if (!utils.isArray(records)) {\n records = [records]\n }\n utils.forEachRelation(this.getMapper(name), opts, (def, optsCopy) => {\n records.forEach((record) => {\n let relatedData\n let query\n if (def.foreignKey && (def.type === hasOneType || def.type === hasManyType)) {\n query = { [def.foreignKey]: def.getForeignKey(record) }\n } else if (def.type === hasManyType && def.localKeys) {\n query = {\n where: {\n [def.getRelation().idAttribute]: {\n 'in': utils.get(record, def.localKeys)\n }\n }\n }\n } else if (def.type === hasManyType && def.foreignKeys) {\n query = {\n where: {\n [def.foreignKeys]: {\n 'contains': def.getForeignKey(record)\n }\n }\n }\n } else if (def.type === belongsToType) {\n relatedData = this.remove(def.relation, def.getForeignKey(record), optsCopy)\n }\n if (query) {\n relatedData = this.removeAll(def.relation, query, optsCopy)\n }\n if (relatedData) {\n if (utils.isArray(relatedData) && !relatedData.length) {\n return\n }\n if (def.type === hasOneType) {\n relatedData = relatedData[0]\n }\n def.setLocalField(record, relatedData)\n }\n })\n })\n },\n\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~beforeUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdate\n * @see SimpleStore~beforeUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback SimpleStore~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see SimpleStore#event:beforeUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~afterUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdate\n * @see SimpleStore~afterUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback SimpleStore~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see SimpleStore#event:afterUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}. Adds the updated {@link Record} to the\n * store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post/1234 {\"status\":\"published\"}\n * store.update('post', 1, { status: 'published' }).then((post) => {\n * // The post record has also been updated in the in-memory store\n * console.log(store.get('post', 1234));\n * });\n *\n * @fires SimpleStore#beforeUpdate\n * @fires SimpleStore#afterUpdate\n * @fires SimpleStore#add\n * @method SimpleStore#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#update}.\n * @param {object} record Passed to {@link Mapper#update}.\n * @param {object} [opts] Passed to {@link Mapper#update}. See\n * {@link Mapper#update} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n update (name, id, record, opts) {\n opts || (opts = {})\n return Container.prototype.update.call(this, name, id, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateAll\n * @see SimpleStore~beforeUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback SimpleStore~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see SimpleStore#event:beforeUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~afterUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateAll\n * @see SimpleStore~afterUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback SimpleStore~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see SimpleStore#event:afterUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post?author_id=1234 {\"status\":\"published\"}\n * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.filter('posts', { author_id: 1234 }));\n * });\n *\n * @fires SimpleStore#beforeUpdateAll\n * @fires SimpleStore#afterUpdateAll\n * @fires SimpleStore#add\n * @method SimpleStore#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} props Passed to {@link Mapper#updateAll}.\n * @param {object} [query] Passed to {@link Mapper#updateAll}.\n * @param {object} [opts] Passed to {@link Mapper#updateAll}. See\n * {@link Mapper#updateAll} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateAll (name, props, query, opts) {\n opts || (opts = {})\n return Container.prototype.updateAll.call(this, name, props, query, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateMany\n * @see SimpleStore~beforeUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback SimpleStore~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see SimpleStore#event:beforeUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~afterUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateMany\n * @see SimpleStore~afterUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback SimpleStore~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see SimpleStore#event:afterUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post [{\"id\":3,status\":\"published\"},{\"id\":4,status\":\"published\"}]\n * store.updateMany('post', [\n * { id: 3, status: 'published' },\n * { id: 4, status: 'published' }\n * ]).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.getAll('post', 3, 4));\n * });\n *\n * @fires SimpleStore#beforeUpdateMany\n * @fires SimpleStore#afterUpdateMany\n * @fires SimpleStore#add\n * @method SimpleStore#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}.\n * @param {object} [opts] Passed to {@link Mapper#updateMany}. See\n * {@link Mapper#updateMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.updateMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n }\n}\n\nproxiedCollectionMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getCollection(name)[method](...args)\n }\n})\n\nexport default Container.extend(props)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link SimpleStore~changeListener} on how to listen for this event.\n *\n * @event SimpleStore#change\n * @see SimpleStore~changeListener\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:change} event.\n *\n * @example\n * function onChange (mapperName, record, changes) {\n * // do something\n * }\n * store.on('change', onChange);\n *\n * @callback SimpleStore~changeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record} record The Record that changed.\n * @param {object} changes The changes.\n * @see SimpleStore#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the in-memory store. See\n * {@link SimpleStore~addListener} on how to listen for this event.\n *\n * @event SimpleStore#add\n * @see SimpleStore~addListener\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:add} event.\n *\n * @example\n * function onAdd (mapperName, recordOrRecords) {\n * // do something\n * }\n * store.on('add', onAdd);\n *\n * @callback SimpleStore~addListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} The Record or Records that were added.\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the in-memory store. See\n * {@link SimpleStore~removeListener} for how to listen for this event.\n *\n * @event SimpleStore#remove\n * @see SimpleStore~removeListener\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:remove} event.\n *\n * @example\n * function onRemove (mapperName, recordsOrRecords) {\n * // do something\n * }\n * store.on('remove', onRemove);\n *\n * @callback SimpleStore~removeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} Record or Records that were removed.\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this SimpleStore:\n * @example SimpleStore.extend\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSimpleStoreClass extends SimpleStore {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSimpleStore = new CustomSimpleStoreClass();\n * console.log(customSimpleStore.foo());\n * console.log(CustomSimpleStoreClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSimpleStoreClass = SimpleStore.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const otherSimpleStore = new OtherSimpleStoreClass();\n * console.log(otherSimpleStore.foo());\n * console.log(OtherSimpleStoreClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSimpleStoreClass () {\n * SimpleStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * SimpleStore.extend({\n * constructor: AnotherSimpleStoreClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherSimpleStore = new AnotherSimpleStoreClass();\n * console.log(anotherSimpleStore.created_at);\n * console.log(anotherSimpleStore.foo());\n * console.log(AnotherSimpleStoreClass.beep());\n *\n * @method SimpleStore.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this SimpleStore class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport './decorators'\nimport Collection from './Collection'\n\nconst DOMAIN = 'LinkedCollection'\n\n/**\n * Extends {@link Collection}. Used by a {@link DataStore} to implement an\n * Identity Map.\n *\n * ```javascript\n * import {LinkedCollection} from 'js-data'\n * ```\n *\n * @class LinkedCollection\n * @extends Collection\n * @param {array} [records] Initial set of records to insert into the\n * collection. See {@link Collection}.\n * @param {object} [opts] Configuration options. See {@link Collection}.\n * @returns {Mapper}\n */\nfunction LinkedCollection (records, opts) {\n utils.classCallCheck(this, LinkedCollection)\n // Make sure this collection has somewhere to store \"added\" timestamps\n Object.defineProperties(this, {\n _added: {\n value: {}\n },\n datastore: {\n writable: true,\n value: undefined\n }\n })\n\n Collection.call(this, records, opts)\n\n // Make sure this collection has a reference to a datastore\n if (!this.datastore) {\n throw utils.err(`new ${DOMAIN}`, 'opts.datastore')(400, 'DataStore', this.datastore)\n }\n}\n\nexport default Collection.extend({\n constructor: LinkedCollection,\n\n _addMeta (record, timestamp) {\n // Track when this record was added\n this._added[this.recordId(record)] = timestamp\n\n if (utils.isFunction(record._set)) {\n record._set('$', timestamp)\n }\n },\n\n _clearMeta (record) {\n delete this._added[this.recordId(record)]\n if (utils.isFunction(record._set)) {\n record._set('$') // unset\n }\n },\n\n _onRecordEvent (...args) {\n Collection.prototype._onRecordEvent.apply(this, args)\n const event = args[0]\n // This is a very brute force method\n // Lots of room for optimization\n if (utils.isString(event) && event.indexOf('change') === 0) {\n this.updateIndexes(args[1])\n }\n },\n\n add (records, opts) {\n const mapper = this.mapper\n const timestamp = new Date().getTime()\n const singular = utils.isObject(records) && !utils.isArray(records)\n\n if (singular) {\n records = [records]\n }\n records = Collection.prototype.add.call(this, records, opts)\n\n if (mapper.relationList.length && records.length) {\n // Check the currently visited record for relations that need to be\n // inserted into their respective collections.\n mapper.relationList.forEach(function (def) {\n def.addLinkedRecords(records)\n })\n }\n\n records.forEach((record) => this._addMeta(record, timestamp))\n\n return singular ? records[0] : records\n },\n\n remove (idOrRecord, opts) {\n const mapper = this.mapper\n const record = Collection.prototype.remove.call(this, idOrRecord, opts)\n if (record) {\n this._clearMeta(record)\n }\n\n if (mapper.relationList.length && record) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, [record])\n })\n }\n\n return record\n },\n\n removeAll (query, opts) {\n const mapper = this.mapper\n const records = Collection.prototype.removeAll.call(this, query, opts)\n records.forEach(this._clearMeta, this)\n\n if (mapper.relationList.length && records.length) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, records)\n })\n }\n\n return records\n }\n})\n\n/**\n * Create a subclass of this LinkedCollection:\n *\n * @example LinkedCollection.extend\n * const JSData = require('js-data');\n * const { LinkedCollection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomLinkedCollectionClass extends LinkedCollection {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customLinkedCollection = new CustomLinkedCollectionClass();\n * console.log(customLinkedCollection.foo());\n * console.log(CustomLinkedCollectionClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherLinkedCollectionClass = LinkedCollection.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherLinkedCollection = new OtherLinkedCollectionClass();\n * console.log(otherLinkedCollection.foo());\n * console.log(OtherLinkedCollectionClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherLinkedCollectionClass () {\n * LinkedCollection.call(this);\n * this.created_at = new Date().getTime();\n * }\n * LinkedCollection.extend({\n * constructor: AnotherLinkedCollectionClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherLinkedCollection = new AnotherLinkedCollectionClass();\n * console.log(anotherLinkedCollection.created_at);\n * console.log(anotherLinkedCollection.foo());\n * console.log(AnotherLinkedCollectionClass.beep());\n *\n * @method LinkedCollection.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this LinkedCollection class.\n * @since 3.0.0\n */\n","import utils, { safeSetLink, safeSetProp } from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport SimpleStore from './SimpleStore'\nimport LinkedCollection from './LinkedCollection'\n\nconst DATASTORE_DEFAULTS = {\n /**\n * Whether in-memory relations should be unlinked from records after they are\n * destroyed.\n *\n * @default true\n * @name DataStore#unlinkOnDestroy\n * @since 3.0.0\n * @type {boolean}\n */\n unlinkOnDestroy: true\n}\n\n/**\n * The `DataStore` class is an extension of {@link SimpleStore}. Not only does\n * `DataStore` manage mappers and store data in collections, it uses the\n * {@link LinkedCollection} class to link related records together in memory.\n *\n * ```javascript\n * import { DataStore } from 'js-data';\n * ```\n *\n * @example\n * import { DataStore } from 'js-data';\n * import HttpAdapter from 'js-data-http';\n * const store = new DataStore();\n *\n * // DataStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n *\n * // DataStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user');\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful DataStore)\n * return store.find('user', 1); // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1);\n * console.log(user === cachedUser); // true\n * });\n *\n * @class DataStore\n * @extends SimpleStore\n * @param {object} [opts] Configuration options. See {@link SimpleStore}.\n * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link DataStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link DataStore#usePendingFindAll}.\n * @returns {DataStore}\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-datastore\",\"Working with the DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction DataStore (opts) {\n utils.classCallCheck(this, DataStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, DATASTORE_DEFAULTS)\n opts.collectionClass || (opts.collectionClass = LinkedCollection)\n SimpleStore.call(this, opts)\n}\n\nconst props = {\n constructor: DataStore,\n\n defineMapper (name, opts) {\n // Complexity of this method is beyond simply using => functions to bind context\n const self = this\n const mapper = SimpleStore.prototype.defineMapper.call(self, name, opts)\n const idAttribute = mapper.idAttribute\n const collection = this.getCollection(name)\n\n mapper.relationList.forEach(function (def) {\n const relation = def.relation\n const localField = def.localField\n const path = `links.${localField}`\n const foreignKey = def.foreignKey\n const type = def.type\n const updateOpts = { index: foreignKey }\n let descriptor\n\n const getter = function () { return this._get(path) }\n\n if (type === belongsToType) {\n if (!collection.indexes[foreignKey]) {\n collection.createIndex(foreignKey)\n }\n\n descriptor = {\n get: getter,\n // e.g. profile.user = someUser\n // or comment.post = somePost\n set (record) {\n // e.g. const otherUser = profile.user\n const currentParent = this._get(path)\n // e.g. profile.user === someUser\n if (record === currentParent) {\n return currentParent\n }\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n\n // e.g. profile.user !== someUser\n // or comment.post !== somePost\n if (currentParent && inverseDef) {\n this.removeInverseRelation(currentParent, id, inverseDef, idAttribute)\n }\n if (record) {\n // e.g. profile.user = someUser\n const relatedIdAttribute = def.getRelation().idAttribute\n const relatedId = utils.get(record, relatedIdAttribute)\n\n // Prefer store record\n if (relatedId !== undefined && this._get('$')) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n // e.g. profile.user = someUser\n // or comment.post = somePost\n safeSetLink(this, localField, record)\n safeSetProp(this, foreignKey, relatedId)\n collection.updateIndex(this, updateOpts)\n\n if (inverseDef) {\n this.setupInverseRelation(record, id, inverseDef, idAttribute)\n }\n } else {\n // Unset in-memory link only\n // e.g. profile.user = undefined\n // or comment.post = undefined\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n\n let foreignKeyDescriptor = Object.getOwnPropertyDescriptor(mapper.recordClass.prototype, foreignKey)\n if (!foreignKeyDescriptor) {\n foreignKeyDescriptor = {\n enumerable: true\n }\n }\n const originalGet = foreignKeyDescriptor.get\n foreignKeyDescriptor.get = function () {\n if (originalGet) {\n return originalGet.call(this)\n }\n return this._get(`props.${foreignKey}`)\n }\n const originalSet = foreignKeyDescriptor.set\n foreignKeyDescriptor.set = function (value) {\n if (originalSet) {\n originalSet.call(this, value)\n }\n const currentParent = utils.get(this, localField)\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n const currentParentId = currentParent ? utils.get(currentParent, def.getRelation().idAttribute) : undefined\n\n if (currentParent && currentParentId !== undefined && currentParentId !== value) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n }\n\n safeSetProp(this, foreignKey, value)\n collection.updateIndex(this, updateOpts)\n\n if ((value === undefined || value === null)) {\n if (currentParentId !== undefined) {\n // Unset locals\n utils.set(this, localField, undefined)\n }\n } else if (this._get('$')) {\n const storeRecord = self.get(relation, value)\n if (storeRecord) {\n utils.set(this, localField, storeRecord)\n }\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, foreignKey, foreignKeyDescriptor)\n } else if (type === hasManyType) {\n const localKeys = def.localKeys\n const foreignKeys = def.foreignKeys\n\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n\n descriptor = {\n get () {\n let current = getter.call(this)\n if (!current) {\n this._set(path, [])\n }\n return getter.call(this)\n },\n // e.g. post.comments = someComments\n // or user.groups = someGroups\n // or group.users = someUsers\n set (records) {\n if (records && !utils.isArray(records)) {\n records = [records]\n }\n const id = utils.get(this, idAttribute)\n const relatedIdAttribute = def.getRelation().idAttribute\n const inverseDef = def.getInverse(mapper)\n const inverseLocalField = inverseDef.localField\n const current = this._get(path) || []\n const toLink = []\n const toLinkIds = {}\n\n if (records) {\n records.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n const currentParent = utils.get(record, inverseLocalField)\n if (currentParent && currentParent !== this) {\n const currentChildrenOfParent = utils.get(currentParent, localField)\n // e.g. somePost.comments.remove(comment)\n if (relatedId === undefined) {\n utils.remove(currentChildrenOfParent, (child) => child === record)\n } else {\n utils.remove(currentChildrenOfParent, (child) => child === record || relatedId === utils.get(child, relatedIdAttribute))\n }\n }\n if (relatedId !== undefined) {\n if (this._get('$')) {\n // Prefer store record\n record = self.get(relation, relatedId) || record\n }\n // e.g. toLinkIds[comment.id] = comment\n toLinkIds[relatedId] = record\n }\n toLink.push(record)\n })\n }\n\n // e.g. post.comments = someComments\n if (foreignKey) {\n current.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(record) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update (unset) inverse relation\n if (records) {\n // e.g. comment.post_id = undefined\n safeSetProp(record, foreignKey, undefined)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n }\n // e.g. comment.post = undefined\n safeSetLink(record, inverseLocalField, undefined)\n }\n })\n toLink.forEach((record) => {\n // Update (set) inverse relation\n // e.g. comment.post_id = post.id\n safeSetProp(record, foreignKey, id)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n // e.g. comment.post = post\n safeSetLink(record, inverseLocalField, this)\n })\n } else if (localKeys) {\n // Update locals\n // e.g. group.users = someUsers\n // Update (set) inverse relation\n const ids = toLink.map((child) => utils.get(child, relatedIdAttribute)).filter((id) => id !== undefined)\n // e.g. group.user_ids = [1,2,3,...]\n utils.set(this, localKeys, ids)\n // Update (unset) inverse relation\n if (inverseDef.foreignKeys) {\n current.forEach((child) => {\n const relatedId = utils.get(child, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(child) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update inverse relation\n // safeSetLink(child, inverseLocalField, undefined)\n const parents = utils.get(child, inverseLocalField) || []\n // e.g. someUser.groups.remove(group)\n if (id === undefined) {\n utils.remove(parents, (parent) => parent === this)\n } else {\n utils.remove(parents, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n }\n })\n toLink.forEach((child) => {\n // Update (set) inverse relation\n const parents = utils.get(child, inverseLocalField)\n // e.g. someUser.groups.push(group)\n if (id === undefined) {\n utils.noDupeAdd(parents, this, (parent) => parent === this)\n } else {\n utils.noDupeAdd(parents, this, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n })\n }\n } else if (foreignKeys) {\n // e.g. user.groups = someGroups\n // Update (unset) inverse relation\n current.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n // e.g. someGroup.user_ids.remove(user.id)\n utils.remove(ids, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n // e.g. someGroup.users.remove(user)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n // Update (set) inverse relation\n toLink.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n utils.noDupeAdd(ids, id, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n }\n\n this._set(path, toLink)\n return toLink\n }\n }\n } else if (type === hasOneType) {\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n descriptor = {\n get: getter,\n // e.g. user.profile = someProfile\n set (record) {\n const current = this._get(path)\n if (record === current) {\n return current\n }\n const inverseLocalField = def.getInverse(mapper).localField\n // Update (unset) inverse relation\n if (current) {\n safeSetProp(current, foreignKey, undefined)\n self.getCollection(relation).updateIndex(current, updateOpts)\n safeSetLink(current, inverseLocalField, undefined)\n }\n if (record) {\n const relatedId = utils.get(record, def.getRelation().idAttribute)\n // Prefer store record\n if (relatedId !== undefined) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n safeSetLink(this, localField, record)\n\n // Update (set) inverse relation\n safeSetProp(record, foreignKey, utils.get(this, idAttribute))\n self.getCollection(relation).updateIndex(record, updateOpts)\n safeSetLink(record, inverseLocalField, this)\n } else {\n // Unset locals\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n }\n\n if (descriptor) {\n descriptor.enumerable = def.enumerable === undefined ? false : def.enumerable\n if (def.get) {\n let origGet = descriptor.get\n descriptor.get = function () {\n return def.get(def, this, (...args) => origGet.apply(this, args))\n }\n }\n if (def.set) {\n let origSet = descriptor.set\n descriptor.set = function (related) {\n return def.set(def, this, related, (value) => origSet.call(this, value === undefined ? related : value))\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, localField, descriptor)\n }\n })\n\n return mapper\n },\n\n destroy (name, id, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroy.call(this, name, id, opts).then((result) => {\n let record\n if (opts.raw) {\n record = result.data\n } else {\n record = result\n }\n\n if (record && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n utils.set(record, def.localField, undefined)\n })\n }\n return result\n })\n },\n\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n let records\n if (opts.raw) {\n records = result.data\n } else {\n records = result\n }\n\n if (records && records.length && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n records.forEach((record) => {\n utils.set(record, def.localField, undefined)\n })\n })\n }\n return result\n })\n }\n}\n\nexport default SimpleStore.extend(props)\n\n/**\n * Create a subclass of this DataStore:\n * @example DataStore.extend\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomDataStoreClass extends DataStore {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customDataStore = new CustomDataStoreClass();\n * console.log(customDataStore.foo());\n * console.log(CustomDataStoreClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherDataStoreClass = DataStore.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherDataStore = new OtherDataStoreClass();\n * console.log(otherDataStore.foo());\n * console.log(OtherDataStoreClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherDataStoreClass () {\n * DataStore.call(this);\n * this.created_at = new Date().getTime();\n * }\n * DataStore.extend({\n * constructor: AnotherDataStoreClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherDataStore = new AnotherDataStoreClass();\n * console.log(anotherDataStore.created_at);\n * console.log(anotherDataStore.foo());\n * console.log(AnotherDataStoreClass.beep());\n *\n * @method DataStore.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this DataStore class.\n * @since 3.0.0\n */\n","/**\n * Registered as `js-data` in NPM and Bower.\n *\n * Also available from CDN.JS and JSDelivr.\n *\n * @module js-data\n *\n * @example Install from NPM\n * npm i --save js-data@beta\n * @example Install from Bower\n * bower i --save js-data@3.0.0-beta.1\n * @example Install from CDN.JS\n * \n * @example Install from JSDelivr\n * \n * @example Load into your app via script tag\n * \n * \n * @example Load into your app via CommonJS\n * var JSData = require('js-data');\n * @example Load into your app via ES2015 Modules\n * import * as JSData from 'js-data';\n * @example Load into your app via AMD\n * define('myApp', ['js-data'], function (JSData) { ... });\n */\n\n/**\n * JSData's utility methods.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('foo')); // true\n *\n * @name module:js-data.utils\n * @property {Function} Promise See {@link utils.Promise}.\n * @see utils\n * @since 3.0.0\n * @type {Object}\n */\nimport utils from './utils'\n\n/**\n * JSData's {@link Collection} class.\n *\n * @example\n * import { Collection } from 'js-data';\n * const collection = new Collection();\n *\n * @name module:js-data.Collection\n * @see Collection\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#collection\",\"Components of JSData: Collection\"]\n * @type {Constructor}\n */\nimport Collection from './Collection'\n\n/**\n * JSData's {@link Component} class. Most components in JSData extend this\n * class.\n *\n * @example\n * import { Component } from 'js-data';\n * // Make a custom component.\n * const MyComponent = Component.extend({\n * myMethod (someArg) { ... }\n * });\n *\n * @name module:js-data.Component\n * @see Component\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Component from './Component'\n\n/**\n * JSData's {@link Container} class. Defines and manages {@link Mapper}s. Used\n * in Node.js and in the browser, though in the browser you may want to use\n * {@link DataStore} instead.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n *\n * @name module:js-data.Container\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#container\",\"Components of JSData: Container\"]\n * @type {Constructor}\n */\nimport {Container} from './Container'\n\n/**\n * JSData's {@link DataStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import { DataStore } from 'js-data';\n * const store = new DataStore();\n *\n * @name module:js-data.DataStore\n * @see DataStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @type {Constructor}\n */\nimport DataStore from './DataStore'\n\n/**\n * JSData's {@link Index} class, based on [mindex]{@link https://github.com/internalfx/mindex}.\n *\n * @name module:js-data.Index\n * @see Index\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Index from '../lib/mindex/index'\n\n/**\n * JSData's {@link LinkedCollection} class. Used by the {@link DataStore}\n * component. If you need to create a collection manually, you should probably\n * use the {@link Collection} class.\n *\n * @name module:js-data.LinkedCollection\n * @see DataStore\n * @see LinkedCollection\n * @since 3.0.0\n * @type {Constructor}\n */\nimport LinkedCollection from './LinkedCollection'\n\n/**\n * JSData's {@link Mapper} class. The core of the ORM.\n *\n * @example Recommended use\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n *\n * @example Create Mapper manually\n * import { Mapper } from 'js-data';\n * const UserMapper = new Mapper({ name: 'user' });\n *\n * @name module:js-data.Mapper\n * @see Container\n * @see Mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @type {Constructor}\n */\nimport Mapper from './Mapper'\n\n/**\n * JSData's {@link Query} class. Used by the {@link Collection} component.\n *\n * @name module:js-data.Query\n * @see Query\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Query from './Query'\n\n/**\n * JSData's {@link Record} class.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n *\n * @name module:js-data.Record\n * @see Record\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#record\",\"Components of JSData: Record\"]\n * @type {Constructor}\n */\nimport Record from './Record'\n\n/**\n * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04.\n *\n * @example\n * import { Container, Schema } from 'js-data';\n * const userSchema = new Schema({\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * });\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: userSchema\n * });\n *\n * @name module:js-data.Schema\n * @see Schema\n * @see http://json-schema.org/\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#schema\",\"Components of JSData: schema\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/schemas\",\"JSData's Schema Syntax\"]\n * @type {Constructor}\n */\nimport Schema from './Schema'\n\n/**\n * JSData's {@link Settable} class.\n *\n * @example\n * import { Settable } from 'js-data';\n * const obj = new Settable();\n * obj.set('secret', 'value');\n * console.log(JSON.stringify(obj)); // {}\n *\n * @name module:js-data.Settable\n * @see Settable\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Settable from './Settable'\n\n/**\n * JSData's {@link SimpleStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * const store = new SimpleStore();\n *\n * @name module:js-data.SimpleStore\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @type {Constructor}\n */\nimport SimpleStore from './SimpleStore'\n\n/**\n * Describes the version of this `JSData` object.\n *\n * @example\n * console.log(JSData.version.full); // \"3.0.0-beta.1\"\n *\n * @name version\n * @memberof module:js-data\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n * @since 2.0.0\n * @type {Object}\n */\nexport const version = '<%= version %>'\n\nexport * from './decorators'\n\nexport {\n Collection,\n Component,\n Container,\n DataStore,\n Index,\n LinkedCollection,\n Mapper,\n Query,\n Record,\n Schema,\n Settable,\n SimpleStore,\n utils\n}\n"],"names":["DOMAIN","INFINITY","MAX_INTEGER","BOOL_TAG","DATE_TAG","FUNC_TAG","NUMBER_TAG","OBJECT_TAG","REGEXP_TAG","STRING_TAG","objToString","Object","prototype","toString","PATH","ERRORS","arguments","toInteger","value","sign","remainder","toStr","call","isPlainObject","constructor","mkdirP","object","path","parts","split","forEach","key","utils","Promise","dest","src","forOwn","undefined","isFunction","indexOf","opts","def","fn","thisArg","relationName","relation","containedName","index","with","_getIndex","localField","withAll","optsCopy","fillIn","getRelation","slice","_activeWith","splice","i","length","substr","list","_relation","isObject","target","props","map","keys","propName","descriptor","getOwnPropertyDescriptor","enumerable","defineProperties","newObject","oldObject","diff","diffObjects","diffCount","added","removed","changed","instance","ctor","err","name","from","to","stackFrom","stackTo","blacklist","plain","isArray","copy","isDate","Date","getTime","isRegExp","RegExp","source","match","lastIndex","create","getPrototypeOf","push","result","hasOwnProperty","isBlacklisted","existing","deepFillIn","deepMixIn","equalsFn","ignore","deepEqual","newKeys","filter","oldKeys","oldValue","newValue","a","b","domain","code","prefix","message","apply","Array","Error","getter","setter","_events","events","args","type","shift","listeners","f","c","all","unshift","func","classProps","superClass","subClass","classCallCheck","obj","setPrototypeOf","strictEs6Class","__proto__","defineProperty","addHiddenPropsToTarget","array","record","mapper","relationList","_forRelation","len","json","isString","JSON","parse","prop","last","pop","isCtor","__super__","array1","array2","item","matches","test","isNumber","log","level","debug","toUpperCase","console","findIndex","_props","reduce","reject","resolve","_path","set","exec","_equal","stringify","safeSetProp","field","_set","safeSetLink","Settable","get","unset","extend","Component","writable","logify","eventify","_listeners","INDEX_ERR","reserved","escapeRegExp","percentRegExp","underscoreRegExp","escape","pattern","replace","Query","collection","data","where","fields","ops","predicates","clause","expr","op","groups","_where","prev","parser","_applyWhereFromArray","_applyWhereFromObject","group","isOr","keep","first","charAt","evaluate","_testArrayGroup","_testObjectGroup","leftKeys","rightKeys","getIndex","between","orderBy","cA","cB","temp","compare","predicate","like","query","getData","sort","skip","offset","limit","forEachFn","keyList","concat","getAll","flags","num","Math","min","mapFn","funcName","intersection","belongsToType","hasManyType","hasOneType","Relation","relatedMapper","options","TYPE_NAME","validateOptions","canAutoAddLinks","add","relatedCollection","datastore","getCollection","related","DOMAIN_ERR","foreignKey","localKey","relationFields","idAttribute","relatedRecord","_setForeignKey","relatedRecords","relatedData","inverse","findInverseRelation","isInversedTo","records","getLocalField","linkRecord","isEmptyLinks","canFindLinkFor","findExistingLinksFor","setLocalField","relatedId","unsaved","setForeignKey","id","relationData","is","createRecord","createLinked","then","BelongsToRelation","HasManyRelation","localKeys","foreignKeys","hasForeignKeys","recordId","ids","findExistingLinksByForeignKey","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","HasOneRelation","RelationType","belongsTo","assignTo","hasMany","hasOne","superMethod","store","bind","creatingPath","noValidatePath","keepChangeHistoryPath","previousPath","Record","noValidate","keepChangeHistory","validateOnSet","toJSON","plainCopy","_get","_mapper","quickHasChanges","areDifferent","validate","currentParent","inverseDef","children","remove","child","noDupeAdd","relations","_","adapter","getAdapterName","dbg","tasks","task","forEachRelation","raw","load","isSorN","previous","preserve","commit","postProcess","changesOnly","changes","silent","hashCode","insertAt","removeAt","binarySearch","lo","hi","compared","mid","Index","fieldList","fieldGetter","isIndex","values","pos","found","dataLocation","newIndex","results","order","cb","visitAll","_between","leftKey","rightKey","leftInclusive","rightInclusive","currKey","peek","isUnique","removeRecord","j","insertRecord","COLLECTION_DEFAULTS","Collection","queryClass","emitRecordEvents","emit","beforeAdd","singular","onConflict","existingNoValidate","commitOnMerge","updateIndexes","indexes","on","_onRecordEvent","afterAdd","run","instances","removeAll","Ctor","initialValue","idOrRecord","beforeRemove","off","afterRemove","queryOrRecords","beforeRemoveAll","afterRemoveAll","mapCall","updateRecord","types","isBoolean","isInteger","isNull","segmentToString","segment","str","makePath","segments","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","schema","max","minLengthCommon","validationKeywords","allErrors","allOf","_schema","validated","anyOf","possibleValues","join","items","checkingTuple","maximum","exclusiveMaximum","maxProperties","minimum","exclusiveMinimum","minProperties","multipleOf","not","oneOf","additionalProperties","properties","patternProperties","toValidate","omit","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","changingPath","changedPath","changeHistoryPath","eventIdPath","silentPath","validationFailureMsg","numeric","Schema","definition","_definition","extends","validationKeyword","unsetter","track","makeDescriptor","hasSet","orig","applyDefaults","keyPath","originalGet","_unset","error","current","changing","setTimeout","changeRecord","timestamp","changeHistory","originalSet","pick","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","LIFECYCLE_METHODS","MAPPER_DEFAULTS","Mapper","recordClass","methods","isPrototypeOf","applySchema","_data","wrap","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","_commitChanges","_end","recordOrRecords","newValues","isRequiresParentId","createParentRecord","context","originalProps","isRequiresChildId","createChildRecord","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","ensureLinkedDataHasProperType","RecordCtor","method","config","lifecycleMethods","upper","before","after","defaults","_value","beforeAssign","adapterArgs","getAdapter","_result","getAdapters","defaultAdapter","_adapters","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","conversionOptions","pass","_opts","_record","some","_name","getMapperByName","getMapper","proxiedMapperMethods","Container","mapperDefaults","mapperClass","original","_mappers","_onMapperEvent","defineRelations","warn","defineMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","_completedQueries","SIMPLESTORE_DEFAULTS","SimpleStore","collectionClass","_collections","_pendingQueries","addToCache","hash","fromJson","self","collectionOpts","indexed","createIndex","_added","_onCollectionEvent","destroy","destroyAll","hashQuery","pendingQuery","usePendingFind","cachedFind","force","promise","find","cacheFind","usePendingFindAll","cachedFindAll","findAll","cacheFindAll","toJson","removeRelated","getForeignKey","update","updateAll","updateMany","LinkedCollection","event","addLinkedRecords","_addMeta","_clearMeta","removeLinkedRecords","DATASTORE_DEFAULTS","DataStore","updateOpts","getInverse","removeInverseRelation","relatedIdAttribute","updateIndex","setupInverseRelation","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","_key","origGet","origSet","unlinkOnDestroy","version"],"mappings":"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"} \ No newline at end of file diff --git a/dist/js-data.js b/dist/js-data.js index 0c053e96..42308b9a 100644 --- a/dist/js-data.js +++ b/dist/js-data.js @@ -1,6 +1,6 @@ /*! * js-data -* @version 3.0.1 - Homepage +* @version 3.0.2 - Homepage * @author js-data project authors * @copyright (c) 2014-2016 js-data project authors * @license MIT @@ -10,7 +10,7 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define('js-data', ['exports'], factory) : - (factory((global.JSData = global.JSData || {}))); + (factory((global.JSData = {}))); }(this, (function (exports) { 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { @@ -100,8 +100,8 @@ var toConsumableArray = function (arr) { * Utility methods used by JSData. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('foo')) // true + * import { utils } from 'js-data'; + * console.log(utils.isString('foo')); // true * * @namespace utils * @type {Object} @@ -172,9 +172,9 @@ var utils = { * `window.Promise` or `global.Promise`. * * @example Make JSData use a different `Promise` constructor - * import Promise from 'bluebird' - * import {utils} from 'js-data' - * utils.Promise = Promise + * import Promise from 'bluebird'; + * import { utils } from 'js-data'; + * utils.Promise = Promise; * * @name utils.Promise * @since 3.0.0 @@ -191,8 +191,8 @@ var utils = { * - does not start with "_" * * @method utils._ - * @param {Object} dest Destination object. - * @param {Object} src Source object. + * @param {object} dest Destination object. + * @param {object} src Source object. * @private * @since 3.0.0 */ @@ -209,7 +209,7 @@ var utils = { * Recursively iterates over relations found in `opts.with`. * * @method utils._forRelation - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {Relation} def Relation definition. * @param {Function} fn Callback function. * @param {*} [thisArg] Execution context for the callback function. @@ -282,19 +282,19 @@ var utils = { * provided `props`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Cat () {} * utils.addHiddenPropsToTarget(Cat.prototype, { * say () { - * console.log('meow') + * console.log('meow'); * } - * }) - * const cat = new Cat() - * cat.say() // "meow" + * }); + * const cat = new Cat(); + * cat.say(); // "meow" * * @method utils.addHiddenPropsToTarget - * @param {Object} target That to which `props` should be added. - * @param {Object} props Properties to be added to `target`. + * @param {object} target That to which `props` should be added. + * @param {object} props Properties to be added to `target`. * @since 3.0.0 */ addHiddenPropsToTarget: function addHiddenPropsToTarget(target, props) { @@ -313,17 +313,17 @@ var utils = { * Return whether the two objects are deeply different. * * @example - * import {utils} from 'js-data' - * utils.areDifferent({}, {}) // false - * utils.areDifferent({ a: 1 }, { a: 1 }) // false - * utils.areDifferent({ foo: 'bar' }, {}) // true + * import { utils } from 'js-data'; + * utils.areDifferent({}, {}); // false + * utils.areDifferent({ a: 1 }, { a: 1 }); // false + * utils.areDifferent({ foo: 'bar' }, {}); // true * * @method utils.areDifferent - * @param {Object} a Base object. - * @param {Object} b Comparison object. - * @param {Object} [opts] Configuration options. + * @param {object} a Base object. + * @param {object} b Comparison object. + * @param {object} [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {boolean} Whether the two objects are deeply different. * @see utils.diffObjects * @since 3.0.0 @@ -341,12 +341,12 @@ var utils = { * to just being called like a normal function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Cat () { - * utils.classCallCheck(this, Cat) + * utils.classCallCheck(this, Cat); * } - * const cat = new Cat() // this is ok - * Cat() // this throws an error + * const cat = new Cat(); // this is ok + * Cat(); // this throws an error * * @method utils.classCallCheck * @param {*} instance Instance that is being constructed. @@ -367,11 +367,11 @@ var utils = { * Deep copy a value. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' } } - * const b = utils.copy(a) - * a === b // false - * utils.areDifferent(a, b) // false + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' } }; + * const b = utils.copy(a); + * a === b; // false + * utils.areDifferent(a, b); // false * * @param {*} from Value to deep copy. * @param {*} [to] Destination object for the copy operation. @@ -465,15 +465,15 @@ var utils = { * `dest`. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * const b = { beep: 'bip' } - * utils.deepFillIn(b, a) - * console.log(b) // {"foo":{"bar":"baz"},"beep":"bip"} + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.deepFillIn(b, a); + * console.log(b); // {"foo":{"bar":"baz"},"beep":"bip"} * * @method utils.deepFillIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.fillIn * @see utils.deepMixIn * @since 3.0.0 @@ -497,15 +497,15 @@ var utils = { * Recursively shallow copy enumerable properties from `source` to `dest`. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * const b = { beep: 'bip' } - * utils.deepFillIn(b, a) - * console.log(b) // {"foo":{"bar":"baz"},"beep":"boop"} + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.deepFillIn(b, a); + * console.log(b); // {"foo":{"bar":"baz"},"beep":"boop"} * * @method utils.deepMixIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.fillIn * @see utils.deepFillIn * @since 3.0.0 @@ -530,20 +530,20 @@ var utils = { * Return a diff of the base object to the comparison object. * * @example - * import {utils} from 'js-data' - * const oldObject = { foo: 'bar', a: 1234 } - * const newObject = { beep: 'boop', a: 5678 } - * const diff = utils.diffObjects(oldObject, newObject) - * console.log(diff.added) // {"beep":"boop"} - * console.log(diff.changed) // {"a":5678} - * console.log(diff.removed) // {"foo":undefined} + * import { utils } from 'js-data'; + * const oldObject = { foo: 'bar', a: 1234 }; + * const newObject = { beep: 'boop', a: 5678 }; + * const diff = utils.diffObjects(oldObject, newObject); + * console.log(diff.added); // {"beep":"boop"} + * console.log(diff.changed); // {"a":5678} + * console.log(diff.removed); // {"foo":undefined} * * @method utils.diffObjects - * @param {Object} newObject Comparison object. - * @param {Object} oldObject Base object. - * @param {Object} [opts] Configuration options. + * @param {object} newObject Comparison object. + * @param {object} oldObject Base object. + * @param {object} [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {Object} The diff from the base object to the comparison object. * @see utils.areDifferent * @since 3.0.0 @@ -599,10 +599,10 @@ var utils = { * Return whether the two values are equal according to the `==` operator. * * @example - * import {utils} from 'js-data' - * console.log(utils.equal(1,1)) // true - * console.log(utils.equal(1,'1')) // true - * console.log(utils.equal(93, 66)) // false + * import { utils } from 'js-data'; + * console.log(utils.equal(1,1)); // true + * console.log(utils.equal(1,'1')); // true + * console.log(utils.equal(93, 66)); // false * * @method utils.equal * @param {*} a First value in the comparison. @@ -620,10 +620,10 @@ var utils = { * metadata. Used throughout the various js-data components. * * @example - * import {utils} from 'js-data' - * const errorFactory = utils.err('domain', 'target') - * const error400 = errorFactory(400, 'expected type', 'actual type') - * console.log(error400) // [Error: [domain:target] expected: expected type, found: string + * import { utils } from 'js-data'; + * const errorFactory = utils.err('domain', 'target'); + * const error400 = errorFactory(400, 'expected type', 'actual type'); + * console.log(error400); // [Error: [domain:target] expected: expected type, found: string http://www.js-data.io/v3.0/docs/errors#400] * @method utils.err * @param {string} domain Namespace. @@ -645,14 +645,14 @@ var utils = { * Add eventing capabilities into the target object. * * @example - * import {utils} from 'js-data' - * const user = { name: 'John' } - * utils.eventify(user) - * user.on('foo', () => console.log(arguments)) - * user.emit('foo', 1, 'bar') // should log to console values (1, "bar") + * import { utils } from 'js-data'; + * const user = { name: 'John' }; + * utils.eventify(user); + * user.on('foo', () => console.log(arguments)); + * user.emit('foo', 1, 'bar'); // should log to console values (1, "bar") * * @method utils.eventify - * @param {Object} target Target object. + * @param {object} target Target object. * @param {Function} [getter] Custom getter for retrieving the object's event * listeners. * @param {Function} [setter] Custom setter for setting the object's event @@ -732,24 +732,24 @@ var utils = { * to produce a subclass based on `props` and `classProps`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * function Animal () {} - * Animal.extend = utils.extend + * Animal.extend = utils.extend; * const Cat = Animal.extend({ * say () { - * console.log('meow') + * console.log('meow'); * } - * }) - * const cat = new Cat() - * cat instanceof Animal // true - * cat instanceof Cat // true - * cat.say() // "meow" + * }); + * const cat = new Cat(); + * cat instanceof Animal; // true + * cat instanceof Cat; // true + * cat.say(); // "meow" * * @method utils.extend - * @param {Object} props Instance properties for the subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} props Instance properties for the subclass. + * @param {object} [props.constructor] Provide a custom constructor function * to use as the subclass. - * @param {Object} props Static properties for the subclass. + * @param {object} props Static properties for the subclass. * @returns {Constructor} A new subclass. * @since 3.0.0 */ @@ -815,15 +815,15 @@ var utils = { * `src` but are missing from `dest. * * @example - * import {utils} from 'js-data' - * const a = { foo: 'bar', beep: 'boop' } - * const b = { beep: 'bip' } - * utils.fillIn(b, a) - * console.log(b) // {"foo":"bar","beep":"bip"} + * import { utils } from 'js-data'; + * const a = { foo: 'bar', beep: 'boop' }; + * const b = { beep: 'bip' }; + * utils.fillIn(b, a); + * console.log(b); // {"foo":"bar","beep":"bip"} * * @method utils.fillIn - * @param {Object} dest The destination object. - * @param {Object} source The source object. + * @param {object} dest The destination object. + * @param {object} source The source object. * @see utils.deepFillIn * @see utils.deepMixIn * @since 3.0.0 @@ -841,20 +841,20 @@ var utils = { * Find the last index of an item in an array according to the given checker function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const john = { name: 'John', age: 20 } - * const sara = { name: 'Sara', age: 25 } - * const dan = { name: 'Dan', age: 20 } - * const users = [john, sara, dan] + * const john = { name: 'John', age: 20 }; + * const sara = { name: 'Sara', age: 25 }; + * const dan = { name: 'Dan', age: 20 }; + * const users = [john, sara, dan]; * - * console.log(utils.findIndex(users, (user) => user.age === 25)) // 1 - * console.log(utils.findIndex(users, (user) => user.age > 19)) // 2 - * console.log(utils.findIndex(users, (user) => user.name === 'John')) // 0 - * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')) // -1 + * console.log(utils.findIndex(users, (user) => user.age === 25)); // 1 + * console.log(utils.findIndex(users, (user) => user.age > 19)); // 2 + * console.log(utils.findIndex(users, (user) => user.name === 'John')); // 0 + * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')); // -1 * * @method utils.findIndex - * @param {Array} array The array to search. + * @param {array} array The array to search. * @param {Function} fn Checker function. * @returns {number} Index if found or -1 if not found. * @since 3.0.0 @@ -880,7 +880,7 @@ var utils = { * * @method utils.forEachRelation * @param {Mapper} mapper Mapper. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {Function} fn Callback function. * @param {*} thisArg Execution context for the callback function. * @since 3.0.0 @@ -900,18 +900,18 @@ var utils = { * Iterate over an object's own enumerable properties. * * @example - * import {utils} from 'js-data' - * const a = { b: 1, c: 4 } - * let sum = 0 + * import { utils } from 'js-data'; + * const a = { b: 1, c: 4 }; + * let sum = 0; * utils.forOwn(a, function (value, key) { - * sum += value - * }) - * console.log(sum) // 5 + * sum += value; + * }); + * console.log(sum); // 5 * * @method utils.forOwn - * @param {Object} object The object whose properties are to be enumerated. + * @param {object} object The object whose properties are to be enumerated. * @param {Function} fn Iteration function. - * @param {Object} [thisArg] Content to which to bind `fn`. + * @param {object} [thisArg] Content to which to bind `fn`. * @since 3.0.0 */ forOwn: function forOwn(obj, fn, thisArg) { @@ -930,10 +930,10 @@ var utils = { * Proxy for `JSON.parse`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const a = utils.fromJson('{"name" : "John"}') - * console.log(a) // { name: 'John' } + * const a = utils.fromJson('{"name" : "John"}'); + * console.log(a); // { name: 'John' } * * @method utils.fromJson * @param {string} json JSON to parse. @@ -951,13 +951,13 @@ var utils = { * nested properties. * * @example - * import {utils} from 'js-data' - * const a = { foo: { bar: 'baz' }, beep: 'boop' } - * console.log(utils.get(a, 'beep')) // "boop" - * console.log(utils.get(a, 'foo.bar')) // "baz" + * import { utils } from 'js-data'; + * const a = { foo: { bar: 'baz' }, beep: 'boop' }; + * console.log(utils.get(a, 'beep')); // "boop" + * console.log(utils.get(a, 'foo.bar')); // "baz" * * @method utils.get - * @param {Object} object Object from which to retrieve a property's value. + * @param {object} object Object from which to retrieve a property's value. * @param {string} prop Property to retrieve. * @returns {*} Value of the specified property. * @see utils.set @@ -987,21 +987,21 @@ var utils = { * provided, then finds the parent class of the instance's constructor. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * // using ES2015 classes * class Foo {} * class Bar extends Foo {} - * const barInstance = new Bar() - * let baseType = utils.getSuper(barInstance) - * console.log(Foo === baseType) // true + * const barInstance = new Bar(); + * let baseType = utils.getSuper(barInstance); + * console.log(Foo === baseType); // true * * // using Function constructor with utils.extend * function Foo () {} - * Foo.extend = utils.extend - * const Bar = Foo.extend() - * const barInstance = new Bar() - * let baseType = utils.getSuper(barInstance) - * console.log(Foo === baseType) // true + * Foo.extend = utils.extend; + * const Bar = Foo.extend(); + * const barInstance = new Bar(); + * let baseType = utils.getSuper(barInstance); + * console.log(Foo === baseType); // true * * @method utils.getSuper * @param {Object|Function} instance Instance or constructor. @@ -1022,16 +1022,16 @@ var utils = { * Return the intersection of two arrays. * * @example - * import {utils} from 'js-data' - * const arrA = ['green', 'red', 'blue', 'red'] - * const arrB = ['green', 'yellow', 'red'] - * const intersected = utils.intersection(arrA, arrB) + * import { utils } from 'js-data'; + * const arrA = ['green', 'red', 'blue', 'red']; + * const arrB = ['green', 'yellow', 'red']; + * const intersected = utils.intersection(arrA, arrB); * - * console.log(intersected) // ['green', 'red']) + * console.log(intersected); // ['green', 'red']) * * @method utils.intersection - * @param {Array} array1 First array. - * @param {Array} array2 Second array. + * @param {array} array1 First array. + * @param {array} array2 Second array. * @returns {Array} Array of elements common to both arrays. * @since 3.0.0 */ @@ -1060,11 +1060,11 @@ var utils = { * Proxy for `Array.isArray`. * * @example - * import {utils} from 'js-data' - * const a = [1,2,3,4,5] - * const b = { foo: "bar" } - * console.log(utils.isArray(a)) // true - * console.log(utils.isArray(b)) // false + * import { utils } from 'js-data'; + * const a = [1,2,3,4,5]; + * const b = { foo: "bar" }; + * console.log(utils.isArray(a)); // true + * console.log(utils.isArray(b)); // false * * @method utils.isArray * @param {*} value The value to test. @@ -1078,16 +1078,16 @@ var utils = { * `blacklist`. * * @example - * import {utils} from 'js-data' - * const blacklist = [/^\$hashKey/g, /^_/g, 'id'] - * console.log(utils.isBlacklisted("$hashKey", blacklist)) // true - * console.log(utils.isBlacklisted("id", blacklist)) // true - * console.log(utils.isBlacklisted("_myProp", blacklist)) // true - * console.log(utils.isBlacklisted("my_id", blacklist)) // false + * import { utils } from 'js-data'; + * const blacklist = [/^\$hashKey/g, /^_/g, 'id']; + * console.log(utils.isBlacklisted("$hashKey", blacklist)); // true + * console.log(utils.isBlacklisted("id", blacklist)); // true + * console.log(utils.isBlacklisted("_myProp", blacklist)); // true + * console.log(utils.isBlacklisted("my_id", blacklist)); // false * * @method utils.isBlacklisted * @param {string} prop The name of a property to check. - * @param {Array} blacklist Array of strings and regular expressions. + * @param {array} blacklist Array of strings and regular expressions. * @returns {boolean} Whether `prop` was matched. * @since 3.0.0 */ @@ -1110,11 +1110,11 @@ var utils = { * Return whether the provided value is a boolean. * * @example - * import {utils} from 'js-data' - * const a = true - * const b = { foo: "bar" } - * console.log(utils.isBoolean(a)) // true - * console.log(utils.isBoolean(b)) // false + * import { utils } from 'js-data'; + * const a = true; + * const b = { foo: "bar" }; + * console.log(utils.isBoolean(a)); // true + * console.log(utils.isBoolean(b)); // false * * @method utils.isBoolean * @param {*} value The value to test. @@ -1130,11 +1130,11 @@ var utils = { * Return whether the provided value is a date. * * @example - * import {utils} from 'js-data' - * const a = new Date() - * const b = { foo: "bar" } - * console.log(utils.isDate(a)) // true - * console.log(utils.isDate(b)) // false + * import { utils } from 'js-data'; + * const a = new Date(); + * const b = { foo: "bar" }; + * console.log(utils.isDate(a)); // true + * console.log(utils.isDate(b)); // false * * @method utils.isDate * @param {*} value The value to test. @@ -1150,11 +1150,11 @@ var utils = { * Return whether the provided value is a function. * * @example - * import {utils} from 'js-data' - * const a = function (){ console.log('foo bar')} - * const b = { foo: "bar" } - * console.log(utils.isFunction(a)) // true - * console.log(utils.isFunction(b)) // false + * import { utils } from 'js-data'; + * const a = function () { console.log('foo bar'); }; + * const b = { foo: "bar" }; + * console.log(utils.isFunction(a)); // true + * console.log(utils.isFunction(b)); // false * * @method utils.isFunction * @param {*} value The value to test. @@ -1170,13 +1170,13 @@ var utils = { * Return whether the provided value is an integer. * * @example - * import {utils} from 'js-data' - * const a = 1 - * const b = 1.25 - * const c = '1' - * console.log(utils.isInteger(a)) // true - * console.log(utils.isInteger(b)) // false - * console.log(utils.isInteger(c)) // false + * import { utils } from 'js-data'; + * const a = 1; + * const b = 1.25; + * const c = '1'; + * console.log(utils.isInteger(a)); // true + * console.log(utils.isInteger(b)); // false + * console.log(utils.isInteger(c)); // false * * @method utils.isInteger * @param {*} value The value to test. @@ -1192,11 +1192,11 @@ var utils = { * Return whether the provided value is `null`. * * @example - * import {utils} from 'js-data' - * const a = null - * const b = { foo: "bar" } - * console.log(utils.isNull(a)) // true - * console.log(utils.isNull(b)) // false + * import { utils } from 'js-data'; + * const a = null; + * const b = { foo: "bar" }; + * console.log(utils.isNull(a)); // true + * console.log(utils.isNull(b)); // false * * @method utils.isNull * @param {*} value The value to test. @@ -1212,13 +1212,13 @@ var utils = { * Return whether the provided value is a number. * * @example - * import {utils} from 'js-data' - * const a = 1 - * const b = -1.25 - * const c = '1' - * console.log(utils.isNumber(a)) // true - * console.log(utils.isNumber(b)) // true - * console.log(utils.isNumber(c)) // false + * import { utils } from 'js-data'; + * const a = 1; + * const b = -1.25; + * const c = '1'; + * console.log(utils.isNumber(a)); // true + * console.log(utils.isNumber(b)); // true + * console.log(utils.isNumber(c)); // false * * @method utils.isNumber * @param {*} value The value to test. @@ -1235,11 +1235,11 @@ var utils = { * Return whether the provided value is an object. * * @example - * import {utils} from 'js-data' - * const a = { foo: "bar" } - * const b = 'foo bar' - * console.log(utils.isObject(a)) // true - * console.log(utils.isObject(b)) // false + * import { utils } from 'js-data'; + * const a = { foo: "bar" }; + * const b = 'foo bar'; + * console.log(utils.isObject(a)); // true + * console.log(utils.isObject(b)); // false * * @method utils.isObject * @param {*} value The value to test. @@ -1255,13 +1255,13 @@ var utils = { * Return whether the provided value is a regular expression. * * @example - * import {utils} from 'js-data' - * const a = /^\$.+$/ig - * const b = new RegExp('^\$.+$', 'ig') - * const c = { foo: "bar" } - * console.log(utils.isRegExp(a)) // true - * console.log(utils.isRegExp(b)) // true - * console.log(utils.isRegExp(c)) // false + * import { utils } from 'js-data'; + * const a = /^\$.+$/ig; + * const b = new RegExp('^\$.+$', 'ig'); + * const c = { foo: "bar" }; + * console.log(utils.isRegExp(a)); // true + * console.log(utils.isRegExp(b)); // true + * console.log(utils.isRegExp(c)); // false * * @method utils.isRegExp * @param {*} value The value to test. @@ -1277,12 +1277,12 @@ var utils = { * Return whether the provided value is a string or a number. * * @example - * import {utils} from 'js-data' - * console.log(utils.isSorN('')) // true - * console.log(utils.isSorN(-1.65)) // true - * console.log(utils.isSorN('my string')) // true - * console.log(utils.isSorN({})) // false - * console.log(utils.isSorN([1,2,4])) // false + * import { utils } from 'js-data'; + * console.log(utils.isSorN('')); // true + * console.log(utils.isSorN(-1.65)); // true + * console.log(utils.isSorN('my string')); // true + * console.log(utils.isSorN({})); // false + * console.log(utils.isSorN([1,2,4])); // false * * @method utils.isSorN * @param {*} value The value to test. @@ -1298,11 +1298,11 @@ var utils = { * Return whether the provided value is a string. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('')) // true - * console.log(utils.isString('my string')) // true - * console.log(utils.isString(100)) // false - * console.log(utils.isString([1,2,4])) // false + * import { utils } from 'js-data'; + * console.log(utils.isString('')); // true + * console.log(utils.isString('my string')); // true + * console.log(utils.isString(100)); // false + * console.log(utils.isString([1,2,4])); // false * * @method utils.isString * @param {*} value The value to test. @@ -1318,13 +1318,13 @@ var utils = { * Return whether the provided value is a `undefined`. * * @example - * import {utils} from 'js-data' - * const a = undefined - * const b = { foo: "bar"} - * console.log(utils.isUndefined(a)) // true - * console.log(utils.isUndefined(b.baz)) // true - * console.log(utils.isUndefined(b)) // false - * console.log(utils.isUndefined(b.foo)) // false + * import { utils } from 'js-data'; + * const a = undefined; + * const b = { foo: "bar"}; + * console.log(utils.isUndefined(a)); // true + * console.log(utils.isUndefined(b.baz)); // true + * console.log(utils.isUndefined(b)); // false + * console.log(utils.isUndefined(b.foo)); // false * * @method utils.isUndefined * @param {*} value The value to test. @@ -1340,17 +1340,17 @@ var utils = { * Mix in logging capabilities to the target. * * @example - * import {utils} from 'js-data' - * const a = { foo: "bar"} + * import { utils } from 'js-data'; + * const a = { foo: "bar"}; * * // Add standard logging to an object - * utils.logify(a) - * a.log('info', 'test log info') // output 'test log info' to console. + * utils.logify(a); + * a.log('info', 'test log info'); // output 'test log info' to console. * * // Toggle debug output of an object - * a.dbg('test debug output') // does not output because debug is off. - * a.debug = true - * a.dbg('test debug output') // output 'test debug output' to console. + * a.dbg('test debug output'); // does not output because debug is off. + * a.debug = true; + * a.dbg('test debug output'); // output 'test debug output' to console. * * @method utils.logify * @param {*} target The target. @@ -1399,18 +1399,18 @@ var utils = { * array. * * @example - * import {utils} from 'js-data' - * const colors = ['red', 'green', 'yellow'] + * import { utils } from 'js-data'; + * const colors = ['red', 'green', 'yellow']; * - * console.log(colors.length) // 3 - * utils.noDupeAdd(colors, 'red') - * console.log(colors.length) // 3, red already exists + * console.log(colors.length); // 3 + * utils.noDupeAdd(colors, 'red'); + * console.log(colors.length); // 3, red already exists * - * utils.noDupeAdd(colors, 'blue') - * console.log(colors.length) // 4, blue was added + * utils.noDupeAdd(colors, 'blue'); + * console.log(colors.length); // 4, blue was added * * @method utils.noDupeAdd - * @param {Array} array The array. + * @param {array} array The array. * @param {*} record The value to add. * @param {Function} fn Callback function passed to {@link utils.findIndex}. * @since 3.0.0 @@ -1431,14 +1431,14 @@ var utils = { * specified in `keys`. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John', $hashKey: 1214910 } + * import { utils } from 'js-data'; + * const a = { name: 'John', $hashKey: 1214910 }; * - * let b = utils.omit(a, ['$hashKey']) - * console.log(b) // { name: 'John' } + * let b = utils.omit(a, ['$hashKey']); + * console.log(b); // { name: 'John' } * * @method utils.omit - * @param {Object} props The object to copy. + * @param {object} props The object to copy. * @param {string[]} keys Array of strings, representing properties to skip. * @returns {Object} Shallow copy of `props`, minus `keys`. * @since 3.0.0 @@ -1459,14 +1459,14 @@ var utils = { * properties specified in `keys`. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John', $hashKey: 1214910 } + * import { utils } from 'js-data'; + * const a = { name: 'John', $hashKey: 1214910 }; * - * let b = utils.pick(a, ['$hashKey']) - * console.log(b) // { $hashKey: 1214910 } + * let b = utils.pick(a, ['$hashKey']); + * console.log(b); // { $hashKey: 1214910 } * * @method utils.pick - * @param {Object} props The object to copy. + * @param {object} props The object to copy. * @param {string[]} keys Array of strings, representing properties to keep. * @returns {Object} Shallow copy of `props`, but only including `keys`. * @since 3.0.0 @@ -1483,10 +1483,10 @@ var utils = { * Return a plain copy of the given value. * * @example - * import {utils} from 'js-data' - * const a = { name: 'John' } - * let b = utils.plainCopy(a) - * console.log(a === b) // false + * import { utils } from 'js-data'; + * const a = { name: 'John' }; + * let b = utils.plainCopy(a); + * console.log(a === b); // false * * @method utils.plainCopy * @param {*} value The value to copy. @@ -1503,13 +1503,13 @@ var utils = { * Shortcut for `utils.Promise.reject(value)`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * utils.reject("Testing static reject").then(function(data) { + * utils.reject("Testing static reject").then(function (data) { * // not called - * }).catch(function(reason) { + * }).catch(function (reason) { * console.log(reason); // "Testing static reject" - * }) + * }); * * @method utils.reject * @param {*} [value] Value with which to reject the Promise. @@ -1526,14 +1526,14 @@ var utils = { * Remove the last item found in array according to the given checker function. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const colors = ['red', 'green', 'yellow', 'red'] - * utils.remove(colors, (color) => color === 'red') - * console.log(colors) // ['red', 'green', 'yellow'] + * const colors = ['red', 'green', 'yellow', 'red']; + * utils.remove(colors, (color) => color === 'red'); + * console.log(colors); // ['red', 'green', 'yellow'] * * @method utils.remove - * @param {Array} array The array to search. + * @param {array} array The array to search. * @param {Function} fn Checker function. */ remove: function remove(array, fn) { @@ -1551,13 +1551,13 @@ var utils = { * Shortcut for `utils.Promise.resolve(value)`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * utils.resolve("Testing static resolve").then(function(data) { + * utils.resolve("Testing static resolve").then(function (data) { * console.log(data); // "Testing static resolve" - * }).catch(function(reason) { + * }).catch(function (reason) { * // not called - * }) + * }); * * @param {*} [value] Value with which to resolve the Promise. * @returns {Promise} Promise resolved with `value`. @@ -1573,7 +1573,7 @@ var utils = { * Set the value at the provided key or path. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const john = { * name: 'John', @@ -1582,27 +1582,27 @@ var utils = { * name: 'John's Mom', * age: 50 * } - * } + * }; * // set value by key - * utils.set(john, 'id', 98) - * console.log(john.id) // 98 + * utils.set(john, 'id', 98); + * console.log(john.id); // 98 * * // set value by path - * utils.set(john, 'parent.id', 20) - * console.log(john.parent.id) // 20 + * utils.set(john, 'parent.id', 20); + * console.log(john.parent.id); // 20 * * // set value by path/value map * utils.set(john, { * 'id': 1098, * 'parent': { id: 1020 }, * 'parent.age': '55' - * }) - * console.log(john.id) // 1098 - * console.log(john.parent.id) // 1020 - * console.log(john.parent.age) // 55 + * }); + * console.log(john.id); // 1098 + * console.log(john.parent.id); // 1020 + * console.log(john.parent.age); // 55 * * @method utils.set - * @param {Object} object The object on which to set a property. + * @param {object} object The object on which to set a property. * @param {(string|Object)} path The key or path to the property. Can also * pass in an object of path/value pairs, which will all be set on the target * object. @@ -1627,7 +1627,7 @@ var utils = { * Check whether the two provided objects are deeply equal. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const objA = { * name: 'John', @@ -1636,7 +1636,7 @@ var utils = { * item: 'item 1', * colors: ['red', 'green', 'blue'] * } - * } + * }; * * const objB = { * name: 'John', @@ -1645,15 +1645,15 @@ var utils = { * item: 'item 1', * colors: ['red', 'green', 'blue'] * } - * } + * }; * - * console.log(utils.deepEqual(a,b)) // true - * objB.nested.colors.add('yellow') // make a change to a nested object's array - * console.log(utils.deepEqual(a,b)) // false + * console.log(utils.deepEqual(a,b)); // true + * objB.nested.colors.add('yellow'); // make a change to a nested object's array + * console.log(utils.deepEqual(a,b)); // false * * @method utils.deepEqual - * @param {Object} a First object in the comparison. - * @param {Object} b Second object in the comparison. + * @param {object} a First object in the comparison. + * @param {object} b Second object in the comparison. * @returns {boolean} Whether the two provided objects are deeply equal. * @see utils.equal * @since 3.0.0 @@ -1699,11 +1699,11 @@ var utils = { * Proxy for `JSON.stringify`. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * - * const a = { name: 'John' } - * let jsonVal = utils.toJson(a) - * console.log(jsonVal) // '{"name" : "John"}' + * const a = { name: 'John' }; + * let jsonVal = utils.toJson(a); + * console.log(jsonVal); // '{"name" : "John"}' * * @method utils.toJson * @param {*} value Value to serialize to JSON. @@ -1717,7 +1717,7 @@ var utils = { * Unset the value at the provided key or path. * * @example - * import {utils} from 'js-data' + * import { utils } from 'js-data'; * * const john = { * name: 'John', @@ -1726,16 +1726,16 @@ var utils = { * name: 'John's Mom', * age: 50 * } - * } + * }; * - * utils.unset(john, age) - * utils.unset(john, parent.age) + * utils.unset(john, age); + * utils.unset(john, parent.age); * - * console.log(john.age) // null - * console.log(john.parent.age) // null + * console.log(john.age); // null + * console.log(john.parent.age); // null * * @method utils.unset - * @param {Object} object The object from which to delete the property. + * @param {object} object The object from which to delete the property. * @param {string} path The key or path to the property. * @see utils.set * @since 3.0.0 @@ -1847,52 +1847,51 @@ function Settable() { * Create a subclass of this Settable: * * @example Settable.extend - * // Normally you would do: import {Settable} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Settable} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Settable } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSettableClass extends Settable { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSettable = new CustomSettableClass() - * console.log(customSettable.foo()) - * console.log(CustomSettableClass.beep()) + * const customSettable = new CustomSettableClass(); + * console.log(customSettable.foo()); + * console.log(CustomSettableClass.beep()); * * // Extend the class using alternate method. * const OtherSettableClass = Settable.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherSettable = new OtherSettableClass() - * console.log(otherSettable.foo()) - * console.log(OtherSettableClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherSettable = new OtherSettableClass(); + * console.log(otherSettable.foo()); + * console.log(OtherSettableClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSettableClass () { - * Settable.call(this) - * this.created_at = new Date().getTime() + * Settable.call(this); + * this.created_at = new Date().getTime(); * } * Settable.extend({ * constructor: AnotherSettableClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherSettable = new AnotherSettableClass() - * console.log(anotherSettable.created_at) - * console.log(anotherSettable.foo()) - * console.log(AnotherSettableClass.beep()) + * const anotherSettable = new AnotherSettableClass(); + * console.log(anotherSettable.created_at); + * console.log(anotherSettable.foo()); + * console.log(AnotherSettableClass.beep()); * * @method Settable.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Settable class. * @since 3.0.0 */ @@ -1913,7 +1912,7 @@ Settable.extend = utils.extend; * ``` * * @class Component - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @returns {Component} A new {@link Component} instance. * @since 3.0.0 @@ -1928,16 +1927,15 @@ function Component(opts) { * functionality. * * @example Component#debug - * // Normally you would do: import {Component} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Component} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Component } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const component = new Component() - * component.log('debug', 'some message') // nothing gets logged + * const component = new Component(); + * component.log('debug', 'some message'); // nothing gets logged * // Display debug logs: - * component.debug = true - * component.log('debug', 'other message') // this DOES get logged + * component.debug = true; + * component.log('debug', 'other message'); // this DOES get logged * * @default false * @name Component#debug @@ -1967,52 +1965,51 @@ var Component$1 = Settable.extend({ * Create a subclass of this Component: * * @example Component.extend - * // Normally you would do: import {Component} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Component} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Component } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomComponentClass extends Component { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customComponent = new CustomComponentClass() - * console.log(customComponent.foo()) - * console.log(CustomComponentClass.beep()) + * const customComponent = new CustomComponentClass(); + * console.log(customComponent.foo()); + * console.log(CustomComponentClass.beep()); * * // Extend the class using alternate method. * const OtherComponentClass = Component.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherComponent = new OtherComponentClass() - * console.log(otherComponent.foo()) - * console.log(OtherComponentClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherComponent = new OtherComponentClass(); + * console.log(otherComponent.foo()); + * console.log(OtherComponentClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherComponentClass () { - * Component.call(this) - * this.created_at = new Date().getTime() + * Component.call(this); + * this.created_at = new Date().getTime(); * } * Component.extend({ * constructor: AnotherComponentClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherComponent = new AnotherComponentClass() - * console.log(anotherComponent.created_at) - * console.log(anotherComponent.foo()) - * console.log(AnotherComponentClass.beep()) + * const anotherComponent = new AnotherComponentClass(); + * console.log(anotherComponent.created_at); + * console.log(anotherComponent.foo()); + * console.log(AnotherComponentClass.beep()); * * @method Component.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Component class. * @since 3.0.0 */ @@ -2047,26 +2044,26 @@ utils.logify(Component.prototype); * @example * // Listen for all "afterCreate" events in a DataStore * store.on('afterCreate', (mapperName, props, opts, result) => { - * console.log(mapperName) // "post" - * console.log(props.id) // undefined - * console.log(result.id) // 1234 - * }) + * console.log(mapperName); // "post" + * console.log(props.id); // undefined + * console.log(result.id); // 1234 + * }); * store.create('post', { title: 'Modeling your data' }).then((post) => { - * console.log(post.id) // 1234 - * }) + * console.log(post.id); // 1234 + * }); * * @example * // Listen for the "add" event on a collection * collection.on('add', (records) => { - * console.log(records) // [...] - * }) + * console.log(records); // [...] + * }); * * @example * // Listen for "change" events on a record * post.on('change', (record, changes) => { - * console.log(changes) // { changed: { title: 'Modeling your data' } } - * }) - * post.title = 'Modeling your data' + * console.log(changes); // { changed: { title: 'Modeling your data' } } + * }); + * post.title = 'Modeling your data'; * * @method Component#on * @param {string} event Name of event to subsribe to. @@ -2081,15 +2078,15 @@ utils.logify(Component.prototype); * * @example * // Remove a particular listener for a particular event - * collection.off('add', handler) + * collection.off('add', handler); * * @example * // Remove all listeners for a particular event - * record.off('change') + * record.off('change'); * * @example * // Remove all listeners to all events - * store.off() + * store.off(); * * @method Component#off * @param {string} [event] Name of event to unsubsribe to. @@ -2100,21 +2097,21 @@ utils.logify(Component.prototype); * Trigger an event on this Component. * * @example Component#emit - * // import {Collection, DataStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, DataStore} = JSData + * // import { Collection, DataStore } from 'js-data'; + * const JSData = require('js-data'); + * const { Collection, DataStore } = JSData; * - * const collection = new Collection() + * const collection = new Collection(); * collection.on('foo', function (msg) { - * console.log(msg) - * }) - * collection.emit('foo', 'bar') + * console.log(msg); + * }); + * collection.emit('foo', 'bar'); * - * const store = new DataStore() + * const store = new DataStore(); * store.on('beep', function (msg) { - * console.log(msg) - * }) - * store.emit('beep', 'boop') + * console.log(msg); + * }); + * store.emit('beep', 'boop'); * * @method Component#emit * @param {string} event Name of event to emit. @@ -2154,12 +2151,16 @@ var escape = function escape(pattern) { * shouldn't have to create them yourself. Just use {@link Collection#query}. * * ```javascript - * import {Query} from 'js-data' + * import { Query } from 'js-data'; * ``` * - * @example - * const store = new JSData.DataStore() - * store.defineMapper('post') + * @example Query intro + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, @@ -2167,9 +2168,9 @@ var escape = function escape(pattern) { * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } * ] - * store.add('post', posts) - * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run() - * console.log(drafts) + * store.add('post', posts); + * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run(); + * console.log(drafts); * * @class Query * @extends Component @@ -2286,37 +2287,51 @@ var Query$1 = Component$1.extend({ * Find all entities between two boundaries. * * @example Get the users ages 18 to 30. - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const filteredUsers = store.query('user').between(18, 30, { index: 'age' }).run() - * console.log(filteredUsers) + * ]; + * store.add('user', users) + * const filteredUsers = store + * .query('user') + * .between(18, 30, { index: 'age' }) + * .run(); + * console.log(filteredUsers); * * @example Same as above. - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const filteredUsers = store.query('user').between([18], [30], { index: 'age' }).run() - * console.log(filteredUsers) + * ]; + * store.add('user', users) + * const filteredUsers = store + * .query('user') + * .between([18], [30], { index: 'age' }) + * .run(); + * console.log(filteredUsers); * * @method Query#between - * @param {Array} leftKeys Keys defining the left boundary. - * @param {Array} rightKeys Keys defining the right boundary. - * @param {Object} [opts] Configuration options. + * @param {array} leftKeys Keys defining the left boundary. + * @param {array} rightKeys Keys defining the right boundary. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @param {boolean} [opts.leftInclusive=true] Whether to include entities @@ -2342,7 +2357,7 @@ var Query$1 = Component$1.extend({ * The comparison function used by the {@link Query} class. * * @method Query#compare - * @param {Array} orderBy An orderBy clause used for sorting and sub-sorting. + * @param {array} orderBy An orderBy clause used for sorting and sub-sorting. * @param {number} index The index of the current orderBy clause being used. * @param {*} a The first item in the comparison. * @param {*} b The second item in the comparison. @@ -2413,7 +2428,11 @@ var Query$1 = Component$1.extend({ * the provided filter function. * * @example Get the draft posts by authors younger than 30 - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, @@ -2426,24 +2445,29 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, status: 'draft', id: 8 }, * { author: 'Jim', age: 27, status: 'published', id: 9 }, * { author: 'Jason', age: 55, status: 'published', id: 10 } - * ] - * store.add('post', posts) - * let results = store.query('post').filter({ - * where: { - * status: { - * '==': 'draft' - * }, - * age: { - * '<': 30 + * ]; + * store.add('post', posts); + * const results = store + * .query('post') + * .filter({ + * where: { + * status: { + * '==': 'draft' + * }, + * age: { + * '<': 30 + * } * } - * } - * }).run() - * console.log(results) + * }) + * .run(); + * console.log(results); * * @example Use a custom filter function - * const posts = query.filter(function (post) { - * return post.isReady() - * }).run() + * const posts = query + * .filter(function (post) { + * return post.isReady(); + * }) + * .run(); * * @method Query#filter * @param {(Object|Function)} [queryOrFn={}] Selection query or filter @@ -2462,24 +2486,36 @@ var Query$1 = Component$1.extend({ * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax * * @example Empty "findAll" query - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * store.findAll('post').then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @example Empty "filter" query - * const store = new JSData.DataStore() - * store.defineMapper('post') - * const posts = store.filter('post') - * console.log(posts) // [...] + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * const posts = store.filter('post'); + * console.log(posts); // [...] * * @example Complex "filter" query - * const PAGE_SIZE = 2 - * let currentPage = 3 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * const PAGE_SIZE = 2; + * let currentPage = 3; + * + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, @@ -2491,11 +2527,11 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, status: 'draft', id: 8 }, * { author: 'Jim', age: 27, status: 'published', id: 9 }, * { author: 'Jason', age: 55, status: 'published', id: 10 } - * ] - * store.add('post', posts) + * ]; + * store.add('post', posts); * // Retrieve a filtered page of blog posts * // Would typically replace filter with findAll - * store.filter('post', { + * const results = store.filter('post', { * where: { * status: { * // WHERE status = 'published' @@ -2518,7 +2554,8 @@ var Query$1 = Component$1.extend({ * limit: PAGE_SIZE, * // SKIP 4 * offset: PAGE_SIZE * (currentPage - 1) - * }) + * }); + * console.log(results); * * @namespace query * @property {number} [limit] See {@link query.limit}. @@ -2540,7 +2577,11 @@ var Query$1 = Component$1.extend({ * from the result. * * @example Return posts where author is at least 32 years old - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 5 }, @@ -2548,16 +2589,16 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, id: 7 }, * { author: 'Adam', age: 33, id: 8 }, * { author: 'Adam', age: 33, id: 9 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * where: { * age: { * '>=': 30 * } * } - * }) - * console.log(results) + * }); + * console.log(results); * * @name query.where * @type {Object} @@ -2603,7 +2644,11 @@ var Query$1 = Component$1.extend({ * Determines how records should be ordered in the result. * * @example Order posts by `author` then by `id` descending - * const store = new JSData.DataStore() + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 5 }, @@ -2611,12 +2656,12 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, id: 7 }, * { author: 'Adam', age: 33, id: 8 }, * { author: 'Adam', age: 33, id: 9 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * orderBy:[['author','ASC'],['id','DESC']] - * }) - * console.log(results) + * }); + * console.log(results); * * @name query.orderBy * @type {string|Array[]} @@ -2639,18 +2684,29 @@ var Query$1 = Component$1.extend({ * Number of records to skip. * * @example Retrieve the first "page" of blog posts using findAll - * const PAGE_SIZE = 10 - * let currentPage = 1 - * PostMapper.findAll({ + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * const PAGE_SIZE = 10; + * let currentPage = 1; + * store.findAll('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) + * }); * * @example Retrieve the last "page" of blog posts using filter - * const PAGE_SIZE = 5 - * let currentPage = 2 - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * + * const PAGE_SIZE = 5; + * let currentPage = 2; + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, id: 1 }, * { author: 'Sally', age: 31, id: 2 }, @@ -2662,13 +2718,12 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, id: 8 }, * { author: 'Jim', age: 27, id: 9 }, * { author: 'Jason', age: 55, id: 10 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) - * + * }); * console.log(results) * * @name query.offset @@ -2686,17 +2741,29 @@ var Query$1 = Component$1.extend({ * Maximum number of records to retrieve. * * @example Retrieve the first "page" of blog posts using findAll + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); + * * const PAGE_SIZE = 10 * let currentPage = 1 - * PostMapper.findAll({ + * store.findAll('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) + * }); * * @example Retrieve the last "page" of blog posts using filter + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * * const PAGE_SIZE = 5 * let currentPage = 2 - * const store = new JSData.DataStore() * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, id: 1 }, @@ -2709,14 +2776,14 @@ var Query$1 = Component$1.extend({ * { author: 'Jim', age: 27, id: 8 }, * { author: 'Jim', age: 27, id: 9 }, * { author: 'Jason', age: 55, id: 10 } - * ] - * store.add('post', posts) - * store.filter('post', { + * ]; + * store.add('post', posts); + * const results = store.filter('post', { * offset: PAGE_SIZE * (currentPage 1) * limit: PAGE_SIZE - * }) - * + * }); * console.log(results) + * * @name query.limit * @type {number} * @see http://www.js-data.io/v3.0/docs/query-syntax @@ -2751,26 +2818,26 @@ var Query$1 = Component$1.extend({ * Find the entity or entities that match the provided key. * * @example Get the entity whose primary key is 25. - * const entities = query.get(25).run() + * const entities = query.get(25).run(); * * @example Same as above. - * const entities = query.get([25]).run() + * const entities = query.get([25]).run(); * * @example Get all users who are active and have the "admin" role. * const activeAdmins = query.get(['active', 'admin'], { * index: 'activityAndRoles' - * }).run() + * }).run(); * * @example Get all entities that match a certain weather condition. * const niceDays = query.get(['sunny', 'humid', 'calm'], { * index: 'weatherConditions' - * }).run() + * }).run(); * * @method Query#get - * @param {Array} keyList Key(s) defining the entity to retrieve. If + * @param {array} keyList Key(s) defining the entity to retrieve. If * `keyList` is not an array (i.e. for a single-value key), it will be * wrapped in an array. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.string] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Query} A reference to itself for chaining. @@ -2798,16 +2865,16 @@ var Query$1 = Component$1.extend({ * Find the entity or entities that match the provided keyLists. * * @example Get the posts where "status" is "draft" or "inReview". - * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run() + * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run(); * * @example Same as above. - * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run() + * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run(); * * @method Query#getAll * @param {...Array} [keyList] Provide one or more keyLists, and all * entities matching each keyList will be retrieved. If no keyLists are * provided, all entities will be returned. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Query} A reference to itself for chaining. @@ -2876,18 +2943,18 @@ var Query$1 = Component$1.extend({ * Limit the result. * * @example Get only the first 2 posts. - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new JSData.DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, * { author: 'Mike', age: 32, status: 'draft', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } - * ] - * store.add('post', posts) - * const results = store.query('post').limit(2).run() - * console.log(results) + * ]; + * store.add('post', posts); + * const results = store.query('post').limit(2).run(); + * console.log(results); * * @method Query#limit * @param {number} num The maximum number of entities to keep in the result. @@ -2908,21 +2975,27 @@ var Query$1 = Component$1.extend({ * Apply a mapping function to the result data. * * @example - * // Return the age of all users - * const store = new JSData.DataStore() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('user'); * const users = [ * { name: 'Peter', age: 25, id: 1 }, * { name: 'Jim', age: 19, id: 2 }, * { name: 'Mike', age: 17, id: 3 }, * { name: 'Alan', age: 29, id: 4 }, * { name: 'Katie', age: 33, id: 5 } - * ] - * store.add('post', posts) - * const ages = store.query('user').map((user) => { - * return user.age - * }).run() - * console.log(ages) + * ]; + * store.add('user', users); + * const ages = store + * .query('user') + * .map(function (user) { + * return user.age; + * }) + * .run(); + * console.log(ages); * * @method Query#map * @param {Function} mapFn Mapping function. @@ -2941,7 +3014,7 @@ var Query$1 = Component$1.extend({ * collection's main index. * * @example - * const stringAges = UserCollection.query().mapCall('toString').run() + * const stringAges = UserCollection.query().mapCall('toString').run(); * * @method Query#mapCall * @param {string} funcName Name of function to call @@ -2979,18 +3052,22 @@ var Query$1 = Component$1.extend({ * Skip a number of results. * * @example Get all but the first 2 posts. - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'draft', id: 2 }, * { author: 'Mike', age: 32, status: 'draft', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'draft', id: 5 } - * ] - * store.add('post', posts) - * const results = store.query('post').skip(2).run() - * console.log(results) + * ]; + * store.add('post', posts); + * const results = store.query('post').skip(2).run(); + * console.log(results); * * @method Query#skip * @param {number} num The number of entities to skip. @@ -3015,29 +3092,33 @@ var Query$1 = Component$1.extend({ * implemented by adapters (for the most part). * * @example Variant 1 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * + * ]; + * store.add('post', posts); * const publishedPosts = store.filter('post', { * status: 'published', * limit: 2 - * }) - * - * console.log(publishedPosts) + * }); + * console.log(publishedPosts); * * * @example Variant 2 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() + * const store = new DataStore(); * store.defineMapper('post') * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, @@ -3045,9 +3126,8 @@ var Query$1 = Component$1.extend({ * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * + * ]; + * store.add('post', posts); * const publishedPosts = store.filter('post', { * where: { * status: { @@ -3055,64 +3135,74 @@ var Query$1 = Component$1.extend({ * } * }, * limit: 2 - * }) - * - * console.log(publishedPosts) + * }); + * console.log(publishedPosts); * * @example Variant 3 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * - * const publishedPosts = store.query('post').filter({ - * status: 'published' - * }).limit(2).run() - * - * console.log(publishedPosts) + * ]; + * store.add('post', posts); + * const publishedPosts = store + * .query('post') + * .filter({ status: 'published' }) + * .limit(2) + * .run(); + * console.log(publishedPosts); * * @example Variant 4 + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) - * - * const publishedPosts = store.query('post').filter({ - * where: { - * status: { - * '==': 'published' + * ]; + * store.add('post', posts); + * const publishedPosts = store + * .query('post') + * .filter({ + * where: { + * status: { + * '==': 'published' + * } * } - * } - * }).limit(2).run() - * - * console.log(publishedPosts) + * }) + * .limit(2) + * .run(); + * console.log(publishedPosts); * * @example Multiple operators + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new JSData.DataStore() - * store.defineMapper('post') + * const store = new DataStore(); + * store.defineMapper('post'); * const posts = [ * { author: 'John', age: 30, status: 'published', id: 1 }, * { author: 'Sally', age: 31, status: 'published', id: 2 }, * { author: 'Mike', age: 32, status: 'published', id: 3 }, * { author: 'Adam', age: 33, status: 'deleted', id: 4 }, * { author: 'Adam', age: 33, status: 'published', id: 5 } - * ] - * store.add('post', posts) + * ]; + * store.add('post', posts); * * const myPublishedPosts = store.filter('post', { * where: { @@ -3123,9 +3213,9 @@ var Query$1 = Component$1.extend({ * '==': currentUser.id * } * } - * }) + * }); * - * console.log(myPublishedPosts) + * console.log(myPublishedPosts); * * @name Query.ops * @property {Function} == Equality operator. @@ -3201,52 +3291,51 @@ var Query$1 = Component$1.extend({ /** * Create a subclass of this Query: * @example Query.extend - * // Normally you would do: import {Query} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Query} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Query } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomQueryClass extends Query { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customQuery = new CustomQueryClass() - * console.log(customQuery.foo()) - * console.log(CustomQueryClass.beep()) + * const customQuery = new CustomQueryClass(); + * console.log(customQuery.foo()); + * console.log(CustomQueryClass.beep()); * * // Extend the class using alternate method. * const OtherQueryClass = Query.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherQuery = new OtherQueryClass() - * console.log(otherQuery.foo()) - * console.log(OtherQueryClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherQuery = new OtherQueryClass(); + * console.log(otherQuery.foo()); + * console.log(OtherQueryClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherQueryClass (collection) { - * Query.call(this, collection) - * this.created_at = new Date().getTime() + * Query.call(this, collection); + * this.created_at = new Date().getTime(); * } * Query.extend({ * constructor: AnotherQueryClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherQuery = new AnotherQueryClass() - * console.log(anotherQuery.created_at) - * console.log(anotherQuery.foo()) - * console.log(AnotherQueryClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherQuery = new AnotherQueryClass(); + * console.log(anotherQuery.created_at); + * console.log(anotherQuery.foo()); + * console.log(AnotherQueryClass.beep()); * * @method Query.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Query class. * @since 3.0.0 */ @@ -3636,7 +3725,7 @@ var HasOneRelation = Relation.extend({ * @name module:js-data.belongsTo * @method * @param {Mapper} related The relation the target belongs to. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} opts.foreignKey The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3656,7 +3745,7 @@ var belongsTo = function belongsTo(related, opts) { * @name module:js-data.hasMany * @method * @param {Mapper} related The relation of which the target has many. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} [opts.foreignKey] The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3676,7 +3765,7 @@ var hasMany = function hasMany(related, opts) { * @name module:js-data.hasOne * @method * @param {Mapper} related The relation of which the target has one. - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {string} [opts.foreignKey] The field that holds the primary key of the * related record. * @param {string} opts.localField The field that holds a reference to the @@ -3723,89 +3812,84 @@ var previousPath = 'previous'; * ``` * * @example Record#constructor - * // Normally you would do: import {Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Record } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Instantiate a plain record - * let record = new Record() - * console.log('record: ' + JSON.stringify(record)) + * let record = new Record(); + * console.log('record: ' + JSON.stringify(record)); * * // You can supply properties on instantiation - * record = new Record({ name: 'John' }) - * console.log('record: ' + JSON.stringify(record)) + * record = new Record({ name: 'John' }); + * console.log('record: ' + JSON.stringify(record)); * * @example Record#constructor2 - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Instantiate a record that's associated with a Mapper: - * const UserMapper = new Mapper({ name: 'user' }) - * const User = UserMapper.recordClass - * const user = UserMapper.createRecord({ name: 'John' }) - * const user2 = new User({ name: 'Sally' }) - * console.log('user: ' + JSON.stringify(user)) - * console.log('user2: ' + JSON.stringify(user2)) + * const UserMapper = new Mapper({ name: 'user' }); + * const User = UserMapper.recordClass; + * const user = UserMapper.createRecord({ name: 'John' }); + * const user2 = new User({ name: 'Sally' }); + * console.log('user: ' + JSON.stringify(user)); + * console.log('user2: ' + JSON.stringify(user2)); * * @example Record#constructor3 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() - * store.defineMapper('user') + * const store = new Container(); + * store.defineMapper('user'); * * // Instantiate a record that's associated with a store's Mapper - * const user = store.createRecord('user', { name: 'John' }) - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user', { name: 'John' }); + * console.log('user: ' + JSON.stringify(user)); * * @example Record#constructor4 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * // Validate on instantiation - * const user = store.createRecord('user', { name: 1234 }) - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user', { name: 1234 }); + * console.log('user: ' + JSON.stringify(user)); * * @example Record#constructor5 - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * // Skip validation on instantiation - * const user = store.createRecord('user', { name: 1234 }, { noValidate: true }) - * console.log('user: ' + JSON.stringify(user)) - * console.log('user.isValid(): ' + user.isValid()) + * const user = store.createRecord('user', { name: 1234 }, { noValidate: true }); + * console.log('user: ' + JSON.stringify(user)); + * console.log('user.isValid(): ' + user.isValid()); * * @class Record * @extends Component - * @param {Object} [props] The initial properties of the new Record instance. - * @param {Object} [opts] Configuration options. + * @param {object} [props] The initial properties of the new Record instance. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.noValidate=false] Whether to skip validation on the * initial properties. * @param {boolean} [opts.validateOnSet=true] Whether to enable setter @@ -3866,7 +3950,7 @@ var Record$1 = Component$1.extend({ * * @method Record#afterLoadRelations * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}. - * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}. + * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}. * @since 3.0.0 */ afterLoadRelations: function afterLoadRelations() {}, @@ -3877,7 +3961,7 @@ var Record$1 = Component$1.extend({ * * @method Record#beforeLoadRelations * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}. - * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}. + * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}. * @since 3.0.0 */ beforeLoadRelations: function beforeLoadRelations() {}, @@ -3900,22 +3984,21 @@ var Record$1 = Component$1.extend({ * {@link Record#commit} was called. * * @example Record#changes - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user changes: ' + JSON.stringify(user.changes())) - * user.name = 'John' - * console.log('user changes: ' + JSON.stringify(user.changes())) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user changes: ' + JSON.stringify(user.changes())); + * user.name = 'John'; + * console.log('user changes: ' + JSON.stringify(user.changes())); * * @method Record#changes * @param [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {Object} Object describing the changes to this record since it was * instantiated or its {@link Record#commit} method was last called. * @since 3.0.0 @@ -3931,26 +4014,26 @@ var Record$1 = Component$1.extend({ * previous property values being set to current values. * * @example Record#commit - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user hasChanges: ' + user.hasChanges()) - * user.name = 'John' - * console.log('user hasChanges: ' + user.hasChanges()) - * user.commit() - * console.log('user hasChanges: ' + user.hasChanges()) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user hasChanges: ' + user.hasChanges()); + * user.name = 'John'; + * console.log('user hasChanges: ' + user.hasChanges()); + * user.commit(); + * console.log('user hasChanges: ' + user.hasChanges()); * * @method Record#commit - * @param {Object} [opts] Configuration options. Passed to {@link Record#toJSON}. + * @param {object} [opts] Configuration options. Passed to {@link Record#toJSON}. * @since 3.0.0 */ commit: function commit(opts) { this._set('changed'); // unset + this._set('changing', false); this._set('history', []); // clear history this._set('previous', this.toJSON(opts)); }, @@ -3960,21 +4043,21 @@ var Record$1 = Component$1.extend({ * Call {@link Mapper#destroy} using this record's primary key. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('user') + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('user'); * store.find('user', 1234).then((user) => { - * console.log(user.id) // 1234 + * console.log(user.id); // 1234 * * // Destroy this user from the database - * return user.destroy() - * }) + * return user.destroy(); + * }); * * @method Record#destroy - * @param {Object} [opts] Configuration options passed to {@link Mapper#destroy}. + * @param {object} [opts] Configuration options passed to {@link Mapper#destroy}. * @returns {Promise} The result of calling {@link Mapper#destroy} with the * primary key of this record. * @since 3.0.0 @@ -3990,15 +4073,14 @@ var Record$1 = Component$1.extend({ * Return the value at the given path for this instance. * * @example Record#get - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * - * const user = store.createRecord('user', { name: 'Bob' }) - * console.log('user.get("name"): ' + user.get('name')) + * const user = store.createRecord('user', { name: 'Bob' }); + * console.log('user.get("name"): ' + user.get('name')); * * @method Record#get * @param {string} key Path of value to retrieve. @@ -4015,23 +4097,22 @@ var Record$1 = Component$1.extend({ * {@link Record#commit} was called. * * @example Record#hasChanges - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') - * console.log('user hasChanges: ' + user.hasChanges()) - * user.name = 'John' - * console.log('user hasChanges: ' + user.hasChanges()) - * user.commit() - * console.log('user hasChanges: ' + user.hasChanges()) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); + * console.log('user hasChanges: ' + user.hasChanges()); + * user.name = 'John'; + * console.log('user hasChanges: ' + user.hasChanges()); + * user.commit(); + * console.log('user hasChanges: ' + user.hasChanges()); * * @method Record#hasChanges * @param [opts] Configuration options. * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function. - * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. + * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore. * @returns {boolean} Return whether the record has changed since it was * instantiated or since its {@link Record#commit} method was called. * @since 3.0.0 @@ -4047,18 +4128,17 @@ var Record$1 = Component$1.extend({ * considered "saved". Records without primary keys are considered "unsaved". * * @example Record#isNew - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * id: 1234 - * }) - * const user2 = store.createRecord('user') - * console.log('user isNew: ' + user.isNew()) // false - * console.log('user2 isNew: ' + user2.isNew()) // true + * }); + * const user2 = store.createRecord('user'); + * console.log('user isNew: ' + user.isNew()); // false + * console.log('user2 isNew: ' + user2.isNew()); // true * * @method Record#isNew * @returns {boolean} Whether the record is unsaved. @@ -4073,29 +4153,28 @@ var Record$1 = Component$1.extend({ * Return whether the record in its current state passes validation. * * @example Record#isValid - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * const user = store.createRecord('user', { * name: 1234 * }, { * noValidate: true // this allows us to put the record into an invalid state - * }) - * console.log('user isValid: ' + user.isValid()) - * user.name = 'John' - * console.log('user isValid: ' + user.isValid()) + * }); + * console.log('user isValid: ' + user.isValid()); + * user.name = 'John'; + * console.log('user isValid: ' + user.isValid()); * * @method Record#isValid - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}. * @returns {boolean} Whether the record in its current state passes * validation. * @since 3.0.0 @@ -4150,11 +4229,11 @@ var Record$1 = Component$1.extend({ * loaded. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); * store.defineMapper('user', { * relations: { * hasMany: { @@ -4164,7 +4243,7 @@ var Record$1 = Component$1.extend({ * } * } * } - * }) + * }); * store.defineMapper('post', { * relations: { * belongsTo: { @@ -4174,20 +4253,20 @@ var Record$1 = Component$1.extend({ * } * } * } - * }) + * }); * store.find('user', 1234).then((user) => { - * console.log(user.id) // 1234 + * console.log(user.id); // 1234 * * // Load the user's post relations - * return user.loadRelations(['post']) + * return user.loadRelations(['post']); * }).then((user) => { - * console.log(user.posts) // [{...}, {...}, ...] - * }) + * console.log(user.posts); // [{...}, {...}, ...] + * }); * * @method Record#loadRelations * @param {string[]} [relations] List of relations to load. Can use localField * names or Mapper names to pick relations. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {Promise} Resolves with the record, with the loaded relations now * attached. * @since 3.0.0 @@ -4272,20 +4351,19 @@ var Record$1 = Component$1.extend({ * Return the properties with which this record was instantiated. * * @example Record#previous - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * name: 'William' - * }) - * console.log('user previous: ' + JSON.stringify(user.previous())) - * user.name = 'Bob' - * console.log('user previous: ' + JSON.stringify(user.previous())) - * user.commit() - * console.log('user previous: ' + JSON.stringify(user.previous())) + * }); + * console.log('user previous: ' + JSON.stringify(user.previous())); + * user.name = 'Bob'; + * console.log('user previous: ' + JSON.stringify(user.previous())); + * user.commit(); + * console.log('user previous: ' + JSON.stringify(user.previous())); * * @method Record#previous * @param {string} [key] If specified, return just the initial value of the @@ -4306,23 +4384,22 @@ var Record$1 = Component$1.extend({ * instantiated. * * @example Record#revert - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * const user = store.createRecord('user', { * name: 'William' - * }) - * console.log('user: ' + JSON.stringify(user)) - * user.name = 'Bob' - * console.log('user: ' + JSON.stringify(user)) - * user.revert() - * console.log('user: ' + JSON.stringify(user)) + * }); + * console.log('user: ' + JSON.stringify(user)); + * user.name = 'Bob'; + * console.log('user: ' + JSON.stringify(user)); + * user.revert(); + * console.log('user: ' + JSON.stringify(user)); * * @method Record#revert - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.preserve] Array of strings or Regular Expressions * denoting properties that should not be reverted. * @since 3.0.0 @@ -4351,31 +4428,31 @@ var Record$1 = Component$1.extend({ * Delegates to {@link Mapper#create} or {@link Mapper#update}. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; * - * const store = new Container() - * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('session') - * const session = store.createRecord('session', { topic: 'Node.js' }) + * const store = new Container(); + * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('session'); + * const session = store.createRecord('session', { topic: 'Node.js' }); * * // Create a new record in the database * session.save().then(() => { - * console.log(session.id) // 1234 + * console.log(session.id); // 1234 * - * session.skill_level = 'beginner' + * session.skill_level = 'beginner'; * * // Update the record in the database - * return session.save() - * }) + * return session.save(); + * }); * * @method Record#save - * @param {Object} [opts] Configuration options. See {@link Mapper#create} and + * @param {object} [opts] Configuration options. See {@link Mapper#create} and * {@link Mapper#update}. * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`. * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when * `opts.changesOnly` is `true`. - * @param {Array} [opts.ignore] Passed to {@link Record#changes} when + * @param {array} [opts.ignore] Passed to {@link Record#changes} when * `opts.changesOnly` is `true`. * @returns {Promise} The result of calling {@link Mapper#create} or * {@link Mapper#update}. @@ -4417,27 +4494,26 @@ var Record$1 = Component$1.extend({ * in {@link Mapper#schema}. * * @example Record#set - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * - * const user = store.createRecord('user') - * console.log('user: ' + JSON.stringify(user)) + * const user = store.createRecord('user'); + * console.log('user: ' + JSON.stringify(user)); * - * user.set('name', 'Bob') - * console.log('user: ' + JSON.stringify(user)) + * user.set('name', 'Bob'); + * console.log('user: ' + JSON.stringify(user)); * - * user.set({ age: 30, role: 'admin' }) - * console.log('user: ' + JSON.stringify(user)) + * user.set({ age: 30, role: 'admin' }); + * console.log('user: ' + JSON.stringify(user)); * * @fires Record#change * @method Record#set * @param {(string|Object)} key Key to set or hash of key-value pairs to set. * @param {*} [value] Value to set for the given key. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.silent=false] Whether to trigger change events. * @since 3.0.0 */ @@ -4462,27 +4538,26 @@ var Record$1 = Component$1.extend({ * be called with this record instead. * * @example Record#toJSON - * // Normally you would do: import { Container } from 'js-data' - * const JSData = require('js-data@3.0.0-rc.8') - * const { Container } = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * * const user = store.createRecord('user', { * name: 'John', * $$hashKey: '1234' - * }) - * console.log('user: ' + JSON.stringify(user.toJSON())) + * }); + * console.log('user: ' + JSON.stringify(user.toJSON())); * * @method Record#toJSON - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the representation. Only available as an option if the class * from which this record was created has a Mapper and this record resides in @@ -4509,24 +4584,23 @@ var Record$1 = Component$1.extend({ * that have `track: true` in {@link Mapper#schema}. * * @example Record#unset - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() - * store.defineMapper('user') + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); + * store.defineMapper('user'); * * const user = store.createRecord('user', { * name: 'John' - * }) - * console.log('user: ' + JSON.stringify(user)) + * }); + * console.log('user: ' + JSON.stringify(user)); * - * user.unset('name') - * console.log('user: ' + JSON.stringify(user)) + * user.unset('name'); + * console.log('user: ' + JSON.stringify(user)); * * @method Record#unset * @param {string} key Key to unset. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.silent=false] Whether to trigger change events. * @since 3.0.0 */ @@ -4539,29 +4613,28 @@ var Record$1 = Component$1.extend({ * Validate this record based on its current properties. * * @example Record#validate - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * const store = new Container() + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * const store = new Container(); * store.defineMapper('user', { * schema: { * properties: { * name: { type: 'string' } * } * } - * }) + * }); * const user = store.createRecord('user', { * name: 1234 * }, { * noValidate: true // this allows us to put the record into an invalid state - * }) - * console.log('user validation: ' + JSON.stringify(user.validate())) - * user.name = 'John' - * console.log('user validation: ' + user.validate()) + * }); + * console.log('user validation: ' + JSON.stringify(user.validate())); + * user.name = 'John'; + * console.log('user validation: ' + user.validate()); * * @method Record#validate - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}. * @returns {*} Array of errors or `undefined` if no errors. * @since 3.0.0 */ @@ -4601,11 +4674,11 @@ utils.eventify(Record.prototype, function () { * function onChange (record, changes) { * // do something * } - * record.on('change', onChange) + * record.on('change', onChange); * * @callback Record~changeListener * @param {Record} The Record that changed. - * @param {Object} The changes. + * @param {object} The changes. * @see Record#event:change * @since 3.0.0 */ @@ -4613,52 +4686,51 @@ utils.eventify(Record.prototype, function () { /** * Create a subclass of this Record: * @example Record.extend - * // Normally you would do: import {Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Record } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomRecordClass extends Record { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customRecord = new CustomRecordClass() - * console.log(customRecord.foo()) - * console.log(CustomRecordClass.beep()) + * const customRecord = new CustomRecordClass(); + * console.log(customRecord.foo()); + * console.log(CustomRecordClass.beep()); * * // Extend the class using alternate method. * const OtherRecordClass = Record.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherRecord = new OtherRecordClass() - * console.log(otherRecord.foo()) - * console.log(OtherRecordClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherRecord = new OtherRecordClass(); + * console.log(otherRecord.foo()); + * console.log(OtherRecordClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherRecordClass () { - * Record.call(this) - * this.created_at = new Date().getTime() + * Record.call(this); + * this.created_at = new Date().getTime(); * } * Record.extend({ * constructor: AnotherRecordClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherRecord = new AnotherRecordClass() - * console.log(anotherRecord.created_at) - * console.log(anotherRecord.foo()) - * console.log(AnotherRecordClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherRecord = new AnotherRecordClass(); + * console.log(anotherRecord.created_at); + * console.log(anotherRecord.foo()); + * console.log(AnotherRecordClass.beep()); * * @method Record.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Record class. * @since 3.0.0 */ @@ -5112,21 +5184,21 @@ var COLLECTION_DEFAULTS = { * An ordered set of {@link Record} instances. * * @example Collection#constructor - * // import {Collection, Record} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, Record} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Collection, Record } from 'js-data'; + * const JSData = require('js-data'); + * const {Collection, Record} = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const user1 = new Record({ id: 1 }) - * const user2 = new Record({ id: 2 }) - * const UserCollection = new Collection([user1, user2]) - * console.log(UserCollection.get(1) === user1) + * const user1 = new Record({ id: 1 }); + * const user2 = new Record({ id: 2 }); + * const UserCollection = new Collection([user1, user2]); + * console.log(UserCollection.get(1) === user1); * * @class Collection * @extends Component - * @param {Array} [records] Initial set of records to insert into the + * @param {array} [records] Initial set of records to insert into the * collection. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}. * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}. * @param {string} [opts.onConflict="merge"] See {@link Collection#onConflict}. @@ -5156,16 +5228,15 @@ var COLLECTION_DEFAULTS = { * wrap records in {@link Mapper#recordClass}. * * @example Collection#mapper - * // Normally you would do: import {Collection, Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection, Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const {Collection, Mapper} = JSData; + * console.log('Using JSData v' + JSData.version.full); * * class MyMapperClass extends Mapper { - * foo () { return 'bar' } + * foo () { return 'bar'; } * } - * const myMapper = new MyMapperClass({ name: 'myMapper' }) - * const collection = new Collection(null, { mapper: myMapper }) + * const myMapper = new MyMapperClass({ name: 'myMapper' }); + * const collection = new Collection(null, { mapper: myMapper }); * * @name Collection#mapper * @type {Mapper} @@ -5257,7 +5328,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#add * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} data The record or records to insert. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}. * @param {boolean} [opts.noValidate] See {@link Record#noValidate}. * @param {string} [opts.onConflict] See {@link Collection#onConflict}. @@ -5364,7 +5435,7 @@ var Collection$1 = Component$1.extend({ * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} result The record or records * that were added to this Collection by {@link Collection#add}. - * @param {Object} opts The `opts` argument passed to {@link Collection#add}. + * @param {object} opts The `opts` argument passed to {@link Collection#add}. */ afterAdd: function afterAdd() {}, @@ -5376,8 +5447,8 @@ var Collection$1 = Component$1.extend({ * @method Collection#afterRemove * @since 3.0.0 * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}. - * @param {Object} opts The `opts` argument passed to {@link Collection#remove}. - * @param {Object} record The result that will be returned by {@link Collection#remove}. + * @param {object} opts The `opts` argument passed to {@link Collection#remove}. + * @param {object} record The result that will be returned by {@link Collection#remove}. */ afterRemove: function afterRemove() {}, @@ -5389,9 +5460,9 @@ var Collection$1 = Component$1.extend({ * * @method Collection#afterRemoveAll * @since 3.0.0 - * @param {Object} query The `query` argument passed to {@link Collection#removeAll}. - * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}. - * @param {Object} records The result that will be returned by {@link Collection#removeAll}. + * @param {object} query The `query` argument passed to {@link Collection#removeAll}. + * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}. + * @param {object} records The result that will be returned by {@link Collection#removeAll}. */ afterRemoveAll: function afterRemoveAll() {}, @@ -5404,7 +5475,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#beforeAdd * @since 3.0.0 * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}. - * @param {Object} opts The `opts` argument passed to {@link Collection#add}. + * @param {object} opts The `opts` argument passed to {@link Collection#add}. */ beforeAdd: function beforeAdd() {}, @@ -5415,7 +5486,7 @@ var Collection$1 = Component$1.extend({ * @method Collection#beforeRemove * @since 3.0.0 * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}. - * @param {Object} opts The `opts` argument passed to {@link Collection#remove}. + * @param {object} opts The `opts` argument passed to {@link Collection#remove}. */ beforeRemove: function beforeRemove() {}, @@ -5425,8 +5496,8 @@ var Collection$1 = Component$1.extend({ * * @method Collection#beforeRemoveAll * @since 3.0.0 - * @param {Object} query The `query` argument passed to {@link Collection#removeAll}. - * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}. + * @param {object} query The `query` argument passed to {@link Collection#removeAll}. + * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}. */ beforeRemoveAll: function beforeRemoveAll() {}, @@ -5438,17 +5509,17 @@ var Collection$1 = Component$1.extend({ * * @example * // Get all users ages 18 to 30 - * const users = collection.between(18, 30, { index: 'age' }) + * const users = collection.between(18, 30, { index: 'age' }); * * @example * // Same as above - * const users = collection.between([18], [30], { index: 'age' }) + * const users = collection.between([18], [30], { index: 'age' }); * * @method Collection#between * @since 3.0.0 - * @param {Array} leftKeys Keys defining the left boundary. - * @param {Array} rightKeys Keys defining the right boundary. - * @param {Object} [opts] Configuration options. + * @param {array} leftKeys Keys defining the left boundary. + * @param {array} rightKeys Keys defining the right boundary. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @param {boolean} [opts.leftInclusive=true] Whether to include records @@ -5469,11 +5540,11 @@ var Collection$1 = Component$1.extend({ * * @example * // Index users by age - * collection.createIndex('age') + * collection.createIndex('age'); * * @example * // Index users by status and role - * collection.createIndex('statusAndRole', ['status', 'role']) + * collection.createIndex('statusAndRole', ['status', 'role']); * * @method Collection#createIndex * @since 3.0.0 @@ -5504,14 +5575,13 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()` * * @example Collection#filter - * // Normally you would do: import {Collection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Collection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const collection = new Collection([ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * * // Get the draft posts created less than three months ago * let posts = collection.filter({ @@ -5523,18 +5593,16 @@ var Collection$1 = Component$1.extend({ * '>=': (new Date().getTime() - (1000 \* 60 \* 60 \* 24 \* 30 \* 3)) // 3 months ago * } * } - * }) - * console.log(posts) + * }); + * console.log(posts); * * // Use a custom filter function - * posts = collection.filter(function (post) { - * return post.id % 2 === 0 - * }) + * posts = collection.filter((post) => post.id % 2 === 0); * * @method Collection#filter * @param {(Object|Function)} [queryOrFn={}] Selection query or filter * function. - * @param {Object} [thisArg] Context to which to bind `queryOrFn` if + * @param {object} [thisArg] Context to which to bind `queryOrFn` if * `queryOrFn` is a function. * @returns {Array} The result. * @see query @@ -5551,7 +5619,7 @@ var Collection$1 = Component$1.extend({ * @example * collection.forEach(function (record) { * // do something - * }) + * }); * * @method Collection#forEach * @since 3.0.0 @@ -5585,18 +5653,18 @@ var Collection$1 = Component$1.extend({ * * @example * // Get the posts where "status" is "draft" or "inReview" - * const posts = collection.getAll('draft', 'inReview', { index: 'status' }) + * const posts = collection.getAll('draft', 'inReview', { index: 'status' }); * * @example * // Same as above - * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' }) + * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' }); * * @method Collection#getAll * @since 3.0.0 * @param {...Array} [keyList] Provide one or more keyLists, and all * records matching each keyList will be retrieved. If no keyLists are * provided, all records will be returned. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] Name of the secondary index to use in the * query. If no index is specified, the main index is used. * @returns {Array} The result. @@ -5631,7 +5699,7 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().limit(maximumNumber).run()` * * @example - * const posts = collection.limit(10) + * const posts = collection.limit(10); * * @method Collection#limit * @since 3.0.0 @@ -5647,9 +5715,7 @@ var Collection$1 = Component$1.extend({ * Apply a mapping function to all records. * * @example - * const names = collection.map(function (user) { - * return user.name - * }) + * const names = collection.map((user) => user.name); * * @method Collection#map * @since 3.0.0 @@ -5693,7 +5759,7 @@ var Collection$1 = Component$1.extend({ * Return all "unsaved" (not uniquely identifiable) records in this colleciton. * * @method Collection#prune - * @param {Object} [opts] Configuration options, passed to {@link Collection#removeAll}. + * @param {object} [opts] Configuration options, passed to {@link Collection#removeAll}. * @since 3.0.0 * @returns {Array} The removed records, if any. */ @@ -5712,7 +5778,7 @@ var Collection$1 = Component$1.extend({ * .between(18, 30, { index: 'age' }) // between ages 18 and 30 * .skip(10) // second page * .limit(10) // page size - * .run() + * .run(); * * @method Collection#query * @since 3.0.0 @@ -5747,9 +5813,9 @@ var Collection$1 = Component$1.extend({ * Reduce the data in the collection to a single value and return the result. * * @example - * const totalVotes = collection.reduce(function (prev, record) { - * return prev + record.upVotes + record.downVotes - * }, 0) + * const totalVotes = collection.reduce((prev, record) => { + * return prev + record.upVotes + record.downVotes; + * }, 0); * * @method Collection#reduce * @since 3.0.0 @@ -5770,7 +5836,7 @@ var Collection$1 = Component$1.extend({ * @since 3.0.0 * @param {(string|number|object|Record)} idOrRecord The primary key of the * record to be removed, or a reference to the record that is to be removed. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {Object|Record} The removed record, if any. */ remove: function remove(idOrRecord, opts) { @@ -5805,11 +5871,11 @@ var Collection$1 = Component$1.extend({ * @method Collection#removeAll * @since 3.0.0 * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}. - * @param {Object} [queryOrRecords.where] See {@link query.where}. + * @param {object} [queryOrRecords.where] See {@link query.where}. * @param {number} [queryOrRecords.offset] See {@link query.offset}. * @param {number} [queryOrRecords.limit] See {@link query.limit}. * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {(Object[]|Record[])} The removed records, if any. */ removeAll: function removeAll(queryOrRecords, opts) { @@ -5841,7 +5907,7 @@ var Collection$1 = Component$1.extend({ * Shortcut for `collection.query().skip(numberToSkip).run()` * * @example - * const posts = collection.skip(10) + * const posts = collection.skip(10); * * @method Collection#skip * @since 3.0.0 @@ -5859,7 +5925,7 @@ var Collection$1 = Component$1.extend({ * * @method Collection#toJSON * @since 3.0.0 - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the representation. * @returns {Array} The records. @@ -5888,8 +5954,8 @@ var Collection$1 = Component$1.extend({ * * @method Collection#updateIndex * @since 3.0.0 - * @param {Object} record The record to update. - * @param {Object} [opts] Configuration options. + * @param {object} record The record to update. + * @param {object} [opts] Configuration options. * @param {string} [opts.index] The index in which to update the record's * position. If you don't specify an index then the record will be updated * in the main index. @@ -5906,7 +5972,7 @@ var Collection$1 = Component$1.extend({ * * @method Collection#updateIndexes * @since 3.0.0 - * @param {Object} record TODO + * @param {object} record TODO */ updateIndexes: function updateIndexes(record) { this.index.updateRecord(record); @@ -5931,11 +5997,11 @@ var Collection$1 = Component$1.extend({ * function onChange (record, changes) { * // do something * } - * collection.on('change', onChange) + * collection.on('change', onChange); * * @callback Collection~changeListener * @param {Record} The Record that changed. - * @param {Object} The changes. + * @param {object} The changes. * @see Collection#event:change * @since 3.0.0 */ @@ -5957,7 +6023,7 @@ var Collection$1 = Component$1.extend({ * function onAdd (recordOrRecords) { * // do something * } - * collection.on('add', onAdd) + * collection.on('add', onAdd); * * @callback Collection~addListener * @param {Record|Record[]} The Record or Records that were added. @@ -5984,7 +6050,7 @@ var Collection$1 = Component$1.extend({ * function onRemove (recordsOrRecords) { * // do something * } - * collection.on('remove', onRemove) + * collection.on('remove', onRemove); * * @callback Collection~removeListener * @param {Record|Record[]} Record or Records that were removed. @@ -5997,52 +6063,51 @@ var Collection$1 = Component$1.extend({ /** * Create a subclass of this Collection: * @example Collection.extend - * // Normally you would do: import {Collection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Collection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Collection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomCollectionClass extends Collection { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customCollection = new CustomCollectionClass() - * console.log(customCollection.foo()) - * console.log(CustomCollectionClass.beep()) + * const customCollection = new CustomCollectionClass(); + * console.log(customCollection.foo()); + * console.log(CustomCollectionClass.beep()); * * // Extend the class using alternate method. * const OtherCollectionClass = Collection.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherCollection = new OtherCollectionClass() - * console.log(otherCollection.foo()) - * console.log(OtherCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherCollection = new OtherCollectionClass(); + * console.log(otherCollection.foo()); + * console.log(OtherCollectionClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherCollectionClass () { - * Collection.call(this) - * this.created_at = new Date().getTime() + * Collection.call(this); + * this.created_at = new Date().getTime(); * } * Collection.extend({ * constructor: AnotherCollectionClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherCollection = new AnotherCollectionClass() - * console.log(anotherCollection.created_at) - * console.log(anotherCollection.foo()) - * console.log(AnotherCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherCollection = new AnotherCollectionClass(); + * console.log(anotherCollection.created_at); + * console.log(anotherCollection.foo()); + * console.log(AnotherCollectionClass.beep()); * * @method Collection.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Collection class. * @since 3.0.0 */ @@ -6888,7 +6953,7 @@ var typeGroupValidators = { * @method * @param {*} value Array to be validated. * @param {object} schema Schema containing at least one array keyword. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ array: function array(value, schema, opts) { @@ -6904,8 +6969,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.integer * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `integer` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `integer` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ integer: function integer(value, schema, opts) { @@ -6922,8 +6987,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.number * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `number` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `number` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ number: function number(value, schema, opts) { @@ -6942,8 +7007,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.numeric * @method * @param {*} value Number to be validated. - * @param {Object} schema Schema containing at least one `numeric` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `numeric` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ numeric: function numeric(value, schema, opts) { @@ -6961,8 +7026,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.object * @method * @param {*} value Object to be validated. - * @param {Object} schema Schema containing at least one `object` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `object` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ object: function object(value, schema, opts) { @@ -6980,8 +7045,8 @@ var typeGroupValidators = { * @name Schema.typeGroupValidators.string * @method * @param {*} value String to be validated. - * @param {Object} schema Schema containing at least one `string` keyword. - * @param {Object} [opts] Configuration options. + * @param {object} schema Schema containing at least one `string` keyword. + * @param {object} [opts] Configuration options. * @returns {(array|undefined)} Array of errors or `undefined` if valid. */ string: function string(value, schema, opts) { @@ -6992,18 +7057,17 @@ var typeGroupValidators = { * js-data's Schema class. * * @example Schema#constructor - * // Normally you would do: import {Schema} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Schema} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Schema } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const PostSchema = new Schema({ * type: 'object', * properties: { * title: { type: 'string' } * } - * }) - * PostSchema.validate({ title: 1234 }) + * }); + * PostSchema.validate({ title: 1234 }); * * @class Schema * @extends Component @@ -7324,45 +7388,44 @@ var Schema$1 = Component$1.extend({ /** * Create a subclass of this Schema: * @example Schema.extend - * // Normally you would do: import {Schema} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Schema} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Schema } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSchemaClass extends Schema { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSchema = new CustomSchemaClass() - * console.log(customSchema.foo()) - * console.log(CustomSchemaClass.beep()) + * const customSchema = new CustomSchemaClass(); + * console.log(customSchema.foo()); + * console.log(CustomSchemaClass.beep()); * * // Extend the class using alternate method. * const OtherSchemaClass = Schema.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherSchema = new OtherSchemaClass() - * console.log(otherSchema.foo()) - * console.log(OtherSchemaClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherSchema = new OtherSchemaClass(); + * console.log(otherSchema.foo()); + * console.log(OtherSchemaClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSchemaClass () { - * Schema.call(this) - * this.created_at = new Date().getTime() + * Schema.call(this); + * this.created_at = new Date().getTime(); * } * Schema.extend({ * constructor: AnotherSchemaClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherSchema = new AnotherSchemaClass() - * console.log(anotherSchema.created_at) - * console.log(anotherSchema.foo()) - * console.log(AnotherSchemaClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherSchema = new AnotherSchemaClass(); + * console.log(anotherSchema.created_at); + * console.log(anotherSchema.foo()); + * console.log(AnotherSchemaClass.beep()); * * @method Schema.extend * @param {object} [props={}] Properties to add to the prototype of the @@ -7639,23 +7702,23 @@ var MAPPER_DEFAULTS = { * [book]: http://martinfowler.com/books/eaa.html * [record]: Record.html * // Import and instantiate - * import {Mapper} from 'js-data' - * const UserMapper = new Mapper({ name: 'user' }) + * import { Mapper } from 'js-data'; + * const UserMapper = new Mapper({ name: 'user' }); * * @example * // Define a Mapper using the Container component - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); * * @class Mapper * @extends Component - * @param {Object} opts Configuration options. + * @param {object} opts Configuration options. * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}. * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}. - * @param {Object} [opts.methods] See {@link Mapper#methods}. + * @param {object} [opts.methods] See {@link Mapper#methods}. * @param {string} opts.name See {@link Mapper#name}. * @param {boolean} [opts.notify] See {@link Mapper#notify}. * @param {boolean} [opts.raw=false] See {@link Mapper#raw}. @@ -7708,46 +7771,46 @@ var MAPPER_DEFAULTS = { * * @example * // Use POJOs only. - * import {Mapper, Record} from 'js-data' - * const UserMapper = new Mapper({ recordClass: false }) - * UserMapper.recordClass // false - * const user = UserMapper#createRecord() - * user instanceof Record // false + * import { Mapper, Record } from 'js-data'; + * const UserMapper = new Mapper({ recordClass: false }); + * UserMapper.recordClass // false; + * const user = UserMapper.createRecord(); + * user instanceof Record; // false * * @example * // Set to a custom class to have records wrapped in your custom class. - * import {Mapper, Record} from 'js-data' + * import { Mapper, Record } from 'js-data'; * // Custom class * class User { * constructor (props = {}) { * for (var key in props) { * if (props.hasOwnProperty(key)) { - * this[key] = props[key] + * this[key] = props[key]; * } * } * } * } - * const UserMapper = new Mapper({ recordClass: User }) - * UserMapper.recordClass // function User() {} - * const user = UserMapper#createRecord() - * user instanceof Record // false - * user instanceof User // true + * const UserMapper = new Mapper({ recordClass: User }); + * UserMapper.recordClass; // function User() {} + * const user = UserMapper.createRecord(); + * user instanceof Record; // false + * user instanceof User; // true * * * @example * // Extend the {@link Record} class. - * import {Mapper, Record} from 'js-data' + * import { Mapper, Record } from 'js-data'; * // Custom class * class User extends Record { * constructor () { - * super(props) + * super(props); * } * } - * const UserMapper = new Mapper({ recordClass: User }) - * UserMapper.recordClass // function User() {} - * const user = UserMapper#createRecord() - * user instanceof Record // true - * user instanceof User // true + * const UserMapper = new Mapper({ recordClass: User }); + * UserMapper.recordClass; // function User() {} + * const user = UserMapper.createRecord(); + * user instanceof Record; // true + * user instanceof User; // true * * @name Mapper#recordClass * @default {@link Record} @@ -7763,10 +7826,9 @@ var MAPPER_DEFAULTS = { * This Mapper's {@link Schema}. * * @example Mapper#schema - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const UserMapper = new Mapper({ * name: 'user', @@ -7780,19 +7842,19 @@ var MAPPER_DEFAULTS = { * is_active: { type: 'number' } * } * } - * }) + * }); * const user = UserMapper.createRecord({ * id: 1, * name: 'John', * role: 'admin' - * }) + * }); * user.on('change', function (user, changes) { - * console.log(changes) - * }) + * console.log(changes); + * }); * user.on('change:role', function (user, value) { - * console.log('change:role - ' + value) - * }) - * user.role = 'owner' + * console.log('change:role - ' + value); + * }); + * user.role = 'owner'; * * @name Mapper#schema * @see Schema @@ -7876,8 +7938,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCount - * @param {Object} query The `query` argument passed to {@link Mapper#count}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#count}. + * @param {object} query The `query` argument passed to {@link Mapper#count}. + * @param {object} opts The `opts` argument passed to {@link Mapper#count}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7889,8 +7951,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCreate - * @param {Object} props The `props` argument passed to {@link Mapper#create}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#create}. + * @param {object} props The `props` argument passed to {@link Mapper#create}. + * @param {object} opts The `opts` argument passed to {@link Mapper#create}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7902,8 +7964,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterCreateMany - * @param {Array} records The `records` argument passed to {@link Mapper#createMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}. + * @param {array} records The `records` argument passed to {@link Mapper#createMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7916,7 +7978,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#afterDestroy * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7930,7 +7992,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#afterDestroyAll * @param {*} data The `data` returned by the adapter. * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7943,7 +8005,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#afterFind * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#find}. + * @param {object} opts The `opts` argument passed to {@link Mapper#find}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7955,8 +8017,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterFindAll - * @param {Object} query The `query` argument passed to {@link Mapper#findAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}. + * @param {object} query The `query` argument passed to {@link Mapper#findAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7968,8 +8030,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterSum - * @param {Object} query The `query` argument passed to {@link Mapper#sum}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}. + * @param {object} query The `query` argument passed to {@link Mapper#sum}. + * @param {object} opts The `opts` argument passed to {@link Mapper#sum}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7983,7 +8045,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#afterUpdate * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}. * @param {props} props The `props` argument passed to {@link Mapper#update}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#update}. + * @param {object} opts The `opts` argument passed to {@link Mapper#update}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -7995,9 +8057,9 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterUpdateAll - * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}. - * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}. + * @param {object} props The `props` argument passed to {@link Mapper#updateAll}. + * @param {object} query The `query` argument passed to {@link Mapper#updateAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -8009,8 +8071,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#afterUpdateMany - * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}. + * @param {array} records The `records` argument passed to {@link Mapper#updateMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}. * @param {*} result The result, if any. * @since 3.0.0 */ @@ -8022,8 +8084,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCreate - * @param {Object} props The `props` argument passed to {@link Mapper#create}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#create}. + * @param {object} props The `props` argument passed to {@link Mapper#create}. + * @param {object} opts The `opts` argument passed to {@link Mapper#create}. * @since 3.0.0 */ beforeCreate: notify, @@ -8034,8 +8096,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCreateMany - * @param {Array} records The `records` argument passed to {@link Mapper#createMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}. + * @param {array} records The `records` argument passed to {@link Mapper#createMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}. * @since 3.0.0 */ beforeCreateMany: notify, @@ -8046,8 +8108,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeCount - * @param {Object} query The `query` argument passed to {@link Mapper#count}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#count}. + * @param {object} query The `query` argument passed to {@link Mapper#count}. + * @param {object} opts The `opts` argument passed to {@link Mapper#count}. * @since 3.0.0 */ beforeCount: notify, @@ -8059,7 +8121,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeDestroy * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}. * @since 3.0.0 */ beforeDestroy: notify, @@ -8071,7 +8133,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeDestroyAll * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}. * @since 3.0.0 */ beforeDestroyAll: notify, @@ -8083,7 +8145,7 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeFind * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#find}. + * @param {object} opts The `opts` argument passed to {@link Mapper#find}. * @since 3.0.0 */ beforeFind: notify, @@ -8094,8 +8156,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeFindAll - * @param {Object} query The `query` argument passed to {@link Mapper#findAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}. + * @param {object} query The `query` argument passed to {@link Mapper#findAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}. * @since 3.0.0 */ beforeFindAll: notify, @@ -8107,8 +8169,8 @@ var Mapper$1 = Component$1.extend({ * * @method Mapper#beforeSum * @param {string} field The `field` argument passed to {@link Mapper#sum}. - * @param {Object} query The `query` argument passed to {@link Mapper#sum}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}. + * @param {object} query The `query` argument passed to {@link Mapper#sum}. + * @param {object} opts The `opts` argument passed to {@link Mapper#sum}. * @since 3.0.0 */ beforeSum: notify, @@ -8121,7 +8183,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#beforeUpdate * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}. * @param {props} props The `props` argument passed to {@link Mapper#update}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#update}. + * @param {object} opts The `opts` argument passed to {@link Mapper#update}. * @since 3.0.0 */ beforeUpdate: notify, @@ -8132,9 +8194,9 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeUpdateAll - * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}. - * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}. + * @param {object} props The `props` argument passed to {@link Mapper#updateAll}. + * @param {object} query The `query` argument passed to {@link Mapper#updateAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}. * @since 3.0.0 */ beforeUpdateAll: notify, @@ -8145,8 +8207,8 @@ var Mapper$1 = Component$1.extend({ * to resolve before continuing. * * @method Mapper#beforeUpdateMany - * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}. + * @param {array} records The `records` argument passed to {@link Mapper#updateMany}. + * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}. * @since 3.0.0 */ beforeUpdateMany: notify, @@ -8194,20 +8256,20 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // user records will be attached to post records at "post.user" * localField: 'user' - * }) + * }); * * CommentMapper.belongsTo(UserMapper, { * // comment.user_id points to user.id * foreignKey: 'user_id' * // user records will be attached to comment records at "comment.user" * localField: 'user' - * }) + * }); * CommentMapper.belongsTo(PostMapper, { * // comment.post_id points to post.id * foreignKey: 'post_id' * // post records will be attached to comment records at "comment.post" * localField: 'post' - * }) + * }); * * @method Mapper#belongsTo * @see http://www.js-data.io/v3.0/docs/relations @@ -8227,16 +8289,16 @@ var Mapper$1 = Component$1.extend({ * @example * // Get the number of published blog posts * PostMapper.count({ status: 'published' }).then((numPublished) => { - * console.log(numPublished) // e.g. 45 - * }) + * console.log(numPublished); // e.g. 45 + * }); * * @method Mapper#count - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `count` method + * @param {object} [opts] Configuration options. Refer to the `count` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8265,11 +8327,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeCreate (props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback Mapper~beforeCreateListener - * @param {Object} props The `props` argument passed to {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument passed to {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeCreate}. * @see Mapper#event:beforeCreate * @see Mapper#create * @since 3.0.0 @@ -8289,12 +8351,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterCreate (props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback Mapper~afterCreateListener - * @param {Object} props The `props` argument passed to {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterCreate}. + * @param {object} props The `props` argument passed to {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterCreate}. + * @param {object} result The `result` argument passed to {@link Mapper#afterCreate}. * @see Mapper#event:afterCreate * @see Mapper#create * @since 3.0.0 @@ -8311,14 +8373,14 @@ var Mapper$1 = Component$1.extend({ * title: 'Modeling your data', * status: 'draft' * }).then((post) => { - * console.log(post) // { id: 1234, status: 'draft', ... } - * }) + * console.log(post); // { id: 1234, status: 'draft', ... } + * }); * * @fires Mapper#beforeCreate * @fires Mapper#afterCreate * @method Mapper#create - * @param {Object} props The properties for the new record. - * @param {Object} [opts] Configuration options. Refer to the `create` method + * @param {object} props The properties for the new record. + * @param {object} [opts] Configuration options. Refer to the `create` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8404,7 +8466,7 @@ var Mapper$1 = Component$1.extend({ * @deprecated * @method Mapper#createInstance * @param {Object|Array} props See {@link Mapper#createRecord}. - * @param {Object} [opts] See {@link Mapper#createRecord}. + * @param {object} [opts] See {@link Mapper#createRecord}. * @returns {Object|Array} See {@link Mapper#createRecord}. * @see Mapper#createRecord * @since 3.0.0 @@ -8417,8 +8479,8 @@ var Mapper$1 = Component$1.extend({ /** * Creates parent record for relation types like BelongsTo or HasMany with localKeys * in order to satisfy foreignKey dependency (so called child records). - * @param {Object} props See {@link Mapper#create}. - * @param {Object} opts See {@link Mapper#create}. + * @param {object} props See {@link Mapper#create}. + * @param {object} opts See {@link Mapper#create}. * @returns {Object} cached parent records map * @see Mapper#create * @since 3.0.0 @@ -8449,11 +8511,11 @@ var Mapper$1 = Component$1.extend({ /** * Creates child record for relation types like HasOne or HasMany with foreignKey * in order to satisfy foreignKey dependency (so called parent records). - * @param {Object} props See {@link Mapper#create}. - * @param {Object} context contains collected information. - * @param {Object} context.opts See {@link Mapper#create}. - * @param {Object} context.parentRelationMap contains parent records map - * @param {Object} context.originalProps contains data passed into {@link Mapper#create} method + * @param {object} props See {@link Mapper#create}. + * @param {object} context contains collected information. + * @param {object} context.opts See {@link Mapper#create}. + * @param {object} context.parentRelationMap contains parent records map + * @param {object} context.originalProps contains data passed into {@link Mapper#create} method * @return {Promise} updated props * @see Mapper#create * @since 3.0.0 @@ -8503,11 +8565,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeCreateMany (records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback Mapper~beforeCreateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see Mapper#event:beforeCreateMany * @see Mapper#createMany * @since 3.0.0 @@ -8527,12 +8589,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterCreateMany (records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback Mapper~afterCreateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see Mapper#event:afterCreateMany * @see Mapper#createMany * @since 3.0.0 @@ -8552,15 +8614,15 @@ var Mapper$1 = Component$1.extend({ * title: 'Reading data', * status: 'draft' * }]).then((posts) => { - * console.log(posts[0]) // { id: 1234, status: 'draft', ... } - * console.log(posts[1]) // { id: 1235, status: 'draft', ... } - * }) + * console.log(posts[0]); // { id: 1234, status: 'draft', ... } + * console.log(posts[1]); // { id: 1235, status: 'draft', ... } + * }); * * @fires Mapper#beforeCreate * @fires Mapper#afterCreate * @method Mapper#createMany * @param {Record[]} records Array of records to be created in one batch. - * @param {Object} [opts] Configuration options. Refer to the `createMany` + * @param {object} [opts] Configuration options. Refer to the `createMany` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8687,14 +8749,14 @@ var Mapper$1 = Component$1.extend({ * * @example * // Create empty unsaved record instance - * const post = PostMapper.createRecord() + * const post = PostMapper.createRecord(); * * @example * // Create an unsaved record instance with inital properties * const post = PostMapper.createRecord({ * title: 'Modeling your data', * status: 'draft' - * }) + * }); * * @example * // Create a record instance that corresponds to a saved record @@ -8703,7 +8765,7 @@ var Mapper$1 = Component$1.extend({ * id: 1234, * title: 'Modeling your data', * status: 'draft' - * }) + * }); * * @example * // Create record instances from an array @@ -8713,39 +8775,39 @@ var Mapper$1 = Component$1.extend({ * }, { * title: 'Reading data', * status: 'draft' - * }]) + * }]); * * @example * // Records are validated by default - * import {Mapper} from 'js-data' + * import { Mapper } from 'js-data'; * const PostMapper = new Mapper({ * name: 'post', * schema: { properties: { title: { type: 'string' } } } - * }) + * }); * try { * const post = PostMapper.createRecord({ * title: 1234, - * }) + * }); * } catch (err) { - * console.log(err.errors) // [{ expected: 'one of (string)', actual: 'number', path: 'title' }] + * console.log(err.errors); // [{ expected: 'one of (string)', actual: 'number', path: 'title' }] * } * * @example * // Skip validation - * import {Mapper} from 'js-data' + * import { Mapper } from 'js-data'; * const PostMapper = new Mapper({ * name: 'post', * schema: { properties: { title: { type: 'string' } } } - * }) + * }); * const post = PostMapper.createRecord({ * title: 1234, - * }, { noValidate: true }) - * console.log(post.isValid()) // false + * }, { noValidate: true }); + * console.log(post.isValid()); // false * * @method Mapper#createRecord * @param {Object|Object[]} props The properties for the Record instance or an * array of property objects for the Record instances. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}. * @returns {Record|Record[]} The Record instance or Record instances. * @since 3.0.0 @@ -8857,11 +8919,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeDestroy (id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback Mapper~beforeDestroyListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}. * @see Mapper#event:beforeDestroy * @see Mapper#destroy * @since 3.0.0 @@ -8881,12 +8943,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterDestroy (id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback Mapper~afterDestroyListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument passed to {@link Mapper#afterDestroy}. * @see Mapper#event:afterDestroy * @see Mapper#destroy * @since 3.0.0 @@ -8901,20 +8963,20 @@ var Mapper$1 = Component$1.extend({ * // Destroy a specific blog post * PostMapper.destroy(1234).then(() => { * // Blog post #1234 has been destroyed - * }) + * }); * * @example * // Get full response * PostMapper.destroy(1234, { raw: true }).then((result) => { - * console.log(result.deleted) e.g. 1 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.deleted); e.g. 1 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeDestroy * @fires Mapper#afterDestroy * @method Mapper#destroy * @param {(string|number)} id The primary key of the record to destroy. - * @param {Object} [opts] Configuration options. Refer to the `destroy` method + * @param {object} [opts] Configuration options. Refer to the `destroy` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -8945,11 +9007,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeDestroyAll (query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback Mapper~beforeDestroyAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}. * @see Mapper#event:beforeDestroyAll * @see Mapper#destroyAll * @since 3.0.0 @@ -8969,12 +9031,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterDestroyAll (query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback Mapper~afterDestroyAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument passed to {@link Mapper#afterDestroyAll}. * @see Mapper#event:afterDestroyAll * @see Mapper#destroyAll * @since 3.0.0 @@ -8990,32 +9052,32 @@ var Mapper$1 = Component$1.extend({ * // Destroy all blog posts * PostMapper.destroyAll().then(() => { * // All blog posts have been destroyed - * }) + * }); * * @example * // Destroy all "draft" blog posts * PostMapper.destroyAll({ status: 'draft' }).then(() => { * // All "draft" blog posts have been destroyed - * }) + * }); * * @example * // Get full response - * const query = null - * const options = { raw: true } + * const query = null; + * const options = { raw: true }; * PostMapper.destroyAll(query, options).then((result) => { - * console.log(result.deleted) e.g. 14 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.deleted); e.g. 14 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeDestroyAll * @fires Mapper#afterDestroyAll * @method Mapper#destroyAll - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `destroyAll` + * @param {object} [opts] Configuration options. Refer to the `destroyAll` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9047,11 +9109,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeFind (id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback Mapper~beforeFindListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFind}. * @see Mapper#event:beforeFind * @see Mapper#find * @since 3.0.0 @@ -9071,12 +9133,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterFind (id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback Mapper~afterFindListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFind}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterFind}. + * @param {object} result The `result` argument passed to {@link Mapper#afterFind}. * @see Mapper#event:afterFind * @see Mapper#find * @since 3.0.0 @@ -9089,22 +9151,22 @@ var Mapper$1 = Component$1.extend({ * * @example * PostMapper.find(1).then((post) => { - * console.log(post) // { id: 1, ...} - * }) + * console.log(post); // { id: 1, ...} + * }); * * @example * // Get full response * PostMapper.find(1, { raw: true }).then((result) => { - * console.log(result.data) // { id: 1, ...} - * console.log(result.found) // 1 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.data); // { id: 1, ...} + * console.log(result.found); // 1 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeFind * @fires Mapper#afterFind * @method Mapper#find * @param {(string|number)} id The primary key of the record to retrieve. - * @param {Object} [opts] Configuration options. Refer to the `find` method + * @param {object} [opts] Configuration options. Refer to the `find` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9137,11 +9199,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeFindAll (query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback Mapper~beforeFindAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument passed to {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}. * @see Mapper#event:beforeFindAll * @see Mapper#findAll * @since 3.0.0 @@ -9161,12 +9223,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterFindAll (query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback Mapper~afterFindAllListener - * @param {Object} query The `query` argument passed to {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument passed to {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument passed to {@link Mapper#afterFindAll}. * @see Mapper#event:afterFindAll * @see Mapper#findAll * @since 3.0.0 @@ -9180,26 +9242,26 @@ var Mapper$1 = Component$1.extend({ * @example * // Find all "published" blog posts * PostMapper.findAll({ status: 'published' }).then((posts) => { - * console.log(posts) // [{ id: 1, status: 'published', ...}, ...] - * }) + * console.log(posts); // [{ id: 1, status: 'published', ...}, ...] + * }); * * @example * // Get full response * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => { - * console.log(result.data) // [{ id: 1, status: 'published', ...}, ...] - * console.log(result.found) // e.g. 13 - * console.log(...) // etc., more metadata can be found on the result - * }) + * console.log(result.data); // [{ id: 1, status: 'published', ...}, ...] + * console.log(result.found); // e.g. 13 + * console.log(...); // etc., more metadata can be found on the result + * }); * * @fires Mapper#beforeFindAll * @fires Mapper#afterFindAll * @method Mapper#findAll - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `findAll` method + * @param {object} [opts] Configuration options. Refer to the `findAll` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9291,7 +9353,7 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // post records will be attached to user records at "user.posts" * localField: 'posts' - * }) + * }); * * @method Mapper#hasMany * @see http://www.js-data.io/v3.0/docs/relations @@ -9312,7 +9374,7 @@ var Mapper$1 = Component$1.extend({ * foreignKey: 'user_id' * // profile records will be attached to user records at "user.profile" * localField: 'profile' - * }) + * }); * * @method Mapper#hasOne * @see http://www.js-data.io/v3.0/docs/relations @@ -9327,11 +9389,11 @@ var Mapper$1 = Component$1.extend({ * Return whether `record` is an instance of this Mapper's recordClass. * * @example - * const post = PostMapper.createRecord() + * const post = PostMapper.createRecord(); * - * console.log(PostMapper.is(post)) // true + * console.log(PostMapper.is(post)); // true * // Equivalent to what's above - * console.log(post instanceof PostMapper.recordClass) // true + * console.log(post instanceof PostMapper.recordClass); // true * * @method Mapper#is * @param {Object|Record} record The record to check. @@ -9351,7 +9413,7 @@ var Mapper$1 = Component$1.extend({ * @method Mapper#registerAdapter * @param {string} name The name of the adapter to register. * @param {Adapter} adapter The adapter to register. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.default=false] Whether to make the adapter the * default adapter for this Mapper. * @since 3.0.0 @@ -9405,17 +9467,17 @@ var Mapper$1 = Component$1.extend({ * * @example * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => { - * console.log(amountPaid) // e.g. 451125.34 - * }) + * console.log(amountPaid); // e.g. 451125.34 + * }); * * @method Mapper#sum * @param {string} field The field to sum. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `sum` method + * @param {object} [opts] Configuration options. Refer to the `sum` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9434,7 +9496,7 @@ var Mapper$1 = Component$1.extend({ * be optionally be included. Non-schema properties can be excluded. * * @example - * import { Mapper, Schema } from 'js-data' + * import { Mapper, Schema } from 'js-data'; * const PersonMapper = new Mapper({ * name: 'person', * schema: { @@ -9443,10 +9505,10 @@ var Mapper$1 = Component$1.extend({ * id: { type: 'string' } * } * } - * }) - * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }) + * }); + * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }); * // "foo" is stripped by toJSON() - * console.log(PersonMapper.toJSON(person)) // {"id":1,"name":"John"} + * console.log(PersonMapper.toJSON(person)); // {"id":1,"name":"John"} * * const PersonRelaxedMapper = new Mapper({ * name: 'personRelaxed', @@ -9457,15 +9519,15 @@ var Mapper$1 = Component$1.extend({ * }, * additionalProperties: true * } - * }) - * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }) + * }); + * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' }); * // "foo" is not stripped by toJSON - * console.log(PersonRelaxedMapper.toJSON(person2)) // {"id":1,"name":"John","foo":"bar"} + * console.log(PersonRelaxedMapper.toJSON(person2)); // {"id":1,"name":"John","foo":"bar"} * * @method Mapper#toJSON * @param {Record|Record[]} records Record or records from which to create a * POJO representation. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Array of relation names or relation fields * to include in the POJO representation. * @param {boolean} [opts.withAll] Whether to simply include all relations in @@ -9540,12 +9602,12 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdate (id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback Mapper~beforeUpdateListener * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument passed to {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument passed to {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}. * @see Mapper#event:beforeUpdate * @see Mapper#update * @since 3.0.0 @@ -9565,13 +9627,13 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdate (id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback Mapper~afterUpdateListener * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument passed to {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument passed to {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument passed to {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument passed to {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument passed to {@link Mapper#afterUpdate}. * @see Mapper#event:afterUpdate * @see Mapper#update * @since 3.0.0 @@ -9589,15 +9651,15 @@ var Mapper$1 = Component$1.extend({ * status: 'published', * published_at: new Date() * }).then((post) => { - * console.log(post) // { id: 1234, status: 'published', ... } - * }) + * console.log(post); // { id: 1234, status: 'published', ... } + * }); * * @fires Mapper#beforeUpdate * @fires Mapper#afterUpdate * @method Mapper#update * @param {(string|number)} id The primary key of the record to update. - * @param {Object} props The update to apply to the record. - * @param {Object} [opts] Configuration options. Refer to the `update` method + * @param {object} props The update to apply to the record. + * @param {object} [opts] Configuration options. Refer to the `update` method * of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9630,12 +9692,12 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdateAll (props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback Mapper~beforeUpdateAllListener - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see Mapper#event:beforeUpdateAll * @see Mapper#updateAll * @since 3.0.0 @@ -9655,13 +9717,13 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdateAll (props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback Mapper~afterUpdateAllListener - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see Mapper#event:afterUpdateAll * @see Mapper#updateAll * @since 3.0.0 @@ -9675,22 +9737,22 @@ var Mapper$1 = Component$1.extend({ * * @example * // Turn all of John's blog posts into drafts. - * const update = { status: draft: published_at: null } - * const query = { userId: 1234 } + * const update = { status: draft: published_at: null }; + * const query = { userId: 1234 }; * PostMapper.updateAll(update, query).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Mapper#beforeUpdateAll * @fires Mapper#afterUpdateAll * @method Mapper#updateAll - * @param {Object} props Update to apply to selected records. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} props Update to apply to selected records. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. Refer to the `updateAll` + * @param {object} [opts] Configuration options. Refer to the `updateAll` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9722,11 +9784,11 @@ var Mapper$1 = Component$1.extend({ * function onBeforeUpdateMany (records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback Mapper~beforeUpdateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see Mapper#event:beforeUpdateMany * @see Mapper#updateMany * @since 3.0.0 @@ -9746,12 +9808,12 @@ var Mapper$1 = Component$1.extend({ * function onAfterUpdateMany (records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback Mapper~afterUpdateManyListener - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see Mapper#event:afterUpdateMany * @see Mapper#updateMany * @since 3.0.0 @@ -9769,14 +9831,14 @@ var Mapper$1 = Component$1.extend({ * { id: 1234, status: 'draft' }, * { id: 2468, status: 'published', published_at: new Date() } * ]).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Mapper#beforeUpdateMany * @fires Mapper#afterUpdateMany * @method Mapper#updateMany * @param {Record[]} records Array up record updates. - * @param {Object} [opts] Configuration options. Refer to the `updateMany` + * @param {object} [opts] Configuration options. Refer to the `updateMany` * method of whatever adapter you're using for more configuration options. * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the * adapter to use. @@ -9805,19 +9867,19 @@ var Mapper$1 = Component$1.extend({ * name: { type: 'string' }, * id: { type: 'string' } * } - * }) + * }); * const PersonMapper = new Mapper({ * name: 'person', * schema: PersonSchema - * }) - * let errors = PersonMapper.validate({ name: 'John' }) - * console.log(errors) // undefined - * errors = PersonMapper.validate({ name: 123 }) - * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] + * }); + * let errors = PersonMapper.validate({ name: 'John' }); + * console.log(errors); // undefined + * errors = PersonMapper.validate({ name: 123 }); + * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] * * @method Mapper#validate * @param {Object|Object[]} record The record or records to validate. - * @param {Object} [opts] Configuration options. Passed to + * @param {object} [opts] Configuration options. Passed to * {@link Schema#validate}. * @returns {Object[]} Array of errors or `undefined` if no errors. * @since 3.0.0 @@ -9851,7 +9913,7 @@ var Mapper$1 = Component$1.extend({ * * ``` * function (data, opts) { - * return this.createRecord(data, opts) + * return this.createRecord(data, opts); * } * ``` * @@ -9860,21 +9922,21 @@ var Mapper$1 = Component$1.extend({ * name: 'post', * // Override to customize behavior * wrap (data, opts) { - * const originalWrap = this.constructor.prototype.wrap + * const originalWrap = this.constructor.prototype.wrap; * // Let's say "GET /post" doesn't return JSON quite like JSData expects, * // but the actual post records are nested under a "posts" field. So, * // we override Mapper#wrap to handle this special case. * if (opts.op === 'findAll') { - * return originalWrap.call(this, data.posts, opts) + * return originalWrap.call(this, data.posts, opts); * } * // Otherwise perform original behavior - * return originalWrap.call(this, data, opts) + * return originalWrap.call(this, data, opts); * } - * }) + * }); * * @method Mapper#wrap * @param {Object|Object[]} data The record or records to be wrapped. - * @param {Object} [opts] Configuration options. Passed to {@link Mapper#createRecord}. + * @param {object} [opts] Configuration options. Passed to {@link Mapper#createRecord}. * @returns {Record|Record[]} The wrapped record or records. * @since 3.0.0 */ @@ -9917,52 +9979,51 @@ var Mapper$1 = Component$1.extend({ * Create a subclass of this Mapper: * * @example Mapper.extend - * // Normally you would do: import {Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Mapper} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomMapperClass extends Mapper { - * foo () { return 'bar' } - * static beep () { return 'boop' } - * } - * const customMapper = new CustomMapperClass() - * console.log(customMapper.foo()) - * console.log(CustomMapperClass.beep()) + * foo () { return 'bar'; } + * static beep () { return 'boop'; } + * }; + * const customMapper = new CustomMapperClass(); + * console.log(customMapper.foo()); + * console.log(CustomMapperClass.beep()); * * // Extend the class using alternate method. * const OtherMapperClass = Mapper.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherMapper = new OtherMapperClass() - * console.log(otherMapper.foo()) - * console.log(OtherMapperClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherMapper = new OtherMapperClass(); + * console.log(otherMapper.foo()); + * console.log(OtherMapperClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherMapperClass () { - * Mapper.call(this) - * this.created_at = new Date().getTime() + * Mapper.call(this); + * this.created_at = new Date().getTime(); * } * Mapper.extend({ * constructor: AnotherMapperClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherMapper = new AnotherMapperClass() - * console.log(anotherMapper.created_at) - * console.log(anotherMapper.foo()) - * console.log(AnotherMapperClass.beep()) + * const anotherMapper = new AnotherMapperClass(); + * console.log(anotherMapper.created_at); + * console.log(anotherMapper.foo()); + * console.log(AnotherMapperClass.beep()); * * @method Mapper.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Mapper class. * @since 3.0.0 */ @@ -9975,20 +10036,20 @@ var proxiedMapperMethods = [ * * @example * // Get the number of published blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.count('post', { status: 'published' }).then((numPublished) => { - * console.log(numPublished) // e.g. 45 - * }) + * console.log(numPublished); // e.g. 45 + * }); * * @method Container#count * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#count}. - * @param {Object} [opts] See {@link Mapper#count}. + * @param {object} [query] See {@link Mapper#count}. + * @param {object} [opts] See {@link Mapper#count}. * @returns {Promise} See {@link Mapper#count}. * @see Mapper#count * @since 3.0.0 @@ -10010,12 +10071,12 @@ var proxiedMapperMethods = [ * function onBeforeCreate (mapperName, props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback Container~beforeCreateListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}. * @see Container#event:beforeCreate * @see Container#create * @since 3.0.0 @@ -10035,13 +10096,13 @@ var proxiedMapperMethods = [ * function onAfterCreate (mapperName, props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback Container~afterCreateListener * @param {string} name The `name` argument received by {@link Mapper#afterCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}. + * @param {object} props The `props` argument received by {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreate}. * @see Container#event:afterCreate * @see Container#create * @since 3.0.0 @@ -10051,25 +10112,25 @@ var proxiedMapperMethods = [ * * @example * // Create and save a new blog post - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.create('post', { * title: 'Modeling your data', * status: 'draft' * }).then((post) => { - * console.log(post) // { id: 1234, status: 'draft', ... } - * }) + * console.log(post); // { id: 1234, status: 'draft', ... } + * }); * * @fires Container#beforeCreate * @fires Container#afterCreate * @method Container#create * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} props See {@link Mapper#create}. - * @param {Object} [opts] See {@link Mapper#create}. + * @param {object} props See {@link Mapper#create}. + * @param {object} [opts] See {@link Mapper#create}. * @returns {Promise} See {@link Mapper#create}. * @see Mapper#create * @since 3.0.0 @@ -10091,12 +10152,12 @@ var proxiedMapperMethods = [ * function onBeforeCreateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback Container~beforeCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see Container#event:beforeCreateMany * @see Container#createMany * @since 3.0.0 @@ -10116,13 +10177,13 @@ var proxiedMapperMethods = [ * function onAfterCreateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback Container~afterCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see Container#event:afterCreateMany * @see Container#createMany * @since 3.0.0 @@ -10132,11 +10193,11 @@ var proxiedMapperMethods = [ * * @example * // Create and save several new blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.createMany('post', [{ * title: 'Modeling your data', @@ -10145,16 +10206,16 @@ var proxiedMapperMethods = [ * title: 'Reading data', * status: 'draft' * }]).then((posts) => { - * console.log(posts[0]) // { id: 1234, status: 'draft', ... } - * console.log(posts[1]) // { id: 1235, status: 'draft', ... } - * }) + * console.log(posts[0]); // { id: 1234, status: 'draft', ... } + * console.log(posts[1]); // { id: 1235, status: 'draft', ... } + * }); * * @fires Container#beforeCreateMany * @fires Container#afterCreateMany * @method Container#createMany * @param {string} name Name of the {@link Mapper} to target. * @param {Record[]} records See {@link Mapper#createMany}. - * @param {Object} [opts] See {@link Mapper#createMany}. + * @param {object} [opts] See {@link Mapper#createMany}. * @returns {Promise} See {@link Mapper#createMany}. * @see Mapper#createMany * @since 3.0.0 @@ -10169,15 +10230,15 @@ var proxiedMapperMethods = [ * * @example * // Create empty unsaved record instance - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('post') - * const post = PostMapper.createRecord() + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('post'); + * const post = PostMapper.createRecord(); * * @method Container#createRecord * @param {string} name Name of the {@link Mapper} to target. * @param {Object|Object[]} props See {@link Mapper#createRecord}. - * @param {Object} [opts] See {@link Mapper#createRecord}. + * @param {object} [opts] See {@link Mapper#createRecord}. * @returns {Promise} See {@link Mapper#createRecord}. * @see Mapper#createRecord * @since 3.0.0 @@ -10199,12 +10260,12 @@ var proxiedMapperMethods = [ * function onBeforeDestroy (mapperName, id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback Container~beforeDestroyListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. * @see Container#event:beforeDestroy * @see Container#destroy * @since 3.0.0 @@ -10224,13 +10285,13 @@ var proxiedMapperMethods = [ * function onAfterDestroy (mapperName, id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback Container~afterDestroyListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}. * @see Container#event:afterDestroy * @see Container#destroy * @since 3.0.0 @@ -10240,22 +10301,22 @@ var proxiedMapperMethods = [ * * @example * // Destroy a specific blog post - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.destroy('post', 1234).then(() => { * // Blog post #1234 has been destroyed - * }) + * }); * * @fires Container#beforeDestroy * @fires Container#afterDestroy * @method Container#destroy * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#destroy}. - * @param {Object} [opts] See {@link Mapper#destroy}. + * @param {object} [opts] See {@link Mapper#destroy}. * @returns {Promise} See {@link Mapper#destroy}. * @see Mapper#destroy * @since 3.0.0 @@ -10277,12 +10338,12 @@ var proxiedMapperMethods = [ * function onBeforeDestroyAll (mapperName, query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback Container~beforeDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. * @see Container#event:beforeDestroyAll * @see Container#destroyAll * @since 3.0.0 @@ -10302,13 +10363,13 @@ var proxiedMapperMethods = [ * function onAfterDestroyAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback Container~afterDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}. * @see Container#event:afterDestroyAll * @see Container#destroyAll * @since 3.0.0 @@ -10318,22 +10379,22 @@ var proxiedMapperMethods = [ * * @example * // Destroy all "draft" blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.destroyAll('post', { status: 'draft' }).then(() => { * // All "draft" blog posts have been destroyed - * }) + * }); * * @fires Container#beforeDestroyAll * @fires Container#afterDestroyAll * @method Container#destroyAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#destroyAll}. - * @param {Object} [opts] See {@link Mapper#destroyAll}. + * @param {object} [query] See {@link Mapper#destroyAll}. + * @param {object} [opts] See {@link Mapper#destroyAll}. * @returns {Promise} See {@link Mapper#destroyAll}. * @see Mapper#destroyAll * @since 3.0.0 @@ -10355,12 +10416,12 @@ var proxiedMapperMethods = [ * function onBeforeFind (mapperName, id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback Container~beforeFindListener * @param {string} name The `name` argument received by {@link Mapper#beforeFind}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}. * @see Container#event:beforeFind * @see Container#find * @since 3.0.0 @@ -10380,13 +10441,13 @@ var proxiedMapperMethods = [ * function onAfterFind (mapperName, id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback Container~afterFindListener * @param {string} name The `name` argument received by {@link Mapper#afterFind}. * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}. + * @param {object} result The `result` argument received by {@link Mapper#afterFind}. * @see Container#event:afterFind * @see Container#find * @since 3.0.0 @@ -10395,22 +10456,22 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#find}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.find('post', 1).then((post) => { * console.log(post) // { id: 1, ...} - * }) + * }); * * @fires Container#beforeFind * @fires Container#afterFind * @method Container#find * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#find}. - * @param {Object} [opts] See {@link Mapper#find}. + * @param {object} [opts] See {@link Mapper#find}. * @returns {Promise} See {@link Mapper#find}. * @see Mapper#find * @since 3.0.0 @@ -10432,12 +10493,12 @@ var proxiedMapperMethods = [ * function onBeforeFindAll (mapperName, query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback Container~beforeFindAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. * @see Container#event:beforeFindAll * @see Container#findAll * @since 3.0.0 @@ -10457,13 +10518,13 @@ var proxiedMapperMethods = [ * function onAfterFindAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback Container~afterFindAllListener * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}. * @see Container#event:afterFindAll * @see Container#findAll * @since 3.0.0 @@ -10473,22 +10534,22 @@ var proxiedMapperMethods = [ * * @example * // Find all "published" blog posts - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.findAll('post', { status: 'published' }).then((posts) => { - * console.log(posts) // [{ id: 1, ...}, ...] - * }) + * console.log(posts); // [{ id: 1, ...}, ...] + * }); * * @fires Container#beforeFindAll * @fires Container#afterFindAll * @method Container#findAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] See {@link Mapper#findAll}. - * @param {Object} [opts] See {@link Mapper#findAll}. + * @param {object} [query] See {@link Mapper#findAll}. + * @param {object} [opts] See {@link Mapper#findAll}. * @returns {Promise} See {@link Mapper#findAll}. * @see Mapper#findAll * @since 3.0.0 @@ -10510,14 +10571,14 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#is}. * * @example - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('post') - * const post = store.createRecord() + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('post'); + * const post = store.createRecord(); * - * console.log(store.is('post', post)) // true + * console.log(store.is('post', post)); // true * // Equivalent to what's above - * console.log(post instanceof store.getMapper('post').recordClass) // true + * console.log(post instanceof store.getMapper('post').recordClass); // true * * @method Container#is * @param {string} name Name of the {@link Mapper} to target. @@ -10532,21 +10593,21 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#sum}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('purchase_order') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('purchase_order'); * * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => { - * console.log(amountPaid) // e.g. 451125.34 - * }) + * console.log(amountPaid); // e.g. 451125.34 + * }); * * @method Container#sum * @param {string} name Name of the {@link Mapper} to target. * @param {string} field See {@link Mapper#sum}. - * @param {Object} [query] See {@link Mapper#sum}. - * @param {Object} [opts] See {@link Mapper#sum}. + * @param {object} [query] See {@link Mapper#sum}. + * @param {object} [opts] See {@link Mapper#sum}. * @returns {Promise} See {@link Mapper#sum}. * @see Mapper#sum * @since 3.0.0 @@ -10557,10 +10618,10 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#toJSON}. * * @example - * import { Container } from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); * store.defineMapper('person', { * schema: { * properties: { @@ -10568,10 +10629,10 @@ var proxiedMapperMethods = [ * id: { type: 'string' } * } * } - * }) - * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' }) + * }); + * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' }); * // "foo" is stripped by toJSON() - * console.log(store.toJSON('person', person)) // {"id":1,"name":"John"} + * console.log(store.toJSON('person', person)); // {"id":1,"name":"John"} * * store.defineMapper('personRelaxed', { * schema: { @@ -10581,15 +10642,15 @@ var proxiedMapperMethods = [ * }, * additionalProperties: true * } - * }) - * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' }) + * }); + * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' }); * // "foo" is not stripped by toJSON - * console.log(store.toJSON('personRelaxed', person2)) // {"id":1,"name":"John","foo":"bar"} + * console.log(store.toJSON('personRelaxed', person2)); // {"id":1,"name":"John","foo":"bar"} * * @method Container#toJSON * @param {string} name Name of the {@link Mapper} to target. * @param {Record|Record[]} records See {@link Mapper#toJSON}. - * @param {Object} [opts] See {@link Mapper#toJSON}. + * @param {object} [opts] See {@link Mapper#toJSON}. * @returns {Object|Object[]} See {@link Mapper#toJSON}. * @see Mapper#toJSON * @since 3.0.0 @@ -10611,13 +10672,13 @@ var proxiedMapperMethods = [ * function onBeforeUpdate (mapperName, id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback Container~beforeUpdateListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. * @see Container#event:beforeUpdate * @see Container#update * @since 3.0.0 @@ -10637,14 +10698,14 @@ var proxiedMapperMethods = [ * function onAfterUpdate (mapperName, id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback Container~afterUpdateListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}. * @see Container#event:afterUpdate * @see Container#update * @since 3.0.0 @@ -10653,26 +10714,26 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#update}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.update('post', 1234, { * status: 'published', * published_at: new Date() * }).then((post) => { - * console.log(post) // { id: 1234, status: 'published', ... } - * }) + * console.log(post); // { id: 1234, status: 'published', ... } + * }); * * @fires Container#beforeUpdate * @fires Container#afterUpdate * @method Container#update * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id See {@link Mapper#update}. - * @param {Object} record See {@link Mapper#update}. - * @param {Object} [opts] See {@link Mapper#update}. + * @param {object} record See {@link Mapper#update}. + * @param {object} [opts] See {@link Mapper#update}. * @returns {Promise} See {@link Mapper#update}. * @see Mapper#update * @since 3.0.0 @@ -10695,13 +10756,13 @@ var proxiedMapperMethods = [ * function onBeforeUpdateAll (mapperName, props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback Container~beforeUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see Container#event:beforeUpdateAll * @see Container#updateAll * @since 3.0.0 @@ -10721,14 +10782,14 @@ var proxiedMapperMethods = [ * function onAfterUpdateAll (mapperName, props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback Container~afterUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see Container#event:afterUpdateAll * @see Container#updateAll * @since 3.0.0 @@ -10738,25 +10799,25 @@ var proxiedMapperMethods = [ * * @example * // Turn all of John's blog posts into drafts. - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') - * - * const update = { status: draft: published_at: null } - * const query = { userId: 1234 } + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); + * + * const update = { status: draft: published_at: null }; + * const query = { userId: 1234 }; * store.updateAll('post', update, query).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Container#beforeUpdateAll * @fires Container#afterUpdateAll * @method Container#updateAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} update See {@link Mapper#updateAll}. - * @param {Object} [query] See {@link Mapper#updateAll}. - * @param {Object} [opts] See {@link Mapper#updateAll}. + * @param {object} update See {@link Mapper#updateAll}. + * @param {object} [query] See {@link Mapper#updateAll}. + * @param {object} [opts] See {@link Mapper#updateAll}. * @returns {Promise} See {@link Mapper#updateAll}. * @see Mapper#updateAll * @since 3.0.0 @@ -10778,12 +10839,12 @@ var proxiedMapperMethods = [ * function onBeforeUpdateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback Container~beforeUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see Container#event:beforeUpdateMany * @see Container#updateMany * @since 3.0.0 @@ -10803,13 +10864,13 @@ var proxiedMapperMethods = [ * function onAfterUpdateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback Container~afterUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see Container#event:afterUpdateMany * @see Container#updateMany * @since 3.0.0 @@ -10818,25 +10879,25 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#updateMany}. * * @example - * import {Container} from 'js-data' - * import RethinkDBAdapter from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) - * store.defineMapper('post') + * import { Container } from 'js-data'; + * import RethinkDBAdapter from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); + * store.defineMapper('post'); * * store.updateMany('post', [ * { id: 1234, status: 'draft' }, * { id: 2468, status: 'published', published_at: new Date() } * ]).then((posts) => { - * console.log(posts) // [...] - * }) + * console.log(posts); // [...] + * }); * * @fires Container#beforeUpdateMany * @fires Container#afterUpdateMany * @method Container#updateMany * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}. - * @param {Object} [opts] See {@link Mapper#updateMany}. + * @param {object} [opts] See {@link Mapper#updateMany}. * @returns {Promise} See {@link Mapper#updateMany}. * @see Mapper#updateMany * @since 3.0.0 @@ -10847,8 +10908,8 @@ var proxiedMapperMethods = [ * Wrapper for {@link Mapper#validate}. * * @example - * import {Container} from 'js-data' - * const store = new Container() + * import { Container } from 'js-data'; + * const store = new Container(); * store.defineMapper('post', { * schema: { * properties: { @@ -10856,16 +10917,16 @@ var proxiedMapperMethods = [ * id: { type: 'string' } * } * } - * }) - * let errors = store.validate('post', { name: 'John' }) - * console.log(errors) // undefined - * errors = store.validate('post', { name: 123 }) - * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] + * }); + * let errors = store.validate('post', { name: 'John' }); + * console.log(errors); // undefined + * errors = store.validate('post', { name: 123 }); + * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }] * * @method Container#validate * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records See {@link Mapper#validate}. - * @param {Object} [opts] See {@link Mapper#validate}. + * @param {object} [opts] See {@link Mapper#validate}. * @returns {Promise} See {@link Mapper#validate}. * @see Mapper#validate * @since 3.0.0 @@ -10881,19 +10942,19 @@ var proxiedMapperMethods = [ * don't have to register adapters for every single Mapper. * * @example Container#constructor - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const {Container} = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * * @class Container * @extends Component - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}. - * @param {Object} [opts.mapperDefaults] See {@link Container#mapperDefaults}. + * @param {object} [opts.mapperDefaults] See {@link Container#mapperDefaults}. * @since 3.0.0 */ function Container(opts) { @@ -10933,19 +10994,19 @@ function Container(opts) { * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers. * * @example Container#mapperClass - * // import {Container, Mapper} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container, Mapper } from 'js-data'; + * const JSData = require('js-data'); + * const { Container, Mapper } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * class MyMapperClass extends Mapper { * foo () { return 'bar' } * } * const store = new Container({ * mapperClass: MyMapperClass - * }) - * store.defineMapper('user') - * console.log(store.getMapper('user').foo()) + * }); + * store.defineMapper('user'); + * console.log(store.getMapper('user').foo()); * * @name Container#mapperClass * @see Mapper @@ -10966,18 +11027,18 @@ function Container(opts) { * new {@link Mapper}. * * @example Container#mapperDefaults - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const store = new Container({ * mapperDefaults: { * idAttribute: '_id' * } - * }) - * store.defineMapper('user') - * console.log(store.getMapper('user').idAttribute) + * }); + * store.defineMapper('user'); + * console.log(store.getMapper('user').idAttribute); * * @default {} * @name Container#mapperDefaults @@ -11001,16 +11062,16 @@ var props = { * the arugments passed to the listener. * * @example Container#on - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() - * store.on('foo', function (...args) { console.log(args.join(':')) }) - * store.defineMapper('user') - * store.emit('foo', 'arg1', 'arg2') - * store.getMapper('user').emit('foo', 'arg1', 'arg2') + * const store = new Container(); + * store.on('foo', function (...args) { console.log(args.join(':')) }); + * store.defineMapper('user'); + * store.emit('foo', 'arg1', 'arg2'); + * store.getMapper('user').emit('foo', 'arg1', 'arg2'); * * @method Container#on * @param {string} event Name of event to subsribe to. @@ -11042,21 +11103,21 @@ var props = { * Return a container scoped to a particular mapper. * * @example Container#as - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new Container() - * const UserMapper = store.defineMapper('user') - * const UserStore = store.as('user') - * - * const user1 = store.createRecord('user', { name: 'John' }) - * const user2 = UserStore.createRecord({ name: 'John' }) - * const user3 = UserMapper.createRecord({ name: 'John' }) - * console.log(user1 === user2) - * console.log(user2 === user3) - * console.log(user1 === user3) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new Container(); + * const UserMapper = store.defineMapper('user'); + * const UserStore = store.as('user'); + * + * const user1 = store.createRecord('user', { name: 'John' }); + * const user2 = UserStore.createRecord({ name: 'John' }); + * const user3 = UserMapper.createRecord({ name: 'John' }); + * console.log(user1 === user2); + * console.log(user2 === user3); + * console.log(user1 === user3); * * @method Container#as * @param {string} name Name of the {@link Mapper}. @@ -11092,25 +11153,25 @@ var props = { * Create a new mapper and register it in this container. * * @example Container#defineMapper - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * const store = new Container({ * mapperDefaults: { foo: 'bar' } - * }) + * }); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * console.log(UserMapper.foo) + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * console.log(UserMapper.foo); * * @method Container#defineMapper * @param {string} name Name under which to register the new {@link Mapper}. * {@link Mapper#name} will be set to this value. - * @param {Object} [opts] Configuration options. Passed to + * @param {object} [opts] Configuration options. Passed to * {@link Container#mapperClass} when creating the new {@link Mapper}. * @returns {Mapper} The newly created instance of {@link Mapper}. * @see Container#as @@ -11220,18 +11281,18 @@ var props = { * Return the mapper registered under the specified name. * * @example Container#getMapper - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * store.getMapper('profile') // throws Error, there is no mapper with name "profile" + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * store.getMapper('profile'); // throws Error, there is no mapper with name "profile" * * @method Container#getMapper * @param {string} name {@link Mapper#name}. @@ -11252,18 +11313,18 @@ var props = { * Doesn't throw error if mapper doesn't exist. * * @example Container#getMapperByName - * // import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * // import { Container } from 'js-data'; + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new Container() + * const store = new Container(); * // Container#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') - * console.log(UserMapper === store.getMapper('user')) - * console.log(UserMapper === store.as('user').getMapper()) - * console.log(store.getMapper('profile')) // Does NOT throw an error + * const UserMapper = store.defineMapper('user'); + * console.log(UserMapper === store.getMapper('user')); + * console.log(UserMapper === store.as('user').getMapper()); + * console.log(store.getMapper('profile')); // Does NOT throw an error * * @method Container#getMapperByName * @param {string} name {@link Mapper#name}. @@ -11280,15 +11341,15 @@ var props = { * registered on a container are shared by all mappers in the container. * * @example - * import {Container} from 'js-data' - * import {RethinkDBAdapter} from 'js-data-rethinkdb' - * const store = new Container() - * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }) + * import { Container } from 'js-data'; + * import { RethinkDBAdapter } from 'js-data-rethinkdb'; + * const store = new Container(); + * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true }); * * @method Container#registerAdapter * @param {string} name The name of the adapter to register. * @param {Adapter} adapter The adapter to register. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {boolean} [opts.default=false] Whether to make the adapter the * default adapter for all Mappers in this container. * @since 3.0.0 @@ -11324,52 +11385,51 @@ Component$1.extend(props); /** * Create a subclass of this Container: * @example Container.extend - * // Normally you would do: import {Container} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {Container} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { Container } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomContainerClass extends Container { * foo () { return 'bar' } * static beep () { return 'boop' } * } - * const customContainer = new CustomContainerClass() - * console.log(customContainer.foo()) - * console.log(CustomContainerClass.beep()) + * const customContainer = new CustomContainerClass(); + * console.log(customContainer.foo()); + * console.log(CustomContainerClass.beep()); * * // Extend the class using alternate method. * const OtherContainerClass = Container.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherContainer = new OtherContainerClass() - * console.log(otherContainer.foo()) - * console.log(OtherContainerClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherContainer = new OtherContainerClass(); + * console.log(otherContainer.foo()); + * console.log(OtherContainerClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherContainerClass () { - * Container.call(this) - * this.created_at = new Date().getTime() + * Container.call(this); + * this.created_at = new Date().getTime(); * } * Container.extend({ * constructor: AnotherContainerClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherContainer = new AnotherContainerClass() - * console.log(anotherContainer.created_at) - * console.log(anotherContainer.foo()) - * console.log(AnotherContainerClass.beep()) + * const anotherContainer = new AnotherContainerClass(); + * console.log(anotherContainer.created_at); + * console.log(anotherContainer.foo()); + * console.log(AnotherContainerClass.beep()); * * @method Container.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this Container class. * @since 3.0.0 */ @@ -11380,27 +11440,26 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#add}. * * @example SimpleStore#add - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('book') + * const store = new SimpleStore(); + * store.defineMapper('book'); * * // Add one book to the in-memory store: - * store.add('book', { id: 1, title: 'Respect your Data' }) + * store.add('book', { id: 1, title: 'Respect your Data' }); * // Add multiple books to the in-memory store: * store.add('book', [ * { id: 2, title: 'Easy data recipes' }, * { id: 3, title: 'Active Record 101' } - * ]) + * ]); * * @fires SimpleStore#add * @method SimpleStore#add * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}. - * @param {Object} [opts] Configuration options. See {@link Collection#add}. + * @param {object} [opts] Configuration options. See {@link Collection#add}. * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}. * @see Collection#add * @see Collection#add @@ -11413,17 +11472,17 @@ var proxiedCollectionMethods = [ * * @example * // Get all users ages 18 to 30 - * const users = store.between('user', 18, 30, { index: 'age' }) + * const users = store.between('user', 18, 30, { index: 'age' }); * * @example * // Same as above - * const users = store.between('user', [18], [30], { index: 'age' }) + * const users = store.between('user', [18], [30], { index: 'age' }); * * @method SimpleStore#between * @param {(string|number)} name Name of the {@link Mapper} to target. - * @param {Array} leftKeys See {@link Collection#between}. - * @param {Array} rightKeys See {@link Collection#between}. - * @param {Object} [opts] Configuration options. See {@link Collection#between}. + * @param {array} leftKeys See {@link Collection#between}. + * @param {array} rightKeys See {@link Collection#between}. + * @param {object} [opts] Configuration options. See {@link Collection#between}. * @returns {Object[]|Record[]} See {@link Collection#between}. * @see Collection#between * @see Collection#between @@ -11436,11 +11495,11 @@ var proxiedCollectionMethods = [ * * @example * // Index users by age - * store.createIndex('user', 'age') + * store.createIndex('user', 'age'); * * @example * // Index users by status and role - * store.createIndex('user', 'statusAndRole', ['status', 'role']) + * store.createIndex('user', 'statusAndRole', ['status', 'role']); * * @method SimpleStore#createIndex * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11456,16 +11515,15 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#filter}. * * @example SimpleStore#filter - * // import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('post') + * const store = new SimpleStore(); + * store.defineMapper('post'); * store.add('post', [ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * * // Get the draft posts created less than three months ago * let posts = store.filter('post', { @@ -11477,16 +11535,16 @@ var proxiedCollectionMethods = [ * '>=': (new Date().getTime() - (1000 \* 60 \* 60 \* 24 \* 30 \* 3)) // 3 months ago * } * } - * }) - * console.log(posts) + * }); + * console.log(posts); * * // Use a custom filter function - * posts = store.filter('post', function (post) { return post.id % 2 === 0 }) + * posts = store.filter('post', function (post) { return post.id % 2 === 0 }); * * @method SimpleStore#filter * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}. - * @param {Object} [thisArg] See {@link Collection#filter}. + * @param {object} [thisArg] See {@link Collection#filter}. * @returns {Array} See {@link Collection#filter}. * @see Collection#filter * @see Collection#filter @@ -11498,19 +11556,18 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#get}. * * @example SimpleStore#get - * // import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * - * const store = new SimpleStore() - * store.defineMapper('post') + * const store = new SimpleStore(); + * store.defineMapper('post'); * store.add('post', [ * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() } - * ]) + * ]); * - * console.log(store.get('post', 1)) // {...} - * console.log(store.get('post', 2)) // undefined + * console.log(store.get('post', 1)); // {...} + * console.log(store.get('post', 2)); // undefined * * @method SimpleStore#get * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11527,16 +11584,16 @@ var proxiedCollectionMethods = [ * * @example * // Get the posts where "status" is "draft" or "inReview" - * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' }) + * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' }); * * @example * // Same as above - * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' }) + * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' }); * * @method SimpleStore#getAll * @param {(string|number)} name Name of the {@link Mapper} to target. * @param {...Array} [keyList] See {@link Collection#getAll}. - * @param {Object} [opts] See {@link Collection#getAll}. + * @param {object} [opts] See {@link Collection#getAll}. * @returns {Array} See {@link Collection#getAll}. * @see Collection#getAll * @see Collection#getAll @@ -11548,7 +11605,7 @@ var proxiedCollectionMethods = [ * Wrapper for {@link Collection#prune}. * * @method SimpleStore#prune - * @param {Object} [opts] See {@link Collection#prune}. + * @param {object} [opts] See {@link Collection#prune}. * @returns {Array} See {@link Collection#prune}. * @see Collection#prune * @see Collection#prune @@ -11565,7 +11622,7 @@ var proxiedCollectionMethods = [ * .between(18, 30, { index: 'age' }) // between ages 18 and 30 * .skip(10) // second page * .limit(10) // page size - * .run() + * .run(); * * @method SimpleStore#query * @param {(string|number)} name Name of the {@link Mapper} to target. @@ -11587,20 +11644,20 @@ var proxiedCollectionMethods = [ * title: { type: 'string' } * } * } - * }) + * }); * store.add('post', [ * { id: 1, status: 'published', title: 'Respect your Data' }, * { id: 2, status: 'draft', title: 'Connecting to a data source' } - * ]) - * console.log(store.toJSON('post')) + * ]); + * console.log(store.toJSON('post')); * const draftsJSON = store.query('post') * .filter({ status: 'draft' }) * .mapCall('toJSON') - * .run() + * .run(); * * @method SimpleStore#toJSON * @param {(string|number)} name Name of the {@link Mapper} to target. - * @param {Object} [opts] See {@link Collection#toJSON}. + * @param {object} [opts] See {@link Collection#toJSON}. * @returns {Array} See {@link Collection#toJSON}. * @see Collection#toJSON * @see Collection#toJSON @@ -11665,37 +11722,37 @@ var SIMPLESTORE_DEFAULTS = { * (the Mappers). * * ```javascript - * import {SimpleStore} from 'js-data' + * import { SimpleStore } from 'js-data'; * ``` * * @example - * import {SimpleStore} from 'js-data' - * import HttpAdapter from 'js-data-http' - * const store = new SimpleStore() + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; + * const store = new SimpleStore(); * * // SimpleStore#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') + * const UserMapper = store.defineMapper('user'); * * // SimpleStore#as returns the store scoped to a particular Mapper. - * const UserStore = store.as('user') + * const UserStore = store.as('user'); * * // Call "find" on "UserMapper" (Stateless ORM) * UserMapper.find(1).then((user) => { * // retrieved a "user" record via the http adapter, but that's it * * // Call "find" on "store" targeting "user" (Stateful SimpleStore) - * return store.find('user', 1) // same as "UserStore.find(1)" + * return store.find('user', 1); // same as "UserStore.find(1)" * }).then((user) => { * // not only was a "user" record retrieved, but it was added to the * // store's "user" collection - * const cachedUser = store.getCollection('user').get(1) - * console.log(user === cachedUser) // true - * }) + * const cachedUser = store.getCollection('user').get(1); + * console.log(user === cachedUser); // true + * }); * * @class SimpleStore * @extends Container - * @param {Object} [opts] Configuration options. See {@link Container}. + * @param {object} [opts] Configuration options. See {@link Container}. * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}. @@ -11731,8 +11788,8 @@ var props$2 = { * @private * @param {string} name Name of the {@link Collection} to which to * add the data. - * @param {Object} result The result from a Mapper. - * @param {Object} [opts] Configuration options. + * @param {object} result The result from a Mapper. + * @param {object} [opts] Configuration options. * @returns {(Object|Array)} Result. */ _end: function _end(name, result, opts) { @@ -11759,26 +11816,26 @@ var props$2 = { * @example * // Listen for all "afterCreate" events in a SimpleStore * store.on('afterCreate', (mapperName, props, opts, result) => { - * console.log(mapperName) // "post" - * console.log(props.id) // undefined - * console.log(result.id) // 1234 - * }) + * console.log(mapperName); // "post" + * console.log(props.id); // undefined + * console.log(result.id); // 1234 + * }); * store.create('post', { title: 'Modeling your data' }).then((post) => { - * console.log(post.id) // 1234 - * }) + * console.log(post.id); // 1234 + * }); * * @example * // Listen for the "add" event on a collection * store.on('add', (mapperName, records) => { - * console.log(records) // [...] - * }) + * console.log(records); // [...] + * }); * * @example * // Listen for "change" events on a record * store.on('change', (mapperName, record, changes) => { - * console.log(changes) // { changed: { title: 'Modeling your data' } } - * }) - * post.title = 'Modeling your data' + * console.log(changes); // { changed: { title: 'Modeling your data' } } + * }); + * post.title = 'Modeling your data'; * * @method SimpleStore#on * @param {string} event Name of event to subsribe to. @@ -11819,12 +11876,12 @@ var props$2 = { * // Let's say for a particular Resource, response data is in a weird format * if (name === 'comment') { * // Re-assign the variable to add the correct records into the stores - * data = data.items + * data = data.items; * } * // Now perform default behavior - * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts) + * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11833,18 +11890,18 @@ var props$2 = { * // Let's say for a particular Resource, response data is in a weird format * if (name === 'comment') { * // Re-assign the variable to add the correct records into the stores - * data = data.items + * data = data.items; * } * // Now perform default behavior - * return super.addToCache(mapperName, data, opts) + * return super.addToCache(mapperName, data, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#addToCache * @param {string} name Name of the {@link Mapper} to target. * @param {*} data Data from which data should be selected for add. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. */ addToCache: function addToCache(name, data, opts) { return this.getCollection(name).add(data, opts); @@ -11855,21 +11912,20 @@ var props$2 = { * Return the store scoped to a particular mapper/collection pair. * * @example SimpleStore.as - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * const UserMapper = store.defineMapper('user') - * const UserStore = store.as('user') - * - * const user1 = store.createRecord('user', { name: 'John' }) - * const user2 = UserStore.createRecord({ name: 'John' }) - * const user3 = UserMapper.createRecord({ name: 'John' }) - * console.log(user1 === user2) - * console.log(user2 === user3) - * console.log(user1 === user3) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * const UserMapper = store.defineMapper('user'); + * const UserStore = store.as('user'); + * + * const user1 = store.createRecord('user', { name: 'John' }); + * const user2 = UserStore.createRecord({ name: 'John' }); + * const user3 = UserMapper.createRecord({ name: 'John' }); + * console.log(user1 === user2); + * console.log(user2 === user3); + * console.log(user1 === user3); * * @method SimpleStore#as * @param {string} name Name of the {@link Mapper}. @@ -11925,12 +11981,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#find call - * return + * return; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts) + * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11939,18 +11995,18 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#find call - * return + * return; * } * // Otherwise perform default behavior - * return super.cachedFind(mapperName, id, opts) + * return super.cachedFind(mapperName, id, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cachedFind * @param {string} name The `name` argument passed to {@link SimpleStore#find}. * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}. * @since 3.0.0 */ cachedFind: cachedFn, @@ -11971,12 +12027,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#findAll call - * return undefined + * return undefined; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts) + * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -11985,19 +12041,19 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return undefined to trigger a Mapper#findAll call - * return undefined + * return undefined; * } * // Otherwise perform default behavior - * return super.cachedFindAll(mapperName, hash, opts) + * return super.cachedFindAll(mapperName, hash, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cachedFindAll * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}. * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on * the `query` argument passed to {@link SimpleStore#findAll}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}. * @since 3.0.0 */ cachedFindAll: cachedFn, @@ -12018,12 +12074,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior - * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts) + * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -12032,19 +12088,19 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior - * return super.cacheFind(mapperName, data, id, opts) + * return super.cacheFind(mapperName, data, id, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cacheFind * @param {string} name The `name` argument passed to {@link SimpleStore#find}. * @param {*} data The result to cache. * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}. * @since 3.0.0 */ cacheFind: function cacheFind(name, data, id, opts) { @@ -12072,12 +12128,12 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior. - * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts) + * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts); * } - * }) + * }); * * @example * // Extend using ES2015 class syntax. @@ -12086,20 +12142,20 @@ var props$2 = { * // Let's say for a particular Resource, we always want to pull fresh from the server * if (mapperName === 'schedule') { * // Return without saving an entry to SimpleStore#_completedQueries - * return + * return; * } * // Otherwise perform default behavior. - * return super.cachedFindAll(mapperName, data, hash, opts) + * return super.cachedFindAll(mapperName, data, hash, opts); * } * } - * const store = new MyStore() + * const store = new MyStore(); * * @method SimpleStore#cacheFindAll * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}. * @param {*} data The result to cache. * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on * the `query` argument passed to {@link SimpleStore#findAll}. - * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}. + * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}. * @since 3.0.0 */ cacheFindAll: function cacheFindAll(name, data, hash, opts) { @@ -12148,12 +12204,12 @@ var props$2 = { * function onBeforeCreate (mapperName, props, opts) { * // do something * } - * store.on('beforeCreate', onBeforeCreate) + * store.on('beforeCreate', onBeforeCreate); * * @callback SimpleStore~beforeCreateListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}. * @see SimpleStore#event:beforeCreate * @see SimpleStore#create * @since 3.0.0 @@ -12173,13 +12229,13 @@ var props$2 = { * function onAfterCreate (mapperName, props, opts, result) { * // do something * } - * store.on('afterCreate', onAfterCreate) + * store.on('afterCreate', onAfterCreate); * * @callback SimpleStore~afterCreateListener * @param {string} name The `name` argument received by {@link Mapper#afterCreate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}. + * @param {object} props The `props` argument received by {@link Mapper#afterCreate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreate}. * @see SimpleStore#event:afterCreate * @see SimpleStore#create * @since 3.0.0 @@ -12188,13 +12244,13 @@ var props$2 = { * Wrapper for {@link Mapper#create}. Adds the created record to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -12204,17 +12260,17 @@ var props$2 = { * edition: 'First Edition', * title: 'Respect your Data' * }).then((book) => { - * console.log(book.id) // 120392 - * console.log(book.title) // "Respect your Data" - * }) + * console.log(book.id); // 120392 + * console.log(book.title); // "Respect your Data" + * }); * * @fires SimpleStore#beforeCreate * @fires SimpleStore#afterCreate * @fires SimpleStore#add * @method SimpleStore#create * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} record Passed to {@link Mapper#create}. - * @param {Object} [opts] Passed to {@link Mapper#create}. See + * @param {object} record Passed to {@link Mapper#create}. + * @param {object} [opts] Passed to {@link Mapper#create}. See * {@link Mapper#create} for more configuration options. * @returns {Promise} Resolves with the result of the create. * @since 3.0.0 @@ -12244,12 +12300,12 @@ var props$2 = { * function onBeforeCreateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeCreateMany', onBeforeCreateMany) + * store.on('beforeCreateMany', onBeforeCreateMany); * * @callback SimpleStore~beforeCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}. * @see SimpleStore#event:beforeCreateMany * @see SimpleStore#createMany * @since 3.0.0 @@ -12269,13 +12325,13 @@ var props$2 = { * function onAfterCreateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterCreateMany', onAfterCreateMany) + * store.on('afterCreateMany', onAfterCreateMany); * * @callback SimpleStore~afterCreateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}. * @see SimpleStore#event:afterCreateMany * @see SimpleStore#createMany * @since 3.0.0 @@ -12285,13 +12341,13 @@ var props$2 = { * store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -12305,17 +12361,17 @@ var props$2 = { * edition: 'Second Edition', * title: 'Respect your Data' * }]).then((books) => { - * console.log(books[0].id) // 142394 - * console.log(books[0].title) // "Respect your Data" - * }) + * console.log(books[0].id); // 142394 + * console.log(books[0].title); // "Respect your Data" + * }); * * @fires SimpleStore#beforeCreateMany * @fires SimpleStore#afterCreateMany * @fires SimpleStore#add * @method SimpleStore#createMany * @param {string} name Name of the {@link Mapper} to target. - * @param {Array} records Passed to {@link Mapper#createMany}. - * @param {Object} [opts] Passed to {@link Mapper#createMany}. See + * @param {array} records Passed to {@link Mapper#createMany}. + * @param {object} [opts] Passed to {@link Mapper#createMany}. See * {@link Mapper#createMany} for more configuration options. * @returns {Promise} Resolves with the result of the create. * @since 3.0.0 @@ -12395,12 +12451,12 @@ var props$2 = { * function onBeforeDestroy (mapperName, id, opts) { * // do something * } - * store.on('beforeDestroy', onBeforeDestroy) + * store.on('beforeDestroy', onBeforeDestroy); * * @callback SimpleStore~beforeDestroyListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}. * @see SimpleStore#event:beforeDestroy * @see SimpleStore#destroy * @since 3.0.0 @@ -12420,13 +12476,13 @@ var props$2 = { * function onAfterDestroy (mapperName, id, opts, result) { * // do something * } - * store.on('afterDestroy', onAfterDestroy) + * store.on('afterDestroy', onAfterDestroy); * * @callback SimpleStore~afterDestroyListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}. * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}. * @see SimpleStore#event:afterDestroy * @see SimpleStore#destroy * @since 3.0.0 @@ -12437,28 +12493,28 @@ var props$2 = { * associated with the provided `id`. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * - * store.add('book', { id: 1234, title: 'Data Management is Hard' }) + * store.add('book', { id: 1234, title: 'Data Management is Hard' }); * * // Since this example uses the http adapter, we'll get something like: * // * // DELETE /book/1234 * store.destroy('book', 1234).then(() => { * // The book record is no longer in the in-memory store - * console.log(store.get('book', 1234)) // undefined + * console.log(store.get('book', 1234)); // undefined * - * return store.find('book', 1234) + * return store.find('book', 1234); * }).then((book) { * // The book was deleted from the database too - * console.log(book) // undefined - * }) + * console.log(book); // undefined + * }); * * @fires SimpleStore#beforeDestroy * @fires SimpleStore#afterDestroy @@ -12466,7 +12522,7 @@ var props$2 = { * @method SimpleStore#destroy * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#destroy}. - * @param {Object} [opts] Passed to {@link Mapper#destroy}. See + * @param {object} [opts] Passed to {@link Mapper#destroy}. See * {@link Mapper#destroy} for more configuration options. * @returns {Promise} Resolves when the destroy operation completes. * @since 3.0.0 @@ -12505,12 +12561,12 @@ var props$2 = { * function onBeforeDestroyAll (mapperName, query, opts) { * // do something * } - * store.on('beforeDestroyAll', onBeforeDestroyAll) + * store.on('beforeDestroyAll', onBeforeDestroyAll); * * @callback SimpleStore~beforeDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}. * @see SimpleStore#event:beforeDestroyAll * @see SimpleStore#destroyAll * @since 3.0.0 @@ -12530,13 +12586,13 @@ var props$2 = { * function onAfterDestroyAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterDestroyAll', onAfterDestroyAll) + * store.on('afterDestroyAll', onAfterDestroyAll); * * @callback SimpleStore~afterDestroyAllListener * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}. * @see SimpleStore#event:afterDestroyAll * @see SimpleStore#destroyAll * @since 3.0.0 @@ -12546,35 +12602,35 @@ var props$2 = { * the in-memory store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * - * store.add('book', { id: 1234, title: 'Data Management is Hard' }) + * store.add('book', { id: 1234, title: 'Data Management is Hard' }); * * // Since this example uses the http adapter, we'll get something like: * // * // DELETE /book/1234 * store.destroy('book', 1234).then(() => { * // The book record is gone from the in-memory store - * console.log(store.get('book', 1234)) // undefined - * return store.find('book', 1234) + * console.log(store.get('book', 1234)); // undefined + * return store.find('book', 1234); * }).then((book) { * // The book was deleted from the database too - * console.log(book) // undefined - * }) + * console.log(book); // undefined + * }); * * @fires SimpleStore#beforeDestroyAll * @fires SimpleStore#afterDestroyAll * @fires SimpleStore#remove * @method SimpleStore#destroyAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] Passed to {@link Mapper#destroyAll}. - * @param {Object} [opts] Passed to {@link Mapper#destroyAll}. See + * @param {object} [query] Passed to {@link Mapper#destroyAll}. + * @param {object} [opts] Passed to {@link Mapper#destroyAll}. See * {@link Mapper#destroyAll} for more configuration options. * @returns {Promise} Resolves when the delete completes. * @since 3.0.0 @@ -12622,12 +12678,12 @@ var props$2 = { * function onBeforeFind (mapperName, id, opts) { * // do something * } - * store.on('beforeFind', onBeforeFind) + * store.on('beforeFind', onBeforeFind); * * @callback SimpleStore~beforeFindListener * @param {string} name The `name` argument received by {@link Mapper#beforeFind}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}. * @see SimpleStore#event:beforeFind * @see SimpleStore#find * @since 3.0.0 @@ -12647,13 +12703,13 @@ var props$2 = { * function onAfterFind (mapperName, id, opts, result) { * // do something * } - * store.on('afterFind', onAfterFind) + * store.on('afterFind', onAfterFind); * * @callback SimpleStore~afterFindListener * @param {string} name The `name` argument received by {@link Mapper#afterFind}. * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFind}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}. + * @param {object} result The `result` argument received by {@link Mapper#afterFind}. * @see SimpleStore#event:afterFind * @see SimpleStore#find * @since 3.0.0 @@ -12662,21 +12718,21 @@ var props$2 = { * Wrapper for {@link Mapper#find}. Adds any found record to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('book') + * store.defineMapper('book'); * * // Since this example uses the http adapter, we'll get something like: * // * // GET /book/1234 * store.find('book', 1234).then((book) => { * // The book record is now in the in-memory store - * console.log(store.get('book', 1234) === book) // true - * }) + * console.log(store.get('book', 1234) === book); // true + * }); * * @fires SimpleStore#beforeFind * @fires SimpleStore#afterFind @@ -12684,7 +12740,7 @@ var props$2 = { * @method SimpleStore#find * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#find}. - * @param {Object} [opts] Passed to {@link Mapper#find}. + * @param {object} [opts] Passed to {@link Mapper#find}. * @param {boolean} [opts.force] Bypass cacheFind * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind} * @returns {Promise} Resolves with the result, if any. @@ -12736,12 +12792,12 @@ var props$2 = { * function onBeforeFindAll (mapperName, query, opts) { * // do something * } - * store.on('beforeFindAll', onBeforeFindAll) + * store.on('beforeFindAll', onBeforeFindAll); * * @callback SimpleStore~beforeFindAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}. * @see SimpleStore#event:beforeFindAll * @see SimpleStore#findAll * @since 3.0.0 @@ -12761,13 +12817,13 @@ var props$2 = { * function onAfterFindAll (mapperName, query, opts, result) { * // do something * } - * store.on('afterFindAll', onAfterFindAll) + * store.on('afterFindAll', onAfterFindAll); * * @callback SimpleStore~afterFindAllListener * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}. * @see SimpleStore#event:afterFindAll * @see SimpleStore#findAll * @since 3.0.0 @@ -12776,29 +12832,29 @@ var props$2 = { * Wrapper for {@link Mapper#findAll}. Adds any found records to the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('movie') + * store.defineMapper('movie'); * * // Since this example uses the http adapter, we'll get something like: * // * // GET /movie?rating=PG * store.find('movie', { rating: 'PG' }).then((movies) => { * // The movie records are now in the in-memory store - * console.log(store.filter('movie')) - * }) + * console.log(store.filter('movie')); + * }); * * @fires SimpleStore#beforeFindAll * @fires SimpleStore#afterFindAll * @fires SimpleStore#add * @method SimpleStore#findAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} [query] Passed to {@link Mapper.findAll}. - * @param {Object} [opts] Passed to {@link Mapper.findAll}. + * @param {object} [query] Passed to {@link Mapper.findAll}. + * @param {object} [opts] Passed to {@link Mapper.findAll}. * @param {boolean} [opts.force] Bypass cacheFindAll * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll} * @returns {Promise} Resolves with the result, if any. @@ -12867,7 +12923,7 @@ var props$2 = { * @method SimpleStore#hashQuery * @param {string} name The `name` argument passed to {@link SimpleStore#find} * or {@link SimpleStore#findAll}. - * @param {Object} query The `query` argument passed to {@link SimpleStore#find} + * @param {object} query The `query` argument passed to {@link SimpleStore#find} * or {@link SimpleStore#findAll}. * @returns {string} The JSONified `query`. * @since 3.0.0 @@ -12886,24 +12942,23 @@ var props$2 = { * {@link Record} from the store. * * @example SimpleStore#remove - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * store.defineMapper('book') - * console.log(store.getAll('book').length) - * store.add('book', { id: 1234 }) - * console.log(store.getAll('book').length) - * store.remove('book', 1234) - * console.log(store.getAll('book').length) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * store.defineMapper('book'); + * console.log(store.getAll('book').length); + * store.add('book', { id: 1234 }); + * console.log(store.getAll('book').length); + * store.remove('book', 1234); + * console.log(store.getAll('book').length); * * @fires SimpleStore#remove * @method SimpleStore#remove * @param {string} name The name of the {@link Collection} to target. * @param {string|number} id The primary key of the {@link Record} to remove. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record} to also * remove from the store. * @returns {Record} The removed {@link Record}, if any. @@ -12925,28 +12980,27 @@ var props$2 = { * {@link Record}s from the store. * * @example SimpleStore#removeAll - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) - * - * const store = new SimpleStore() - * store.defineMapper('movie') - * console.log(store.getAll('movie').length) - * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' }) - * console.log(store.getAll('movie').length) - * store.removeAll('movie', { rating: 'R' }) - * console.log(store.getAll('movie').length) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); + * + * const store = new SimpleStore(); + * store.defineMapper('movie'); + * console.log(store.getAll('movie').length); + * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' }); + * console.log(store.getAll('movie').length); + * store.removeAll('movie', { rating: 'R' }); + * console.log(store.getAll('movie').length); * * @fires SimpleStore#remove * @method SimpleStore#removeAll * @param {string} name The name of the {@link Collection} to target. - * @param {Object} [query={}] Selection query. See {@link query}. - * @param {Object} [query.where] See {@link query.where}. + * @param {object} [query={}] Selection query. See {@link query}. + * @param {object} [query.where] See {@link query.where}. * @param {number} [query.offset] See {@link query.offset}. * @param {number} [query.limit] See {@link query.limit}. * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record} to also * remove from the store. * @returns {Record} The removed {@link Record}s, if any. @@ -12977,7 +13031,7 @@ var props$2 = { * @param {string} name The name of the {@link Collection} to target. * @param {Record|Record[]} records {@link Record}s whose relations are to be * removed. - * @param {Object} [opts] Configuration options. + * @param {object} [opts] Configuration options. * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove * from the store. * @since 3.0.0 @@ -13041,13 +13095,13 @@ var props$2 = { * function onBeforeUpdate (mapperName, id, props, opts) { * // do something * } - * store.on('beforeUpdate', onBeforeUpdate) + * store.on('beforeUpdate', onBeforeUpdate); * * @callback SimpleStore~beforeUpdateListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}. * @see SimpleStore#event:beforeUpdate * @see SimpleStore#update * @since 3.0.0 @@ -13067,14 +13121,14 @@ var props$2 = { * function onAfterUpdate (mapperName, id, props, opts, result) { * // do something * } - * store.on('afterUpdate', onAfterUpdate) + * store.on('afterUpdate', onAfterUpdate); * * @callback SimpleStore~afterUpdateListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}. * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}. * @see SimpleStore#event:afterUpdate * @see SimpleStore#update * @since 3.0.0 @@ -13084,21 +13138,21 @@ var props$2 = { * store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // * // PUT /post/1234 {"status":"published"} * store.update('post', 1, { status: 'published' }).then((post) => { * // The post record has also been updated in the in-memory store - * console.log(store.get('post', 1234)) - * }) + * console.log(store.get('post', 1234)); + * }); * * @fires SimpleStore#beforeUpdate * @fires SimpleStore#afterUpdate @@ -13106,8 +13160,8 @@ var props$2 = { * @method SimpleStore#update * @param {string} name Name of the {@link Mapper} to target. * @param {(string|number)} id Passed to {@link Mapper#update}. - * @param {Object} record Passed to {@link Mapper#update}. - * @param {Object} [opts] Passed to {@link Mapper#update}. See + * @param {object} record Passed to {@link Mapper#update}. + * @param {object} [opts] Passed to {@link Mapper#update}. See * {@link Mapper#update} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13137,13 +13191,13 @@ var props$2 = { * function onBeforeUpdateAll (mapperName, props, query, opts) { * // do something * } - * store.on('beforeUpdateAll', onBeforeUpdateAll) + * store.on('beforeUpdateAll', onBeforeUpdateAll); * * @callback SimpleStore~beforeUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}. * @see SimpleStore#event:beforeUpdateAll * @see SimpleStore#updateAll * @since 3.0.0 @@ -13163,14 +13217,14 @@ var props$2 = { * function onAfterUpdateAll (mapperName, props, query, opts, result) { * // do something * } - * store.on('afterUpdateAll', onAfterUpdateAll) + * store.on('afterUpdateAll', onAfterUpdateAll); * * @callback SimpleStore~afterUpdateAllListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}. * @see SimpleStore#event:afterUpdateAll * @see SimpleStore#updateAll * @since 3.0.0 @@ -13180,30 +13234,30 @@ var props$2 = { * the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // * // PUT /post?author_id=1234 {"status":"published"} * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => { * // The post records have also been updated in the in-memory store - * console.log(store.filter('posts', { author_id: 1234 })) - * }) + * console.log(store.filter('posts', { author_id: 1234 })); + * }); * * @fires SimpleStore#beforeUpdateAll * @fires SimpleStore#afterUpdateAll * @fires SimpleStore#add * @method SimpleStore#updateAll * @param {string} name Name of the {@link Mapper} to target. - * @param {Object} props Passed to {@link Mapper#updateAll}. - * @param {Object} [query] Passed to {@link Mapper#updateAll}. - * @param {Object} [opts] Passed to {@link Mapper#updateAll}. See + * @param {object} props Passed to {@link Mapper#updateAll}. + * @param {object} [query] Passed to {@link Mapper#updateAll}. + * @param {object} [opts] Passed to {@link Mapper#updateAll}. See * {@link Mapper#updateAll} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13233,12 +13287,12 @@ var props$2 = { * function onBeforeUpdateMany (mapperName, records, opts) { * // do something * } - * store.on('beforeUpdateMany', onBeforeUpdateMany) + * store.on('beforeUpdateMany', onBeforeUpdateMany); * * @callback SimpleStore~beforeUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}. * @see SimpleStore#event:beforeUpdateMany * @see SimpleStore#updateMany * @since 3.0.0 @@ -13258,13 +13312,13 @@ var props$2 = { * function onAfterUpdateMany (mapperName, records, opts, result) { * // do something * } - * store.on('afterUpdateMany', onAfterUpdateMany) + * store.on('afterUpdateMany', onAfterUpdateMany); * * @callback SimpleStore~afterUpdateManyListener * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. - * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}. + * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}. * @see SimpleStore#event:afterUpdateMany * @see SimpleStore#updateMany * @since 3.0.0 @@ -13274,13 +13328,13 @@ var props$2 = { * the store. * * @example - * import {SimpleStore} from 'js-data' - * import {HttpAdapter} from 'js-data-http' + * import { SimpleStore } from 'js-data'; + * import { HttpAdapter } from 'js-data-http'; * - * const store = new SimpleStore() - * store.registerAdapter('http', new HttpAdapter(), { default: true }) + * const store = new SimpleStore(); + * store.registerAdapter('http', new HttpAdapter(), { default: true }); * - * store.defineMapper('post') + * store.defineMapper('post'); * * // Since this example uses the http adapter, we'll get something like: * // @@ -13290,8 +13344,8 @@ var props$2 = { * { id: 4, status: 'published' } * ]).then((posts) => { * // The post records have also been updated in the in-memory store - * console.log(store.getAll('post', 3, 4)) - * }) + * console.log(store.getAll('post', 3, 4)); + * }); * * @fires SimpleStore#beforeUpdateMany * @fires SimpleStore#afterUpdateMany @@ -13299,7 +13353,7 @@ var props$2 = { * @method SimpleStore#updateMany * @param {string} name Name of the {@link Mapper} to target. * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}. - * @param {Object} [opts] Passed to {@link Mapper#updateMany}. See + * @param {object} [opts] Passed to {@link Mapper#updateMany}. See * {@link Mapper#updateMany} for more configuration options. * @returns {Promise} Resolves with the result of the update. * @since 3.0.0 @@ -13343,12 +13397,12 @@ var SimpleStore$1 = Container.extend(props$2); * function onChange (mapperName, record, changes) { * // do something * } - * store.on('change', onChange) + * store.on('change', onChange); * * @callback SimpleStore~changeListener * @param {string} name The name of the associated {@link Mapper}. * @param {Record} record The Record that changed. - * @param {Object} changes The changes. + * @param {object} changes The changes. * @see SimpleStore#event:change * @since 3.0.0 */ @@ -13377,7 +13431,7 @@ var SimpleStore$1 = Container.extend(props$2); * function onAdd (mapperName, recordOrRecords) { * // do something * } - * store.on('add', onAdd) + * store.on('add', onAdd); * * @callback SimpleStore~addListener * @param {string} name The name of the associated {@link Mapper}. @@ -13415,7 +13469,7 @@ var SimpleStore$1 = Container.extend(props$2); * function onRemove (mapperName, recordsOrRecords) { * // do something * } - * store.on('remove', onRemove) + * store.on('remove', onRemove); * * @callback SimpleStore~removeListener * @param {string} name The name of the associated {@link Mapper}. @@ -13432,29 +13486,28 @@ var SimpleStore$1 = Container.extend(props$2); /** * Create a subclass of this SimpleStore: * @example SimpleStore.extend - * // Normally you would do: import {SimpleStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {SimpleStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { SimpleStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomSimpleStoreClass extends SimpleStore { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customSimpleStore = new CustomSimpleStoreClass() - * console.log(customSimpleStore.foo()) - * console.log(CustomSimpleStoreClass.beep()) + * const customSimpleStore = new CustomSimpleStoreClass(); + * console.log(customSimpleStore.foo()); + * console.log(CustomSimpleStoreClass.beep()); * * // Extend the class using alternate method. * const OtherSimpleStoreClass = SimpleStore.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const otherSimpleStore = new OtherSimpleStoreClass() - * console.log(otherSimpleStore.foo()) - * console.log(OtherSimpleStoreClass.beep()) + * const otherSimpleStore = new OtherSimpleStoreClass(); + * console.log(otherSimpleStore.foo()); + * console.log(OtherSimpleStoreClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherSimpleStoreClass () { @@ -13463,21 +13516,21 @@ var SimpleStore$1 = Container.extend(props$2); * } * SimpleStore.extend({ * constructor: AnotherSimpleStoreClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } + * beep () { return 'boop'; } * }) - * const anotherSimpleStore = new AnotherSimpleStoreClass() - * console.log(anotherSimpleStore.created_at) - * console.log(anotherSimpleStore.foo()) - * console.log(AnotherSimpleStoreClass.beep()) + * const anotherSimpleStore = new AnotherSimpleStoreClass(); + * console.log(anotherSimpleStore.created_at); + * console.log(anotherSimpleStore.foo()); + * console.log(AnotherSimpleStoreClass.beep()); * * @method SimpleStore.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this SimpleStore class. * @since 3.0.0 */ @@ -13494,9 +13547,9 @@ var DOMAIN$9 = 'LinkedCollection'; * * @class LinkedCollection * @extends Collection - * @param {Array} [records] Initial set of records to insert into the + * @param {array} [records] Initial set of records to insert into the * collection. See {@link Collection}. - * @param {Object} [opts] Configuration options. See {@link Collection}. + * @param {object} [opts] Configuration options. See {@link Collection}. * @returns {Mapper} */ function LinkedCollection(records, opts) { @@ -13610,52 +13663,51 @@ var LinkedCollection$1 = Collection$1.extend({ * Create a subclass of this LinkedCollection: * * @example LinkedCollection.extend - * // Normally you would do: import {LinkedCollection} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {LinkedCollection} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { LinkedCollection } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomLinkedCollectionClass extends LinkedCollection { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customLinkedCollection = new CustomLinkedCollectionClass() - * console.log(customLinkedCollection.foo()) - * console.log(CustomLinkedCollectionClass.beep()) + * const customLinkedCollection = new CustomLinkedCollectionClass(); + * console.log(customLinkedCollection.foo()); + * console.log(CustomLinkedCollectionClass.beep()); * * // Extend the class using alternate method. * const OtherLinkedCollectionClass = LinkedCollection.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherLinkedCollection = new OtherLinkedCollectionClass() - * console.log(otherLinkedCollection.foo()) - * console.log(OtherLinkedCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherLinkedCollection = new OtherLinkedCollectionClass(); + * console.log(otherLinkedCollection.foo()); + * console.log(OtherLinkedCollectionClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherLinkedCollectionClass () { - * LinkedCollection.call(this) - * this.created_at = new Date().getTime() + * LinkedCollection.call(this); + * this.created_at = new Date().getTime(); * } * LinkedCollection.extend({ * constructor: AnotherLinkedCollectionClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherLinkedCollection = new AnotherLinkedCollectionClass() - * console.log(anotherLinkedCollection.created_at) - * console.log(anotherLinkedCollection.foo()) - * console.log(AnotherLinkedCollectionClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherLinkedCollection = new AnotherLinkedCollectionClass(); + * console.log(anotherLinkedCollection.created_at); + * console.log(anotherLinkedCollection.foo()); + * console.log(AnotherLinkedCollectionClass.beep()); * * @method LinkedCollection.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this LinkedCollection class. * @since 3.0.0 */ @@ -13678,37 +13730,37 @@ var DATASTORE_DEFAULTS = { * {@link LinkedCollection} class to link related records together in memory. * * ```javascript - * import {DataStore} from 'js-data' + * import { DataStore } from 'js-data'; * ``` * * @example - * import {DataStore} from 'js-data' - * import HttpAdapter from 'js-data-http' - * const store = new DataStore() + * import { DataStore } from 'js-data'; + * import HttpAdapter from 'js-data-http'; + * const store = new DataStore(); * * // DataStore#defineMapper returns a direct reference to the newly created * // Mapper. - * const UserMapper = store.defineMapper('user') + * const UserMapper = store.defineMapper('user'); * * // DataStore#as returns the store scoped to a particular Mapper. - * const UserStore = store.as('user') + * const UserStore = store.as('user'); * * // Call "find" on "UserMapper" (Stateless ORM) * UserMapper.find(1).then((user) => { * // retrieved a "user" record via the http adapter, but that's it * * // Call "find" on "store" targeting "user" (Stateful DataStore) - * return store.find('user', 1) // same as "UserStore.find(1)" + * return store.find('user', 1); // same as "UserStore.find(1)" * }).then((user) => { * // not only was a "user" record retrieved, but it was added to the * // store's "user" collection - * const cachedUser = store.getCollection('user').get(1) - * console.log(user === cachedUser) // true - * }) + * const cachedUser = store.getCollection('user').get(1); + * console.log(user === cachedUser); // true + * }); * * @class DataStore * @extends SimpleStore - * @param {Object} [opts] Configuration options. See {@link SimpleStore}. + * @param {object} [opts] Configuration options. See {@link SimpleStore}. * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}. * @param {boolean} [opts.debug=false] See {@link Component#debug}. * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}. @@ -14175,52 +14227,51 @@ var DataStore$1 = SimpleStore$1.extend(props$1); /** * Create a subclass of this DataStore: * @example DataStore.extend - * // Normally you would do: import {DataStore} from 'js-data' - * const JSData = require('js-data@3.0.0-rc.4') - * const {DataStore} = JSData - * console.log('Using JSData v' + JSData.version.full) + * const JSData = require('js-data'); + * const { DataStore } = JSData; + * console.log('Using JSData v' + JSData.version.full); * * // Extend the class using ES2015 class syntax. * class CustomDataStoreClass extends DataStore { - * foo () { return 'bar' } - * static beep () { return 'boop' } + * foo () { return 'bar'; } + * static beep () { return 'boop'; } * } - * const customDataStore = new CustomDataStoreClass() - * console.log(customDataStore.foo()) - * console.log(CustomDataStoreClass.beep()) + * const customDataStore = new CustomDataStoreClass(); + * console.log(customDataStore.foo()); + * console.log(CustomDataStoreClass.beep()); * * // Extend the class using alternate method. * const OtherDataStoreClass = DataStore.extend({ - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const otherDataStore = new OtherDataStoreClass() - * console.log(otherDataStore.foo()) - * console.log(OtherDataStoreClass.beep()) + * beep () { return 'boop'; } + * }); + * const otherDataStore = new OtherDataStoreClass(); + * console.log(otherDataStore.foo()); + * console.log(OtherDataStoreClass.beep()); * * // Extend the class, providing a custom constructor. * function AnotherDataStoreClass () { - * DataStore.call(this) - * this.created_at = new Date().getTime() + * DataStore.call(this); + * this.created_at = new Date().getTime(); * } * DataStore.extend({ * constructor: AnotherDataStoreClass, - * foo () { return 'bar' } + * foo () { return 'bar'; } * }, { - * beep () { return 'boop' } - * }) - * const anotherDataStore = new AnotherDataStoreClass() - * console.log(anotherDataStore.created_at) - * console.log(anotherDataStore.foo()) - * console.log(AnotherDataStoreClass.beep()) + * beep () { return 'boop'; } + * }); + * const anotherDataStore = new AnotherDataStoreClass(); + * console.log(anotherDataStore.created_at); + * console.log(anotherDataStore.foo()); + * console.log(AnotherDataStoreClass.beep()); * * @method DataStore.extend - * @param {Object} [props={}] Properties to add to the prototype of the + * @param {object} [props={}] Properties to add to the prototype of the * subclass. - * @param {Object} [props.constructor] Provide a custom constructor function + * @param {object} [props.constructor] Provide a custom constructor function * to be used as the subclass itself. - * @param {Object} [classProps={}] Static properties to add to the subclass. + * @param {object} [classProps={}] Static properties to add to the subclass. * @returns {Constructor} Subclass of this DataStore class. * @since 3.0.0 */ @@ -14250,15 +14301,15 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * @example Load into your app via ES2015 Modules * import * as JSData from 'js-data'; * @example Load into your app via AMD - * define('myApp', ['js-data'], function (JSData) { ... }) + * define('myApp', ['js-data'], function (JSData) { ... }); */ /** * JSData's utility methods. * * @example - * import {utils} from 'js-data' - * console.log(utils.isString('foo')) // true + * import { utils } from 'js-data'; + * console.log(utils.isString('foo')); // true * * @name module:js-data.utils * @property {Function} Promise See {@link utils.Promise}. @@ -14270,8 +14321,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Collection} class. * * @example - * import {Collection} from 'js-data' - * const collection = new Collection() + * import { Collection } from 'js-data'; + * const collection = new Collection(); * * @name module:js-data.Collection * @see Collection @@ -14284,11 +14335,11 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * class. * * @example - * import {Component} from 'js-data' + * import { Component } from 'js-data'; * // Make a custom component. * const MyComponent = Component.extend({ * myMethod (someArg) { ... } - * }) + * }); * * @name module:js-data.Component * @see Component @@ -14301,8 +14352,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * {@link DataStore} instead. * * @example - * import {Container} from 'js-data' - * const store = new Container() + * import { Container } from 'js-data'; + * const store = new Container(); * * @name module:js-data.Container * @see Container @@ -14315,8 +14366,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Node.js you probably want to use {@link Container} instead. * * @example - * import {DataStore} from 'js-data' - * const store = new DataStore() + * import { DataStore } from 'js-data'; + * const store = new DataStore(); * * @name module:js-data.DataStore * @see DataStore @@ -14347,13 +14398,13 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Mapper} class. The core of the ORM. * * @example Recommended use - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); * * @example Create Mapper manually - * import {Mapper} from 'js-data' - * const UserMapper = new Mapper({ name: 'user' }) + * import { Mapper } from 'js-data'; + * const UserMapper = new Mapper({ name: 'user' }); * * @name module:js-data.Mapper * @see Container @@ -14375,10 +14426,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Record} class. * * @example - * import {Container} from 'js-data' - * const store = new Container() - * store.defineMapper('user') - * const user = store.createRecord('user') + * import { Container } from 'js-data'; + * const store = new Container(); + * store.defineMapper('user'); + * const user = store.createRecord('user'); * * @name module:js-data.Record * @see Record @@ -14390,17 +14441,17 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04. * * @example - * import {Container, Schema} from 'js-data' + * import { Container, Schema } from 'js-data'; * const userSchema = new Schema({ * properties: { * id: { type: 'string' }, * name: { type: 'string' } * } - * }) - * const store = new Container() + * }); + * const store = new Container(); * store.defineMapper('user', { * schema: userSchema - * }) + * }); * * @name module:js-data.Schema * @see Schema @@ -14414,10 +14465,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * JSData's {@link Settable} class. * * @example - * import {Settable} from 'js-data' - * const obj = new Settable() - * obj.set('secret', 'value') - * console.log(JSON.stringify(obj)) // {} + * import { Settable } from 'js-data'; + * const obj = new Settable(); + * obj.set('secret', 'value'); + * console.log(JSON.stringify(obj)); // {} * * @name module:js-data.Settable * @see Settable @@ -14429,8 +14480,8 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Node.js you probably want to use {@link Container} instead. * * @example - * import {SimpleStore} from 'js-data' - * const store = new SimpleStore() + * import { SimpleStore } from 'js-data'; + * const store = new SimpleStore(); * * @name module:js-data.SimpleStore * @see SimpleStore @@ -14442,7 +14493,7 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * Describes the version of this `JSData` object. * * @example - * console.log(JSData.version.full) // "3.0.0-beta.1" + * console.log(JSData.version.full); // "3.0.0-beta.1" * * @name version * @memberof module:js-data @@ -14458,10 +14509,10 @@ var DataStore$1 = SimpleStore$1.extend(props$1); * @type {Object} */ var version = { - full: '3.0.1', + full: '3.0.2', major: 3, minor: 0, - patch: 1 + patch: 2 }; exports.version = version; diff --git a/dist/js-data.js.map b/dist/js-data.js.map index 7c94eeef..81a48b0c 100644 --- a/dist/js-data.js.map +++ b/dist/js-data.js.map @@ -1 +1 @@ -{"version":3,"file":"js-data.js","sources":["../src/utils.js","../src/Settable.js","../src/Component.js","../src/Query.js","../src/Relation.js","../src/Relation/BelongsTo.js","../src/Relation/HasMany.js","../src/Relation/HasOne.js","../src/relations.js","../src/decorators.js","../src/Record.js","../lib/mindex/_utils.js","../lib/mindex/index.js","../src/Collection.js","../src/Schema.js","../src/Mapper.js","../src/Container.js","../src/SimpleStore.js","../src/LinkedCollection.js","../src/DataStore.js","../src/index.js"],"sourcesContent":["/**\n * Utility methods used by JSData.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('foo')) // true\n *\n * @namespace utils\n * @type {Object}\n */\n\nconst DOMAIN = 'utils'\n\nconst INFINITY = 1 / 0\nconst MAX_INTEGER = 1.7976931348623157e+308\nconst BOOL_TAG = '[object Boolean]'\nconst DATE_TAG = '[object Date]'\nconst FUNC_TAG = '[object Function]'\nconst NUMBER_TAG = '[object Number]'\nconst OBJECT_TAG = '[object Object]'\nconst REGEXP_TAG = '[object RegExp]'\nconst STRING_TAG = '[object String]'\nconst objToString = Object.prototype.toString\nconst PATH = /^(.+)\\.(.+)$/\n\nconst ERRORS = {\n '400' () { return `expected: ${arguments[0]}, found: ${arguments[2] ? arguments[1] : typeof arguments[1]}` },\n '404' () { return `${arguments[0]} not found` }\n}\n\nconst toInteger = function (value) {\n if (!value) {\n return 0\n }\n // Coerce to number\n value = +value\n if (value === INFINITY || value === -INFINITY) {\n const sign = (value < 0 ? -1 : 1)\n return sign * MAX_INTEGER\n }\n const remainder = value % 1\n return value === value ? (remainder ? value - remainder : value) : 0 // eslint-disable-line\n}\n\nconst toStr = function (value) {\n return objToString.call(value)\n}\n\nconst isPlainObject = function (value) {\n return (!!value && typeof value === 'object' && value.constructor === Object)\n}\n\nconst mkdirP = function (object, path) {\n if (!path) {\n return object\n }\n const parts = path.split('.')\n parts.forEach(function (key) {\n if (!object[key]) {\n object[key] = {}\n }\n object = object[key]\n })\n return object\n}\n\nconst utils = {\n /**\n * Reference to the Promise constructor used by JSData. Defaults to\n * `window.Promise` or `global.Promise`.\n *\n * @example Make JSData use a different `Promise` constructor\n * import Promise from 'bluebird'\n * import {utils} from 'js-data'\n * utils.Promise = Promise\n *\n * @name utils.Promise\n * @since 3.0.0\n * @type {Function}\n */\n Promise: Promise,\n\n /**\n * Shallow copy properties that meet the following criteria from `src` to\n * `dest`:\n *\n * - own enumerable\n * - not a function\n * - does not start with \"_\"\n *\n * @method utils._\n * @param {Object} dest Destination object.\n * @param {Object} src Source object.\n * @private\n * @since 3.0.0\n */\n _ (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (key && dest[key] === undefined && !utils.isFunction(value) && key.indexOf('_') !== 0) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Recursively iterates over relations found in `opts.with`.\n *\n * @method utils._forRelation\n * @param {Object} opts Configuration options.\n * @param {Relation} def Relation definition.\n * @param {Function} fn Callback function.\n * @param {*} [thisArg] Execution context for the callback function.\n * @private\n * @since 3.0.0\n */\n _forRelation (opts, def, fn, thisArg) {\n const relationName = def.relation\n let containedName = null\n let index\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n if ((index = utils._getIndex(opts.with, relationName)) >= 0) {\n containedName = relationName\n } else if ((index = utils._getIndex(opts.with, def.localField)) >= 0) {\n containedName = def.localField\n }\n\n if (opts.withAll) {\n fn.call(thisArg, def, {})\n return\n } else if (!containedName) {\n return\n }\n let optsCopy = {}\n utils.fillIn(optsCopy, def.getRelation())\n utils.fillIn(optsCopy, opts)\n optsCopy.with = opts.with.slice()\n optsCopy._activeWith = optsCopy.with.splice(index, 1)[0]\n optsCopy.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n optsCopy.with[i] = relation.substr(containedName.length + 1)\n } else {\n optsCopy.with[i] = ''\n }\n })\n fn.call(thisArg, def, optsCopy)\n },\n\n /**\n * Find the index of a relation in the given list\n *\n * @method utils._getIndex\n * @param {string[]} list List to search.\n * @param {string} relation Relation to find.\n * @private\n * @returns {number}\n */\n _getIndex (list, relation) {\n let index = -1\n list.forEach(function (_relation, i) {\n if (_relation === relation) {\n index = i\n return false\n } else if (utils.isObject(_relation)) {\n if (_relation.relation === relation) {\n index = i\n return false\n }\n }\n })\n return index\n },\n\n /**\n * Define hidden (non-enumerable), writable properties on `target` from the\n * provided `props`.\n *\n * @example\n * import {utils} from 'js-data'\n * function Cat () {}\n * utils.addHiddenPropsToTarget(Cat.prototype, {\n * say () {\n * console.log('meow')\n * }\n * })\n * const cat = new Cat()\n * cat.say() // \"meow\"\n *\n * @method utils.addHiddenPropsToTarget\n * @param {Object} target That to which `props` should be added.\n * @param {Object} props Properties to be added to `target`.\n * @since 3.0.0\n */\n addHiddenPropsToTarget (target, props) {\n const map = {}\n Object.keys(props).forEach(function (propName) {\n const descriptor = Object.getOwnPropertyDescriptor(props, propName)\n\n descriptor.enumerable = false\n map[propName] = descriptor\n })\n Object.defineProperties(target, map)\n },\n\n /**\n * Return whether the two objects are deeply different.\n *\n * @example\n * import {utils} from 'js-data'\n * utils.areDifferent({}, {}) // false\n * utils.areDifferent({ a: 1 }, { a: 1 }) // false\n * utils.areDifferent({ foo: 'bar' }, {}) // true\n *\n * @method utils.areDifferent\n * @param {Object} a Base object.\n * @param {Object} b Comparison object.\n * @param {Object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Whether the two objects are deeply different.\n * @see utils.diffObjects\n * @since 3.0.0\n */\n areDifferent (newObject, oldObject, opts) {\n opts || (opts = {})\n const diff = utils.diffObjects(newObject, oldObject, opts)\n const diffCount = Object.keys(diff.added).length +\n Object.keys(diff.removed).length +\n Object.keys(diff.changed).length\n return diffCount > 0\n },\n\n /**\n * Verified that the given constructor is being invoked via `new`, as opposed\n * to just being called like a normal function.\n *\n * @example\n * import {utils} from 'js-data'\n * function Cat () {\n * utils.classCallCheck(this, Cat)\n * }\n * const cat = new Cat() // this is ok\n * Cat() // this throws an error\n *\n * @method utils.classCallCheck\n * @param {*} instance Instance that is being constructed.\n * @param {Constructor} ctor Constructor function used to construct the\n * instance.\n * @since 3.0.0\n * @throws {Error} Throws an error if the constructor is being improperly\n * invoked.\n */\n classCallCheck (instance, ctor) {\n if (!(instance instanceof ctor)) {\n throw utils.err(`${ctor.name}`)(500, 'Cannot call a class as a function')\n }\n },\n\n /**\n * Deep copy a value.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' } }\n * const b = utils.copy(a)\n * a === b // false\n * utils.areDifferent(a, b) // false\n *\n * @param {*} from Value to deep copy.\n * @param {*} [to] Destination object for the copy operation.\n * @param {*} [stackFrom] For internal use.\n * @param {*} [stackTo] For internal use.\n * @param {string[]|RegExp[]} [blacklist] List of strings or RegExp of\n * properties to skip.\n * @param {boolean} [plain] Whether to make a plain copy (don't try to use\n * original prototype).\n * @returns {*} Deep copy of `from`.\n * @since 3.0.0\n */\n copy (from, to, stackFrom, stackTo, blacklist, plain) {\n if (!to) {\n to = from\n if (from) {\n if (utils.isArray(from)) {\n to = utils.copy(from, [], stackFrom, stackTo, blacklist, plain)\n } else if (utils.isDate(from)) {\n to = new Date(from.getTime())\n } else if (utils.isRegExp(from)) {\n to = new RegExp(from.source, from.toString().match(/[^/]*$/)[0])\n to.lastIndex = from.lastIndex\n } else if (utils.isObject(from)) {\n if (plain) {\n to = utils.copy(from, {}, stackFrom, stackTo, blacklist, plain)\n } else {\n to = utils.copy(from, Object.create(Object.getPrototypeOf(from)), stackFrom, stackTo, blacklist, plain)\n }\n }\n }\n } else {\n if (from === to) {\n throw utils.err(`${DOMAIN}.copy`)(500, 'Cannot copy! Source and destination are identical.')\n }\n\n stackFrom = stackFrom || []\n stackTo = stackTo || []\n\n if (utils.isObject(from)) {\n let index = stackFrom.indexOf(from)\n if (index !== -1) {\n return stackTo[index]\n }\n\n stackFrom.push(from)\n stackTo.push(to)\n }\n\n let result\n if (utils.isArray(from)) {\n let i\n to.length = 0\n for (i = 0; i < from.length; i++) {\n result = utils.copy(from[i], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[i])) {\n stackFrom.push(from[i])\n stackTo.push(result)\n }\n to.push(result)\n }\n } else {\n if (utils.isArray(to)) {\n to.length = 0\n } else {\n utils.forOwn(to, function (value, key) {\n delete to[key]\n })\n }\n for (var key in from) {\n if (from.hasOwnProperty(key)) {\n if (utils.isBlacklisted(key, blacklist)) {\n continue\n }\n result = utils.copy(from[key], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[key])) {\n stackFrom.push(from[key])\n stackTo.push(result)\n }\n to[key] = result\n }\n }\n }\n }\n return to\n },\n\n /**\n * Recursively shallow fill in own enumerable properties from `source` to\n * `dest`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.deepFillIn(b, a)\n * console.log(b) // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"bip\"}\n *\n * @method utils.deepFillIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.fillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n deepFillIn (dest, source) {\n if (source) {\n utils.forOwn(source, function (value, key) {\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepFillIn(existing, value)\n } else if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n }\n return dest\n },\n\n /**\n * Recursively shallow copy enumerable properties from `source` to `dest`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.deepFillIn(b, a)\n * console.log(b) // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"boop\"}\n *\n * @method utils.deepMixIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.fillIn\n * @see utils.deepFillIn\n * @since 3.0.0\n */\n deepMixIn (dest, source) {\n if (source) {\n for (var key in source) {\n const value = source[key]\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepMixIn(existing, value)\n } else {\n dest[key] = value\n }\n }\n }\n return dest\n },\n\n /**\n * Return a diff of the base object to the comparison object.\n *\n * @example\n * import {utils} from 'js-data'\n * const oldObject = { foo: 'bar', a: 1234 }\n * const newObject = { beep: 'boop', a: 5678 }\n * const diff = utils.diffObjects(oldObject, newObject)\n * console.log(diff.added) // {\"beep\":\"boop\"}\n * console.log(diff.changed) // {\"a\":5678}\n * console.log(diff.removed) // {\"foo\":undefined}\n *\n * @method utils.diffObjects\n * @param {Object} newObject Comparison object.\n * @param {Object} oldObject Base object.\n * @param {Object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} The diff from the base object to the comparison object.\n * @see utils.areDifferent\n * @since 3.0.0\n */\n diffObjects (newObject, oldObject, opts) {\n opts || (opts = {})\n let equalsFn = opts.equalsFn\n let blacklist = opts.ignore\n const diff = {\n added: {},\n changed: {},\n removed: {}\n }\n if (!utils.isFunction(equalsFn)) {\n equalsFn = utils.deepEqual\n }\n\n const newKeys = Object.keys(newObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n const oldKeys = Object.keys(oldObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n\n // Check for properties that were added or changed\n newKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (equalsFn(oldValue, newValue)) {\n return\n }\n if (oldValue === undefined) {\n diff.added[key] = newValue\n } else {\n diff.changed[key] = newValue\n }\n })\n\n // Check for properties that were removed\n oldKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (newValue === undefined && oldValue !== undefined) {\n diff.removed[key] = undefined\n }\n })\n\n return diff\n },\n\n /**\n * Return whether the two values are equal according to the `==` operator.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.equal(1,1)) // true\n * console.log(utils.equal(1,'1')) // true\n * console.log(utils.equal(93, 66)) // false\n *\n * @method utils.equal\n * @param {*} a First value in the comparison.\n * @param {*} b Second value in the comparison.\n * @returns {boolean} Whether the two values are equal according to `==`.\n * @since 3.0.0\n */\n equal (a, b) {\n return a == b // eslint-disable-line\n },\n\n /**\n * Produce a factory function for making Error objects with the provided\n * metadata. Used throughout the various js-data components.\n *\n * @example\n * import {utils} from 'js-data'\n * const errorFactory = utils.err('domain', 'target')\n * const error400 = errorFactory(400, 'expected type', 'actual type')\n * console.log(error400) // [Error: [domain:target] expected: expected type, found: string\nhttp://www.js-data.io/v3.0/docs/errors#400]\n * @method utils.err\n * @param {string} domain Namespace.\n * @param {string} target Target.\n * @returns {Function} Factory function.\n * @since 3.0.0\n */\n err (domain, target) {\n return function (code) {\n const prefix = `[${domain}:${target}] `\n let message = ERRORS[code].apply(null, Array.prototype.slice.call(arguments, 1))\n message = `${prefix}${message}\nhttp://www.js-data.io/v3.0/docs/errors#${code}`\n return new Error(message)\n }\n },\n\n /**\n * Add eventing capabilities into the target object.\n *\n * @example\n * import {utils} from 'js-data'\n * const user = { name: 'John' }\n * utils.eventify(user)\n * user.on('foo', () => console.log(arguments))\n * user.emit('foo', 1, 'bar') // should log to console values (1, \"bar\")\n *\n * @method utils.eventify\n * @param {Object} target Target object.\n * @param {Function} [getter] Custom getter for retrieving the object's event\n * listeners.\n * @param {Function} [setter] Custom setter for setting the object's event\n * listeners.\n * @since 3.0.0\n */\n eventify (target, getter, setter) {\n target = target || this\n let _events = {}\n if (!getter && !setter) {\n getter = function () { return _events }\n setter = function (value) { _events = value }\n }\n Object.defineProperties(target, {\n emit: {\n value (...args) {\n const events = getter.call(this) || {}\n const type = args.shift()\n let listeners = events[type] || []\n let i\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n listeners = events.all || []\n args.unshift(type)\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n }\n },\n off: {\n value (type, func) {\n const events = getter.call(this)\n const listeners = events[type]\n if (!listeners) {\n setter.call(this, {})\n } else if (func) {\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i].f === func) {\n listeners.splice(i, 1)\n break\n }\n }\n } else {\n listeners.splice(0, listeners.length)\n }\n }\n },\n on: {\n value (type, func, thisArg) {\n if (!getter.call(this)) {\n setter.call(this, {})\n }\n const events = getter.call(this)\n events[type] = events[type] || []\n events[type].push({\n c: thisArg,\n f: func\n })\n }\n }\n })\n },\n\n /**\n * Used for sublcassing. Invoke this method in the context of a superclass to\n * to produce a subclass based on `props` and `classProps`.\n *\n * @example\n * import {utils} from 'js-data'\n * function Animal () {}\n * Animal.extend = utils.extend\n * const Cat = Animal.extend({\n * say () {\n * console.log('meow')\n * }\n * })\n * const cat = new Cat()\n * cat instanceof Animal // true\n * cat instanceof Cat // true\n * cat.say() // \"meow\"\n *\n * @method utils.extend\n * @param {Object} props Instance properties for the subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to use as the subclass.\n * @param {Object} props Static properties for the subclass.\n * @returns {Constructor} A new subclass.\n * @since 3.0.0\n */\n extend (props, classProps) {\n const superClass = this\n let subClass\n\n props || (props = {})\n classProps || (classProps = {})\n\n if (props.hasOwnProperty('constructor')) {\n subClass = props.constructor\n delete props.constructor\n } else {\n subClass = function (...args) {\n utils.classCallCheck(this, subClass)\n superClass.apply(this, args)\n }\n }\n\n // Setup inheritance of instance members\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n configurable: true,\n enumerable: false,\n value: subClass,\n writable: true\n }\n })\n\n const obj = Object\n // Setup inheritance of static members\n if (obj.setPrototypeOf) {\n obj.setPrototypeOf(subClass, superClass)\n } else if (classProps.strictEs6Class) {\n subClass.__proto__ = superClass // eslint-disable-line\n } else {\n utils.forOwn(superClass, function (value, key) {\n subClass[key] = value\n })\n }\n if (!subClass.hasOwnProperty('__super__')) {\n Object.defineProperty(subClass, '__super__', {\n configurable: true,\n value: superClass\n })\n }\n\n utils.addHiddenPropsToTarget(subClass.prototype, props)\n utils.fillIn(subClass, classProps)\n\n return subClass\n },\n\n /**\n * Shallow copy own enumerable properties from `src` to `dest` that are on\n * `src` but are missing from `dest.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: 'bar', beep: 'boop' }\n * const b = { beep: 'bip' }\n * utils.fillIn(b, a)\n * console.log(b) // {\"foo\":\"bar\",\"beep\":\"bip\"}\n *\n * @method utils.fillIn\n * @param {Object} dest The destination object.\n * @param {Object} source The source object.\n * @see utils.deepFillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n fillIn (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Find the last index of an item in an array according to the given checker function.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = { name: 'John', age: 20 }\n * const sara = { name: 'Sara', age: 25 }\n * const dan = { name: 'Dan', age: 20 }\n * const users = [john, sara, dan]\n *\n * console.log(utils.findIndex(users, (user) => user.age === 25)) // 1\n * console.log(utils.findIndex(users, (user) => user.age > 19)) // 2\n * console.log(utils.findIndex(users, (user) => user.name === 'John')) // 0\n * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')) // -1\n *\n * @method utils.findIndex\n * @param {Array} array The array to search.\n * @param {Function} fn Checker function.\n * @returns {number} Index if found or -1 if not found.\n * @since 3.0.0\n */\n findIndex (array, fn) {\n let index = -1\n if (!array) {\n return index\n }\n array.forEach(function (record, i) {\n if (fn(record)) {\n index = i\n return false\n }\n })\n return index\n },\n\n /**\n * Recursively iterate over a {@link Mapper}'s relations according to\n * `opts.with`.\n *\n * @method utils.forEachRelation\n * @param {Mapper} mapper Mapper.\n * @param {Object} opts Configuration options.\n * @param {Function} fn Callback function.\n * @param {*} thisArg Execution context for the callback function.\n * @since 3.0.0\n */\n forEachRelation (mapper, opts, fn, thisArg) {\n const relationList = mapper.relationList || []\n if (!relationList.length) {\n return\n }\n relationList.forEach(function (def) {\n utils._forRelation(opts, def, fn, thisArg)\n })\n },\n\n /**\n * Iterate over an object's own enumerable properties.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { b: 1, c: 4 }\n * let sum = 0\n * utils.forOwn(a, function (value, key) {\n * sum += value\n * })\n * console.log(sum) // 5\n *\n * @method utils.forOwn\n * @param {Object} object The object whose properties are to be enumerated.\n * @param {Function} fn Iteration function.\n * @param {Object} [thisArg] Content to which to bind `fn`.\n * @since 3.0.0\n */\n forOwn (obj, fn, thisArg) {\n const keys = Object.keys(obj)\n const len = keys.length\n let i\n for (i = 0; i < len; i++) {\n if (fn.call(thisArg, obj[keys[i]], keys[i], obj) === false) {\n break\n }\n }\n },\n\n /**\n * Proxy for `JSON.parse`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const a = utils.fromJson('{\"name\" : \"John\"}')\n * console.log(a) // { name: 'John' }\n *\n * @method utils.fromJson\n * @param {string} json JSON to parse.\n * @returns {Object} Parsed object.\n * @see utils.toJson\n * @since 3.0.0\n */\n fromJson (json) {\n return utils.isString(json) ? JSON.parse(json) : json\n },\n\n /**\n * Retrieve the specified property from the given object. Supports retrieving\n * nested properties.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: { bar: 'baz' }, beep: 'boop' }\n * console.log(utils.get(a, 'beep')) // \"boop\"\n * console.log(utils.get(a, 'foo.bar')) // \"baz\"\n *\n * @method utils.get\n * @param {Object} object Object from which to retrieve a property's value.\n * @param {string} prop Property to retrieve.\n * @returns {*} Value of the specified property.\n * @see utils.set\n * @since 3.0.0\n */\n 'get': function (object, prop) {\n if (!prop) {\n return\n }\n const parts = prop.split('.')\n const last = parts.pop()\n\n while (prop = parts.shift()) { // eslint-disable-line\n object = object[prop]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n return object[last]\n },\n\n /**\n * Return the superclass for the given instance or subclass. If an instance is\n * provided, then finds the parent class of the instance's constructor.\n *\n * @example\n * import {utils} from 'js-data'\n * // using ES2015 classes\n * class Foo {}\n * class Bar extends Foo {}\n * const barInstance = new Bar()\n * let baseType = utils.getSuper(barInstance)\n * console.log(Foo === baseType) // true\n *\n * // using Function constructor with utils.extend\n * function Foo () {}\n * Foo.extend = utils.extend\n * const Bar = Foo.extend()\n * const barInstance = new Bar()\n * let baseType = utils.getSuper(barInstance)\n * console.log(Foo === baseType) // true\n *\n * @method utils.getSuper\n * @param {Object|Function} instance Instance or constructor.\n * @param {boolean} [isCtor=false] Whether `instance` is a constructor.\n * @returns {Constructor} The superclass (grandparent constructor).\n * @since 3.0.0\n */\n getSuper (instance, isCtor) {\n const ctor = isCtor ? instance : instance.constructor\n if (ctor.hasOwnProperty('__super__')) {\n return ctor.__super__\n }\n return Object.getPrototypeOf(ctor) || ctor.__proto__ // eslint-disable-line\n },\n\n /**\n * Return the intersection of two arrays.\n *\n * @example\n * import {utils} from 'js-data'\n * const arrA = ['green', 'red', 'blue', 'red']\n * const arrB = ['green', 'yellow', 'red']\n * const intersected = utils.intersection(arrA, arrB)\n *\n * console.log(intersected) // ['green', 'red'])\n *\n * @method utils.intersection\n * @param {Array} array1 First array.\n * @param {Array} array2 Second array.\n * @returns {Array} Array of elements common to both arrays.\n * @since 3.0.0\n */\n intersection (array1, array2) {\n if (!array1 || !array2) {\n return []\n }\n const result = []\n let item\n let i\n const len = array1.length\n for (i = 0; i < len; i++) {\n item = array1[i]\n if (result.indexOf(item) !== -1) {\n continue\n }\n if (array2.indexOf(item) !== -1) {\n result.push(item)\n }\n }\n return result\n },\n\n /**\n * Proxy for `Array.isArray`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = [1,2,3,4,5]\n * const b = { foo: \"bar\" }\n * console.log(utils.isArray(a)) // true\n * console.log(utils.isArray(b)) // false\n *\n * @method utils.isArray\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an array.\n * @since 3.0.0\n */\n isArray: Array.isArray,\n\n /**\n * Return whether `prop` is matched by any string or regular expression in\n * `blacklist`.\n *\n * @example\n * import {utils} from 'js-data'\n * const blacklist = [/^\\$hashKey/g, /^_/g, 'id']\n * console.log(utils.isBlacklisted(\"$hashKey\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"id\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"_myProp\", blacklist)) // true\n * console.log(utils.isBlacklisted(\"my_id\", blacklist)) // false\n *\n * @method utils.isBlacklisted\n * @param {string} prop The name of a property to check.\n * @param {Array} blacklist Array of strings and regular expressions.\n * @returns {boolean} Whether `prop` was matched.\n * @since 3.0.0\n */\n isBlacklisted (prop, blacklist) {\n if (!blacklist || !blacklist.length) {\n return false\n }\n let matches\n for (var i = 0; i < blacklist.length; i++) {\n if ((toStr(blacklist[i]) === REGEXP_TAG && blacklist[i].test(prop)) || blacklist[i] === prop) {\n matches = prop\n return !!matches\n }\n }\n return !!matches\n },\n\n /**\n * Return whether the provided value is a boolean.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = true\n * const b = { foo: \"bar\" }\n * console.log(utils.isBoolean(a)) // true\n * console.log(utils.isBoolean(b)) // false\n *\n * @method utils.isBoolean\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a boolean.\n * @since 3.0.0\n */\n isBoolean (value) {\n return toStr(value) === BOOL_TAG\n },\n\n /**\n * Return whether the provided value is a date.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = new Date()\n * const b = { foo: \"bar\" }\n * console.log(utils.isDate(a)) // true\n * console.log(utils.isDate(b)) // false\n *\n * @method utils.isDate\n * @param {*} value The value to test.\n * @returns {Date} Whether the provided value is a date.\n * @since 3.0.0\n */\n isDate (value) {\n return (value && typeof value === 'object' && toStr(value) === DATE_TAG)\n },\n\n /**\n * Return whether the provided value is a function.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = function (){ console.log('foo bar')}\n * const b = { foo: \"bar\" }\n * console.log(utils.isFunction(a)) // true\n * console.log(utils.isFunction(b)) // false\n *\n * @method utils.isFunction\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a function.\n * @since 3.0.0\n */\n isFunction (value) {\n return typeof value === 'function' || (value && toStr(value) === FUNC_TAG)\n },\n\n /**\n * Return whether the provided value is an integer.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = 1\n * const b = 1.25\n * const c = '1'\n * console.log(utils.isInteger(a)) // true\n * console.log(utils.isInteger(b)) // false\n * console.log(utils.isInteger(c)) // false\n *\n * @method utils.isInteger\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an integer.\n * @since 3.0.0\n */\n isInteger (value) {\n return toStr(value) === NUMBER_TAG && value == toInteger(value) // eslint-disable-line\n },\n\n /**\n * Return whether the provided value is `null`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = null\n * const b = { foo: \"bar\" }\n * console.log(utils.isNull(a)) // true\n * console.log(utils.isNull(b)) // false\n *\n * @method utils.isNull\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is `null`.\n * @since 3.0.0\n */\n isNull (value) {\n return value === null\n },\n\n /**\n * Return whether the provided value is a number.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = 1\n * const b = -1.25\n * const c = '1'\n * console.log(utils.isNumber(a)) // true\n * console.log(utils.isNumber(b)) // true\n * console.log(utils.isNumber(c)) // false\n *\n * @method utils.isNumber\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a number.\n * @since 3.0.0\n */\n isNumber (value) {\n const type = typeof value\n return type === 'number' || (value && type === 'object' && toStr(value) === NUMBER_TAG)\n },\n\n /**\n * Return whether the provided value is an object.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: \"bar\" }\n * const b = 'foo bar'\n * console.log(utils.isObject(a)) // true\n * console.log(utils.isObject(b)) // false\n *\n * @method utils.isObject\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an object.\n * @since 3.0.0\n */\n isObject (value) {\n return toStr(value) === OBJECT_TAG\n },\n\n /**\n * Return whether the provided value is a regular expression.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = /^\\$.+$/ig\n * const b = new RegExp('^\\$.+$', 'ig')\n * const c = { foo: \"bar\" }\n * console.log(utils.isRegExp(a)) // true\n * console.log(utils.isRegExp(b)) // true\n * console.log(utils.isRegExp(c)) // false\n *\n * @method utils.isRegExp\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a regular expression.\n * @since 3.0.0\n */\n isRegExp (value) {\n return toStr(value) === REGEXP_TAG\n },\n\n /**\n * Return whether the provided value is a string or a number.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isSorN('')) // true\n * console.log(utils.isSorN(-1.65)) // true\n * console.log(utils.isSorN('my string')) // true\n * console.log(utils.isSorN({})) // false\n * console.log(utils.isSorN([1,2,4])) // false\n *\n * @method utils.isSorN\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string or a number.\n * @since 3.0.0\n */\n isSorN (value) {\n return utils.isString(value) || utils.isNumber(value)\n },\n\n /**\n * Return whether the provided value is a string.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('')) // true\n * console.log(utils.isString('my string')) // true\n * console.log(utils.isString(100)) // false\n * console.log(utils.isString([1,2,4])) // false\n *\n * @method utils.isString\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string.\n * @since 3.0.0\n */\n isString (value) {\n return typeof value === 'string' || (value && typeof value === 'object' && toStr(value) === STRING_TAG)\n },\n\n /**\n * Return whether the provided value is a `undefined`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = undefined\n * const b = { foo: \"bar\"}\n * console.log(utils.isUndefined(a)) // true\n * console.log(utils.isUndefined(b.baz)) // true\n * console.log(utils.isUndefined(b)) // false\n * console.log(utils.isUndefined(b.foo)) // false\n *\n * @method utils.isUndefined\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a `undefined`.\n * @since 3.0.0\n */\n isUndefined (value) {\n return value === undefined\n },\n\n /**\n * Mix in logging capabilities to the target.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { foo: \"bar\"}\n *\n * // Add standard logging to an object\n * utils.logify(a)\n * a.log('info', 'test log info') // output 'test log info' to console.\n *\n * // Toggle debug output of an object\n * a.dbg('test debug output') // does not output because debug is off.\n * a.debug = true\n * a.dbg('test debug output') // output 'test debug output' to console.\n *\n * @method utils.logify\n * @param {*} target The target.\n * @since 3.0.0\n */\n logify (target) {\n utils.addHiddenPropsToTarget(target, {\n dbg (...args) {\n if (utils.isFunction(this.log)) {\n this.log('debug', ...args)\n }\n },\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (${this.name || this.constructor.name})`\n if (utils.isFunction(console[level])) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n }\n })\n },\n\n /**\n * Adds the given record to the provided array only if it's not already in the\n * array.\n *\n * @example\n * import {utils} from 'js-data'\n * const colors = ['red', 'green', 'yellow']\n *\n * console.log(colors.length) // 3\n * utils.noDupeAdd(colors, 'red')\n * console.log(colors.length) // 3, red already exists\n *\n * utils.noDupeAdd(colors, 'blue')\n * console.log(colors.length) // 4, blue was added\n *\n * @method utils.noDupeAdd\n * @param {Array} array The array.\n * @param {*} record The value to add.\n * @param {Function} fn Callback function passed to {@link utils.findIndex}.\n * @since 3.0.0\n */\n noDupeAdd (array, record, fn) {\n if (!array) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index < 0) {\n array.push(record)\n }\n },\n\n /**\n * Return a shallow copy of the provided object, minus the properties\n * specified in `keys`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John', $hashKey: 1214910 }\n *\n * let b = utils.omit(a, ['$hashKey'])\n * console.log(b) // { name: 'John' }\n *\n * @method utils.omit\n * @param {Object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to skip.\n * @returns {Object} Shallow copy of `props`, minus `keys`.\n * @since 3.0.0\n */\n omit (props, keys) {\n const _props = {}\n utils.forOwn(props, function (value, key) {\n if (keys.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n },\n\n /**\n * Return a shallow copy of the provided object, but only include the\n * properties specified in `keys`.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John', $hashKey: 1214910 }\n *\n * let b = utils.pick(a, ['$hashKey'])\n * console.log(b) // { $hashKey: 1214910 }\n *\n * @method utils.pick\n * @param {Object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to keep.\n * @returns {Object} Shallow copy of `props`, but only including `keys`.\n * @since 3.0.0\n */\n pick (props, keys) {\n return keys.reduce((map, key) => {\n map[key] = props[key]\n return map\n }, {})\n },\n\n /**\n * Return a plain copy of the given value.\n *\n * @example\n * import {utils} from 'js-data'\n * const a = { name: 'John' }\n * let b = utils.plainCopy(a)\n * console.log(a === b) // false\n *\n * @method utils.plainCopy\n * @param {*} value The value to copy.\n * @returns {*} Plain copy of `value`.\n * @see utils.copy\n * @since 3.0.0\n */\n plainCopy (value) {\n return utils.copy(value, undefined, undefined, undefined, undefined, true)\n },\n\n /**\n * Shortcut for `utils.Promise.reject(value)`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * utils.reject(\"Testing static reject\").then(function(data) {\n * // not called\n * }).catch(function(reason) {\n * console.log(reason); // \"Testing static reject\"\n * })\n *\n * @method utils.reject\n * @param {*} [value] Value with which to reject the Promise.\n * @returns {Promise} Promise reject with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n reject (value) {\n return utils.Promise.reject(value)\n },\n\n /**\n * Remove the last item found in array according to the given checker function.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const colors = ['red', 'green', 'yellow', 'red']\n * utils.remove(colors, (color) => color === 'red')\n * console.log(colors) // ['red', 'green', 'yellow']\n *\n * @method utils.remove\n * @param {Array} array The array to search.\n * @param {Function} fn Checker function.\n */\n remove (array, fn) {\n if (!array || !array.length) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index >= 0) {\n array.splice(index, 1) // todo should this be recursive?\n }\n },\n\n /**\n * Shortcut for `utils.Promise.resolve(value)`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * utils.resolve(\"Testing static resolve\").then(function(data) {\n * console.log(data); // \"Testing static resolve\"\n * }).catch(function(reason) {\n * // not called\n * })\n *\n * @param {*} [value] Value with which to resolve the Promise.\n * @returns {Promise} Promise resolved with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n resolve (value) {\n return utils.Promise.resolve(value)\n },\n\n /**\n * Set the value at the provided key or path.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * }\n * // set value by key\n * utils.set(john, 'id', 98)\n * console.log(john.id) // 98\n *\n * // set value by path\n * utils.set(john, 'parent.id', 20)\n * console.log(john.parent.id) // 20\n *\n * // set value by path/value map\n * utils.set(john, {\n * 'id': 1098,\n * 'parent': { id: 1020 },\n * 'parent.age': '55'\n * })\n * console.log(john.id) // 1098\n * console.log(john.parent.id) // 1020\n * console.log(john.parent.age) // 55\n *\n * @method utils.set\n * @param {Object} object The object on which to set a property.\n * @param {(string|Object)} path The key or path to the property. Can also\n * pass in an object of path/value pairs, which will all be set on the target\n * object.\n * @param {*} [value] The value to set.\n */\n set: function (object, path, value) {\n if (utils.isObject(path)) {\n utils.forOwn(path, function (value, _path) {\n utils.set(object, _path, value)\n })\n } else {\n const parts = PATH.exec(path)\n if (parts) {\n mkdirP(object, parts[1])[parts[2]] = value\n } else {\n object[path] = value\n }\n }\n },\n\n /**\n * Check whether the two provided objects are deeply equal.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const objA = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * }\n *\n * const objB = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * }\n *\n * console.log(utils.deepEqual(a,b)) // true\n * objB.nested.colors.add('yellow') // make a change to a nested object's array\n * console.log(utils.deepEqual(a,b)) // false\n *\n * @method utils.deepEqual\n * @param {Object} a First object in the comparison.\n * @param {Object} b Second object in the comparison.\n * @returns {boolean} Whether the two provided objects are deeply equal.\n * @see utils.equal\n * @since 3.0.0\n */\n deepEqual (a, b) {\n if (a === b) {\n return true\n }\n let _equal = true\n if (utils.isArray(a) && utils.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n for (let i = a.length; i--;) {\n if (!utils.deepEqual(a[i], b[i])) {\n // Exit loop early\n return false\n }\n }\n } else if (utils.isObject(a) && utils.isObject(b)) {\n utils.forOwn(a, function (value, key) {\n if (!(_equal = utils.deepEqual(value, b[key]))) {\n // Exit loop early\n return false\n }\n })\n if (_equal) {\n utils.forOwn(b, function (value, key) {\n if (!(_equal = utils.deepEqual(value, a[key]))) {\n // Exit loop early\n return false\n }\n })\n }\n } else {\n return false\n }\n return _equal\n },\n\n /**\n * Proxy for `JSON.stringify`.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const a = { name: 'John' }\n * let jsonVal = utils.toJson(a)\n * console.log(jsonVal) // '{\"name\" : \"John\"}'\n *\n * @method utils.toJson\n * @param {*} value Value to serialize to JSON.\n * @returns {string} JSON string.\n * @see utils.fromJson\n * @since 3.0.0\n */\n toJson: JSON.stringify,\n\n /**\n * Unset the value at the provided key or path.\n *\n * @example\n * import {utils} from 'js-data'\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * }\n *\n * utils.unset(john, age)\n * utils.unset(john, parent.age)\n *\n * console.log(john.age) // null\n * console.log(john.parent.age) // null\n *\n * @method utils.unset\n * @param {Object} object The object from which to delete the property.\n * @param {string} path The key or path to the property.\n * @see utils.set\n * @since 3.0.0\n */\n unset (object, path) {\n const parts = path.split('.')\n const last = parts.pop()\n\n while (path = parts.shift()) { // eslint-disable-line\n object = object[path]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n object[last] = undefined\n }\n}\n\nexport const safeSetProp = function (record, field, value) {\n if (record && record._set) {\n record._set(`props.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport const safeSetLink = function (record, field, value) {\n if (record && record._set) {\n record._set(`links.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport default utils\n","import utils from './utils'\n\n/**\n * A base class which gives instances private properties.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Settable.extend} for an example of using {@link Settable} as a\n * base class.\n *\n *```javascript\n * import {Settable} from 'js-data'\n * ```\n *\n * @class Settable\n * @returns {Settable} A new {@link Settable} instance.\n * @since 3.0.0\n */\nexport default function Settable () {\n const _props = {}\n Object.defineProperties(this, {\n /**\n * Get a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method Settable#_get\n * @param {string} key The property to retrieve.\n * @returns {*} The value of the property.\n * @since 3.0.0\n */\n _get: { value (key) { return utils.get(_props, key) } },\n\n /**\n * Set a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_set\n * @param {(string|Object)} key The key or path to the property. Can also\n * pass in an object of key/value pairs, which will all be set on the instance.\n * @param {*} [value] The value to set.\n * @since 3.0.0\n */\n _set: { value (key, value) { return utils.set(_props, key, value) } },\n\n /**\n * Unset a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_unset\n * @param {string} key The property to unset.\n * @since 3.0.0\n */\n _unset: { value (key) { return utils.unset(_props, key) } }\n })\n}\n\n/**\n * Create a subclass of this Settable:\n *\n * @example Settable.extend\n * // Normally you would do: import {Settable} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Settable} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSettableClass extends Settable {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSettable = new CustomSettableClass()\n * console.log(customSettable.foo())\n * console.log(CustomSettableClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSettableClass = Settable.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSettable = new OtherSettableClass()\n * console.log(otherSettable.foo())\n * console.log(OtherSettableClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSettableClass () {\n * Settable.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Settable.extend({\n * constructor: AnotherSettableClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSettable = new AnotherSettableClass()\n * console.log(anotherSettable.created_at)\n * console.log(anotherSettable.foo())\n * console.log(AnotherSettableClass.beep())\n *\n * @method Settable.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Settable class.\n * @since 3.0.0\n */\nSettable.extend = utils.extend\n","import utils from './utils'\nimport Settable from './Settable'\n\n/**\n * The base class from which all JSData components inherit some basic\n * functionality.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Component.extend} for an example of using {@link Component} as a\n * base class.\n *\n *```javascript\n * import {Component} from 'js-data'\n * ```\n *\n * @class Component\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @returns {Component} A new {@link Component} instance.\n * @since 3.0.0\n */\nfunction Component (opts) {\n Settable.call(this)\n opts || (opts = {})\n\n /**\n * Whether to enable debug-level logs for this component. Anything that\n * extends `Component` inherits this option and the corresponding logging\n * functionality.\n *\n * @example Component#debug\n * // Normally you would do: import {Component} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Component} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const component = new Component()\n * component.log('debug', 'some message') // nothing gets logged\n * // Display debug logs:\n * component.debug = true\n * component.log('debug', 'other message') // this DOES get logged\n *\n * @default false\n * @name Component#debug\n * @since 3.0.0\n * @type {boolean}\n */\n this.debug = opts.hasOwnProperty('debug') ? !!opts.debug : false\n\n /**\n * Event listeners attached to this Component. __Do not modify.__ Use\n * {@link Component#on} and {@link Component#off} instead.\n *\n * @name Component#_listeners\n * @private\n * @instance\n * @since 3.0.0\n * @type {Object}\n */\n Object.defineProperty(this, '_listeners', { value: {}, writable: true })\n}\n\nexport default Settable.extend({\n constructor: Component\n})\n\n/**\n * Create a subclass of this Component:\n *\n * @example Component.extend\n * // Normally you would do: import {Component} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Component} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomComponentClass extends Component {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customComponent = new CustomComponentClass()\n * console.log(customComponent.foo())\n * console.log(CustomComponentClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherComponentClass = Component.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherComponent = new OtherComponentClass()\n * console.log(otherComponent.foo())\n * console.log(OtherComponentClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherComponentClass () {\n * Component.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Component.extend({\n * constructor: AnotherComponentClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherComponent = new AnotherComponentClass()\n * console.log(anotherComponent.created_at)\n * console.log(anotherComponent.foo())\n * console.log(AnotherComponentClass.beep())\n *\n * @method Component.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Component class.\n * @since 3.0.0\n */\nComponent.extend = utils.extend\n\n/**\n * Log the provided values at the \"debug\" level. Debug-level logs are only\n * logged if {@link Component#debug} is `true`.\n *\n * `.dbg(...)` is shorthand for `.log('debug', ...)`.\n *\n * @method Component#dbg\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\n/**\n * Log the provided values. By default sends values to `console[level]`.\n * Debug-level logs are only logged if {@link Component#debug} is `true`.\n *\n * Will attempt to use appropriate `console` methods if they are available.\n *\n * @method Component#log\n * @param {string} level Log level.\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\nutils.logify(Component.prototype)\n\n/**\n * Register a new event listener on this Component.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a DataStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName) // \"post\"\n * console.log(props.id) // undefined\n * console.log(result.id) // 1234\n * })\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id) // 1234\n * })\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * collection.on('add', (records) => {\n * console.log(records) // [...]\n * })\n *\n * @example\n * // Listen for \"change\" events on a record\n * post.on('change', (record, changes) => {\n * console.log(changes) // { changed: { title: 'Modeling your data' } }\n * })\n * post.title = 'Modeling your data'\n *\n * @method Component#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n/**\n * Remove an event listener from this Component. If no listener is provided,\n * then all listeners for the specified event will be removed. If no event is\n * specified then all listeners for all events will be removed.\n *\n * @example\n * // Remove a particular listener for a particular event\n * collection.off('add', handler)\n *\n * @example\n * // Remove all listeners for a particular event\n * record.off('change')\n *\n * @example\n * // Remove all listeners to all events\n * store.off()\n *\n * @method Component#off\n * @param {string} [event] Name of event to unsubsribe to.\n * @param {Function} [listener] Listener to remove.\n * @since 3.0.0\n */\n/**\n * Trigger an event on this Component.\n *\n * @example Component#emit\n * // import {Collection, DataStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, DataStore} = JSData\n *\n * const collection = new Collection()\n * collection.on('foo', function (msg) {\n * console.log(msg)\n * })\n * collection.emit('foo', 'bar')\n *\n * const store = new DataStore()\n * store.on('beep', function (msg) {\n * console.log(msg)\n * })\n * store.emit('beep', 'boop')\n *\n * @method Component#emit\n * @param {string} event Name of event to emit.\n * @param {...*} [args] Arguments to pass to any listeners.\n * @since 3.0.0\n */\nutils.eventify(\n Component.prototype,\n function () {\n return this._listeners\n },\n function (value) {\n this._listeners = value\n }\n)\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Query'\nconst INDEX_ERR = 'Index inaccessible after first operation'\n\n// Reserved words used by JSData's Query Syntax\nconst reserved = {\n limit: '',\n offset: '',\n orderBy: '',\n skip: '',\n sort: '',\n where: ''\n}\n\n// Used by our JavaScript implementation of the LIKE operator\nconst escapeRegExp = /([.*+?^=!:${}()|[\\]/\\\\])/g\nconst percentRegExp = /%/g\nconst underscoreRegExp = /_/g\nconst escape = function (pattern) {\n return pattern.replace(escapeRegExp, '\\\\$1')\n}\n\n/**\n * A class used by the {@link Collection} class to build queries to be executed\n * against the collection's data. An instance of `Query` is returned by\n * {@link Collection#query}. Query instances are typically short-lived, and you\n * shouldn't have to create them yourself. Just use {@link Collection#query}.\n *\n * ```javascript\n * import {Query} from 'js-data'\n * ```\n *\n * @example\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run()\n * console.log(drafts)\n *\n * @class Query\n * @extends Component\n * @param {Collection} collection The collection on which this query operates.\n * @since 3.0.0\n */\nfunction Query (collection) {\n utils.classCallCheck(this, Query)\n\n /**\n * The {@link Collection} on which this query operates.\n *\n * @name Query#collection\n * @since 3.0.0\n * @type {Collection}\n */\n this.collection = collection\n\n /**\n * The current data result of this query.\n *\n * @name Query#data\n * @since 3.0.0\n * @type {Array}\n */\n this.data = null\n}\n\nexport default Component.extend({\n constructor: Query,\n\n _applyWhereFromObject (where) {\n const fields = []\n const ops = []\n const predicates = []\n utils.forOwn(where, (clause, field) => {\n if (!utils.isObject(clause)) {\n clause = {\n '==': clause\n }\n }\n utils.forOwn(clause, (expr, op) => {\n fields.push(field)\n ops.push(op)\n predicates.push(expr)\n })\n })\n return {\n fields,\n ops,\n predicates\n }\n },\n\n _applyWhereFromArray (where) {\n const groups = []\n where.forEach((_where, i) => {\n if (utils.isString(_where)) {\n return\n }\n const prev = where[i - 1]\n const parser = utils.isArray(_where) ? this._applyWhereFromArray : this._applyWhereFromObject\n const group = parser.call(this, _where)\n if (prev === 'or') {\n group.isOr = true\n }\n groups.push(group)\n })\n groups.isArray = true\n return groups\n },\n\n _testObjectGroup (keep, first, group, item) {\n let i\n const fields = group.fields\n const ops = group.ops\n const predicates = group.predicates\n const len = ops.length\n for (i = 0; i < len; i++) {\n let op = ops[i]\n const isOr = op.charAt(0) === '|'\n op = isOr ? op.substr(1) : op\n const expr = this.evaluate(utils.get(item, fields[i]), op, predicates[i])\n if (expr !== undefined) {\n keep = first ? expr : (isOr ? keep || expr : keep && expr)\n }\n first = false\n }\n return { keep, first }\n },\n\n _testArrayGroup (keep, first, groups, item) {\n let i\n const len = groups.length\n for (i = 0; i < len; i++) {\n const group = groups[i]\n const parser = group.isArray ? this._testArrayGroup : this._testObjectGroup\n const result = parser.call(this, true, true, group, item)\n if (groups[i - 1]) {\n if (group.isOr) {\n keep = keep || result.keep\n } else {\n keep = keep && result.keep\n }\n } else {\n keep = result.keep\n }\n first = result.first\n }\n return { keep, first }\n },\n\n /**\n * Find all entities between two boundaries.\n *\n * @example Get the users ages 18 to 30.\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const filteredUsers = store.query('user').between(18, 30, { index: 'age' }).run()\n * console.log(filteredUsers)\n *\n * @example Same as above.\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const filteredUsers = store.query('user').between([18], [30], { index: 'age' }).run()\n * console.log(filteredUsers)\n *\n * @method Query#between\n * @param {Array} leftKeys Keys defining the left boundary.\n * @param {Array} rightKeys Keys defining the right boundary.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#between`)(500, 'Cannot access index')\n }\n this.data = this.collection.getIndex(opts.index).between(leftKeys, rightKeys, opts)\n return this\n },\n\n /**\n * The comparison function used by the {@link Query} class.\n *\n * @method Query#compare\n * @param {Array} orderBy An orderBy clause used for sorting and sub-sorting.\n * @param {number} index The index of the current orderBy clause being used.\n * @param {*} a The first item in the comparison.\n * @param {*} b The second item in the comparison.\n * @returns {number} -1 if `b` should preceed `a`. 0 if `a` and `b` are equal.\n * 1 if `a` should preceed `b`.\n * @since 3.0.0\n */\n compare (orderBy, index, a, b) {\n const def = orderBy[index]\n let cA = utils.get(a, def[0])\n let cB = utils.get(b, def[0])\n if (cA && utils.isString(cA)) {\n cA = cA.toUpperCase()\n }\n if (cB && utils.isString(cB)) {\n cB = cB.toUpperCase()\n }\n if (a === undefined) {\n a = null\n }\n if (b === undefined) {\n b = null\n }\n if (def[1].toUpperCase() === 'DESC') {\n const temp = cB\n cB = cA\n cA = temp\n }\n if (cA < cB) {\n return -1\n } else if (cA > cB) {\n return 1\n } else {\n if (index < orderBy.length - 1) {\n return this.compare(orderBy, index + 1, a, b)\n } else {\n return 0\n }\n }\n },\n\n /**\n * Predicate evaluation function used by the {@link Query} class.\n *\n * @method Query#evaluate\n * @param {*} value The value to evaluate.\n * @param {string} op The operator to use in this evaluation.\n * @param {*} predicate The predicate to use in this evaluation.\n * @returns {boolean} Whether the value passed the evaluation or not.\n * @since 3.0.0\n */\n evaluate (value, op, predicate) {\n const ops = this.constructor.ops\n if (ops[op]) {\n return ops[op](value, predicate)\n }\n if (op.indexOf('like') === 0) {\n return this.like(predicate, op.substr(4)).exec(value) !== null\n } else if (op.indexOf('notLike') === 0) {\n return this.like(predicate, op.substr(7)).exec(value) === null\n }\n },\n\n /**\n * Find the record or records that match the provided query or are accepted by\n * the provided filter function.\n *\n * @example Get the draft posts by authors younger than 30\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ]\n * store.add('post', posts)\n * let results = store.query('post').filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * age: {\n * '<': 30\n * }\n * }\n * }).run()\n * console.log(results)\n *\n * @example Use a custom filter function\n * const posts = query.filter(function (post) {\n * return post.isReady()\n * }).run()\n *\n * @method Query#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Function} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n filter (query, thisArg) {\n /**\n * Selection query as defined by JSData's [Query Syntax][querysyntax].\n *\n * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax\n *\n * @example Empty \"findAll\" query\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * store.findAll('post').then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @example Empty \"filter\" query\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = store.filter('post')\n * console.log(posts) // [...]\n *\n * @example Complex \"filter\" query\n * const PAGE_SIZE = 2\n * let currentPage = 3\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ]\n * store.add('post', posts)\n * // Retrieve a filtered page of blog posts\n * // Would typically replace filter with findAll\n * store.filter('post', {\n * where: {\n * status: {\n * // WHERE status = 'published'\n * '==': 'published'\n * },\n * author: {\n * // AND author IN ('bob', 'alice')\n * 'in': ['bob', 'alice'],\n * // OR author IN ('karen')\n * '|in': ['karen']\n * }\n * },\n * orderBy: [\n * // ORDER BY date_published DESC,\n * ['date_published', 'DESC'],\n * // ORDER BY title ASC\n * ['title', 'ASC']\n * ],\n * // LIMIT 2\n * limit: PAGE_SIZE,\n * // SKIP 4\n * offset: PAGE_SIZE * (currentPage - 1)\n * })\n *\n * @namespace query\n * @property {number} [limit] See {@link query.limit}.\n * @property {number} [offset] See {@link query.offset}.\n * @property {string|Array[]} [orderBy] See {@link query.orderBy}.\n * @property {number} [skip] Alias for {@link query.offset}.\n * @property {string|Array[]} [sort] Alias for {@link query.orderBy}.\n * @property {Object} [where] See {@link query.where}.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/query-syntax\",\"JSData's Query Syntax\"]\n */\n query || (query = {})\n this.getData()\n if (utils.isObject(query)) {\n let where = {}\n\n /**\n * Filtering criteria. Records that do not meet this criteria will be exluded\n * from the result.\n *\n * @example Return posts where author is at least 32 years old\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * where: {\n * age: {\n * '>=': 30\n * }\n * }\n * })\n * console.log(results)\n *\n * @name query.where\n * @type {Object}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isObject(query.where) || utils.isArray(query.where)) {\n where = query.where\n }\n utils.forOwn(query, function (value, key) {\n if (!(key in reserved) && !(key in where)) {\n where[key] = {\n '==': value\n }\n }\n })\n let groups\n\n // Apply filter for each field\n if (utils.isObject(where) && Object.keys(where).length !== 0) {\n groups = this._applyWhereFromArray([where])\n } else if (utils.isArray(where)) {\n groups = this._applyWhereFromArray(where)\n }\n\n if (groups) {\n this.data = this.data.filter((item, i) => this._testArrayGroup(true, true, groups, item).keep)\n }\n\n // Sort\n let orderBy = query.orderBy || query.sort\n\n if (utils.isString(orderBy)) {\n orderBy = [\n [orderBy, 'ASC']\n ]\n }\n if (!utils.isArray(orderBy)) {\n orderBy = null\n }\n\n /**\n * Determines how records should be ordered in the result.\n *\n * @example Order posts by `author` then by `id` descending \n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * orderBy:[['author','ASC'],['id','DESC']]\n * })\n * console.log(results)\n *\n * @name query.orderBy\n * @type {string|Array[]}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (orderBy) {\n let index = 0\n orderBy.forEach(function (def, i) {\n if (utils.isString(def)) {\n orderBy[i] = [def, 'ASC']\n }\n })\n this.data.sort((a, b) => this.compare(orderBy, index, a, b))\n }\n\n /**\n * Number of records to skip.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * PostMapper.findAll({\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * console.log(results)\n *\n * @name query.offset\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.skip)) {\n this.skip(query.skip)\n } else if (utils.isNumber(query.offset)) {\n this.skip(query.offset)\n }\n\n /**\n * Maximum number of records to retrieve.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * PostMapper.findAll({\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ]\n * store.add('post', posts)\n * store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * })\n *\n * console.log(results)\n * @name query.limit\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.limit)) {\n this.limit(query.limit)\n }\n } else if (utils.isFunction(query)) {\n this.data = this.data.filter(query, thisArg)\n }\n return this\n },\n\n /**\n * Iterate over all entities.\n *\n * @method Query#forEach\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n forEach (forEachFn, thisArg) {\n this.getData().forEach(forEachFn, thisArg)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided key.\n *\n * @example Get the entity whose primary key is 25.\n * const entities = query.get(25).run()\n *\n * @example Same as above.\n * const entities = query.get([25]).run()\n *\n * @example Get all users who are active and have the \"admin\" role.\n * const activeAdmins = query.get(['active', 'admin'], {\n * index: 'activityAndRoles'\n * }).run()\n *\n * @example Get all entities that match a certain weather condition.\n * const niceDays = query.get(['sunny', 'humid', 'calm'], {\n * index: 'weatherConditions'\n * }).run()\n *\n * @method Query#get\n * @param {Array} keyList Key(s) defining the entity to retrieve. If\n * `keyList` is not an array (i.e. for a single-value key), it will be\n * wrapped in an array.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.string] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n get (keyList, opts) {\n keyList || (keyList = [])\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#get`)(500, INDEX_ERR)\n }\n if (keyList && !utils.isArray(keyList)) {\n keyList = [keyList]\n }\n if (!keyList.length) {\n this.getData()\n return this\n }\n this.data = this.collection.getIndex(opts.index).get(keyList)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided keyLists.\n *\n * @example Get the posts where \"status\" is \"draft\" or \"inReview\".\n * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run()\n *\n * @example Same as above.\n * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run()\n *\n * @method Query#getAll\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * entities matching each keyList will be retrieved. If no keyLists are\n * provided, all entities will be returned.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n getAll (...args) {\n let opts = {}\n if (this.data) {\n throw utils.err(`${DOMAIN}#getAll`)(500, INDEX_ERR)\n }\n if (!args.length || (args.length === 1 && utils.isObject(args[0]))) {\n this.getData()\n return this\n } else if (args.length && utils.isObject(args[args.length - 1])) {\n opts = args[args.length - 1]\n args.pop()\n }\n const collection = this.collection\n const index = collection.getIndex(opts.index)\n this.data = []\n args.forEach((keyList) => {\n this.data = this.data.concat(index.get(keyList))\n })\n return this\n },\n\n /**\n * Return the current data result of this query.\n *\n * @method Query#getData\n * @returns {Array} The data in this query.\n * @since 3.0.0\n */\n getData () {\n if (!this.data) {\n this.data = this.collection.index.getAll()\n }\n return this.data\n },\n\n /**\n * Implementation used by the `like` operator. Takes a pattern and flags and\n * returns a `RegExp` instance that can test strings.\n *\n * @method Query#like\n * @param {string} pattern Testing pattern.\n * @param {string} flags Flags for the regular expression.\n * @returns {RegExp} Regular expression for testing strings.\n * @since 3.0.0\n */\n like (pattern, flags) {\n return new RegExp(`^${(escape(pattern).replace(percentRegExp, '.*').replace(underscoreRegExp, '.'))}$`, flags)\n },\n\n /**\n * Limit the result.\n *\n * @example Get only the first 2 posts.\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const results = store.query('post').limit(2).run()\n * console.log(results)\n *\n * @method Query#limit\n * @param {number} num The maximum number of entities to keep in the result.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n limit (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#limit`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n this.data = data.slice(0, Math.min(data.length, num))\n return this\n },\n\n /**\n * Apply a mapping function to the result data.\n *\n * @example\n * // Return the age of all users\n * const store = new JSData.DataStore()\n * store.defineMapper('user')\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ]\n * store.add('post', posts)\n * const ages = store.query('user').map((user) => {\n * return user.age\n * }).run()\n * console.log(ages)\n *\n * @method Query#map\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n map (mapFn, thisArg) {\n this.data = this.getData().map(mapFn, thisArg)\n return this\n },\n\n /**\n * Return the result of calling the specified function on each item in this\n * collection's main index.\n *\n * @example\n * const stringAges = UserCollection.query().mapCall('toString').run()\n *\n * @method Query#mapCall\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n mapCall (funcName, ...args) {\n this.data = this.getData().map(function (item) {\n return item[funcName](...args)\n })\n return this\n },\n\n /**\n * Complete the execution of the query and return the resulting data.\n *\n * @method Query#run\n * @returns {Array} The result of executing this query.\n * @since 3.0.0\n */\n run () {\n const data = this.data\n this.data = null\n return data\n },\n\n /**\n * Skip a number of results.\n *\n * @example Get all but the first 2 posts.\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts)\n * const results = store.query('post').skip(2).run()\n * console.log(results)\n *\n * @method Query#skip\n * @param {number} num The number of entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n skip (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#skip`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n if (num < data.length) {\n this.data = data.slice(num)\n } else {\n this.data = []\n }\n return this\n }\n}, {\n /**\n * The filtering operators supported by {@link Query#filter}, and which are\n * implemented by adapters (for the most part).\n *\n * @example Variant 1\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.filter('post', {\n * status: 'published',\n * limit: 2\n * })\n *\n * console.log(publishedPosts)\n *\n *\n * @example Variant 2\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * }\n * },\n * limit: 2\n * })\n *\n * console.log(publishedPosts)\n *\n * @example Variant 3\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.query('post').filter({\n * status: 'published'\n * }).limit(2).run()\n *\n * console.log(publishedPosts)\n *\n * @example Variant 4\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const publishedPosts = store.query('post').filter({\n * where: {\n * status: {\n * '==': 'published'\n * }\n * }\n * }).limit(2).run()\n *\n * console.log(publishedPosts)\n *\n * @example Multiple operators\n *\n * const store = new JSData.DataStore()\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ]\n * store.add('post', posts)\n *\n * const myPublishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * },\n * user_id: {\n * '==': currentUser.id\n * }\n * }\n * })\n *\n * console.log(myPublishedPosts)\n *\n * @name Query.ops\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > Greater than operator.\n * @property {Function} >= Greater than (inclusive) operator.\n * @property {Function} < Less than operator.\n * @property {Function} <= Less than (inclusive) operator.\n * @property {Function} isectEmpty Operator that asserts that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator that asserts that the\n * intersection between two arrays is __not__ empty.\n * @property {Function} in Operator that asserts whether a value is in an\n * array.\n * @property {Function} notIn Operator that asserts whether a value is __not__\n * in an array.\n * @property {Function} contains Operator that asserts whether an array\n * contains a value.\n * @property {Function} notContains Operator that asserts whether an array\n * does __not__ contain a value.\n * @since 3.0.0\n * @type {Object}\n */\n ops: {\n '=': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '==': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '===': function (value, predicate) {\n return value === predicate\n },\n '!=': function (value, predicate) {\n return value != predicate // eslint-disable-line\n },\n '!==': function (value, predicate) {\n return value !== predicate\n },\n '>': function (value, predicate) {\n return value > predicate\n },\n '>=': function (value, predicate) {\n return value >= predicate\n },\n '<': function (value, predicate) {\n return value < predicate\n },\n '<=': function (value, predicate) {\n return value <= predicate\n },\n 'isectEmpty': function (value, predicate) {\n return !utils.intersection((value || []), (predicate || [])).length\n },\n 'isectNotEmpty': function (value, predicate) {\n return utils.intersection((value || []), (predicate || [])).length\n },\n 'in': function (value, predicate) {\n return predicate.indexOf(value) !== -1\n },\n 'notIn': function (value, predicate) {\n return predicate.indexOf(value) === -1\n },\n 'contains': function (value, predicate) {\n return (value || []).indexOf(predicate) !== -1\n },\n 'notContains': function (value, predicate) {\n return (value || []).indexOf(predicate) === -1\n }\n }\n})\n\n/**\n * Create a subclass of this Query:\n * @example Query.extend\n * // Normally you would do: import {Query} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Query} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomQueryClass extends Query {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customQuery = new CustomQueryClass()\n * console.log(customQuery.foo())\n * console.log(CustomQueryClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherQueryClass = Query.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherQuery = new OtherQueryClass()\n * console.log(otherQuery.foo())\n * console.log(OtherQueryClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherQueryClass (collection) {\n * Query.call(this, collection)\n * this.created_at = new Date().getTime()\n * }\n * Query.extend({\n * constructor: AnotherQueryClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherQuery = new AnotherQueryClass()\n * console.log(anotherQuery.created_at)\n * console.log(anotherQuery.foo())\n * console.log(AnotherQueryClass.beep())\n *\n * @method Query.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Query class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\n// TODO: remove this when the rest of the project is cleaned\nexport const belongsToType = 'belongsTo'\nexport const hasManyType = 'hasMany'\nexport const hasOneType = 'hasOne'\n\nconst DOMAIN = 'Relation'\n\nexport function Relation (relatedMapper, options = {}) {\n utils.classCallCheck(this, Relation)\n\n options.type = this.constructor.TYPE_NAME\n this.validateOptions(relatedMapper, options)\n\n if (typeof relatedMapper === 'object') {\n Object.defineProperty(this, 'relatedMapper', { value: relatedMapper })\n }\n\n Object.defineProperty(this, 'inverse', { writable: true })\n utils.fillIn(this, options)\n}\n\nRelation.extend = utils.extend\n\nutils.addHiddenPropsToTarget(Relation.prototype, {\n get canAutoAddLinks () {\n return this.add === undefined || !!this.add\n },\n\n get relatedCollection () {\n return this.mapper.datastore.getCollection(this.relation)\n },\n\n validateOptions (related, opts) {\n const DOMAIN_ERR = `new ${DOMAIN}`\n\n const localField = opts.localField\n if (!localField) {\n throw utils.err(DOMAIN_ERR, 'opts.localField')(400, 'string', localField)\n }\n\n const foreignKey = opts.foreignKey = opts.foreignKey || opts.localKey\n if (!foreignKey && (opts.type === belongsToType || opts.type === hasOneType)) {\n throw utils.err(DOMAIN_ERR, 'opts.foreignKey')(400, 'string', foreignKey)\n }\n\n if (utils.isString(related)) {\n opts.relation = related\n if (!utils.isFunction(opts.getRelation)) {\n throw utils.err(DOMAIN_ERR, 'opts.getRelation')(400, 'function', opts.getRelation)\n }\n } else if (related) {\n opts.relation = related.name\n } else {\n throw utils.err(DOMAIN_ERR, 'related')(400, 'Mapper or string', related)\n }\n },\n\n assignTo (mapper) {\n this.name = mapper.name\n Object.defineProperty(this, 'mapper', { value: mapper })\n\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n mapper.relationFields || Object.defineProperty(mapper, 'relationFields', { value: [] })\n mapper.relationList.push(this)\n mapper.relationFields.push(this.localField)\n },\n\n canFindLinkFor () {\n return !!(this.foreignKey || this.localKey)\n },\n\n getRelation () {\n return this.relatedMapper\n },\n\n getForeignKey (record) {\n return utils.get(record, this.mapper.idAttribute)\n },\n\n setForeignKey (record, relatedRecord) {\n if (!record || !relatedRecord) {\n return\n }\n\n this._setForeignKey(record, relatedRecord)\n },\n\n _setForeignKey (record, relatedRecords) {\n const idAttribute = this.mapper.idAttribute\n\n if (!utils.isArray(relatedRecords)) {\n relatedRecords = [relatedRecords]\n }\n\n relatedRecords.forEach((relatedRecord) => {\n utils.set(relatedRecord, this.foreignKey, utils.get(record, idAttribute))\n })\n },\n\n getLocalField (record) {\n return utils.get(record, this.localField)\n },\n\n setLocalField (record, relatedData) {\n return utils.set(record, this.localField, relatedData)\n },\n\n getInverse (mapper) {\n if (!this.inverse) {\n this.findInverseRelation(mapper)\n }\n\n return this.inverse\n },\n\n findInverseRelation (mapper) {\n this.getRelation().relationList.forEach((def) => {\n if (def.getRelation() === mapper && this.isInversedTo(def) && this !== def) {\n this.inverse = def\n return true\n }\n })\n },\n\n isInversedTo (def) {\n return !def.foreignKey || def.foreignKey === this.foreignKey\n },\n\n addLinkedRecords (records) {\n const datastore = this.mapper.datastore\n\n records.forEach((record) => {\n let relatedData = this.getLocalField(record)\n\n if (utils.isFunction(this.add)) {\n relatedData = this.add(datastore, this, record)\n } else if (relatedData) {\n relatedData = this.linkRecord(record, relatedData)\n }\n\n const isEmptyLinks = !relatedData || (utils.isArray(relatedData) && !relatedData.length)\n\n if (isEmptyLinks && this.canFindLinkFor(record)) {\n relatedData = this.findExistingLinksFor(record)\n }\n\n if (relatedData) {\n this.setLocalField(record, relatedData)\n }\n })\n },\n\n removeLinkedRecords (relatedMapper, records) {\n const localField = this.localField\n records.forEach((record) => {\n utils.set(record, localField, undefined)\n })\n },\n\n linkRecord (record, relatedRecord) {\n const relatedId = utils.get(relatedRecord, this.mapper.idAttribute)\n\n if (relatedId === undefined) {\n const unsaved = this.relatedCollection.unsaved()\n if (unsaved.indexOf(relatedRecord) === -1) {\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n } else {\n if (relatedRecord !== this.relatedCollection.get(relatedId)) {\n this.setForeignKey(record, relatedRecord)\n\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n }\n\n return relatedRecord\n },\n\n // e.g. user hasMany post via \"foreignKey\", so find all posts of user\n findExistingLinksByForeignKey (id) {\n if (id === undefined || id === null) {\n return\n }\n return this.relatedCollection.filter({\n [this.foreignKey]: id\n })\n },\n\n ensureLinkedDataHasProperType (props, opts) {\n const relatedMapper = this.getRelation()\n const relationData = this.getLocalField(props)\n\n if (utils.isArray(relationData) && (!relationData.length || relatedMapper.is(relationData[0]))) {\n return\n }\n\n if (relationData && !relatedMapper.is(relationData)) {\n utils.set(props, this.localField, relatedMapper.createRecord(relationData, opts))\n }\n },\n\n isRequiresParentId () {\n return false\n },\n\n isRequiresChildId () {\n return false\n },\n\n createChildRecord (props, relationData, opts) {\n this.setForeignKey(props, relationData)\n\n return this.createLinked(relationData, opts).then((result) => {\n this.setLocalField(props, result)\n })\n },\n\n createLinked (props, opts) {\n const create = utils.isArray(props) ? 'createMany' : 'create'\n\n return this.getRelation()[create](props, opts)\n }\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const BelongsToRelation = Relation.extend({\n getForeignKey (record) {\n return utils.get(record, this.foreignKey)\n },\n\n _setForeignKey (record, relatedRecord) {\n utils.set(record, this.foreignKey, utils.get(relatedRecord, this.getRelation().idAttribute))\n },\n\n findExistingLinksFor (record) {\n // console.log('\\tBelongsTo#findExistingLinksFor', record)\n if (!record) {\n return\n }\n const relatedId = utils.get(record, this.foreignKey)\n if (relatedId !== undefined && relatedId !== null) {\n return this.relatedCollection.get(relatedId)\n }\n },\n\n isRequiresParentId () {\n return true\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n\n return this.createLinked(relationData, opts).then((record) => {\n this.setForeignKey(props, record)\n })\n },\n\n createChildRecord () {\n throw new Error('\"BelongsTo\" relation does not support child creation as it cannot have children.')\n }\n}, {\n TYPE_NAME: 'belongsTo'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasManyRelation = Relation.extend({\n validateOptions (related, opts) {\n Relation.prototype.validateOptions.call(this, related, opts)\n\n const { localKeys, foreignKeys, foreignKey } = opts\n\n if (!foreignKey && !localKeys && !foreignKeys) {\n throw utils.err('new Relation', 'opts.')(400, 'string', foreignKey)\n }\n },\n\n canFindLinkFor (record) {\n const hasForeignKeys = this.foreignKey || this.foreignKeys\n return !!(hasForeignKeys || (this.localKeys && utils.get(record, this.localKeys)))\n },\n\n linkRecord (record, relatedRecords) {\n const relatedCollection = this.relatedCollection\n const canAutoAddLinks = this.canAutoAddLinks\n const foreignKey = this.foreignKey\n const unsaved = this.relatedCollection.unsaved()\n\n return relatedRecords.map((relatedRecord) => {\n const relatedId = relatedCollection.recordId(relatedRecord)\n\n if ((relatedId === undefined && unsaved.indexOf(relatedRecord) === -1) || relatedRecord !== relatedCollection.get(relatedId)) {\n if (foreignKey) {\n // TODO: slow, could be optimized? But user loses hook\n this.setForeignKey(record, relatedRecord)\n }\n if (canAutoAddLinks) {\n relatedRecord = relatedCollection.add(relatedRecord)\n }\n }\n\n return relatedRecord\n })\n },\n\n findExistingLinksFor (record) {\n const id = utils.get(record, this.mapper.idAttribute)\n const ids = this.localKeys ? utils.get(record, this.localKeys) : null\n let records\n\n if (id !== undefined && this.foreignKey) {\n records = this.findExistingLinksByForeignKey(id)\n } else if (this.localKeys && ids) {\n records = this.findExistingLinksByLocalKeys(ids)\n } else if (id !== undefined && this.foreignKeys) {\n records = this.findExistingLinksByForeignKeys(id)\n }\n\n if (records && records.length) {\n return records\n }\n },\n\n // e.g. user hasMany group via \"foreignKeys\", so find all users of a group\n findExistingLinksByLocalKeys (ids) {\n return this.relatedCollection.filter({\n where: {\n [this.mapper.idAttribute]: {\n 'in': ids\n }\n }\n })\n },\n\n // e.g. group hasMany user via \"localKeys\", so find all groups that own a user\n findExistingLinksByForeignKeys (id) {\n return this.relatedCollection.filter({\n where: {\n [this.foreignKeys]: {\n 'contains': id\n }\n }\n })\n },\n\n isRequiresParentId () {\n return !!this.localKeys && this.localKeys.length > 0\n },\n\n isRequiresChildId () {\n return !!this.foreignKey\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n const foreignIdField = this.getRelation().idAttribute\n\n return this.createLinked(relationData, opts).then((records) => {\n utils.set(props, this.localKeys, records.map((record) => utils.get(record, foreignIdField)))\n })\n },\n\n createLinked (props, opts) {\n return this.getRelation().createMany(props, opts)\n }\n}, {\n TYPE_NAME: 'hasMany'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasOneRelation = Relation.extend({\n findExistingLinksFor (relatedMapper, record) {\n const recordId = utils.get(record, relatedMapper.idAttribute)\n const records = this.findExistingLinksByForeignKey(recordId)\n\n if (records && records.length) {\n return records[0]\n }\n },\n\n isRequiresChildId () {\n return true\n }\n}, {\n TYPE_NAME: 'hasOne'\n})\n","import { Relation } from './Relation'\nimport { BelongsToRelation } from './Relation/BelongsTo'\nimport { HasManyRelation } from './Relation/HasMany'\nimport { HasOneRelation } from './Relation/HasOne'\n\n[BelongsToRelation, HasManyRelation, HasOneRelation].forEach(function (RelationType) {\n Relation[RelationType.TYPE_NAME] = function (related, options) {\n return new RelationType(related, options)\n }\n})\n\nexport { belongsToType, hasManyType, hasOneType, Relation } from './Relation'\n","import { Relation } from './relations'\n\nexport { belongsToType, hasManyType, hasOneType } from './relations'\n/**\n * BelongsTo relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.belongsTo\n * @method\n * @param {Mapper} related The relation the target belongs to.\n * @param {Object} opts Configuration options.\n * @param {string} opts.foreignKey The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const belongsTo = function (related, opts) {\n return function (mapper) {\n Relation.belongsTo(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasMany relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasMany\n * @method\n * @param {Mapper} related The relation of which the target has many.\n * @param {Object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasMany = function (related, opts) {\n return function (mapper) {\n Relation.hasMany(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasOne relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasOne\n * @method\n * @param {Mapper} related The relation of which the target has one.\n * @param {Object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasOne = function (related, opts) {\n return function (mapper) {\n Relation.hasOne(related, opts).assignTo(mapper)\n }\n}\n","import utils, { safeSetLink } from './utils'\nimport Component from './Component'\nimport Settable from './Settable'\nimport {\n hasManyType,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Record'\n\nconst superMethod = function (mapper, name) {\n const store = mapper.datastore\n if (store && store[name]) {\n return function (...args) {\n return store[name](mapper.name, ...args)\n }\n }\n return mapper[name].bind(mapper)\n}\n\n// Cache these strings\nconst creatingPath = 'creating'\nconst noValidatePath = 'noValidate'\nconst keepChangeHistoryPath = 'keepChangeHistory'\nconst previousPath = 'previous'\n\n/**\n * js-data's Record class. An instance of `Record` corresponds to an in-memory\n * representation of a single row or document in a database, Firebase,\n * localstorage, etc. Basically, a `Record` instance represents whatever kind of\n * entity in your persistence layer that has a primary key.\n *\n * ```javascript\n * import {Record} from 'js-data'\n * ```\n *\n * @example Record#constructor\n * // Normally you would do: import {Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Instantiate a plain record\n * let record = new Record()\n * console.log('record: ' + JSON.stringify(record))\n *\n * // You can supply properties on instantiation\n * record = new Record({ name: 'John' })\n * console.log('record: ' + JSON.stringify(record))\n *\n * @example Record#constructor2\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Instantiate a record that's associated with a Mapper:\n * const UserMapper = new Mapper({ name: 'user' })\n * const User = UserMapper.recordClass\n * const user = UserMapper.createRecord({ name: 'John' })\n * const user2 = new User({ name: 'Sally' })\n * console.log('user: ' + JSON.stringify(user))\n * console.log('user2: ' + JSON.stringify(user2))\n *\n * @example Record#constructor3\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n *\n * // Instantiate a record that's associated with a store's Mapper\n * const user = store.createRecord('user', { name: 'John' })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @example Record#constructor4\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * // Validate on instantiation\n * const user = store.createRecord('user', { name: 1234 })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @example Record#constructor5\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * // Skip validation on instantiation\n * const user = store.createRecord('user', { name: 1234 }, { noValidate: true })\n * console.log('user: ' + JSON.stringify(user))\n * console.log('user.isValid(): ' + user.isValid())\n *\n * @class Record\n * @extends Component\n * @param {Object} [props] The initial properties of the new Record instance.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate=false] Whether to skip validation on the\n * initial properties.\n * @param {boolean} [opts.validateOnSet=true] Whether to enable setter\n * validation on properties after the Record has been initialized.\n * @since 3.0.0\n */\nfunction Record (props, opts) {\n utils.classCallCheck(this, Record)\n Settable.call(this)\n props || (props = {})\n opts || (opts = {})\n const _set = this._set\n const mapper = this.constructor.mapper\n\n _set(creatingPath, true)\n _set(noValidatePath, !!opts.noValidate)\n _set(keepChangeHistoryPath, opts.keepChangeHistory === undefined ? (mapper ? mapper.keepChangeHistory : true) : opts.keepChangeHistory)\n\n // Set the idAttribute value first, if it exists.\n const id = mapper ? utils.get(props, mapper.idAttribute) : undefined\n if (id !== undefined) {\n utils.set(this, mapper.idAttribute, id)\n }\n\n utils.fillIn(this, props)\n _set(creatingPath, false)\n if (opts.validateOnSet !== undefined) {\n _set(noValidatePath, !opts.validateOnSet)\n } else if (mapper && mapper.validateOnSet !== undefined) {\n _set(noValidatePath, !mapper.validateOnSet)\n } else {\n _set(noValidatePath, false)\n }\n _set(previousPath, mapper ? mapper.toJSON(props) : utils.plainCopy(props))\n}\n\nexport default Component.extend({\n constructor: Record,\n\n /**\n * Returns the {@link Mapper} paired with this record's class, if any.\n *\n * @method Record#_mapper\n * @returns {Mapper} The {@link Mapper} paired with this record's class, if any.\n * @since 3.0.0\n */\n _mapper () {\n const mapper = this.constructor.mapper\n if (!mapper) {\n throw utils.err(`${DOMAIN}#_mapper`, '')(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Lifecycle hook.\n *\n * @method Record#afterLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n afterLoadRelations () {},\n\n /**\n * Lifecycle hook.\n *\n * @method Record#beforeLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {Object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n beforeLoadRelations () {},\n\n /**\n * Return the change history of this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @method Record#changeHistory\n * @since 3.0.0\n */\n changeHistory () {\n return (this._get('history') || []).slice()\n },\n\n /**\n * Return changes to this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#changes\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user changes: ' + JSON.stringify(user.changes()))\n * user.name = 'John'\n * console.log('user changes: ' + JSON.stringify(user.changes()))\n *\n * @method Record#changes\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} Object describing the changes to this record since it was\n * instantiated or its {@link Record#commit} method was last called.\n * @since 3.0.0\n */\n changes (opts) {\n opts || (opts = {})\n return utils.diffObjects(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Make the record's current in-memory state it's only state, with any\n * previous property values being set to current values.\n *\n * @example Record#commit\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.name = 'John'\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.commit()\n * console.log('user hasChanges: ' + user.hasChanges())\n *\n * @method Record#commit\n * @param {Object} [opts] Configuration options. Passed to {@link Record#toJSON}.\n * @since 3.0.0\n */\n commit (opts) {\n this._set('changed') // unset\n this._set('history', []) // clear history\n this._set('previous', this.toJSON(opts))\n },\n\n /**\n * Call {@link Mapper#destroy} using this record's primary key.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('user')\n * store.find('user', 1234).then((user) => {\n * console.log(user.id) // 1234\n *\n * // Destroy this user from the database\n * return user.destroy()\n * })\n *\n * @method Record#destroy\n * @param {Object} [opts] Configuration options passed to {@link Mapper#destroy}.\n * @returns {Promise} The result of calling {@link Mapper#destroy} with the\n * primary key of this record.\n * @since 3.0.0\n */\n destroy (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n return superMethod(mapper, 'destroy')(utils.get(this, mapper.idAttribute), opts)\n },\n\n /**\n * Return the value at the given path for this instance.\n *\n * @example Record#get\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user', { name: 'Bob' })\n * console.log('user.get(\"name\"): ' + user.get('name'))\n *\n * @method Record#get\n * @param {string} key Path of value to retrieve.\n * @returns {*} Value at path.\n * @since 3.0.0\n */\n 'get' (key) {\n return utils.get(this, key)\n },\n\n /**\n * Return whether this record has changed since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#hasChanges\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.name = 'John'\n * console.log('user hasChanges: ' + user.hasChanges())\n * user.commit()\n * console.log('user hasChanges: ' + user.hasChanges())\n *\n * @method Record#hasChanges\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {Array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Return whether the record has changed since it was\n * instantiated or since its {@link Record#commit} method was called.\n * @since 3.0.0\n */\n hasChanges (opts) {\n const quickHasChanges = !!(this._get('changed') || []).length\n return quickHasChanges || utils.areDifferent(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Return whether the record is unsaved. Records that have primary keys are\n * considered \"saved\". Records without primary keys are considered \"unsaved\".\n *\n * @example Record#isNew\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * id: 1234\n * })\n * const user2 = store.createRecord('user')\n * console.log('user isNew: ' + user.isNew()) // false\n * console.log('user2 isNew: ' + user2.isNew()) // true\n *\n * @method Record#isNew\n * @returns {boolean} Whether the record is unsaved.\n * @since 3.0.0\n */\n isNew (opts) {\n return utils.get(this, this._mapper().idAttribute) === undefined\n },\n\n /**\n * Return whether the record in its current state passes validation.\n *\n * @example Record#isValid\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * })\n * console.log('user isValid: ' + user.isValid())\n * user.name = 'John'\n * console.log('user isValid: ' + user.isValid())\n *\n * @method Record#isValid\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {boolean} Whether the record in its current state passes\n * validation.\n * @since 3.0.0\n */\n isValid (opts) {\n return !this._mapper().validate(this, opts)\n },\n\n removeInverseRelation (currentParent, id, inverseDef, idAttribute) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n // e.g. remove comment from otherPost.comments\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n setupInverseRelation (record, id, inverseDef, idAttribute) {\n // Update (set) inverse relation\n if (inverseDef.type === hasOneType) {\n // e.g. someUser.profile = profile\n safeSetLink(record, inverseDef.localField, this)\n } else if (inverseDef.type === hasManyType) {\n // e.g. add comment to somePost.comments\n const children = utils.get(record, inverseDef.localField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n /**\n * Lazy load relations of this record, to be attached to the record once their\n * loaded.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('user', {\n * relations: {\n * hasMany: {\n * post: {\n * localField: 'posts',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * })\n * store.defineMapper('post', {\n * relations: {\n * belongsTo: {\n * user: {\n * localField: 'user',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * })\n * store.find('user', 1234).then((user) => {\n * console.log(user.id) // 1234\n *\n * // Load the user's post relations\n * return user.loadRelations(['post'])\n * }).then((user) => {\n * console.log(user.posts) // [{...}, {...}, ...]\n * })\n *\n * @method Record#loadRelations\n * @param {string[]} [relations] List of relations to load. Can use localField\n * names or Mapper names to pick relations.\n * @param {Object} [opts] Configuration options.\n * @returns {Promise} Resolves with the record, with the loaded relations now\n * attached.\n * @since 3.0.0\n */\n loadRelations (relations, opts) {\n let op\n const mapper = this._mapper()\n\n // Default values for arguments\n relations || (relations = [])\n if (utils.isString(relations)) {\n relations = [relations]\n }\n opts || (opts = {})\n opts.with = relations\n\n // Fill in \"opts\" with the Model's configuration\n utils._(opts, mapper)\n opts.adapter = mapper.getAdapterName(opts)\n\n // beforeLoadRelations lifecycle hook\n op = opts.op = 'beforeLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => {\n // Now delegate to the adapter\n op = opts.op = 'loadRelations'\n mapper.dbg(op, this, relations, opts)\n let tasks = []\n let task\n utils.forEachRelation(mapper, opts, (def, optsCopy) => {\n const relatedMapper = def.getRelation()\n optsCopy.raw = false\n if (utils.isFunction(def.load)) {\n task = def.load(mapper, def, this, opts)\n } else if (def.type === 'hasMany' || def.type === 'hasOne') {\n if (def.foreignKey) {\n task = superMethod(relatedMapper, 'findAll')({\n [def.foreignKey]: utils.get(this, mapper.idAttribute)\n }, optsCopy).then(function (relatedData) {\n if (def.type === 'hasOne') {\n return relatedData.length ? relatedData[0] : undefined\n }\n return relatedData\n })\n } else if (def.localKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [relatedMapper.idAttribute]: {\n 'in': utils.get(this, def.localKeys)\n }\n }\n })\n } else if (def.foreignKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [def.foreignKeys]: {\n 'contains': utils.get(this, mapper.idAttribute)\n }\n }\n }, opts)\n }\n } else if (def.type === 'belongsTo') {\n const key = utils.get(this, def.foreignKey)\n if (utils.isSorN(key)) {\n task = superMethod(relatedMapper, 'find')(key, optsCopy)\n }\n }\n if (task) {\n task = task.then((relatedData) => {\n def.setLocalField(this, relatedData)\n })\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(() => {\n // afterLoadRelations lifecycle hook\n op = opts.op = 'afterLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => this)\n })\n },\n\n /**\n * Return the properties with which this record was instantiated.\n *\n * @example Record#previous\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * name: 'William'\n * })\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n * user.name = 'Bob'\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n * user.commit()\n * console.log('user previous: ' + JSON.stringify(user.previous()))\n *\n * @method Record#previous\n * @param {string} [key] If specified, return just the initial value of the\n * given key.\n * @returns {Object} The initial properties of this record.\n * @since 3.0.0\n */\n previous (key) {\n if (key) {\n return this._get(`previous.${key}`)\n }\n return this._get('previous')\n },\n\n /**\n * Revert changes to this record back to the properties it had when it was\n * instantiated.\n *\n * @example Record#revert\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user', {\n * name: 'William'\n * })\n * console.log('user: ' + JSON.stringify(user))\n * user.name = 'Bob'\n * console.log('user: ' + JSON.stringify(user))\n * user.revert()\n * console.log('user: ' + JSON.stringify(user))\n *\n * @method Record#revert\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.preserve] Array of strings or Regular Expressions\n * denoting properties that should not be reverted.\n * @since 3.0.0\n */\n revert (opts) {\n const previous = this._get('previous')\n opts || (opts = {})\n opts.preserve || (opts.preserve = [])\n utils.forOwn(this, (value, key) => {\n if (key !== this._mapper().idAttribute && !previous.hasOwnProperty(key) && this.hasOwnProperty(key) && opts.preserve.indexOf(key) === -1) {\n delete this[key]\n }\n })\n utils.forOwn(previous, (value, key) => {\n if (opts.preserve.indexOf(key) === -1) {\n this[key] = value\n }\n })\n this.commit()\n },\n\n /**\n * Delegates to {@link Mapper#create} or {@link Mapper#update}.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n *\n * const store = new Container()\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('session')\n * const session = store.createRecord('session', { topic: 'Node.js' })\n *\n * // Create a new record in the database\n * session.save().then(() => {\n * console.log(session.id) // 1234\n *\n * session.skill_level = 'beginner'\n *\n * // Update the record in the database\n * return session.save()\n * })\n *\n * @method Record#save\n * @param {Object} [opts] Configuration options. See {@link Mapper#create} and\n * {@link Mapper#update}.\n * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`.\n * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @param {Array} [opts.ignore] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @returns {Promise} The result of calling {@link Mapper#create} or\n * {@link Mapper#update}.\n * @since 3.0.0\n */\n save (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n const id = utils.get(this, mapper.idAttribute)\n let props = this\n\n const postProcess = (result) => {\n const record = opts.raw ? result.data : result\n if (record) {\n utils.deepMixIn(this, record)\n this.commit()\n }\n return result\n }\n\n if (id === undefined) {\n return superMethod(mapper, 'create')(props, opts).then(postProcess)\n }\n if (opts.changesOnly) {\n const changes = this.changes(opts)\n props = {}\n utils.fillIn(props, changes.added)\n utils.fillIn(props, changes.changed)\n }\n return superMethod(mapper, 'update')(id, props, opts).then(postProcess)\n },\n\n /**\n * Set the value for a given key, or the values for the given keys if \"key\" is\n * an object. Triggers change events on those properties that have `track: true`\n * in {@link Mapper#schema}.\n *\n * @example Record#set\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user')\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.set('name', 'Bob')\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.set({ age: 30, role: 'admin' })\n * console.log('user: ' + JSON.stringify(user))\n *\n * @fires Record#change\n * @method Record#set\n * @param {(string|Object)} key Key to set or hash of key-value pairs to set.\n * @param {*} [value] Value to set for the given key.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n 'set' (key, value, opts) {\n if (utils.isObject(key)) {\n opts = value\n }\n opts || (opts = {})\n if (opts.silent) {\n this._set('silent', true)\n }\n utils.set(this, key, value)\n if (!this._get('eventId')) {\n this._set('silent') // unset\n }\n },\n\n /**\n * Return a plain object representation of this record. If the class from\n * which this record was created has a Mapper, then {@link Mapper#toJSON} will\n * be called with this record instead.\n *\n * @example Record#toJSON\n * // Normally you would do: import { Container } from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.8')\n * const { Container } = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n *\n * const user = store.createRecord('user', {\n * name: 'John',\n * $$hashKey: '1234'\n * })\n * console.log('user: ' + JSON.stringify(user.toJSON()))\n *\n * @method Record#toJSON\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation. Only available as an option if the class\n * from which this record was created has a Mapper and this record resides in\n * an instance of {@link DataStore}.\n * @returns {Object} Plain object representation of this record.\n * @since 3.0.0\n */\n toJSON (opts) {\n const mapper = this.constructor.mapper\n if (mapper) {\n return mapper.toJSON(this, opts)\n } else {\n const json = {}\n utils.forOwn(this, (prop, key) => {\n json[key] = utils.plainCopy(prop)\n })\n return json\n }\n },\n\n /**\n * Unset the value for a given key. Triggers change events on those properties\n * that have `track: true` in {@link Mapper#schema}.\n *\n * @example Record#unset\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user')\n *\n * const user = store.createRecord('user', {\n * name: 'John'\n * })\n * console.log('user: ' + JSON.stringify(user))\n *\n * user.unset('name')\n * console.log('user: ' + JSON.stringify(user))\n *\n * @method Record#unset\n * @param {string} key Key to unset.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n unset (key, opts) {\n this.set(key, undefined, opts)\n },\n\n /**\n * Validate this record based on its current properties.\n *\n * @example Record#validate\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * })\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * })\n * console.log('user validation: ' + JSON.stringify(user.validate()))\n * user.name = 'John'\n * console.log('user validation: ' + user.validate())\n *\n * @method Record#validate\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {*} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (opts) {\n return this._mapper().validate(this, opts)\n }\n}, {\n creatingPath,\n noValidatePath,\n keepChangeHistoryPath,\n previousPath\n})\n\n/**\n * Allow records to emit events.\n *\n * An record's registered listeners are stored in the record's private data.\n */\nutils.eventify(\n Record.prototype,\n function () {\n return this._get('events')\n },\n function (value) {\n this._set('events', value)\n }\n)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link Record~changeListener} on how to listen for this event.\n *\n * @event Record#change\n * @see Record~changeListener\n */\n\n/**\n * Callback signature for the {@link Record#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * record.on('change', onChange)\n *\n * @callback Record~changeListener\n * @param {Record} The Record that changed.\n * @param {Object} The changes.\n * @see Record#event:change\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Record:\n * @example Record.extend\n * // Normally you would do: import {Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomRecordClass extends Record {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customRecord = new CustomRecordClass()\n * console.log(customRecord.foo())\n * console.log(CustomRecordClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherRecordClass = Record.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherRecord = new OtherRecordClass()\n * console.log(otherRecord.foo())\n * console.log(OtherRecordClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherRecordClass () {\n * Record.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Record.extend({\n * constructor: AnotherRecordClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherRecord = new AnotherRecordClass()\n * console.log(anotherRecord.created_at)\n * console.log(anotherRecord.foo())\n * console.log(AnotherRecordClass.beep())\n *\n * @method Record.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Record class.\n * @since 3.0.0\n */\n","export function sort (a, b, hashCode) {\n // Short-circuit comparison if a and b are strictly equal\n // This is absolutely necessary for indexed objects that\n // don't have the idAttribute field\n if (a === b) {\n return 0\n }\n if (hashCode) {\n a = hashCode(a)\n b = hashCode(b)\n }\n if ((a === null && b === null) || (a === undefined && b === undefined)) {\n return -1\n }\n\n if (a === null || a === undefined) {\n return -1\n }\n\n if (b === null || b === undefined) {\n return 1\n }\n\n if (a < b) {\n return -1\n }\n\n if (a > b) {\n return 1\n }\n\n return 0\n}\n\nexport function insertAt (array, index, value) {\n array.splice(index, 0, value)\n return array\n}\n\nexport function removeAt (array, index) {\n array.splice(index, 1)\n return array\n}\n\nexport function binarySearch (array, value, field) {\n let lo = 0\n let hi = array.length\n let compared\n let mid\n\n while (lo < hi) {\n mid = ((lo + hi) / 2) | 0\n compared = sort(value, array[mid], field)\n if (compared === 0) {\n return {\n found: true,\n index: mid\n }\n } else if (compared < 0) {\n hi = mid\n } else {\n lo = mid + 1\n }\n }\n\n return {\n found: false,\n index: hi\n }\n}\n","// Copyright (c) 2015, InternalFX.\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose with or\n// without fee is hereby granted, provided that the above copyright notice and this permission\n// notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO\n// THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT\n// SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR\n// ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE\n// USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// Modifications\n// Copyright 2015-2016 Jason Dobry\n//\n// Summary of modifications:\n// Reworked dependencies so as to re-use code already in js-data\n// Removed unused code\nimport utils from '../../src/utils'\nimport {binarySearch, insertAt, removeAt} from './_utils'\n\nexport default function Index (fieldList, opts) {\n utils.classCallCheck(this, Index)\n fieldList || (fieldList = [])\n\n if (!utils.isArray(fieldList)) {\n throw new Error('fieldList must be an array.')\n }\n\n opts || (opts = {})\n this.fieldList = fieldList\n this.fieldGetter = opts.fieldGetter\n this.hashCode = opts.hashCode\n this.isIndex = true\n this.keys = []\n this.values = []\n}\n\nutils.addHiddenPropsToTarget(Index.prototype, {\n 'set' (keyList, value) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n let dataLocation = binarySearch(this.values[pos.index], value, this.hashCode)\n if (!dataLocation.found) {\n insertAt(this.values[pos.index], dataLocation.index, value)\n }\n } else {\n insertAt(this.keys, pos.index, key)\n insertAt(this.values, pos.index, [value])\n }\n } else {\n if (pos.found) {\n this.values[pos.index].set(keyList, value)\n } else {\n insertAt(this.keys, pos.index, key)\n let newIndex = new Index([], { hashCode: this.hashCode })\n newIndex.set(keyList, value)\n insertAt(this.values, pos.index, newIndex)\n }\n }\n },\n\n 'get' (keyList) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n if (this.values[pos.index].isIndex) {\n return this.values[pos.index].getAll()\n } else {\n return this.values[pos.index].slice()\n }\n } else {\n return []\n }\n } else {\n if (pos.found) {\n return this.values[pos.index].get(keyList)\n } else {\n return []\n }\n }\n },\n\n getAll (opts) {\n opts || (opts = {})\n let results = []\n const values = this.values\n if (opts.order === 'desc') {\n for (let i = values.length - 1; i >= 0; i--) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n } else {\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n }\n return results\n },\n\n visitAll (cb, thisArg) {\n this.values.forEach(function (value) {\n if (value.isIndex) {\n value.visitAll(cb, thisArg)\n } else {\n value.forEach(cb, thisArg)\n }\n })\n },\n\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (!utils.isArray(leftKeys)) {\n leftKeys = [leftKeys]\n }\n if (!utils.isArray(rightKeys)) {\n rightKeys = [rightKeys]\n }\n utils.fillIn(opts, {\n leftInclusive: true,\n rightInclusive: false,\n limit: undefined,\n offset: 0\n })\n\n let results = this._between(leftKeys, rightKeys, opts)\n\n if (opts.limit) {\n return results.slice(opts.offset, opts.limit + opts.offset)\n } else {\n return results.slice(opts.offset)\n }\n },\n\n _between (leftKeys, rightKeys, opts) {\n let results = []\n\n let leftKey = leftKeys.shift()\n let rightKey = rightKeys.shift()\n\n let pos\n\n if (leftKey !== undefined) {\n pos = binarySearch(this.keys, leftKey)\n } else {\n pos = {\n found: false,\n index: 0\n }\n }\n\n if (leftKeys.length === 0) {\n if (pos.found && opts.leftInclusive === false) {\n pos.index += 1\n }\n\n for (let i = pos.index; i < this.keys.length; i += 1) {\n if (rightKey !== undefined) {\n if (opts.rightInclusive) {\n if (this.keys[i] > rightKey) { break }\n } else {\n if (this.keys[i] >= rightKey) { break }\n }\n }\n\n if (this.values[i].isIndex) {\n results = results.concat(this.values[i].getAll())\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n } else {\n for (let i = pos.index; i < this.keys.length; i += 1) {\n let currKey = this.keys[i]\n if (currKey > rightKey) { break }\n\n if (this.values[i].isIndex) {\n if (currKey === leftKey) {\n results = results.concat(this.values[i]._between(utils.copy(leftKeys), rightKeys.map(function () { return undefined }), opts))\n } else if (currKey === rightKey) {\n results = results.concat(this.values[i]._between(leftKeys.map(function () { return undefined }), utils.copy(rightKeys), opts))\n } else {\n results = results.concat(this.values[i].getAll())\n }\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n }\n\n if (opts.limit) {\n return results.slice(0, opts.limit + opts.offset)\n } else {\n return results\n }\n },\n\n peek () {\n if (this.values.length) {\n if (this.values[0].isIndex) {\n return this.values[0].peek()\n } else {\n return this.values[0]\n }\n }\n return []\n },\n\n clear () {\n this.keys = []\n this.values = []\n },\n\n insertRecord (data) {\n let keyList = this.fieldList.map(function (field) {\n if (utils.isFunction(field)) {\n return field(data) || undefined\n } else {\n return data[field] || undefined\n }\n })\n this.set(keyList, data)\n },\n\n removeRecord (data) {\n let removed\n const isUnique = this.hashCode(data) !== undefined\n this.values.forEach((value, i) => {\n if (value.isIndex) {\n if (value.removeRecord(data)) {\n if (value.keys.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n } else {\n let dataLocation = {}\n if (this.keys[i] === undefined || !isUnique) {\n for (let j = value.length - 1; j >= 0; j--) {\n if (value[j] === data) {\n dataLocation = {\n found: true,\n index: j\n }\n break\n }\n }\n } else if (isUnique) {\n dataLocation = binarySearch(value, data, this.hashCode)\n }\n if (dataLocation.found) {\n removeAt(value, dataLocation.index)\n if (value.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n }\n })\n return removed ? data : undefined\n },\n\n updateRecord (data) {\n const removed = this.removeRecord(data)\n if (removed !== undefined) {\n this.insertRecord(data)\n }\n }\n})\n","import utils from './utils'\nimport Component from './Component'\nimport Query from './Query'\nimport Record from './Record'\nimport Index from '../lib/mindex/index'\n\nconst { noValidatePath } = Record\n\nconst DOMAIN = 'Collection'\n\nconst COLLECTION_DEFAULTS = {\n /**\n * Whether to call {@link Record#commit} on records that are added to the\n * collection and already exist in the collection.\n *\n * @name Collection#commitOnMerge\n * @type {boolean}\n * @default true\n */\n commitOnMerge: true,\n\n /**\n * Whether record events should bubble up and be emitted by the collection.\n *\n * @name Collection#emitRecordEvents\n * @type {boolean}\n * @default true\n */\n emitRecordEvents: true,\n\n /**\n * Field to be used as the unique identifier for records in this collection.\n * Defaults to `\"id\"` unless {@link Collection#mapper} is set, in which case\n * this will default to {@link Mapper#idAttribute}.\n *\n * @name Collection#idAttribute\n * @type {string}\n * @default \"id\"\n */\n idAttribute: 'id',\n\n /**\n * What to do when inserting a record into this Collection that shares a\n * primary key with a record already in this Collection.\n *\n * Possible values:\n * merge\n * replace\n * skip\n *\n * Merge:\n *\n * Recursively shallow copy properties from the new record onto the existing\n * record.\n *\n * Replace:\n *\n * Shallow copy top-level properties from the new record onto the existing\n * record. Any top-level own properties of the existing record that are _not_\n * on the new record will be removed.\n *\n * Skip:\n *\n * Ignore new record, keep existing record.\n *\n * @name Collection#onConflict\n * @type {string}\n * @default \"merge\"\n */\n onConflict: 'merge'\n}\n\n/**\n * An ordered set of {@link Record} instances.\n *\n * @example Collection#constructor\n * // import {Collection, Record} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, Record} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const user1 = new Record({ id: 1 })\n * const user2 = new Record({ id: 2 })\n * const UserCollection = new Collection([user1, user2])\n * console.log(UserCollection.get(1) === user1)\n *\n * @class Collection\n * @extends Component\n * @param {Array} [records] Initial set of records to insert into the\n * collection.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}.\n * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}.\n * @param {string} [opts.onConflict=\"merge\"] See {@link Collection#onConflict}.\n * @param {string} [opts.mapper] See {@link Collection#mapper}.\n * @since 3.0.0\n */\nfunction Collection (records, opts) {\n utils.classCallCheck(this, Collection)\n Component.call(this, opts)\n\n if (records && !utils.isArray(records)) {\n opts = records\n records = []\n }\n if (utils.isString(opts)) {\n opts = { idAttribute: opts }\n }\n\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * Default Mapper for this collection. Optional. If a Mapper is provided, then\n * the collection will use the {@link Mapper#idAttribute} setting, and will\n * wrap records in {@link Mapper#recordClass}.\n *\n * @example Collection#mapper\n * // Normally you would do: import {Collection, Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection, Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const myMapper = new MyMapperClass({ name: 'myMapper' })\n * const collection = new Collection(null, { mapper: myMapper })\n *\n * @name Collection#mapper\n * @type {Mapper}\n * @default null\n * @since 3.0.0\n */\n mapper: {\n value: undefined,\n writable: true\n },\n // Query class used by this collection\n queryClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(COLLECTION_DEFAULTS))\n\n if (!this.queryClass) {\n this.queryClass = Query\n }\n\n const idAttribute = this.recordId()\n\n Object.defineProperties(this, {\n /**\n * The main index, which uses @{link Collection#recordId} as the key.\n *\n * @name Collection#index\n * @type {Index}\n */\n index: {\n value: new Index([idAttribute], {\n hashCode (obj) {\n return utils.get(obj, idAttribute)\n }\n })\n },\n\n /**\n * Object that holds the secondary indexes of this collection.\n *\n * @name Collection#indexes\n * @type {Object.}\n */\n indexes: {\n value: {}\n }\n })\n\n // Insert initial data into the collection\n if (utils.isObject(records) || (utils.isArray(records) && records.length)) {\n this.add(records)\n }\n}\n\nexport default Component.extend({\n constructor: Collection,\n\n /**\n * Used to bind to events emitted by records in this Collection.\n *\n * @method Collection#_onRecordEvent\n * @since 3.0.0\n * @private\n * @param {...*} [arg] Args passed to {@link Collection#emit}.\n */\n _onRecordEvent (...args) {\n if (this.emitRecordEvents) {\n this.emit(...args)\n }\n },\n\n /**\n * Insert the provided record or records.\n *\n * If a record is already in the collection then the provided record will\n * either merge with or replace the existing record based on the value of the\n * `onConflict` option.\n *\n * The collection's secondary indexes will be updated as each record is\n * visited.\n *\n * @method Collection#add\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} data The record or records to insert.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}.\n * @param {boolean} [opts.noValidate] See {@link Record#noValidate}.\n * @param {string} [opts.onConflict] See {@link Collection#onConflict}.\n * @returns {(Object|Object[]|Record|Record[])} The added record or records.\n */\n add (records, opts) {\n // Default values for arguments\n opts || (opts = {})\n\n // Fill in \"opts\" with the Collection's configuration\n utils._(opts, this)\n records = this.beforeAdd(records, opts) || records\n\n // Track whether just one record or an array of records is being inserted\n let singular = false\n const idAttribute = this.recordId()\n if (!utils.isArray(records)) {\n if (utils.isObject(records)) {\n records = [records]\n singular = true\n } else {\n throw utils.err(`${DOMAIN}#add`, 'records')(400, 'object or array', records)\n }\n }\n\n // Map the provided records to existing records.\n // New records will be inserted. If any records map to existing records,\n // they will be merged into the existing records according to the onConflict\n // option.\n records = records.map((record) => {\n let id = this.recordId(record)\n // Grab existing record if there is one\n const existing = id === undefined ? id : this.get(id)\n // If the currently visited record is just a reference to an existing\n // record, then there is nothing to be done. Exit early.\n if (record === existing) {\n return existing\n }\n\n if (existing) {\n // Here, the currently visited record corresponds to a record already\n // in the collection, so we need to merge them\n const onConflict = opts.onConflict || this.onConflict\n if (onConflict !== 'merge' && onConflict !== 'replace' && onConflict !== 'skip') {\n throw utils.err(`${DOMAIN}#add`, 'opts.onConflict')(400, 'one of (merge, replace, skip)', onConflict, true)\n }\n const existingNoValidate = existing._get(noValidatePath)\n if (opts.noValidate) {\n // Disable validation\n existing._set(noValidatePath, true)\n }\n if (onConflict === 'merge') {\n utils.deepMixIn(existing, record)\n } else if (onConflict === 'replace') {\n utils.forOwn(existing, (value, key) => {\n if (key !== idAttribute && record[key] === undefined) {\n existing[key] = undefined\n }\n })\n existing.set(record)\n } // else if(onConflict === 'skip'){ do nothing }\n\n if (opts.noValidate) {\n // Restore previous `noValidate` value\n existing._set(noValidatePath, existingNoValidate)\n }\n record = existing\n if (opts.commitOnMerge && utils.isFunction(record.commit)) {\n record.commit()\n }\n // Update all indexes in the collection\n this.updateIndexes(record)\n } else {\n // Here, the currently visted record does not correspond to any record\n // in the collection, so (optionally) instantiate this record and insert\n // it into the collection\n record = this.mapper ? this.mapper.createRecord(record, opts) : record\n this.index.insertRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.insertRecord(record)\n })\n if (record && utils.isFunction(record.on)) {\n record.on('all', this._onRecordEvent, this)\n }\n }\n return record\n })\n // Finally, return the inserted data\n const result = singular ? records[0] : records\n if (!opts.silent) {\n this.emit('add', result)\n }\n return this.afterAdd(records, opts, result) || result\n },\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then {@link Collection#add} will return that same value.\n *\n * @method Collection#method\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} result The record or records\n * that were added to this Collection by {@link Collection#add}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#add}.\n */\n afterAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}. If this method returns\n * a value then {@link Collection#remove} will return that same value.\n *\n * @method Collection#afterRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#remove}.\n * @param {Object} record The result that will be returned by {@link Collection#remove}.\n */\n afterRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}. If this method\n * returns a value then {@link Collection#removeAll} will return that same\n * value.\n *\n * @method Collection#afterRemoveAll\n * @since 3.0.0\n * @param {Object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}.\n * @param {Object} records The result that will be returned by {@link Collection#removeAll}.\n */\n afterRemoveAll () {},\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then the `records` argument in {@link Collection#add} will be\n * re-assigned to the returned value.\n *\n * @method Collection#beforeAdd\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#add}.\n */\n beforeAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}.\n *\n * @method Collection#beforeRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#remove}.\n */\n beforeRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}.\n *\n * @method Collection#beforeRemoveAll\n * @since 3.0.0\n * @param {Object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {Object} opts The `opts` argument passed to {@link Collection#removeAll}.\n */\n beforeRemoveAll () {},\n\n /**\n * Find all records between two boundaries.\n *\n * Shortcut for `collection.query().between(18, 30, { index: 'age' }).run()`\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = collection.between(18, 30, { index: 'age' })\n *\n * @example\n * // Same as above\n * const users = collection.between([18], [30], { index: 'age' })\n *\n * @method Collection#between\n * @since 3.0.0\n * @param {Array} leftKeys Keys defining the left boundary.\n * @param {Array} rightKeys Keys defining the right boundary.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting records to skip.\n * @returns {Object[]|Record[]} The result.\n */\n between (leftKeys, rightKeys, opts) {\n return this.query().between(leftKeys, rightKeys, opts).run()\n },\n\n /**\n * Create a new secondary index on the contents of the collection.\n *\n * @example\n * // Index users by age\n * collection.createIndex('age')\n *\n * @example\n * // Index users by status and role\n * collection.createIndex('statusAndRole', ['status', 'role'])\n *\n * @method Collection#createIndex\n * @since 3.0.0\n * @param {string} name The name of the new secondary index.\n * @param {string[]} [fieldList] Array of field names to use as the key or\n * compound key of the new secondary index. If no fieldList is provided, then\n * the name will also be the field that is used to index the collection.\n */\n createIndex (name, fieldList, opts) {\n if (utils.isString(name) && fieldList === undefined) {\n fieldList = [name]\n }\n opts || (opts = {})\n opts.hashCode || (opts.hashCode = (obj) => this.recordId(obj))\n const index = this.indexes[name] = new Index(fieldList, opts)\n this.index.visitAll(index.insertRecord, index)\n },\n\n /**\n * Find the record or records that match the provided query or pass the\n * provided filter function.\n *\n * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()`\n *\n * @example Collection#filter\n * // Normally you would do: import {Collection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const collection = new Collection([\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * // Get the draft posts created less than three months ago\n * let posts = collection.filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * })\n * console.log(posts)\n *\n * // Use a custom filter function\n * posts = collection.filter(function (post) {\n * return post.id % 2 === 0\n * })\n *\n * @method Collection#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Object} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Array} The result.\n * @see query\n * @since 3.0.0\n */\n filter (query, thisArg) {\n return this.query().filter(query, thisArg).run()\n },\n\n /**\n * Iterate over all records.\n *\n * @example\n * collection.forEach(function (record) {\n * // do something\n * })\n *\n * @method Collection#forEach\n * @since 3.0.0\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Array} The result.\n */\n forEach (cb, thisArg) {\n this.index.visitAll(cb, thisArg)\n },\n\n /**\n * Get the record with the given id.\n *\n * @method Collection#get\n * @since 3.0.0\n * @param {(string|number)} id The primary key of the record to get.\n * @returns {(Object|Record)} The record with the given id.\n */\n get (id) {\n const instances = id === undefined ? [] : this.query().get(id).run()\n return instances.length ? instances[0] : undefined\n },\n\n /**\n * Find the record or records that match the provided keyLists.\n *\n * Shortcut for `collection.query().getAll(keyList1, keyList2, ...).run()`\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = collection.getAll('draft', 'inReview', { index: 'status' })\n *\n * @example\n * // Same as above\n * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' })\n *\n * @method Collection#getAll\n * @since 3.0.0\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * records matching each keyList will be retrieved. If no keyLists are\n * provided, all records will be returned.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Array} The result.\n */\n getAll (...args) {\n return this.query().getAll(...args).run()\n },\n\n /**\n * Return the index with the given name. If no name is provided, return the\n * main index. Throws an error if the specified index does not exist.\n *\n * @method Collection#getIndex\n * @since 3.0.0\n * @param {string} [name] The name of the index to retrieve.\n */\n getIndex (name) {\n const index = name ? this.indexes[name] : this.index\n if (!index) {\n throw utils.err(`${DOMAIN}#getIndex`, name)(404, 'index')\n }\n return index\n },\n\n /**\n * Limit the result.\n *\n * Shortcut for `collection.query().limit(maximumNumber).run()`\n *\n * @example\n * const posts = collection.limit(10)\n *\n * @method Collection#limit\n * @since 3.0.0\n * @param {number} num The maximum number of records to keep in the result.\n * @returns {Array} The result.\n */\n limit (num) {\n return this.query().limit(num).run()\n },\n\n /**\n * Apply a mapping function to all records.\n *\n * @example\n * const names = collection.map(function (user) {\n * return user.name\n * })\n *\n * @method Collection#map\n * @since 3.0.0\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Array} The result of the mapping.\n */\n map (cb, thisArg) {\n const data = []\n this.index.visitAll(function (value) {\n data.push(cb.call(thisArg, value))\n })\n return data\n },\n\n /**\n * Return the result of calling the specified function on each record in this\n * collection's main index.\n *\n * @method Collection#mapCall\n * @since 3.0.0\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Array} The result.\n */\n mapCall (funcName, ...args) {\n const data = []\n this.index.visitAll(function (record) {\n data.push(record[funcName](...args))\n })\n return data\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#prune\n * @param {Object} [opts] Configuration options, passed to {@link Collection#removeAll}.\n * @since 3.0.0\n * @returns {Array} The removed records, if any.\n */\n prune (opts) {\n return this.removeAll(this.unsaved(), opts)\n },\n\n /**\n * Create a new query to be executed against the contents of the collection.\n * The result will be all or a subset of the contents of the collection.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * collection.query()\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run()\n *\n * @method Collection#query\n * @since 3.0.0\n * @returns {Query} New query object.\n */\n query () {\n const Ctor = this.queryClass\n return new Ctor(this)\n },\n\n /**\n * Return the primary key of the given, or if no record is provided, return the\n * name of the field that holds the primary key of records in this Collection.\n *\n * @method Collection#recordId\n * @since 3.0.0\n * @param {(Object|Record)} [record] The record whose primary key is to be\n * returned.\n * @returns {(string|number)} Primary key or name of field that holds primary\n * key.\n */\n recordId (record) {\n if (record) {\n return utils.get(record, this.recordId())\n }\n return this.mapper ? this.mapper.idAttribute : this.idAttribute\n },\n\n /**\n * Reduce the data in the collection to a single value and return the result.\n *\n * @example\n * const totalVotes = collection.reduce(function (prev, record) {\n * return prev + record.upVotes + record.downVotes\n * }, 0)\n *\n * @method Collection#reduce\n * @since 3.0.0\n * @param {Function} cb Reduction callback.\n * @param {*} initialValue Initial value of the reduction.\n * @returns {*} The result.\n */\n reduce (cb, initialValue) {\n const data = this.getAll()\n return data.reduce(cb, initialValue)\n },\n\n /**\n * Remove the record with the given id from this Collection.\n *\n * @method Collection#remove\n * @since 3.0.0\n * @param {(string|number|object|Record)} idOrRecord The primary key of the\n * record to be removed, or a reference to the record that is to be removed.\n * @param {Object} [opts] Configuration options.\n * @returns {Object|Record} The removed record, if any.\n */\n remove (idOrRecord, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemove(idOrRecord, opts)\n let record = utils.isSorN(idOrRecord) ? this.get(idOrRecord) : idOrRecord\n\n // The record is in the collection, remove it\n if (utils.isObject(record)) {\n record = this.index.removeRecord(record)\n if (record) {\n utils.forOwn(this.indexes, function (index, name) {\n index.removeRecord(record)\n })\n if (utils.isFunction(record.off)) {\n record.off('all', this._onRecordEvent, this)\n if (!opts.silent) {\n this.emit('remove', record)\n }\n }\n }\n }\n return this.afterRemove(idOrRecord, opts, record) || record\n },\n\n /**\n * Remove from this collection the given records or the records selected by\n * the given \"query\".\n *\n * @method Collection#removeAll\n * @since 3.0.0\n * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}.\n * @param {Object} [queryOrRecords.where] See {@link query.where}.\n * @param {number} [queryOrRecords.offset] See {@link query.offset}.\n * @param {number} [queryOrRecords.limit] See {@link query.limit}.\n * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options.\n * @returns {(Object[]|Record[])} The removed records, if any.\n */\n removeAll (queryOrRecords, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemoveAll(queryOrRecords, opts)\n let records = utils.isArray(queryOrRecords) ? queryOrRecords.slice() : this.filter(queryOrRecords)\n\n // Remove each selected record from the collection\n const optsCopy = utils.plainCopy(opts)\n optsCopy.silent = true\n records = records\n .map((record) => this.remove(record, optsCopy))\n .filter((record) => record)\n if (!opts.silent) {\n this.emit('remove', records)\n }\n return this.afterRemoveAll(queryOrRecords, opts, records) || records\n },\n\n /**\n * Skip a number of results.\n *\n * Shortcut for `collection.query().skip(numberToSkip).run()`\n *\n * @example\n * const posts = collection.skip(10)\n *\n * @method Collection#skip\n * @since 3.0.0\n * @param {number} num The number of records to skip.\n * @returns {Array} The result.\n */\n skip (num) {\n return this.query().skip(num).run()\n },\n\n /**\n * Return the plain JSON representation of all items in this collection.\n * Assumes records in this collection have a toJSON method.\n *\n * @method Collection#toJSON\n * @since 3.0.0\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation.\n * @returns {Array} The records.\n */\n toJSON (opts) {\n return this.mapCall('toJSON', opts)\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#unsaved\n * @since 3.0.0\n * @returns {Array} The unsaved records, if any.\n */\n unsaved (opts) {\n return this.index.get()\n },\n\n /**\n * Update a record's position in a single index of this collection. See\n * {@link Collection#updateIndexes} to update a record's position in all\n * indexes at once.\n *\n * @method Collection#updateIndex\n * @since 3.0.0\n * @param {Object} record The record to update.\n * @param {Object} [opts] Configuration options.\n * @param {string} [opts.index] The index in which to update the record's\n * position. If you don't specify an index then the record will be updated\n * in the main index.\n */\n updateIndex (record, opts) {\n opts || (opts = {})\n this.getIndex(opts.index).updateRecord(record)\n },\n\n /**\n * Updates all indexes in this collection for the provided record. Has no\n * effect if the record is not in the collection.\n *\n * @method Collection#updateIndexes\n * @since 3.0.0\n * @param {Object} record TODO\n */\n updateIndexes (record) {\n this.index.updateRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.updateRecord(record)\n })\n }\n})\n\n/**\n * Fired when a record changes. Only works for records that have tracked changes.\n * See {@link Collection~changeListener} on how to listen for this event.\n *\n * @event Collection#change\n * @see Collection~changeListener\n */\n\n/**\n * Callback signature for the {@link Collection#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * collection.on('change', onChange)\n *\n * @callback Collection~changeListener\n * @param {Record} The Record that changed.\n * @param {Object} The changes.\n * @see Collection#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the Collection. See\n * {@link Collection~addListener} on how to listen for this event.\n *\n * @event Collection#add\n * @see Collection~addListener\n * @see Collection#event:add\n * @see Collection#add\n */\n\n/**\n * Callback signature for the {@link Collection#event:add} event.\n *\n * @example\n * function onAdd (recordOrRecords) {\n * // do something\n * }\n * collection.on('add', onAdd)\n *\n * @callback Collection~addListener\n * @param {Record|Record[]} The Record or Records that were added.\n * @see Collection#event:add\n * @see Collection#add\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the Collection. See\n * {@link Collection~removeListener} for how to listen for this event.\n *\n * @event Collection#remove\n * @see Collection~removeListener\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n */\n\n/**\n * Callback signature for the {@link Collection#event:remove} event.\n *\n * @example\n * function onRemove (recordsOrRecords) {\n * // do something\n * }\n * collection.on('remove', onRemove)\n *\n * @callback Collection~removeListener\n * @param {Record|Record[]} Record or Records that were removed.\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Collection:\n * @example Collection.extend\n * // Normally you would do: import {Collection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Collection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomCollectionClass extends Collection {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customCollection = new CustomCollectionClass()\n * console.log(customCollection.foo())\n * console.log(CustomCollectionClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherCollectionClass = Collection.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherCollection = new OtherCollectionClass()\n * console.log(otherCollection.foo())\n * console.log(OtherCollectionClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherCollectionClass () {\n * Collection.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Collection.extend({\n * constructor: AnotherCollectionClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherCollection = new AnotherCollectionClass()\n * console.log(anotherCollection.created_at)\n * console.log(anotherCollection.foo())\n * console.log(AnotherCollectionClass.beep())\n *\n * @method Collection.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Collection class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Schema'\n\n/**\n * A function map for each of the seven primitive JSON types defined by the core specification.\n * Each function will check a given value and return true or false if the value is an instance of that type.\n * ```\n * types.integer(1) // returns true\n * types.string({}) // returns false\n * ```\n * http://json-schema.org/latest/json-schema-core.html#anchor8\n * @name Schema.types\n * @type {object}\n */\nconst types = {\n array: utils.isArray,\n boolean: utils.isBoolean,\n integer: utils.isInteger,\n 'null': utils.isNull,\n number: utils.isNumber,\n object: utils.isObject,\n string: utils.isString\n}\n\n/**\n * @ignore\n */\nconst segmentToString = function (segment, prev) {\n let str = ''\n if (segment) {\n if (utils.isNumber(segment)) {\n str += `[${segment}]`\n } else if (prev) {\n str += `.${segment}`\n } else {\n str += `${segment}`\n }\n }\n return str\n}\n\n/**\n * @ignore\n */\nconst makePath = function (opts) {\n opts || (opts = {})\n let path = ''\n const segments = opts.path || []\n segments.forEach(function (segment) {\n path += segmentToString(segment, path)\n })\n path += segmentToString(opts.prop, path)\n return path\n}\n\n/**\n * @ignore\n */\nconst makeError = function (actual, expected, opts) {\n return {\n expected,\n actual: '' + actual,\n path: makePath(opts)\n }\n}\n\n/**\n * @ignore\n */\nconst addError = function (actual, expected, opts, errors) {\n errors.push(makeError(actual, expected, opts))\n}\n\n/**\n * @ignore\n */\nconst maxLengthCommon = function (keyword, value, schema, opts) {\n const max = schema[keyword]\n if (value.length > max) {\n return makeError(value.length, `length no more than ${max}`, opts)\n }\n}\n\n/**\n * @ignore\n */\nconst minLengthCommon = function (keyword, value, schema, opts) {\n const min = schema[keyword]\n if (value.length < min) {\n return makeError(value.length, `length no less than ${min}`, opts)\n }\n}\n\n/**\n * A map of all object member validation functions for each keyword defined in the JSON Schema.\n * @name Schema.validationKeywords\n * @type {object}\n */\nconst validationKeywords = {\n /**\n * Validates the provided value against all schemas defined in the Schemas `allOf` keyword.\n * The instance is valid against if and only if it is valid against all the schemas declared in the Schema's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be a valid JSON Schema.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor82\n *\n * @name Schema.validationKeywords.allOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `allOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n allOf (value, schema, opts) {\n let allErrors = []\n schema.allOf.forEach(function (_schema) {\n allErrors = allErrors.concat(validate(value, _schema, opts) || [])\n })\n return allErrors.length ? allErrors : undefined\n },\n\n /**\n * Validates the provided value against all schemas defined in the Schemas `anyOf` keyword.\n * The instance is valid against this keyword if and only if it is valid against\n * at least one of the schemas in this keyword's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be an object, and each object MUST be a valid JSON Schema.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor85\n *\n * @name Schema.validationKeywords.anyOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `anyOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n anyOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.anyOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * http://json-schema.org/latest/json-schema-validation.html#anchor70\n *\n * @name Schema.validationKeywords.dependencies\n * @method\n * @param {*} value TODO\n * @param {object} schema TODO\n * @param {object} opts TODO\n */\n dependencies (value, schema, opts) {\n // TODO\n },\n\n /**\n * Validates the provided value against an array of possible values defined by the Schema's `enum` keyword\n * Validation succeeds if the value is deeply equal to one of the values in the array.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor76\n *\n * @name Schema.validationKeywords.enum\n * @method\n * @param {*} value Value to validate\n * @param {object} schema Schema containing the `enum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n enum (value, schema, opts) {\n const possibleValues = schema['enum']\n if (utils.findIndex(possibleValues, (item) => utils.deepEqual(item, value)) === -1) {\n return makeError(value, `one of (${possibleValues.join(', ')})`, opts)\n }\n },\n\n /**\n * Validates each of the provided array values against a schema or an array of schemas defined by the Schema's `items` keyword\n * see http://json-schema.org/latest/json-schema-validation.html#anchor37 for validation rules.\n *\n * @name Schema.validationKeywords.items\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the items keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n items (value, schema, opts) {\n opts || (opts = {})\n // TODO: additionalItems\n let items = schema.items\n let errors = []\n const checkingTuple = utils.isArray(items)\n const length = value.length\n for (var prop = 0; prop < length; prop++) {\n if (checkingTuple) {\n // Validating a tuple, instead of just checking each item against the\n // same schema\n items = schema.items[prop]\n }\n opts.prop = prop\n errors = errors.concat(validate(value[prop], items, opts) || [])\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided number against a maximum value defined by the Schema's `maximum` keyword\n * Validation succeeds if the value is a number, and is less than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor17\n *\n * @name Schema.validationKeywords.maximum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `maximum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maximum (value, schema, opts) {\n // Must be a number\n const maximum = schema.maximum\n // Must be a boolean\n // Depends on maximum\n // default: false\n const exclusiveMaximum = schema.exclusiveMaximum\n if (typeof value === typeof maximum && !(exclusiveMaximum ? maximum > value : maximum >= value)) {\n return exclusiveMaximum\n ? makeError(value, `no more than nor equal to ${maximum}`, opts)\n : makeError(value, `no more than ${maximum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a maximum value defined by the Schema's `maxItems` keyword.\n * Validation succeeds if the length of the array is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor42\n *\n * @name Schema.validationKeywords.maxItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `maxItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return maxLengthCommon('maxItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a maximum value defined in the Schema's `maxLength` keyword.\n * Validation succeeds if the length of the string is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor26\n *\n * @name Schema.validationKeywords.maxLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `maxLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxLength (value, schema, opts) {\n return maxLengthCommon('maxLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a maximum value defined in the Schema's `maxProperties` keyword.\n * Validation succeeds if the object's property count is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor54\n *\n * @name Schema.validationKeywords.maxProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `maxProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const maxProperties = schema.maxProperties\n const length = Object.keys(value).length\n if (length > maxProperties) {\n return makeError(length, `no more than ${maxProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided value against a minimum value defined by the Schema's `minimum` keyword\n * Validation succeeds if the value is a number and is greater than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor21\n *\n * @name Schema.validationKeywords.minimum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `minimum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minimum (value, schema, opts) {\n // Must be a number\n const minimum = schema.minimum\n // Must be a boolean\n // Depends on minimum\n // default: false\n const exclusiveMinimum = schema.exclusiveMinimum\n if (typeof value === typeof minimum && !(exclusiveMinimum ? value > minimum : value >= minimum)) {\n return exclusiveMinimum\n ? makeError(value, `no less than nor equal to ${minimum}`, opts)\n : makeError(value, `no less than ${minimum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a minimum value defined by the Schema's `minItems` keyword.\n * Validation succeeds if the length of the array is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor45\n *\n * @name Schema.validationKeywords.minItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `minItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return minLengthCommon('minItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a minimum value defined in the Schema's `minLength` keyword.\n * Validation succeeds if the length of the string is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor29\n *\n * @name Schema.validationKeywords.minLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `minLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minLength (value, schema, opts) {\n return minLengthCommon('minLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a minimum value defined in the Schema's `minProperties` keyword.\n * Validation succeeds if the object's property count is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor57\n *\n * @name Schema.validationKeywords.minProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `minProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const minProperties = schema.minProperties\n const length = Object.keys(value).length\n if (length < minProperties) {\n return makeError(length, `no more than ${minProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided number is a multiple of the number defined in the Schema's `multipleOf` keyword.\n * Validation succeeds if the number can be divided equally into the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor14\n *\n * @name Schema.validationKeywords.multipleOf\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing the `multipleOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n multipleOf (value, schema, opts) {\n const multipleOf = schema.multipleOf\n if (utils.isNumber(value)) {\n if ((value / multipleOf) % 1 !== 0) {\n return makeError(value, `multipleOf ${multipleOf}`, opts)\n }\n }\n },\n\n /**\n * Validates the provided value is not valid with any of the schemas defined in the Schema's `not` keyword.\n * An instance is valid against this keyword if and only if it is NOT valid against the schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor91\n * @name Schema.validationKeywords.not\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the not keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n not (value, schema, opts) {\n if (!validate(value, schema.not, opts)) {\n // TODO: better messaging\n return makeError('succeeded', 'should have failed', opts)\n }\n },\n\n /**\n * Validates the provided value is valid with one and only one of the schemas defined in the Schema's `oneOf` keyword.\n * An instance is valid against this keyword if and only if it is valid against a single schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor88\n * @name Schema.validationKeywords.oneOf\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the `oneOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n oneOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.oneOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else if (validated) {\n allErrors = [makeError('valid against more than one', 'valid against only one', opts)]\n validated = false\n return false\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * Validates the provided string matches a pattern defined in the Schema's `pattern` keyword.\n * Validation succeeds if the string is a match of the regex value of this keyword.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor33\n * @name Schema.validationKeywords.pattern\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `pattern` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n pattern (value, schema, opts) {\n const pattern = schema.pattern\n if (utils.isString(value) && !value.match(pattern)) {\n return makeError(value, pattern, opts)\n }\n },\n\n /**\n * Validates the provided object's properties against a map of values defined in the Schema's `properties` keyword.\n * Validation succeeds if the object's property are valid with each of the schema's in the provided map.\n * Validation also depends on the additionalProperties and or patternProperties.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor64 for more info.\n *\n * @name Schema.validationKeywords.properties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `properties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n properties (value, schema, opts) {\n opts || (opts = {})\n\n if (utils.isArray(value)) {\n return\n }\n\n // Can be a boolean or an object\n // Technically the default is an \"empty schema\", but here \"true\" is\n // functionally the same\n const additionalProperties = schema.additionalProperties === undefined ? true : schema.additionalProperties\n const validated = []\n // \"p\": The property set from \"properties\".\n // Default is an object\n const properties = schema.properties || {}\n // \"pp\": The property set from \"patternProperties\".\n // Default is an object\n const patternProperties = schema.patternProperties || {}\n let errors = []\n\n utils.forOwn(properties, function (_schema, prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n })\n\n const toValidate = utils.omit(value, validated)\n utils.forOwn(patternProperties, function (_schema, pattern) {\n utils.forOwn(toValidate, function (undef, prop) {\n if (prop.match(pattern)) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n }\n })\n })\n const keys = Object.keys(utils.omit(value, validated))\n // If \"s\" is not empty, validation fails\n if (additionalProperties === false) {\n if (keys.length) {\n const origProp = opts.prop\n opts.prop = ''\n addError(`extra fields: ${keys.join(', ')}`, 'no extra fields', opts, errors)\n opts.prop = origProp\n }\n } else if (utils.isObject(additionalProperties)) {\n // Otherwise, validate according to provided schema\n keys.forEach(function (prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], additionalProperties, opts) || [])\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided object's has all properties listed in the Schema's `properties` keyword array.\n * Validation succeeds if the object contains all properties provided in the array value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor61\n *\n * @name Schema.validationKeywords.required\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `required` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n required (value, schema, opts) {\n opts || (opts = {})\n const required = schema.required\n let errors = []\n if (!opts.existingOnly) {\n required.forEach(function (prop) {\n if (utils.get(value, prop) === undefined) {\n const prevProp = opts.prop\n opts.prop = prop\n addError(undefined, 'a value', opts, errors)\n opts.prop = prevProp\n }\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided value's type is equal to the type, or array of types, defined in the Schema's `type` keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor79\n *\n * @name Schema.validationKeywords.type\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `type` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n type (value, schema, opts) {\n let type = schema.type\n let validType\n // Can be one of several types\n if (utils.isString(type)) {\n type = [type]\n }\n // Try to match the value against an expected type\n type.forEach(function (_type) {\n // TODO: throw an error if type is not defined\n if (types[_type](value, schema, opts)) {\n // Matched a type\n validType = _type\n return false\n }\n })\n // Value did not match any expected type\n if (!validType) {\n return makeError(value !== undefined && value !== null ? typeof value : '' + value, `one of (${type.join(', ')})`, opts)\n }\n // Run keyword validators for matched type\n // http://json-schema.org/latest/json-schema-validation.html#anchor12\n const validator = typeGroupValidators[validType]\n if (validator) {\n return validator(value, schema, opts)\n }\n },\n\n /**\n * Validates the provided array values are unique.\n * Validation succeeds if the items in the array are unique, but only if the value of this keyword is true\n * see http://json-schema.org/latest/json-schema-validation.html#anchor49\n *\n * @name Schema.validationKeywords.uniqueItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `uniqueItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n uniqueItems (value, schema, opts) {\n if (value && value.length && schema.uniqueItems) {\n const length = value.length\n let item, i, j\n // Check n - 1 items\n for (i = length - 1; i > 0; i--) {\n item = value[i]\n // Only compare against unchecked items\n for (j = i - 1; j >= 0; j--) {\n // Found a duplicate\n if (utils.deepEqual(item, value[j])) {\n return makeError(item, 'no duplicates', opts)\n }\n }\n }\n }\n }\n}\n\n/**\n * @ignore\n */\nconst runOps = function (ops, value, schema, opts) {\n let errors = []\n ops.forEach(function (op) {\n if (schema[op] !== undefined) {\n errors = errors.concat(validationKeywords[op](value, schema, opts) || [])\n }\n })\n return errors.length ? errors : undefined\n}\n\n/**\n * Validation keywords validated for any type:\n *\n * - `enum`\n * - `type`\n * - `allOf`\n * - `anyOf`\n * - `oneOf`\n * - `not`\n *\n * @name Schema.ANY_OPS\n * @type {string[]}\n */\nconst ANY_OPS = ['enum', 'type', 'allOf', 'anyOf', 'oneOf', 'not']\n\n/**\n * Validation keywords validated for array types:\n *\n * - `items`\n * - `maxItems`\n * - `minItems`\n * - `uniqueItems`\n *\n * @name Schema.ARRAY_OPS\n * @type {string[]}\n */\nconst ARRAY_OPS = ['items', 'maxItems', 'minItems', 'uniqueItems']\n\n/**\n * Validation keywords validated for numeric (number and integer) types:\n *\n * - `multipleOf`\n * - `maximum`\n * - `minimum`\n *\n * @name Schema.NUMERIC_OPS\n * @type {string[]}\n */\nconst NUMERIC_OPS = ['multipleOf', 'maximum', 'minimum']\n\n/**\n * Validation keywords validated for object types:\n *\n * - `maxProperties`\n * - `minProperties`\n * - `required`\n * - `properties`\n * - `dependencies`\n *\n * @name Schema.OBJECT_OPS\n * @type {string[]}\n */\nconst OBJECT_OPS = ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n\n/**\n * Validation keywords validated for string types:\n *\n * - `maxLength`\n * - `minLength`\n * - `pattern`\n *\n * @name Schema.STRING_OPS\n * @type {string[]}\n */\nconst STRING_OPS = ['maxLength', 'minLength', 'pattern']\n\n/**\n * http://json-schema.org/latest/json-schema-validation.html#anchor75\n * @ignore\n */\nconst validateAny = function (value, schema, opts) {\n return runOps(ANY_OPS, value, schema, opts)\n}\n\n/**\n * Validates the provided value against a given Schema according to the http://json-schema.org/ v4 specification.\n *\n * @name Schema.validate\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Valid Schema according to the http://json-schema.org/ v4 specification.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\nconst validate = function (value, schema, opts) {\n let errors = []\n opts || (opts = {})\n opts.ctx || (opts.ctx = { value, schema })\n let shouldPop\n let prevProp = opts.prop\n if (schema === undefined) {\n return\n }\n if (!utils.isObject(schema)) {\n throw utils.err(`${DOMAIN}#validate`)(500, `Invalid schema at path: \"${opts.path}\"`)\n }\n if (opts.path === undefined) {\n opts.path = []\n }\n // Track our location as we recurse\n if (opts.prop !== undefined) {\n shouldPop = true\n opts.path.push(opts.prop)\n opts.prop = undefined\n }\n // Validate against parent schema\n if (schema['extends']) {\n // opts.path = path\n // opts.prop = prop\n if (utils.isFunction(schema['extends'].validate)) {\n errors = errors.concat(schema['extends'].validate(value, opts) || [])\n } else {\n errors = errors.concat(validate(value, schema['extends'], opts) || [])\n }\n }\n if (value === undefined) {\n // Check if property is required\n if (schema.required === true && !opts.existingOnly) {\n addError(value, 'a value', opts, errors)\n }\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n }\n\n errors = errors.concat(validateAny(value, schema, opts) || [])\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n}\n\n// These strings are cached for optimal performance of the change detection\n// boolean - Whether a Record is changing in the current execution frame\nconst changingPath = 'changing'\n// string[] - Properties that have changed in the current execution frame\nconst changedPath = 'changed'\n// Object[] - History of change records\nconst changeHistoryPath = 'history'\n// boolean - Whether a Record is currently being instantiated\nconst creatingPath = 'creating'\n// number - The setTimeout change event id of a Record, if any\nconst eventIdPath = 'eventId'\n// boolean - Whether to skip validation for a Record's currently changing property\nconst noValidatePath = 'noValidate'\n// boolean - Whether to preserve Change History for a Record\nconst keepChangeHistoryPath = 'keepChangeHistory'\n// boolean - Whether to skip change notification for a Record's currently\n// changing property\nconst silentPath = 'silent'\nconst validationFailureMsg = 'validation failed'\n\n/**\n * A map of validation functions grouped by type.\n *\n * @name Schema.typeGroupValidators\n * @type {object}\n */\nconst typeGroupValidators = {\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an array.\n * The validation keywords for the type `array` are:\n *```\n * ['items', 'maxItems', 'minItems', 'uniqueItems']\n *```\n * see http://json-schema.org/latest/json-schema-validation.html#anchor25\n *\n * @name Schema.typeGroupValidators.array\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing at least one array keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n array: function (value, schema, opts) {\n return runOps(ARRAY_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an integer.\n * The validation keywords for the type `integer` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.integer\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `integer` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n integer: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an number.\n * The validation keywords for the type `number` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.number\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `number` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n number: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of a number or integer.\n * The validation keywords for the type `numeric` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor13.\n *\n * @name Schema.typeGroupValidators.numeric\n * @method\n * @param {*} value Number to be validated.\n * @param {Object} schema Schema containing at least one `numeric` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n numeric: function (value, schema, opts) {\n return runOps(NUMERIC_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an object.\n * The validation keywords for the type `object` are:\n *```\n * ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor53.\n *\n * @name Schema.typeGroupValidators.object\n * @method\n * @param {*} value Object to be validated.\n * @param {Object} schema Schema containing at least one `object` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n object: function (value, schema, opts) {\n return runOps(OBJECT_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an string.\n * The validation keywords for the type `string` are:\n *```\n * ['maxLength', 'minLength', 'pattern']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor25.\n *\n * @name Schema.typeGroupValidators.string\n * @method\n * @param {*} value String to be validated.\n * @param {Object} schema Schema containing at least one `string` keyword.\n * @param {Object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n string: function (value, schema, opts) {\n return runOps(STRING_OPS, value, schema, opts)\n }\n}\n\n/**\n * js-data's Schema class.\n *\n * @example Schema#constructor\n * // Normally you would do: import {Schema} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Schema} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const PostSchema = new Schema({\n * type: 'object',\n * properties: {\n * title: { type: 'string' }\n * }\n * })\n * PostSchema.validate({ title: 1234 })\n *\n * @class Schema\n * @extends Component\n * @param {object} definition Schema definition according to json-schema.org\n */\nfunction Schema (definition) {\n definition || (definition = {})\n // TODO: schema validation\n utils.fillIn(this, definition)\n\n if (this.type === 'object') {\n this.properties = this.properties || {}\n utils.forOwn(this.properties, (_definition, prop) => {\n if (!(_definition instanceof Schema)) {\n this.properties[prop] = new Schema(_definition)\n }\n })\n } else if (this.type === 'array' && this.items && !(this.items instanceof Schema)) {\n this.items = new Schema(this.items)\n }\n if (this.extends && !(this.extends instanceof Schema)) {\n this.extends = new Schema(this.extends)\n }\n ['allOf', 'anyOf', 'oneOf'].forEach((validationKeyword) => {\n if (this[validationKeyword]) {\n this[validationKeyword].forEach((_definition, i) => {\n if (!(_definition instanceof Schema)) {\n this[validationKeyword][i] = new Schema(_definition)\n }\n })\n }\n })\n}\n\nexport default Component.extend({\n constructor: Schema,\n\n /**\n * This adds ES5 getters/setters to the target based on the \"properties\" in\n * this Schema, which makes possible change tracking and validation on\n * property assignment.\n *\n * @name Schema#apply\n * @method\n * @param {object} target The prototype to which to apply this schema.\n */\n apply (target, opts) {\n opts || (opts = {})\n opts.getter || (opts.getter = '_get')\n opts.setter || (opts.setter = '_set')\n opts.unsetter || (opts.unsetter = '_unset')\n opts.track || (opts.track = this.track)\n const properties = this.properties || {}\n utils.forOwn(properties, (schema, prop) => {\n Object.defineProperty(\n target,\n prop,\n this.makeDescriptor(prop, schema, opts)\n )\n })\n },\n\n /**\n * Apply default values to the target object for missing values.\n *\n * @name Schema#applyDefaults\n * @method\n * @param {object} target The target to which to apply values for missing values.\n */\n applyDefaults (target) {\n if (!target) {\n return\n }\n const properties = this.properties || {}\n const hasSet = utils.isFunction(target.set) || utils.isFunction(target._set)\n utils.forOwn(properties, function (schema, prop) {\n if (schema.hasOwnProperty('default') && utils.get(target, prop) === undefined) {\n if (hasSet) {\n target.set(prop, utils.plainCopy(schema['default']), { silent: true })\n } else {\n utils.set(target, prop, utils.plainCopy(schema['default']))\n }\n }\n if (schema.type === 'object' && schema.properties) {\n if (hasSet) {\n const orig = target._get('noValidate')\n target._set('noValidate', true)\n utils.set(target, prop, utils.get(target, prop) || {}, { silent: true })\n target._set('noValidate', orig)\n } else {\n utils.set(target, prop, utils.get(target, prop) || {})\n }\n schema.applyDefaults(utils.get(target, prop))\n }\n })\n },\n\n /**\n * Assemble a property descriptor for tracking and validating changes to\n * a property according to the given schema. This method is called when\n * {@link Mapper#applySchema} is set to `true`.\n *\n * @name Schema#makeDescriptor\n * @method\n * @param {string} prop The property name.\n * @param {(Schema|object)} schema The schema for the property.\n * @param {object} [opts] Optional configuration.\n * @param {function} [opts.getter] Custom getter function.\n * @param {function} [opts.setter] Custom setter function.\n * @param {function} [opts.track] Whether to track changes.\n * @returns {object} A property descriptor for the given schema.\n */\n makeDescriptor (prop, schema, opts) {\n const descriptor = {\n // Better to allow configurability, but at the user's own risk\n configurable: true,\n // These properties are enumerable by default, but regardless of their\n // enumerability, they won't be \"own\" properties of individual records\n enumerable: schema.enumerable === undefined ? true : !!schema.enumerable\n }\n // Cache a few strings for optimal performance\n const keyPath = `props.${prop}`\n const previousPath = `previous.${prop}`\n const getter = opts.getter\n const setter = opts.setter\n const unsetter = opts.unsetter\n const track = utils.isBoolean(opts.track) ? opts.track : schema.track\n\n descriptor.get = function () {\n return this._get(keyPath)\n }\n\n if (utils.isFunction(schema.get)) {\n const originalGet = descriptor.get\n descriptor.get = function () {\n return schema.get.call(this, originalGet)\n }\n }\n\n descriptor.set = function (value) {\n // These are accessed a lot\n const _get = this[getter]\n const _set = this[setter]\n const _unset = this[unsetter]\n // Optionally check that the new value passes validation\n if (!_get(noValidatePath)) {\n const errors = schema.validate(value, { path: [prop] })\n if (errors) {\n // Immediately throw an error, preventing the record from getting into\n // an invalid state\n const error = new Error(validationFailureMsg)\n error.errors = errors\n throw error\n }\n }\n // TODO: Make it so tracking can be turned on for all properties instead of\n // only per-property\n if (track && !_get(creatingPath)) {\n // previous is versioned on database commit\n // props are versioned on set()\n const previous = _get(previousPath)\n const current = _get(keyPath)\n let changing = _get(changingPath)\n let changed = _get(changedPath)\n\n if (!changing) {\n // Track properties that are changing in the current event loop\n changed = []\n }\n\n // Add changing properties to this array once at most\n const index = changed.indexOf(prop)\n if (current !== value && index === -1) {\n changed.push(prop)\n }\n if (previous === value) {\n if (index >= 0) {\n changed.splice(index, 1)\n }\n }\n // No changes in current event loop\n if (!changed.length) {\n changing = false\n _unset(changingPath)\n _unset(changedPath)\n // Cancel pending change event\n if (_get(eventIdPath)) {\n clearTimeout(_get(eventIdPath))\n _unset(eventIdPath)\n }\n }\n // Changes detected in current event loop\n if (!changing && changed.length) {\n _set(changedPath, changed)\n _set(changingPath, true)\n // Saving the timeout id allows us to batch all changes in the same\n // event loop into a single \"change\"\n // TODO: Optimize\n _set(eventIdPath, setTimeout(() => {\n // Previous event loop where changes were gathered has ended, so\n // notify any listeners of those changes and prepare for any new\n // changes\n _unset(changedPath)\n _unset(eventIdPath)\n _unset(changingPath)\n // TODO: Optimize\n if (!_get(silentPath)) {\n let i\n for (i = 0; i < changed.length; i++) {\n this.emit('change:' + changed[i], this, utils.get(this, changed[i]))\n }\n\n const changes = utils.diffObjects({ [prop]: value }, { [prop]: current })\n\n if (_get(keepChangeHistoryPath)) {\n const changeRecord = utils.plainCopy(changes)\n changeRecord.timestamp = new Date().getTime()\n let changeHistory = _get(changeHistoryPath)\n !changeHistory && _set(changeHistoryPath, (changeHistory = []))\n changeHistory.push(changeRecord)\n }\n this.emit('change', this, changes)\n }\n _unset(silentPath)\n }, 0))\n }\n }\n _set(keyPath, value)\n return value\n }\n\n if (utils.isFunction(schema.set)) {\n const originalSet = descriptor.set\n descriptor.set = function (value) {\n return schema.set.call(this, value, originalSet)\n }\n }\n\n return descriptor\n },\n\n /**\n * Create a copy of the given value that contains only the properties defined\n * in this schema.\n *\n * @name Schema#pick\n * @method\n * @param {*} value The value to copy.\n * @returns {*} The copy.\n */\n pick (value) {\n if (value === undefined) {\n return\n }\n if (this.type === 'object') {\n let copy = {}\n const properties = this.properties\n if (properties) {\n utils.forOwn(properties, (_definition, prop) => {\n copy[prop] = _definition.pick(value[prop])\n })\n }\n if (this.extends) {\n utils.fillIn(copy, this.extends.pick(value))\n }\n // Conditionally copy properties not defined in \"properties\"\n if (this.additionalProperties) {\n for (var key in value) {\n if (!properties[key]) {\n copy[key] = utils.plainCopy(value[key])\n }\n }\n }\n return copy\n } else if (this.type === 'array') {\n return value.map((item) => {\n const _copy = this.items ? this.items.pick(item) : {}\n if (this.extends) {\n utils.fillIn(_copy, this.extends.pick(item))\n }\n return _copy\n })\n }\n return utils.plainCopy(value)\n },\n\n /**\n * Validate the provided value against this schema.\n *\n * @name Schema#validate\n * @method\n * @param {*} value Value to validate.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n validate (value, opts) {\n return validate(value, this, opts)\n }\n}, {\n ANY_OPS,\n ARRAY_OPS,\n NUMERIC_OPS,\n OBJECT_OPS,\n STRING_OPS,\n typeGroupValidators,\n types,\n validate,\n validationKeywords\n})\n\n/**\n * Create a subclass of this Schema:\n * @example Schema.extend\n * // Normally you would do: import {Schema} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Schema} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSchemaClass extends Schema {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSchema = new CustomSchemaClass()\n * console.log(customSchema.foo())\n * console.log(CustomSchemaClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSchemaClass = Schema.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSchema = new OtherSchemaClass()\n * console.log(otherSchema.foo())\n * console.log(OtherSchemaClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSchemaClass () {\n * Schema.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Schema.extend({\n * constructor: AnotherSchemaClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSchema = new AnotherSchemaClass()\n * console.log(anotherSchema.created_at)\n * console.log(anotherSchema.foo())\n * console.log(AnotherSchemaClass.beep())\n *\n * @method Schema.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Schema class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Record from './Record'\nimport Schema from './Schema'\nimport { Relation } from './relations'\nimport {\n belongsTo,\n belongsToType,\n hasMany,\n hasManyType,\n hasOne,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Mapper'\nconst applyDefaultsHooks = [\n 'beforeCreate',\n 'beforeCreateMany'\n]\nconst validatingHooks = [\n 'beforeCreate',\n 'beforeCreateMany',\n 'beforeUpdate',\n 'beforeUpdateAll',\n 'beforeUpdateMany'\n]\nconst makeNotify = function (num) {\n return function (...args) {\n const opts = args[args.length - num]\n const op = opts.op\n this.dbg(op, ...args)\n\n if (applyDefaultsHooks.indexOf(op) !== -1 && opts.applyDefaults !== false) {\n const schema = this.getSchema()\n if (schema && schema.applyDefaults) {\n let toProcess = args[0]\n if (!utils.isArray(toProcess)) {\n toProcess = [toProcess]\n }\n toProcess.forEach((record) => {\n schema.applyDefaults(record)\n })\n }\n }\n\n // Automatic validation\n if (validatingHooks.indexOf(op) !== -1 && !opts.noValidate) {\n // Save current value of option\n const originalExistingOnly = opts.existingOnly\n\n // For updates, ignore required fields if they aren't present\n if (op.indexOf('beforeUpdate') === 0 && opts.existingOnly === undefined) {\n opts.existingOnly = true\n }\n const errors = this.validate(args[op === 'beforeUpdate' ? 1 : 0], utils.pick(opts, ['existingOnly']))\n\n // Restore option\n opts.existingOnly = originalExistingOnly\n\n // Abort lifecycle due to validation errors\n if (errors) {\n const err = new Error('validation failed')\n err.errors = errors\n return utils.reject(err)\n }\n }\n\n // Emit lifecycle event\n if (opts.notify || (opts.notify === undefined && this.notify)) {\n setTimeout(() => {\n this.emit(op, ...args)\n })\n }\n }\n}\n\n// These are the default implementations of all of the lifecycle hooks\nconst notify = makeNotify(1)\nconst notify2 = makeNotify(2)\n\n// This object provides meta information used by Mapper#crud to actually\n// execute each lifecycle method\nconst LIFECYCLE_METHODS = {\n count: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroy: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroyAll: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n find: {\n defaults: [undefined, {}],\n types: []\n },\n findAll: {\n defaults: [{}, {}],\n types: []\n },\n sum: {\n defaults: [undefined, {}, {}],\n skip: true,\n types: []\n },\n update: {\n adapterArgs (mapper, id, props, opts) {\n return [id, mapper.toJSON(props, opts), opts]\n },\n beforeAssign: 1,\n defaults: [undefined, {}, {}],\n types: []\n },\n updateAll: {\n adapterArgs (mapper, props, query, opts) {\n return [mapper.toJSON(props, opts), query, opts]\n },\n beforeAssign: 0,\n defaults: [{}, {}, {}],\n types: []\n },\n updateMany: {\n adapterArgs (mapper, records, opts) {\n return [records.map((record) => mapper.toJSON(record, opts)), opts]\n },\n beforeAssign: 0,\n defaults: [[], {}],\n types: []\n }\n}\n\nconst MAPPER_DEFAULTS = {\n /**\n * Hash of registered adapters. Don't modify directly. Use\n * {@link Mapper#registerAdapter} instead.\n *\n * @default {}\n * @name Mapper#_adapters\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n _adapters: {},\n\n /**\n * Whether {@link Mapper#beforeCreate} and {@link Mapper#beforeCreateMany}\n * should automatically receive default values according to the Mapper's schema.\n *\n * @default true\n * @name Mapper#applyDefaults\n * @since 3.0.0\n * @type {boolean}\n */\n applyDefaults: true,\n\n /**\n * Whether to augment {@link Mapper#recordClass} with ES5 getters and setters\n * according to the properties defined in {@link Mapper#schema}. This makes\n * possible validation and change tracking on individual properties\n * when using the dot (e.g. `user.name = \"Bob\"`) operator to modify a\n * property, and is `true` by default.\n *\n * @default true\n * @name Mapper#applySchema\n * @since 3.0.0\n * @type {boolean}\n */\n applySchema: true,\n\n /**\n * The name of the registered adapter that this Mapper should used by default.\n *\n * @default \"http\"\n * @name Mapper#defaultAdapter\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n * @type {string}\n */\n defaultAdapter: 'http',\n\n /**\n * The field used as the unique identifier on records handled by this Mapper.\n *\n * @default id\n * @name Mapper#idAttribute\n * @since 3.0.0\n * @type {string}\n */\n idAttribute: 'id',\n\n /**\n * Whether records created from this mapper keep changeHistory on property changes.\n *\n * @default true\n * @name Mapper#keepChangeHistory\n * @since 3.0.0\n * @type {boolean}\n */\n keepChangeHistory: true,\n\n /**\n * Whether this Mapper should emit operational events.\n *\n * @default true\n * @name Mapper#notify\n * @since 3.0.0\n * @type {boolean}\n */\n notify: true,\n\n /**\n * Whether to skip validation when the Record instances are created.\n *\n * @default false\n * @name Mapper#noValidate\n * @since 3.0.0\n * @type {boolean}\n */\n noValidate: false,\n\n /**\n * Whether {@link Mapper#create}, {@link Mapper#createMany},\n * {@link Mapper#update}, {@link Mapper#updateAll}, {@link Mapper#updateMany},\n * {@link Mapper#find}, {@link Mapper#findAll}, {@link Mapper#destroy},\n * {@link Mapper#destroyAll}, {@link Mapper#count}, and {@link Mapper#sum}\n * should return a raw result object that contains both the instance data\n * returned by the adapter _and_ metadata about the operation.\n *\n * The default is to NOT return the result object, and instead return just the\n * instance data.\n *\n * @default false\n * @name Mapper#raw\n * @since 3.0.0\n * @type {boolean}\n */\n raw: false,\n\n /**\n * Whether records created from this mapper automatically validate their properties\n * when their properties are modified.\n *\n * @default true\n * @name Mapper#validateOnSet\n * @since 3.0.0\n * @type {boolean}\n */\n validateOnSet: true\n}\n\n/**\n * The core of JSData's [ORM/ODM][orm] implementation. Given a minimum amout of\n * meta information about a resource, a Mapper can perform generic CRUD\n * operations against that resource. Apart from its configuration, a Mapper is\n * stateless. The particulars of various persistence layers have been abstracted\n * into adapters, which a Mapper uses to perform its operations.\n *\n * The term \"Mapper\" comes from the [Data Mapper Pattern][pattern] described in\n * Martin Fowler's [Patterns of Enterprise Application Architecture][book]. A\n * Data Mapper moves data between [in-memory object instances][record] and a\n * relational or document-based database. JSData's Mapper can work with any\n * persistence layer you can write an adapter for.\n *\n * _(\"Model\" is a heavily overloaded term and is avoided in this documentation\n * to prevent confusion.)_\n *\n * [orm]: https://en.wikipedia.org/wiki/Object-relational_mapping\n *\n * @example\n * [pattern]: https://en.wikipedia.org/wiki/Data_mapper_pattern\n * [book]: http://martinfowler.com/books/eaa.html\n * [record]: Record.html\n * // Import and instantiate\n * import {Mapper} from 'js-data'\n * const UserMapper = new Mapper({ name: 'user' })\n *\n * @example\n * // Define a Mapper using the Container component\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n *\n * @class Mapper\n * @extends Component\n * @param {Object} opts Configuration options.\n * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}.\n * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}.\n * @param {Object} [opts.methods] See {@link Mapper#methods}.\n * @param {string} opts.name See {@link Mapper#name}.\n * @param {boolean} [opts.notify] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw=false] See {@link Mapper#raw}.\n * @param {Function|boolean} [opts.recordClass] See {@link Mapper#recordClass}.\n * @param {Object|Schema} [opts.schema] See {@link Mapper#schema}.\n * @returns {Mapper} A new {@link Mapper} instance.\n * @see http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n */\nfunction Mapper (opts) {\n utils.classCallCheck(this, Mapper)\n Component.call(this)\n opts || (opts = {})\n\n // Prepare certain properties to be non-enumerable\n Object.defineProperties(this, {\n _adapters: {\n value: undefined,\n writable: true\n },\n\n /**\n * The {@link Container} that holds this Mapper. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n datastore: {\n value: undefined,\n writable: true\n },\n\n /**\n * The meta information describing this Mapper's available lifecycle\n * methods. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n lifecycleMethods: {\n value: LIFECYCLE_METHODS\n },\n\n /**\n * Set to `false` to force the Mapper to work with POJO objects only.\n *\n * @example\n * // Use POJOs only.\n * import {Mapper, Record} from 'js-data'\n * const UserMapper = new Mapper({ recordClass: false })\n * UserMapper.recordClass // false\n * const user = UserMapper#createRecord()\n * user instanceof Record // false\n *\n * @example\n * // Set to a custom class to have records wrapped in your custom class.\n * import {Mapper, Record} from 'js-data'\n * // Custom class\n * class User {\n * constructor (props = {}) {\n * for (var key in props) {\n * if (props.hasOwnProperty(key)) {\n * this[key] = props[key]\n * }\n * }\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User })\n * UserMapper.recordClass // function User() {}\n * const user = UserMapper#createRecord()\n * user instanceof Record // false\n * user instanceof User // true\n *\n *\n * @example\n * // Extend the {@link Record} class.\n * import {Mapper, Record} from 'js-data'\n * // Custom class\n * class User extends Record {\n * constructor () {\n * super(props)\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User })\n * UserMapper.recordClass // function User() {}\n * const user = UserMapper#createRecord()\n * user instanceof Record // true\n * user instanceof User // true\n *\n * @name Mapper#recordClass\n * @default {@link Record}\n * @see Record\n * @since 3.0.0\n */\n recordClass: {\n value: undefined,\n writable: true\n },\n\n /**\n * This Mapper's {@link Schema}.\n *\n * @example Mapper#schema\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const UserMapper = new Mapper({\n * name: 'user',\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * first: { type: 'string', track: true },\n * last: { type: 'string', track: true },\n * role: { type: 'string', track: true, required: true },\n * age: { type: 'integer', track: true },\n * is_active: { type: 'number' }\n * }\n * }\n * })\n * const user = UserMapper.createRecord({\n * id: 1,\n * name: 'John',\n * role: 'admin'\n * })\n * user.on('change', function (user, changes) {\n * console.log(changes)\n * })\n * user.on('change:role', function (user, value) {\n * console.log('change:role - ' + value)\n * })\n * user.role = 'owner'\n *\n * @name Mapper#schema\n * @see Schema\n * @since 3.0.0\n * @type {Schema}\n */\n schema: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(MAPPER_DEFAULTS))\n\n /**\n * The name for this Mapper. This is the minimum amount of meta information\n * required for a Mapper to be able to execute CRUD operations for a\n * Resource.\n *\n * @name Mapper#name\n * @since 3.0.0\n * @type {string}\n */\n if (!this.name) {\n throw utils.err(`new ${DOMAIN}`, 'opts.name')(400, 'string', this.name)\n }\n\n // Setup schema, with an empty default schema if necessary\n if (this.schema) {\n this.schema.type || (this.schema.type = 'object')\n if (!(this.schema instanceof Schema)) {\n this.schema = new Schema(this.schema || { type: 'object' })\n }\n }\n\n // Create a subclass of Record that's tied to this Mapper\n if (this.recordClass === undefined) {\n const superClass = Record\n this.recordClass = superClass.extend({\n constructor: (function Record () {\n var subClass = function Record (props, opts) {\n utils.classCallCheck(this, subClass)\n superClass.call(this, props, opts)\n }\n return subClass\n })()\n })\n }\n\n if (this.recordClass) {\n this.recordClass.mapper = this\n\n /**\n * Functions that should be added to the prototype of {@link Mapper#recordClass}.\n *\n * @name Mapper#methods\n * @since 3.0.0\n * @type {Object}\n */\n if (utils.isObject(this.methods)) {\n utils.addHiddenPropsToTarget(this.recordClass.prototype, this.methods)\n }\n\n // We can only apply the schema to the prototype of this.recordClass if the\n // class extends Record\n if (Record.prototype.isPrototypeOf(Object.create(this.recordClass.prototype)) && this.schema && this.schema.apply && this.applySchema) {\n this.schema.apply(this.recordClass.prototype)\n }\n }\n}\n\nexport default Component.extend({\n constructor: Mapper,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCount\n * @param {Object} query The `query` argument passed to {@link Mapper#count}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#count}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCount: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreate\n * @param {Object} props The `props` argument passed to {@link Mapper#create}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#create}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroy: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroyAll\n * @param {*} data The `data` returned by the adapter.\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroyAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#find}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFind: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFindAll\n * @param {Object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFindAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterSum\n * @param {Object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterSum: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#update}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateAll\n * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreate\n * @param {Object} props The `props` argument passed to {@link Mapper#create}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#create}.\n * @since 3.0.0\n */\n beforeCreate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @since 3.0.0\n */\n beforeCreateMany: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCount\n * @param {Object} query The `query` argument passed to {@link Mapper#count}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#count}.\n * @since 3.0.0\n */\n beforeCount: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @since 3.0.0\n */\n beforeDestroy: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroyAll\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @since 3.0.0\n */\n beforeDestroyAll: notify,\n\n /**\n * Mappers lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#find}.\n * @since 3.0.0\n */\n beforeFind: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFindAll\n * @param {Object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @since 3.0.0\n */\n beforeFindAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeSum\n * @param {string} field The `field` argument passed to {@link Mapper#sum}.\n * @param {Object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @since 3.0.0\n */\n beforeSum: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#update}.\n * @since 3.0.0\n */\n beforeUpdate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateAll\n * @param {Object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {Object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @since 3.0.0\n */\n beforeUpdateAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateMany\n * @param {Array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @since 3.0.0\n */\n beforeUpdateMany: notify,\n\n /**\n * This method is called at the end of most lifecycle methods. It does the\n * following:\n *\n * 1. If `opts.raw` is `true`, add this Mapper's configuration to the `opts`\n * argument as metadata for the operation.\n * 2. Wrap the result data appropriately using {@link Mapper#wrap}, which\n * calls {@link Mapper#createRecord}.\n *\n * @method Mapper#_end\n * @private\n * @since 3.0.0\n */\n _end (result, opts, skip) {\n if (opts.raw) {\n utils._(result, opts)\n }\n if (skip) {\n return result\n }\n let _data = opts.raw ? result.data : result\n if (_data && utils.isFunction(this.wrap)) {\n _data = this.wrap(_data, opts)\n if (opts.raw) {\n result.data = _data\n } else {\n result = _data\n }\n }\n return result\n },\n\n /**\n * Define a belongsTo relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * PostMapper.belongsTo(UserMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to post records at \"post.user\"\n * localField: 'user'\n * })\n *\n * CommentMapper.belongsTo(UserMapper, {\n * // comment.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to comment records at \"comment.user\"\n * localField: 'user'\n * })\n * CommentMapper.belongsTo(PostMapper, {\n * // comment.post_id points to post.id\n * foreignKey: 'post_id'\n * // post records will be attached to comment records at \"comment.post\"\n * localField: 'post'\n * })\n *\n * @method Mapper#belongsTo\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n belongsTo (relatedMapper, opts) {\n return belongsTo(relatedMapper, opts)(this)\n },\n\n /**\n * Select records according to the `query` argument and return the count.\n *\n * {@link Mapper#beforeCount} will be called before calling the adapter.\n * {@link Mapper#afterCount} will be called after calling the adapter.\n *\n * @example\n * // Get the number of published blog posts\n * PostMapper.count({ status: 'published' }).then((numPublished) => {\n * console.log(numPublished) // e.g. 45\n * })\n *\n * @method Mapper#count\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `count` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the count of the selected records.\n * @since 3.0.0\n */\n count (query, opts) {\n return this.crud('count', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~beforeCreateListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreate\n * @see Mapper~beforeCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback Mapper~beforeCreateListener\n * @param {Object} props The `props` argument passed to {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeCreate}.\n * @see Mapper#event:beforeCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~afterCreateListener} for how to listen for this event.\n *\n * @event Mapper#afterCreate\n * @see Mapper~afterCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback Mapper~afterCreateListener\n * @param {Object} props The `props` argument passed to {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterCreate}.\n * @see Mapper#event:afterCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Create and save a new the record using the provided `props`.\n *\n * {@link Mapper#beforeCreate} will be called before calling the adapter.\n * {@link Mapper#afterCreate} will be called after calling the adapter.\n *\n * @example\n * // Create and save a new blog post\n * PostMapper.create({\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'draft', ... }\n * })\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#create\n * @param {Object} props The properties for the new record.\n * @param {Object} [opts] Configuration options. Refer to the `create` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `props` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#create}\n * or {@link Mapper#createMany} call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created record.\n * @since 3.0.0\n */\n create (props, opts) {\n // Default values for arguments\n props || (props = {})\n opts || (opts = {})\n const originalRecord = props\n let parentRelationMap = {}\n let adapterResponse = {}\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n opts.op = 'beforeCreate'\n return this._runHook(opts.op, props, opts).then((props) => {\n opts.with || (opts.with = [])\n return this._createParentRecordIfRequired(props, opts)\n }).then((relationMap) => {\n parentRelationMap = relationMap\n }).then(() => {\n opts.op = 'create'\n return this._invokeAdapterMethod(opts.op, props, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdProps = opts.raw ? adapterResponse.data : adapterResponse\n\n return this._createOrAssignChildRecordIfRequired(createdProps, {\n opts,\n parentRelationMap,\n originalProps: props\n })\n }).then((createdProps) => {\n return this._commitChanges(originalRecord, createdProps)\n }).then((record) => {\n if (opts.raw) {\n adapterResponse.data = record\n } else {\n adapterResponse = record\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreate'\n return this._runHook(opts.op, props, opts, result)\n })\n },\n\n _commitChanges (recordOrRecords, newValues) {\n if (utils.isArray(recordOrRecords)) {\n return recordOrRecords.map((record, i) => this._commitChanges(record, newValues[i]))\n }\n\n utils.set(recordOrRecords, newValues, { silent: true })\n\n if (utils.isFunction(recordOrRecords.commit)) {\n recordOrRecords.commit()\n }\n\n return recordOrRecords\n },\n\n /**\n * Use {@link Mapper#createRecord} instead.\n * @deprecated\n * @method Mapper#createInstance\n * @param {Object|Array} props See {@link Mapper#createRecord}.\n * @param {Object} [opts] See {@link Mapper#createRecord}.\n * @returns {Object|Array} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n createInstance (props, opts) {\n return this.createRecord(props, opts)\n },\n\n /**\n * Creates parent record for relation types like BelongsTo or HasMany with localKeys\n * in order to satisfy foreignKey dependency (so called child records).\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} opts See {@link Mapper#create}.\n * @returns {Object} cached parent records map\n * @see Mapper#create\n * @since 3.0.0\n */\n _createParentRecordIfRequired (props, opts) {\n const tasks = []\n const relations = []\n\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n if (!def.isRequiresParentId() || !def.getLocalField(props)) {\n return\n }\n\n optsCopy.raw = false\n relations.push(def)\n tasks.push(def.createParentRecord(props, optsCopy))\n })\n\n return utils.Promise.all(tasks).then(records => {\n return relations.reduce((map, relation, index) => {\n relation.setLocalField(map, records[index])\n return map\n }, {})\n })\n },\n\n /**\n * Creates child record for relation types like HasOne or HasMany with foreignKey\n * in order to satisfy foreignKey dependency (so called parent records).\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} context contains collected information.\n * @param {Object} context.opts See {@link Mapper#create}.\n * @param {Object} context.parentRelationMap contains parent records map\n * @param {Object} context.originalProps contains data passed into {@link Mapper#create} method\n * @return {Promise} updated props\n * @see Mapper#create\n * @since 3.0.0\n */\n _createOrAssignChildRecordIfRequired (props, context) {\n const tasks = []\n\n utils.forEachRelation(this, context.opts, (def, optsCopy) => {\n const relationData = def.getLocalField(context.originalProps)\n\n if (!relationData) {\n return\n }\n\n optsCopy.raw = false\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.isRequiresChildId()) {\n tasks.push(def.createChildRecord(props, relationData, optsCopy))\n } else if (def.isRequiresParentId()) {\n const parent = def.getLocalField(context.parentRelationMap)\n\n if (parent) {\n def.setLocalField(props, parent)\n }\n }\n })\n\n return utils.Promise.all(tasks)\n .then(() => props)\n },\n\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreateMany\n * @see Mapper~beforeCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback Mapper~beforeCreateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Mapper#event:beforeCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~afterCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterCreateMany\n * @see Mapper~afterCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback Mapper~afterCreateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Mapper#event:afterCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Given an array of records, batch create them via an adapter.\n *\n * {@link Mapper#beforeCreateMany} will be called before calling the adapter.\n * {@link Mapper#afterCreateMany} will be called after calling the adapter.\n *\n * @example\n * // Create and save several new blog posts\n * PostMapper.createMany([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]) // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]) // { id: 1235, status: 'draft', ... }\n * })\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#createMany\n * @param {Record[]} records Array of records to be created in one batch.\n * @param {Object} [opts] Configuration options. Refer to the `createMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `records` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#createMany}\n * call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created records.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n createMany (records, opts) {\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n const originalRecords = records\n let adapterResponse\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n // beforeCreateMany lifecycle hook\n opts.op = 'beforeCreateMany'\n return this._runHook(opts.op, records, opts).then((records) => {\n // Deep pre-create belongsTo relations\n const belongsToRelationData = {}\n opts.with || (opts.with = [])\n let tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (def.type === belongsToType && relationData.length === records.length) {\n // Create belongsTo relation first because we need a generated id to\n // attach to the child\n optsCopy.raw = false\n tasks.push(def.createLinked(relationData, optsCopy).then((relatedRecords) => {\n records.forEach((record, i) => def.setForeignKey(record, relatedRecords[i]))\n }).then((relatedRecords) => {\n def.setLocalField(belongsToRelationData, relatedRecords)\n }))\n }\n })\n return utils.Promise.all(tasks).then(() => {\n opts.op = 'createMany'\n return this._invokeAdapterMethod(opts.op, records, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdRecordsData = opts.raw ? adapterResponse.data : adapterResponse\n\n // Deep post-create hasOne relations\n tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (relationData.length !== records.length) {\n return\n }\n\n optsCopy.raw = false\n const belongsToData = def.getLocalField(belongsToRelationData)\n let task\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.type === hasManyType) {\n // Not supported\n this.log('warn', 'deep createMany of hasMany type not supported!')\n } else if (def.type === hasOneType) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setForeignKey(createdRecordData, relationData[i])\n })\n task = def.getRelation().createMany(relationData, optsCopy).then((relatedData) => {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, relatedData[i])\n })\n })\n } else if (def.type === belongsToType && belongsToData && belongsToData.length === createdRecordsData.length) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, belongsToData[i])\n })\n }\n if (task) {\n tasks.push(task)\n }\n })\n return utils.Promise.all(tasks).then(() => {\n return this._commitChanges(originalRecords, createdRecordsData)\n })\n })\n }).then((records) => {\n if (opts.raw) {\n adapterResponse.data = records\n } else {\n adapterResponse = records\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreateMany'\n return this._runHook(opts.op, records, opts, result)\n })\n },\n\n /**\n * Create an unsaved, uncached instance of this Mapper's\n * {@link Mapper#recordClass}.\n *\n * Returns `props` if `props` is already an instance of\n * {@link Mapper#recordClass}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * const post = PostMapper.createRecord()\n *\n * @example\n * // Create an unsaved record instance with inital properties\n * const post = PostMapper.createRecord({\n * title: 'Modeling your data',\n * status: 'draft'\n * })\n *\n * @example\n * // Create a record instance that corresponds to a saved record\n * const post = PostMapper.createRecord({\n * // JSData thinks this record has been saved if it has a primary key\n * id: 1234,\n * title: 'Modeling your data',\n * status: 'draft'\n * })\n *\n * @example\n * // Create record instances from an array\n * const posts = PostMapper.createRecord([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }])\n *\n * @example\n * // Records are validated by default\n * import {Mapper} from 'js-data'\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * })\n * try {\n * const post = PostMapper.createRecord({\n * title: 1234,\n * })\n * } catch (err) {\n * console.log(err.errors) // [{ expected: 'one of (string)', actual: 'number', path: 'title' }]\n * }\n *\n * @example\n * // Skip validation\n * import {Mapper} from 'js-data'\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * })\n * const post = PostMapper.createRecord({\n * title: 1234,\n * }, { noValidate: true })\n * console.log(post.isValid()) // false\n *\n * @method Mapper#createRecord\n * @param {Object|Object[]} props The properties for the Record instance or an\n * array of property objects for the Record instances.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @returns {Record|Record[]} The Record instance or Record instances.\n * @since 3.0.0\n */\n createRecord (props, opts) {\n props || (props = {})\n if (utils.isArray(props)) {\n return props.map((_props) => this.createRecord(_props, opts))\n }\n if (!utils.isObject(props)) {\n throw utils.err(`${DOMAIN}#createRecord`, 'props')(400, 'array or object', props)\n }\n\n if (this.relationList) {\n this.relationList.forEach(function (def) {\n def.ensureLinkedDataHasProperType(props, opts)\n })\n }\n const RecordCtor = this.recordClass\n\n return (!RecordCtor || props instanceof RecordCtor) ? props : new RecordCtor(props, opts)\n },\n\n /**\n * Lifecycle invocation method. You probably won't call this method directly.\n *\n * @method Mapper#crud\n * @param {string} method Name of the lifecycle method to invoke.\n * @param {...*} args Arguments to pass to the lifecycle method.\n * @returns {Promise}\n * @since 3.0.0\n */\n crud (method, ...args) {\n const config = this.lifecycleMethods[method]\n if (!config) {\n throw utils.err(`${DOMAIN}#crud`, method)(404, 'method')\n }\n\n const upper = `${method.charAt(0).toUpperCase()}${method.substr(1)}`\n const before = `before${upper}`\n const after = `after${upper}`\n\n let op, adapter\n\n // Default values for arguments\n config.defaults.forEach((value, i) => {\n if (args[i] === undefined) {\n args[i] = utils.copy(value)\n }\n })\n\n const opts = args[args.length - 1]\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n adapter = opts.adapter = this.getAdapterName(opts)\n\n // before lifecycle hook\n op = opts.op = before\n return utils.resolve(this[op](...args)).then((_value) => {\n if (args[config.beforeAssign] !== undefined) {\n // Allow for re-assignment from lifecycle hook\n args[config.beforeAssign] = _value === undefined ? args[config.beforeAssign] : _value\n }\n // Now delegate to the adapter\n op = opts.op = method\n args = config.adapterArgs ? config.adapterArgs(this, ...args) : args\n this.dbg(op, ...args)\n return utils.resolve(this.getAdapter(adapter)[op](this, ...args))\n }).then((result) => {\n result = this._end(result, opts, !!config.skip)\n args.push(result)\n // after lifecycle hook\n op = opts.op = after\n return utils.resolve(this[op](...args)).then((_result) => {\n // Allow for re-assignment from lifecycle hook\n return _result === undefined ? result : _result\n })\n })\n },\n\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~beforeDestroyListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroy\n * @see Mapper~beforeDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback Mapper~beforeDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}.\n * @see Mapper#event:beforeDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~afterDestroyListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroy\n * @see Mapper~afterDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback Mapper~afterDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroy}.\n * @see Mapper#event:afterDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Using an adapter, destroy the record with the given primary key.\n *\n * {@link Mapper#beforeDestroy} will be called before destroying the record.\n * {@link Mapper#afterDestroy} will be called after destroying the record.\n *\n * @example\n * // Destroy a specific blog post\n * PostMapper.destroy(1234).then(() => {\n * // Blog post #1234 has been destroyed\n * })\n *\n * @example\n * // Get full response\n * PostMapper.destroy(1234, { raw: true }).then((result) => {\n * console.log(result.deleted) e.g. 1\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeDestroy\n * @fires Mapper#afterDestroy\n * @method Mapper#destroy\n * @param {(string|number)} id The primary key of the record to destroy.\n * @param {Object} [opts] Configuration options. Refer to the `destroy` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the record has been destroyed. Resolves\n * even if no record was found to be destroyed.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroy (id, opts) {\n return this.crud('destroy', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroyAll\n * @see Mapper~beforeDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback Mapper~beforeDestroyAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}.\n * @see Mapper#event:beforeDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroyAll\n * @see Mapper~afterDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback Mapper~afterDestroyAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterDestroyAll}.\n * @see Mapper#event:afterDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Destroy the records selected by `query` via an adapter. If no `query` is\n * provided then all records will be destroyed.\n *\n * {@link Mapper#beforeDestroyAll} will be called before destroying the records.\n * {@link Mapper#afterDestroyAll} will be called after destroying the records.\n *\n * @example\n * // Destroy all blog posts\n * PostMapper.destroyAll().then(() => {\n * // All blog posts have been destroyed\n * })\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * PostMapper.destroyAll({ status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * })\n *\n * @example\n * // Get full response\n * const query = null\n * const options = { raw: true }\n * PostMapper.destroyAll(query, options).then((result) => {\n * console.log(result.deleted) e.g. 14\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeDestroyAll\n * @fires Mapper#afterDestroyAll\n * @method Mapper#destroyAll\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `destroyAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the records have been destroyed. Resolves\n * even if no records were found to be destroyed.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroyAll (query, opts) {\n return this.crud('destroyAll', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~beforeFindListener} for how to listen for this event.\n *\n * @event Mapper#beforeFind\n * @see Mapper~beforeFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback Mapper~beforeFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFind}.\n * @see Mapper#event:beforeFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~afterFindListener} for how to listen for this event.\n *\n * @event Mapper#afterFind\n * @see Mapper~afterFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFind} event.\n *\n * @example\n * function onAfterFind (id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback Mapper~afterFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterFind}.\n * @see Mapper#event:afterFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Retrieve via an adapter the record with the given primary key.\n *\n * {@link Mapper#beforeFind} will be called before calling the adapter.\n * {@link Mapper#afterFind} will be called after calling the adapter.\n *\n * @example\n * PostMapper.find(1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * })\n *\n * @example\n * // Get full response\n * PostMapper.find(1, { raw: true }).then((result) => {\n * console.log(result.data) // { id: 1, ...}\n * console.log(result.found) // 1\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeFind\n * @fires Mapper#afterFind\n * @method Mapper#find\n * @param {(string|number)} id The primary key of the record to retrieve.\n * @param {Object} [opts] Configuration options. Refer to the `find` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found record. Resolves with\n * `undefined` if no record was found.\n * @see http://www.js-data.io/v3.0/docs/reading-data\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n find (id, opts) {\n return this.crud('find', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~beforeFindAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeFindAll\n * @see Mapper~beforeFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback Mapper~beforeFindAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}.\n * @see Mapper#event:beforeFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~afterFindAllListener} for how to listen for this event.\n *\n * @event Mapper#afterFindAll\n * @see Mapper~afterFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback Mapper~afterFindAllListener\n * @param {Object} query The `query` argument passed to {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterFindAll}.\n * @see Mapper#event:afterFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, select records to retrieve via an adapter.\n *\n * {@link Mapper#beforeFindAll} will be called before calling the adapter.\n * {@link Mapper#afterFindAll} will be called after calling the adapter.\n *\n * @example\n * // Find all \"published\" blog posts\n * PostMapper.findAll({ status: 'published' }).then((posts) => {\n * console.log(posts) // [{ id: 1, status: 'published', ...}, ...]\n * })\n *\n * @example\n * // Get full response\n * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => {\n * console.log(result.data) // [{ id: 1, status: 'published', ...}, ...]\n * console.log(result.found) // e.g. 13\n * console.log(...) // etc., more metadata can be found on the result\n * })\n *\n * @fires Mapper#beforeFindAll\n * @fires Mapper#afterFindAll\n * @method Mapper#findAll\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `findAll` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n findAll (query, opts) {\n return this.crud('findAll', query, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Mapper#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapter (name) {\n this.dbg('getAdapter', 'name:', name)\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Mapper#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || opts.defaultAdapter\n },\n\n /**\n * Get the object of registered adapters for this Mapper.\n *\n * @method Mapper#getAdapters\n * @returns {Object} {@link Mapper#_adapters}\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Returns this Mapper's {@link Schema}.\n *\n * @method Mapper#getSchema\n * @returns {Schema} This Mapper's {@link Schema}.\n * @see Mapper#schema\n * @since 3.0.0\n */\n getSchema () {\n return this.schema\n },\n\n /**\n * Defines a hasMany relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * UserMapper.hasMany(PostMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // post records will be attached to user records at \"user.posts\"\n * localField: 'posts'\n * })\n *\n * @method Mapper#hasMany\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasMany (relatedMapper, opts) {\n return hasMany(relatedMapper, opts)(this)\n },\n\n /**\n * Defines a hasOne relationship. Only useful if you're managing your Mappers\n * manually and not using a {@link Container} or {@link DataStore} component.\n *\n * @example\n * UserMapper.hasOne(ProfileMapper, {\n * // profile.user_id points to user.id\n * foreignKey: 'user_id'\n * // profile records will be attached to user records at \"user.profile\"\n * localField: 'profile'\n * })\n *\n * @method Mapper#hasOne\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasOne (relatedMapper, opts) {\n return hasOne(relatedMapper, opts)(this)\n },\n\n /**\n * Return whether `record` is an instance of this Mapper's recordClass.\n *\n * @example\n * const post = PostMapper.createRecord()\n *\n * console.log(PostMapper.is(post)) // true\n * // Equivalent to what's above\n * console.log(post instanceof PostMapper.recordClass) // true\n *\n * @method Mapper#is\n * @param {Object|Record} record The record to check.\n * @returns {boolean} Whether `record` is an instance of this Mapper's\n * {@link Mapper#recordClass}.\n * @since 3.0.0\n */\n is (record) {\n const recordClass = this.recordClass\n return recordClass ? record instanceof recordClass : false\n },\n\n /**\n * Register an adapter on this Mapper under the given name.\n *\n * @method Mapper#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for this Mapper.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.defaultAdapter = name\n }\n },\n\n _runHook (hookName, ...hookArgs) {\n const defaultValueIndex = hookName.indexOf('after') === 0 ? hookArgs.length - 1 : 0\n\n return utils.resolve(this[hookName](...hookArgs))\n .then((overridenResult) => overridenResult === undefined ? hookArgs[defaultValueIndex] : overridenResult)\n },\n\n _invokeAdapterMethod (method, propsOrRecords, opts) {\n const conversionOptions = { with: opts.pass || [] }\n let object\n\n this.dbg(opts.op, propsOrRecords, opts)\n\n if (utils.isArray(propsOrRecords)) {\n object = propsOrRecords.map(record => this.toJSON(record, conversionOptions))\n } else {\n object = this.toJSON(propsOrRecords, conversionOptions)\n }\n\n return this.getAdapter(opts.adapter)[method](this, object, opts)\n },\n\n /**\n * Select records according to the `query` argument, and aggregate the sum\n * value of the property specified by `field`.\n *\n * {@link Mapper#beforeSum} will be called before calling the adapter.\n * {@link Mapper#afterSum} will be called after calling the adapter.\n *\n * @example\n * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid) // e.g. 451125.34\n * })\n *\n * @method Mapper#sum\n * @param {string} field The field to sum.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `sum` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the aggregated sum.\n * @since 3.0.0\n */\n sum (field, query, opts) {\n return this.crud('sum', field, query, opts)\n },\n\n /**\n * Return a plain object representation of the given record. Relations can\n * be optionally be included. Non-schema properties can be excluded.\n *\n * @example\n * import { Mapper, Schema } from 'js-data'\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is stripped by toJSON()\n * console.log(PersonMapper.toJSON(person)) // {\"id\":1,\"name\":\"John\"}\n *\n * const PersonRelaxedMapper = new Mapper({\n * name: 'personRelaxed',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * })\n * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is not stripped by toJSON\n * console.log(PersonRelaxedMapper.toJSON(person2)) // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Mapper#toJSON\n * @param {Record|Record[]} records Record or records from which to create a\n * POJO representation.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the POJO representation.\n * @param {boolean} [opts.withAll] Whether to simply include all relations in\n * the representation. Overrides `opts.with`.\n * @returns {Object|Object[]} POJO representation of the record or records.\n * @since 3.0.0\n */\n toJSON (records, opts) {\n let record\n opts || (opts = {})\n if (utils.isArray(records)) {\n return records.map((record) => this.toJSON(record, opts))\n } else {\n record = records\n }\n const relationFields = (this ? this.relationFields : []) || []\n let json = {}\n\n // Copy properties defined in the schema\n if (this && this.schema) {\n json = this.schema.pick(record)\n } else {\n for (var key in record) {\n if (relationFields.indexOf(key) === -1) {\n json[key] = utils.plainCopy(record[key])\n }\n }\n }\n\n // The user wants to include relations in the resulting plain object representation\n if (this && opts.withAll) {\n opts.with = relationFields.slice()\n }\n if (this && opts.with) {\n if (utils.isString(opts.with)) {\n opts.with = [opts.with]\n }\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = def.getLocalField(record)\n if (relationData) {\n // The actual recursion\n if (utils.isArray(relationData)) {\n def.setLocalField(json, relationData.map((item) => {\n return def.getRelation().toJSON(item, optsCopy)\n }))\n } else {\n def.setLocalField(json, def.getRelation().toJSON(relationData, optsCopy))\n }\n }\n })\n }\n return json\n },\n\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~beforeUpdateListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdate\n * @see Mapper~beforeUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback Mapper~beforeUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument passed to {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}.\n * @see Mapper#event:beforeUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~afterUpdateListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdate\n * @see Mapper~afterUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback Mapper~afterUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument passed to {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument passed to {@link Mapper#afterUpdate}.\n * @see Mapper#event:afterUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Using an adapter, update the record with the primary key specified by the\n * `id` argument.\n *\n * {@link Mapper#beforeUpdate} will be called before updating the record.\n * {@link Mapper#afterUpdate} will be called after updating the record.\n *\n * @example\n * // Update a specific post\n * PostMapper.update(1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'published', ... }\n * })\n *\n * @fires Mapper#beforeUpdate\n * @fires Mapper#afterUpdate\n * @method Mapper#update\n * @param {(string|number)} id The primary key of the record to update.\n * @param {Object} props The update to apply to the record.\n * @param {Object} [opts] Configuration options. Refer to the `update` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * transaction.\n * @returns {Promise} Resolves with the updated record. Rejects if the record\n * could not be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n update (id, props, opts) {\n return this.crud('update', id, props, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateAll\n * @see Mapper~beforeUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback Mapper~beforeUpdateAllListener\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Mapper#event:beforeUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateAll\n * @see Mapper~afterUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback Mapper~afterUpdateAllListener\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Mapper#event:afterUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, perform the a single updated to the selected\n * records.\n *\n * {@link Mapper#beforeUpdateAll} will be called before making the update.\n * {@link Mapper#afterUpdateAll} will be called after making the update.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * const update = { status: draft: published_at: null }\n * const query = { userId: 1234 }\n * PostMapper.updateAll(update, query).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Mapper#beforeUpdateAll\n * @fires Mapper#afterUpdateAll\n * @method Mapper#updateAll\n * @param {Object} props Update to apply to selected records.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options. Refer to the `updateAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the update records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateAll (props, query, opts) {\n return this.crud('updateAll', props, query, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateMany\n * @see Mapper~beforeUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback Mapper~beforeUpdateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Mapper#event:beforeUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateMany\n * @see Mapper~afterUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback Mapper~afterUpdateManyListener\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Mapper#event:afterUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Given an array of updates, perform each of the updates via an adapter. Each\n * \"update\" is a hash of properties with which to update an record. Each\n * update must contain the primary key of the record to be updated.\n *\n * {@link Mapper#beforeUpdateMany} will be called before making the update.\n * {@link Mapper#afterUpdateMany} will be called after making the update.\n *\n * @example\n * PostMapper.updateMany([\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Mapper#beforeUpdateMany\n * @fires Mapper#afterUpdateMany\n * @method Mapper#updateMany\n * @param {Record[]} records Array up record updates.\n * @param {Object} [opts] Configuration options. Refer to the `updateMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the updated records. Rejects if any of the\n * records could be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateMany (records, opts) {\n return this.crud('updateMany', records, opts)\n },\n\n /**\n * Validate the given record or records according to this Mapper's\n * {@link Schema}. If there are no validation errors then the return value\n * will be `undefined`.\n *\n * @example\n * import {Mapper, Schema} from 'js-data'\n * const PersonSchema = new Schema({\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * })\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: PersonSchema\n * })\n * let errors = PersonMapper.validate({ name: 'John' })\n * console.log(errors) // undefined\n * errors = PersonMapper.validate({ name: 123 })\n * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Mapper#validate\n * @param {Object|Object[]} record The record or records to validate.\n * @param {Object} [opts] Configuration options. Passed to\n * {@link Schema#validate}.\n * @returns {Object[]} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (record, opts) {\n opts || (opts = {})\n const schema = this.getSchema()\n if (!schema) {\n return\n }\n const _opts = utils.pick(opts, ['existingOnly'])\n if (utils.isArray(record)) {\n const errors = record.map((_record) => schema.validate(_record, utils.pick(_opts, ['existingOnly'])))\n\n return errors.some(Boolean) ? errors : undefined\n }\n return schema.validate(record, _opts)\n },\n\n /**\n * Method used to wrap data returned by an adapter with this Mapper's\n * {@link Mapper#recordClass}. This method is used by all of a Mapper's CRUD\n * methods. The provided implementation of this method assumes that the `data`\n * passed to it is a record or records that need to be wrapped with\n * {@link Mapper#createRecord}. Override with care.\n *\n * Provided implementation of {@link Mapper#wrap}:\n *\n * ```\n * function (data, opts) {\n * return this.createRecord(data, opts)\n * }\n * ```\n *\n * @example\n * const PostMapper = new Mapper({\n * name: 'post',\n * // Override to customize behavior\n * wrap (data, opts) {\n * const originalWrap = this.constructor.prototype.wrap\n * // Let's say \"GET /post\" doesn't return JSON quite like JSData expects,\n * // but the actual post records are nested under a \"posts\" field. So,\n * // we override Mapper#wrap to handle this special case.\n * if (opts.op === 'findAll') {\n * return originalWrap.call(this, data.posts, opts)\n * }\n * // Otherwise perform original behavior\n * return originalWrap.call(this, data, opts)\n * }\n * })\n *\n * @method Mapper#wrap\n * @param {Object|Object[]} data The record or records to be wrapped.\n * @param {Object} [opts] Configuration options. Passed to {@link Mapper#createRecord}.\n * @returns {Record|Record[]} The wrapped record or records.\n * @since 3.0.0\n */\n wrap (data, opts) {\n return this.createRecord(data, opts)\n },\n\n /**\n * @ignore\n */\n defineRelations () {\n // Setup the mapper's relations, including generating Mapper#relationList\n // and Mapper#relationFields\n utils.forOwn(this.relations, (group, type) => {\n utils.forOwn(group, (relations, _name) => {\n if (utils.isObject(relations)) {\n relations = [relations]\n }\n relations.forEach((def) => {\n const relatedMapper = this.datastore.getMapperByName(_name) || _name\n def.getRelation = () => this.datastore.getMapper(_name)\n\n if (typeof Relation[type] !== 'function') {\n throw utils.err(DOMAIN, 'defineRelations')(400, 'relation type (hasOne, hasMany, etc)', type, true)\n }\n\n this[type](relatedMapper, def)\n })\n })\n })\n }\n})\n\n/**\n * Create a subclass of this Mapper:\n *\n * @example Mapper.extend\n * // Normally you would do: import {Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Mapper} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMapperClass extends Mapper {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customMapper = new CustomMapperClass()\n * console.log(customMapper.foo())\n * console.log(CustomMapperClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherMapperClass = Mapper.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherMapper = new OtherMapperClass()\n * console.log(otherMapper.foo())\n * console.log(OtherMapperClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMapperClass () {\n * Mapper.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Mapper.extend({\n * constructor: AnotherMapperClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherMapper = new AnotherMapperClass()\n * console.log(anotherMapper.created_at)\n * console.log(anotherMapper.foo())\n * console.log(AnotherMapperClass.beep())\n *\n * @method Mapper.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Mapper class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Mapper from './Mapper'\n\nconst DOMAIN = 'Container'\n\nexport const proxiedMapperMethods = [\n /**\n * Wrapper for {@link Mapper#count}.\n *\n * @example\n * // Get the number of published blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.count('post', { status: 'published' }).then((numPublished) => {\n * console.log(numPublished) // e.g. 45\n * })\n *\n * @method Container#count\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#count}.\n * @param {Object} [opts] See {@link Mapper#count}.\n * @returns {Promise} See {@link Mapper#count}.\n * @see Mapper#count\n * @since 3.0.0\n */\n 'count',\n\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~beforeCreateListener} for how to listen for this event.\n *\n * @event Container#beforeCreate\n * @see Container~beforeCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback Container~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see Container#event:beforeCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~afterCreateListener} for how to listen for this event.\n *\n * @event Container#afterCreate\n * @see Container~afterCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback Container~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see Container#event:afterCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}.\n *\n * @example\n * // Create and save a new blog post\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.create('post', {\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'draft', ... }\n * })\n *\n * @fires Container#beforeCreate\n * @fires Container#afterCreate\n * @method Container#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} props See {@link Mapper#create}.\n * @param {Object} [opts] See {@link Mapper#create}.\n * @returns {Promise} See {@link Mapper#create}.\n * @see Mapper#create\n * @since 3.0.0\n */\n 'create',\n\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Container#beforeCreateMany\n * @see Container~beforeCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback Container~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Container#event:beforeCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~afterCreateManyListener} for how to listen for this event.\n *\n * @event Container#afterCreateMany\n * @see Container~afterCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback Container~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Container#event:afterCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}.\n *\n * @example\n * // Create and save several new blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.createMany('post', [{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]) // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]) // { id: 1235, status: 'draft', ... }\n * })\n *\n * @fires Container#beforeCreateMany\n * @fires Container#afterCreateMany\n * @method Container#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record[]} records See {@link Mapper#createMany}.\n * @param {Object} [opts] See {@link Mapper#createMany}.\n * @returns {Promise} See {@link Mapper#createMany}.\n * @see Mapper#createMany\n * @since 3.0.0\n */\n 'createMany',\n\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post')\n * const post = PostMapper.createRecord()\n *\n * @method Container#createRecord\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Object[]} props See {@link Mapper#createRecord}.\n * @param {Object} [opts] See {@link Mapper#createRecord}.\n * @returns {Promise} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n 'createRecord',\n\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~beforeDestroyListener} for how to listen for this event.\n *\n * @event Container#beforeDestroy\n * @see Container~beforeDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback Container~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see Container#event:beforeDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~afterDestroyListener} for how to listen for this event.\n *\n * @event Container#afterDestroy\n * @see Container~afterDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback Container~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see Container#event:afterDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}.\n *\n * @example\n * // Destroy a specific blog post\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.destroy('post', 1234).then(() => {\n * // Blog post #1234 has been destroyed\n * })\n *\n * @fires Container#beforeDestroy\n * @fires Container#afterDestroy\n * @method Container#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#destroy}.\n * @param {Object} [opts] See {@link Mapper#destroy}.\n * @returns {Promise} See {@link Mapper#destroy}.\n * @see Mapper#destroy\n * @since 3.0.0\n */\n 'destroy',\n\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Container#beforeDestroyAll\n * @see Container~beforeDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback Container~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see Container#event:beforeDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Container#afterDestroyAll\n * @see Container~afterDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback Container~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see Container#event:afterDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}.\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.destroyAll('post', { status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * })\n *\n * @fires Container#beforeDestroyAll\n * @fires Container#afterDestroyAll\n * @method Container#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#destroyAll}.\n * @param {Object} [opts] See {@link Mapper#destroyAll}.\n * @returns {Promise} See {@link Mapper#destroyAll}.\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n 'destroyAll',\n\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~beforeFindListener} for how to listen for this event.\n *\n * @event Container#beforeFind\n * @see Container~beforeFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback Container~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see Container#event:beforeFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~afterFindListener} for how to listen for this event.\n *\n * @event Container#afterFind\n * @see Container~afterFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback Container~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see Container#event:afterFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.find('post', 1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * })\n *\n * @fires Container#beforeFind\n * @fires Container#afterFind\n * @method Container#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#find}.\n * @param {Object} [opts] See {@link Mapper#find}.\n * @returns {Promise} See {@link Mapper#find}.\n * @see Mapper#find\n * @since 3.0.0\n */\n 'find',\n\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~beforeFindAllListener} for how to listen for this event.\n *\n * @event Container#beforeFindAll\n * @see Container~beforeFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback Container~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see Container#event:beforeFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~afterFindAllListener} for how to listen for this event.\n *\n * @event Container#afterFindAll\n * @see Container~afterFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback Container~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see Container#event:afterFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * @example\n * // Find all \"published\" blog posts\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.findAll('post', { status: 'published' }).then((posts) => {\n * console.log(posts) // [{ id: 1, ...}, ...]\n * })\n *\n * @fires Container#beforeFindAll\n * @fires Container#afterFindAll\n * @method Container#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] See {@link Mapper#findAll}.\n * @param {Object} [opts] See {@link Mapper#findAll}.\n * @returns {Promise} See {@link Mapper#findAll}.\n * @see Mapper#findAll\n * @since 3.0.0\n */\n 'findAll',\n\n /**\n * Wrapper for {@link Mapper#getSchema}.\n *\n * @method Container#getSchema\n * @param {string} name Name of the {@link Mapper} to target.\n * @returns {Schema} See {@link Mapper#getSchema}.\n * @see Mapper#getSchema\n * @since 3.0.0\n */\n 'getSchema',\n\n /**\n * Wrapper for {@link Mapper#is}.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post')\n * const post = store.createRecord()\n *\n * console.log(store.is('post', post)) // true\n * // Equivalent to what's above\n * console.log(post instanceof store.getMapper('post').recordClass) // true\n *\n * @method Container#is\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Record} record See {@link Mapper#is}.\n * @returns {boolean} See {@link Mapper#is}.\n * @see Mapper#is\n * @since 3.0.0\n */\n 'is',\n\n /**\n * Wrapper for {@link Mapper#sum}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('purchase_order')\n *\n * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid) // e.g. 451125.34\n * })\n *\n * @method Container#sum\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {string} field See {@link Mapper#sum}.\n * @param {Object} [query] See {@link Mapper#sum}.\n * @param {Object} [opts] See {@link Mapper#sum}.\n * @returns {Promise} See {@link Mapper#sum}.\n * @see Mapper#sum\n * @since 3.0.0\n */\n 'sum',\n\n /**\n * Wrapper for {@link Mapper#toJSON}.\n *\n * @example\n * import { Container } from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('person', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is stripped by toJSON()\n * console.log(store.toJSON('person', person)) // {\"id\":1,\"name\":\"John\"}\n *\n * store.defineMapper('personRelaxed', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * })\n * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' })\n * // \"foo\" is not stripped by toJSON\n * console.log(store.toJSON('personRelaxed', person2)) // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Container#toJSON\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record|Record[]} records See {@link Mapper#toJSON}.\n * @param {Object} [opts] See {@link Mapper#toJSON}.\n * @returns {Object|Object[]} See {@link Mapper#toJSON}.\n * @see Mapper#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~beforeUpdateListener} for how to listen for this event.\n *\n * @event Container#beforeUpdate\n * @see Container~beforeUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback Container~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see Container#event:beforeUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~afterUpdateListener} for how to listen for this event.\n *\n * @event Container#afterUpdate\n * @see Container~afterUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback Container~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see Container#event:afterUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.update('post', 1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post) // { id: 1234, status: 'published', ... }\n * })\n *\n * @fires Container#beforeUpdate\n * @fires Container#afterUpdate\n * @method Container#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#update}.\n * @param {Object} record See {@link Mapper#update}.\n * @param {Object} [opts] See {@link Mapper#update}.\n * @returns {Promise} See {@link Mapper#update}.\n * @see Mapper#update\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n 'update',\n\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateAll\n * @see Container~beforeUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback Container~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Container#event:beforeUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Container#afterUpdateAll\n * @see Container~afterUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback Container~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Container#event:afterUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * const update = { status: draft: published_at: null }\n * const query = { userId: 1234 }\n * store.updateAll('post', update, query).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Container#beforeUpdateAll\n * @fires Container#afterUpdateAll\n * @method Container#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} update See {@link Mapper#updateAll}.\n * @param {Object} [query] See {@link Mapper#updateAll}.\n * @param {Object} [opts] See {@link Mapper#updateAll}.\n * @returns {Promise} See {@link Mapper#updateAll}.\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n 'updateAll',\n\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateMany\n * @see Container~beforeUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback Container~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Container#event:beforeUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Container#afterUpdateMany\n * @see Container~afterUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback Container~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Container#event:afterUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}.\n *\n * @example\n * import {Container} from 'js-data'\n * import RethinkDBAdapter from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n * store.defineMapper('post')\n *\n * store.updateMany('post', [\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts) // [...]\n * })\n *\n * @fires Container#beforeUpdateMany\n * @fires Container#afterUpdateMany\n * @method Container#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}.\n * @param {Object} [opts] See {@link Mapper#updateMany}.\n * @returns {Promise} See {@link Mapper#updateMany}.\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n 'updateMany',\n\n /**\n * Wrapper for {@link Mapper#validate}.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * })\n * let errors = store.validate('post', { name: 'John' })\n * console.log(errors) // undefined\n * errors = store.validate('post', { name: 123 })\n * console.log(errors) // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Container#validate\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#validate}.\n * @param {Object} [opts] See {@link Mapper#validate}.\n * @returns {Promise} See {@link Mapper#validate}.\n * @see Mapper#validate\n * @since 3.0.0\n */\n 'validate'\n]\n\n/**\n * The `Container` class is a place to define and store {@link Mapper} instances.\n *\n * `Container` makes it easy to manage your Mappers. Without a container, you\n * need to manage Mappers yourself, including resolving circular dependencies\n * among relations. All Mappers in a container share the same adapters, so you\n * don't have to register adapters for every single Mapper.\n *\n * @example Container#constructor\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n *\n * @class Container\n * @extends Component\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}.\n * @param {Object} [opts.mapperDefaults] See {@link Container#mapperDefaults}.\n * @since 3.0.0\n */\nexport function Container (opts) {\n utils.classCallCheck(this, Container)\n Component.call(this)\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * The adapters registered with this Container, which are also shared by all\n * Mappers in this Container.\n *\n * @name Container#_adapters\n * @see Container#registerAdapter\n * @since 3.0.0\n * @type {Object}\n */\n _adapters: {\n value: {}\n },\n\n /**\n * The the mappers in this container\n *\n * @name Container#_mappers\n * @see Mapper\n * @since 3.0.0\n * @type {Object}\n */\n _mappers: {\n value: {}\n },\n\n /**\n * Constructor function to use in {@link Container#defineMapper} to create new\n * {@link Mapper} instances. {@link Container#mapperClass} should extend\n * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers.\n *\n * @example Container#mapperClass\n * // import {Container, Mapper} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const store = new Container({\n * mapperClass: MyMapperClass\n * })\n * store.defineMapper('user')\n * console.log(store.getMapper('user').foo())\n *\n * @name Container#mapperClass\n * @see Mapper\n * @since 3.0.0\n * @type {Constructor}\n */\n mapperClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply options provided by the user\n utils.fillIn(this, opts)\n\n /**\n * Defaults options to pass to {@link Container#mapperClass} when creating a\n * new {@link Mapper}.\n *\n * @example Container#mapperDefaults\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container({\n * mapperDefaults: {\n * idAttribute: '_id'\n * }\n * })\n * store.defineMapper('user')\n * console.log(store.getMapper('user').idAttribute)\n *\n * @default {}\n * @name Container#mapperDefaults\n * @since 3.0.0\n * @type {Object}\n */\n this.mapperDefaults = this.mapperDefaults || {}\n\n // Use the Mapper class if the user didn't provide a mapperClass\n this.mapperClass || (this.mapperClass = Mapper)\n}\n\nconst props = {\n constructor: Container,\n\n /**\n * Register a new event listener on this Container.\n *\n * Proxy for {@link Component#on}. If an event was emitted by a {@link Mapper}\n * in the Container, then the name of the {@link Mapper} will be prepended to\n * the arugments passed to the listener.\n *\n * @example Container#on\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * store.on('foo', function (...args) { console.log(args.join(':')) })\n * store.defineMapper('user')\n * store.emit('foo', 'arg1', 'arg2')\n * store.getMapper('user').emit('foo', 'arg1', 'arg2')\n *\n * @method Container#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n\n /**\n * Used to bind to events emitted by mappers in this container.\n *\n * @method Container#_onMapperEvent\n * @param {string} name Name of the mapper that emitted the event.\n * @param {...*} [args] Args See {@link Mapper#emit}.\n * @private\n * @since 3.0.0\n */\n _onMapperEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * Return a container scoped to a particular mapper.\n *\n * @example Container#as\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * const UserMapper = store.defineMapper('user')\n * const UserStore = store.as('user')\n *\n * const user1 = store.createRecord('user', { name: 'John' })\n * const user2 = UserStore.createRecord({ name: 'John' })\n * const user3 = UserMapper.createRecord({ name: 'John' })\n * console.log(user1 === user2)\n * console.log(user2 === user3)\n * console.log(user1 === user3)\n *\n * @method Container#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} A container scoped to a particular mapper.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n proxiedMapperMethods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Create a new mapper and register it in this container.\n *\n * @example Container#defineMapper\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container({\n * mapperDefaults: { foo: 'bar' }\n * })\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * console.log(UserMapper.foo)\n *\n * @method Container#defineMapper\n * @param {string} name Name under which to register the new {@link Mapper}.\n * {@link Mapper#name} will be set to this value.\n * @param {Object} [opts] Configuration options. Passed to\n * {@link Container#mapperClass} when creating the new {@link Mapper}.\n * @returns {Mapper} The newly created instance of {@link Mapper}.\n * @see Container#as\n * @since 3.0.0\n */\n defineMapper (name, opts) {\n // For backwards compatibility with defineResource\n if (utils.isObject(name)) {\n opts = name\n name = opts.name\n }\n if (!utils.isString(name)) {\n throw utils.err(`${DOMAIN}#defineMapper`, 'name')(400, 'string', name)\n }\n\n // Default values for arguments\n opts || (opts = {})\n // Set Mapper#name\n opts.name = name\n opts.relations || (opts.relations = {})\n\n // Check if the user is overriding the datastore's default mapperClass\n const mapperClass = opts.mapperClass || this.mapperClass\n delete opts.mapperClass\n\n // Apply the datastore's defaults to the options going into the mapper\n utils.fillIn(opts, this.mapperDefaults)\n\n // Instantiate a mapper\n const mapper = this._mappers[name] = new mapperClass(opts) // eslint-disable-line\n mapper.relations || (mapper.relations = {})\n // Make sure the mapper's name is set\n mapper.name = name\n // All mappers in this datastore will share adapters\n mapper._adapters = this.getAdapters()\n\n mapper.datastore = this\n\n mapper.on('all', (...args) => this._onMapperEvent(name, ...args))\n mapper.defineRelations()\n\n return mapper\n },\n\n defineResource (name, opts) {\n console.warn('DEPRECATED: defineResource is deprecated, use defineMapper instead')\n return this.defineMapper(name, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Container#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n */\n getAdapter (name) {\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Container#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || this.mapperDefaults.defaultAdapter\n },\n\n /**\n * Return the registered adapters of this container.\n *\n * @method Container#getAdapters\n * @returns {Adapter}\n * @since 3.0.0\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Return the mapper registered under the specified name.\n *\n * @example Container#getMapper\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * store.getMapper('profile') // throws Error, there is no mapper with name \"profile\"\n *\n * @method Container#getMapper\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapper (name) {\n const mapper = this.getMapperByName(name)\n if (!mapper) {\n throw utils.err(`${DOMAIN}#getMapper`, name)(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Return the mapper registered under the specified name.\n * Doesn't throw error if mapper doesn't exist.\n *\n * @example Container#getMapperByName\n * // import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new Container()\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n * console.log(UserMapper === store.getMapper('user'))\n * console.log(UserMapper === store.as('user').getMapper())\n * console.log(store.getMapper('profile')) // Does NOT throw an error\n *\n * @method Container#getMapperByName\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapperByName (name) {\n return this._mappers[name]\n },\n\n /**\n * Register an adapter on this container under the given name. Adapters\n * registered on a container are shared by all mappers in the container.\n *\n * @example\n * import {Container} from 'js-data'\n * import {RethinkDBAdapter} from 'js-data-rethinkdb'\n * const store = new Container()\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true })\n *\n * @method Container#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {Object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for all Mappers in this container.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.mapperDefaults.defaultAdapter = name\n utils.forOwn(this._mappers, function (mapper) {\n mapper.defaultAdapter = name\n })\n }\n }\n}\n\nproxiedMapperMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getMapper(name)[method](...args)\n }\n})\n\nComponent.extend(props)\n\n/**\n * Create a subclass of this Container:\n * @example Container.extend\n * // Normally you would do: import {Container} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {Container} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomContainerClass extends Container {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customContainer = new CustomContainerClass()\n * console.log(customContainer.foo())\n * console.log(CustomContainerClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherContainerClass = Container.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherContainer = new OtherContainerClass()\n * console.log(otherContainer.foo())\n * console.log(OtherContainerClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherContainerClass () {\n * Container.call(this)\n * this.created_at = new Date().getTime()\n * }\n * Container.extend({\n * constructor: AnotherContainerClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherContainer = new AnotherContainerClass()\n * console.log(anotherContainer.created_at)\n * console.log(anotherContainer.foo())\n * console.log(AnotherContainerClass.beep())\n *\n * @method Container.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Container class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport {proxiedMapperMethods, Container} from './Container'\nimport Collection from './Collection'\n\nconst DOMAIN = 'SimpleStore'\nconst proxiedCollectionMethods = [\n /**\n * Wrapper for {@link Collection#add}.\n *\n * @example SimpleStore#add\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('book')\n *\n * // Add one book to the in-memory store:\n * store.add('book', { id: 1, title: 'Respect your Data' })\n * // Add multiple books to the in-memory store:\n * store.add('book', [\n * { id: 2, title: 'Easy data recipes' },\n * { id: 3, title: 'Active Record 101' }\n * ])\n *\n * @fires SimpleStore#add\n * @method SimpleStore#add\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}.\n * @param {Object} [opts] Configuration options. See {@link Collection#add}.\n * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n 'add',\n\n /**\n * Wrapper for {@link Collection#between}.\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = store.between('user', 18, 30, { index: 'age' })\n *\n * @example\n * // Same as above\n * const users = store.between('user', [18], [30], { index: 'age' })\n *\n * @method SimpleStore#between\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {Array} leftKeys See {@link Collection#between}.\n * @param {Array} rightKeys See {@link Collection#between}.\n * @param {Object} [opts] Configuration options. See {@link Collection#between}.\n * @returns {Object[]|Record[]} See {@link Collection#between}.\n * @see Collection#between\n * @see Collection#between\n * @since 3.0.0\n */\n 'between',\n\n /**\n * Wrapper for {@link Collection#createIndex}.\n *\n * @example\n * // Index users by age\n * store.createIndex('user', 'age')\n *\n * @example\n * // Index users by status and role\n * store.createIndex('user', 'statusAndRole', ['status', 'role'])\n *\n * @method SimpleStore#createIndex\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {string} name See {@link Collection#createIndex}.\n * @param {string[]} [fieldList] See {@link Collection#createIndex}.\n * @see Collection#createIndex\n * @see Collection#createIndex\n * @since 3.0.0\n */\n 'createIndex',\n\n /**\n * Wrapper for {@link Collection#filter}.\n *\n * @example SimpleStore#filter\n * // import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('post')\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * // Get the draft posts created less than three months ago\n * let posts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * })\n * console.log(posts)\n *\n * // Use a custom filter function\n * posts = store.filter('post', function (post) { return post.id % 2 === 0 })\n *\n * @method SimpleStore#filter\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}.\n * @param {Object} [thisArg] See {@link Collection#filter}.\n * @returns {Array} See {@link Collection#filter}.\n * @see Collection#filter\n * @see Collection#filter\n * @since 3.0.0\n */\n 'filter',\n\n /**\n * Wrapper for {@link Collection#get}.\n *\n * @example SimpleStore#get\n * // import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('post')\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ])\n *\n * console.log(store.get('post', 1)) // {...}\n * console.log(store.get('post', 2)) // undefined\n *\n * @method SimpleStore#get\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Collection#get}.\n * @returns {(Object|Record)} See {@link Collection#get}.\n * @see Collection#get\n * @see Collection#get\n * @since 3.0.0\n */\n 'get',\n\n /**\n * Wrapper for {@link Collection#getAll}.\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' })\n *\n * @example\n * // Same as above\n * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' })\n *\n * @method SimpleStore#getAll\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {...Array} [keyList] See {@link Collection#getAll}.\n * @param {Object} [opts] See {@link Collection#getAll}.\n * @returns {Array} See {@link Collection#getAll}.\n * @see Collection#getAll\n * @see Collection#getAll\n * @since 3.0.0\n */\n 'getAll',\n\n /**\n * Wrapper for {@link Collection#prune}.\n *\n * @method SimpleStore#prune\n * @param {Object} [opts] See {@link Collection#prune}.\n * @returns {Array} See {@link Collection#prune}.\n * @see Collection#prune\n * @see Collection#prune\n * @since 3.0.0\n */\n 'prune',\n\n /**\n * Wrapper for {@link Collection#query}.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * store.query('user')\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run()\n *\n * @method SimpleStore#query\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @returns {Query} See {@link Collection#query}.\n * @see Collection#query\n * @see Collection#query\n * @since 3.0.0\n */\n 'query',\n\n /**\n * Wrapper for {@link Collection#toJSON}.\n *\n * @example\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * title: { type: 'string' }\n * }\n * }\n * })\n * store.add('post', [\n * { id: 1, status: 'published', title: 'Respect your Data' },\n * { id: 2, status: 'draft', title: 'Connecting to a data source' }\n * ])\n * console.log(store.toJSON('post'))\n * const draftsJSON = store.query('post')\n * .filter({ status: 'draft' })\n * .mapCall('toJSON')\n * .run()\n *\n * @method SimpleStore#toJSON\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {Object} [opts] See {@link Collection#toJSON}.\n * @returns {Array} See {@link Collection#toJSON}.\n * @see Collection#toJSON\n * @see Collection#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Wrapper for {@link Collection#unsaved}.\n *\n * @method SimpleStore#unsaved\n * @returns {Array} See {@link Collection#unsaved}.\n * @see Collection#unsaved\n * @see Collection#unsaved\n * @since 3.0.0\n */\n 'unsaved'\n]\nconst ownMethodsForScoping = [\n 'addToCache',\n 'cachedFind',\n 'cachedFindAll',\n 'cacheFind',\n 'cacheFindAll',\n 'hashQuery'\n]\n\nconst cachedFn = function (name, hashOrId, opts) {\n const cached = this._completedQueries[name][hashOrId]\n if (utils.isFunction(cached)) {\n return cached(name, hashOrId, opts)\n }\n return cached\n}\n\nconst SIMPLESTORE_DEFAULTS = {\n /**\n * Whether to use the pending query if a `find` request for the specified\n * record is currently underway. Can be set to `true`, `false`, or to a\n * function that returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFind\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFind: true,\n\n /**\n * Whether to use the pending query if a `findAll` request for the given query\n * is currently underway. Can be set to `true`, `false`, or to a function that\n * returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFindAll\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFindAll: true\n}\n\n/**\n * The `SimpleStore` class is an extension of {@link Container}. Not only does\n * `SimpleStore` manage mappers, but also collections. `SimpleStore` implements the\n * asynchronous {@link Mapper} methods, such as {@link Mapper#find} and\n * {@link Mapper#create}. If you use the asynchronous `SimpleStore` methods\n * instead of calling them directly on the mappers, then the results of the\n * method calls will be inserted into the store's collections. You can think of\n * a `SimpleStore` as an [Identity Map](https://en.wikipedia.org/wiki/Identity_map_pattern)\n * for the [ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)\n * (the Mappers).\n *\n * ```javascript\n * import {SimpleStore} from 'js-data'\n * ```\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import HttpAdapter from 'js-data-http'\n * const store = new SimpleStore()\n *\n * // SimpleStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n *\n * // SimpleStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user')\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful SimpleStore)\n * return store.find('user', 1) // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1)\n * console.log(user === cachedUser) // true\n * })\n *\n * @class SimpleStore\n * @extends Container\n * @param {Object} [opts] Configuration options. See {@link Container}.\n * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link SimpleStore#usePendingFindAll}.\n * @returns {SimpleStore}\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-SimpleStore\",\"Working with the SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction SimpleStore (opts) {\n utils.classCallCheck(this, SimpleStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, SIMPLESTORE_DEFAULTS)\n Container.call(this, opts)\n\n this.collectionClass = this.collectionClass || Collection\n this._collections = {}\n this._pendingQueries = {}\n this._completedQueries = {}\n}\n\nconst props = {\n constructor: SimpleStore,\n\n /**\n * Internal method used to handle Mapper responses.\n *\n * @method SimpleStore#_end\n * @private\n * @param {string} name Name of the {@link Collection} to which to\n * add the data.\n * @param {Object} result The result from a Mapper.\n * @param {Object} [opts] Configuration options.\n * @returns {(Object|Array)} Result.\n */\n _end (name, result, opts) {\n let data = opts.raw ? result.data : result\n if (data && utils.isFunction(this.addToCache)) {\n data = this.addToCache(name, data, opts)\n if (opts.raw) {\n result.data = data\n } else {\n result = data\n }\n }\n return result\n },\n\n /**\n * Register a new event listener on this SimpleStore.\n *\n * Proxy for {@link Container#on}. If an event was emitted by a Mapper or\n * Collection in the SimpleStore, then the name of the Mapper or Collection will\n * be prepended to the arugments passed to the provided event handler.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a SimpleStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName) // \"post\"\n * console.log(props.id) // undefined\n * console.log(result.id) // 1234\n * })\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id) // 1234\n * })\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * store.on('add', (mapperName, records) => {\n * console.log(records) // [...]\n * })\n *\n * @example\n * // Listen for \"change\" events on a record\n * store.on('change', (mapperName, record, changes) => {\n * console.log(changes) // { changed: { title: 'Modeling your data' } }\n * })\n * post.title = 'Modeling your data'\n *\n * @method SimpleStore#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n */\n\n /**\n * Used to bind to events emitted by collections in this store.\n *\n * @method SimpleStore#_onCollectionEvent\n * @private\n * @param {string} name Name of the collection that emitted the event.\n * @param {...*} [args] Args passed to {@link Collection#emit}.\n */\n _onCollectionEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * This method takes the data received from {@link SimpleStore#find},\n * {@link SimpleStore#findAll}, {@link SimpleStore#update}, etc., and adds the\n * data to the store. _You don't need to call this method directly._\n *\n * If you're using the http adapter and your response data is in an unexpected\n * format, you may need to override this method so the right data gets added\n * to the store.\n *\n * @example\n * const store = new SimpleStore({\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items\n * }\n * // Now perform default behavior\n * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items\n * }\n * // Now perform default behavior\n * return super.addToCache(mapperName, data, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#addToCache\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {*} data Data from which data should be selected for add.\n * @param {Object} [opts] Configuration options.\n */\n addToCache (name, data, opts) {\n return this.getCollection(name).add(data, opts)\n },\n\n /**\n * Return the store scoped to a particular mapper/collection pair.\n *\n * @example SimpleStore.as\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * const UserMapper = store.defineMapper('user')\n * const UserStore = store.as('user')\n *\n * const user1 = store.createRecord('user', { name: 'John' })\n * const user2 = UserStore.createRecord({ name: 'John' })\n * const user3 = UserMapper.createRecord({ name: 'John' })\n * console.log(user1 === user2)\n * console.log(user2 === user3)\n * console.log(user1 === user3)\n *\n * @method SimpleStore#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} The store, scoped to a particular Mapper/Collection pair.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n const methods = ownMethodsForScoping\n .concat(proxiedMapperMethods)\n .concat(proxiedCollectionMethods)\n\n methods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n props.getCollection = {\n writable: true,\n value () {\n return original.getCollection(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Retrieve a cached `find` result, if any. This method is called during\n * {@link SimpleStore#find} to determine if {@link Mapper#find} needs to be\n * called. If this method returns `undefined` then {@link Mapper#find} will\n * be called. Otherwise {@link SimpleStore#find} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return\n * }\n * // Otherwise perform default behavior\n * return super.cachedFind(mapperName, id, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cachedFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cachedFind: cachedFn,\n\n /**\n * Retrieve a cached `findAll` result, if any. This method is called during\n * {@link SimpleStore#findAll} to determine if {@link Mapper#findAll} needs to be\n * called. If this method returns `undefined` then {@link Mapper#findAll} will\n * be called. Otherwise {@link SimpleStore#findAll} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined\n * }\n * // Otherwise perform default behavior\n * return super.cachedFindAll(mapperName, hash, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cachedFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cachedFindAll: cachedFn,\n\n /**\n * Mark a {@link Mapper#find} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `find` entry is\n * added it means subsequent calls to the same Resource with the same `id`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#get} instead of delegating to {@link Mapper#find}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior\n * return super.cacheFind(mapperName, data, id, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cacheFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {*} data The result to cache.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cacheFind (name, data, id, opts) {\n this._completedQueries[name][id] = (name, id, opts) => this.get(name, id)\n },\n\n /**\n * Mark a {@link Mapper#findAll} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `findAll` entry is\n * added it means subsequent calls to the same Resource with the same `query`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#filter} instead of delegating to {@link Mapper#findAll}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior.\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts)\n * }\n * })\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return\n * }\n * // Otherwise perform default behavior.\n * return super.cachedFindAll(mapperName, data, hash, opts)\n * }\n * }\n * const store = new MyStore()\n *\n * @method SimpleStore#cacheFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {*} data The result to cache.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {Object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cacheFindAll (name, data, hash, opts) {\n this._completedQueries[name][hash] = (name, hash, opts) => this.filter(name, utils.fromJson(hash))\n },\n\n /**\n * Remove __all__ records from the in-memory store and reset\n * {@link SimpleStore#_completedQueries}.\n *\n * @method SimpleStore#clear\n * @returns {Object} Object containing all records that were in the store.\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n clear () {\n const removed = {}\n utils.forOwn(this._collections, (collection, name) => {\n removed[name] = collection.removeAll()\n this._completedQueries[name] = {}\n })\n return removed\n },\n\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~beforeCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreate\n * @see SimpleStore~beforeCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate)\n *\n * @callback SimpleStore~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see SimpleStore#event:beforeCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~afterCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreate\n * @see SimpleStore~afterCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate)\n *\n * @callback SimpleStore~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see SimpleStore#event:afterCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}. Adds the created record to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book {\"author_id\":1234,...}\n * store.create('book', {\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }).then((book) => {\n * console.log(book.id) // 120392\n * console.log(book.title) // \"Respect your Data\"\n * })\n *\n * @fires SimpleStore#beforeCreate\n * @fires SimpleStore#afterCreate\n * @fires SimpleStore#add\n * @method SimpleStore#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} record Passed to {@link Mapper#create}.\n * @param {Object} [opts] Passed to {@link Mapper#create}. See\n * {@link Mapper#create} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n create (name, record, opts) {\n opts || (opts = {})\n return Container.prototype.create.call(this, name, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~beforeCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreateMany\n * @see SimpleStore~beforeCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany)\n *\n * @callback SimpleStore~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see SimpleStore#event:beforeCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~afterCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreateMany\n * @see SimpleStore~afterCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany)\n *\n * @callback SimpleStore~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see SimpleStore#event:afterCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}. Adds the created records to the\n * store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book [{\"author_id\":1234,...},{...}]\n * store.createMany('book', [{\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }, {\n * author_id: 1234,\n * edition: 'Second Edition',\n * title: 'Respect your Data'\n * }]).then((books) => {\n * console.log(books[0].id) // 142394\n * console.log(books[0].title) // \"Respect your Data\"\n * })\n *\n * @fires SimpleStore#beforeCreateMany\n * @fires SimpleStore#afterCreateMany\n * @fires SimpleStore#add\n * @method SimpleStore#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Array} records Passed to {@link Mapper#createMany}.\n * @param {Object} [opts] Passed to {@link Mapper#createMany}. See\n * {@link Mapper#createMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n createMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.createMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n defineMapper (name, opts) {\n const self = this\n const mapper = Container.prototype.defineMapper.call(self, name, opts)\n self._pendingQueries[name] = {}\n self._completedQueries[name] = {}\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n\n let collectionOpts = {\n // Make sure the collection has somewhere to store \"added\" timestamps\n _added: {},\n // Give the collection a reference to this SimpleStore\n datastore: self,\n // The mapper tied to the collection\n mapper\n }\n\n if (opts && ('onConflict' in opts)) {\n collectionOpts.onConflict = opts.onConflict\n }\n\n // The SimpleStore uses a subclass of Collection that is \"SimpleStore-aware\"\n const collection = self._collections[name] = new self.collectionClass(null, collectionOpts) // eslint-disable-line\n\n const schema = mapper.schema || {}\n const properties = schema.properties || {}\n // TODO: Make it possible index nested properties?\n utils.forOwn(properties, function (opts, prop) {\n if (opts.indexed) {\n collection.createIndex(prop)\n }\n })\n\n // Create a secondary index on the \"added\" timestamps of records in the\n // collection\n collection.createIndex('addedTimestamps', ['$'], {\n fieldGetter (obj) {\n return collection._added[collection.recordId(obj)]\n }\n })\n\n collection.on('all', function (...args) {\n self._onCollectionEvent(name, ...args)\n })\n\n return mapper\n },\n\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~beforeDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroy\n * @see SimpleStore~beforeDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy)\n *\n * @callback SimpleStore~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see SimpleStore#event:beforeDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~afterDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroy\n * @see SimpleStore~afterDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy)\n *\n * @callback SimpleStore~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see SimpleStore#event:afterDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}. Removes any destroyed record from the\n * in-memory store. Clears out any {@link SimpleStore#_completedQueries} entries\n * associated with the provided `id`.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' })\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is no longer in the in-memory store\n * console.log(store.get('book', 1234)) // undefined\n *\n * return store.find('book', 1234)\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book) // undefined\n * })\n *\n * @fires SimpleStore#beforeDestroy\n * @fires SimpleStore#afterDestroy\n * @fires SimpleStore#remove\n * @method SimpleStore#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#destroy}.\n * @param {Object} [opts] Passed to {@link Mapper#destroy}. See\n * {@link Mapper#destroy} for more configuration options.\n * @returns {Promise} Resolves when the destroy operation completes.\n * @since 3.0.0\n */\n destroy (name, id, opts) {\n opts || (opts = {})\n return Container.prototype.destroy.call(this, name, id, opts).then((result) => {\n const record = this.getCollection(name).remove(id, opts)\n\n if (opts.raw) {\n result.data = record\n } else {\n result = record\n }\n delete this._pendingQueries[name][id]\n delete this._completedQueries[name][id]\n return result\n })\n },\n\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroyAll\n * @see SimpleStore~beforeDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll)\n *\n * @callback SimpleStore~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see SimpleStore#event:beforeDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~afterDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroyAll\n * @see SimpleStore~afterDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll)\n *\n * @callback SimpleStore~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see SimpleStore#event:afterDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}. Removes any destroyed records from\n * the in-memory store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' })\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is gone from the in-memory store\n * console.log(store.get('book', 1234)) // undefined\n * return store.find('book', 1234)\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book) // undefined\n * })\n *\n * @fires SimpleStore#beforeDestroyAll\n * @fires SimpleStore#afterDestroyAll\n * @fires SimpleStore#remove\n * @method SimpleStore#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] Passed to {@link Mapper#destroyAll}.\n * @param {Object} [opts] Passed to {@link Mapper#destroyAll}. See\n * {@link Mapper#destroyAll} for more configuration options.\n * @returns {Promise} Resolves when the delete completes.\n * @since 3.0.0\n */\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return Container.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n const records = this.getCollection(name).removeAll(query, opts)\n\n if (opts.raw) {\n result.data = records\n } else {\n result = records\n }\n const hash = this.hashQuery(name, query, opts)\n delete this._pendingQueries[name][hash]\n delete this._completedQueries[name][hash]\n return result\n })\n },\n\n eject (name, id, opts) {\n console.warn('DEPRECATED: \"eject\" is deprecated, use \"remove\" instead')\n return this.remove(name, id, opts)\n },\n\n ejectAll (name, query, opts) {\n console.warn('DEPRECATED: \"ejectAll\" is deprecated, use \"removeAll\" instead')\n return this.removeAll(name, query, opts)\n },\n\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~beforeFindListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFind\n * @see SimpleStore~beforeFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind)\n *\n * @callback SimpleStore~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see SimpleStore#event:beforeFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~afterFindListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFind\n * @see SimpleStore~afterFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind)\n *\n * @callback SimpleStore~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see SimpleStore#event:afterFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}. Adds any found record to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('book')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /book/1234\n * store.find('book', 1234).then((book) => {\n * // The book record is now in the in-memory store\n * console.log(store.get('book', 1234) === book) // true\n * })\n *\n * @fires SimpleStore#beforeFind\n * @fires SimpleStore#afterFind\n * @fires SimpleStore#add\n * @method SimpleStore#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#find}.\n * @param {Object} [opts] Passed to {@link Mapper#find}.\n * @param {boolean} [opts.force] Bypass cacheFind\n * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n find (name, id, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const pendingQuery = this._pendingQueries[name][id]\n const usePendingFind = opts.usePendingFind === undefined ? this.usePendingFind : opts.usePendingFind\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFind) ? usePendingFind.call(this, name, id, opts) : usePendingFind)) {\n return pendingQuery\n }\n const item = this.cachedFind(name, id, opts)\n\n if (opts.force || !item) {\n const promise = this._pendingQueries[name][id] = Container.prototype.find.call(this, name, id, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][id]\n result = this._end(name, result, opts)\n this.cacheFind(name, result, id, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][id]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(item)\n },\n\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~beforeFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFindAll\n * @see SimpleStore~beforeFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll)\n *\n * @callback SimpleStore~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see SimpleStore#event:beforeFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~afterFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFindAll\n * @see SimpleStore~afterFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll)\n *\n * @callback SimpleStore~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see SimpleStore#event:afterFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#findAll}. Adds any found records to the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('movie')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /movie?rating=PG\n * store.find('movie', { rating: 'PG' }).then((movies) => {\n * // The movie records are now in the in-memory store\n * console.log(store.filter('movie'))\n * })\n *\n * @fires SimpleStore#beforeFindAll\n * @fires SimpleStore#afterFindAll\n * @fires SimpleStore#add\n * @method SimpleStore#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} [query] Passed to {@link Mapper.findAll}.\n * @param {Object} [opts] Passed to {@link Mapper.findAll}.\n * @param {boolean} [opts.force] Bypass cacheFindAll\n * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n findAll (name, query, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const hash = this.hashQuery(name, query, opts)\n const pendingQuery = this._pendingQueries[name][hash]\n const usePendingFindAll = opts.usePendingFindAll === undefined ? this.usePendingFindAll : opts.usePendingFindAll\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFindAll) ? usePendingFindAll.call(this, name, query, opts) : usePendingFindAll)) {\n return pendingQuery\n }\n\n const items = this.cachedFindAll(name, hash, opts)\n\n if (opts.force || !items) {\n const promise = this._pendingQueries[name][hash] = Container.prototype.findAll.call(this, name, query, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][hash]\n result = this._end(name, result, opts)\n this.cacheFindAll(name, result, hash, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][hash]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(items)\n },\n\n /**\n * Return the {@link Collection} with the given name, if for some\n * reason you need a direct reference to the collection.\n *\n * @method SimpleStore#getCollection\n * @param {string} name Name of the {@link Collection} to retrieve.\n * @returns {Collection}\n * @since 3.0.0\n * @throws {Error} Thrown if the specified {@link Collection} does not\n * exist.\n */\n getCollection (name) {\n const collection = this._collections[name]\n if (!collection) {\n throw utils.err(`${DOMAIN}#getCollection`, name)(404, 'collection')\n }\n return collection\n },\n\n /**\n * Hashing function used to cache {@link SimpleStore#find} and\n * {@link SimpleStore#findAll} requests. This method simply JSONifies the\n * `query` argument passed to {@link SimpleStore#find} or\n * {@link SimpleStore#findAll}.\n *\n * Override this method for custom hashing behavior.\n * @method SimpleStore#hashQuery\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @param {Object} query The `query` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @returns {string} The JSONified `query`.\n * @since 3.0.0\n */\n hashQuery (name, query, opts) {\n return utils.toJson(query || {})\n },\n\n inject (name, records, opts) {\n console.warn('DEPRECATED: \"inject\" is deprecated, use \"add\" instead')\n return this.add(name, records, opts)\n },\n\n /**\n * Wrapper for {@link Collection#remove}. Removes the specified\n * {@link Record} from the store.\n *\n * @example SimpleStore#remove\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('book')\n * console.log(store.getAll('book').length)\n * store.add('book', { id: 1234 })\n * console.log(store.getAll('book').length)\n * store.remove('book', 1234)\n * console.log(store.getAll('book').length)\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#remove\n * @param {string} name The name of the {@link Collection} to target.\n * @param {string|number} id The primary key of the {@link Record} to remove.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n remove (name, id, opts) {\n const record = this.getCollection(name).remove(id, opts)\n if (record) {\n this.removeRelated(name, [record], opts)\n }\n return record\n },\n\n /**\n * Wrapper for {@link Collection#removeAll}. Removes the selected\n * {@link Record}s from the store.\n *\n * @example SimpleStore#removeAll\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * const store = new SimpleStore()\n * store.defineMapper('movie')\n * console.log(store.getAll('movie').length)\n * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' })\n * console.log(store.getAll('movie').length)\n * store.removeAll('movie', { rating: 'R' })\n * console.log(store.getAll('movie').length)\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeAll\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Object} [query={}] Selection query. See {@link query}.\n * @param {Object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}s, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n removeAll (name, query, opts) {\n if (!query || !Object.keys(query).length) {\n this._completedQueries[name] = {}\n } else {\n this._completedQueries[name][this.hashQuery(name, query, opts)] = undefined\n }\n const records = this.getCollection(name).removeAll(query, opts)\n if (records.length) {\n this.removeRelated(name, records, opts)\n }\n return records\n },\n\n /**\n * Remove from the store {@link Record}s that are related to the provided\n * {@link Record}(s).\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeRelated\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Record|Record[]} records {@link Record}s whose relations are to be\n * removed.\n * @param {Object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove\n * from the store.\n * @since 3.0.0\n */\n removeRelated (name, records, opts) {\n if (!utils.isArray(records)) {\n records = [records]\n }\n utils.forEachRelation(this.getMapper(name), opts, (def, optsCopy) => {\n records.forEach((record) => {\n let relatedData\n let query\n if (def.foreignKey && (def.type === hasOneType || def.type === hasManyType)) {\n query = { [def.foreignKey]: def.getForeignKey(record) }\n } else if (def.type === hasManyType && def.localKeys) {\n query = {\n where: {\n [def.getRelation().idAttribute]: {\n 'in': utils.get(record, def.localKeys)\n }\n }\n }\n } else if (def.type === hasManyType && def.foreignKeys) {\n query = {\n where: {\n [def.foreignKeys]: {\n 'contains': def.getForeignKey(record)\n }\n }\n }\n } else if (def.type === belongsToType) {\n relatedData = this.remove(def.relation, def.getForeignKey(record), optsCopy)\n }\n if (query) {\n relatedData = this.removeAll(def.relation, query, optsCopy)\n }\n if (relatedData) {\n if (utils.isArray(relatedData) && !relatedData.length) {\n return\n }\n if (def.type === hasOneType) {\n relatedData = relatedData[0]\n }\n def.setLocalField(record, relatedData)\n }\n })\n })\n },\n\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~beforeUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdate\n * @see SimpleStore~beforeUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate)\n *\n * @callback SimpleStore~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see SimpleStore#event:beforeUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~afterUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdate\n * @see SimpleStore~afterUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate)\n *\n * @callback SimpleStore~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see SimpleStore#event:afterUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}. Adds the updated {@link Record} to the\n * store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post/1234 {\"status\":\"published\"}\n * store.update('post', 1, { status: 'published' }).then((post) => {\n * // The post record has also been updated in the in-memory store\n * console.log(store.get('post', 1234))\n * })\n *\n * @fires SimpleStore#beforeUpdate\n * @fires SimpleStore#afterUpdate\n * @fires SimpleStore#add\n * @method SimpleStore#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#update}.\n * @param {Object} record Passed to {@link Mapper#update}.\n * @param {Object} [opts] Passed to {@link Mapper#update}. See\n * {@link Mapper#update} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n update (name, id, record, opts) {\n opts || (opts = {})\n return Container.prototype.update.call(this, name, id, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateAll\n * @see SimpleStore~beforeUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll)\n *\n * @callback SimpleStore~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see SimpleStore#event:beforeUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~afterUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateAll\n * @see SimpleStore~afterUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll)\n *\n * @callback SimpleStore~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see SimpleStore#event:afterUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post?author_id=1234 {\"status\":\"published\"}\n * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.filter('posts', { author_id: 1234 }))\n * })\n *\n * @fires SimpleStore#beforeUpdateAll\n * @fires SimpleStore#afterUpdateAll\n * @fires SimpleStore#add\n * @method SimpleStore#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object} props Passed to {@link Mapper#updateAll}.\n * @param {Object} [query] Passed to {@link Mapper#updateAll}.\n * @param {Object} [opts] Passed to {@link Mapper#updateAll}. See\n * {@link Mapper#updateAll} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateAll (name, props, query, opts) {\n opts || (opts = {})\n return Container.prototype.updateAll.call(this, name, props, query, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateMany\n * @see SimpleStore~beforeUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany)\n *\n * @callback SimpleStore~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see SimpleStore#event:beforeUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~afterUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateMany\n * @see SimpleStore~afterUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany)\n *\n * @callback SimpleStore~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {Object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see SimpleStore#event:afterUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * import {HttpAdapter} from 'js-data-http'\n *\n * const store = new SimpleStore()\n * store.registerAdapter('http', new HttpAdapter(), { default: true })\n *\n * store.defineMapper('post')\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post [{\"id\":3,status\":\"published\"},{\"id\":4,status\":\"published\"}]\n * store.updateMany('post', [\n * { id: 3, status: 'published' },\n * { id: 4, status: 'published' }\n * ]).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.getAll('post', 3, 4))\n * })\n *\n * @fires SimpleStore#beforeUpdateMany\n * @fires SimpleStore#afterUpdateMany\n * @fires SimpleStore#add\n * @method SimpleStore#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}.\n * @param {Object} [opts] Passed to {@link Mapper#updateMany}. See\n * {@link Mapper#updateMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.updateMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n }\n}\n\nproxiedCollectionMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getCollection(name)[method](...args)\n }\n})\n\nexport default Container.extend(props)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link SimpleStore~changeListener} on how to listen for this event.\n *\n * @event SimpleStore#change\n * @see SimpleStore~changeListener\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:change} event.\n *\n * @example\n * function onChange (mapperName, record, changes) {\n * // do something\n * }\n * store.on('change', onChange)\n *\n * @callback SimpleStore~changeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record} record The Record that changed.\n * @param {Object} changes The changes.\n * @see SimpleStore#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the in-memory store. See\n * {@link SimpleStore~addListener} on how to listen for this event.\n *\n * @event SimpleStore#add\n * @see SimpleStore~addListener\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:add} event.\n *\n * @example\n * function onAdd (mapperName, recordOrRecords) {\n * // do something\n * }\n * store.on('add', onAdd)\n *\n * @callback SimpleStore~addListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} The Record or Records that were added.\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the in-memory store. See\n * {@link SimpleStore~removeListener} for how to listen for this event.\n *\n * @event SimpleStore#remove\n * @see SimpleStore~removeListener\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:remove} event.\n *\n * @example\n * function onRemove (mapperName, recordsOrRecords) {\n * // do something\n * }\n * store.on('remove', onRemove)\n *\n * @callback SimpleStore~removeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} Record or Records that were removed.\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this SimpleStore:\n * @example SimpleStore.extend\n * // Normally you would do: import {SimpleStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {SimpleStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSimpleStoreClass extends SimpleStore {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customSimpleStore = new CustomSimpleStoreClass()\n * console.log(customSimpleStore.foo())\n * console.log(CustomSimpleStoreClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherSimpleStoreClass = SimpleStore.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherSimpleStore = new OtherSimpleStoreClass()\n * console.log(otherSimpleStore.foo())\n * console.log(OtherSimpleStoreClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSimpleStoreClass () {\n * SimpleStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * SimpleStore.extend({\n * constructor: AnotherSimpleStoreClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherSimpleStore = new AnotherSimpleStoreClass()\n * console.log(anotherSimpleStore.created_at)\n * console.log(anotherSimpleStore.foo())\n * console.log(AnotherSimpleStoreClass.beep())\n *\n * @method SimpleStore.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this SimpleStore class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport './decorators'\nimport Collection from './Collection'\n\nconst DOMAIN = 'LinkedCollection'\n\n/**\n * Extends {@link Collection}. Used by a {@link DataStore} to implement an\n * Identity Map.\n *\n * ```javascript\n * import {LinkedCollection} from 'js-data'\n * ```\n *\n * @class LinkedCollection\n * @extends Collection\n * @param {Array} [records] Initial set of records to insert into the\n * collection. See {@link Collection}.\n * @param {Object} [opts] Configuration options. See {@link Collection}.\n * @returns {Mapper}\n */\nfunction LinkedCollection (records, opts) {\n utils.classCallCheck(this, LinkedCollection)\n // Make sure this collection has somewhere to store \"added\" timestamps\n Object.defineProperties(this, {\n _added: {\n value: {}\n },\n datastore: {\n writable: true,\n value: undefined\n }\n })\n\n Collection.call(this, records, opts)\n\n // Make sure this collection has a reference to a datastore\n if (!this.datastore) {\n throw utils.err(`new ${DOMAIN}`, 'opts.datastore')(400, 'DataStore', this.datastore)\n }\n}\n\nexport default Collection.extend({\n constructor: LinkedCollection,\n\n _addMeta (record, timestamp) {\n // Track when this record was added\n this._added[this.recordId(record)] = timestamp\n\n if (utils.isFunction(record._set)) {\n record._set('$', timestamp)\n }\n },\n\n _clearMeta (record) {\n delete this._added[this.recordId(record)]\n if (utils.isFunction(record._set)) {\n record._set('$') // unset\n }\n },\n\n _onRecordEvent (...args) {\n Collection.prototype._onRecordEvent.apply(this, args)\n const event = args[0]\n // This is a very brute force method\n // Lots of room for optimization\n if (utils.isString(event) && event.indexOf('change') === 0) {\n this.updateIndexes(args[1])\n }\n },\n\n add (records, opts) {\n const mapper = this.mapper\n const timestamp = new Date().getTime()\n const singular = utils.isObject(records) && !utils.isArray(records)\n\n if (singular) {\n records = [records]\n }\n records = Collection.prototype.add.call(this, records, opts)\n\n if (mapper.relationList.length && records.length) {\n // Check the currently visited record for relations that need to be\n // inserted into their respective collections.\n mapper.relationList.forEach(function (def) {\n def.addLinkedRecords(records)\n })\n }\n\n records.forEach((record) => this._addMeta(record, timestamp))\n\n return singular ? records[0] : records\n },\n\n remove (idOrRecord, opts) {\n const mapper = this.mapper\n const record = Collection.prototype.remove.call(this, idOrRecord, opts)\n if (record) {\n this._clearMeta(record)\n }\n\n if (mapper.relationList.length && record) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, [record])\n })\n }\n\n return record\n },\n\n removeAll (query, opts) {\n const mapper = this.mapper\n const records = Collection.prototype.removeAll.call(this, query, opts)\n records.forEach(this._clearMeta, this)\n\n if (mapper.relationList.length && records.length) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, records)\n })\n }\n\n return records\n }\n})\n\n/**\n * Create a subclass of this LinkedCollection:\n *\n * @example LinkedCollection.extend\n * // Normally you would do: import {LinkedCollection} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {LinkedCollection} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomLinkedCollectionClass extends LinkedCollection {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customLinkedCollection = new CustomLinkedCollectionClass()\n * console.log(customLinkedCollection.foo())\n * console.log(CustomLinkedCollectionClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherLinkedCollectionClass = LinkedCollection.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherLinkedCollection = new OtherLinkedCollectionClass()\n * console.log(otherLinkedCollection.foo())\n * console.log(OtherLinkedCollectionClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherLinkedCollectionClass () {\n * LinkedCollection.call(this)\n * this.created_at = new Date().getTime()\n * }\n * LinkedCollection.extend({\n * constructor: AnotherLinkedCollectionClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherLinkedCollection = new AnotherLinkedCollectionClass()\n * console.log(anotherLinkedCollection.created_at)\n * console.log(anotherLinkedCollection.foo())\n * console.log(AnotherLinkedCollectionClass.beep())\n *\n * @method LinkedCollection.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this LinkedCollection class.\n * @since 3.0.0\n */\n","import utils, { safeSetLink, safeSetProp } from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport SimpleStore from './SimpleStore'\nimport LinkedCollection from './LinkedCollection'\n\nconst DATASTORE_DEFAULTS = {\n /**\n * Whether in-memory relations should be unlinked from records after they are\n * destroyed.\n *\n * @default true\n * @name DataStore#unlinkOnDestroy\n * @since 3.0.0\n * @type {boolean}\n */\n unlinkOnDestroy: true\n}\n\n/**\n * The `DataStore` class is an extension of {@link SimpleStore}. Not only does\n * `DataStore` manage mappers and store data in collections, it uses the\n * {@link LinkedCollection} class to link related records together in memory.\n *\n * ```javascript\n * import {DataStore} from 'js-data'\n * ```\n *\n * @example\n * import {DataStore} from 'js-data'\n * import HttpAdapter from 'js-data-http'\n * const store = new DataStore()\n *\n * // DataStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user')\n *\n * // DataStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user')\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful DataStore)\n * return store.find('user', 1) // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1)\n * console.log(user === cachedUser) // true\n * })\n *\n * @class DataStore\n * @extends SimpleStore\n * @param {Object} [opts] Configuration options. See {@link SimpleStore}.\n * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link DataStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link DataStore#usePendingFindAll}.\n * @returns {DataStore}\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-datastore\",\"Working with the DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction DataStore (opts) {\n utils.classCallCheck(this, DataStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, DATASTORE_DEFAULTS)\n opts.collectionClass || (opts.collectionClass = LinkedCollection)\n SimpleStore.call(this, opts)\n}\n\nconst props = {\n constructor: DataStore,\n\n defineMapper (name, opts) {\n // Complexity of this method is beyond simply using => functions to bind context\n const self = this\n const mapper = SimpleStore.prototype.defineMapper.call(self, name, opts)\n const idAttribute = mapper.idAttribute\n const collection = this.getCollection(name)\n\n mapper.relationList.forEach(function (def) {\n const relation = def.relation\n const localField = def.localField\n const path = `links.${localField}`\n const foreignKey = def.foreignKey\n const type = def.type\n const updateOpts = { index: foreignKey }\n let descriptor\n\n const getter = function () { return this._get(path) }\n\n if (type === belongsToType) {\n if (!collection.indexes[foreignKey]) {\n collection.createIndex(foreignKey)\n }\n\n descriptor = {\n get: getter,\n // e.g. profile.user = someUser\n // or comment.post = somePost\n set (record) {\n // e.g. const otherUser = profile.user\n const currentParent = this._get(path)\n // e.g. profile.user === someUser\n if (record === currentParent) {\n return currentParent\n }\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n\n // e.g. profile.user !== someUser\n // or comment.post !== somePost\n if (currentParent && inverseDef) {\n this.removeInverseRelation(currentParent, id, inverseDef, idAttribute)\n }\n if (record) {\n // e.g. profile.user = someUser\n const relatedIdAttribute = def.getRelation().idAttribute\n const relatedId = utils.get(record, relatedIdAttribute)\n\n // Prefer store record\n if (relatedId !== undefined && this._get('$')) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n // e.g. profile.user = someUser\n // or comment.post = somePost\n safeSetLink(this, localField, record)\n safeSetProp(this, foreignKey, relatedId)\n collection.updateIndex(this, updateOpts)\n\n if (inverseDef) {\n this.setupInverseRelation(record, id, inverseDef, idAttribute)\n }\n } else {\n // Unset in-memory link only\n // e.g. profile.user = undefined\n // or comment.post = undefined\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n\n let foreignKeyDescriptor = Object.getOwnPropertyDescriptor(mapper.recordClass.prototype, foreignKey)\n if (!foreignKeyDescriptor) {\n foreignKeyDescriptor = {\n enumerable: true\n }\n }\n const originalGet = foreignKeyDescriptor.get\n foreignKeyDescriptor.get = function () {\n if (originalGet) {\n return originalGet.call(this)\n }\n return this._get(`props.${foreignKey}`)\n }\n const originalSet = foreignKeyDescriptor.set\n foreignKeyDescriptor.set = function (value) {\n if (originalSet) {\n originalSet.call(this, value)\n }\n const currentParent = utils.get(this, localField)\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n const currentParentId = currentParent ? utils.get(currentParent, def.getRelation().idAttribute) : undefined\n\n if (currentParent && currentParentId !== undefined && currentParentId !== value) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n }\n\n safeSetProp(this, foreignKey, value)\n collection.updateIndex(this, updateOpts)\n\n if ((value === undefined || value === null)) {\n if (currentParentId !== undefined) {\n // Unset locals\n utils.set(this, localField, undefined)\n }\n } else if (this._get('$')) {\n const storeRecord = self.get(relation, value)\n if (storeRecord) {\n utils.set(this, localField, storeRecord)\n }\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, foreignKey, foreignKeyDescriptor)\n } else if (type === hasManyType) {\n const localKeys = def.localKeys\n const foreignKeys = def.foreignKeys\n\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n\n descriptor = {\n get () {\n let current = getter.call(this)\n if (!current) {\n this._set(path, [])\n }\n return getter.call(this)\n },\n // e.g. post.comments = someComments\n // or user.groups = someGroups\n // or group.users = someUsers\n set (records) {\n if (records && !utils.isArray(records)) {\n records = [records]\n }\n const id = utils.get(this, idAttribute)\n const relatedIdAttribute = def.getRelation().idAttribute\n const inverseDef = def.getInverse(mapper)\n const inverseLocalField = inverseDef.localField\n const current = this._get(path) || []\n const toLink = []\n const toLinkIds = {}\n\n if (records) {\n records.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n const currentParent = utils.get(record, inverseLocalField)\n if (currentParent && currentParent !== this) {\n const currentChildrenOfParent = utils.get(currentParent, localField)\n // e.g. somePost.comments.remove(comment)\n if (relatedId === undefined) {\n utils.remove(currentChildrenOfParent, (child) => child === record)\n } else {\n utils.remove(currentChildrenOfParent, (child) => child === record || relatedId === utils.get(child, relatedIdAttribute))\n }\n }\n if (relatedId !== undefined) {\n if (this._get('$')) {\n // Prefer store record\n record = self.get(relation, relatedId) || record\n }\n // e.g. toLinkIds[comment.id] = comment\n toLinkIds[relatedId] = record\n }\n toLink.push(record)\n })\n }\n\n // e.g. post.comments = someComments\n if (foreignKey) {\n current.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(record) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update (unset) inverse relation\n if (records) {\n // e.g. comment.post_id = undefined\n safeSetProp(record, foreignKey, undefined)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n }\n // e.g. comment.post = undefined\n safeSetLink(record, inverseLocalField, undefined)\n }\n })\n toLink.forEach((record) => {\n // Update (set) inverse relation\n // e.g. comment.post_id = post.id\n safeSetProp(record, foreignKey, id)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n // e.g. comment.post = post\n safeSetLink(record, inverseLocalField, this)\n })\n } else if (localKeys) {\n // Update locals\n // e.g. group.users = someUsers\n // Update (set) inverse relation\n const ids = toLink.map((child) => utils.get(child, relatedIdAttribute)).filter((id) => id !== undefined)\n // e.g. group.user_ids = [1,2,3,...]\n utils.set(this, localKeys, ids)\n // Update (unset) inverse relation\n if (inverseDef.foreignKeys) {\n current.forEach((child) => {\n const relatedId = utils.get(child, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(child) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update inverse relation\n // safeSetLink(child, inverseLocalField, undefined)\n const parents = utils.get(child, inverseLocalField) || []\n // e.g. someUser.groups.remove(group)\n if (id === undefined) {\n utils.remove(parents, (parent) => parent === this)\n } else {\n utils.remove(parents, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n }\n })\n toLink.forEach((child) => {\n // Update (set) inverse relation\n const parents = utils.get(child, inverseLocalField)\n // e.g. someUser.groups.push(group)\n if (id === undefined) {\n utils.noDupeAdd(parents, this, (parent) => parent === this)\n } else {\n utils.noDupeAdd(parents, this, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n })\n }\n } else if (foreignKeys) {\n // e.g. user.groups = someGroups\n // Update (unset) inverse relation\n current.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n // e.g. someGroup.user_ids.remove(user.id)\n utils.remove(ids, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n // e.g. someGroup.users.remove(user)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n // Update (set) inverse relation\n toLink.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n utils.noDupeAdd(ids, id, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n }\n\n this._set(path, toLink)\n return toLink\n }\n }\n } else if (type === hasOneType) {\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n descriptor = {\n get: getter,\n // e.g. user.profile = someProfile\n set (record) {\n const current = this._get(path)\n if (record === current) {\n return current\n }\n const inverseLocalField = def.getInverse(mapper).localField\n // Update (unset) inverse relation\n if (current) {\n safeSetProp(current, foreignKey, undefined)\n self.getCollection(relation).updateIndex(current, updateOpts)\n safeSetLink(current, inverseLocalField, undefined)\n }\n if (record) {\n const relatedId = utils.get(record, def.getRelation().idAttribute)\n // Prefer store record\n if (relatedId !== undefined) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n safeSetLink(this, localField, record)\n\n // Update (set) inverse relation\n safeSetProp(record, foreignKey, utils.get(this, idAttribute))\n self.getCollection(relation).updateIndex(record, updateOpts)\n safeSetLink(record, inverseLocalField, this)\n } else {\n // Unset locals\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n }\n\n if (descriptor) {\n descriptor.enumerable = def.enumerable === undefined ? false : def.enumerable\n if (def.get) {\n let origGet = descriptor.get\n descriptor.get = function () {\n return def.get(def, this, (...args) => origGet.apply(this, args))\n }\n }\n if (def.set) {\n let origSet = descriptor.set\n descriptor.set = function (related) {\n return def.set(def, this, related, (value) => origSet.call(this, value === undefined ? related : value))\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, localField, descriptor)\n }\n })\n\n return mapper\n },\n\n destroy (name, id, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroy.call(this, name, id, opts).then((result) => {\n let record\n if (opts.raw) {\n record = result.data\n } else {\n record = result\n }\n\n if (record && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n utils.set(record, def.localField, undefined)\n })\n }\n return result\n })\n },\n\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n let records\n if (opts.raw) {\n records = result.data\n } else {\n records = result\n }\n\n if (records && records.length && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n records.forEach((record) => {\n utils.set(record, def.localField, undefined)\n })\n })\n }\n return result\n })\n }\n}\n\nexport default SimpleStore.extend(props)\n\n/**\n * Create a subclass of this DataStore:\n * @example DataStore.extend\n * // Normally you would do: import {DataStore} from 'js-data'\n * const JSData = require('js-data@3.0.0-rc.4')\n * const {DataStore} = JSData\n * console.log('Using JSData v' + JSData.version.full)\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomDataStoreClass extends DataStore {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customDataStore = new CustomDataStoreClass()\n * console.log(customDataStore.foo())\n * console.log(CustomDataStoreClass.beep())\n *\n * // Extend the class using alternate method.\n * const OtherDataStoreClass = DataStore.extend({\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const otherDataStore = new OtherDataStoreClass()\n * console.log(otherDataStore.foo())\n * console.log(OtherDataStoreClass.beep())\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherDataStoreClass () {\n * DataStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * DataStore.extend({\n * constructor: AnotherDataStoreClass,\n * foo () { return 'bar' }\n * }, {\n * beep () { return 'boop' }\n * })\n * const anotherDataStore = new AnotherDataStoreClass()\n * console.log(anotherDataStore.created_at)\n * console.log(anotherDataStore.foo())\n * console.log(AnotherDataStoreClass.beep())\n *\n * @method DataStore.extend\n * @param {Object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {Object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {Object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this DataStore class.\n * @since 3.0.0\n */\n","/**\n * Registered as `js-data` in NPM and Bower.\n *\n * Also available from CDN.JS and JSDelivr.\n *\n * @module js-data\n *\n * @example Install from NPM\n * npm i --save js-data@beta\n * @example Install from Bower\n * bower i --save js-data@3.0.0-beta.1\n * @example Install from CDN.JS\n * \n * @example Install from JSDelivr\n * \n * @example Load into your app via script tag\n * \n * \n * @example Load into your app via CommonJS\n * var JSData = require('js-data');\n * @example Load into your app via ES2015 Modules\n * import * as JSData from 'js-data';\n * @example Load into your app via AMD\n * define('myApp', ['js-data'], function (JSData) { ... })\n */\n\n/**\n * JSData's utility methods.\n *\n * @example\n * import {utils} from 'js-data'\n * console.log(utils.isString('foo')) // true\n *\n * @name module:js-data.utils\n * @property {Function} Promise See {@link utils.Promise}.\n * @see utils\n * @since 3.0.0\n * @type {Object}\n */\nimport utils from './utils'\n\n/**\n * JSData's {@link Collection} class.\n *\n * @example\n * import {Collection} from 'js-data'\n * const collection = new Collection()\n *\n * @name module:js-data.Collection\n * @see Collection\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#collection\",\"Components of JSData: Collection\"]\n * @type {Constructor}\n */\nimport Collection from './Collection'\n\n/**\n * JSData's {@link Component} class. Most components in JSData extend this\n * class.\n *\n * @example\n * import {Component} from 'js-data'\n * // Make a custom component.\n * const MyComponent = Component.extend({\n * myMethod (someArg) { ... }\n * })\n *\n * @name module:js-data.Component\n * @see Component\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Component from './Component'\n\n/**\n * JSData's {@link Container} class. Defines and manages {@link Mapper}s. Used\n * in Node.js and in the browser, though in the browser you may want to use\n * {@link DataStore} instead.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n *\n * @name module:js-data.Container\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#container\",\"Components of JSData: Container\"]\n * @type {Constructor}\n */\nimport {Container} from './Container'\n\n/**\n * JSData's {@link DataStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import {DataStore} from 'js-data'\n * const store = new DataStore()\n *\n * @name module:js-data.DataStore\n * @see DataStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @type {Constructor}\n */\nimport DataStore from './DataStore'\n\n/**\n * JSData's {@link Index} class, based on [mindex]{@link https://github.com/internalfx/mindex}.\n *\n * @name module:js-data.Index\n * @see Index\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Index from '../lib/mindex/index'\n\n/**\n * JSData's {@link LinkedCollection} class. Used by the {@link DataStore}\n * component. If you need to create a collection manually, you should probably\n * use the {@link Collection} class.\n *\n * @name module:js-data.LinkedCollection\n * @see DataStore\n * @see LinkedCollection\n * @since 3.0.0\n * @type {Constructor}\n */\nimport LinkedCollection from './LinkedCollection'\n\n/**\n * JSData's {@link Mapper} class. The core of the ORM.\n *\n * @example Recommended use\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n *\n * @example Create Mapper manually\n * import {Mapper} from 'js-data'\n * const UserMapper = new Mapper({ name: 'user' })\n *\n * @name module:js-data.Mapper\n * @see Container\n * @see Mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @type {Constructor}\n */\nimport Mapper from './Mapper'\n\n/**\n * JSData's {@link Query} class. Used by the {@link Collection} component.\n *\n * @name module:js-data.Query\n * @see Query\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Query from './Query'\n\n/**\n * JSData's {@link Record} class.\n *\n * @example\n * import {Container} from 'js-data'\n * const store = new Container()\n * store.defineMapper('user')\n * const user = store.createRecord('user')\n *\n * @name module:js-data.Record\n * @see Record\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#record\",\"Components of JSData: Record\"]\n * @type {Constructor}\n */\nimport Record from './Record'\n\n/**\n * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04.\n *\n * @example\n * import {Container, Schema} from 'js-data'\n * const userSchema = new Schema({\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * })\n * const store = new Container()\n * store.defineMapper('user', {\n * schema: userSchema\n * })\n *\n * @name module:js-data.Schema\n * @see Schema\n * @see http://json-schema.org/\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#schema\",\"Components of JSData: schema\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/schemas\",\"JSData's Schema Syntax\"]\n * @type {Constructor}\n */\nimport Schema from './Schema'\n\n/**\n * JSData's {@link Settable} class.\n *\n * @example\n * import {Settable} from 'js-data'\n * const obj = new Settable()\n * obj.set('secret', 'value')\n * console.log(JSON.stringify(obj)) // {}\n *\n * @name module:js-data.Settable\n * @see Settable\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Settable from './Settable'\n\n/**\n * JSData's {@link SimpleStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import {SimpleStore} from 'js-data'\n * const store = new SimpleStore()\n *\n * @name module:js-data.SimpleStore\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @type {Constructor}\n */\nimport SimpleStore from './SimpleStore'\n\n/**\n * Describes the version of this `JSData` object.\n *\n * @example\n * console.log(JSData.version.full) // \"3.0.0-beta.1\"\n *\n * @name version\n * @memberof module:js-data\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n * @since 2.0.0\n * @type {Object}\n */\nexport const version = '<%= version %>'\n\nexport * from './decorators'\n\nexport {\n Collection,\n Component,\n Container,\n DataStore,\n Index,\n LinkedCollection,\n Mapper,\n Query,\n Record,\n Schema,\n Settable,\n SimpleStore,\n utils\n}\n"],"names":["DOMAIN","INFINITY","MAX_INTEGER","BOOL_TAG","DATE_TAG","FUNC_TAG","NUMBER_TAG","OBJECT_TAG","REGEXP_TAG","STRING_TAG","objToString","Object","prototype","toString","PATH","ERRORS","arguments","toInteger","value","sign","remainder","toStr","call","isPlainObject","constructor","mkdirP","object","path","parts","split","forEach","key","utils","Promise","dest","src","forOwn","undefined","isFunction","indexOf","opts","def","fn","thisArg","relationName","relation","containedName","index","with","_getIndex","localField","withAll","optsCopy","fillIn","getRelation","slice","_activeWith","splice","i","length","substr","list","_relation","isObject","target","props","map","keys","propName","descriptor","getOwnPropertyDescriptor","enumerable","defineProperties","newObject","oldObject","diff","diffObjects","diffCount","added","removed","changed","instance","ctor","err","name","from","to","stackFrom","stackTo","blacklist","plain","isArray","copy","isDate","Date","getTime","isRegExp","RegExp","source","match","lastIndex","create","getPrototypeOf","push","result","hasOwnProperty","isBlacklisted","existing","deepFillIn","deepMixIn","equalsFn","ignore","deepEqual","newKeys","filter","oldKeys","oldValue","newValue","a","b","domain","code","prefix","message","apply","Array","Error","getter","setter","_events","events","args","type","shift","listeners","f","c","all","unshift","func","classProps","superClass","subClass","classCallCheck","obj","setPrototypeOf","strictEs6Class","__proto__","defineProperty","addHiddenPropsToTarget","array","record","mapper","relationList","_forRelation","len","json","isString","JSON","parse","prop","last","pop","isCtor","__super__","array1","array2","item","matches","test","isNumber","log","level","debug","toUpperCase","console","findIndex","_props","reduce","reject","resolve","_path","set","exec","_equal","stringify","safeSetProp","field","_set","safeSetLink","Settable","get","unset","extend","Component","writable","logify","eventify","_listeners","INDEX_ERR","reserved","escapeRegExp","percentRegExp","underscoreRegExp","escape","pattern","replace","Query","collection","data","where","fields","ops","predicates","clause","expr","op","groups","_where","prev","parser","_applyWhereFromArray","_applyWhereFromObject","group","isOr","keep","first","charAt","evaluate","_testArrayGroup","_testObjectGroup","leftKeys","rightKeys","getIndex","between","orderBy","cA","cB","temp","compare","predicate","like","query","getData","sort","skip","offset","limit","forEachFn","keyList","concat","getAll","flags","num","Math","min","mapFn","funcName","intersection","belongsToType","hasManyType","hasOneType","Relation","relatedMapper","options","TYPE_NAME","validateOptions","canAutoAddLinks","add","relatedCollection","datastore","getCollection","related","DOMAIN_ERR","foreignKey","localKey","relationFields","idAttribute","relatedRecord","_setForeignKey","relatedRecords","relatedData","inverse","findInverseRelation","isInversedTo","records","getLocalField","linkRecord","isEmptyLinks","canFindLinkFor","findExistingLinksFor","setLocalField","relatedId","unsaved","setForeignKey","id","relationData","is","createRecord","createLinked","then","BelongsToRelation","HasManyRelation","localKeys","foreignKeys","hasForeignKeys","recordId","ids","findExistingLinksByForeignKey","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","HasOneRelation","RelationType","belongsTo","assignTo","hasMany","hasOne","superMethod","store","bind","creatingPath","noValidatePath","keepChangeHistoryPath","previousPath","Record","noValidate","keepChangeHistory","validateOnSet","toJSON","plainCopy","_get","_mapper","quickHasChanges","areDifferent","validate","currentParent","inverseDef","children","remove","child","noDupeAdd","relations","_","adapter","getAdapterName","dbg","tasks","task","forEachRelation","raw","load","isSorN","previous","preserve","commit","postProcess","changesOnly","changes","silent","hashCode","insertAt","removeAt","binarySearch","lo","hi","compared","mid","Index","fieldList","fieldGetter","isIndex","values","pos","found","dataLocation","newIndex","results","order","cb","visitAll","_between","leftKey","rightKey","leftInclusive","rightInclusive","currKey","peek","isUnique","removeRecord","j","insertRecord","COLLECTION_DEFAULTS","Collection","queryClass","emitRecordEvents","emit","beforeAdd","singular","onConflict","existingNoValidate","commitOnMerge","updateIndexes","indexes","on","_onRecordEvent","afterAdd","run","instances","removeAll","Ctor","initialValue","idOrRecord","beforeRemove","off","afterRemove","queryOrRecords","beforeRemoveAll","afterRemoveAll","mapCall","updateRecord","types","isBoolean","isInteger","isNull","segmentToString","segment","str","makePath","segments","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","schema","max","minLengthCommon","validationKeywords","allErrors","allOf","_schema","validated","anyOf","possibleValues","join","items","checkingTuple","maximum","exclusiveMaximum","maxProperties","minimum","exclusiveMinimum","minProperties","multipleOf","not","oneOf","additionalProperties","properties","patternProperties","toValidate","omit","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","changingPath","changedPath","changeHistoryPath","eventIdPath","silentPath","validationFailureMsg","numeric","Schema","definition","_definition","extends","validationKeyword","unsetter","track","makeDescriptor","hasSet","orig","applyDefaults","keyPath","originalGet","_unset","error","current","changing","setTimeout","changeRecord","timestamp","changeHistory","originalSet","pick","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","LIFECYCLE_METHODS","MAPPER_DEFAULTS","Mapper","recordClass","methods","isPrototypeOf","applySchema","_data","wrap","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","_commitChanges","_end","recordOrRecords","newValues","isRequiresParentId","createParentRecord","context","originalProps","isRequiresChildId","createChildRecord","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","ensureLinkedDataHasProperType","RecordCtor","method","config","lifecycleMethods","upper","before","after","defaults","_value","beforeAssign","adapterArgs","getAdapter","_result","getAdapters","defaultAdapter","_adapters","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","conversionOptions","pass","_opts","_record","some","_name","getMapperByName","getMapper","proxiedMapperMethods","Container","mapperDefaults","mapperClass","original","_mappers","_onMapperEvent","defineRelations","warn","defineMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","_completedQueries","SIMPLESTORE_DEFAULTS","SimpleStore","collectionClass","_collections","_pendingQueries","addToCache","hash","fromJson","self","collectionOpts","indexed","createIndex","_added","_onCollectionEvent","destroy","destroyAll","hashQuery","pendingQuery","usePendingFind","cachedFind","force","promise","find","cacheFind","usePendingFindAll","cachedFindAll","findAll","cacheFindAll","toJson","removeRelated","getForeignKey","update","updateAll","updateMany","LinkedCollection","event","addLinkedRecords","_addMeta","_clearMeta","removeLinkedRecords","DATASTORE_DEFAULTS","DataStore","updateOpts","getInverse","removeInverseRelation","relatedIdAttribute","updateIndex","setupInverseRelation","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","_key","origGet","origSet","unlinkOnDestroy","version"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data.js","sources":["../src/utils.js","../src/Settable.js","../src/Component.js","../src/Query.js","../src/Relation.js","../src/Relation/BelongsTo.js","../src/Relation/HasMany.js","../src/Relation/HasOne.js","../src/relations.js","../src/decorators.js","../src/Record.js","../lib/mindex/_utils.js","../lib/mindex/index.js","../src/Collection.js","../src/Schema.js","../src/Mapper.js","../src/Container.js","../src/SimpleStore.js","../src/LinkedCollection.js","../src/DataStore.js","../src/index.js"],"sourcesContent":["/**\n * Utility methods used by JSData.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('foo')); // true\n *\n * @namespace utils\n * @type {Object}\n */\n\nconst DOMAIN = 'utils'\n\nconst INFINITY = 1 / 0\nconst MAX_INTEGER = 1.7976931348623157e+308\nconst BOOL_TAG = '[object Boolean]'\nconst DATE_TAG = '[object Date]'\nconst FUNC_TAG = '[object Function]'\nconst NUMBER_TAG = '[object Number]'\nconst OBJECT_TAG = '[object Object]'\nconst REGEXP_TAG = '[object RegExp]'\nconst STRING_TAG = '[object String]'\nconst objToString = Object.prototype.toString\nconst PATH = /^(.+)\\.(.+)$/\n\nconst ERRORS = {\n '400' () { return `expected: ${arguments[0]}, found: ${arguments[2] ? arguments[1] : typeof arguments[1]}` },\n '404' () { return `${arguments[0]} not found` }\n}\n\nconst toInteger = function (value) {\n if (!value) {\n return 0\n }\n // Coerce to number\n value = +value\n if (value === INFINITY || value === -INFINITY) {\n const sign = (value < 0 ? -1 : 1)\n return sign * MAX_INTEGER\n }\n const remainder = value % 1\n return value === value ? (remainder ? value - remainder : value) : 0 // eslint-disable-line\n}\n\nconst toStr = function (value) {\n return objToString.call(value)\n}\n\nconst isPlainObject = function (value) {\n return (!!value && typeof value === 'object' && value.constructor === Object)\n}\n\nconst mkdirP = function (object, path) {\n if (!path) {\n return object\n }\n const parts = path.split('.')\n parts.forEach(function (key) {\n if (!object[key]) {\n object[key] = {}\n }\n object = object[key]\n })\n return object\n}\n\nconst utils = {\n /**\n * Reference to the Promise constructor used by JSData. Defaults to\n * `window.Promise` or `global.Promise`.\n *\n * @example Make JSData use a different `Promise` constructor\n * import Promise from 'bluebird';\n * import { utils } from 'js-data';\n * utils.Promise = Promise;\n *\n * @name utils.Promise\n * @since 3.0.0\n * @type {Function}\n */\n Promise: Promise,\n\n /**\n * Shallow copy properties that meet the following criteria from `src` to\n * `dest`:\n *\n * - own enumerable\n * - not a function\n * - does not start with \"_\"\n *\n * @method utils._\n * @param {object} dest Destination object.\n * @param {object} src Source object.\n * @private\n * @since 3.0.0\n */\n _ (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (key && dest[key] === undefined && !utils.isFunction(value) && key.indexOf('_') !== 0) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Recursively iterates over relations found in `opts.with`.\n *\n * @method utils._forRelation\n * @param {object} opts Configuration options.\n * @param {Relation} def Relation definition.\n * @param {Function} fn Callback function.\n * @param {*} [thisArg] Execution context for the callback function.\n * @private\n * @since 3.0.0\n */\n _forRelation (opts, def, fn, thisArg) {\n const relationName = def.relation\n let containedName = null\n let index\n opts || (opts = {})\n opts.with || (opts.with = [])\n\n if ((index = utils._getIndex(opts.with, relationName)) >= 0) {\n containedName = relationName\n } else if ((index = utils._getIndex(opts.with, def.localField)) >= 0) {\n containedName = def.localField\n }\n\n if (opts.withAll) {\n fn.call(thisArg, def, {})\n return\n } else if (!containedName) {\n return\n }\n let optsCopy = {}\n utils.fillIn(optsCopy, def.getRelation())\n utils.fillIn(optsCopy, opts)\n optsCopy.with = opts.with.slice()\n optsCopy._activeWith = optsCopy.with.splice(index, 1)[0]\n optsCopy.with.forEach(function (relation, i) {\n if (relation && relation.indexOf(containedName) === 0 && relation.length >= containedName.length && relation[containedName.length] === '.') {\n optsCopy.with[i] = relation.substr(containedName.length + 1)\n } else {\n optsCopy.with[i] = ''\n }\n })\n fn.call(thisArg, def, optsCopy)\n },\n\n /**\n * Find the index of a relation in the given list\n *\n * @method utils._getIndex\n * @param {string[]} list List to search.\n * @param {string} relation Relation to find.\n * @private\n * @returns {number}\n */\n _getIndex (list, relation) {\n let index = -1\n list.forEach(function (_relation, i) {\n if (_relation === relation) {\n index = i\n return false\n } else if (utils.isObject(_relation)) {\n if (_relation.relation === relation) {\n index = i\n return false\n }\n }\n })\n return index\n },\n\n /**\n * Define hidden (non-enumerable), writable properties on `target` from the\n * provided `props`.\n *\n * @example\n * import { utils } from 'js-data';\n * function Cat () {}\n * utils.addHiddenPropsToTarget(Cat.prototype, {\n * say () {\n * console.log('meow');\n * }\n * });\n * const cat = new Cat();\n * cat.say(); // \"meow\"\n *\n * @method utils.addHiddenPropsToTarget\n * @param {object} target That to which `props` should be added.\n * @param {object} props Properties to be added to `target`.\n * @since 3.0.0\n */\n addHiddenPropsToTarget (target, props) {\n const map = {}\n Object.keys(props).forEach(function (propName) {\n const descriptor = Object.getOwnPropertyDescriptor(props, propName)\n\n descriptor.enumerable = false\n map[propName] = descriptor\n })\n Object.defineProperties(target, map)\n },\n\n /**\n * Return whether the two objects are deeply different.\n *\n * @example\n * import { utils } from 'js-data';\n * utils.areDifferent({}, {}); // false\n * utils.areDifferent({ a: 1 }, { a: 1 }); // false\n * utils.areDifferent({ foo: 'bar' }, {}); // true\n *\n * @method utils.areDifferent\n * @param {object} a Base object.\n * @param {object} b Comparison object.\n * @param {object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Whether the two objects are deeply different.\n * @see utils.diffObjects\n * @since 3.0.0\n */\n areDifferent (newObject, oldObject, opts) {\n opts || (opts = {})\n const diff = utils.diffObjects(newObject, oldObject, opts)\n const diffCount = Object.keys(diff.added).length +\n Object.keys(diff.removed).length +\n Object.keys(diff.changed).length\n return diffCount > 0\n },\n\n /**\n * Verified that the given constructor is being invoked via `new`, as opposed\n * to just being called like a normal function.\n *\n * @example\n * import { utils } from 'js-data';\n * function Cat () {\n * utils.classCallCheck(this, Cat);\n * }\n * const cat = new Cat(); // this is ok\n * Cat(); // this throws an error\n *\n * @method utils.classCallCheck\n * @param {*} instance Instance that is being constructed.\n * @param {Constructor} ctor Constructor function used to construct the\n * instance.\n * @since 3.0.0\n * @throws {Error} Throws an error if the constructor is being improperly\n * invoked.\n */\n classCallCheck (instance, ctor) {\n if (!(instance instanceof ctor)) {\n throw utils.err(`${ctor.name}`)(500, 'Cannot call a class as a function')\n }\n },\n\n /**\n * Deep copy a value.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' } };\n * const b = utils.copy(a);\n * a === b; // false\n * utils.areDifferent(a, b); // false\n *\n * @param {*} from Value to deep copy.\n * @param {*} [to] Destination object for the copy operation.\n * @param {*} [stackFrom] For internal use.\n * @param {*} [stackTo] For internal use.\n * @param {string[]|RegExp[]} [blacklist] List of strings or RegExp of\n * properties to skip.\n * @param {boolean} [plain] Whether to make a plain copy (don't try to use\n * original prototype).\n * @returns {*} Deep copy of `from`.\n * @since 3.0.0\n */\n copy (from, to, stackFrom, stackTo, blacklist, plain) {\n if (!to) {\n to = from\n if (from) {\n if (utils.isArray(from)) {\n to = utils.copy(from, [], stackFrom, stackTo, blacklist, plain)\n } else if (utils.isDate(from)) {\n to = new Date(from.getTime())\n } else if (utils.isRegExp(from)) {\n to = new RegExp(from.source, from.toString().match(/[^/]*$/)[0])\n to.lastIndex = from.lastIndex\n } else if (utils.isObject(from)) {\n if (plain) {\n to = utils.copy(from, {}, stackFrom, stackTo, blacklist, plain)\n } else {\n to = utils.copy(from, Object.create(Object.getPrototypeOf(from)), stackFrom, stackTo, blacklist, plain)\n }\n }\n }\n } else {\n if (from === to) {\n throw utils.err(`${DOMAIN}.copy`)(500, 'Cannot copy! Source and destination are identical.')\n }\n\n stackFrom = stackFrom || []\n stackTo = stackTo || []\n\n if (utils.isObject(from)) {\n let index = stackFrom.indexOf(from)\n if (index !== -1) {\n return stackTo[index]\n }\n\n stackFrom.push(from)\n stackTo.push(to)\n }\n\n let result\n if (utils.isArray(from)) {\n let i\n to.length = 0\n for (i = 0; i < from.length; i++) {\n result = utils.copy(from[i], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[i])) {\n stackFrom.push(from[i])\n stackTo.push(result)\n }\n to.push(result)\n }\n } else {\n if (utils.isArray(to)) {\n to.length = 0\n } else {\n utils.forOwn(to, function (value, key) {\n delete to[key]\n })\n }\n for (var key in from) {\n if (from.hasOwnProperty(key)) {\n if (utils.isBlacklisted(key, blacklist)) {\n continue\n }\n result = utils.copy(from[key], null, stackFrom, stackTo, blacklist, plain)\n if (utils.isObject(from[key])) {\n stackFrom.push(from[key])\n stackTo.push(result)\n }\n to[key] = result\n }\n }\n }\n }\n return to\n },\n\n /**\n * Recursively shallow fill in own enumerable properties from `source` to\n * `dest`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.deepFillIn(b, a);\n * console.log(b); // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"bip\"}\n *\n * @method utils.deepFillIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.fillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n deepFillIn (dest, source) {\n if (source) {\n utils.forOwn(source, function (value, key) {\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepFillIn(existing, value)\n } else if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n }\n return dest\n },\n\n /**\n * Recursively shallow copy enumerable properties from `source` to `dest`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.deepFillIn(b, a);\n * console.log(b); // {\"foo\":{\"bar\":\"baz\"},\"beep\":\"boop\"}\n *\n * @method utils.deepMixIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.fillIn\n * @see utils.deepFillIn\n * @since 3.0.0\n */\n deepMixIn (dest, source) {\n if (source) {\n for (var key in source) {\n const value = source[key]\n const existing = dest[key]\n if (isPlainObject(value) && isPlainObject(existing)) {\n utils.deepMixIn(existing, value)\n } else {\n dest[key] = value\n }\n }\n }\n return dest\n },\n\n /**\n * Return a diff of the base object to the comparison object.\n *\n * @example\n * import { utils } from 'js-data';\n * const oldObject = { foo: 'bar', a: 1234 };\n * const newObject = { beep: 'boop', a: 5678 };\n * const diff = utils.diffObjects(oldObject, newObject);\n * console.log(diff.added); // {\"beep\":\"boop\"}\n * console.log(diff.changed); // {\"a\":5678}\n * console.log(diff.removed); // {\"foo\":undefined}\n *\n * @method utils.diffObjects\n * @param {object} newObject Comparison object.\n * @param {object} oldObject Base object.\n * @param {object} [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} The diff from the base object to the comparison object.\n * @see utils.areDifferent\n * @since 3.0.0\n */\n diffObjects (newObject, oldObject, opts) {\n opts || (opts = {})\n let equalsFn = opts.equalsFn\n let blacklist = opts.ignore\n const diff = {\n added: {},\n changed: {},\n removed: {}\n }\n if (!utils.isFunction(equalsFn)) {\n equalsFn = utils.deepEqual\n }\n\n const newKeys = Object.keys(newObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n const oldKeys = Object.keys(oldObject).filter(function (key) {\n return !utils.isBlacklisted(key, blacklist)\n })\n\n // Check for properties that were added or changed\n newKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (equalsFn(oldValue, newValue)) {\n return\n }\n if (oldValue === undefined) {\n diff.added[key] = newValue\n } else {\n diff.changed[key] = newValue\n }\n })\n\n // Check for properties that were removed\n oldKeys.forEach(function (key) {\n const oldValue = oldObject[key]\n const newValue = newObject[key]\n if (newValue === undefined && oldValue !== undefined) {\n diff.removed[key] = undefined\n }\n })\n\n return diff\n },\n\n /**\n * Return whether the two values are equal according to the `==` operator.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.equal(1,1)); // true\n * console.log(utils.equal(1,'1')); // true\n * console.log(utils.equal(93, 66)); // false\n *\n * @method utils.equal\n * @param {*} a First value in the comparison.\n * @param {*} b Second value in the comparison.\n * @returns {boolean} Whether the two values are equal according to `==`.\n * @since 3.0.0\n */\n equal (a, b) {\n return a == b // eslint-disable-line\n },\n\n /**\n * Produce a factory function for making Error objects with the provided\n * metadata. Used throughout the various js-data components.\n *\n * @example\n * import { utils } from 'js-data';\n * const errorFactory = utils.err('domain', 'target');\n * const error400 = errorFactory(400, 'expected type', 'actual type');\n * console.log(error400); // [Error: [domain:target] expected: expected type, found: string\nhttp://www.js-data.io/v3.0/docs/errors#400]\n * @method utils.err\n * @param {string} domain Namespace.\n * @param {string} target Target.\n * @returns {Function} Factory function.\n * @since 3.0.0\n */\n err (domain, target) {\n return function (code) {\n const prefix = `[${domain}:${target}] `\n let message = ERRORS[code].apply(null, Array.prototype.slice.call(arguments, 1))\n message = `${prefix}${message}\nhttp://www.js-data.io/v3.0/docs/errors#${code}`\n return new Error(message)\n }\n },\n\n /**\n * Add eventing capabilities into the target object.\n *\n * @example\n * import { utils } from 'js-data';\n * const user = { name: 'John' };\n * utils.eventify(user);\n * user.on('foo', () => console.log(arguments));\n * user.emit('foo', 1, 'bar'); // should log to console values (1, \"bar\")\n *\n * @method utils.eventify\n * @param {object} target Target object.\n * @param {Function} [getter] Custom getter for retrieving the object's event\n * listeners.\n * @param {Function} [setter] Custom setter for setting the object's event\n * listeners.\n * @since 3.0.0\n */\n eventify (target, getter, setter) {\n target = target || this\n let _events = {}\n if (!getter && !setter) {\n getter = function () { return _events }\n setter = function (value) { _events = value }\n }\n Object.defineProperties(target, {\n emit: {\n value (...args) {\n const events = getter.call(this) || {}\n const type = args.shift()\n let listeners = events[type] || []\n let i\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n listeners = events.all || []\n args.unshift(type)\n for (i = 0; i < listeners.length; i++) {\n listeners[i].f.apply(listeners[i].c, args)\n }\n }\n },\n off: {\n value (type, func) {\n const events = getter.call(this)\n const listeners = events[type]\n if (!listeners) {\n setter.call(this, {})\n } else if (func) {\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i].f === func) {\n listeners.splice(i, 1)\n break\n }\n }\n } else {\n listeners.splice(0, listeners.length)\n }\n }\n },\n on: {\n value (type, func, thisArg) {\n if (!getter.call(this)) {\n setter.call(this, {})\n }\n const events = getter.call(this)\n events[type] = events[type] || []\n events[type].push({\n c: thisArg,\n f: func\n })\n }\n }\n })\n },\n\n /**\n * Used for sublcassing. Invoke this method in the context of a superclass to\n * to produce a subclass based on `props` and `classProps`.\n *\n * @example\n * import { utils } from 'js-data';\n * function Animal () {}\n * Animal.extend = utils.extend;\n * const Cat = Animal.extend({\n * say () {\n * console.log('meow');\n * }\n * });\n * const cat = new Cat();\n * cat instanceof Animal; // true\n * cat instanceof Cat; // true\n * cat.say(); // \"meow\"\n *\n * @method utils.extend\n * @param {object} props Instance properties for the subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to use as the subclass.\n * @param {object} props Static properties for the subclass.\n * @returns {Constructor} A new subclass.\n * @since 3.0.0\n */\n extend (props, classProps) {\n const superClass = this\n let subClass\n\n props || (props = {})\n classProps || (classProps = {})\n\n if (props.hasOwnProperty('constructor')) {\n subClass = props.constructor\n delete props.constructor\n } else {\n subClass = function (...args) {\n utils.classCallCheck(this, subClass)\n superClass.apply(this, args)\n }\n }\n\n // Setup inheritance of instance members\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n configurable: true,\n enumerable: false,\n value: subClass,\n writable: true\n }\n })\n\n const obj = Object\n // Setup inheritance of static members\n if (obj.setPrototypeOf) {\n obj.setPrototypeOf(subClass, superClass)\n } else if (classProps.strictEs6Class) {\n subClass.__proto__ = superClass // eslint-disable-line\n } else {\n utils.forOwn(superClass, function (value, key) {\n subClass[key] = value\n })\n }\n if (!subClass.hasOwnProperty('__super__')) {\n Object.defineProperty(subClass, '__super__', {\n configurable: true,\n value: superClass\n })\n }\n\n utils.addHiddenPropsToTarget(subClass.prototype, props)\n utils.fillIn(subClass, classProps)\n\n return subClass\n },\n\n /**\n * Shallow copy own enumerable properties from `src` to `dest` that are on\n * `src` but are missing from `dest.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: 'bar', beep: 'boop' };\n * const b = { beep: 'bip' };\n * utils.fillIn(b, a);\n * console.log(b); // {\"foo\":\"bar\",\"beep\":\"bip\"}\n *\n * @method utils.fillIn\n * @param {object} dest The destination object.\n * @param {object} source The source object.\n * @see utils.deepFillIn\n * @see utils.deepMixIn\n * @since 3.0.0\n */\n fillIn (dest, src) {\n utils.forOwn(src, function (value, key) {\n if (!dest.hasOwnProperty(key) || dest[key] === undefined) {\n dest[key] = value\n }\n })\n },\n\n /**\n * Find the last index of an item in an array according to the given checker function.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = { name: 'John', age: 20 };\n * const sara = { name: 'Sara', age: 25 };\n * const dan = { name: 'Dan', age: 20 };\n * const users = [john, sara, dan];\n *\n * console.log(utils.findIndex(users, (user) => user.age === 25)); // 1\n * console.log(utils.findIndex(users, (user) => user.age > 19)); // 2\n * console.log(utils.findIndex(users, (user) => user.name === 'John')); // 0\n * console.log(utils.findIndex(users, (user) => user.name === 'Jimmy')); // -1\n *\n * @method utils.findIndex\n * @param {array} array The array to search.\n * @param {Function} fn Checker function.\n * @returns {number} Index if found or -1 if not found.\n * @since 3.0.0\n */\n findIndex (array, fn) {\n let index = -1\n if (!array) {\n return index\n }\n array.forEach(function (record, i) {\n if (fn(record)) {\n index = i\n return false\n }\n })\n return index\n },\n\n /**\n * Recursively iterate over a {@link Mapper}'s relations according to\n * `opts.with`.\n *\n * @method utils.forEachRelation\n * @param {Mapper} mapper Mapper.\n * @param {object} opts Configuration options.\n * @param {Function} fn Callback function.\n * @param {*} thisArg Execution context for the callback function.\n * @since 3.0.0\n */\n forEachRelation (mapper, opts, fn, thisArg) {\n const relationList = mapper.relationList || []\n if (!relationList.length) {\n return\n }\n relationList.forEach(function (def) {\n utils._forRelation(opts, def, fn, thisArg)\n })\n },\n\n /**\n * Iterate over an object's own enumerable properties.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { b: 1, c: 4 };\n * let sum = 0;\n * utils.forOwn(a, function (value, key) {\n * sum += value;\n * });\n * console.log(sum); // 5\n *\n * @method utils.forOwn\n * @param {object} object The object whose properties are to be enumerated.\n * @param {Function} fn Iteration function.\n * @param {object} [thisArg] Content to which to bind `fn`.\n * @since 3.0.0\n */\n forOwn (obj, fn, thisArg) {\n const keys = Object.keys(obj)\n const len = keys.length\n let i\n for (i = 0; i < len; i++) {\n if (fn.call(thisArg, obj[keys[i]], keys[i], obj) === false) {\n break\n }\n }\n },\n\n /**\n * Proxy for `JSON.parse`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const a = utils.fromJson('{\"name\" : \"John\"}');\n * console.log(a); // { name: 'John' }\n *\n * @method utils.fromJson\n * @param {string} json JSON to parse.\n * @returns {Object} Parsed object.\n * @see utils.toJson\n * @since 3.0.0\n */\n fromJson (json) {\n return utils.isString(json) ? JSON.parse(json) : json\n },\n\n /**\n * Retrieve the specified property from the given object. Supports retrieving\n * nested properties.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: { bar: 'baz' }, beep: 'boop' };\n * console.log(utils.get(a, 'beep')); // \"boop\"\n * console.log(utils.get(a, 'foo.bar')); // \"baz\"\n *\n * @method utils.get\n * @param {object} object Object from which to retrieve a property's value.\n * @param {string} prop Property to retrieve.\n * @returns {*} Value of the specified property.\n * @see utils.set\n * @since 3.0.0\n */\n 'get': function (object, prop) {\n if (!prop) {\n return\n }\n const parts = prop.split('.')\n const last = parts.pop()\n\n while (prop = parts.shift()) { // eslint-disable-line\n object = object[prop]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n return object[last]\n },\n\n /**\n * Return the superclass for the given instance or subclass. If an instance is\n * provided, then finds the parent class of the instance's constructor.\n *\n * @example\n * import { utils } from 'js-data';\n * // using ES2015 classes\n * class Foo {}\n * class Bar extends Foo {}\n * const barInstance = new Bar();\n * let baseType = utils.getSuper(barInstance);\n * console.log(Foo === baseType); // true\n *\n * // using Function constructor with utils.extend\n * function Foo () {}\n * Foo.extend = utils.extend;\n * const Bar = Foo.extend();\n * const barInstance = new Bar();\n * let baseType = utils.getSuper(barInstance);\n * console.log(Foo === baseType); // true\n *\n * @method utils.getSuper\n * @param {Object|Function} instance Instance or constructor.\n * @param {boolean} [isCtor=false] Whether `instance` is a constructor.\n * @returns {Constructor} The superclass (grandparent constructor).\n * @since 3.0.0\n */\n getSuper (instance, isCtor) {\n const ctor = isCtor ? instance : instance.constructor\n if (ctor.hasOwnProperty('__super__')) {\n return ctor.__super__\n }\n return Object.getPrototypeOf(ctor) || ctor.__proto__ // eslint-disable-line\n },\n\n /**\n * Return the intersection of two arrays.\n *\n * @example\n * import { utils } from 'js-data';\n * const arrA = ['green', 'red', 'blue', 'red'];\n * const arrB = ['green', 'yellow', 'red'];\n * const intersected = utils.intersection(arrA, arrB);\n *\n * console.log(intersected); // ['green', 'red'])\n *\n * @method utils.intersection\n * @param {array} array1 First array.\n * @param {array} array2 Second array.\n * @returns {Array} Array of elements common to both arrays.\n * @since 3.0.0\n */\n intersection (array1, array2) {\n if (!array1 || !array2) {\n return []\n }\n const result = []\n let item\n let i\n const len = array1.length\n for (i = 0; i < len; i++) {\n item = array1[i]\n if (result.indexOf(item) !== -1) {\n continue\n }\n if (array2.indexOf(item) !== -1) {\n result.push(item)\n }\n }\n return result\n },\n\n /**\n * Proxy for `Array.isArray`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = [1,2,3,4,5];\n * const b = { foo: \"bar\" };\n * console.log(utils.isArray(a)); // true\n * console.log(utils.isArray(b)); // false\n *\n * @method utils.isArray\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an array.\n * @since 3.0.0\n */\n isArray: Array.isArray,\n\n /**\n * Return whether `prop` is matched by any string or regular expression in\n * `blacklist`.\n *\n * @example\n * import { utils } from 'js-data';\n * const blacklist = [/^\\$hashKey/g, /^_/g, 'id'];\n * console.log(utils.isBlacklisted(\"$hashKey\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"id\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"_myProp\", blacklist)); // true\n * console.log(utils.isBlacklisted(\"my_id\", blacklist)); // false\n *\n * @method utils.isBlacklisted\n * @param {string} prop The name of a property to check.\n * @param {array} blacklist Array of strings and regular expressions.\n * @returns {boolean} Whether `prop` was matched.\n * @since 3.0.0\n */\n isBlacklisted (prop, blacklist) {\n if (!blacklist || !blacklist.length) {\n return false\n }\n let matches\n for (var i = 0; i < blacklist.length; i++) {\n if ((toStr(blacklist[i]) === REGEXP_TAG && blacklist[i].test(prop)) || blacklist[i] === prop) {\n matches = prop\n return !!matches\n }\n }\n return !!matches\n },\n\n /**\n * Return whether the provided value is a boolean.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = true;\n * const b = { foo: \"bar\" };\n * console.log(utils.isBoolean(a)); // true\n * console.log(utils.isBoolean(b)); // false\n *\n * @method utils.isBoolean\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a boolean.\n * @since 3.0.0\n */\n isBoolean (value) {\n return toStr(value) === BOOL_TAG\n },\n\n /**\n * Return whether the provided value is a date.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = new Date();\n * const b = { foo: \"bar\" };\n * console.log(utils.isDate(a)); // true\n * console.log(utils.isDate(b)); // false\n *\n * @method utils.isDate\n * @param {*} value The value to test.\n * @returns {Date} Whether the provided value is a date.\n * @since 3.0.0\n */\n isDate (value) {\n return (value && typeof value === 'object' && toStr(value) === DATE_TAG)\n },\n\n /**\n * Return whether the provided value is a function.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = function () { console.log('foo bar'); };\n * const b = { foo: \"bar\" };\n * console.log(utils.isFunction(a)); // true\n * console.log(utils.isFunction(b)); // false\n *\n * @method utils.isFunction\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a function.\n * @since 3.0.0\n */\n isFunction (value) {\n return typeof value === 'function' || (value && toStr(value) === FUNC_TAG)\n },\n\n /**\n * Return whether the provided value is an integer.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = 1;\n * const b = 1.25;\n * const c = '1';\n * console.log(utils.isInteger(a)); // true\n * console.log(utils.isInteger(b)); // false\n * console.log(utils.isInteger(c)); // false\n *\n * @method utils.isInteger\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an integer.\n * @since 3.0.0\n */\n isInteger (value) {\n return toStr(value) === NUMBER_TAG && value == toInteger(value) // eslint-disable-line\n },\n\n /**\n * Return whether the provided value is `null`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = null;\n * const b = { foo: \"bar\" };\n * console.log(utils.isNull(a)); // true\n * console.log(utils.isNull(b)); // false\n *\n * @method utils.isNull\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is `null`.\n * @since 3.0.0\n */\n isNull (value) {\n return value === null\n },\n\n /**\n * Return whether the provided value is a number.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = 1;\n * const b = -1.25;\n * const c = '1';\n * console.log(utils.isNumber(a)); // true\n * console.log(utils.isNumber(b)); // true\n * console.log(utils.isNumber(c)); // false\n *\n * @method utils.isNumber\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a number.\n * @since 3.0.0\n */\n isNumber (value) {\n const type = typeof value\n return type === 'number' || (value && type === 'object' && toStr(value) === NUMBER_TAG)\n },\n\n /**\n * Return whether the provided value is an object.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: \"bar\" };\n * const b = 'foo bar';\n * console.log(utils.isObject(a)); // true\n * console.log(utils.isObject(b)); // false\n *\n * @method utils.isObject\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is an object.\n * @since 3.0.0\n */\n isObject (value) {\n return toStr(value) === OBJECT_TAG\n },\n\n /**\n * Return whether the provided value is a regular expression.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = /^\\$.+$/ig;\n * const b = new RegExp('^\\$.+$', 'ig');\n * const c = { foo: \"bar\" };\n * console.log(utils.isRegExp(a)); // true\n * console.log(utils.isRegExp(b)); // true\n * console.log(utils.isRegExp(c)); // false\n *\n * @method utils.isRegExp\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a regular expression.\n * @since 3.0.0\n */\n isRegExp (value) {\n return toStr(value) === REGEXP_TAG\n },\n\n /**\n * Return whether the provided value is a string or a number.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isSorN('')); // true\n * console.log(utils.isSorN(-1.65)); // true\n * console.log(utils.isSorN('my string')); // true\n * console.log(utils.isSorN({})); // false\n * console.log(utils.isSorN([1,2,4])); // false\n *\n * @method utils.isSorN\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string or a number.\n * @since 3.0.0\n */\n isSorN (value) {\n return utils.isString(value) || utils.isNumber(value)\n },\n\n /**\n * Return whether the provided value is a string.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('')); // true\n * console.log(utils.isString('my string')); // true\n * console.log(utils.isString(100)); // false\n * console.log(utils.isString([1,2,4])); // false\n *\n * @method utils.isString\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a string.\n * @since 3.0.0\n */\n isString (value) {\n return typeof value === 'string' || (value && typeof value === 'object' && toStr(value) === STRING_TAG)\n },\n\n /**\n * Return whether the provided value is a `undefined`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = undefined;\n * const b = { foo: \"bar\"};\n * console.log(utils.isUndefined(a)); // true\n * console.log(utils.isUndefined(b.baz)); // true\n * console.log(utils.isUndefined(b)); // false\n * console.log(utils.isUndefined(b.foo)); // false\n *\n * @method utils.isUndefined\n * @param {*} value The value to test.\n * @returns {boolean} Whether the provided value is a `undefined`.\n * @since 3.0.0\n */\n isUndefined (value) {\n return value === undefined\n },\n\n /**\n * Mix in logging capabilities to the target.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { foo: \"bar\"};\n *\n * // Add standard logging to an object\n * utils.logify(a);\n * a.log('info', 'test log info'); // output 'test log info' to console.\n *\n * // Toggle debug output of an object\n * a.dbg('test debug output'); // does not output because debug is off.\n * a.debug = true;\n * a.dbg('test debug output'); // output 'test debug output' to console.\n *\n * @method utils.logify\n * @param {*} target The target.\n * @since 3.0.0\n */\n logify (target) {\n utils.addHiddenPropsToTarget(target, {\n dbg (...args) {\n if (utils.isFunction(this.log)) {\n this.log('debug', ...args)\n }\n },\n log (level, ...args) {\n if (level && !args.length) {\n args.push(level)\n level = 'debug'\n }\n if (level === 'debug' && !this.debug) {\n return\n }\n const prefix = `${level.toUpperCase()}: (${this.name || this.constructor.name})`\n if (utils.isFunction(console[level])) {\n console[level](prefix, ...args)\n } else {\n console.log(prefix, ...args)\n }\n }\n })\n },\n\n /**\n * Adds the given record to the provided array only if it's not already in the\n * array.\n *\n * @example\n * import { utils } from 'js-data';\n * const colors = ['red', 'green', 'yellow'];\n *\n * console.log(colors.length); // 3\n * utils.noDupeAdd(colors, 'red');\n * console.log(colors.length); // 3, red already exists\n *\n * utils.noDupeAdd(colors, 'blue');\n * console.log(colors.length); // 4, blue was added\n *\n * @method utils.noDupeAdd\n * @param {array} array The array.\n * @param {*} record The value to add.\n * @param {Function} fn Callback function passed to {@link utils.findIndex}.\n * @since 3.0.0\n */\n noDupeAdd (array, record, fn) {\n if (!array) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index < 0) {\n array.push(record)\n }\n },\n\n /**\n * Return a shallow copy of the provided object, minus the properties\n * specified in `keys`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John', $hashKey: 1214910 };\n *\n * let b = utils.omit(a, ['$hashKey']);\n * console.log(b); // { name: 'John' }\n *\n * @method utils.omit\n * @param {object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to skip.\n * @returns {Object} Shallow copy of `props`, minus `keys`.\n * @since 3.0.0\n */\n omit (props, keys) {\n const _props = {}\n utils.forOwn(props, function (value, key) {\n if (keys.indexOf(key) === -1) {\n _props[key] = value\n }\n })\n return _props\n },\n\n /**\n * Return a shallow copy of the provided object, but only include the\n * properties specified in `keys`.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John', $hashKey: 1214910 };\n *\n * let b = utils.pick(a, ['$hashKey']);\n * console.log(b); // { $hashKey: 1214910 }\n *\n * @method utils.pick\n * @param {object} props The object to copy.\n * @param {string[]} keys Array of strings, representing properties to keep.\n * @returns {Object} Shallow copy of `props`, but only including `keys`.\n * @since 3.0.0\n */\n pick (props, keys) {\n return keys.reduce((map, key) => {\n map[key] = props[key]\n return map\n }, {})\n },\n\n /**\n * Return a plain copy of the given value.\n *\n * @example\n * import { utils } from 'js-data';\n * const a = { name: 'John' };\n * let b = utils.plainCopy(a);\n * console.log(a === b); // false\n *\n * @method utils.plainCopy\n * @param {*} value The value to copy.\n * @returns {*} Plain copy of `value`.\n * @see utils.copy\n * @since 3.0.0\n */\n plainCopy (value) {\n return utils.copy(value, undefined, undefined, undefined, undefined, true)\n },\n\n /**\n * Shortcut for `utils.Promise.reject(value)`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * utils.reject(\"Testing static reject\").then(function (data) {\n * // not called\n * }).catch(function (reason) {\n * console.log(reason); // \"Testing static reject\"\n * });\n *\n * @method utils.reject\n * @param {*} [value] Value with which to reject the Promise.\n * @returns {Promise} Promise reject with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n reject (value) {\n return utils.Promise.reject(value)\n },\n\n /**\n * Remove the last item found in array according to the given checker function.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const colors = ['red', 'green', 'yellow', 'red'];\n * utils.remove(colors, (color) => color === 'red');\n * console.log(colors); // ['red', 'green', 'yellow']\n *\n * @method utils.remove\n * @param {array} array The array to search.\n * @param {Function} fn Checker function.\n */\n remove (array, fn) {\n if (!array || !array.length) {\n return\n }\n const index = this.findIndex(array, fn)\n if (index >= 0) {\n array.splice(index, 1) // todo should this be recursive?\n }\n },\n\n /**\n * Shortcut for `utils.Promise.resolve(value)`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * utils.resolve(\"Testing static resolve\").then(function (data) {\n * console.log(data); // \"Testing static resolve\"\n * }).catch(function (reason) {\n * // not called\n * });\n *\n * @param {*} [value] Value with which to resolve the Promise.\n * @returns {Promise} Promise resolved with `value`.\n * @see utils.Promise\n * @since 3.0.0\n */\n resolve (value) {\n return utils.Promise.resolve(value)\n },\n\n /**\n * Set the value at the provided key or path.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * };\n * // set value by key\n * utils.set(john, 'id', 98);\n * console.log(john.id); // 98\n *\n * // set value by path\n * utils.set(john, 'parent.id', 20);\n * console.log(john.parent.id); // 20\n *\n * // set value by path/value map\n * utils.set(john, {\n * 'id': 1098,\n * 'parent': { id: 1020 },\n * 'parent.age': '55'\n * });\n * console.log(john.id); // 1098\n * console.log(john.parent.id); // 1020\n * console.log(john.parent.age); // 55\n *\n * @method utils.set\n * @param {object} object The object on which to set a property.\n * @param {(string|Object)} path The key or path to the property. Can also\n * pass in an object of path/value pairs, which will all be set on the target\n * object.\n * @param {*} [value] The value to set.\n */\n set: function (object, path, value) {\n if (utils.isObject(path)) {\n utils.forOwn(path, function (value, _path) {\n utils.set(object, _path, value)\n })\n } else {\n const parts = PATH.exec(path)\n if (parts) {\n mkdirP(object, parts[1])[parts[2]] = value\n } else {\n object[path] = value\n }\n }\n },\n\n /**\n * Check whether the two provided objects are deeply equal.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const objA = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * };\n *\n * const objB = {\n * name: 'John',\n * id: 27,\n * nested: {\n * item: 'item 1',\n * colors: ['red', 'green', 'blue']\n * }\n * };\n *\n * console.log(utils.deepEqual(a,b)); // true\n * objB.nested.colors.add('yellow'); // make a change to a nested object's array\n * console.log(utils.deepEqual(a,b)); // false\n *\n * @method utils.deepEqual\n * @param {object} a First object in the comparison.\n * @param {object} b Second object in the comparison.\n * @returns {boolean} Whether the two provided objects are deeply equal.\n * @see utils.equal\n * @since 3.0.0\n */\n deepEqual (a, b) {\n if (a === b) {\n return true\n }\n let _equal = true\n if (utils.isArray(a) && utils.isArray(b)) {\n if (a.length !== b.length) {\n return false\n }\n for (let i = a.length; i--;) {\n if (!utils.deepEqual(a[i], b[i])) {\n // Exit loop early\n return false\n }\n }\n } else if (utils.isObject(a) && utils.isObject(b)) {\n utils.forOwn(a, function (value, key) {\n if (!(_equal = utils.deepEqual(value, b[key]))) {\n // Exit loop early\n return false\n }\n })\n if (_equal) {\n utils.forOwn(b, function (value, key) {\n if (!(_equal = utils.deepEqual(value, a[key]))) {\n // Exit loop early\n return false\n }\n })\n }\n } else {\n return false\n }\n return _equal\n },\n\n /**\n * Proxy for `JSON.stringify`.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const a = { name: 'John' };\n * let jsonVal = utils.toJson(a);\n * console.log(jsonVal); // '{\"name\" : \"John\"}'\n *\n * @method utils.toJson\n * @param {*} value Value to serialize to JSON.\n * @returns {string} JSON string.\n * @see utils.fromJson\n * @since 3.0.0\n */\n toJson: JSON.stringify,\n\n /**\n * Unset the value at the provided key or path.\n *\n * @example\n * import { utils } from 'js-data';\n *\n * const john = {\n * name: 'John',\n * age: 25,\n * parent: {\n * name: 'John's Mom',\n * age: 50\n * }\n * };\n *\n * utils.unset(john, age);\n * utils.unset(john, parent.age);\n *\n * console.log(john.age); // null\n * console.log(john.parent.age); // null\n *\n * @method utils.unset\n * @param {object} object The object from which to delete the property.\n * @param {string} path The key or path to the property.\n * @see utils.set\n * @since 3.0.0\n */\n unset (object, path) {\n const parts = path.split('.')\n const last = parts.pop()\n\n while (path = parts.shift()) { // eslint-disable-line\n object = object[path]\n if (object == null) { // eslint-disable-line\n return\n }\n }\n\n object[last] = undefined\n }\n}\n\nexport const safeSetProp = function (record, field, value) {\n if (record && record._set) {\n record._set(`props.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport const safeSetLink = function (record, field, value) {\n if (record && record._set) {\n record._set(`links.${field}`, value)\n } else {\n utils.set(record, field, value)\n }\n}\n\nexport default utils\n","import utils from './utils'\n\n/**\n * A base class which gives instances private properties.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Settable.extend} for an example of using {@link Settable} as a\n * base class.\n *\n *```javascript\n * import {Settable} from 'js-data'\n * ```\n *\n * @class Settable\n * @returns {Settable} A new {@link Settable} instance.\n * @since 3.0.0\n */\nexport default function Settable () {\n const _props = {}\n Object.defineProperties(this, {\n /**\n * Get a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method Settable#_get\n * @param {string} key The property to retrieve.\n * @returns {*} The value of the property.\n * @since 3.0.0\n */\n _get: { value (key) { return utils.get(_props, key) } },\n\n /**\n * Set a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_set\n * @param {(string|Object)} key The key or path to the property. Can also\n * pass in an object of key/value pairs, which will all be set on the instance.\n * @param {*} [value] The value to set.\n * @since 3.0.0\n */\n _set: { value (key, value) { return utils.set(_props, key, value) } },\n\n /**\n * Unset a private property of this instance.\n *\n * __Don't use the method unless you know what you're doing.__\n *\n * @method __Don't use the method unless you know what you're doing.__#_unset\n * @param {string} key The property to unset.\n * @since 3.0.0\n */\n _unset: { value (key) { return utils.unset(_props, key) } }\n })\n}\n\n/**\n * Create a subclass of this Settable:\n *\n * @example Settable.extend\n * const JSData = require('js-data');\n * const { Settable } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSettableClass extends Settable {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSettable = new CustomSettableClass();\n * console.log(customSettable.foo());\n * console.log(CustomSettableClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSettableClass = Settable.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherSettable = new OtherSettableClass();\n * console.log(otherSettable.foo());\n * console.log(OtherSettableClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSettableClass () {\n * Settable.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Settable.extend({\n * constructor: AnotherSettableClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherSettable = new AnotherSettableClass();\n * console.log(anotherSettable.created_at);\n * console.log(anotherSettable.foo());\n * console.log(AnotherSettableClass.beep());\n *\n * @method Settable.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Settable class.\n * @since 3.0.0\n */\nSettable.extend = utils.extend\n","import utils from './utils'\nimport Settable from './Settable'\n\n/**\n * The base class from which all JSData components inherit some basic\n * functionality.\n *\n * Typically you won't instantiate this class directly, but you may find it\n * useful as an abstract class for your own components.\n *\n * See {@link Component.extend} for an example of using {@link Component} as a\n * base class.\n *\n *```javascript\n * import {Component} from 'js-data'\n * ```\n *\n * @class Component\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @returns {Component} A new {@link Component} instance.\n * @since 3.0.0\n */\nfunction Component (opts) {\n Settable.call(this)\n opts || (opts = {})\n\n /**\n * Whether to enable debug-level logs for this component. Anything that\n * extends `Component` inherits this option and the corresponding logging\n * functionality.\n *\n * @example Component#debug\n * const JSData = require('js-data');\n * const { Component } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const component = new Component();\n * component.log('debug', 'some message'); // nothing gets logged\n * // Display debug logs:\n * component.debug = true;\n * component.log('debug', 'other message'); // this DOES get logged\n *\n * @default false\n * @name Component#debug\n * @since 3.0.0\n * @type {boolean}\n */\n this.debug = opts.hasOwnProperty('debug') ? !!opts.debug : false\n\n /**\n * Event listeners attached to this Component. __Do not modify.__ Use\n * {@link Component#on} and {@link Component#off} instead.\n *\n * @name Component#_listeners\n * @private\n * @instance\n * @since 3.0.0\n * @type {Object}\n */\n Object.defineProperty(this, '_listeners', { value: {}, writable: true })\n}\n\nexport default Settable.extend({\n constructor: Component\n})\n\n/**\n * Create a subclass of this Component:\n *\n * @example Component.extend\n * const JSData = require('js-data');\n * const { Component } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomComponentClass extends Component {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customComponent = new CustomComponentClass();\n * console.log(customComponent.foo());\n * console.log(CustomComponentClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherComponentClass = Component.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherComponent = new OtherComponentClass();\n * console.log(otherComponent.foo());\n * console.log(OtherComponentClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherComponentClass () {\n * Component.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Component.extend({\n * constructor: AnotherComponentClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherComponent = new AnotherComponentClass();\n * console.log(anotherComponent.created_at);\n * console.log(anotherComponent.foo());\n * console.log(AnotherComponentClass.beep());\n *\n * @method Component.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Component class.\n * @since 3.0.0\n */\nComponent.extend = utils.extend\n\n/**\n * Log the provided values at the \"debug\" level. Debug-level logs are only\n * logged if {@link Component#debug} is `true`.\n *\n * `.dbg(...)` is shorthand for `.log('debug', ...)`.\n *\n * @method Component#dbg\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\n/**\n * Log the provided values. By default sends values to `console[level]`.\n * Debug-level logs are only logged if {@link Component#debug} is `true`.\n *\n * Will attempt to use appropriate `console` methods if they are available.\n *\n * @method Component#log\n * @param {string} level Log level.\n * @param {...*} [args] Values to log.\n * @since 3.0.0\n */\nutils.logify(Component.prototype)\n\n/**\n * Register a new event listener on this Component.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a DataStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName); // \"post\"\n * console.log(props.id); // undefined\n * console.log(result.id); // 1234\n * });\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id); // 1234\n * });\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * collection.on('add', (records) => {\n * console.log(records); // [...]\n * });\n *\n * @example\n * // Listen for \"change\" events on a record\n * post.on('change', (record, changes) => {\n * console.log(changes); // { changed: { title: 'Modeling your data' } }\n * });\n * post.title = 'Modeling your data';\n *\n * @method Component#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n/**\n * Remove an event listener from this Component. If no listener is provided,\n * then all listeners for the specified event will be removed. If no event is\n * specified then all listeners for all events will be removed.\n *\n * @example\n * // Remove a particular listener for a particular event\n * collection.off('add', handler);\n *\n * @example\n * // Remove all listeners for a particular event\n * record.off('change');\n *\n * @example\n * // Remove all listeners to all events\n * store.off();\n *\n * @method Component#off\n * @param {string} [event] Name of event to unsubsribe to.\n * @param {Function} [listener] Listener to remove.\n * @since 3.0.0\n */\n/**\n * Trigger an event on this Component.\n *\n * @example Component#emit\n * // import { Collection, DataStore } from 'js-data';\n * const JSData = require('js-data');\n * const { Collection, DataStore } = JSData;\n *\n * const collection = new Collection();\n * collection.on('foo', function (msg) {\n * console.log(msg);\n * });\n * collection.emit('foo', 'bar');\n *\n * const store = new DataStore();\n * store.on('beep', function (msg) {\n * console.log(msg);\n * });\n * store.emit('beep', 'boop');\n *\n * @method Component#emit\n * @param {string} event Name of event to emit.\n * @param {...*} [args] Arguments to pass to any listeners.\n * @since 3.0.0\n */\nutils.eventify(\n Component.prototype,\n function () {\n return this._listeners\n },\n function (value) {\n this._listeners = value\n }\n)\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Query'\nconst INDEX_ERR = 'Index inaccessible after first operation'\n\n// Reserved words used by JSData's Query Syntax\nconst reserved = {\n limit: '',\n offset: '',\n orderBy: '',\n skip: '',\n sort: '',\n where: ''\n}\n\n// Used by our JavaScript implementation of the LIKE operator\nconst escapeRegExp = /([.*+?^=!:${}()|[\\]/\\\\])/g\nconst percentRegExp = /%/g\nconst underscoreRegExp = /_/g\nconst escape = function (pattern) {\n return pattern.replace(escapeRegExp, '\\\\$1')\n}\n\n/**\n * A class used by the {@link Collection} class to build queries to be executed\n * against the collection's data. An instance of `Query` is returned by\n * {@link Collection#query}. Query instances are typically short-lived, and you\n * shouldn't have to create them yourself. Just use {@link Collection#query}.\n *\n * ```javascript\n * import { Query } from 'js-data';\n * ```\n *\n * @example Query intro\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ]\n * store.add('post', posts);\n * const drafts = store.query('post').filter({ status: 'draft' }).limit(2).run();\n * console.log(drafts);\n *\n * @class Query\n * @extends Component\n * @param {Collection} collection The collection on which this query operates.\n * @since 3.0.0\n */\nfunction Query (collection) {\n utils.classCallCheck(this, Query)\n\n /**\n * The {@link Collection} on which this query operates.\n *\n * @name Query#collection\n * @since 3.0.0\n * @type {Collection}\n */\n this.collection = collection\n\n /**\n * The current data result of this query.\n *\n * @name Query#data\n * @since 3.0.0\n * @type {Array}\n */\n this.data = null\n}\n\nexport default Component.extend({\n constructor: Query,\n\n _applyWhereFromObject (where) {\n const fields = []\n const ops = []\n const predicates = []\n utils.forOwn(where, (clause, field) => {\n if (!utils.isObject(clause)) {\n clause = {\n '==': clause\n }\n }\n utils.forOwn(clause, (expr, op) => {\n fields.push(field)\n ops.push(op)\n predicates.push(expr)\n })\n })\n return {\n fields,\n ops,\n predicates\n }\n },\n\n _applyWhereFromArray (where) {\n const groups = []\n where.forEach((_where, i) => {\n if (utils.isString(_where)) {\n return\n }\n const prev = where[i - 1]\n const parser = utils.isArray(_where) ? this._applyWhereFromArray : this._applyWhereFromObject\n const group = parser.call(this, _where)\n if (prev === 'or') {\n group.isOr = true\n }\n groups.push(group)\n })\n groups.isArray = true\n return groups\n },\n\n _testObjectGroup (keep, first, group, item) {\n let i\n const fields = group.fields\n const ops = group.ops\n const predicates = group.predicates\n const len = ops.length\n for (i = 0; i < len; i++) {\n let op = ops[i]\n const isOr = op.charAt(0) === '|'\n op = isOr ? op.substr(1) : op\n const expr = this.evaluate(utils.get(item, fields[i]), op, predicates[i])\n if (expr !== undefined) {\n keep = first ? expr : (isOr ? keep || expr : keep && expr)\n }\n first = false\n }\n return { keep, first }\n },\n\n _testArrayGroup (keep, first, groups, item) {\n let i\n const len = groups.length\n for (i = 0; i < len; i++) {\n const group = groups[i]\n const parser = group.isArray ? this._testArrayGroup : this._testObjectGroup\n const result = parser.call(this, true, true, group, item)\n if (groups[i - 1]) {\n if (group.isOr) {\n keep = keep || result.keep\n } else {\n keep = keep && result.keep\n }\n } else {\n keep = result.keep\n }\n first = result.first\n }\n return { keep, first }\n },\n\n /**\n * Find all entities between two boundaries.\n *\n * @example Get the users ages 18 to 30.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users)\n * const filteredUsers = store\n * .query('user')\n * .between(18, 30, { index: 'age' })\n * .run();\n * console.log(filteredUsers);\n *\n * @example Same as above.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users)\n * const filteredUsers = store\n * .query('user')\n * .between([18], [30], { index: 'age' })\n * .run();\n * console.log(filteredUsers);\n *\n * @method Query#between\n * @param {array} leftKeys Keys defining the left boundary.\n * @param {array} rightKeys Keys defining the right boundary.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include entities\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#between`)(500, 'Cannot access index')\n }\n this.data = this.collection.getIndex(opts.index).between(leftKeys, rightKeys, opts)\n return this\n },\n\n /**\n * The comparison function used by the {@link Query} class.\n *\n * @method Query#compare\n * @param {array} orderBy An orderBy clause used for sorting and sub-sorting.\n * @param {number} index The index of the current orderBy clause being used.\n * @param {*} a The first item in the comparison.\n * @param {*} b The second item in the comparison.\n * @returns {number} -1 if `b` should preceed `a`. 0 if `a` and `b` are equal.\n * 1 if `a` should preceed `b`.\n * @since 3.0.0\n */\n compare (orderBy, index, a, b) {\n const def = orderBy[index]\n let cA = utils.get(a, def[0])\n let cB = utils.get(b, def[0])\n if (cA && utils.isString(cA)) {\n cA = cA.toUpperCase()\n }\n if (cB && utils.isString(cB)) {\n cB = cB.toUpperCase()\n }\n if (a === undefined) {\n a = null\n }\n if (b === undefined) {\n b = null\n }\n if (def[1].toUpperCase() === 'DESC') {\n const temp = cB\n cB = cA\n cA = temp\n }\n if (cA < cB) {\n return -1\n } else if (cA > cB) {\n return 1\n } else {\n if (index < orderBy.length - 1) {\n return this.compare(orderBy, index + 1, a, b)\n } else {\n return 0\n }\n }\n },\n\n /**\n * Predicate evaluation function used by the {@link Query} class.\n *\n * @method Query#evaluate\n * @param {*} value The value to evaluate.\n * @param {string} op The operator to use in this evaluation.\n * @param {*} predicate The predicate to use in this evaluation.\n * @returns {boolean} Whether the value passed the evaluation or not.\n * @since 3.0.0\n */\n evaluate (value, op, predicate) {\n const ops = this.constructor.ops\n if (ops[op]) {\n return ops[op](value, predicate)\n }\n if (op.indexOf('like') === 0) {\n return this.like(predicate, op.substr(4)).exec(value) !== null\n } else if (op.indexOf('notLike') === 0) {\n return this.like(predicate, op.substr(7)).exec(value) === null\n }\n },\n\n /**\n * Find the record or records that match the provided query or are accepted by\n * the provided filter function.\n *\n * @example Get the draft posts by authors younger than 30\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store\n * .query('post')\n * .filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * age: {\n * '<': 30\n * }\n * }\n * })\n * .run();\n * console.log(results);\n *\n * @example Use a custom filter function\n * const posts = query\n * .filter(function (post) {\n * return post.isReady();\n * })\n * .run();\n *\n * @method Query#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {Function} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n filter (query, thisArg) {\n /**\n * Selection query as defined by JSData's [Query Syntax][querysyntax].\n *\n * [querysyntax]: http://www.js-data.io/v3.0/docs/query-syntax\n *\n * @example Empty \"findAll\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * store.findAll('post').then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @example Empty \"filter\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = store.filter('post');\n * console.log(posts); // [...]\n *\n * @example Complex \"filter\" query\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * const PAGE_SIZE = 2;\n * let currentPage = 3;\n *\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * { author: 'Peter', age: 25, status: 'deleted', id: 6 },\n * { author: 'Sally', age: 21, status: 'draft', id: 7 },\n * { author: 'Jim', age: 27, status: 'draft', id: 8 },\n * { author: 'Jim', age: 27, status: 'published', id: 9 },\n * { author: 'Jason', age: 55, status: 'published', id: 10 }\n * ];\n * store.add('post', posts);\n * // Retrieve a filtered page of blog posts\n * // Would typically replace filter with findAll\n * const results = store.filter('post', {\n * where: {\n * status: {\n * // WHERE status = 'published'\n * '==': 'published'\n * },\n * author: {\n * // AND author IN ('bob', 'alice')\n * 'in': ['bob', 'alice'],\n * // OR author IN ('karen')\n * '|in': ['karen']\n * }\n * },\n * orderBy: [\n * // ORDER BY date_published DESC,\n * ['date_published', 'DESC'],\n * // ORDER BY title ASC\n * ['title', 'ASC']\n * ],\n * // LIMIT 2\n * limit: PAGE_SIZE,\n * // SKIP 4\n * offset: PAGE_SIZE * (currentPage - 1)\n * });\n * console.log(results);\n *\n * @namespace query\n * @property {number} [limit] See {@link query.limit}.\n * @property {number} [offset] See {@link query.offset}.\n * @property {string|Array[]} [orderBy] See {@link query.orderBy}.\n * @property {number} [skip] Alias for {@link query.offset}.\n * @property {string|Array[]} [sort] Alias for {@link query.orderBy}.\n * @property {Object} [where] See {@link query.where}.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/query-syntax\",\"JSData's Query Syntax\"]\n */\n query || (query = {})\n this.getData()\n if (utils.isObject(query)) {\n let where = {}\n\n /**\n * Filtering criteria. Records that do not meet this criteria will be exluded\n * from the result.\n *\n * @example Return posts where author is at least 32 years old\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * where: {\n * age: {\n * '>=': 30\n * }\n * }\n * });\n * console.log(results);\n *\n * @name query.where\n * @type {Object}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isObject(query.where) || utils.isArray(query.where)) {\n where = query.where\n }\n utils.forOwn(query, function (value, key) {\n if (!(key in reserved) && !(key in where)) {\n where[key] = {\n '==': value\n }\n }\n })\n let groups\n\n // Apply filter for each field\n if (utils.isObject(where) && Object.keys(where).length !== 0) {\n groups = this._applyWhereFromArray([where])\n } else if (utils.isArray(where)) {\n groups = this._applyWhereFromArray(where)\n }\n\n if (groups) {\n this.data = this.data.filter((item, i) => this._testArrayGroup(true, true, groups, item).keep)\n }\n\n // Sort\n let orderBy = query.orderBy || query.sort\n\n if (utils.isString(orderBy)) {\n orderBy = [\n [orderBy, 'ASC']\n ]\n }\n if (!utils.isArray(orderBy)) {\n orderBy = null\n }\n\n /**\n * Determines how records should be ordered in the result.\n *\n * @example Order posts by `author` then by `id` descending \n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 5 },\n * { author: 'Sally', age: 31, id: 6 },\n * { author: 'Mike', age: 32, id: 7 },\n * { author: 'Adam', age: 33, id: 8 },\n * { author: 'Adam', age: 33, id: 9 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * orderBy:[['author','ASC'],['id','DESC']]\n * });\n * console.log(results);\n *\n * @name query.orderBy\n * @type {string|Array[]}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (orderBy) {\n let index = 0\n orderBy.forEach(function (def, i) {\n if (utils.isString(def)) {\n orderBy[i] = [def, 'ASC']\n }\n })\n this.data.sort((a, b) => this.compare(orderBy, index, a, b))\n }\n\n /**\n * Number of records to skip.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const PAGE_SIZE = 10;\n * let currentPage = 1;\n * store.findAll('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n *\n * const PAGE_SIZE = 5;\n * let currentPage = 2;\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n * console.log(results)\n *\n * @name query.offset\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.skip)) {\n this.skip(query.skip)\n } else if (utils.isNumber(query.offset)) {\n this.skip(query.offset)\n }\n\n /**\n * Maximum number of records to retrieve.\n *\n * @example Retrieve the first \"page\" of blog posts using findAll\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n *\n * const PAGE_SIZE = 10\n * let currentPage = 1\n * store.findAll('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n *\n * @example Retrieve the last \"page\" of blog posts using filter\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n *\n * const PAGE_SIZE = 5\n * let currentPage = 2\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, id: 1 },\n * { author: 'Sally', age: 31, id: 2 },\n * { author: 'Mike', age: 32, id: 3 },\n * { author: 'Adam', age: 33, id: 4 },\n * { author: 'Adam', age: 33, id: 5 },\n * { author: 'Peter', age: 25, id: 6 },\n * { author: 'Sally', age: 21, id: 7 },\n * { author: 'Jim', age: 27, id: 8 },\n * { author: 'Jim', age: 27, id: 9 },\n * { author: 'Jason', age: 55, id: 10 }\n * ];\n * store.add('post', posts);\n * const results = store.filter('post', {\n * offset: PAGE_SIZE * (currentPage 1)\n * limit: PAGE_SIZE\n * });\n * console.log(results)\n *\n * @name query.limit\n * @type {number}\n * @see http://www.js-data.io/v3.0/docs/query-syntax\n * @since 3.0.0\n */\n if (utils.isNumber(query.limit)) {\n this.limit(query.limit)\n }\n } else if (utils.isFunction(query)) {\n this.data = this.data.filter(query, thisArg)\n }\n return this\n },\n\n /**\n * Iterate over all entities.\n *\n * @method Query#forEach\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n forEach (forEachFn, thisArg) {\n this.getData().forEach(forEachFn, thisArg)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided key.\n *\n * @example Get the entity whose primary key is 25.\n * const entities = query.get(25).run();\n *\n * @example Same as above.\n * const entities = query.get([25]).run();\n *\n * @example Get all users who are active and have the \"admin\" role.\n * const activeAdmins = query.get(['active', 'admin'], {\n * index: 'activityAndRoles'\n * }).run();\n *\n * @example Get all entities that match a certain weather condition.\n * const niceDays = query.get(['sunny', 'humid', 'calm'], {\n * index: 'weatherConditions'\n * }).run();\n *\n * @method Query#get\n * @param {array} keyList Key(s) defining the entity to retrieve. If\n * `keyList` is not an array (i.e. for a single-value key), it will be\n * wrapped in an array.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.string] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n get (keyList, opts) {\n keyList || (keyList = [])\n opts || (opts = {})\n if (this.data) {\n throw utils.err(`${DOMAIN}#get`)(500, INDEX_ERR)\n }\n if (keyList && !utils.isArray(keyList)) {\n keyList = [keyList]\n }\n if (!keyList.length) {\n this.getData()\n return this\n }\n this.data = this.collection.getIndex(opts.index).get(keyList)\n return this\n },\n\n /**\n * Find the entity or entities that match the provided keyLists.\n *\n * @example Get the posts where \"status\" is \"draft\" or \"inReview\".\n * const posts = query.getAll('draft', 'inReview', { index: 'status' }).run();\n *\n * @example Same as above.\n * const posts = query.getAll(['draft'], ['inReview'], { index: 'status' }).run();\n *\n * @method Query#getAll\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * entities matching each keyList will be retrieved. If no keyLists are\n * provided, all entities will be returned.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n getAll (...args) {\n let opts = {}\n if (this.data) {\n throw utils.err(`${DOMAIN}#getAll`)(500, INDEX_ERR)\n }\n if (!args.length || (args.length === 1 && utils.isObject(args[0]))) {\n this.getData()\n return this\n } else if (args.length && utils.isObject(args[args.length - 1])) {\n opts = args[args.length - 1]\n args.pop()\n }\n const collection = this.collection\n const index = collection.getIndex(opts.index)\n this.data = []\n args.forEach((keyList) => {\n this.data = this.data.concat(index.get(keyList))\n })\n return this\n },\n\n /**\n * Return the current data result of this query.\n *\n * @method Query#getData\n * @returns {Array} The data in this query.\n * @since 3.0.0\n */\n getData () {\n if (!this.data) {\n this.data = this.collection.index.getAll()\n }\n return this.data\n },\n\n /**\n * Implementation used by the `like` operator. Takes a pattern and flags and\n * returns a `RegExp` instance that can test strings.\n *\n * @method Query#like\n * @param {string} pattern Testing pattern.\n * @param {string} flags Flags for the regular expression.\n * @returns {RegExp} Regular expression for testing strings.\n * @since 3.0.0\n */\n like (pattern, flags) {\n return new RegExp(`^${(escape(pattern).replace(percentRegExp, '.*').replace(underscoreRegExp, '.'))}$`, flags)\n },\n\n /**\n * Limit the result.\n *\n * @example Get only the first 2 posts.\n * const store = new JSData.DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ];\n * store.add('post', posts);\n * const results = store.query('post').limit(2).run();\n * console.log(results);\n *\n * @method Query#limit\n * @param {number} num The maximum number of entities to keep in the result.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n limit (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#limit`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n this.data = data.slice(0, Math.min(data.length, num))\n return this\n },\n\n /**\n * Apply a mapping function to the result data.\n *\n * @example\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('user');\n * const users = [\n * { name: 'Peter', age: 25, id: 1 },\n * { name: 'Jim', age: 19, id: 2 },\n * { name: 'Mike', age: 17, id: 3 },\n * { name: 'Alan', age: 29, id: 4 },\n * { name: 'Katie', age: 33, id: 5 }\n * ];\n * store.add('user', users);\n * const ages = store\n * .query('user')\n * .map(function (user) {\n * return user.age;\n * })\n * .run();\n * console.log(ages);\n *\n * @method Query#map\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n map (mapFn, thisArg) {\n this.data = this.getData().map(mapFn, thisArg)\n return this\n },\n\n /**\n * Return the result of calling the specified function on each item in this\n * collection's main index.\n *\n * @example\n * const stringAges = UserCollection.query().mapCall('toString').run();\n *\n * @method Query#mapCall\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n mapCall (funcName, ...args) {\n this.data = this.getData().map(function (item) {\n return item[funcName](...args)\n })\n return this\n },\n\n /**\n * Complete the execution of the query and return the resulting data.\n *\n * @method Query#run\n * @returns {Array} The result of executing this query.\n * @since 3.0.0\n */\n run () {\n const data = this.data\n this.data = null\n return data\n },\n\n /**\n * Skip a number of results.\n *\n * @example Get all but the first 2 posts.\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'draft', id: 2 },\n * { author: 'Mike', age: 32, status: 'draft', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'draft', id: 5 }\n * ];\n * store.add('post', posts);\n * const results = store.query('post').skip(2).run();\n * console.log(results);\n *\n * @method Query#skip\n * @param {number} num The number of entities to skip.\n * @returns {Query} A reference to itself for chaining.\n * @since 3.0.0\n */\n skip (num) {\n if (!utils.isNumber(num)) {\n throw utils.err(`${DOMAIN}#skip`, 'num')(400, 'number', num)\n }\n const data = this.getData()\n if (num < data.length) {\n this.data = data.slice(num)\n } else {\n this.data = []\n }\n return this\n }\n}, {\n /**\n * The filtering operators supported by {@link Query#filter}, and which are\n * implemented by adapters (for the most part).\n *\n * @example Variant 1\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store.filter('post', {\n * status: 'published',\n * limit: 2\n * });\n * console.log(publishedPosts);\n *\n *\n * @example Variant 2\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post')\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * }\n * },\n * limit: 2\n * });\n * console.log(publishedPosts);\n *\n * @example Variant 3\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store\n * .query('post')\n * .filter({ status: 'published' })\n * .limit(2)\n * .run();\n * console.log(publishedPosts);\n *\n * @example Variant 4\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n * const publishedPosts = store\n * .query('post')\n * .filter({\n * where: {\n * status: {\n * '==': 'published'\n * }\n * }\n * })\n * .limit(2)\n * .run();\n * console.log(publishedPosts);\n *\n * @example Multiple operators\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new DataStore();\n * store.defineMapper('post');\n * const posts = [\n * { author: 'John', age: 30, status: 'published', id: 1 },\n * { author: 'Sally', age: 31, status: 'published', id: 2 },\n * { author: 'Mike', age: 32, status: 'published', id: 3 },\n * { author: 'Adam', age: 33, status: 'deleted', id: 4 },\n * { author: 'Adam', age: 33, status: 'published', id: 5 }\n * ];\n * store.add('post', posts);\n *\n * const myPublishedPosts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'published'\n * },\n * user_id: {\n * '==': currentUser.id\n * }\n * }\n * });\n *\n * console.log(myPublishedPosts);\n *\n * @name Query.ops\n * @property {Function} == Equality operator.\n * @property {Function} != Inequality operator.\n * @property {Function} > Greater than operator.\n * @property {Function} >= Greater than (inclusive) operator.\n * @property {Function} < Less than operator.\n * @property {Function} <= Less than (inclusive) operator.\n * @property {Function} isectEmpty Operator that asserts that the intersection\n * between two arrays is empty.\n * @property {Function} isectNotEmpty Operator that asserts that the\n * intersection between two arrays is __not__ empty.\n * @property {Function} in Operator that asserts whether a value is in an\n * array.\n * @property {Function} notIn Operator that asserts whether a value is __not__\n * in an array.\n * @property {Function} contains Operator that asserts whether an array\n * contains a value.\n * @property {Function} notContains Operator that asserts whether an array\n * does __not__ contain a value.\n * @since 3.0.0\n * @type {Object}\n */\n ops: {\n '=': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '==': function (value, predicate) {\n return value == predicate // eslint-disable-line\n },\n '===': function (value, predicate) {\n return value === predicate\n },\n '!=': function (value, predicate) {\n return value != predicate // eslint-disable-line\n },\n '!==': function (value, predicate) {\n return value !== predicate\n },\n '>': function (value, predicate) {\n return value > predicate\n },\n '>=': function (value, predicate) {\n return value >= predicate\n },\n '<': function (value, predicate) {\n return value < predicate\n },\n '<=': function (value, predicate) {\n return value <= predicate\n },\n 'isectEmpty': function (value, predicate) {\n return !utils.intersection((value || []), (predicate || [])).length\n },\n 'isectNotEmpty': function (value, predicate) {\n return utils.intersection((value || []), (predicate || [])).length\n },\n 'in': function (value, predicate) {\n return predicate.indexOf(value) !== -1\n },\n 'notIn': function (value, predicate) {\n return predicate.indexOf(value) === -1\n },\n 'contains': function (value, predicate) {\n return (value || []).indexOf(predicate) !== -1\n },\n 'notContains': function (value, predicate) {\n return (value || []).indexOf(predicate) === -1\n }\n }\n})\n\n/**\n * Create a subclass of this Query:\n * @example Query.extend\n * const JSData = require('js-data');\n * const { Query } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomQueryClass extends Query {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customQuery = new CustomQueryClass();\n * console.log(customQuery.foo());\n * console.log(CustomQueryClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherQueryClass = Query.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherQuery = new OtherQueryClass();\n * console.log(otherQuery.foo());\n * console.log(OtherQueryClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherQueryClass (collection) {\n * Query.call(this, collection);\n * this.created_at = new Date().getTime();\n * }\n * Query.extend({\n * constructor: AnotherQueryClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherQuery = new AnotherQueryClass();\n * console.log(anotherQuery.created_at);\n * console.log(anotherQuery.foo());\n * console.log(AnotherQueryClass.beep());\n *\n * @method Query.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Query class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\n// TODO: remove this when the rest of the project is cleaned\nexport const belongsToType = 'belongsTo'\nexport const hasManyType = 'hasMany'\nexport const hasOneType = 'hasOne'\n\nconst DOMAIN = 'Relation'\n\nexport function Relation (relatedMapper, options = {}) {\n utils.classCallCheck(this, Relation)\n\n options.type = this.constructor.TYPE_NAME\n this.validateOptions(relatedMapper, options)\n\n if (typeof relatedMapper === 'object') {\n Object.defineProperty(this, 'relatedMapper', { value: relatedMapper })\n }\n\n Object.defineProperty(this, 'inverse', { writable: true })\n utils.fillIn(this, options)\n}\n\nRelation.extend = utils.extend\n\nutils.addHiddenPropsToTarget(Relation.prototype, {\n get canAutoAddLinks () {\n return this.add === undefined || !!this.add\n },\n\n get relatedCollection () {\n return this.mapper.datastore.getCollection(this.relation)\n },\n\n validateOptions (related, opts) {\n const DOMAIN_ERR = `new ${DOMAIN}`\n\n const localField = opts.localField\n if (!localField) {\n throw utils.err(DOMAIN_ERR, 'opts.localField')(400, 'string', localField)\n }\n\n const foreignKey = opts.foreignKey = opts.foreignKey || opts.localKey\n if (!foreignKey && (opts.type === belongsToType || opts.type === hasOneType)) {\n throw utils.err(DOMAIN_ERR, 'opts.foreignKey')(400, 'string', foreignKey)\n }\n\n if (utils.isString(related)) {\n opts.relation = related\n if (!utils.isFunction(opts.getRelation)) {\n throw utils.err(DOMAIN_ERR, 'opts.getRelation')(400, 'function', opts.getRelation)\n }\n } else if (related) {\n opts.relation = related.name\n } else {\n throw utils.err(DOMAIN_ERR, 'related')(400, 'Mapper or string', related)\n }\n },\n\n assignTo (mapper) {\n this.name = mapper.name\n Object.defineProperty(this, 'mapper', { value: mapper })\n\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n mapper.relationFields || Object.defineProperty(mapper, 'relationFields', { value: [] })\n mapper.relationList.push(this)\n mapper.relationFields.push(this.localField)\n },\n\n canFindLinkFor () {\n return !!(this.foreignKey || this.localKey)\n },\n\n getRelation () {\n return this.relatedMapper\n },\n\n getForeignKey (record) {\n return utils.get(record, this.mapper.idAttribute)\n },\n\n setForeignKey (record, relatedRecord) {\n if (!record || !relatedRecord) {\n return\n }\n\n this._setForeignKey(record, relatedRecord)\n },\n\n _setForeignKey (record, relatedRecords) {\n const idAttribute = this.mapper.idAttribute\n\n if (!utils.isArray(relatedRecords)) {\n relatedRecords = [relatedRecords]\n }\n\n relatedRecords.forEach((relatedRecord) => {\n utils.set(relatedRecord, this.foreignKey, utils.get(record, idAttribute))\n })\n },\n\n getLocalField (record) {\n return utils.get(record, this.localField)\n },\n\n setLocalField (record, relatedData) {\n return utils.set(record, this.localField, relatedData)\n },\n\n getInverse (mapper) {\n if (!this.inverse) {\n this.findInverseRelation(mapper)\n }\n\n return this.inverse\n },\n\n findInverseRelation (mapper) {\n this.getRelation().relationList.forEach((def) => {\n if (def.getRelation() === mapper && this.isInversedTo(def) && this !== def) {\n this.inverse = def\n return true\n }\n })\n },\n\n isInversedTo (def) {\n return !def.foreignKey || def.foreignKey === this.foreignKey\n },\n\n addLinkedRecords (records) {\n const datastore = this.mapper.datastore\n\n records.forEach((record) => {\n let relatedData = this.getLocalField(record)\n\n if (utils.isFunction(this.add)) {\n relatedData = this.add(datastore, this, record)\n } else if (relatedData) {\n relatedData = this.linkRecord(record, relatedData)\n }\n\n const isEmptyLinks = !relatedData || (utils.isArray(relatedData) && !relatedData.length)\n\n if (isEmptyLinks && this.canFindLinkFor(record)) {\n relatedData = this.findExistingLinksFor(record)\n }\n\n if (relatedData) {\n this.setLocalField(record, relatedData)\n }\n })\n },\n\n removeLinkedRecords (relatedMapper, records) {\n const localField = this.localField\n records.forEach((record) => {\n utils.set(record, localField, undefined)\n })\n },\n\n linkRecord (record, relatedRecord) {\n const relatedId = utils.get(relatedRecord, this.mapper.idAttribute)\n\n if (relatedId === undefined) {\n const unsaved = this.relatedCollection.unsaved()\n if (unsaved.indexOf(relatedRecord) === -1) {\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n } else {\n if (relatedRecord !== this.relatedCollection.get(relatedId)) {\n this.setForeignKey(record, relatedRecord)\n\n if (this.canAutoAddLinks) {\n relatedRecord = this.relatedCollection.add(relatedRecord)\n }\n }\n }\n\n return relatedRecord\n },\n\n // e.g. user hasMany post via \"foreignKey\", so find all posts of user\n findExistingLinksByForeignKey (id) {\n if (id === undefined || id === null) {\n return\n }\n return this.relatedCollection.filter({\n [this.foreignKey]: id\n })\n },\n\n ensureLinkedDataHasProperType (props, opts) {\n const relatedMapper = this.getRelation()\n const relationData = this.getLocalField(props)\n\n if (utils.isArray(relationData) && (!relationData.length || relatedMapper.is(relationData[0]))) {\n return\n }\n\n if (relationData && !relatedMapper.is(relationData)) {\n utils.set(props, this.localField, relatedMapper.createRecord(relationData, opts))\n }\n },\n\n isRequiresParentId () {\n return false\n },\n\n isRequiresChildId () {\n return false\n },\n\n createChildRecord (props, relationData, opts) {\n this.setForeignKey(props, relationData)\n\n return this.createLinked(relationData, opts).then((result) => {\n this.setLocalField(props, result)\n })\n },\n\n createLinked (props, opts) {\n const create = utils.isArray(props) ? 'createMany' : 'create'\n\n return this.getRelation()[create](props, opts)\n }\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const BelongsToRelation = Relation.extend({\n getForeignKey (record) {\n return utils.get(record, this.foreignKey)\n },\n\n _setForeignKey (record, relatedRecord) {\n utils.set(record, this.foreignKey, utils.get(relatedRecord, this.getRelation().idAttribute))\n },\n\n findExistingLinksFor (record) {\n // console.log('\\tBelongsTo#findExistingLinksFor', record)\n if (!record) {\n return\n }\n const relatedId = utils.get(record, this.foreignKey)\n if (relatedId !== undefined && relatedId !== null) {\n return this.relatedCollection.get(relatedId)\n }\n },\n\n isRequiresParentId () {\n return true\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n\n return this.createLinked(relationData, opts).then((record) => {\n this.setForeignKey(props, record)\n })\n },\n\n createChildRecord () {\n throw new Error('\"BelongsTo\" relation does not support child creation as it cannot have children.')\n }\n}, {\n TYPE_NAME: 'belongsTo'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasManyRelation = Relation.extend({\n validateOptions (related, opts) {\n Relation.prototype.validateOptions.call(this, related, opts)\n\n const { localKeys, foreignKeys, foreignKey } = opts\n\n if (!foreignKey && !localKeys && !foreignKeys) {\n throw utils.err('new Relation', 'opts.')(400, 'string', foreignKey)\n }\n },\n\n canFindLinkFor (record) {\n const hasForeignKeys = this.foreignKey || this.foreignKeys\n return !!(hasForeignKeys || (this.localKeys && utils.get(record, this.localKeys)))\n },\n\n linkRecord (record, relatedRecords) {\n const relatedCollection = this.relatedCollection\n const canAutoAddLinks = this.canAutoAddLinks\n const foreignKey = this.foreignKey\n const unsaved = this.relatedCollection.unsaved()\n\n return relatedRecords.map((relatedRecord) => {\n const relatedId = relatedCollection.recordId(relatedRecord)\n\n if ((relatedId === undefined && unsaved.indexOf(relatedRecord) === -1) || relatedRecord !== relatedCollection.get(relatedId)) {\n if (foreignKey) {\n // TODO: slow, could be optimized? But user loses hook\n this.setForeignKey(record, relatedRecord)\n }\n if (canAutoAddLinks) {\n relatedRecord = relatedCollection.add(relatedRecord)\n }\n }\n\n return relatedRecord\n })\n },\n\n findExistingLinksFor (record) {\n const id = utils.get(record, this.mapper.idAttribute)\n const ids = this.localKeys ? utils.get(record, this.localKeys) : null\n let records\n\n if (id !== undefined && this.foreignKey) {\n records = this.findExistingLinksByForeignKey(id)\n } else if (this.localKeys && ids) {\n records = this.findExistingLinksByLocalKeys(ids)\n } else if (id !== undefined && this.foreignKeys) {\n records = this.findExistingLinksByForeignKeys(id)\n }\n\n if (records && records.length) {\n return records\n }\n },\n\n // e.g. user hasMany group via \"foreignKeys\", so find all users of a group\n findExistingLinksByLocalKeys (ids) {\n return this.relatedCollection.filter({\n where: {\n [this.mapper.idAttribute]: {\n 'in': ids\n }\n }\n })\n },\n\n // e.g. group hasMany user via \"localKeys\", so find all groups that own a user\n findExistingLinksByForeignKeys (id) {\n return this.relatedCollection.filter({\n where: {\n [this.foreignKeys]: {\n 'contains': id\n }\n }\n })\n },\n\n isRequiresParentId () {\n return !!this.localKeys && this.localKeys.length > 0\n },\n\n isRequiresChildId () {\n return !!this.foreignKey\n },\n\n createParentRecord (props, opts) {\n const relationData = this.getLocalField(props)\n const foreignIdField = this.getRelation().idAttribute\n\n return this.createLinked(relationData, opts).then((records) => {\n utils.set(props, this.localKeys, records.map((record) => utils.get(record, foreignIdField)))\n })\n },\n\n createLinked (props, opts) {\n return this.getRelation().createMany(props, opts)\n }\n}, {\n TYPE_NAME: 'hasMany'\n})\n","import utils from '../utils'\nimport { Relation } from '../Relation'\n\nexport const HasOneRelation = Relation.extend({\n findExistingLinksFor (relatedMapper, record) {\n const recordId = utils.get(record, relatedMapper.idAttribute)\n const records = this.findExistingLinksByForeignKey(recordId)\n\n if (records && records.length) {\n return records[0]\n }\n },\n\n isRequiresChildId () {\n return true\n }\n}, {\n TYPE_NAME: 'hasOne'\n})\n","import { Relation } from './Relation'\nimport { BelongsToRelation } from './Relation/BelongsTo'\nimport { HasManyRelation } from './Relation/HasMany'\nimport { HasOneRelation } from './Relation/HasOne'\n\n[BelongsToRelation, HasManyRelation, HasOneRelation].forEach(function (RelationType) {\n Relation[RelationType.TYPE_NAME] = function (related, options) {\n return new RelationType(related, options)\n }\n})\n\nexport { belongsToType, hasManyType, hasOneType, Relation } from './Relation'\n","import { Relation } from './relations'\n\nexport { belongsToType, hasManyType, hasOneType } from './relations'\n/**\n * BelongsTo relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.belongsTo\n * @method\n * @param {Mapper} related The relation the target belongs to.\n * @param {object} opts Configuration options.\n * @param {string} opts.foreignKey The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const belongsTo = function (related, opts) {\n return function (mapper) {\n Relation.belongsTo(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasMany relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasMany\n * @method\n * @param {Mapper} related The relation of which the target has many.\n * @param {object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasMany = function (related, opts) {\n return function (mapper) {\n Relation.hasMany(related, opts).assignTo(mapper)\n }\n}\n\n/**\n * HasOne relation decorator. You probably won't use this directly.\n *\n * @name module:js-data.hasOne\n * @method\n * @param {Mapper} related The relation of which the target has one.\n * @param {object} opts Configuration options.\n * @param {string} [opts.foreignKey] The field that holds the primary key of the\n * related record.\n * @param {string} opts.localField The field that holds a reference to the\n * related record object.\n * @returns {Function} Invocation function, which accepts the target as the only\n * parameter.\n */\nexport const hasOne = function (related, opts) {\n return function (mapper) {\n Relation.hasOne(related, opts).assignTo(mapper)\n }\n}\n","import utils, { safeSetLink } from './utils'\nimport Component from './Component'\nimport Settable from './Settable'\nimport {\n hasManyType,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Record'\n\nconst superMethod = function (mapper, name) {\n const store = mapper.datastore\n if (store && store[name]) {\n return function (...args) {\n return store[name](mapper.name, ...args)\n }\n }\n return mapper[name].bind(mapper)\n}\n\n// Cache these strings\nconst creatingPath = 'creating'\nconst noValidatePath = 'noValidate'\nconst keepChangeHistoryPath = 'keepChangeHistory'\nconst previousPath = 'previous'\n\n/**\n * js-data's Record class. An instance of `Record` corresponds to an in-memory\n * representation of a single row or document in a database, Firebase,\n * localstorage, etc. Basically, a `Record` instance represents whatever kind of\n * entity in your persistence layer that has a primary key.\n *\n * ```javascript\n * import {Record} from 'js-data'\n * ```\n *\n * @example Record#constructor\n * const JSData = require('js-data');\n * const { Record } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Instantiate a plain record\n * let record = new Record();\n * console.log('record: ' + JSON.stringify(record));\n *\n * // You can supply properties on instantiation\n * record = new Record({ name: 'John' });\n * console.log('record: ' + JSON.stringify(record));\n *\n * @example Record#constructor2\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Instantiate a record that's associated with a Mapper:\n * const UserMapper = new Mapper({ name: 'user' });\n * const User = UserMapper.recordClass;\n * const user = UserMapper.createRecord({ name: 'John' });\n * const user2 = new User({ name: 'Sally' });\n * console.log('user: ' + JSON.stringify(user));\n * console.log('user2: ' + JSON.stringify(user2));\n *\n * @example Record#constructor3\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n *\n * // Instantiate a record that's associated with a store's Mapper\n * const user = store.createRecord('user', { name: 'John' });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @example Record#constructor4\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * // Validate on instantiation\n * const user = store.createRecord('user', { name: 1234 });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @example Record#constructor5\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * // Skip validation on instantiation\n * const user = store.createRecord('user', { name: 1234 }, { noValidate: true });\n * console.log('user: ' + JSON.stringify(user));\n * console.log('user.isValid(): ' + user.isValid());\n *\n * @class Record\n * @extends Component\n * @param {object} [props] The initial properties of the new Record instance.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate=false] Whether to skip validation on the\n * initial properties.\n * @param {boolean} [opts.validateOnSet=true] Whether to enable setter\n * validation on properties after the Record has been initialized.\n * @since 3.0.0\n */\nfunction Record (props, opts) {\n utils.classCallCheck(this, Record)\n Settable.call(this)\n props || (props = {})\n opts || (opts = {})\n const _set = this._set\n const mapper = this.constructor.mapper\n\n _set(creatingPath, true)\n _set(noValidatePath, !!opts.noValidate)\n _set(keepChangeHistoryPath, opts.keepChangeHistory === undefined ? (mapper ? mapper.keepChangeHistory : true) : opts.keepChangeHistory)\n\n // Set the idAttribute value first, if it exists.\n const id = mapper ? utils.get(props, mapper.idAttribute) : undefined\n if (id !== undefined) {\n utils.set(this, mapper.idAttribute, id)\n }\n\n utils.fillIn(this, props)\n _set(creatingPath, false)\n if (opts.validateOnSet !== undefined) {\n _set(noValidatePath, !opts.validateOnSet)\n } else if (mapper && mapper.validateOnSet !== undefined) {\n _set(noValidatePath, !mapper.validateOnSet)\n } else {\n _set(noValidatePath, false)\n }\n _set(previousPath, mapper ? mapper.toJSON(props) : utils.plainCopy(props))\n}\n\nexport default Component.extend({\n constructor: Record,\n\n /**\n * Returns the {@link Mapper} paired with this record's class, if any.\n *\n * @method Record#_mapper\n * @returns {Mapper} The {@link Mapper} paired with this record's class, if any.\n * @since 3.0.0\n */\n _mapper () {\n const mapper = this.constructor.mapper\n if (!mapper) {\n throw utils.err(`${DOMAIN}#_mapper`, '')(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Lifecycle hook.\n *\n * @method Record#afterLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n afterLoadRelations () {},\n\n /**\n * Lifecycle hook.\n *\n * @method Record#beforeLoadRelations\n * @param {string[]} relations The `relations` argument passed to {@link Record#loadRelations}.\n * @param {object} opts The `opts` argument passed to {@link Record#loadRelations}.\n * @since 3.0.0\n */\n beforeLoadRelations () {},\n\n /**\n * Return the change history of this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @method Record#changeHistory\n * @since 3.0.0\n */\n changeHistory () {\n return (this._get('history') || []).slice()\n },\n\n /**\n * Return changes to this record since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#changes\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user changes: ' + JSON.stringify(user.changes()));\n * user.name = 'John';\n * console.log('user changes: ' + JSON.stringify(user.changes()));\n *\n * @method Record#changes\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {Object} Object describing the changes to this record since it was\n * instantiated or its {@link Record#commit} method was last called.\n * @since 3.0.0\n */\n changes (opts) {\n opts || (opts = {})\n return utils.diffObjects(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Make the record's current in-memory state it's only state, with any\n * previous property values being set to current values.\n *\n * @example Record#commit\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.name = 'John';\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.commit();\n * console.log('user hasChanges: ' + user.hasChanges());\n *\n * @method Record#commit\n * @param {object} [opts] Configuration options. Passed to {@link Record#toJSON}.\n * @since 3.0.0\n */\n commit (opts) {\n this._set('changed') // unset\n this._set('changing', false)\n this._set('history', []) // clear history\n this._set('previous', this.toJSON(opts))\n },\n\n /**\n * Call {@link Mapper#destroy} using this record's primary key.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('user');\n * store.find('user', 1234).then((user) => {\n * console.log(user.id); // 1234\n *\n * // Destroy this user from the database\n * return user.destroy();\n * });\n *\n * @method Record#destroy\n * @param {object} [opts] Configuration options passed to {@link Mapper#destroy}.\n * @returns {Promise} The result of calling {@link Mapper#destroy} with the\n * primary key of this record.\n * @since 3.0.0\n */\n destroy (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n return superMethod(mapper, 'destroy')(utils.get(this, mapper.idAttribute), opts)\n },\n\n /**\n * Return the value at the given path for this instance.\n *\n * @example Record#get\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user', { name: 'Bob' });\n * console.log('user.get(\"name\"): ' + user.get('name'));\n *\n * @method Record#get\n * @param {string} key Path of value to retrieve.\n * @returns {*} Value at path.\n * @since 3.0.0\n */\n 'get' (key) {\n return utils.get(this, key)\n },\n\n /**\n * Return whether this record has changed since it was instantiated or\n * {@link Record#commit} was called.\n *\n * @example Record#hasChanges\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.name = 'John';\n * console.log('user hasChanges: ' + user.hasChanges());\n * user.commit();\n * console.log('user hasChanges: ' + user.hasChanges());\n *\n * @method Record#hasChanges\n * @param [opts] Configuration options.\n * @param {Function} [opts.equalsFn={@link utils.deepEqual}] Equality function.\n * @param {array} [opts.ignore=[]] Array of strings or RegExp of fields to ignore.\n * @returns {boolean} Return whether the record has changed since it was\n * instantiated or since its {@link Record#commit} method was called.\n * @since 3.0.0\n */\n hasChanges (opts) {\n const quickHasChanges = !!(this._get('changed') || []).length\n return quickHasChanges || utils.areDifferent(typeof this.toJSON === 'function' ? this.toJSON(opts) : this, this._get('previous'), opts)\n },\n\n /**\n * Return whether the record is unsaved. Records that have primary keys are\n * considered \"saved\". Records without primary keys are considered \"unsaved\".\n *\n * @example Record#isNew\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * id: 1234\n * });\n * const user2 = store.createRecord('user');\n * console.log('user isNew: ' + user.isNew()); // false\n * console.log('user2 isNew: ' + user2.isNew()); // true\n *\n * @method Record#isNew\n * @returns {boolean} Whether the record is unsaved.\n * @since 3.0.0\n */\n isNew (opts) {\n return utils.get(this, this._mapper().idAttribute) === undefined\n },\n\n /**\n * Return whether the record in its current state passes validation.\n *\n * @example Record#isValid\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * });\n * console.log('user isValid: ' + user.isValid());\n * user.name = 'John';\n * console.log('user isValid: ' + user.isValid());\n *\n * @method Record#isValid\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {boolean} Whether the record in its current state passes\n * validation.\n * @since 3.0.0\n */\n isValid (opts) {\n return !this._mapper().validate(this, opts)\n },\n\n removeInverseRelation (currentParent, id, inverseDef, idAttribute) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n // e.g. remove comment from otherPost.comments\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n setupInverseRelation (record, id, inverseDef, idAttribute) {\n // Update (set) inverse relation\n if (inverseDef.type === hasOneType) {\n // e.g. someUser.profile = profile\n safeSetLink(record, inverseDef.localField, this)\n } else if (inverseDef.type === hasManyType) {\n // e.g. add comment to somePost.comments\n const children = utils.get(record, inverseDef.localField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n },\n\n /**\n * Lazy load relations of this record, to be attached to the record once their\n * loaded.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('user', {\n * relations: {\n * hasMany: {\n * post: {\n * localField: 'posts',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * });\n * store.defineMapper('post', {\n * relations: {\n * belongsTo: {\n * user: {\n * localField: 'user',\n * foreignKey: 'user_id'\n * }\n * }\n * }\n * });\n * store.find('user', 1234).then((user) => {\n * console.log(user.id); // 1234\n *\n * // Load the user's post relations\n * return user.loadRelations(['post']);\n * }).then((user) => {\n * console.log(user.posts); // [{...}, {...}, ...]\n * });\n *\n * @method Record#loadRelations\n * @param {string[]} [relations] List of relations to load. Can use localField\n * names or Mapper names to pick relations.\n * @param {object} [opts] Configuration options.\n * @returns {Promise} Resolves with the record, with the loaded relations now\n * attached.\n * @since 3.0.0\n */\n loadRelations (relations, opts) {\n let op\n const mapper = this._mapper()\n\n // Default values for arguments\n relations || (relations = [])\n if (utils.isString(relations)) {\n relations = [relations]\n }\n opts || (opts = {})\n opts.with = relations\n\n // Fill in \"opts\" with the Model's configuration\n utils._(opts, mapper)\n opts.adapter = mapper.getAdapterName(opts)\n\n // beforeLoadRelations lifecycle hook\n op = opts.op = 'beforeLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => {\n // Now delegate to the adapter\n op = opts.op = 'loadRelations'\n mapper.dbg(op, this, relations, opts)\n let tasks = []\n let task\n utils.forEachRelation(mapper, opts, (def, optsCopy) => {\n const relatedMapper = def.getRelation()\n optsCopy.raw = false\n if (utils.isFunction(def.load)) {\n task = def.load(mapper, def, this, opts)\n } else if (def.type === 'hasMany' || def.type === 'hasOne') {\n if (def.foreignKey) {\n task = superMethod(relatedMapper, 'findAll')({\n [def.foreignKey]: utils.get(this, mapper.idAttribute)\n }, optsCopy).then(function (relatedData) {\n if (def.type === 'hasOne') {\n return relatedData.length ? relatedData[0] : undefined\n }\n return relatedData\n })\n } else if (def.localKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [relatedMapper.idAttribute]: {\n 'in': utils.get(this, def.localKeys)\n }\n }\n })\n } else if (def.foreignKeys) {\n task = superMethod(relatedMapper, 'findAll')({\n where: {\n [def.foreignKeys]: {\n 'contains': utils.get(this, mapper.idAttribute)\n }\n }\n }, opts)\n }\n } else if (def.type === 'belongsTo') {\n const key = utils.get(this, def.foreignKey)\n if (utils.isSorN(key)) {\n task = superMethod(relatedMapper, 'find')(key, optsCopy)\n }\n }\n if (task) {\n task = task.then((relatedData) => {\n def.setLocalField(this, relatedData)\n })\n tasks.push(task)\n }\n })\n return Promise.all(tasks)\n }).then(() => {\n // afterLoadRelations lifecycle hook\n op = opts.op = 'afterLoadRelations'\n return utils.resolve(this[op](relations, opts)).then(() => this)\n })\n },\n\n /**\n * Return the properties with which this record was instantiated.\n *\n * @example Record#previous\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * name: 'William'\n * });\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n * user.name = 'Bob';\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n * user.commit();\n * console.log('user previous: ' + JSON.stringify(user.previous()));\n *\n * @method Record#previous\n * @param {string} [key] If specified, return just the initial value of the\n * given key.\n * @returns {Object} The initial properties of this record.\n * @since 3.0.0\n */\n previous (key) {\n if (key) {\n return this._get(`previous.${key}`)\n }\n return this._get('previous')\n },\n\n /**\n * Revert changes to this record back to the properties it had when it was\n * instantiated.\n *\n * @example Record#revert\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user', {\n * name: 'William'\n * });\n * console.log('user: ' + JSON.stringify(user));\n * user.name = 'Bob';\n * console.log('user: ' + JSON.stringify(user));\n * user.revert();\n * console.log('user: ' + JSON.stringify(user));\n *\n * @method Record#revert\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.preserve] Array of strings or Regular Expressions\n * denoting properties that should not be reverted.\n * @since 3.0.0\n */\n revert (opts) {\n const previous = this._get('previous')\n opts || (opts = {})\n opts.preserve || (opts.preserve = [])\n utils.forOwn(this, (value, key) => {\n if (key !== this._mapper().idAttribute && !previous.hasOwnProperty(key) && this.hasOwnProperty(key) && opts.preserve.indexOf(key) === -1) {\n delete this[key]\n }\n })\n utils.forOwn(previous, (value, key) => {\n if (opts.preserve.indexOf(key) === -1) {\n this[key] = value\n }\n })\n this.commit()\n },\n\n /**\n * Delegates to {@link Mapper#create} or {@link Mapper#update}.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n *\n * const store = new Container();\n * store.registerAdapter('rethink', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('session');\n * const session = store.createRecord('session', { topic: 'Node.js' });\n *\n * // Create a new record in the database\n * session.save().then(() => {\n * console.log(session.id); // 1234\n *\n * session.skill_level = 'beginner';\n *\n * // Update the record in the database\n * return session.save();\n * });\n *\n * @method Record#save\n * @param {object} [opts] Configuration options. See {@link Mapper#create} and\n * {@link Mapper#update}.\n * @param {boolean} [opts.changesOnly] Equality function. Default uses `===`.\n * @param {Function} [opts.equalsFn] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @param {array} [opts.ignore] Passed to {@link Record#changes} when\n * `opts.changesOnly` is `true`.\n * @returns {Promise} The result of calling {@link Mapper#create} or\n * {@link Mapper#update}.\n * @since 3.0.0\n */\n save (opts) {\n opts || (opts = {})\n const mapper = this._mapper()\n const id = utils.get(this, mapper.idAttribute)\n let props = this\n\n const postProcess = (result) => {\n const record = opts.raw ? result.data : result\n if (record) {\n utils.deepMixIn(this, record)\n this.commit()\n }\n return result\n }\n\n if (id === undefined) {\n return superMethod(mapper, 'create')(props, opts).then(postProcess)\n }\n if (opts.changesOnly) {\n const changes = this.changes(opts)\n props = {}\n utils.fillIn(props, changes.added)\n utils.fillIn(props, changes.changed)\n }\n return superMethod(mapper, 'update')(id, props, opts).then(postProcess)\n },\n\n /**\n * Set the value for a given key, or the values for the given keys if \"key\" is\n * an object. Triggers change events on those properties that have `track: true`\n * in {@link Mapper#schema}.\n *\n * @example Record#set\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user');\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.set('name', 'Bob');\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.set({ age: 30, role: 'admin' });\n * console.log('user: ' + JSON.stringify(user));\n *\n * @fires Record#change\n * @method Record#set\n * @param {(string|Object)} key Key to set or hash of key-value pairs to set.\n * @param {*} [value] Value to set for the given key.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n 'set' (key, value, opts) {\n if (utils.isObject(key)) {\n opts = value\n }\n opts || (opts = {})\n if (opts.silent) {\n this._set('silent', true)\n }\n utils.set(this, key, value)\n if (!this._get('eventId')) {\n this._set('silent') // unset\n }\n },\n\n /**\n * Return a plain object representation of this record. If the class from\n * which this record was created has a Mapper, then {@link Mapper#toJSON} will\n * be called with this record instead.\n *\n * @example Record#toJSON\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n *\n * const user = store.createRecord('user', {\n * name: 'John',\n * $$hashKey: '1234'\n * });\n * console.log('user: ' + JSON.stringify(user.toJSON()));\n *\n * @method Record#toJSON\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation. Only available as an option if the class\n * from which this record was created has a Mapper and this record resides in\n * an instance of {@link DataStore}.\n * @returns {Object} Plain object representation of this record.\n * @since 3.0.0\n */\n toJSON (opts) {\n const mapper = this.constructor.mapper\n if (mapper) {\n return mapper.toJSON(this, opts)\n } else {\n const json = {}\n utils.forOwn(this, (prop, key) => {\n json[key] = utils.plainCopy(prop)\n })\n return json\n }\n },\n\n /**\n * Unset the value for a given key. Triggers change events on those properties\n * that have `track: true` in {@link Mapper#schema}.\n *\n * @example Record#unset\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user');\n *\n * const user = store.createRecord('user', {\n * name: 'John'\n * });\n * console.log('user: ' + JSON.stringify(user));\n *\n * user.unset('name');\n * console.log('user: ' + JSON.stringify(user));\n *\n * @method Record#unset\n * @param {string} key Key to unset.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.silent=false] Whether to trigger change events.\n * @since 3.0.0\n */\n unset (key, opts) {\n this.set(key, undefined, opts)\n },\n\n /**\n * Validate this record based on its current properties.\n *\n * @example Record#validate\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: {\n * properties: {\n * name: { type: 'string' }\n * }\n * }\n * });\n * const user = store.createRecord('user', {\n * name: 1234\n * }, {\n * noValidate: true // this allows us to put the record into an invalid state\n * });\n * console.log('user validation: ' + JSON.stringify(user.validate()));\n * user.name = 'John';\n * console.log('user validation: ' + user.validate());\n *\n * @method Record#validate\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#validate}.\n * @returns {*} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (opts) {\n return this._mapper().validate(this, opts)\n }\n}, {\n creatingPath,\n noValidatePath,\n keepChangeHistoryPath,\n previousPath\n})\n\n/**\n * Allow records to emit events.\n *\n * An record's registered listeners are stored in the record's private data.\n */\nutils.eventify(\n Record.prototype,\n function () {\n return this._get('events')\n },\n function (value) {\n this._set('events', value)\n }\n)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link Record~changeListener} on how to listen for this event.\n *\n * @event Record#change\n * @see Record~changeListener\n */\n\n/**\n * Callback signature for the {@link Record#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * record.on('change', onChange);\n *\n * @callback Record~changeListener\n * @param {Record} The Record that changed.\n * @param {object} The changes.\n * @see Record#event:change\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Record:\n * @example Record.extend\n * const JSData = require('js-data');\n * const { Record } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomRecordClass extends Record {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customRecord = new CustomRecordClass();\n * console.log(customRecord.foo());\n * console.log(CustomRecordClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherRecordClass = Record.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherRecord = new OtherRecordClass();\n * console.log(otherRecord.foo());\n * console.log(OtherRecordClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherRecordClass () {\n * Record.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Record.extend({\n * constructor: AnotherRecordClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherRecord = new AnotherRecordClass();\n * console.log(anotherRecord.created_at);\n * console.log(anotherRecord.foo());\n * console.log(AnotherRecordClass.beep());\n *\n * @method Record.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Record class.\n * @since 3.0.0\n */\n","export function sort (a, b, hashCode) {\n // Short-circuit comparison if a and b are strictly equal\n // This is absolutely necessary for indexed objects that\n // don't have the idAttribute field\n if (a === b) {\n return 0\n }\n if (hashCode) {\n a = hashCode(a)\n b = hashCode(b)\n }\n if ((a === null && b === null) || (a === undefined && b === undefined)) {\n return -1\n }\n\n if (a === null || a === undefined) {\n return -1\n }\n\n if (b === null || b === undefined) {\n return 1\n }\n\n if (a < b) {\n return -1\n }\n\n if (a > b) {\n return 1\n }\n\n return 0\n}\n\nexport function insertAt (array, index, value) {\n array.splice(index, 0, value)\n return array\n}\n\nexport function removeAt (array, index) {\n array.splice(index, 1)\n return array\n}\n\nexport function binarySearch (array, value, field) {\n let lo = 0\n let hi = array.length\n let compared\n let mid\n\n while (lo < hi) {\n mid = ((lo + hi) / 2) | 0\n compared = sort(value, array[mid], field)\n if (compared === 0) {\n return {\n found: true,\n index: mid\n }\n } else if (compared < 0) {\n hi = mid\n } else {\n lo = mid + 1\n }\n }\n\n return {\n found: false,\n index: hi\n }\n}\n","// Copyright (c) 2015, InternalFX.\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose with or\n// without fee is hereby granted, provided that the above copyright notice and this permission\n// notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO\n// THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT\n// SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR\n// ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE\n// USE OR PERFORMANCE OF THIS SOFTWARE.\n\n// Modifications\n// Copyright 2015-2016 Jason Dobry\n//\n// Summary of modifications:\n// Reworked dependencies so as to re-use code already in js-data\n// Removed unused code\nimport utils from '../../src/utils'\nimport {binarySearch, insertAt, removeAt} from './_utils'\n\nexport default function Index (fieldList, opts) {\n utils.classCallCheck(this, Index)\n fieldList || (fieldList = [])\n\n if (!utils.isArray(fieldList)) {\n throw new Error('fieldList must be an array.')\n }\n\n opts || (opts = {})\n this.fieldList = fieldList\n this.fieldGetter = opts.fieldGetter\n this.hashCode = opts.hashCode\n this.isIndex = true\n this.keys = []\n this.values = []\n}\n\nutils.addHiddenPropsToTarget(Index.prototype, {\n 'set' (keyList, value) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n let dataLocation = binarySearch(this.values[pos.index], value, this.hashCode)\n if (!dataLocation.found) {\n insertAt(this.values[pos.index], dataLocation.index, value)\n }\n } else {\n insertAt(this.keys, pos.index, key)\n insertAt(this.values, pos.index, [value])\n }\n } else {\n if (pos.found) {\n this.values[pos.index].set(keyList, value)\n } else {\n insertAt(this.keys, pos.index, key)\n let newIndex = new Index([], { hashCode: this.hashCode })\n newIndex.set(keyList, value)\n insertAt(this.values, pos.index, newIndex)\n }\n }\n },\n\n 'get' (keyList) {\n if (!utils.isArray(keyList)) {\n keyList = [keyList]\n }\n\n let key = keyList.shift() || undefined\n let pos = binarySearch(this.keys, key)\n\n if (keyList.length === 0) {\n if (pos.found) {\n if (this.values[pos.index].isIndex) {\n return this.values[pos.index].getAll()\n } else {\n return this.values[pos.index].slice()\n }\n } else {\n return []\n }\n } else {\n if (pos.found) {\n return this.values[pos.index].get(keyList)\n } else {\n return []\n }\n }\n },\n\n getAll (opts) {\n opts || (opts = {})\n let results = []\n const values = this.values\n if (opts.order === 'desc') {\n for (let i = values.length - 1; i >= 0; i--) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n } else {\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n if (value.isIndex) {\n results = results.concat(value.getAll(opts))\n } else {\n results = results.concat(value)\n }\n }\n }\n return results\n },\n\n visitAll (cb, thisArg) {\n this.values.forEach(function (value) {\n if (value.isIndex) {\n value.visitAll(cb, thisArg)\n } else {\n value.forEach(cb, thisArg)\n }\n })\n },\n\n between (leftKeys, rightKeys, opts) {\n opts || (opts = {})\n if (!utils.isArray(leftKeys)) {\n leftKeys = [leftKeys]\n }\n if (!utils.isArray(rightKeys)) {\n rightKeys = [rightKeys]\n }\n utils.fillIn(opts, {\n leftInclusive: true,\n rightInclusive: false,\n limit: undefined,\n offset: 0\n })\n\n let results = this._between(leftKeys, rightKeys, opts)\n\n if (opts.limit) {\n return results.slice(opts.offset, opts.limit + opts.offset)\n } else {\n return results.slice(opts.offset)\n }\n },\n\n _between (leftKeys, rightKeys, opts) {\n let results = []\n\n let leftKey = leftKeys.shift()\n let rightKey = rightKeys.shift()\n\n let pos\n\n if (leftKey !== undefined) {\n pos = binarySearch(this.keys, leftKey)\n } else {\n pos = {\n found: false,\n index: 0\n }\n }\n\n if (leftKeys.length === 0) {\n if (pos.found && opts.leftInclusive === false) {\n pos.index += 1\n }\n\n for (let i = pos.index; i < this.keys.length; i += 1) {\n if (rightKey !== undefined) {\n if (opts.rightInclusive) {\n if (this.keys[i] > rightKey) { break }\n } else {\n if (this.keys[i] >= rightKey) { break }\n }\n }\n\n if (this.values[i].isIndex) {\n results = results.concat(this.values[i].getAll())\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n } else {\n for (let i = pos.index; i < this.keys.length; i += 1) {\n let currKey = this.keys[i]\n if (currKey > rightKey) { break }\n\n if (this.values[i].isIndex) {\n if (currKey === leftKey) {\n results = results.concat(this.values[i]._between(utils.copy(leftKeys), rightKeys.map(function () { return undefined }), opts))\n } else if (currKey === rightKey) {\n results = results.concat(this.values[i]._between(leftKeys.map(function () { return undefined }), utils.copy(rightKeys), opts))\n } else {\n results = results.concat(this.values[i].getAll())\n }\n } else {\n results = results.concat(this.values[i])\n }\n\n if (opts.limit) {\n if (results.length >= (opts.limit + opts.offset)) {\n break\n }\n }\n }\n }\n\n if (opts.limit) {\n return results.slice(0, opts.limit + opts.offset)\n } else {\n return results\n }\n },\n\n peek () {\n if (this.values.length) {\n if (this.values[0].isIndex) {\n return this.values[0].peek()\n } else {\n return this.values[0]\n }\n }\n return []\n },\n\n clear () {\n this.keys = []\n this.values = []\n },\n\n insertRecord (data) {\n let keyList = this.fieldList.map(function (field) {\n if (utils.isFunction(field)) {\n return field(data) || undefined\n } else {\n return data[field] || undefined\n }\n })\n this.set(keyList, data)\n },\n\n removeRecord (data) {\n let removed\n const isUnique = this.hashCode(data) !== undefined\n this.values.forEach((value, i) => {\n if (value.isIndex) {\n if (value.removeRecord(data)) {\n if (value.keys.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n } else {\n let dataLocation = {}\n if (this.keys[i] === undefined || !isUnique) {\n for (let j = value.length - 1; j >= 0; j--) {\n if (value[j] === data) {\n dataLocation = {\n found: true,\n index: j\n }\n break\n }\n }\n } else if (isUnique) {\n dataLocation = binarySearch(value, data, this.hashCode)\n }\n if (dataLocation.found) {\n removeAt(value, dataLocation.index)\n if (value.length === 0) {\n removeAt(this.keys, i)\n removeAt(this.values, i)\n }\n removed = true\n return false\n }\n }\n })\n return removed ? data : undefined\n },\n\n updateRecord (data) {\n const removed = this.removeRecord(data)\n if (removed !== undefined) {\n this.insertRecord(data)\n }\n }\n})\n","import utils from './utils'\nimport Component from './Component'\nimport Query from './Query'\nimport Record from './Record'\nimport Index from '../lib/mindex/index'\n\nconst { noValidatePath } = Record\n\nconst DOMAIN = 'Collection'\n\nconst COLLECTION_DEFAULTS = {\n /**\n * Whether to call {@link Record#commit} on records that are added to the\n * collection and already exist in the collection.\n *\n * @name Collection#commitOnMerge\n * @type {boolean}\n * @default true\n */\n commitOnMerge: true,\n\n /**\n * Whether record events should bubble up and be emitted by the collection.\n *\n * @name Collection#emitRecordEvents\n * @type {boolean}\n * @default true\n */\n emitRecordEvents: true,\n\n /**\n * Field to be used as the unique identifier for records in this collection.\n * Defaults to `\"id\"` unless {@link Collection#mapper} is set, in which case\n * this will default to {@link Mapper#idAttribute}.\n *\n * @name Collection#idAttribute\n * @type {string}\n * @default \"id\"\n */\n idAttribute: 'id',\n\n /**\n * What to do when inserting a record into this Collection that shares a\n * primary key with a record already in this Collection.\n *\n * Possible values:\n * merge\n * replace\n * skip\n *\n * Merge:\n *\n * Recursively shallow copy properties from the new record onto the existing\n * record.\n *\n * Replace:\n *\n * Shallow copy top-level properties from the new record onto the existing\n * record. Any top-level own properties of the existing record that are _not_\n * on the new record will be removed.\n *\n * Skip:\n *\n * Ignore new record, keep existing record.\n *\n * @name Collection#onConflict\n * @type {string}\n * @default \"merge\"\n */\n onConflict: 'merge'\n}\n\n/**\n * An ordered set of {@link Record} instances.\n *\n * @example Collection#constructor\n * // import { Collection, Record } from 'js-data';\n * const JSData = require('js-data');\n * const {Collection, Record} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const user1 = new Record({ id: 1 });\n * const user2 = new Record({ id: 2 });\n * const UserCollection = new Collection([user1, user2]);\n * console.log(UserCollection.get(1) === user1);\n *\n * @class Collection\n * @extends Component\n * @param {array} [records] Initial set of records to insert into the\n * collection.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.commitOnMerge] See {@link Collection#commitOnMerge}.\n * @param {string} [opts.idAttribute] See {@link Collection#idAttribute}.\n * @param {string} [opts.onConflict=\"merge\"] See {@link Collection#onConflict}.\n * @param {string} [opts.mapper] See {@link Collection#mapper}.\n * @since 3.0.0\n */\nfunction Collection (records, opts) {\n utils.classCallCheck(this, Collection)\n Component.call(this, opts)\n\n if (records && !utils.isArray(records)) {\n opts = records\n records = []\n }\n if (utils.isString(opts)) {\n opts = { idAttribute: opts }\n }\n\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * Default Mapper for this collection. Optional. If a Mapper is provided, then\n * the collection will use the {@link Mapper#idAttribute} setting, and will\n * wrap records in {@link Mapper#recordClass}.\n *\n * @example Collection#mapper\n * const JSData = require('js-data');\n * const {Collection, Mapper} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar'; }\n * }\n * const myMapper = new MyMapperClass({ name: 'myMapper' });\n * const collection = new Collection(null, { mapper: myMapper });\n *\n * @name Collection#mapper\n * @type {Mapper}\n * @default null\n * @since 3.0.0\n */\n mapper: {\n value: undefined,\n writable: true\n },\n // Query class used by this collection\n queryClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(COLLECTION_DEFAULTS))\n\n if (!this.queryClass) {\n this.queryClass = Query\n }\n\n const idAttribute = this.recordId()\n\n Object.defineProperties(this, {\n /**\n * The main index, which uses @{link Collection#recordId} as the key.\n *\n * @name Collection#index\n * @type {Index}\n */\n index: {\n value: new Index([idAttribute], {\n hashCode (obj) {\n return utils.get(obj, idAttribute)\n }\n })\n },\n\n /**\n * Object that holds the secondary indexes of this collection.\n *\n * @name Collection#indexes\n * @type {Object.}\n */\n indexes: {\n value: {}\n }\n })\n\n // Insert initial data into the collection\n if (utils.isObject(records) || (utils.isArray(records) && records.length)) {\n this.add(records)\n }\n}\n\nexport default Component.extend({\n constructor: Collection,\n\n /**\n * Used to bind to events emitted by records in this Collection.\n *\n * @method Collection#_onRecordEvent\n * @since 3.0.0\n * @private\n * @param {...*} [arg] Args passed to {@link Collection#emit}.\n */\n _onRecordEvent (...args) {\n if (this.emitRecordEvents) {\n this.emit(...args)\n }\n },\n\n /**\n * Insert the provided record or records.\n *\n * If a record is already in the collection then the provided record will\n * either merge with or replace the existing record based on the value of the\n * `onConflict` option.\n *\n * The collection's secondary indexes will be updated as each record is\n * visited.\n *\n * @method Collection#add\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} data The record or records to insert.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.commitOnMerge=true] See {@link Collection#commitOnMerge}.\n * @param {boolean} [opts.noValidate] See {@link Record#noValidate}.\n * @param {string} [opts.onConflict] See {@link Collection#onConflict}.\n * @returns {(Object|Object[]|Record|Record[])} The added record or records.\n */\n add (records, opts) {\n // Default values for arguments\n opts || (opts = {})\n\n // Fill in \"opts\" with the Collection's configuration\n utils._(opts, this)\n records = this.beforeAdd(records, opts) || records\n\n // Track whether just one record or an array of records is being inserted\n let singular = false\n const idAttribute = this.recordId()\n if (!utils.isArray(records)) {\n if (utils.isObject(records)) {\n records = [records]\n singular = true\n } else {\n throw utils.err(`${DOMAIN}#add`, 'records')(400, 'object or array', records)\n }\n }\n\n // Map the provided records to existing records.\n // New records will be inserted. If any records map to existing records,\n // they will be merged into the existing records according to the onConflict\n // option.\n records = records.map((record) => {\n let id = this.recordId(record)\n // Grab existing record if there is one\n const existing = id === undefined ? id : this.get(id)\n // If the currently visited record is just a reference to an existing\n // record, then there is nothing to be done. Exit early.\n if (record === existing) {\n return existing\n }\n\n if (existing) {\n // Here, the currently visited record corresponds to a record already\n // in the collection, so we need to merge them\n const onConflict = opts.onConflict || this.onConflict\n if (onConflict !== 'merge' && onConflict !== 'replace' && onConflict !== 'skip') {\n throw utils.err(`${DOMAIN}#add`, 'opts.onConflict')(400, 'one of (merge, replace, skip)', onConflict, true)\n }\n const existingNoValidate = existing._get(noValidatePath)\n if (opts.noValidate) {\n // Disable validation\n existing._set(noValidatePath, true)\n }\n if (onConflict === 'merge') {\n utils.deepMixIn(existing, record)\n } else if (onConflict === 'replace') {\n utils.forOwn(existing, (value, key) => {\n if (key !== idAttribute && record[key] === undefined) {\n existing[key] = undefined\n }\n })\n existing.set(record)\n } // else if(onConflict === 'skip'){ do nothing }\n\n if (opts.noValidate) {\n // Restore previous `noValidate` value\n existing._set(noValidatePath, existingNoValidate)\n }\n record = existing\n if (opts.commitOnMerge && utils.isFunction(record.commit)) {\n record.commit()\n }\n // Update all indexes in the collection\n this.updateIndexes(record)\n } else {\n // Here, the currently visted record does not correspond to any record\n // in the collection, so (optionally) instantiate this record and insert\n // it into the collection\n record = this.mapper ? this.mapper.createRecord(record, opts) : record\n this.index.insertRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.insertRecord(record)\n })\n if (record && utils.isFunction(record.on)) {\n record.on('all', this._onRecordEvent, this)\n }\n }\n return record\n })\n // Finally, return the inserted data\n const result = singular ? records[0] : records\n if (!opts.silent) {\n this.emit('add', result)\n }\n return this.afterAdd(records, opts, result) || result\n },\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then {@link Collection#add} will return that same value.\n *\n * @method Collection#method\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} result The record or records\n * that were added to this Collection by {@link Collection#add}.\n * @param {object} opts The `opts` argument passed to {@link Collection#add}.\n */\n afterAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}. If this method returns\n * a value then {@link Collection#remove} will return that same value.\n *\n * @method Collection#afterRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {object} opts The `opts` argument passed to {@link Collection#remove}.\n * @param {object} record The result that will be returned by {@link Collection#remove}.\n */\n afterRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}. If this method\n * returns a value then {@link Collection#removeAll} will return that same\n * value.\n *\n * @method Collection#afterRemoveAll\n * @since 3.0.0\n * @param {object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}.\n * @param {object} records The result that will be returned by {@link Collection#removeAll}.\n */\n afterRemoveAll () {},\n\n /**\n * Lifecycle hook called by {@link Collection#add}. If this method returns a\n * value then the `records` argument in {@link Collection#add} will be\n * re-assigned to the returned value.\n *\n * @method Collection#beforeAdd\n * @since 3.0.0\n * @param {(Object|Object[]|Record|Record[])} records The `records` argument passed to {@link Collection#add}.\n * @param {object} opts The `opts` argument passed to {@link Collection#add}.\n */\n beforeAdd () {},\n\n /**\n * Lifecycle hook called by {@link Collection#remove}.\n *\n * @method Collection#beforeRemove\n * @since 3.0.0\n * @param {(string|number)} id The `id` argument passed to {@link Collection#remove}.\n * @param {object} opts The `opts` argument passed to {@link Collection#remove}.\n */\n beforeRemove () {},\n\n /**\n * Lifecycle hook called by {@link Collection#removeAll}.\n *\n * @method Collection#beforeRemoveAll\n * @since 3.0.0\n * @param {object} query The `query` argument passed to {@link Collection#removeAll}.\n * @param {object} opts The `opts` argument passed to {@link Collection#removeAll}.\n */\n beforeRemoveAll () {},\n\n /**\n * Find all records between two boundaries.\n *\n * Shortcut for `collection.query().between(18, 30, { index: 'age' }).run()`\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = collection.between(18, 30, { index: 'age' });\n *\n * @example\n * // Same as above\n * const users = collection.between([18], [30], { index: 'age' });\n *\n * @method Collection#between\n * @since 3.0.0\n * @param {array} leftKeys Keys defining the left boundary.\n * @param {array} rightKeys Keys defining the right boundary.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @param {boolean} [opts.leftInclusive=true] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.rightInclusive=false] Whether to include records\n * on the left boundary.\n * @param {boolean} [opts.limit] Limit the result to a certain number.\n * @param {boolean} [opts.offset] The number of resulting records to skip.\n * @returns {Object[]|Record[]} The result.\n */\n between (leftKeys, rightKeys, opts) {\n return this.query().between(leftKeys, rightKeys, opts).run()\n },\n\n /**\n * Create a new secondary index on the contents of the collection.\n *\n * @example\n * // Index users by age\n * collection.createIndex('age');\n *\n * @example\n * // Index users by status and role\n * collection.createIndex('statusAndRole', ['status', 'role']);\n *\n * @method Collection#createIndex\n * @since 3.0.0\n * @param {string} name The name of the new secondary index.\n * @param {string[]} [fieldList] Array of field names to use as the key or\n * compound key of the new secondary index. If no fieldList is provided, then\n * the name will also be the field that is used to index the collection.\n */\n createIndex (name, fieldList, opts) {\n if (utils.isString(name) && fieldList === undefined) {\n fieldList = [name]\n }\n opts || (opts = {})\n opts.hashCode || (opts.hashCode = (obj) => this.recordId(obj))\n const index = this.indexes[name] = new Index(fieldList, opts)\n this.index.visitAll(index.insertRecord, index)\n },\n\n /**\n * Find the record or records that match the provided query or pass the\n * provided filter function.\n *\n * Shortcut for `collection.query().filter(queryOrFn[, thisArg]).run()`\n *\n * @example Collection#filter\n * const JSData = require('js-data');\n * const { Collection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const collection = new Collection([\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * // Get the draft posts created less than three months ago\n * let posts = collection.filter({\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * });\n * console.log(posts);\n *\n * // Use a custom filter function\n * posts = collection.filter((post) => post.id % 2 === 0);\n *\n * @method Collection#filter\n * @param {(Object|Function)} [queryOrFn={}] Selection query or filter\n * function.\n * @param {object} [thisArg] Context to which to bind `queryOrFn` if\n * `queryOrFn` is a function.\n * @returns {Array} The result.\n * @see query\n * @since 3.0.0\n */\n filter (query, thisArg) {\n return this.query().filter(query, thisArg).run()\n },\n\n /**\n * Iterate over all records.\n *\n * @example\n * collection.forEach(function (record) {\n * // do something\n * });\n *\n * @method Collection#forEach\n * @since 3.0.0\n * @param {Function} forEachFn Iteration function.\n * @param {*} [thisArg] Context to which to bind `forEachFn`.\n * @returns {Array} The result.\n */\n forEach (cb, thisArg) {\n this.index.visitAll(cb, thisArg)\n },\n\n /**\n * Get the record with the given id.\n *\n * @method Collection#get\n * @since 3.0.0\n * @param {(string|number)} id The primary key of the record to get.\n * @returns {(Object|Record)} The record with the given id.\n */\n get (id) {\n const instances = id === undefined ? [] : this.query().get(id).run()\n return instances.length ? instances[0] : undefined\n },\n\n /**\n * Find the record or records that match the provided keyLists.\n *\n * Shortcut for `collection.query().getAll(keyList1, keyList2, ...).run()`\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = collection.getAll('draft', 'inReview', { index: 'status' });\n *\n * @example\n * // Same as above\n * const posts = collection.getAll(['draft'], ['inReview'], { index: 'status' });\n *\n * @method Collection#getAll\n * @since 3.0.0\n * @param {...Array} [keyList] Provide one or more keyLists, and all\n * records matching each keyList will be retrieved. If no keyLists are\n * provided, all records will be returned.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] Name of the secondary index to use in the\n * query. If no index is specified, the main index is used.\n * @returns {Array} The result.\n */\n getAll (...args) {\n return this.query().getAll(...args).run()\n },\n\n /**\n * Return the index with the given name. If no name is provided, return the\n * main index. Throws an error if the specified index does not exist.\n *\n * @method Collection#getIndex\n * @since 3.0.0\n * @param {string} [name] The name of the index to retrieve.\n */\n getIndex (name) {\n const index = name ? this.indexes[name] : this.index\n if (!index) {\n throw utils.err(`${DOMAIN}#getIndex`, name)(404, 'index')\n }\n return index\n },\n\n /**\n * Limit the result.\n *\n * Shortcut for `collection.query().limit(maximumNumber).run()`\n *\n * @example\n * const posts = collection.limit(10);\n *\n * @method Collection#limit\n * @since 3.0.0\n * @param {number} num The maximum number of records to keep in the result.\n * @returns {Array} The result.\n */\n limit (num) {\n return this.query().limit(num).run()\n },\n\n /**\n * Apply a mapping function to all records.\n *\n * @example\n * const names = collection.map((user) => user.name);\n *\n * @method Collection#map\n * @since 3.0.0\n * @param {Function} mapFn Mapping function.\n * @param {*} [thisArg] Context to which to bind `mapFn`.\n * @returns {Array} The result of the mapping.\n */\n map (cb, thisArg) {\n const data = []\n this.index.visitAll(function (value) {\n data.push(cb.call(thisArg, value))\n })\n return data\n },\n\n /**\n * Return the result of calling the specified function on each record in this\n * collection's main index.\n *\n * @method Collection#mapCall\n * @since 3.0.0\n * @param {string} funcName Name of function to call\n * @parama {...*} [args] Remaining arguments to be passed to the function.\n * @returns {Array} The result.\n */\n mapCall (funcName, ...args) {\n const data = []\n this.index.visitAll(function (record) {\n data.push(record[funcName](...args))\n })\n return data\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#prune\n * @param {object} [opts] Configuration options, passed to {@link Collection#removeAll}.\n * @since 3.0.0\n * @returns {Array} The removed records, if any.\n */\n prune (opts) {\n return this.removeAll(this.unsaved(), opts)\n },\n\n /**\n * Create a new query to be executed against the contents of the collection.\n * The result will be all or a subset of the contents of the collection.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * collection.query()\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run();\n *\n * @method Collection#query\n * @since 3.0.0\n * @returns {Query} New query object.\n */\n query () {\n const Ctor = this.queryClass\n return new Ctor(this)\n },\n\n /**\n * Return the primary key of the given, or if no record is provided, return the\n * name of the field that holds the primary key of records in this Collection.\n *\n * @method Collection#recordId\n * @since 3.0.0\n * @param {(Object|Record)} [record] The record whose primary key is to be\n * returned.\n * @returns {(string|number)} Primary key or name of field that holds primary\n * key.\n */\n recordId (record) {\n if (record) {\n return utils.get(record, this.recordId())\n }\n return this.mapper ? this.mapper.idAttribute : this.idAttribute\n },\n\n /**\n * Reduce the data in the collection to a single value and return the result.\n *\n * @example\n * const totalVotes = collection.reduce((prev, record) => {\n * return prev + record.upVotes + record.downVotes;\n * }, 0);\n *\n * @method Collection#reduce\n * @since 3.0.0\n * @param {Function} cb Reduction callback.\n * @param {*} initialValue Initial value of the reduction.\n * @returns {*} The result.\n */\n reduce (cb, initialValue) {\n const data = this.getAll()\n return data.reduce(cb, initialValue)\n },\n\n /**\n * Remove the record with the given id from this Collection.\n *\n * @method Collection#remove\n * @since 3.0.0\n * @param {(string|number|object|Record)} idOrRecord The primary key of the\n * record to be removed, or a reference to the record that is to be removed.\n * @param {object} [opts] Configuration options.\n * @returns {Object|Record} The removed record, if any.\n */\n remove (idOrRecord, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemove(idOrRecord, opts)\n let record = utils.isSorN(idOrRecord) ? this.get(idOrRecord) : idOrRecord\n\n // The record is in the collection, remove it\n if (utils.isObject(record)) {\n record = this.index.removeRecord(record)\n if (record) {\n utils.forOwn(this.indexes, function (index, name) {\n index.removeRecord(record)\n })\n if (utils.isFunction(record.off)) {\n record.off('all', this._onRecordEvent, this)\n if (!opts.silent) {\n this.emit('remove', record)\n }\n }\n }\n }\n return this.afterRemove(idOrRecord, opts, record) || record\n },\n\n /**\n * Remove from this collection the given records or the records selected by\n * the given \"query\".\n *\n * @method Collection#removeAll\n * @since 3.0.0\n * @param {Object|Object[]|Record[]} [queryOrRecords={}] Records to be removed or selection query. See {@link query}.\n * @param {object} [queryOrRecords.where] See {@link query.where}.\n * @param {number} [queryOrRecords.offset] See {@link query.offset}.\n * @param {number} [queryOrRecords.limit] See {@link query.limit}.\n * @param {string|Array[]} [queryOrRecords.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options.\n * @returns {(Object[]|Record[])} The removed records, if any.\n */\n removeAll (queryOrRecords, opts) {\n // Default values for arguments\n opts || (opts = {})\n this.beforeRemoveAll(queryOrRecords, opts)\n let records = utils.isArray(queryOrRecords) ? queryOrRecords.slice() : this.filter(queryOrRecords)\n\n // Remove each selected record from the collection\n const optsCopy = utils.plainCopy(opts)\n optsCopy.silent = true\n records = records\n .map((record) => this.remove(record, optsCopy))\n .filter((record) => record)\n if (!opts.silent) {\n this.emit('remove', records)\n }\n return this.afterRemoveAll(queryOrRecords, opts, records) || records\n },\n\n /**\n * Skip a number of results.\n *\n * Shortcut for `collection.query().skip(numberToSkip).run()`\n *\n * @example\n * const posts = collection.skip(10);\n *\n * @method Collection#skip\n * @since 3.0.0\n * @param {number} num The number of records to skip.\n * @returns {Array} The result.\n */\n skip (num) {\n return this.query().skip(num).run()\n },\n\n /**\n * Return the plain JSON representation of all items in this collection.\n * Assumes records in this collection have a toJSON method.\n *\n * @method Collection#toJSON\n * @since 3.0.0\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the representation.\n * @returns {Array} The records.\n */\n toJSON (opts) {\n return this.mapCall('toJSON', opts)\n },\n\n /**\n * Return all \"unsaved\" (not uniquely identifiable) records in this colleciton.\n *\n * @method Collection#unsaved\n * @since 3.0.0\n * @returns {Array} The unsaved records, if any.\n */\n unsaved (opts) {\n return this.index.get()\n },\n\n /**\n * Update a record's position in a single index of this collection. See\n * {@link Collection#updateIndexes} to update a record's position in all\n * indexes at once.\n *\n * @method Collection#updateIndex\n * @since 3.0.0\n * @param {object} record The record to update.\n * @param {object} [opts] Configuration options.\n * @param {string} [opts.index] The index in which to update the record's\n * position. If you don't specify an index then the record will be updated\n * in the main index.\n */\n updateIndex (record, opts) {\n opts || (opts = {})\n this.getIndex(opts.index).updateRecord(record)\n },\n\n /**\n * Updates all indexes in this collection for the provided record. Has no\n * effect if the record is not in the collection.\n *\n * @method Collection#updateIndexes\n * @since 3.0.0\n * @param {object} record TODO\n */\n updateIndexes (record) {\n this.index.updateRecord(record)\n utils.forOwn(this.indexes, function (index, name) {\n index.updateRecord(record)\n })\n }\n})\n\n/**\n * Fired when a record changes. Only works for records that have tracked changes.\n * See {@link Collection~changeListener} on how to listen for this event.\n *\n * @event Collection#change\n * @see Collection~changeListener\n */\n\n/**\n * Callback signature for the {@link Collection#event:change} event.\n *\n * @example\n * function onChange (record, changes) {\n * // do something\n * }\n * collection.on('change', onChange);\n *\n * @callback Collection~changeListener\n * @param {Record} The Record that changed.\n * @param {object} The changes.\n * @see Collection#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the Collection. See\n * {@link Collection~addListener} on how to listen for this event.\n *\n * @event Collection#add\n * @see Collection~addListener\n * @see Collection#event:add\n * @see Collection#add\n */\n\n/**\n * Callback signature for the {@link Collection#event:add} event.\n *\n * @example\n * function onAdd (recordOrRecords) {\n * // do something\n * }\n * collection.on('add', onAdd);\n *\n * @callback Collection~addListener\n * @param {Record|Record[]} The Record or Records that were added.\n * @see Collection#event:add\n * @see Collection#add\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the Collection. See\n * {@link Collection~removeListener} for how to listen for this event.\n *\n * @event Collection#remove\n * @see Collection~removeListener\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n */\n\n/**\n * Callback signature for the {@link Collection#event:remove} event.\n *\n * @example\n * function onRemove (recordsOrRecords) {\n * // do something\n * }\n * collection.on('remove', onRemove);\n *\n * @callback Collection~removeListener\n * @param {Record|Record[]} Record or Records that were removed.\n * @see Collection#event:remove\n * @see Collection#remove\n * @see Collection#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this Collection:\n * @example Collection.extend\n * const JSData = require('js-data');\n * const { Collection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomCollectionClass extends Collection {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customCollection = new CustomCollectionClass();\n * console.log(customCollection.foo());\n * console.log(CustomCollectionClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherCollectionClass = Collection.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherCollection = new OtherCollectionClass();\n * console.log(otherCollection.foo());\n * console.log(OtherCollectionClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherCollectionClass () {\n * Collection.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Collection.extend({\n * constructor: AnotherCollectionClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherCollection = new AnotherCollectionClass();\n * console.log(anotherCollection.created_at);\n * console.log(anotherCollection.foo());\n * console.log(AnotherCollectionClass.beep());\n *\n * @method Collection.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Collection class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\n\nconst DOMAIN = 'Schema'\n\n/**\n * A function map for each of the seven primitive JSON types defined by the core specification.\n * Each function will check a given value and return true or false if the value is an instance of that type.\n * ```\n * types.integer(1) // returns true\n * types.string({}) // returns false\n * ```\n * http://json-schema.org/latest/json-schema-core.html#anchor8\n * @name Schema.types\n * @type {object}\n */\nconst types = {\n array: utils.isArray,\n boolean: utils.isBoolean,\n integer: utils.isInteger,\n 'null': utils.isNull,\n number: utils.isNumber,\n object: utils.isObject,\n string: utils.isString\n}\n\n/**\n * @ignore\n */\nconst segmentToString = function (segment, prev) {\n let str = ''\n if (segment) {\n if (utils.isNumber(segment)) {\n str += `[${segment}]`\n } else if (prev) {\n str += `.${segment}`\n } else {\n str += `${segment}`\n }\n }\n return str\n}\n\n/**\n * @ignore\n */\nconst makePath = function (opts) {\n opts || (opts = {})\n let path = ''\n const segments = opts.path || []\n segments.forEach(function (segment) {\n path += segmentToString(segment, path)\n })\n path += segmentToString(opts.prop, path)\n return path\n}\n\n/**\n * @ignore\n */\nconst makeError = function (actual, expected, opts) {\n return {\n expected,\n actual: '' + actual,\n path: makePath(opts)\n }\n}\n\n/**\n * @ignore\n */\nconst addError = function (actual, expected, opts, errors) {\n errors.push(makeError(actual, expected, opts))\n}\n\n/**\n * @ignore\n */\nconst maxLengthCommon = function (keyword, value, schema, opts) {\n const max = schema[keyword]\n if (value.length > max) {\n return makeError(value.length, `length no more than ${max}`, opts)\n }\n}\n\n/**\n * @ignore\n */\nconst minLengthCommon = function (keyword, value, schema, opts) {\n const min = schema[keyword]\n if (value.length < min) {\n return makeError(value.length, `length no less than ${min}`, opts)\n }\n}\n\n/**\n * A map of all object member validation functions for each keyword defined in the JSON Schema.\n * @name Schema.validationKeywords\n * @type {object}\n */\nconst validationKeywords = {\n /**\n * Validates the provided value against all schemas defined in the Schemas `allOf` keyword.\n * The instance is valid against if and only if it is valid against all the schemas declared in the Schema's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be a valid JSON Schema.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor82\n *\n * @name Schema.validationKeywords.allOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `allOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n allOf (value, schema, opts) {\n let allErrors = []\n schema.allOf.forEach(function (_schema) {\n allErrors = allErrors.concat(validate(value, _schema, opts) || [])\n })\n return allErrors.length ? allErrors : undefined\n },\n\n /**\n * Validates the provided value against all schemas defined in the Schemas `anyOf` keyword.\n * The instance is valid against this keyword if and only if it is valid against\n * at least one of the schemas in this keyword's value.\n *\n * The value of this keyword MUST be an array. This array MUST have at least one element.\n * Each element of this array MUST be an object, and each object MUST be a valid JSON Schema.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor85\n *\n * @name Schema.validationKeywords.anyOf\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `anyOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n anyOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.anyOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * http://json-schema.org/latest/json-schema-validation.html#anchor70\n *\n * @name Schema.validationKeywords.dependencies\n * @method\n * @param {*} value TODO\n * @param {object} schema TODO\n * @param {object} opts TODO\n */\n dependencies (value, schema, opts) {\n // TODO\n },\n\n /**\n * Validates the provided value against an array of possible values defined by the Schema's `enum` keyword\n * Validation succeeds if the value is deeply equal to one of the values in the array.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor76\n *\n * @name Schema.validationKeywords.enum\n * @method\n * @param {*} value Value to validate\n * @param {object} schema Schema containing the `enum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n enum (value, schema, opts) {\n const possibleValues = schema['enum']\n if (utils.findIndex(possibleValues, (item) => utils.deepEqual(item, value)) === -1) {\n return makeError(value, `one of (${possibleValues.join(', ')})`, opts)\n }\n },\n\n /**\n * Validates each of the provided array values against a schema or an array of schemas defined by the Schema's `items` keyword\n * see http://json-schema.org/latest/json-schema-validation.html#anchor37 for validation rules.\n *\n * @name Schema.validationKeywords.items\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the items keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n items (value, schema, opts) {\n opts || (opts = {})\n // TODO: additionalItems\n let items = schema.items\n let errors = []\n const checkingTuple = utils.isArray(items)\n const length = value.length\n for (var prop = 0; prop < length; prop++) {\n if (checkingTuple) {\n // Validating a tuple, instead of just checking each item against the\n // same schema\n items = schema.items[prop]\n }\n opts.prop = prop\n errors = errors.concat(validate(value[prop], items, opts) || [])\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided number against a maximum value defined by the Schema's `maximum` keyword\n * Validation succeeds if the value is a number, and is less than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor17\n *\n * @name Schema.validationKeywords.maximum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `maximum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maximum (value, schema, opts) {\n // Must be a number\n const maximum = schema.maximum\n // Must be a boolean\n // Depends on maximum\n // default: false\n const exclusiveMaximum = schema.exclusiveMaximum\n if (typeof value === typeof maximum && !(exclusiveMaximum ? maximum > value : maximum >= value)) {\n return exclusiveMaximum\n ? makeError(value, `no more than nor equal to ${maximum}`, opts)\n : makeError(value, `no more than ${maximum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a maximum value defined by the Schema's `maxItems` keyword.\n * Validation succeeds if the length of the array is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor42\n *\n * @name Schema.validationKeywords.maxItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `maxItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return maxLengthCommon('maxItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a maximum value defined in the Schema's `maxLength` keyword.\n * Validation succeeds if the length of the string is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor26\n *\n * @name Schema.validationKeywords.maxLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `maxLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxLength (value, schema, opts) {\n return maxLengthCommon('maxLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a maximum value defined in the Schema's `maxProperties` keyword.\n * Validation succeeds if the object's property count is less than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor54\n *\n * @name Schema.validationKeywords.maxProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `maxProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n maxProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const maxProperties = schema.maxProperties\n const length = Object.keys(value).length\n if (length > maxProperties) {\n return makeError(length, `no more than ${maxProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided value against a minimum value defined by the Schema's `minimum` keyword\n * Validation succeeds if the value is a number and is greater than, or equal to, the value of this keyword.\n * http://json-schema.org/latest/json-schema-validation.html#anchor21\n *\n * @name Schema.validationKeywords.minimum\n * @method\n * @param {*} value Number to validate against the keyword.\n * @param {object} schema Schema containing the `minimum` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minimum (value, schema, opts) {\n // Must be a number\n const minimum = schema.minimum\n // Must be a boolean\n // Depends on minimum\n // default: false\n const exclusiveMinimum = schema.exclusiveMinimum\n if (typeof value === typeof minimum && !(exclusiveMinimum ? value > minimum : value >= minimum)) {\n return exclusiveMinimum\n ? makeError(value, `no less than nor equal to ${minimum}`, opts)\n : makeError(value, `no less than ${minimum}`, opts)\n }\n },\n\n /**\n * Validates the length of the provided array against a minimum value defined by the Schema's `minItems` keyword.\n * Validation succeeds if the length of the array is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor45\n *\n * @name Schema.validationKeywords.minItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `minItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minItems (value, schema, opts) {\n if (utils.isArray(value)) {\n return minLengthCommon('minItems', value, schema, opts)\n }\n },\n\n /**\n * Validates the length of the provided string against a minimum value defined in the Schema's `minLength` keyword.\n * Validation succeeds if the length of the string is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor29\n *\n * @name Schema.validationKeywords.minLength\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `minLength` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minLength (value, schema, opts) {\n return minLengthCommon('minLength', value, schema, opts)\n },\n\n /**\n * Validates the count of the provided object's properties against a minimum value defined in the Schema's `minProperties` keyword.\n * Validation succeeds if the object's property count is greater than, or equal to the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor57\n *\n * @name Schema.validationKeywords.minProperties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `minProperties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n minProperties (value, schema, opts) {\n // validate only objects\n if (!utils.isObject(value)) return\n const minProperties = schema.minProperties\n const length = Object.keys(value).length\n if (length < minProperties) {\n return makeError(length, `no more than ${minProperties} properties`, opts)\n }\n },\n\n /**\n * Validates the provided number is a multiple of the number defined in the Schema's `multipleOf` keyword.\n * Validation succeeds if the number can be divided equally into the value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor14\n *\n * @name Schema.validationKeywords.multipleOf\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing the `multipleOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n multipleOf (value, schema, opts) {\n const multipleOf = schema.multipleOf\n if (utils.isNumber(value)) {\n if ((value / multipleOf) % 1 !== 0) {\n return makeError(value, `multipleOf ${multipleOf}`, opts)\n }\n }\n },\n\n /**\n * Validates the provided value is not valid with any of the schemas defined in the Schema's `not` keyword.\n * An instance is valid against this keyword if and only if it is NOT valid against the schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor91\n * @name Schema.validationKeywords.not\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the not keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n not (value, schema, opts) {\n if (!validate(value, schema.not, opts)) {\n // TODO: better messaging\n return makeError('succeeded', 'should have failed', opts)\n }\n },\n\n /**\n * Validates the provided value is valid with one and only one of the schemas defined in the Schema's `oneOf` keyword.\n * An instance is valid against this keyword if and only if it is valid against a single schemas in this keyword's value.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor88\n * @name Schema.validationKeywords.oneOf\n * @method\n * @param {*} value to be checked.\n * @param {object} schema Schema containing the `oneOf` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n oneOf (value, schema, opts) {\n let validated = false\n let allErrors = []\n schema.oneOf.forEach(function (_schema) {\n const errors = validate(value, _schema, opts)\n if (errors) {\n allErrors = allErrors.concat(errors)\n } else if (validated) {\n allErrors = [makeError('valid against more than one', 'valid against only one', opts)]\n validated = false\n return false\n } else {\n validated = true\n }\n })\n return validated ? undefined : allErrors\n },\n\n /**\n * Validates the provided string matches a pattern defined in the Schema's `pattern` keyword.\n * Validation succeeds if the string is a match of the regex value of this keyword.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor33\n * @name Schema.validationKeywords.pattern\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing the `pattern` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n pattern (value, schema, opts) {\n const pattern = schema.pattern\n if (utils.isString(value) && !value.match(pattern)) {\n return makeError(value, pattern, opts)\n }\n },\n\n /**\n * Validates the provided object's properties against a map of values defined in the Schema's `properties` keyword.\n * Validation succeeds if the object's property are valid with each of the schema's in the provided map.\n * Validation also depends on the additionalProperties and or patternProperties.\n *\n * see http://json-schema.org/latest/json-schema-validation.html#anchor64 for more info.\n *\n * @name Schema.validationKeywords.properties\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `properties` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n properties (value, schema, opts) {\n opts || (opts = {})\n\n if (utils.isArray(value)) {\n return\n }\n\n // Can be a boolean or an object\n // Technically the default is an \"empty schema\", but here \"true\" is\n // functionally the same\n const additionalProperties = schema.additionalProperties === undefined ? true : schema.additionalProperties\n const validated = []\n // \"p\": The property set from \"properties\".\n // Default is an object\n const properties = schema.properties || {}\n // \"pp\": The property set from \"patternProperties\".\n // Default is an object\n const patternProperties = schema.patternProperties || {}\n let errors = []\n\n utils.forOwn(properties, function (_schema, prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n })\n\n const toValidate = utils.omit(value, validated)\n utils.forOwn(patternProperties, function (_schema, pattern) {\n utils.forOwn(toValidate, function (undef, prop) {\n if (prop.match(pattern)) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], _schema, opts) || [])\n validated.push(prop)\n }\n })\n })\n const keys = Object.keys(utils.omit(value, validated))\n // If \"s\" is not empty, validation fails\n if (additionalProperties === false) {\n if (keys.length) {\n const origProp = opts.prop\n opts.prop = ''\n addError(`extra fields: ${keys.join(', ')}`, 'no extra fields', opts, errors)\n opts.prop = origProp\n }\n } else if (utils.isObject(additionalProperties)) {\n // Otherwise, validate according to provided schema\n keys.forEach(function (prop) {\n opts.prop = prop\n errors = errors.concat(validate(value[prop], additionalProperties, opts) || [])\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided object's has all properties listed in the Schema's `properties` keyword array.\n * Validation succeeds if the object contains all properties provided in the array value of this keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor61\n *\n * @name Schema.validationKeywords.required\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing the `required` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n required (value, schema, opts) {\n opts || (opts = {})\n const required = schema.required\n let errors = []\n if (!opts.existingOnly) {\n required.forEach(function (prop) {\n if (utils.get(value, prop) === undefined) {\n const prevProp = opts.prop\n opts.prop = prop\n addError(undefined, 'a value', opts, errors)\n opts.prop = prevProp\n }\n })\n }\n return errors.length ? errors : undefined\n },\n\n /**\n * Validates the provided value's type is equal to the type, or array of types, defined in the Schema's `type` keyword.\n * see http://json-schema.org/latest/json-schema-validation.html#anchor79\n *\n * @name Schema.validationKeywords.type\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Schema containing the `type` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n type (value, schema, opts) {\n let type = schema.type\n let validType\n // Can be one of several types\n if (utils.isString(type)) {\n type = [type]\n }\n // Try to match the value against an expected type\n type.forEach(function (_type) {\n // TODO: throw an error if type is not defined\n if (types[_type](value, schema, opts)) {\n // Matched a type\n validType = _type\n return false\n }\n })\n // Value did not match any expected type\n if (!validType) {\n return makeError(value !== undefined && value !== null ? typeof value : '' + value, `one of (${type.join(', ')})`, opts)\n }\n // Run keyword validators for matched type\n // http://json-schema.org/latest/json-schema-validation.html#anchor12\n const validator = typeGroupValidators[validType]\n if (validator) {\n return validator(value, schema, opts)\n }\n },\n\n /**\n * Validates the provided array values are unique.\n * Validation succeeds if the items in the array are unique, but only if the value of this keyword is true\n * see http://json-schema.org/latest/json-schema-validation.html#anchor49\n *\n * @name Schema.validationKeywords.uniqueItems\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing the `uniqueItems` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n uniqueItems (value, schema, opts) {\n if (value && value.length && schema.uniqueItems) {\n const length = value.length\n let item, i, j\n // Check n - 1 items\n for (i = length - 1; i > 0; i--) {\n item = value[i]\n // Only compare against unchecked items\n for (j = i - 1; j >= 0; j--) {\n // Found a duplicate\n if (utils.deepEqual(item, value[j])) {\n return makeError(item, 'no duplicates', opts)\n }\n }\n }\n }\n }\n}\n\n/**\n * @ignore\n */\nconst runOps = function (ops, value, schema, opts) {\n let errors = []\n ops.forEach(function (op) {\n if (schema[op] !== undefined) {\n errors = errors.concat(validationKeywords[op](value, schema, opts) || [])\n }\n })\n return errors.length ? errors : undefined\n}\n\n/**\n * Validation keywords validated for any type:\n *\n * - `enum`\n * - `type`\n * - `allOf`\n * - `anyOf`\n * - `oneOf`\n * - `not`\n *\n * @name Schema.ANY_OPS\n * @type {string[]}\n */\nconst ANY_OPS = ['enum', 'type', 'allOf', 'anyOf', 'oneOf', 'not']\n\n/**\n * Validation keywords validated for array types:\n *\n * - `items`\n * - `maxItems`\n * - `minItems`\n * - `uniqueItems`\n *\n * @name Schema.ARRAY_OPS\n * @type {string[]}\n */\nconst ARRAY_OPS = ['items', 'maxItems', 'minItems', 'uniqueItems']\n\n/**\n * Validation keywords validated for numeric (number and integer) types:\n *\n * - `multipleOf`\n * - `maximum`\n * - `minimum`\n *\n * @name Schema.NUMERIC_OPS\n * @type {string[]}\n */\nconst NUMERIC_OPS = ['multipleOf', 'maximum', 'minimum']\n\n/**\n * Validation keywords validated for object types:\n *\n * - `maxProperties`\n * - `minProperties`\n * - `required`\n * - `properties`\n * - `dependencies`\n *\n * @name Schema.OBJECT_OPS\n * @type {string[]}\n */\nconst OBJECT_OPS = ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n\n/**\n * Validation keywords validated for string types:\n *\n * - `maxLength`\n * - `minLength`\n * - `pattern`\n *\n * @name Schema.STRING_OPS\n * @type {string[]}\n */\nconst STRING_OPS = ['maxLength', 'minLength', 'pattern']\n\n/**\n * http://json-schema.org/latest/json-schema-validation.html#anchor75\n * @ignore\n */\nconst validateAny = function (value, schema, opts) {\n return runOps(ANY_OPS, value, schema, opts)\n}\n\n/**\n * Validates the provided value against a given Schema according to the http://json-schema.org/ v4 specification.\n *\n * @name Schema.validate\n * @method\n * @param {*} value Value to be validated.\n * @param {object} schema Valid Schema according to the http://json-schema.org/ v4 specification.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\nconst validate = function (value, schema, opts) {\n let errors = []\n opts || (opts = {})\n opts.ctx || (opts.ctx = { value, schema })\n let shouldPop\n let prevProp = opts.prop\n if (schema === undefined) {\n return\n }\n if (!utils.isObject(schema)) {\n throw utils.err(`${DOMAIN}#validate`)(500, `Invalid schema at path: \"${opts.path}\"`)\n }\n if (opts.path === undefined) {\n opts.path = []\n }\n // Track our location as we recurse\n if (opts.prop !== undefined) {\n shouldPop = true\n opts.path.push(opts.prop)\n opts.prop = undefined\n }\n // Validate against parent schema\n if (schema['extends']) {\n // opts.path = path\n // opts.prop = prop\n if (utils.isFunction(schema['extends'].validate)) {\n errors = errors.concat(schema['extends'].validate(value, opts) || [])\n } else {\n errors = errors.concat(validate(value, schema['extends'], opts) || [])\n }\n }\n if (value === undefined) {\n // Check if property is required\n if (schema.required === true && !opts.existingOnly) {\n addError(value, 'a value', opts, errors)\n }\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n }\n\n errors = errors.concat(validateAny(value, schema, opts) || [])\n if (shouldPop) {\n opts.path.pop()\n opts.prop = prevProp\n }\n return errors.length ? errors : undefined\n}\n\n// These strings are cached for optimal performance of the change detection\n// boolean - Whether a Record is changing in the current execution frame\nconst changingPath = 'changing'\n// string[] - Properties that have changed in the current execution frame\nconst changedPath = 'changed'\n// Object[] - History of change records\nconst changeHistoryPath = 'history'\n// boolean - Whether a Record is currently being instantiated\nconst creatingPath = 'creating'\n// number - The setTimeout change event id of a Record, if any\nconst eventIdPath = 'eventId'\n// boolean - Whether to skip validation for a Record's currently changing property\nconst noValidatePath = 'noValidate'\n// boolean - Whether to preserve Change History for a Record\nconst keepChangeHistoryPath = 'keepChangeHistory'\n// boolean - Whether to skip change notification for a Record's currently\n// changing property\nconst silentPath = 'silent'\nconst validationFailureMsg = 'validation failed'\n\n/**\n * A map of validation functions grouped by type.\n *\n * @name Schema.typeGroupValidators\n * @type {object}\n */\nconst typeGroupValidators = {\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an array.\n * The validation keywords for the type `array` are:\n *```\n * ['items', 'maxItems', 'minItems', 'uniqueItems']\n *```\n * see http://json-schema.org/latest/json-schema-validation.html#anchor25\n *\n * @name Schema.typeGroupValidators.array\n * @method\n * @param {*} value Array to be validated.\n * @param {object} schema Schema containing at least one array keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n array: function (value, schema, opts) {\n return runOps(ARRAY_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an integer.\n * The validation keywords for the type `integer` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.integer\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `integer` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n integer: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an number.\n * The validation keywords for the type `number` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * @name Schema.typeGroupValidators.number\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `number` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n number: function (value, schema, opts) {\n // Additional validations for numerics are the same\n return typeGroupValidators.numeric(value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of a number or integer.\n * The validation keywords for the type `numeric` are:\n *```\n * ['multipleOf', 'maximum', 'minimum']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor13.\n *\n * @name Schema.typeGroupValidators.numeric\n * @method\n * @param {*} value Number to be validated.\n * @param {object} schema Schema containing at least one `numeric` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n numeric: function (value, schema, opts) {\n return runOps(NUMERIC_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an object.\n * The validation keywords for the type `object` are:\n *```\n * ['maxProperties', 'minProperties', 'required', 'properties', 'dependencies']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor53.\n *\n * @name Schema.typeGroupValidators.object\n * @method\n * @param {*} value Object to be validated.\n * @param {object} schema Schema containing at least one `object` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n object: function (value, schema, opts) {\n return runOps(OBJECT_OPS, value, schema, opts)\n },\n\n /**\n * Validates the provided value against the schema using all of the validation keywords specific to instances of an string.\n * The validation keywords for the type `string` are:\n *```\n * ['maxLength', 'minLength', 'pattern']\n *```\n * See http://json-schema.org/latest/json-schema-validation.html#anchor25.\n *\n * @name Schema.typeGroupValidators.string\n * @method\n * @param {*} value String to be validated.\n * @param {object} schema Schema containing at least one `string` keyword.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n string: function (value, schema, opts) {\n return runOps(STRING_OPS, value, schema, opts)\n }\n}\n\n/**\n * js-data's Schema class.\n *\n * @example Schema#constructor\n * const JSData = require('js-data');\n * const { Schema } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const PostSchema = new Schema({\n * type: 'object',\n * properties: {\n * title: { type: 'string' }\n * }\n * });\n * PostSchema.validate({ title: 1234 });\n *\n * @class Schema\n * @extends Component\n * @param {object} definition Schema definition according to json-schema.org\n */\nfunction Schema (definition) {\n definition || (definition = {})\n // TODO: schema validation\n utils.fillIn(this, definition)\n\n if (this.type === 'object') {\n this.properties = this.properties || {}\n utils.forOwn(this.properties, (_definition, prop) => {\n if (!(_definition instanceof Schema)) {\n this.properties[prop] = new Schema(_definition)\n }\n })\n } else if (this.type === 'array' && this.items && !(this.items instanceof Schema)) {\n this.items = new Schema(this.items)\n }\n if (this.extends && !(this.extends instanceof Schema)) {\n this.extends = new Schema(this.extends)\n }\n ['allOf', 'anyOf', 'oneOf'].forEach((validationKeyword) => {\n if (this[validationKeyword]) {\n this[validationKeyword].forEach((_definition, i) => {\n if (!(_definition instanceof Schema)) {\n this[validationKeyword][i] = new Schema(_definition)\n }\n })\n }\n })\n}\n\nexport default Component.extend({\n constructor: Schema,\n\n /**\n * This adds ES5 getters/setters to the target based on the \"properties\" in\n * this Schema, which makes possible change tracking and validation on\n * property assignment.\n *\n * @name Schema#apply\n * @method\n * @param {object} target The prototype to which to apply this schema.\n */\n apply (target, opts) {\n opts || (opts = {})\n opts.getter || (opts.getter = '_get')\n opts.setter || (opts.setter = '_set')\n opts.unsetter || (opts.unsetter = '_unset')\n opts.track || (opts.track = this.track)\n const properties = this.properties || {}\n utils.forOwn(properties, (schema, prop) => {\n Object.defineProperty(\n target,\n prop,\n this.makeDescriptor(prop, schema, opts)\n )\n })\n },\n\n /**\n * Apply default values to the target object for missing values.\n *\n * @name Schema#applyDefaults\n * @method\n * @param {object} target The target to which to apply values for missing values.\n */\n applyDefaults (target) {\n if (!target) {\n return\n }\n const properties = this.properties || {}\n const hasSet = utils.isFunction(target.set) || utils.isFunction(target._set)\n utils.forOwn(properties, function (schema, prop) {\n if (schema.hasOwnProperty('default') && utils.get(target, prop) === undefined) {\n if (hasSet) {\n target.set(prop, utils.plainCopy(schema['default']), { silent: true })\n } else {\n utils.set(target, prop, utils.plainCopy(schema['default']))\n }\n }\n if (schema.type === 'object' && schema.properties) {\n if (hasSet) {\n const orig = target._get('noValidate')\n target._set('noValidate', true)\n utils.set(target, prop, utils.get(target, prop) || {}, { silent: true })\n target._set('noValidate', orig)\n } else {\n utils.set(target, prop, utils.get(target, prop) || {})\n }\n schema.applyDefaults(utils.get(target, prop))\n }\n })\n },\n\n /**\n * Assemble a property descriptor for tracking and validating changes to\n * a property according to the given schema. This method is called when\n * {@link Mapper#applySchema} is set to `true`.\n *\n * @name Schema#makeDescriptor\n * @method\n * @param {string} prop The property name.\n * @param {(Schema|object)} schema The schema for the property.\n * @param {object} [opts] Optional configuration.\n * @param {function} [opts.getter] Custom getter function.\n * @param {function} [opts.setter] Custom setter function.\n * @param {function} [opts.track] Whether to track changes.\n * @returns {object} A property descriptor for the given schema.\n */\n makeDescriptor (prop, schema, opts) {\n const descriptor = {\n // Better to allow configurability, but at the user's own risk\n configurable: true,\n // These properties are enumerable by default, but regardless of their\n // enumerability, they won't be \"own\" properties of individual records\n enumerable: schema.enumerable === undefined ? true : !!schema.enumerable\n }\n // Cache a few strings for optimal performance\n const keyPath = `props.${prop}`\n const previousPath = `previous.${prop}`\n const getter = opts.getter\n const setter = opts.setter\n const unsetter = opts.unsetter\n const track = utils.isBoolean(opts.track) ? opts.track : schema.track\n\n descriptor.get = function () {\n return this._get(keyPath)\n }\n\n if (utils.isFunction(schema.get)) {\n const originalGet = descriptor.get\n descriptor.get = function () {\n return schema.get.call(this, originalGet)\n }\n }\n\n descriptor.set = function (value) {\n // These are accessed a lot\n const _get = this[getter]\n const _set = this[setter]\n const _unset = this[unsetter]\n // Optionally check that the new value passes validation\n if (!_get(noValidatePath)) {\n const errors = schema.validate(value, { path: [prop] })\n if (errors) {\n // Immediately throw an error, preventing the record from getting into\n // an invalid state\n const error = new Error(validationFailureMsg)\n error.errors = errors\n throw error\n }\n }\n // TODO: Make it so tracking can be turned on for all properties instead of\n // only per-property\n if (track && !_get(creatingPath)) {\n // previous is versioned on database commit\n // props are versioned on set()\n const previous = _get(previousPath)\n const current = _get(keyPath)\n let changing = _get(changingPath)\n let changed = _get(changedPath)\n\n if (!changing) {\n // Track properties that are changing in the current event loop\n changed = []\n }\n\n // Add changing properties to this array once at most\n const index = changed.indexOf(prop)\n if (current !== value && index === -1) {\n changed.push(prop)\n }\n if (previous === value) {\n if (index >= 0) {\n changed.splice(index, 1)\n }\n }\n // No changes in current event loop\n if (!changed.length) {\n changing = false\n _unset(changingPath)\n _unset(changedPath)\n // Cancel pending change event\n if (_get(eventIdPath)) {\n clearTimeout(_get(eventIdPath))\n _unset(eventIdPath)\n }\n }\n // Changes detected in current event loop\n if (!changing && changed.length) {\n _set(changedPath, changed)\n _set(changingPath, true)\n // Saving the timeout id allows us to batch all changes in the same\n // event loop into a single \"change\"\n // TODO: Optimize\n _set(eventIdPath, setTimeout(() => {\n // Previous event loop where changes were gathered has ended, so\n // notify any listeners of those changes and prepare for any new\n // changes\n _unset(changedPath)\n _unset(eventIdPath)\n _unset(changingPath)\n // TODO: Optimize\n if (!_get(silentPath)) {\n let i\n for (i = 0; i < changed.length; i++) {\n this.emit('change:' + changed[i], this, utils.get(this, changed[i]))\n }\n\n const changes = utils.diffObjects({ [prop]: value }, { [prop]: current })\n\n if (_get(keepChangeHistoryPath)) {\n const changeRecord = utils.plainCopy(changes)\n changeRecord.timestamp = new Date().getTime()\n let changeHistory = _get(changeHistoryPath)\n !changeHistory && _set(changeHistoryPath, (changeHistory = []))\n changeHistory.push(changeRecord)\n }\n this.emit('change', this, changes)\n }\n _unset(silentPath)\n }, 0))\n }\n }\n _set(keyPath, value)\n return value\n }\n\n if (utils.isFunction(schema.set)) {\n const originalSet = descriptor.set\n descriptor.set = function (value) {\n return schema.set.call(this, value, originalSet)\n }\n }\n\n return descriptor\n },\n\n /**\n * Create a copy of the given value that contains only the properties defined\n * in this schema.\n *\n * @name Schema#pick\n * @method\n * @param {*} value The value to copy.\n * @returns {*} The copy.\n */\n pick (value) {\n if (value === undefined) {\n return\n }\n if (this.type === 'object') {\n let copy = {}\n const properties = this.properties\n if (properties) {\n utils.forOwn(properties, (_definition, prop) => {\n copy[prop] = _definition.pick(value[prop])\n })\n }\n if (this.extends) {\n utils.fillIn(copy, this.extends.pick(value))\n }\n // Conditionally copy properties not defined in \"properties\"\n if (this.additionalProperties) {\n for (var key in value) {\n if (!properties[key]) {\n copy[key] = utils.plainCopy(value[key])\n }\n }\n }\n return copy\n } else if (this.type === 'array') {\n return value.map((item) => {\n const _copy = this.items ? this.items.pick(item) : {}\n if (this.extends) {\n utils.fillIn(_copy, this.extends.pick(item))\n }\n return _copy\n })\n }\n return utils.plainCopy(value)\n },\n\n /**\n * Validate the provided value against this schema.\n *\n * @name Schema#validate\n * @method\n * @param {*} value Value to validate.\n * @param {object} [opts] Configuration options.\n * @returns {(array|undefined)} Array of errors or `undefined` if valid.\n */\n validate (value, opts) {\n return validate(value, this, opts)\n }\n}, {\n ANY_OPS,\n ARRAY_OPS,\n NUMERIC_OPS,\n OBJECT_OPS,\n STRING_OPS,\n typeGroupValidators,\n types,\n validate,\n validationKeywords\n})\n\n/**\n * Create a subclass of this Schema:\n * @example Schema.extend\n * const JSData = require('js-data');\n * const { Schema } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSchemaClass extends Schema {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSchema = new CustomSchemaClass();\n * console.log(customSchema.foo());\n * console.log(CustomSchemaClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSchemaClass = Schema.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherSchema = new OtherSchemaClass();\n * console.log(otherSchema.foo());\n * console.log(OtherSchemaClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSchemaClass () {\n * Schema.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Schema.extend({\n * constructor: AnotherSchemaClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherSchema = new AnotherSchemaClass();\n * console.log(anotherSchema.created_at);\n * console.log(anotherSchema.foo());\n * console.log(AnotherSchemaClass.beep());\n *\n * @method Schema.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Schema class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Record from './Record'\nimport Schema from './Schema'\nimport { Relation } from './relations'\nimport {\n belongsTo,\n belongsToType,\n hasMany,\n hasManyType,\n hasOne,\n hasOneType\n} from './decorators'\n\nconst DOMAIN = 'Mapper'\nconst applyDefaultsHooks = [\n 'beforeCreate',\n 'beforeCreateMany'\n]\nconst validatingHooks = [\n 'beforeCreate',\n 'beforeCreateMany',\n 'beforeUpdate',\n 'beforeUpdateAll',\n 'beforeUpdateMany'\n]\nconst makeNotify = function (num) {\n return function (...args) {\n const opts = args[args.length - num]\n const op = opts.op\n this.dbg(op, ...args)\n\n if (applyDefaultsHooks.indexOf(op) !== -1 && opts.applyDefaults !== false) {\n const schema = this.getSchema()\n if (schema && schema.applyDefaults) {\n let toProcess = args[0]\n if (!utils.isArray(toProcess)) {\n toProcess = [toProcess]\n }\n toProcess.forEach((record) => {\n schema.applyDefaults(record)\n })\n }\n }\n\n // Automatic validation\n if (validatingHooks.indexOf(op) !== -1 && !opts.noValidate) {\n // Save current value of option\n const originalExistingOnly = opts.existingOnly\n\n // For updates, ignore required fields if they aren't present\n if (op.indexOf('beforeUpdate') === 0 && opts.existingOnly === undefined) {\n opts.existingOnly = true\n }\n const errors = this.validate(args[op === 'beforeUpdate' ? 1 : 0], utils.pick(opts, ['existingOnly']))\n\n // Restore option\n opts.existingOnly = originalExistingOnly\n\n // Abort lifecycle due to validation errors\n if (errors) {\n const err = new Error('validation failed')\n err.errors = errors\n return utils.reject(err)\n }\n }\n\n // Emit lifecycle event\n if (opts.notify || (opts.notify === undefined && this.notify)) {\n setTimeout(() => {\n this.emit(op, ...args)\n })\n }\n }\n}\n\n// These are the default implementations of all of the lifecycle hooks\nconst notify = makeNotify(1)\nconst notify2 = makeNotify(2)\n\n// This object provides meta information used by Mapper#crud to actually\n// execute each lifecycle method\nconst LIFECYCLE_METHODS = {\n count: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroy: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n destroyAll: {\n defaults: [{}, {}],\n skip: true,\n types: []\n },\n find: {\n defaults: [undefined, {}],\n types: []\n },\n findAll: {\n defaults: [{}, {}],\n types: []\n },\n sum: {\n defaults: [undefined, {}, {}],\n skip: true,\n types: []\n },\n update: {\n adapterArgs (mapper, id, props, opts) {\n return [id, mapper.toJSON(props, opts), opts]\n },\n beforeAssign: 1,\n defaults: [undefined, {}, {}],\n types: []\n },\n updateAll: {\n adapterArgs (mapper, props, query, opts) {\n return [mapper.toJSON(props, opts), query, opts]\n },\n beforeAssign: 0,\n defaults: [{}, {}, {}],\n types: []\n },\n updateMany: {\n adapterArgs (mapper, records, opts) {\n return [records.map((record) => mapper.toJSON(record, opts)), opts]\n },\n beforeAssign: 0,\n defaults: [[], {}],\n types: []\n }\n}\n\nconst MAPPER_DEFAULTS = {\n /**\n * Hash of registered adapters. Don't modify directly. Use\n * {@link Mapper#registerAdapter} instead.\n *\n * @default {}\n * @name Mapper#_adapters\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n _adapters: {},\n\n /**\n * Whether {@link Mapper#beforeCreate} and {@link Mapper#beforeCreateMany}\n * should automatically receive default values according to the Mapper's schema.\n *\n * @default true\n * @name Mapper#applyDefaults\n * @since 3.0.0\n * @type {boolean}\n */\n applyDefaults: true,\n\n /**\n * Whether to augment {@link Mapper#recordClass} with ES5 getters and setters\n * according to the properties defined in {@link Mapper#schema}. This makes\n * possible validation and change tracking on individual properties\n * when using the dot (e.g. `user.name = \"Bob\"`) operator to modify a\n * property, and is `true` by default.\n *\n * @default true\n * @name Mapper#applySchema\n * @since 3.0.0\n * @type {boolean}\n */\n applySchema: true,\n\n /**\n * The name of the registered adapter that this Mapper should used by default.\n *\n * @default \"http\"\n * @name Mapper#defaultAdapter\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n * @type {string}\n */\n defaultAdapter: 'http',\n\n /**\n * The field used as the unique identifier on records handled by this Mapper.\n *\n * @default id\n * @name Mapper#idAttribute\n * @since 3.0.0\n * @type {string}\n */\n idAttribute: 'id',\n\n /**\n * Whether records created from this mapper keep changeHistory on property changes.\n *\n * @default true\n * @name Mapper#keepChangeHistory\n * @since 3.0.0\n * @type {boolean}\n */\n keepChangeHistory: true,\n\n /**\n * Whether this Mapper should emit operational events.\n *\n * @default true\n * @name Mapper#notify\n * @since 3.0.0\n * @type {boolean}\n */\n notify: true,\n\n /**\n * Whether to skip validation when the Record instances are created.\n *\n * @default false\n * @name Mapper#noValidate\n * @since 3.0.0\n * @type {boolean}\n */\n noValidate: false,\n\n /**\n * Whether {@link Mapper#create}, {@link Mapper#createMany},\n * {@link Mapper#update}, {@link Mapper#updateAll}, {@link Mapper#updateMany},\n * {@link Mapper#find}, {@link Mapper#findAll}, {@link Mapper#destroy},\n * {@link Mapper#destroyAll}, {@link Mapper#count}, and {@link Mapper#sum}\n * should return a raw result object that contains both the instance data\n * returned by the adapter _and_ metadata about the operation.\n *\n * The default is to NOT return the result object, and instead return just the\n * instance data.\n *\n * @default false\n * @name Mapper#raw\n * @since 3.0.0\n * @type {boolean}\n */\n raw: false,\n\n /**\n * Whether records created from this mapper automatically validate their properties\n * when their properties are modified.\n *\n * @default true\n * @name Mapper#validateOnSet\n * @since 3.0.0\n * @type {boolean}\n */\n validateOnSet: true\n}\n\n/**\n * The core of JSData's [ORM/ODM][orm] implementation. Given a minimum amout of\n * meta information about a resource, a Mapper can perform generic CRUD\n * operations against that resource. Apart from its configuration, a Mapper is\n * stateless. The particulars of various persistence layers have been abstracted\n * into adapters, which a Mapper uses to perform its operations.\n *\n * The term \"Mapper\" comes from the [Data Mapper Pattern][pattern] described in\n * Martin Fowler's [Patterns of Enterprise Application Architecture][book]. A\n * Data Mapper moves data between [in-memory object instances][record] and a\n * relational or document-based database. JSData's Mapper can work with any\n * persistence layer you can write an adapter for.\n *\n * _(\"Model\" is a heavily overloaded term and is avoided in this documentation\n * to prevent confusion.)_\n *\n * [orm]: https://en.wikipedia.org/wiki/Object-relational_mapping\n *\n * @example\n * [pattern]: https://en.wikipedia.org/wiki/Data_mapper_pattern\n * [book]: http://martinfowler.com/books/eaa.html\n * [record]: Record.html\n * // Import and instantiate\n * import { Mapper } from 'js-data';\n * const UserMapper = new Mapper({ name: 'user' });\n *\n * @example\n * // Define a Mapper using the Container component\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n *\n * @class Mapper\n * @extends Component\n * @param {object} opts Configuration options.\n * @param {boolean} [opts.applySchema=true] See {@link Mapper#applySchema}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {string} [opts.defaultAdapter=http] See {@link Mapper#defaultAdapter}.\n * @param {string} [opts.idAttribute=id] See {@link Mapper#idAttribute}.\n * @param {object} [opts.methods] See {@link Mapper#methods}.\n * @param {string} opts.name See {@link Mapper#name}.\n * @param {boolean} [opts.notify] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw=false] See {@link Mapper#raw}.\n * @param {Function|boolean} [opts.recordClass] See {@link Mapper#recordClass}.\n * @param {Object|Schema} [opts.schema] See {@link Mapper#schema}.\n * @returns {Mapper} A new {@link Mapper} instance.\n * @see http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n */\nfunction Mapper (opts) {\n utils.classCallCheck(this, Mapper)\n Component.call(this)\n opts || (opts = {})\n\n // Prepare certain properties to be non-enumerable\n Object.defineProperties(this, {\n _adapters: {\n value: undefined,\n writable: true\n },\n\n /**\n * The {@link Container} that holds this Mapper. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n datastore: {\n value: undefined,\n writable: true\n },\n\n /**\n * The meta information describing this Mapper's available lifecycle\n * methods. __Do not modify.__\n *\n * @name Mapper#lifecycleMethods\n * @since 3.0.0\n * @type {Object}\n */\n lifecycleMethods: {\n value: LIFECYCLE_METHODS\n },\n\n /**\n * Set to `false` to force the Mapper to work with POJO objects only.\n *\n * @example\n * // Use POJOs only.\n * import { Mapper, Record } from 'js-data';\n * const UserMapper = new Mapper({ recordClass: false });\n * UserMapper.recordClass // false;\n * const user = UserMapper.createRecord();\n * user instanceof Record; // false\n *\n * @example\n * // Set to a custom class to have records wrapped in your custom class.\n * import { Mapper, Record } from 'js-data';\n * // Custom class\n * class User {\n * constructor (props = {}) {\n * for (var key in props) {\n * if (props.hasOwnProperty(key)) {\n * this[key] = props[key];\n * }\n * }\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User });\n * UserMapper.recordClass; // function User() {}\n * const user = UserMapper.createRecord();\n * user instanceof Record; // false\n * user instanceof User; // true\n *\n *\n * @example\n * // Extend the {@link Record} class.\n * import { Mapper, Record } from 'js-data';\n * // Custom class\n * class User extends Record {\n * constructor () {\n * super(props);\n * }\n * }\n * const UserMapper = new Mapper({ recordClass: User });\n * UserMapper.recordClass; // function User() {}\n * const user = UserMapper.createRecord();\n * user instanceof Record; // true\n * user instanceof User; // true\n *\n * @name Mapper#recordClass\n * @default {@link Record}\n * @see Record\n * @since 3.0.0\n */\n recordClass: {\n value: undefined,\n writable: true\n },\n\n /**\n * This Mapper's {@link Schema}.\n *\n * @example Mapper#schema\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const UserMapper = new Mapper({\n * name: 'user',\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * first: { type: 'string', track: true },\n * last: { type: 'string', track: true },\n * role: { type: 'string', track: true, required: true },\n * age: { type: 'integer', track: true },\n * is_active: { type: 'number' }\n * }\n * }\n * });\n * const user = UserMapper.createRecord({\n * id: 1,\n * name: 'John',\n * role: 'admin'\n * });\n * user.on('change', function (user, changes) {\n * console.log(changes);\n * });\n * user.on('change:role', function (user, value) {\n * console.log('change:role - ' + value);\n * });\n * user.role = 'owner';\n *\n * @name Mapper#schema\n * @see Schema\n * @since 3.0.0\n * @type {Schema}\n */\n schema: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply user-provided configuration\n utils.fillIn(this, opts)\n // Fill in any missing options with the defaults\n utils.fillIn(this, utils.copy(MAPPER_DEFAULTS))\n\n /**\n * The name for this Mapper. This is the minimum amount of meta information\n * required for a Mapper to be able to execute CRUD operations for a\n * Resource.\n *\n * @name Mapper#name\n * @since 3.0.0\n * @type {string}\n */\n if (!this.name) {\n throw utils.err(`new ${DOMAIN}`, 'opts.name')(400, 'string', this.name)\n }\n\n // Setup schema, with an empty default schema if necessary\n if (this.schema) {\n this.schema.type || (this.schema.type = 'object')\n if (!(this.schema instanceof Schema)) {\n this.schema = new Schema(this.schema || { type: 'object' })\n }\n }\n\n // Create a subclass of Record that's tied to this Mapper\n if (this.recordClass === undefined) {\n const superClass = Record\n this.recordClass = superClass.extend({\n constructor: (function Record () {\n var subClass = function Record (props, opts) {\n utils.classCallCheck(this, subClass)\n superClass.call(this, props, opts)\n }\n return subClass\n })()\n })\n }\n\n if (this.recordClass) {\n this.recordClass.mapper = this\n\n /**\n * Functions that should be added to the prototype of {@link Mapper#recordClass}.\n *\n * @name Mapper#methods\n * @since 3.0.0\n * @type {Object}\n */\n if (utils.isObject(this.methods)) {\n utils.addHiddenPropsToTarget(this.recordClass.prototype, this.methods)\n }\n\n // We can only apply the schema to the prototype of this.recordClass if the\n // class extends Record\n if (Record.prototype.isPrototypeOf(Object.create(this.recordClass.prototype)) && this.schema && this.schema.apply && this.applySchema) {\n this.schema.apply(this.recordClass.prototype)\n }\n }\n}\n\nexport default Component.extend({\n constructor: Mapper,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCount\n * @param {object} query The `query` argument passed to {@link Mapper#count}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#count}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCount: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreate\n * @param {object} props The `props` argument passed to {@link Mapper#create}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#create}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterCreateMany\n * @param {array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterCreateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroy: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterDestroyAll\n * @param {*} data The `data` returned by the adapter.\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterDestroyAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#find}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFind: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterFindAll\n * @param {object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterFindAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterSum\n * @param {object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterSum: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#update}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdate: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateAll\n * @param {object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateAll: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#afterUpdateMany\n * @param {array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @param {*} result The result, if any.\n * @since 3.0.0\n */\n afterUpdateMany: notify2,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#create}. If this method\n * returns a promise then {@link Mapper#create} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreate\n * @param {object} props The `props` argument passed to {@link Mapper#create}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#create}.\n * @since 3.0.0\n */\n beforeCreate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#createMany}. If this method\n * returns a promise then {@link Mapper#createMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCreateMany\n * @param {array} records The `records` argument passed to {@link Mapper#createMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#createMany}.\n * @since 3.0.0\n */\n beforeCreateMany: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#count}. If this method\n * returns a promise then {@link Mapper#count} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeCount\n * @param {object} query The `query` argument passed to {@link Mapper#count}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#count}.\n * @since 3.0.0\n */\n beforeCount: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroy}. If this method\n * returns a promise then {@link Mapper#destroy} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroy\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#destroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroy}.\n * @since 3.0.0\n */\n beforeDestroy: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#destroyAll}. If this method\n * returns a promise then {@link Mapper#destroyAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeDestroyAll\n * @param {query} query The `query` argument passed to {@link Mapper#destroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#destroyAll}.\n * @since 3.0.0\n */\n beforeDestroyAll: notify,\n\n /**\n * Mappers lifecycle hook called by {@link Mapper#find}. If this method\n * returns a promise then {@link Mapper#find} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFind\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#find}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#find}.\n * @since 3.0.0\n */\n beforeFind: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#findAll}. If this method\n * returns a promise then {@link Mapper#findAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeFindAll\n * @param {object} query The `query` argument passed to {@link Mapper#findAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#findAll}.\n * @since 3.0.0\n */\n beforeFindAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#sum}. If this method\n * returns a promise then {@link Mapper#sum} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeSum\n * @param {string} field The `field` argument passed to {@link Mapper#sum}.\n * @param {object} query The `query` argument passed to {@link Mapper#sum}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#sum}.\n * @since 3.0.0\n */\n beforeSum: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#update}. If this method\n * returns a promise then {@link Mapper#update} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdate\n * @param {(string|number)} id The `id` argument passed to {@link Mapper#update}.\n * @param {props} props The `props` argument passed to {@link Mapper#update}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#update}.\n * @since 3.0.0\n */\n beforeUpdate: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateAll}. If this method\n * returns a promise then {@link Mapper#updateAll} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateAll\n * @param {object} props The `props` argument passed to {@link Mapper#updateAll}.\n * @param {object} query The `query` argument passed to {@link Mapper#updateAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateAll}.\n * @since 3.0.0\n */\n beforeUpdateAll: notify,\n\n /**\n * Mapper lifecycle hook called by {@link Mapper#updateMany}. If this method\n * returns a promise then {@link Mapper#updateMany} will wait for the promise\n * to resolve before continuing.\n *\n * @method Mapper#beforeUpdateMany\n * @param {array} records The `records` argument passed to {@link Mapper#updateMany}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#updateMany}.\n * @since 3.0.0\n */\n beforeUpdateMany: notify,\n\n /**\n * This method is called at the end of most lifecycle methods. It does the\n * following:\n *\n * 1. If `opts.raw` is `true`, add this Mapper's configuration to the `opts`\n * argument as metadata for the operation.\n * 2. Wrap the result data appropriately using {@link Mapper#wrap}, which\n * calls {@link Mapper#createRecord}.\n *\n * @method Mapper#_end\n * @private\n * @since 3.0.0\n */\n _end (result, opts, skip) {\n if (opts.raw) {\n utils._(result, opts)\n }\n if (skip) {\n return result\n }\n let _data = opts.raw ? result.data : result\n if (_data && utils.isFunction(this.wrap)) {\n _data = this.wrap(_data, opts)\n if (opts.raw) {\n result.data = _data\n } else {\n result = _data\n }\n }\n return result\n },\n\n /**\n * Define a belongsTo relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * PostMapper.belongsTo(UserMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to post records at \"post.user\"\n * localField: 'user'\n * });\n *\n * CommentMapper.belongsTo(UserMapper, {\n * // comment.user_id points to user.id\n * foreignKey: 'user_id'\n * // user records will be attached to comment records at \"comment.user\"\n * localField: 'user'\n * });\n * CommentMapper.belongsTo(PostMapper, {\n * // comment.post_id points to post.id\n * foreignKey: 'post_id'\n * // post records will be attached to comment records at \"comment.post\"\n * localField: 'post'\n * });\n *\n * @method Mapper#belongsTo\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n belongsTo (relatedMapper, opts) {\n return belongsTo(relatedMapper, opts)(this)\n },\n\n /**\n * Select records according to the `query` argument and return the count.\n *\n * {@link Mapper#beforeCount} will be called before calling the adapter.\n * {@link Mapper#afterCount} will be called after calling the adapter.\n *\n * @example\n * // Get the number of published blog posts\n * PostMapper.count({ status: 'published' }).then((numPublished) => {\n * console.log(numPublished); // e.g. 45\n * });\n *\n * @method Mapper#count\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `count` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the count of the selected records.\n * @since 3.0.0\n */\n count (query, opts) {\n return this.crud('count', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~beforeCreateListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreate\n * @see Mapper~beforeCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback Mapper~beforeCreateListener\n * @param {object} props The `props` argument passed to {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeCreate}.\n * @see Mapper#event:beforeCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#create}. See\n * {@link Mapper~afterCreateListener} for how to listen for this event.\n *\n * @event Mapper#afterCreate\n * @see Mapper~afterCreateListener\n * @see Mapper#create\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback Mapper~afterCreateListener\n * @param {object} props The `props` argument passed to {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterCreate}.\n * @see Mapper#event:afterCreate\n * @see Mapper#create\n * @since 3.0.0\n */\n /**\n * Create and save a new the record using the provided `props`.\n *\n * {@link Mapper#beforeCreate} will be called before calling the adapter.\n * {@link Mapper#afterCreate} will be called after calling the adapter.\n *\n * @example\n * // Create and save a new blog post\n * PostMapper.create({\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'draft', ... }\n * });\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#create\n * @param {object} props The properties for the new record.\n * @param {object} [opts] Configuration options. Refer to the `create` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `props` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#create}\n * or {@link Mapper#createMany} call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created record.\n * @since 3.0.0\n */\n create (props, opts) {\n // Default values for arguments\n props || (props = {})\n opts || (opts = {})\n const originalRecord = props\n let parentRelationMap = {}\n let adapterResponse = {}\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n opts.op = 'beforeCreate'\n return this._runHook(opts.op, props, opts).then((props) => {\n opts.with || (opts.with = [])\n return this._createParentRecordIfRequired(props, opts)\n }).then((relationMap) => {\n parentRelationMap = relationMap\n }).then(() => {\n opts.op = 'create'\n return this._invokeAdapterMethod(opts.op, props, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdProps = opts.raw ? adapterResponse.data : adapterResponse\n\n return this._createOrAssignChildRecordIfRequired(createdProps, {\n opts,\n parentRelationMap,\n originalProps: props\n })\n }).then((createdProps) => {\n return this._commitChanges(originalRecord, createdProps)\n }).then((record) => {\n if (opts.raw) {\n adapterResponse.data = record\n } else {\n adapterResponse = record\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreate'\n return this._runHook(opts.op, props, opts, result)\n })\n },\n\n _commitChanges (recordOrRecords, newValues) {\n if (utils.isArray(recordOrRecords)) {\n return recordOrRecords.map((record, i) => this._commitChanges(record, newValues[i]))\n }\n\n utils.set(recordOrRecords, newValues, { silent: true })\n\n if (utils.isFunction(recordOrRecords.commit)) {\n recordOrRecords.commit()\n }\n\n return recordOrRecords\n },\n\n /**\n * Use {@link Mapper#createRecord} instead.\n * @deprecated\n * @method Mapper#createInstance\n * @param {Object|Array} props See {@link Mapper#createRecord}.\n * @param {object} [opts] See {@link Mapper#createRecord}.\n * @returns {Object|Array} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n createInstance (props, opts) {\n return this.createRecord(props, opts)\n },\n\n /**\n * Creates parent record for relation types like BelongsTo or HasMany with localKeys\n * in order to satisfy foreignKey dependency (so called child records).\n * @param {object} props See {@link Mapper#create}.\n * @param {object} opts See {@link Mapper#create}.\n * @returns {Object} cached parent records map\n * @see Mapper#create\n * @since 3.0.0\n */\n _createParentRecordIfRequired (props, opts) {\n const tasks = []\n const relations = []\n\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n if (!def.isRequiresParentId() || !def.getLocalField(props)) {\n return\n }\n\n optsCopy.raw = false\n relations.push(def)\n tasks.push(def.createParentRecord(props, optsCopy))\n })\n\n return utils.Promise.all(tasks).then(records => {\n return relations.reduce((map, relation, index) => {\n relation.setLocalField(map, records[index])\n return map\n }, {})\n })\n },\n\n /**\n * Creates child record for relation types like HasOne or HasMany with foreignKey\n * in order to satisfy foreignKey dependency (so called parent records).\n * @param {object} props See {@link Mapper#create}.\n * @param {object} context contains collected information.\n * @param {object} context.opts See {@link Mapper#create}.\n * @param {object} context.parentRelationMap contains parent records map\n * @param {object} context.originalProps contains data passed into {@link Mapper#create} method\n * @return {Promise} updated props\n * @see Mapper#create\n * @since 3.0.0\n */\n _createOrAssignChildRecordIfRequired (props, context) {\n const tasks = []\n\n utils.forEachRelation(this, context.opts, (def, optsCopy) => {\n const relationData = def.getLocalField(context.originalProps)\n\n if (!relationData) {\n return\n }\n\n optsCopy.raw = false\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.isRequiresChildId()) {\n tasks.push(def.createChildRecord(props, relationData, optsCopy))\n } else if (def.isRequiresParentId()) {\n const parent = def.getLocalField(context.parentRelationMap)\n\n if (parent) {\n def.setLocalField(props, parent)\n }\n }\n })\n\n return utils.Promise.all(tasks)\n .then(() => props)\n },\n\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeCreateMany\n * @see Mapper~beforeCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback Mapper~beforeCreateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Mapper#event:beforeCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#createMany}. See\n * {@link Mapper~afterCreateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterCreateMany\n * @see Mapper~afterCreateManyListener\n * @see Mapper#createMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback Mapper~afterCreateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Mapper#event:afterCreateMany\n * @see Mapper#createMany\n * @since 3.0.0\n */\n /**\n * Given an array of records, batch create them via an adapter.\n *\n * {@link Mapper#beforeCreateMany} will be called before calling the adapter.\n * {@link Mapper#afterCreateMany} will be called after calling the adapter.\n *\n * @example\n * // Create and save several new blog posts\n * PostMapper.createMany([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]); // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]); // { id: 1235, status: 'draft', ... }\n * });\n *\n * @fires Mapper#beforeCreate\n * @fires Mapper#afterCreate\n * @method Mapper#createMany\n * @param {Record[]} records Array of records to be created in one batch.\n * @param {object} [opts] Configuration options. Refer to the `createMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to create in a cascading\n * create if `records` contains nested relations. NOT performed in a\n * transaction. Each nested create will result in another {@link Mapper#createMany}\n * call.\n * @param {string[]} [opts.pass=[]] Relations to send to the adapter as part\n * of the payload. Normally relations are not sent.\n * @returns {Promise} Resolves with the created records.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n createMany (records, opts) {\n // Default values for arguments\n records || (records = [])\n opts || (opts = {})\n const originalRecords = records\n let adapterResponse\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n opts.adapter = this.getAdapterName(opts)\n\n // beforeCreateMany lifecycle hook\n opts.op = 'beforeCreateMany'\n return this._runHook(opts.op, records, opts).then((records) => {\n // Deep pre-create belongsTo relations\n const belongsToRelationData = {}\n opts.with || (opts.with = [])\n let tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (def.type === belongsToType && relationData.length === records.length) {\n // Create belongsTo relation first because we need a generated id to\n // attach to the child\n optsCopy.raw = false\n tasks.push(def.createLinked(relationData, optsCopy).then((relatedRecords) => {\n records.forEach((record, i) => def.setForeignKey(record, relatedRecords[i]))\n }).then((relatedRecords) => {\n def.setLocalField(belongsToRelationData, relatedRecords)\n }))\n }\n })\n return utils.Promise.all(tasks).then(() => {\n opts.op = 'createMany'\n return this._invokeAdapterMethod(opts.op, records, opts)\n }).then((result) => {\n adapterResponse = result\n }).then(() => {\n const createdRecordsData = opts.raw ? adapterResponse.data : adapterResponse\n\n // Deep post-create hasOne relations\n tasks = []\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = records\n .map((record) => def.getLocalField(record))\n .filter(Boolean)\n if (relationData.length !== records.length) {\n return\n }\n\n optsCopy.raw = false\n const belongsToData = def.getLocalField(belongsToRelationData)\n let task\n // Create hasMany and hasOne after the main create because we needed\n // a generated id to attach to these items\n if (def.type === hasManyType) {\n // Not supported\n this.log('warn', 'deep createMany of hasMany type not supported!')\n } else if (def.type === hasOneType) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setForeignKey(createdRecordData, relationData[i])\n })\n task = def.getRelation().createMany(relationData, optsCopy).then((relatedData) => {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, relatedData[i])\n })\n })\n } else if (def.type === belongsToType && belongsToData && belongsToData.length === createdRecordsData.length) {\n createdRecordsData.forEach((createdRecordData, i) => {\n def.setLocalField(createdRecordData, belongsToData[i])\n })\n }\n if (task) {\n tasks.push(task)\n }\n })\n return utils.Promise.all(tasks).then(() => {\n return this._commitChanges(originalRecords, createdRecordsData)\n })\n })\n }).then((records) => {\n if (opts.raw) {\n adapterResponse.data = records\n } else {\n adapterResponse = records\n }\n const result = this._end(adapterResponse, opts)\n opts.op = 'afterCreateMany'\n return this._runHook(opts.op, records, opts, result)\n })\n },\n\n /**\n * Create an unsaved, uncached instance of this Mapper's\n * {@link Mapper#recordClass}.\n *\n * Returns `props` if `props` is already an instance of\n * {@link Mapper#recordClass}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * const post = PostMapper.createRecord();\n *\n * @example\n * // Create an unsaved record instance with inital properties\n * const post = PostMapper.createRecord({\n * title: 'Modeling your data',\n * status: 'draft'\n * });\n *\n * @example\n * // Create a record instance that corresponds to a saved record\n * const post = PostMapper.createRecord({\n * // JSData thinks this record has been saved if it has a primary key\n * id: 1234,\n * title: 'Modeling your data',\n * status: 'draft'\n * });\n *\n * @example\n * // Create record instances from an array\n * const posts = PostMapper.createRecord([{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]);\n *\n * @example\n * // Records are validated by default\n * import { Mapper } from 'js-data';\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * });\n * try {\n * const post = PostMapper.createRecord({\n * title: 1234,\n * });\n * } catch (err) {\n * console.log(err.errors); // [{ expected: 'one of (string)', actual: 'number', path: 'title' }]\n * }\n *\n * @example\n * // Skip validation\n * import { Mapper } from 'js-data';\n * const PostMapper = new Mapper({\n * name: 'post',\n * schema: { properties: { title: { type: 'string' } } }\n * });\n * const post = PostMapper.createRecord({\n * title: 1234,\n * }, { noValidate: true });\n * console.log(post.isValid()); // false\n *\n * @method Mapper#createRecord\n * @param {Object|Object[]} props The properties for the Record instance or an\n * array of property objects for the Record instances.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @returns {Record|Record[]} The Record instance or Record instances.\n * @since 3.0.0\n */\n createRecord (props, opts) {\n props || (props = {})\n if (utils.isArray(props)) {\n return props.map((_props) => this.createRecord(_props, opts))\n }\n if (!utils.isObject(props)) {\n throw utils.err(`${DOMAIN}#createRecord`, 'props')(400, 'array or object', props)\n }\n\n if (this.relationList) {\n this.relationList.forEach(function (def) {\n def.ensureLinkedDataHasProperType(props, opts)\n })\n }\n const RecordCtor = this.recordClass\n\n return (!RecordCtor || props instanceof RecordCtor) ? props : new RecordCtor(props, opts)\n },\n\n /**\n * Lifecycle invocation method. You probably won't call this method directly.\n *\n * @method Mapper#crud\n * @param {string} method Name of the lifecycle method to invoke.\n * @param {...*} args Arguments to pass to the lifecycle method.\n * @returns {Promise}\n * @since 3.0.0\n */\n crud (method, ...args) {\n const config = this.lifecycleMethods[method]\n if (!config) {\n throw utils.err(`${DOMAIN}#crud`, method)(404, 'method')\n }\n\n const upper = `${method.charAt(0).toUpperCase()}${method.substr(1)}`\n const before = `before${upper}`\n const after = `after${upper}`\n\n let op, adapter\n\n // Default values for arguments\n config.defaults.forEach((value, i) => {\n if (args[i] === undefined) {\n args[i] = utils.copy(value)\n }\n })\n\n const opts = args[args.length - 1]\n\n // Fill in \"opts\" with the Mapper's configuration\n utils._(opts, this)\n adapter = opts.adapter = this.getAdapterName(opts)\n\n // before lifecycle hook\n op = opts.op = before\n return utils.resolve(this[op](...args)).then((_value) => {\n if (args[config.beforeAssign] !== undefined) {\n // Allow for re-assignment from lifecycle hook\n args[config.beforeAssign] = _value === undefined ? args[config.beforeAssign] : _value\n }\n // Now delegate to the adapter\n op = opts.op = method\n args = config.adapterArgs ? config.adapterArgs(this, ...args) : args\n this.dbg(op, ...args)\n return utils.resolve(this.getAdapter(adapter)[op](this, ...args))\n }).then((result) => {\n result = this._end(result, opts, !!config.skip)\n args.push(result)\n // after lifecycle hook\n op = opts.op = after\n return utils.resolve(this[op](...args)).then((_result) => {\n // Allow for re-assignment from lifecycle hook\n return _result === undefined ? result : _result\n })\n })\n },\n\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~beforeDestroyListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroy\n * @see Mapper~beforeDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback Mapper~beforeDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroy}.\n * @see Mapper#event:beforeDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroy}. See\n * {@link Mapper~afterDestroyListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroy\n * @see Mapper~afterDestroyListener\n * @see Mapper#destroy\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback Mapper~afterDestroyListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterDestroy}.\n * @see Mapper#event:afterDestroy\n * @see Mapper#destroy\n * @since 3.0.0\n */\n /**\n * Using an adapter, destroy the record with the given primary key.\n *\n * {@link Mapper#beforeDestroy} will be called before destroying the record.\n * {@link Mapper#afterDestroy} will be called after destroying the record.\n *\n * @example\n * // Destroy a specific blog post\n * PostMapper.destroy(1234).then(() => {\n * // Blog post #1234 has been destroyed\n * });\n *\n * @example\n * // Get full response\n * PostMapper.destroy(1234, { raw: true }).then((result) => {\n * console.log(result.deleted); e.g. 1\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeDestroy\n * @fires Mapper#afterDestroy\n * @method Mapper#destroy\n * @param {(string|number)} id The primary key of the record to destroy.\n * @param {object} [opts] Configuration options. Refer to the `destroy` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the record has been destroyed. Resolves\n * even if no record was found to be destroyed.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroy (id, opts) {\n return this.crud('destroy', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeDestroyAll\n * @see Mapper~beforeDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback Mapper~beforeDestroyAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeDestroyAll}.\n * @see Mapper#event:beforeDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#destroyAll}. See\n * {@link Mapper~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Mapper#afterDestroyAll\n * @see Mapper~afterDestroyAllListener\n * @see Mapper#destroyAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback Mapper~afterDestroyAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterDestroyAll}.\n * @see Mapper#event:afterDestroyAll\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n /**\n * Destroy the records selected by `query` via an adapter. If no `query` is\n * provided then all records will be destroyed.\n *\n * {@link Mapper#beforeDestroyAll} will be called before destroying the records.\n * {@link Mapper#afterDestroyAll} will be called after destroying the records.\n *\n * @example\n * // Destroy all blog posts\n * PostMapper.destroyAll().then(() => {\n * // All blog posts have been destroyed\n * });\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * PostMapper.destroyAll({ status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * });\n *\n * @example\n * // Get full response\n * const query = null;\n * const options = { raw: true };\n * PostMapper.destroyAll(query, options).then((result) => {\n * console.log(result.deleted); e.g. 14\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeDestroyAll\n * @fires Mapper#afterDestroyAll\n * @method Mapper#destroyAll\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `destroyAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves when the records have been destroyed. Resolves\n * even if no records were found to be destroyed.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n destroyAll (query, opts) {\n return this.crud('destroyAll', query, opts)\n },\n\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~beforeFindListener} for how to listen for this event.\n *\n * @event Mapper#beforeFind\n * @see Mapper~beforeFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback Mapper~beforeFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFind}.\n * @see Mapper#event:beforeFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#find}. See\n * {@link Mapper~afterFindListener} for how to listen for this event.\n *\n * @event Mapper#afterFind\n * @see Mapper~afterFindListener\n * @see Mapper#find\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFind} event.\n *\n * @example\n * function onAfterFind (id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback Mapper~afterFindListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterFind}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterFind}.\n * @see Mapper#event:afterFind\n * @see Mapper#find\n * @since 3.0.0\n */\n /**\n * Retrieve via an adapter the record with the given primary key.\n *\n * {@link Mapper#beforeFind} will be called before calling the adapter.\n * {@link Mapper#afterFind} will be called after calling the adapter.\n *\n * @example\n * PostMapper.find(1).then((post) => {\n * console.log(post); // { id: 1, ...}\n * });\n *\n * @example\n * // Get full response\n * PostMapper.find(1, { raw: true }).then((result) => {\n * console.log(result.data); // { id: 1, ...}\n * console.log(result.found); // 1\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeFind\n * @fires Mapper#afterFind\n * @method Mapper#find\n * @param {(string|number)} id The primary key of the record to retrieve.\n * @param {object} [opts] Configuration options. Refer to the `find` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found record. Resolves with\n * `undefined` if no record was found.\n * @see http://www.js-data.io/v3.0/docs/reading-data\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n find (id, opts) {\n return this.crud('find', id, opts)\n },\n\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~beforeFindAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeFindAll\n * @see Mapper~beforeFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback Mapper~beforeFindAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeFindAll}.\n * @see Mapper#event:beforeFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#findAll}. See\n * {@link Mapper~afterFindAllListener} for how to listen for this event.\n *\n * @event Mapper#afterFindAll\n * @see Mapper~afterFindAllListener\n * @see Mapper#findAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback Mapper~afterFindAllListener\n * @param {object} query The `query` argument passed to {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterFindAll}.\n * @see Mapper#event:afterFindAll\n * @see Mapper#findAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, select records to retrieve via an adapter.\n *\n * {@link Mapper#beforeFindAll} will be called before calling the adapter.\n * {@link Mapper#afterFindAll} will be called after calling the adapter.\n *\n * @example\n * // Find all \"published\" blog posts\n * PostMapper.findAll({ status: 'published' }).then((posts) => {\n * console.log(posts); // [{ id: 1, status: 'published', ...}, ...]\n * });\n *\n * @example\n * // Get full response\n * PostMapper.findAll({ status: 'published' }, { raw: true }).then((result) => {\n * console.log(result.data); // [{ id: 1, status: 'published', ...}, ...]\n * console.log(result.found); // e.g. 13\n * console.log(...); // etc., more metadata can be found on the result\n * });\n *\n * @fires Mapper#beforeFindAll\n * @fires Mapper#afterFindAll\n * @method Mapper#findAll\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `findAll` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @param {string[]} [opts.with=[]] Relations to eager load in the request.\n * @returns {Promise} Resolves with the found records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/reading-data\",\"Reading data\"]\n */\n findAll (query, opts) {\n return this.crud('findAll', query, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Mapper#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapter (name) {\n this.dbg('getAdapter', 'name:', name)\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Mapper#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || opts.defaultAdapter\n },\n\n /**\n * Get the object of registered adapters for this Mapper.\n *\n * @method Mapper#getAdapters\n * @returns {Object} {@link Mapper#_adapters}\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Returns this Mapper's {@link Schema}.\n *\n * @method Mapper#getSchema\n * @returns {Schema} This Mapper's {@link Schema}.\n * @see Mapper#schema\n * @since 3.0.0\n */\n getSchema () {\n return this.schema\n },\n\n /**\n * Defines a hasMany relationship. Only useful if you're managing your\n * Mappers manually and not using a Container or DataStore component.\n *\n * @example\n * UserMapper.hasMany(PostMapper, {\n * // post.user_id points to user.id\n * foreignKey: 'user_id'\n * // post records will be attached to user records at \"user.posts\"\n * localField: 'posts'\n * });\n *\n * @method Mapper#hasMany\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasMany (relatedMapper, opts) {\n return hasMany(relatedMapper, opts)(this)\n },\n\n /**\n * Defines a hasOne relationship. Only useful if you're managing your Mappers\n * manually and not using a {@link Container} or {@link DataStore} component.\n *\n * @example\n * UserMapper.hasOne(ProfileMapper, {\n * // profile.user_id points to user.id\n * foreignKey: 'user_id'\n * // profile records will be attached to user records at \"user.profile\"\n * localField: 'profile'\n * });\n *\n * @method Mapper#hasOne\n * @see http://www.js-data.io/v3.0/docs/relations\n * @since 3.0.0\n */\n hasOne (relatedMapper, opts) {\n return hasOne(relatedMapper, opts)(this)\n },\n\n /**\n * Return whether `record` is an instance of this Mapper's recordClass.\n *\n * @example\n * const post = PostMapper.createRecord();\n *\n * console.log(PostMapper.is(post)); // true\n * // Equivalent to what's above\n * console.log(post instanceof PostMapper.recordClass); // true\n *\n * @method Mapper#is\n * @param {Object|Record} record The record to check.\n * @returns {boolean} Whether `record` is an instance of this Mapper's\n * {@link Mapper#recordClass}.\n * @since 3.0.0\n */\n is (record) {\n const recordClass = this.recordClass\n return recordClass ? record instanceof recordClass : false\n },\n\n /**\n * Register an adapter on this Mapper under the given name.\n *\n * @method Mapper#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for this Mapper.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.defaultAdapter = name\n }\n },\n\n _runHook (hookName, ...hookArgs) {\n const defaultValueIndex = hookName.indexOf('after') === 0 ? hookArgs.length - 1 : 0\n\n return utils.resolve(this[hookName](...hookArgs))\n .then((overridenResult) => overridenResult === undefined ? hookArgs[defaultValueIndex] : overridenResult)\n },\n\n _invokeAdapterMethod (method, propsOrRecords, opts) {\n const conversionOptions = { with: opts.pass || [] }\n let object\n\n this.dbg(opts.op, propsOrRecords, opts)\n\n if (utils.isArray(propsOrRecords)) {\n object = propsOrRecords.map(record => this.toJSON(record, conversionOptions))\n } else {\n object = this.toJSON(propsOrRecords, conversionOptions)\n }\n\n return this.getAdapter(opts.adapter)[method](this, object, opts)\n },\n\n /**\n * Select records according to the `query` argument, and aggregate the sum\n * value of the property specified by `field`.\n *\n * {@link Mapper#beforeSum} will be called before calling the adapter.\n * {@link Mapper#afterSum} will be called after calling the adapter.\n *\n * @example\n * PurchaseOrderMapper.sum('amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid); // e.g. 451125.34\n * });\n *\n * @method Mapper#sum\n * @param {string} field The field to sum.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `sum` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the aggregated sum.\n * @since 3.0.0\n */\n sum (field, query, opts) {\n return this.crud('sum', field, query, opts)\n },\n\n /**\n * Return a plain object representation of the given record. Relations can\n * be optionally be included. Non-schema properties can be excluded.\n *\n * @example\n * import { Mapper, Schema } from 'js-data';\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * const person = PersonMapper.createRecord({ id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is stripped by toJSON()\n * console.log(PersonMapper.toJSON(person)); // {\"id\":1,\"name\":\"John\"}\n *\n * const PersonRelaxedMapper = new Mapper({\n * name: 'personRelaxed',\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * });\n * const person2 = PersonRelaxedMapper.createRecord({ id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is not stripped by toJSON\n * console.log(PersonRelaxedMapper.toJSON(person2)); // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Mapper#toJSON\n * @param {Record|Record[]} records Record or records from which to create a\n * POJO representation.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Array of relation names or relation fields\n * to include in the POJO representation.\n * @param {boolean} [opts.withAll] Whether to simply include all relations in\n * the representation. Overrides `opts.with`.\n * @returns {Object|Object[]} POJO representation of the record or records.\n * @since 3.0.0\n */\n toJSON (records, opts) {\n let record\n opts || (opts = {})\n if (utils.isArray(records)) {\n return records.map((record) => this.toJSON(record, opts))\n } else {\n record = records\n }\n const relationFields = (this ? this.relationFields : []) || []\n let json = {}\n\n // Copy properties defined in the schema\n if (this && this.schema) {\n json = this.schema.pick(record)\n } else {\n for (var key in record) {\n if (relationFields.indexOf(key) === -1) {\n json[key] = utils.plainCopy(record[key])\n }\n }\n }\n\n // The user wants to include relations in the resulting plain object representation\n if (this && opts.withAll) {\n opts.with = relationFields.slice()\n }\n if (this && opts.with) {\n if (utils.isString(opts.with)) {\n opts.with = [opts.with]\n }\n utils.forEachRelation(this, opts, (def, optsCopy) => {\n const relationData = def.getLocalField(record)\n if (relationData) {\n // The actual recursion\n if (utils.isArray(relationData)) {\n def.setLocalField(json, relationData.map((item) => {\n return def.getRelation().toJSON(item, optsCopy)\n }))\n } else {\n def.setLocalField(json, def.getRelation().toJSON(relationData, optsCopy))\n }\n }\n })\n }\n return json\n },\n\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~beforeUpdateListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdate\n * @see Mapper~beforeUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback Mapper~beforeUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument passed to {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#beforeUpdate}.\n * @see Mapper#event:beforeUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#update}. See\n * {@link Mapper~afterUpdateListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdate\n * @see Mapper~afterUpdateListener\n * @see Mapper#update\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback Mapper~afterUpdateListener\n * @param {string|number} id The `id` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument passed to {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument passed to {@link Mapper#afterUpdate}.\n * @see Mapper#event:afterUpdate\n * @see Mapper#update\n * @since 3.0.0\n */\n /**\n * Using an adapter, update the record with the primary key specified by the\n * `id` argument.\n *\n * {@link Mapper#beforeUpdate} will be called before updating the record.\n * {@link Mapper#afterUpdate} will be called after updating the record.\n *\n * @example\n * // Update a specific post\n * PostMapper.update(1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'published', ... }\n * });\n *\n * @fires Mapper#beforeUpdate\n * @fires Mapper#afterUpdate\n * @method Mapper#update\n * @param {(string|number)} id The primary key of the record to update.\n * @param {object} props The update to apply to the record.\n * @param {object} [opts] Configuration options. Refer to the `update` method\n * of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * transaction.\n * @returns {Promise} Resolves with the updated record. Rejects if the record\n * could not be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n update (id, props, opts) {\n return this.crud('update', id, props, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateAll\n * @see Mapper~beforeUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback Mapper~beforeUpdateAllListener\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Mapper#event:beforeUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateAll}. See\n * {@link Mapper~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateAll\n * @see Mapper~afterUpdateAllListener\n * @see Mapper#updateAll\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback Mapper~afterUpdateAllListener\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Mapper#event:afterUpdateAll\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n /**\n * Using the `query` argument, perform the a single updated to the selected\n * records.\n *\n * {@link Mapper#beforeUpdateAll} will be called before making the update.\n * {@link Mapper#afterUpdateAll} will be called after making the update.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * const update = { status: draft: published_at: null };\n * const query = { userId: 1234 };\n * PostMapper.updateAll(update, query).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Mapper#beforeUpdateAll\n * @fires Mapper#afterUpdateAll\n * @method Mapper#updateAll\n * @param {object} props Update to apply to selected records.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options. Refer to the `updateAll`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the update records, if any.\n * @see query\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateAll (props, query, opts) {\n return this.crud('updateAll', props, query, opts)\n },\n\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#beforeUpdateMany\n * @see Mapper~beforeUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback Mapper~beforeUpdateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Mapper#event:beforeUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Mapper#updateMany}. See\n * {@link Mapper~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Mapper#afterUpdateMany\n * @see Mapper~afterUpdateManyListener\n * @see Mapper#updateMany\n */\n /**\n * Callback signature for the {@link Mapper#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback Mapper~afterUpdateManyListener\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Mapper#event:afterUpdateMany\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n /**\n * Given an array of updates, perform each of the updates via an adapter. Each\n * \"update\" is a hash of properties with which to update an record. Each\n * update must contain the primary key of the record to be updated.\n *\n * {@link Mapper#beforeUpdateMany} will be called before making the update.\n * {@link Mapper#afterUpdateMany} will be called after making the update.\n *\n * @example\n * PostMapper.updateMany([\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Mapper#beforeUpdateMany\n * @fires Mapper#afterUpdateMany\n * @method Mapper#updateMany\n * @param {Record[]} records Array up record updates.\n * @param {object} [opts] Configuration options. Refer to the `updateMany`\n * method of whatever adapter you're using for more configuration options.\n * @param {boolean} [opts.adapter={@link Mapper#defaultAdapter}] Name of the\n * adapter to use.\n * @param {boolean} [opts.notify={@link Mapper#notify}] See {@link Mapper#notify}.\n * @param {boolean} [opts.noValidate={@link Mapper#noValidate}] See {@link Mapper#noValidate}.\n * @param {boolean} [opts.raw={@link Mapper#raw}] See {@link Mapper#raw}.\n * @returns {Promise} Resolves with the updated records. Rejects if any of the\n * records could be found.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n updateMany (records, opts) {\n return this.crud('updateMany', records, opts)\n },\n\n /**\n * Validate the given record or records according to this Mapper's\n * {@link Schema}. If there are no validation errors then the return value\n * will be `undefined`.\n *\n * @example\n * import {Mapper, Schema} from 'js-data'\n * const PersonSchema = new Schema({\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * });\n * const PersonMapper = new Mapper({\n * name: 'person',\n * schema: PersonSchema\n * });\n * let errors = PersonMapper.validate({ name: 'John' });\n * console.log(errors); // undefined\n * errors = PersonMapper.validate({ name: 123 });\n * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Mapper#validate\n * @param {Object|Object[]} record The record or records to validate.\n * @param {object} [opts] Configuration options. Passed to\n * {@link Schema#validate}.\n * @returns {Object[]} Array of errors or `undefined` if no errors.\n * @since 3.0.0\n */\n validate (record, opts) {\n opts || (opts = {})\n const schema = this.getSchema()\n if (!schema) {\n return\n }\n const _opts = utils.pick(opts, ['existingOnly'])\n if (utils.isArray(record)) {\n const errors = record.map((_record) => schema.validate(_record, utils.pick(_opts, ['existingOnly'])))\n\n return errors.some(Boolean) ? errors : undefined\n }\n return schema.validate(record, _opts)\n },\n\n /**\n * Method used to wrap data returned by an adapter with this Mapper's\n * {@link Mapper#recordClass}. This method is used by all of a Mapper's CRUD\n * methods. The provided implementation of this method assumes that the `data`\n * passed to it is a record or records that need to be wrapped with\n * {@link Mapper#createRecord}. Override with care.\n *\n * Provided implementation of {@link Mapper#wrap}:\n *\n * ```\n * function (data, opts) {\n * return this.createRecord(data, opts);\n * }\n * ```\n *\n * @example\n * const PostMapper = new Mapper({\n * name: 'post',\n * // Override to customize behavior\n * wrap (data, opts) {\n * const originalWrap = this.constructor.prototype.wrap;\n * // Let's say \"GET /post\" doesn't return JSON quite like JSData expects,\n * // but the actual post records are nested under a \"posts\" field. So,\n * // we override Mapper#wrap to handle this special case.\n * if (opts.op === 'findAll') {\n * return originalWrap.call(this, data.posts, opts);\n * }\n * // Otherwise perform original behavior\n * return originalWrap.call(this, data, opts);\n * }\n * });\n *\n * @method Mapper#wrap\n * @param {Object|Object[]} data The record or records to be wrapped.\n * @param {object} [opts] Configuration options. Passed to {@link Mapper#createRecord}.\n * @returns {Record|Record[]} The wrapped record or records.\n * @since 3.0.0\n */\n wrap (data, opts) {\n return this.createRecord(data, opts)\n },\n\n /**\n * @ignore\n */\n defineRelations () {\n // Setup the mapper's relations, including generating Mapper#relationList\n // and Mapper#relationFields\n utils.forOwn(this.relations, (group, type) => {\n utils.forOwn(group, (relations, _name) => {\n if (utils.isObject(relations)) {\n relations = [relations]\n }\n relations.forEach((def) => {\n const relatedMapper = this.datastore.getMapperByName(_name) || _name\n def.getRelation = () => this.datastore.getMapper(_name)\n\n if (typeof Relation[type] !== 'function') {\n throw utils.err(DOMAIN, 'defineRelations')(400, 'relation type (hasOne, hasMany, etc)', type, true)\n }\n\n this[type](relatedMapper, def)\n })\n })\n })\n }\n})\n\n/**\n * Create a subclass of this Mapper:\n *\n * @example Mapper.extend\n * const JSData = require('js-data');\n * const { Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomMapperClass extends Mapper {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * };\n * const customMapper = new CustomMapperClass();\n * console.log(customMapper.foo());\n * console.log(CustomMapperClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherMapperClass = Mapper.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherMapper = new OtherMapperClass();\n * console.log(otherMapper.foo());\n * console.log(OtherMapperClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherMapperClass () {\n * Mapper.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Mapper.extend({\n * constructor: AnotherMapperClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherMapper = new AnotherMapperClass();\n * console.log(anotherMapper.created_at);\n * console.log(anotherMapper.foo());\n * console.log(AnotherMapperClass.beep());\n *\n * @method Mapper.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Mapper class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport Component from './Component'\nimport Mapper from './Mapper'\n\nconst DOMAIN = 'Container'\n\nexport const proxiedMapperMethods = [\n /**\n * Wrapper for {@link Mapper#count}.\n *\n * @example\n * // Get the number of published blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.count('post', { status: 'published' }).then((numPublished) => {\n * console.log(numPublished); // e.g. 45\n * });\n *\n * @method Container#count\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#count}.\n * @param {object} [opts] See {@link Mapper#count}.\n * @returns {Promise} See {@link Mapper#count}.\n * @see Mapper#count\n * @since 3.0.0\n */\n 'count',\n\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~beforeCreateListener} for how to listen for this event.\n *\n * @event Container#beforeCreate\n * @see Container~beforeCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback Container~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see Container#event:beforeCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#create}. See\n * {@link Container~afterCreateListener} for how to listen for this event.\n *\n * @event Container#afterCreate\n * @see Container~afterCreateListener\n * @see Container#create\n */\n /**\n * Callback signature for the {@link Container#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback Container~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see Container#event:afterCreate\n * @see Container#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}.\n *\n * @example\n * // Create and save a new blog post\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.create('post', {\n * title: 'Modeling your data',\n * status: 'draft'\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'draft', ... }\n * });\n *\n * @fires Container#beforeCreate\n * @fires Container#afterCreate\n * @method Container#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} props See {@link Mapper#create}.\n * @param {object} [opts] See {@link Mapper#create}.\n * @returns {Promise} See {@link Mapper#create}.\n * @see Mapper#create\n * @since 3.0.0\n */\n 'create',\n\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~beforeCreateManyListener} for how to listen for this event.\n *\n * @event Container#beforeCreateMany\n * @see Container~beforeCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback Container~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see Container#event:beforeCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#createMany}. See\n * {@link Container~afterCreateManyListener} for how to listen for this event.\n *\n * @event Container#afterCreateMany\n * @see Container~afterCreateManyListener\n * @see Container#createMany\n */\n /**\n * Callback signature for the {@link Container#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback Container~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see Container#event:afterCreateMany\n * @see Container#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}.\n *\n * @example\n * // Create and save several new blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.createMany('post', [{\n * title: 'Modeling your data',\n * status: 'draft'\n * }, {\n * title: 'Reading data',\n * status: 'draft'\n * }]).then((posts) => {\n * console.log(posts[0]); // { id: 1234, status: 'draft', ... }\n * console.log(posts[1]); // { id: 1235, status: 'draft', ... }\n * });\n *\n * @fires Container#beforeCreateMany\n * @fires Container#afterCreateMany\n * @method Container#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record[]} records See {@link Mapper#createMany}.\n * @param {object} [opts] See {@link Mapper#createMany}.\n * @returns {Promise} See {@link Mapper#createMany}.\n * @see Mapper#createMany\n * @since 3.0.0\n */\n 'createMany',\n\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * __Note:__ This method does __not__ interact with any adapter, and does\n * __not__ save any data. It only creates new objects in memory.\n *\n * @example\n * // Create empty unsaved record instance\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post');\n * const post = PostMapper.createRecord();\n *\n * @method Container#createRecord\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Object[]} props See {@link Mapper#createRecord}.\n * @param {object} [opts] See {@link Mapper#createRecord}.\n * @returns {Promise} See {@link Mapper#createRecord}.\n * @see Mapper#createRecord\n * @since 3.0.0\n */\n 'createRecord',\n\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~beforeDestroyListener} for how to listen for this event.\n *\n * @event Container#beforeDestroy\n * @see Container~beforeDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback Container~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see Container#event:beforeDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroy}. See\n * {@link Container~afterDestroyListener} for how to listen for this event.\n *\n * @event Container#afterDestroy\n * @see Container~afterDestroyListener\n * @see Container#destroy\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback Container~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see Container#event:afterDestroy\n * @see Container#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}.\n *\n * @example\n * // Destroy a specific blog post\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.destroy('post', 1234).then(() => {\n * // Blog post #1234 has been destroyed\n * });\n *\n * @fires Container#beforeDestroy\n * @fires Container#afterDestroy\n * @method Container#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#destroy}.\n * @param {object} [opts] See {@link Mapper#destroy}.\n * @returns {Promise} See {@link Mapper#destroy}.\n * @see Mapper#destroy\n * @since 3.0.0\n */\n 'destroy',\n\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event Container#beforeDestroyAll\n * @see Container~beforeDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback Container~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see Container#event:beforeDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#destroyAll}. See\n * {@link Container~afterDestroyAllListener} for how to listen for this event.\n *\n * @event Container#afterDestroyAll\n * @see Container~afterDestroyAllListener\n * @see Container#destroyAll\n */\n /**\n * Callback signature for the {@link Container#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback Container~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see Container#event:afterDestroyAll\n * @see Container#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}.\n *\n * @example\n * // Destroy all \"draft\" blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.destroyAll('post', { status: 'draft' }).then(() => {\n * // All \"draft\" blog posts have been destroyed\n * });\n *\n * @fires Container#beforeDestroyAll\n * @fires Container#afterDestroyAll\n * @method Container#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#destroyAll}.\n * @param {object} [opts] See {@link Mapper#destroyAll}.\n * @returns {Promise} See {@link Mapper#destroyAll}.\n * @see Mapper#destroyAll\n * @since 3.0.0\n */\n 'destroyAll',\n\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~beforeFindListener} for how to listen for this event.\n *\n * @event Container#beforeFind\n * @see Container~beforeFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback Container~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see Container#event:beforeFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#find}. See\n * {@link Container~afterFindListener} for how to listen for this event.\n *\n * @event Container#afterFind\n * @see Container~afterFindListener\n * @see Container#find\n */\n /**\n * Callback signature for the {@link Container#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback Container~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see Container#event:afterFind\n * @see Container#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.find('post', 1).then((post) => {\n * console.log(post) // { id: 1, ...}\n * });\n *\n * @fires Container#beforeFind\n * @fires Container#afterFind\n * @method Container#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#find}.\n * @param {object} [opts] See {@link Mapper#find}.\n * @returns {Promise} See {@link Mapper#find}.\n * @see Mapper#find\n * @since 3.0.0\n */\n 'find',\n\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~beforeFindAllListener} for how to listen for this event.\n *\n * @event Container#beforeFindAll\n * @see Container~beforeFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback Container~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see Container#event:beforeFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#findAll}. See\n * {@link Container~afterFindAllListener} for how to listen for this event.\n *\n * @event Container#afterFindAll\n * @see Container~afterFindAllListener\n * @see Container#findAll\n */\n /**\n * Callback signature for the {@link Container#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback Container~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see Container#event:afterFindAll\n * @see Container#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createRecord}.\n *\n * @example\n * // Find all \"published\" blog posts\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.findAll('post', { status: 'published' }).then((posts) => {\n * console.log(posts); // [{ id: 1, ...}, ...]\n * });\n *\n * @fires Container#beforeFindAll\n * @fires Container#afterFindAll\n * @method Container#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] See {@link Mapper#findAll}.\n * @param {object} [opts] See {@link Mapper#findAll}.\n * @returns {Promise} See {@link Mapper#findAll}.\n * @see Mapper#findAll\n * @since 3.0.0\n */\n 'findAll',\n\n /**\n * Wrapper for {@link Mapper#getSchema}.\n *\n * @method Container#getSchema\n * @param {string} name Name of the {@link Mapper} to target.\n * @returns {Schema} See {@link Mapper#getSchema}.\n * @see Mapper#getSchema\n * @since 3.0.0\n */\n 'getSchema',\n\n /**\n * Wrapper for {@link Mapper#is}.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post');\n * const post = store.createRecord();\n *\n * console.log(store.is('post', post)); // true\n * // Equivalent to what's above\n * console.log(post instanceof store.getMapper('post').recordClass); // true\n *\n * @method Container#is\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Object|Record} record See {@link Mapper#is}.\n * @returns {boolean} See {@link Mapper#is}.\n * @see Mapper#is\n * @since 3.0.0\n */\n 'is',\n\n /**\n * Wrapper for {@link Mapper#sum}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('purchase_order');\n *\n * store.sum('purchase_order', 'amount', { status: 'paid' }).then((amountPaid) => {\n * console.log(amountPaid); // e.g. 451125.34\n * });\n *\n * @method Container#sum\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {string} field See {@link Mapper#sum}.\n * @param {object} [query] See {@link Mapper#sum}.\n * @param {object} [opts] See {@link Mapper#sum}.\n * @returns {Promise} See {@link Mapper#sum}.\n * @see Mapper#sum\n * @since 3.0.0\n */\n 'sum',\n\n /**\n * Wrapper for {@link Mapper#toJSON}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('person', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * const person = store.createRecord('person', { id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is stripped by toJSON()\n * console.log(store.toJSON('person', person)); // {\"id\":1,\"name\":\"John\"}\n *\n * store.defineMapper('personRelaxed', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * },\n * additionalProperties: true\n * }\n * });\n * const person2 = store.createRecord('personRelaxed', { id: 1, name: 'John', foo: 'bar' });\n * // \"foo\" is not stripped by toJSON\n * console.log(store.toJSON('personRelaxed', person2)); // {\"id\":1,\"name\":\"John\",\"foo\":\"bar\"}\n *\n * @method Container#toJSON\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {Record|Record[]} records See {@link Mapper#toJSON}.\n * @param {object} [opts] See {@link Mapper#toJSON}.\n * @returns {Object|Object[]} See {@link Mapper#toJSON}.\n * @see Mapper#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~beforeUpdateListener} for how to listen for this event.\n *\n * @event Container#beforeUpdate\n * @see Container~beforeUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback Container~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see Container#event:beforeUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#update}. See\n * {@link Container~afterUpdateListener} for how to listen for this event.\n *\n * @event Container#afterUpdate\n * @see Container~afterUpdateListener\n * @see Container#update\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback Container~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see Container#event:afterUpdate\n * @see Container#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.update('post', 1234, {\n * status: 'published',\n * published_at: new Date()\n * }).then((post) => {\n * console.log(post); // { id: 1234, status: 'published', ... }\n * });\n *\n * @fires Container#beforeUpdate\n * @fires Container#afterUpdate\n * @method Container#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Mapper#update}.\n * @param {object} record See {@link Mapper#update}.\n * @param {object} [opts] See {@link Mapper#update}.\n * @returns {Promise} See {@link Mapper#update}.\n * @see Mapper#update\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/saving-data\",\"Saving data\"]\n */\n 'update',\n\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateAll\n * @see Container~beforeUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback Container~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see Container#event:beforeUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateAll}. See\n * {@link Container~afterUpdateAllListener} for how to listen for this event.\n *\n * @event Container#afterUpdateAll\n * @see Container~afterUpdateAllListener\n * @see Container#updateAll\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback Container~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see Container#event:afterUpdateAll\n * @see Container#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}.\n *\n * @example\n * // Turn all of John's blog posts into drafts.\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * const update = { status: draft: published_at: null };\n * const query = { userId: 1234 };\n * store.updateAll('post', update, query).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Container#beforeUpdateAll\n * @fires Container#afterUpdateAll\n * @method Container#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} update See {@link Mapper#updateAll}.\n * @param {object} [query] See {@link Mapper#updateAll}.\n * @param {object} [opts] See {@link Mapper#updateAll}.\n * @returns {Promise} See {@link Mapper#updateAll}.\n * @see Mapper#updateAll\n * @since 3.0.0\n */\n 'updateAll',\n\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event Container#beforeUpdateMany\n * @see Container~beforeUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback Container~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see Container#event:beforeUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link Container#updateMany}. See\n * {@link Container~afterUpdateManyListener} for how to listen for this event.\n *\n * @event Container#afterUpdateMany\n * @see Container~afterUpdateManyListener\n * @see Container#updateMany\n */\n /**\n * Callback signature for the {@link Container#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback Container~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see Container#event:afterUpdateMany\n * @see Container#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}.\n *\n * @example\n * import { Container } from 'js-data';\n * import RethinkDBAdapter from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n * store.defineMapper('post');\n *\n * store.updateMany('post', [\n * { id: 1234, status: 'draft' },\n * { id: 2468, status: 'published', published_at: new Date() }\n * ]).then((posts) => {\n * console.log(posts); // [...]\n * });\n *\n * @fires Container#beforeUpdateMany\n * @fires Container#afterUpdateMany\n * @method Container#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#updateMany}.\n * @param {object} [opts] See {@link Mapper#updateMany}.\n * @returns {Promise} See {@link Mapper#updateMany}.\n * @see Mapper#updateMany\n * @since 3.0.0\n */\n 'updateMany',\n\n /**\n * Wrapper for {@link Mapper#validate}.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * name: { type: 'string' },\n * id: { type: 'string' }\n * }\n * }\n * });\n * let errors = store.validate('post', { name: 'John' });\n * console.log(errors); // undefined\n * errors = store.validate('post', { name: 123 });\n * console.log(errors); // [{ expected: 'one of (string)', actual: 'number', path: 'name' }]\n *\n * @method Container#validate\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records See {@link Mapper#validate}.\n * @param {object} [opts] See {@link Mapper#validate}.\n * @returns {Promise} See {@link Mapper#validate}.\n * @see Mapper#validate\n * @since 3.0.0\n */\n 'validate'\n]\n\n/**\n * The `Container` class is a place to define and store {@link Mapper} instances.\n *\n * `Container` makes it easy to manage your Mappers. Without a container, you\n * need to manage Mappers yourself, including resolving circular dependencies\n * among relations. All Mappers in a container share the same adapters, so you\n * don't have to register adapters for every single Mapper.\n *\n * @example Container#constructor\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const {Container} = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n *\n * @class Container\n * @extends Component\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {Constructor} [opts.mapperClass] See {@link Container#mapperClass}.\n * @param {object} [opts.mapperDefaults] See {@link Container#mapperDefaults}.\n * @since 3.0.0\n */\nexport function Container (opts) {\n utils.classCallCheck(this, Container)\n Component.call(this)\n opts || (opts = {})\n\n Object.defineProperties(this, {\n /**\n * The adapters registered with this Container, which are also shared by all\n * Mappers in this Container.\n *\n * @name Container#_adapters\n * @see Container#registerAdapter\n * @since 3.0.0\n * @type {Object}\n */\n _adapters: {\n value: {}\n },\n\n /**\n * The the mappers in this container\n *\n * @name Container#_mappers\n * @see Mapper\n * @since 3.0.0\n * @type {Object}\n */\n _mappers: {\n value: {}\n },\n\n /**\n * Constructor function to use in {@link Container#defineMapper} to create new\n * {@link Mapper} instances. {@link Container#mapperClass} should extend\n * {@link Mapper}. By default {@link Mapper} is used to instantiate Mappers.\n *\n * @example Container#mapperClass\n * // import { Container, Mapper } from 'js-data';\n * const JSData = require('js-data');\n * const { Container, Mapper } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * class MyMapperClass extends Mapper {\n * foo () { return 'bar' }\n * }\n * const store = new Container({\n * mapperClass: MyMapperClass\n * });\n * store.defineMapper('user');\n * console.log(store.getMapper('user').foo());\n *\n * @name Container#mapperClass\n * @see Mapper\n * @since 3.0.0\n * @type {Constructor}\n */\n mapperClass: {\n value: undefined,\n writable: true\n }\n })\n\n // Apply options provided by the user\n utils.fillIn(this, opts)\n\n /**\n * Defaults options to pass to {@link Container#mapperClass} when creating a\n * new {@link Mapper}.\n *\n * @example Container#mapperDefaults\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container({\n * mapperDefaults: {\n * idAttribute: '_id'\n * }\n * });\n * store.defineMapper('user');\n * console.log(store.getMapper('user').idAttribute);\n *\n * @default {}\n * @name Container#mapperDefaults\n * @since 3.0.0\n * @type {Object}\n */\n this.mapperDefaults = this.mapperDefaults || {}\n\n // Use the Mapper class if the user didn't provide a mapperClass\n this.mapperClass || (this.mapperClass = Mapper)\n}\n\nconst props = {\n constructor: Container,\n\n /**\n * Register a new event listener on this Container.\n *\n * Proxy for {@link Component#on}. If an event was emitted by a {@link Mapper}\n * in the Container, then the name of the {@link Mapper} will be prepended to\n * the arugments passed to the listener.\n *\n * @example Container#on\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * store.on('foo', function (...args) { console.log(args.join(':')) });\n * store.defineMapper('user');\n * store.emit('foo', 'arg1', 'arg2');\n * store.getMapper('user').emit('foo', 'arg1', 'arg2');\n *\n * @method Container#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n * @since 3.0.0\n */\n\n /**\n * Used to bind to events emitted by mappers in this container.\n *\n * @method Container#_onMapperEvent\n * @param {string} name Name of the mapper that emitted the event.\n * @param {...*} [args] Args See {@link Mapper#emit}.\n * @private\n * @since 3.0.0\n */\n _onMapperEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * Return a container scoped to a particular mapper.\n *\n * @example Container#as\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * const UserMapper = store.defineMapper('user');\n * const UserStore = store.as('user');\n *\n * const user1 = store.createRecord('user', { name: 'John' });\n * const user2 = UserStore.createRecord({ name: 'John' });\n * const user3 = UserMapper.createRecord({ name: 'John' });\n * console.log(user1 === user2);\n * console.log(user2 === user3);\n * console.log(user1 === user3);\n *\n * @method Container#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} A container scoped to a particular mapper.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n proxiedMapperMethods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Create a new mapper and register it in this container.\n *\n * @example Container#defineMapper\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container({\n * mapperDefaults: { foo: 'bar' }\n * });\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * console.log(UserMapper.foo);\n *\n * @method Container#defineMapper\n * @param {string} name Name under which to register the new {@link Mapper}.\n * {@link Mapper#name} will be set to this value.\n * @param {object} [opts] Configuration options. Passed to\n * {@link Container#mapperClass} when creating the new {@link Mapper}.\n * @returns {Mapper} The newly created instance of {@link Mapper}.\n * @see Container#as\n * @since 3.0.0\n */\n defineMapper (name, opts) {\n // For backwards compatibility with defineResource\n if (utils.isObject(name)) {\n opts = name\n name = opts.name\n }\n if (!utils.isString(name)) {\n throw utils.err(`${DOMAIN}#defineMapper`, 'name')(400, 'string', name)\n }\n\n // Default values for arguments\n opts || (opts = {})\n // Set Mapper#name\n opts.name = name\n opts.relations || (opts.relations = {})\n\n // Check if the user is overriding the datastore's default mapperClass\n const mapperClass = opts.mapperClass || this.mapperClass\n delete opts.mapperClass\n\n // Apply the datastore's defaults to the options going into the mapper\n utils.fillIn(opts, this.mapperDefaults)\n\n // Instantiate a mapper\n const mapper = this._mappers[name] = new mapperClass(opts) // eslint-disable-line\n mapper.relations || (mapper.relations = {})\n // Make sure the mapper's name is set\n mapper.name = name\n // All mappers in this datastore will share adapters\n mapper._adapters = this.getAdapters()\n\n mapper.datastore = this\n\n mapper.on('all', (...args) => this._onMapperEvent(name, ...args))\n mapper.defineRelations()\n\n return mapper\n },\n\n defineResource (name, opts) {\n console.warn('DEPRECATED: defineResource is deprecated, use defineMapper instead')\n return this.defineMapper(name, opts)\n },\n\n /**\n * Return the registered adapter with the given name or the default adapter if\n * no name is provided.\n *\n * @method Container#getAdapter\n * @param {string} [name] The name of the adapter to retrieve.\n * @returns {Adapter} The adapter.\n * @since 3.0.0\n */\n getAdapter (name) {\n const adapter = this.getAdapterName(name)\n if (!adapter) {\n throw utils.err(`${DOMAIN}#getAdapter`, 'name')(400, 'string', name)\n }\n return this.getAdapters()[adapter]\n },\n\n /**\n * Return the name of a registered adapter based on the given name or options,\n * or the name of the default adapter if no name provided.\n *\n * @method Container#getAdapterName\n * @param {(Object|string)} [opts] The name of an adapter or options, if any.\n * @returns {string} The name of the adapter.\n * @since 3.0.0\n */\n getAdapterName (opts) {\n opts || (opts = {})\n if (utils.isString(opts)) {\n opts = { adapter: opts }\n }\n return opts.adapter || this.mapperDefaults.defaultAdapter\n },\n\n /**\n * Return the registered adapters of this container.\n *\n * @method Container#getAdapters\n * @returns {Adapter}\n * @since 3.0.0\n */\n getAdapters () {\n return this._adapters\n },\n\n /**\n * Return the mapper registered under the specified name.\n *\n * @example Container#getMapper\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * store.getMapper('profile'); // throws Error, there is no mapper with name \"profile\"\n *\n * @method Container#getMapper\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapper (name) {\n const mapper = this.getMapperByName(name)\n if (!mapper) {\n throw utils.err(`${DOMAIN}#getMapper`, name)(404, 'mapper')\n }\n return mapper\n },\n\n /**\n * Return the mapper registered under the specified name.\n * Doesn't throw error if mapper doesn't exist.\n *\n * @example Container#getMapperByName\n * // import { Container } from 'js-data';\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new Container();\n * // Container#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n * console.log(UserMapper === store.getMapper('user'));\n * console.log(UserMapper === store.as('user').getMapper());\n * console.log(store.getMapper('profile')); // Does NOT throw an error\n *\n * @method Container#getMapperByName\n * @param {string} name {@link Mapper#name}.\n * @returns {Mapper}\n * @since 3.0.0\n */\n getMapperByName (name) {\n return this._mappers[name]\n },\n\n /**\n * Register an adapter on this container under the given name. Adapters\n * registered on a container are shared by all mappers in the container.\n *\n * @example\n * import { Container } from 'js-data';\n * import { RethinkDBAdapter } from 'js-data-rethinkdb';\n * const store = new Container();\n * store.registerAdapter('rethinkdb', new RethinkDBAdapter(), { default: true });\n *\n * @method Container#registerAdapter\n * @param {string} name The name of the adapter to register.\n * @param {Adapter} adapter The adapter to register.\n * @param {object} [opts] Configuration options.\n * @param {boolean} [opts.default=false] Whether to make the adapter the\n * default adapter for all Mappers in this container.\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/connecting-to-a-data-source\",\"Connecting to a data source\"]\n */\n registerAdapter (name, adapter, opts) {\n opts || (opts = {})\n this.getAdapters()[name] = adapter\n // Optionally make it the default adapter for the target.\n if (opts === true || opts.default) {\n this.mapperDefaults.defaultAdapter = name\n utils.forOwn(this._mappers, function (mapper) {\n mapper.defaultAdapter = name\n })\n }\n }\n}\n\nproxiedMapperMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getMapper(name)[method](...args)\n }\n})\n\nComponent.extend(props)\n\n/**\n * Create a subclass of this Container:\n * @example Container.extend\n * const JSData = require('js-data');\n * const { Container } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomContainerClass extends Container {\n * foo () { return 'bar' }\n * static beep () { return 'boop' }\n * }\n * const customContainer = new CustomContainerClass();\n * console.log(customContainer.foo());\n * console.log(CustomContainerClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherContainerClass = Container.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherContainer = new OtherContainerClass();\n * console.log(otherContainer.foo());\n * console.log(OtherContainerClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherContainerClass () {\n * Container.call(this);\n * this.created_at = new Date().getTime();\n * }\n * Container.extend({\n * constructor: AnotherContainerClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherContainer = new AnotherContainerClass();\n * console.log(anotherContainer.created_at);\n * console.log(anotherContainer.foo());\n * console.log(AnotherContainerClass.beep());\n *\n * @method Container.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this Container class.\n * @since 3.0.0\n */\n","import utils from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport {proxiedMapperMethods, Container} from './Container'\nimport Collection from './Collection'\n\nconst DOMAIN = 'SimpleStore'\nconst proxiedCollectionMethods = [\n /**\n * Wrapper for {@link Collection#add}.\n *\n * @example SimpleStore#add\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('book');\n *\n * // Add one book to the in-memory store:\n * store.add('book', { id: 1, title: 'Respect your Data' });\n * // Add multiple books to the in-memory store:\n * store.add('book', [\n * { id: 2, title: 'Easy data recipes' },\n * { id: 3, title: 'Active Record 101' }\n * ]);\n *\n * @fires SimpleStore#add\n * @method SimpleStore#add\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Object[]|Record|Record[])} data See {@link Collection#add}.\n * @param {object} [opts] Configuration options. See {@link Collection#add}.\n * @returns {(Object|Object[]|Record|Record[])} See {@link Collection#add}.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n 'add',\n\n /**\n * Wrapper for {@link Collection#between}.\n *\n * @example\n * // Get all users ages 18 to 30\n * const users = store.between('user', 18, 30, { index: 'age' });\n *\n * @example\n * // Same as above\n * const users = store.between('user', [18], [30], { index: 'age' });\n *\n * @method SimpleStore#between\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {array} leftKeys See {@link Collection#between}.\n * @param {array} rightKeys See {@link Collection#between}.\n * @param {object} [opts] Configuration options. See {@link Collection#between}.\n * @returns {Object[]|Record[]} See {@link Collection#between}.\n * @see Collection#between\n * @see Collection#between\n * @since 3.0.0\n */\n 'between',\n\n /**\n * Wrapper for {@link Collection#createIndex}.\n *\n * @example\n * // Index users by age\n * store.createIndex('user', 'age');\n *\n * @example\n * // Index users by status and role\n * store.createIndex('user', 'statusAndRole', ['status', 'role']);\n *\n * @method SimpleStore#createIndex\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {string} name See {@link Collection#createIndex}.\n * @param {string[]} [fieldList] See {@link Collection#createIndex}.\n * @see Collection#createIndex\n * @see Collection#createIndex\n * @since 3.0.0\n */\n 'createIndex',\n\n /**\n * Wrapper for {@link Collection#filter}.\n *\n * @example SimpleStore#filter\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('post');\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * // Get the draft posts created less than three months ago\n * let posts = store.filter('post', {\n * where: {\n * status: {\n * '==': 'draft'\n * },\n * created_at_timestamp: {\n * '>=': (new Date().getTime() - (1000 \\* 60 \\* 60 \\* 24 \\* 30 \\* 3)) // 3 months ago\n * }\n * }\n * });\n * console.log(posts);\n *\n * // Use a custom filter function\n * posts = store.filter('post', function (post) { return post.id % 2 === 0 });\n *\n * @method SimpleStore#filter\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(Object|Function)} [queryOrFn={}] See {@link Collection#filter}.\n * @param {object} [thisArg] See {@link Collection#filter}.\n * @returns {Array} See {@link Collection#filter}.\n * @see Collection#filter\n * @see Collection#filter\n * @since 3.0.0\n */\n 'filter',\n\n /**\n * Wrapper for {@link Collection#get}.\n *\n * @example SimpleStore#get\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('post');\n * store.add('post', [\n * { id: 1, status: 'draft', created_at_timestamp: new Date().getTime() }\n * ]);\n *\n * console.log(store.get('post', 1)); // {...}\n * console.log(store.get('post', 2)); // undefined\n *\n * @method SimpleStore#get\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id See {@link Collection#get}.\n * @returns {(Object|Record)} See {@link Collection#get}.\n * @see Collection#get\n * @see Collection#get\n * @since 3.0.0\n */\n 'get',\n\n /**\n * Wrapper for {@link Collection#getAll}.\n *\n * @example\n * // Get the posts where \"status\" is \"draft\" or \"inReview\"\n * const posts = store.getAll('post', 'draft', 'inReview', { index: 'status' });\n *\n * @example\n * // Same as above\n * const posts = store.getAll('post', ['draft'], ['inReview'], { index: 'status' });\n *\n * @method SimpleStore#getAll\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {...Array} [keyList] See {@link Collection#getAll}.\n * @param {object} [opts] See {@link Collection#getAll}.\n * @returns {Array} See {@link Collection#getAll}.\n * @see Collection#getAll\n * @see Collection#getAll\n * @since 3.0.0\n */\n 'getAll',\n\n /**\n * Wrapper for {@link Collection#prune}.\n *\n * @method SimpleStore#prune\n * @param {object} [opts] See {@link Collection#prune}.\n * @returns {Array} See {@link Collection#prune}.\n * @see Collection#prune\n * @see Collection#prune\n * @since 3.0.0\n */\n 'prune',\n\n /**\n * Wrapper for {@link Collection#query}.\n *\n * @example\n * // Grab page 2 of users between ages 18 and 30\n * store.query('user')\n * .between(18, 30, { index: 'age' }) // between ages 18 and 30\n * .skip(10) // second page\n * .limit(10) // page size\n * .run();\n *\n * @method SimpleStore#query\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @returns {Query} See {@link Collection#query}.\n * @see Collection#query\n * @see Collection#query\n * @since 3.0.0\n */\n 'query',\n\n /**\n * Wrapper for {@link Collection#toJSON}.\n *\n * @example\n * store.defineMapper('post', {\n * schema: {\n * properties: {\n * id: { type: 'number' },\n * title: { type: 'string' }\n * }\n * }\n * });\n * store.add('post', [\n * { id: 1, status: 'published', title: 'Respect your Data' },\n * { id: 2, status: 'draft', title: 'Connecting to a data source' }\n * ]);\n * console.log(store.toJSON('post'));\n * const draftsJSON = store.query('post')\n * .filter({ status: 'draft' })\n * .mapCall('toJSON')\n * .run();\n *\n * @method SimpleStore#toJSON\n * @param {(string|number)} name Name of the {@link Mapper} to target.\n * @param {object} [opts] See {@link Collection#toJSON}.\n * @returns {Array} See {@link Collection#toJSON}.\n * @see Collection#toJSON\n * @see Collection#toJSON\n * @since 3.0.0\n */\n 'toJSON',\n\n /**\n * Wrapper for {@link Collection#unsaved}.\n *\n * @method SimpleStore#unsaved\n * @returns {Array} See {@link Collection#unsaved}.\n * @see Collection#unsaved\n * @see Collection#unsaved\n * @since 3.0.0\n */\n 'unsaved'\n]\nconst ownMethodsForScoping = [\n 'addToCache',\n 'cachedFind',\n 'cachedFindAll',\n 'cacheFind',\n 'cacheFindAll',\n 'hashQuery'\n]\n\nconst cachedFn = function (name, hashOrId, opts) {\n const cached = this._completedQueries[name][hashOrId]\n if (utils.isFunction(cached)) {\n return cached(name, hashOrId, opts)\n }\n return cached\n}\n\nconst SIMPLESTORE_DEFAULTS = {\n /**\n * Whether to use the pending query if a `find` request for the specified\n * record is currently underway. Can be set to `true`, `false`, or to a\n * function that returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFind\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFind: true,\n\n /**\n * Whether to use the pending query if a `findAll` request for the given query\n * is currently underway. Can be set to `true`, `false`, or to a function that\n * returns `true` or `false`.\n *\n * @default true\n * @name SimpleStore#usePendingFindAll\n * @since 3.0.0\n * @type {boolean|Function}\n */\n usePendingFindAll: true\n}\n\n/**\n * The `SimpleStore` class is an extension of {@link Container}. Not only does\n * `SimpleStore` manage mappers, but also collections. `SimpleStore` implements the\n * asynchronous {@link Mapper} methods, such as {@link Mapper#find} and\n * {@link Mapper#create}. If you use the asynchronous `SimpleStore` methods\n * instead of calling them directly on the mappers, then the results of the\n * method calls will be inserted into the store's collections. You can think of\n * a `SimpleStore` as an [Identity Map](https://en.wikipedia.org/wiki/Identity_map_pattern)\n * for the [ORM](https://en.wikipedia.org/wiki/Object-relational_mapping)\n * (the Mappers).\n *\n * ```javascript\n * import { SimpleStore } from 'js-data';\n * ```\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n * const store = new SimpleStore();\n *\n * // SimpleStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n *\n * // SimpleStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user');\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful SimpleStore)\n * return store.find('user', 1); // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1);\n * console.log(user === cachedUser); // true\n * });\n *\n * @class SimpleStore\n * @extends Container\n * @param {object} [opts] Configuration options. See {@link Container}.\n * @param {boolean} [opts.collectionClass={@link Collection}] See {@link SimpleStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link SimpleStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link SimpleStore#usePendingFindAll}.\n * @returns {SimpleStore}\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-SimpleStore\",\"Working with the SimpleStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction SimpleStore (opts) {\n utils.classCallCheck(this, SimpleStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, SIMPLESTORE_DEFAULTS)\n Container.call(this, opts)\n\n this.collectionClass = this.collectionClass || Collection\n this._collections = {}\n this._pendingQueries = {}\n this._completedQueries = {}\n}\n\nconst props = {\n constructor: SimpleStore,\n\n /**\n * Internal method used to handle Mapper responses.\n *\n * @method SimpleStore#_end\n * @private\n * @param {string} name Name of the {@link Collection} to which to\n * add the data.\n * @param {object} result The result from a Mapper.\n * @param {object} [opts] Configuration options.\n * @returns {(Object|Array)} Result.\n */\n _end (name, result, opts) {\n let data = opts.raw ? result.data : result\n if (data && utils.isFunction(this.addToCache)) {\n data = this.addToCache(name, data, opts)\n if (opts.raw) {\n result.data = data\n } else {\n result = data\n }\n }\n return result\n },\n\n /**\n * Register a new event listener on this SimpleStore.\n *\n * Proxy for {@link Container#on}. If an event was emitted by a Mapper or\n * Collection in the SimpleStore, then the name of the Mapper or Collection will\n * be prepended to the arugments passed to the provided event handler.\n *\n * @example\n * // Listen for all \"afterCreate\" events in a SimpleStore\n * store.on('afterCreate', (mapperName, props, opts, result) => {\n * console.log(mapperName); // \"post\"\n * console.log(props.id); // undefined\n * console.log(result.id); // 1234\n * });\n * store.create('post', { title: 'Modeling your data' }).then((post) => {\n * console.log(post.id); // 1234\n * });\n *\n * @example\n * // Listen for the \"add\" event on a collection\n * store.on('add', (mapperName, records) => {\n * console.log(records); // [...]\n * });\n *\n * @example\n * // Listen for \"change\" events on a record\n * store.on('change', (mapperName, record, changes) => {\n * console.log(changes); // { changed: { title: 'Modeling your data' } }\n * });\n * post.title = 'Modeling your data';\n *\n * @method SimpleStore#on\n * @param {string} event Name of event to subsribe to.\n * @param {Function} listener Listener function to handle the event.\n * @param {*} [ctx] Optional content in which to invoke the listener.\n */\n\n /**\n * Used to bind to events emitted by collections in this store.\n *\n * @method SimpleStore#_onCollectionEvent\n * @private\n * @param {string} name Name of the collection that emitted the event.\n * @param {...*} [args] Args passed to {@link Collection#emit}.\n */\n _onCollectionEvent (name, ...args) {\n const type = args.shift()\n this.emit(type, name, ...args)\n },\n\n /**\n * This method takes the data received from {@link SimpleStore#find},\n * {@link SimpleStore#findAll}, {@link SimpleStore#update}, etc., and adds the\n * data to the store. _You don't need to call this method directly._\n *\n * If you're using the http adapter and your response data is in an unexpected\n * format, you may need to override this method so the right data gets added\n * to the store.\n *\n * @example\n * const store = new SimpleStore({\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items;\n * }\n * // Now perform default behavior\n * return SimpleStore.prototype.addToCache.call(this, mapperName, data, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * addToCache (mapperName, data, opts) {\n * // Let's say for a particular Resource, response data is in a weird format\n * if (name === 'comment') {\n * // Re-assign the variable to add the correct records into the stores\n * data = data.items;\n * }\n * // Now perform default behavior\n * return super.addToCache(mapperName, data, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#addToCache\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {*} data Data from which data should be selected for add.\n * @param {object} [opts] Configuration options.\n */\n addToCache (name, data, opts) {\n return this.getCollection(name).add(data, opts)\n },\n\n /**\n * Return the store scoped to a particular mapper/collection pair.\n *\n * @example SimpleStore.as\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * const UserMapper = store.defineMapper('user');\n * const UserStore = store.as('user');\n *\n * const user1 = store.createRecord('user', { name: 'John' });\n * const user2 = UserStore.createRecord({ name: 'John' });\n * const user3 = UserMapper.createRecord({ name: 'John' });\n * console.log(user1 === user2);\n * console.log(user2 === user3);\n * console.log(user1 === user3);\n *\n * @method SimpleStore#as\n * @param {string} name Name of the {@link Mapper}.\n * @returns {Object} The store, scoped to a particular Mapper/Collection pair.\n * @since 3.0.0\n */\n as (name) {\n const props = {}\n const original = this\n const methods = ownMethodsForScoping\n .concat(proxiedMapperMethods)\n .concat(proxiedCollectionMethods)\n\n methods.forEach(function (method) {\n props[method] = {\n writable: true,\n value (...args) {\n return original[method](name, ...args)\n }\n }\n })\n props.getMapper = {\n writable: true,\n value () {\n return original.getMapper(name)\n }\n }\n props.getCollection = {\n writable: true,\n value () {\n return original.getCollection(name)\n }\n }\n return Object.create(this, props)\n },\n\n /**\n * Retrieve a cached `find` result, if any. This method is called during\n * {@link SimpleStore#find} to determine if {@link Mapper#find} needs to be\n * called. If this method returns `undefined` then {@link Mapper#find} will\n * be called. Otherwise {@link SimpleStore#find} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFind.call(this, mapperName, id, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFind (mapperName, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#find call\n * return;\n * }\n * // Otherwise perform default behavior\n * return super.cachedFind(mapperName, id, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cachedFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cachedFind: cachedFn,\n\n /**\n * Retrieve a cached `findAll` result, if any. This method is called during\n * {@link SimpleStore#findAll} to determine if {@link Mapper#findAll} needs to be\n * called. If this method returns `undefined` then {@link Mapper#findAll} will\n * be called. Otherwise {@link SimpleStore#findAll} will immediately resolve with\n * the return value of this method.\n *\n * When using {@link SimpleStore} in the browser, you can override this method\n * to implement your own cache-busting strategy.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, hash, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return undefined to trigger a Mapper#findAll call\n * return undefined;\n * }\n * // Otherwise perform default behavior\n * return super.cachedFindAll(mapperName, hash, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cachedFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cachedFindAll: cachedFn,\n\n /**\n * Mark a {@link Mapper#find} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `find` entry is\n * added it means subsequent calls to the same Resource with the same `id`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#get} instead of delegating to {@link Mapper#find}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior\n * return SimpleStore.prototype.cacheFind.call(this, mapperName, data, id, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cacheFind (mapperName, data, id, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior\n * return super.cacheFind(mapperName, data, id, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cacheFind\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}.\n * @param {*} data The result to cache.\n * @param {(string|number)} id The `id` argument passed to {@link SimpleStore#find}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#find}.\n * @since 3.0.0\n */\n cacheFind (name, data, id, opts) {\n this._completedQueries[name][id] = (name, id, opts) => this.get(name, id)\n },\n\n /**\n * Mark a {@link Mapper#findAll} result as cached by adding an entry to\n * {@link SimpleStore#_completedQueries}. By default, once a `findAll` entry is\n * added it means subsequent calls to the same Resource with the same `query`\n * argument will immediately resolve with the result of calling\n * {@link SimpleStore#filter} instead of delegating to {@link Mapper#findAll}.\n *\n * As part of implementing your own caching strategy, you may choose to\n * override this method.\n *\n * @example\n * const store = new SimpleStore({\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior.\n * return SimpleStore.prototype.cachedFindAll.call(this, mapperName, data, hash, opts);\n * }\n * });\n *\n * @example\n * // Extend using ES2015 class syntax.\n * class MyStore extends SimpleStore {\n * cachedFindAll (mapperName, data, hash, opts) {\n * // Let's say for a particular Resource, we always want to pull fresh from the server\n * if (mapperName === 'schedule') {\n * // Return without saving an entry to SimpleStore#_completedQueries\n * return;\n * }\n * // Otherwise perform default behavior.\n * return super.cachedFindAll(mapperName, data, hash, opts);\n * }\n * }\n * const store = new MyStore();\n *\n * @method SimpleStore#cacheFindAll\n * @param {string} name The `name` argument passed to {@link SimpleStore#findAll}.\n * @param {*} data The result to cache.\n * @param {string} hash The result of calling {@link SimpleStore#hashQuery} on\n * the `query` argument passed to {@link SimpleStore#findAll}.\n * @param {object} opts The `opts` argument passed to {@link SimpleStore#findAll}.\n * @since 3.0.0\n */\n cacheFindAll (name, data, hash, opts) {\n this._completedQueries[name][hash] = (name, hash, opts) => this.filter(name, utils.fromJson(hash))\n },\n\n /**\n * Remove __all__ records from the in-memory store and reset\n * {@link SimpleStore#_completedQueries}.\n *\n * @method SimpleStore#clear\n * @returns {Object} Object containing all records that were in the store.\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n clear () {\n const removed = {}\n utils.forOwn(this._collections, (collection, name) => {\n removed[name] = collection.removeAll()\n this._completedQueries[name] = {}\n })\n return removed\n },\n\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~beforeCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreate\n * @see SimpleStore~beforeCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreate} event.\n *\n * @example\n * function onBeforeCreate (mapperName, props, opts) {\n * // do something\n * }\n * store.on('beforeCreate', onBeforeCreate);\n *\n * @callback SimpleStore~beforeCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreate}.\n * @see SimpleStore#event:beforeCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#create}. See\n * {@link SimpleStore~afterCreateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreate\n * @see SimpleStore~afterCreateListener\n * @see SimpleStore#create\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreate} event.\n *\n * @example\n * function onAfterCreate (mapperName, props, opts, result) {\n * // do something\n * }\n * store.on('afterCreate', onAfterCreate);\n *\n * @callback SimpleStore~afterCreateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterCreate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreate}.\n * @see SimpleStore#event:afterCreate\n * @see SimpleStore#create\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#create}. Adds the created record to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book {\"author_id\":1234,...}\n * store.create('book', {\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }).then((book) => {\n * console.log(book.id); // 120392\n * console.log(book.title); // \"Respect your Data\"\n * });\n *\n * @fires SimpleStore#beforeCreate\n * @fires SimpleStore#afterCreate\n * @fires SimpleStore#add\n * @method SimpleStore#create\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} record Passed to {@link Mapper#create}.\n * @param {object} [opts] Passed to {@link Mapper#create}. See\n * {@link Mapper#create} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n create (name, record, opts) {\n opts || (opts = {})\n return Container.prototype.create.call(this, name, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~beforeCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeCreateMany\n * @see SimpleStore~beforeCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeCreateMany} event.\n *\n * @example\n * function onBeforeCreateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeCreateMany', onBeforeCreateMany);\n *\n * @callback SimpleStore~beforeCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeCreateMany}.\n * @see SimpleStore#event:beforeCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#createMany}. See\n * {@link SimpleStore~afterCreateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterCreateMany\n * @see SimpleStore~afterCreateManyListener\n * @see SimpleStore#createMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterCreateMany} event.\n *\n * @example\n * function onAfterCreateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterCreateMany', onAfterCreateMany);\n *\n * @callback SimpleStore~afterCreateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterCreateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterCreateMany}.\n * @see SimpleStore#event:afterCreateMany\n * @see SimpleStore#createMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#createMany}. Adds the created records to the\n * store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // POST /book [{\"author_id\":1234,...},{...}]\n * store.createMany('book', [{\n * author_id: 1234,\n * edition: 'First Edition',\n * title: 'Respect your Data'\n * }, {\n * author_id: 1234,\n * edition: 'Second Edition',\n * title: 'Respect your Data'\n * }]).then((books) => {\n * console.log(books[0].id); // 142394\n * console.log(books[0].title); // \"Respect your Data\"\n * });\n *\n * @fires SimpleStore#beforeCreateMany\n * @fires SimpleStore#afterCreateMany\n * @fires SimpleStore#add\n * @method SimpleStore#createMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {array} records Passed to {@link Mapper#createMany}.\n * @param {object} [opts] Passed to {@link Mapper#createMany}. See\n * {@link Mapper#createMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the create.\n * @since 3.0.0\n */\n createMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.createMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n defineMapper (name, opts) {\n const self = this\n const mapper = Container.prototype.defineMapper.call(self, name, opts)\n self._pendingQueries[name] = {}\n self._completedQueries[name] = {}\n mapper.relationList || Object.defineProperty(mapper, 'relationList', { value: [] })\n\n let collectionOpts = {\n // Make sure the collection has somewhere to store \"added\" timestamps\n _added: {},\n // Give the collection a reference to this SimpleStore\n datastore: self,\n // The mapper tied to the collection\n mapper\n }\n\n if (opts && ('onConflict' in opts)) {\n collectionOpts.onConflict = opts.onConflict\n }\n\n // The SimpleStore uses a subclass of Collection that is \"SimpleStore-aware\"\n const collection = self._collections[name] = new self.collectionClass(null, collectionOpts) // eslint-disable-line\n\n const schema = mapper.schema || {}\n const properties = schema.properties || {}\n // TODO: Make it possible index nested properties?\n utils.forOwn(properties, function (opts, prop) {\n if (opts.indexed) {\n collection.createIndex(prop)\n }\n })\n\n // Create a secondary index on the \"added\" timestamps of records in the\n // collection\n collection.createIndex('addedTimestamps', ['$'], {\n fieldGetter (obj) {\n return collection._added[collection.recordId(obj)]\n }\n })\n\n collection.on('all', function (...args) {\n self._onCollectionEvent(name, ...args)\n })\n\n return mapper\n },\n\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~beforeDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroy\n * @see SimpleStore~beforeDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroy} event.\n *\n * @example\n * function onBeforeDestroy (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeDestroy', onBeforeDestroy);\n *\n * @callback SimpleStore~beforeDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroy}.\n * @see SimpleStore#event:beforeDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroy}. See\n * {@link SimpleStore~afterDestroyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroy\n * @see SimpleStore~afterDestroyListener\n * @see SimpleStore#destroy\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroy} event.\n *\n * @example\n * function onAfterDestroy (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterDestroy', onAfterDestroy);\n *\n * @callback SimpleStore~afterDestroyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroy}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterDestroy}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroy}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroy}.\n * @see SimpleStore#event:afterDestroy\n * @see SimpleStore#destroy\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroy}. Removes any destroyed record from the\n * in-memory store. Clears out any {@link SimpleStore#_completedQueries} entries\n * associated with the provided `id`.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' });\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is no longer in the in-memory store\n * console.log(store.get('book', 1234)); // undefined\n *\n * return store.find('book', 1234);\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book); // undefined\n * });\n *\n * @fires SimpleStore#beforeDestroy\n * @fires SimpleStore#afterDestroy\n * @fires SimpleStore#remove\n * @method SimpleStore#destroy\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#destroy}.\n * @param {object} [opts] Passed to {@link Mapper#destroy}. See\n * {@link Mapper#destroy} for more configuration options.\n * @returns {Promise} Resolves when the destroy operation completes.\n * @since 3.0.0\n */\n destroy (name, id, opts) {\n opts || (opts = {})\n return Container.prototype.destroy.call(this, name, id, opts).then((result) => {\n const record = this.getCollection(name).remove(id, opts)\n\n if (opts.raw) {\n result.data = record\n } else {\n result = record\n }\n delete this._pendingQueries[name][id]\n delete this._completedQueries[name][id]\n return result\n })\n },\n\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~beforeDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeDestroyAll\n * @see SimpleStore~beforeDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeDestroyAll} event.\n *\n * @example\n * function onBeforeDestroyAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeDestroyAll', onBeforeDestroyAll);\n *\n * @callback SimpleStore~beforeDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeDestroyAll}.\n * @see SimpleStore#event:beforeDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#destroyAll}. See\n * {@link SimpleStore~afterDestroyAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterDestroyAll\n * @see SimpleStore~afterDestroyAllListener\n * @see SimpleStore#destroyAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterDestroyAll} event.\n *\n * @example\n * function onAfterDestroyAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterDestroyAll', onAfterDestroyAll);\n *\n * @callback SimpleStore~afterDestroyAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterDestroyAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterDestroyAll}.\n * @see SimpleStore#event:afterDestroyAll\n * @see SimpleStore#destroyAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#destroyAll}. Removes any destroyed records from\n * the in-memory store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * store.add('book', { id: 1234, title: 'Data Management is Hard' });\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // DELETE /book/1234\n * store.destroy('book', 1234).then(() => {\n * // The book record is gone from the in-memory store\n * console.log(store.get('book', 1234)); // undefined\n * return store.find('book', 1234);\n * }).then((book) {\n * // The book was deleted from the database too\n * console.log(book); // undefined\n * });\n *\n * @fires SimpleStore#beforeDestroyAll\n * @fires SimpleStore#afterDestroyAll\n * @fires SimpleStore#remove\n * @method SimpleStore#destroyAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] Passed to {@link Mapper#destroyAll}.\n * @param {object} [opts] Passed to {@link Mapper#destroyAll}. See\n * {@link Mapper#destroyAll} for more configuration options.\n * @returns {Promise} Resolves when the delete completes.\n * @since 3.0.0\n */\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return Container.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n const records = this.getCollection(name).removeAll(query, opts)\n\n if (opts.raw) {\n result.data = records\n } else {\n result = records\n }\n const hash = this.hashQuery(name, query, opts)\n delete this._pendingQueries[name][hash]\n delete this._completedQueries[name][hash]\n return result\n })\n },\n\n eject (name, id, opts) {\n console.warn('DEPRECATED: \"eject\" is deprecated, use \"remove\" instead')\n return this.remove(name, id, opts)\n },\n\n ejectAll (name, query, opts) {\n console.warn('DEPRECATED: \"ejectAll\" is deprecated, use \"removeAll\" instead')\n return this.removeAll(name, query, opts)\n },\n\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~beforeFindListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFind\n * @see SimpleStore~beforeFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFind} event.\n *\n * @example\n * function onBeforeFind (mapperName, id, opts) {\n * // do something\n * }\n * store.on('beforeFind', onBeforeFind);\n *\n * @callback SimpleStore~beforeFindListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFind}.\n * @see SimpleStore#event:beforeFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#find}. See\n * {@link SimpleStore~afterFindListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFind\n * @see SimpleStore~afterFindListener\n * @see SimpleStore#find\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFind} event.\n *\n * @example\n * function onAfterFind (mapperName, id, opts, result) {\n * // do something\n * }\n * store.on('afterFind', onAfterFind);\n *\n * @callback SimpleStore~afterFindListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFind}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterFind}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFind}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFind}.\n * @see SimpleStore#event:afterFind\n * @see SimpleStore#find\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#find}. Adds any found record to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('book');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /book/1234\n * store.find('book', 1234).then((book) => {\n * // The book record is now in the in-memory store\n * console.log(store.get('book', 1234) === book); // true\n * });\n *\n * @fires SimpleStore#beforeFind\n * @fires SimpleStore#afterFind\n * @fires SimpleStore#add\n * @method SimpleStore#find\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#find}.\n * @param {object} [opts] Passed to {@link Mapper#find}.\n * @param {boolean} [opts.force] Bypass cacheFind\n * @param {boolean|Function} [opts.usePendingFind] See {@link SimpleStore#usePendingFind}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n find (name, id, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const pendingQuery = this._pendingQueries[name][id]\n const usePendingFind = opts.usePendingFind === undefined ? this.usePendingFind : opts.usePendingFind\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFind) ? usePendingFind.call(this, name, id, opts) : usePendingFind)) {\n return pendingQuery\n }\n const item = this.cachedFind(name, id, opts)\n\n if (opts.force || !item) {\n const promise = this._pendingQueries[name][id] = Container.prototype.find.call(this, name, id, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][id]\n result = this._end(name, result, opts)\n this.cacheFind(name, result, id, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][id]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(item)\n },\n\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~beforeFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeFindAll\n * @see SimpleStore~beforeFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeFindAll} event.\n *\n * @example\n * function onBeforeFindAll (mapperName, query, opts) {\n * // do something\n * }\n * store.on('beforeFindAll', onBeforeFindAll);\n *\n * @callback SimpleStore~beforeFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeFindAll}.\n * @see SimpleStore#event:beforeFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#findAll}. See\n * {@link SimpleStore~afterFindAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterFindAll\n * @see SimpleStore~afterFindAllListener\n * @see SimpleStore#findAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterFindAll} event.\n *\n * @example\n * function onAfterFindAll (mapperName, query, opts, result) {\n * // do something\n * }\n * store.on('afterFindAll', onAfterFindAll);\n *\n * @callback SimpleStore~afterFindAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterFindAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterFindAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterFindAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterFindAll}.\n * @see SimpleStore#event:afterFindAll\n * @see SimpleStore#findAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#findAll}. Adds any found records to the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('movie');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // GET /movie?rating=PG\n * store.find('movie', { rating: 'PG' }).then((movies) => {\n * // The movie records are now in the in-memory store\n * console.log(store.filter('movie'));\n * });\n *\n * @fires SimpleStore#beforeFindAll\n * @fires SimpleStore#afterFindAll\n * @fires SimpleStore#add\n * @method SimpleStore#findAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} [query] Passed to {@link Mapper.findAll}.\n * @param {object} [opts] Passed to {@link Mapper.findAll}.\n * @param {boolean} [opts.force] Bypass cacheFindAll\n * @param {boolean|Function} [opts.usePendingFindAll] See {@link SimpleStore#usePendingFindAll}\n * @returns {Promise} Resolves with the result, if any.\n * @since 3.0.0\n */\n findAll (name, query, opts) {\n opts || (opts = {})\n const mapper = this.getMapper(name)\n const hash = this.hashQuery(name, query, opts)\n const pendingQuery = this._pendingQueries[name][hash]\n const usePendingFindAll = opts.usePendingFindAll === undefined ? this.usePendingFindAll : opts.usePendingFindAll\n utils._(opts, mapper)\n\n if (pendingQuery && (utils.isFunction(usePendingFindAll) ? usePendingFindAll.call(this, name, query, opts) : usePendingFindAll)) {\n return pendingQuery\n }\n\n const items = this.cachedFindAll(name, hash, opts)\n\n if (opts.force || !items) {\n const promise = this._pendingQueries[name][hash] = Container.prototype.findAll.call(this, name, query, opts)\n return promise\n .then((result) => {\n delete this._pendingQueries[name][hash]\n result = this._end(name, result, opts)\n this.cacheFindAll(name, result, hash, opts)\n return result\n }, (err) => {\n delete this._pendingQueries[name][hash]\n return utils.reject(err)\n })\n }\n\n return utils.resolve(items)\n },\n\n /**\n * Return the {@link Collection} with the given name, if for some\n * reason you need a direct reference to the collection.\n *\n * @method SimpleStore#getCollection\n * @param {string} name Name of the {@link Collection} to retrieve.\n * @returns {Collection}\n * @since 3.0.0\n * @throws {Error} Thrown if the specified {@link Collection} does not\n * exist.\n */\n getCollection (name) {\n const collection = this._collections[name]\n if (!collection) {\n throw utils.err(`${DOMAIN}#getCollection`, name)(404, 'collection')\n }\n return collection\n },\n\n /**\n * Hashing function used to cache {@link SimpleStore#find} and\n * {@link SimpleStore#findAll} requests. This method simply JSONifies the\n * `query` argument passed to {@link SimpleStore#find} or\n * {@link SimpleStore#findAll}.\n *\n * Override this method for custom hashing behavior.\n * @method SimpleStore#hashQuery\n * @param {string} name The `name` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @param {object} query The `query` argument passed to {@link SimpleStore#find}\n * or {@link SimpleStore#findAll}.\n * @returns {string} The JSONified `query`.\n * @since 3.0.0\n */\n hashQuery (name, query, opts) {\n return utils.toJson(query || {})\n },\n\n inject (name, records, opts) {\n console.warn('DEPRECATED: \"inject\" is deprecated, use \"add\" instead')\n return this.add(name, records, opts)\n },\n\n /**\n * Wrapper for {@link Collection#remove}. Removes the specified\n * {@link Record} from the store.\n *\n * @example SimpleStore#remove\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('book');\n * console.log(store.getAll('book').length);\n * store.add('book', { id: 1234 });\n * console.log(store.getAll('book').length);\n * store.remove('book', 1234);\n * console.log(store.getAll('book').length);\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#remove\n * @param {string} name The name of the {@link Collection} to target.\n * @param {string|number} id The primary key of the {@link Record} to remove.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n remove (name, id, opts) {\n const record = this.getCollection(name).remove(id, opts)\n if (record) {\n this.removeRelated(name, [record], opts)\n }\n return record\n },\n\n /**\n * Wrapper for {@link Collection#removeAll}. Removes the selected\n * {@link Record}s from the store.\n *\n * @example SimpleStore#removeAll\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * const store = new SimpleStore();\n * store.defineMapper('movie');\n * console.log(store.getAll('movie').length);\n * store.add('movie', [{ id: 3, rating: 'R' }, { id: 4, rating: 'PG-13' });\n * console.log(store.getAll('movie').length);\n * store.removeAll('movie', { rating: 'R' });\n * console.log(store.getAll('movie').length);\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeAll\n * @param {string} name The name of the {@link Collection} to target.\n * @param {object} [query={}] Selection query. See {@link query}.\n * @param {object} [query.where] See {@link query.where}.\n * @param {number} [query.offset] See {@link query.offset}.\n * @param {number} [query.limit] See {@link query.limit}.\n * @param {string|Array[]} [query.orderBy] See {@link query.orderBy}.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record} to also\n * remove from the store.\n * @returns {Record} The removed {@link Record}s, if any.\n * @see Collection#add\n * @see Collection#add\n * @since 3.0.0\n */\n removeAll (name, query, opts) {\n if (!query || !Object.keys(query).length) {\n this._completedQueries[name] = {}\n } else {\n this._completedQueries[name][this.hashQuery(name, query, opts)] = undefined\n }\n const records = this.getCollection(name).removeAll(query, opts)\n if (records.length) {\n this.removeRelated(name, records, opts)\n }\n return records\n },\n\n /**\n * Remove from the store {@link Record}s that are related to the provided\n * {@link Record}(s).\n *\n * @fires SimpleStore#remove\n * @method SimpleStore#removeRelated\n * @param {string} name The name of the {@link Collection} to target.\n * @param {Record|Record[]} records {@link Record}s whose relations are to be\n * removed.\n * @param {object} [opts] Configuration options.\n * @param {string[]} [opts.with] Relations of the {@link Record}(s) to remove\n * from the store.\n * @since 3.0.0\n */\n removeRelated (name, records, opts) {\n if (!utils.isArray(records)) {\n records = [records]\n }\n utils.forEachRelation(this.getMapper(name), opts, (def, optsCopy) => {\n records.forEach((record) => {\n let relatedData\n let query\n if (def.foreignKey && (def.type === hasOneType || def.type === hasManyType)) {\n query = { [def.foreignKey]: def.getForeignKey(record) }\n } else if (def.type === hasManyType && def.localKeys) {\n query = {\n where: {\n [def.getRelation().idAttribute]: {\n 'in': utils.get(record, def.localKeys)\n }\n }\n }\n } else if (def.type === hasManyType && def.foreignKeys) {\n query = {\n where: {\n [def.foreignKeys]: {\n 'contains': def.getForeignKey(record)\n }\n }\n }\n } else if (def.type === belongsToType) {\n relatedData = this.remove(def.relation, def.getForeignKey(record), optsCopy)\n }\n if (query) {\n relatedData = this.removeAll(def.relation, query, optsCopy)\n }\n if (relatedData) {\n if (utils.isArray(relatedData) && !relatedData.length) {\n return\n }\n if (def.type === hasOneType) {\n relatedData = relatedData[0]\n }\n def.setLocalField(record, relatedData)\n }\n })\n })\n },\n\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~beforeUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdate\n * @see SimpleStore~beforeUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdate} event.\n *\n * @example\n * function onBeforeUpdate (mapperName, id, props, opts) {\n * // do something\n * }\n * store.on('beforeUpdate', onBeforeUpdate);\n *\n * @callback SimpleStore~beforeUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdate}.\n * @see SimpleStore#event:beforeUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#update}. See\n * {@link SimpleStore~afterUpdateListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdate\n * @see SimpleStore~afterUpdateListener\n * @see SimpleStore#update\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdate} event.\n *\n * @example\n * function onAfterUpdate (mapperName, id, props, opts, result) {\n * // do something\n * }\n * store.on('afterUpdate', onAfterUpdate);\n *\n * @callback SimpleStore~afterUpdateListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdate}.\n * @param {string|number} id The `id` argument received by {@link Mapper#afterUpdate}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdate}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdate}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdate}.\n * @see SimpleStore#event:afterUpdate\n * @see SimpleStore#update\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#update}. Adds the updated {@link Record} to the\n * store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post/1234 {\"status\":\"published\"}\n * store.update('post', 1, { status: 'published' }).then((post) => {\n * // The post record has also been updated in the in-memory store\n * console.log(store.get('post', 1234));\n * });\n *\n * @fires SimpleStore#beforeUpdate\n * @fires SimpleStore#afterUpdate\n * @fires SimpleStore#add\n * @method SimpleStore#update\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(string|number)} id Passed to {@link Mapper#update}.\n * @param {object} record Passed to {@link Mapper#update}.\n * @param {object} [opts] Passed to {@link Mapper#update}. See\n * {@link Mapper#update} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n update (name, id, record, opts) {\n opts || (opts = {})\n return Container.prototype.update.call(this, name, id, record, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~beforeUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateAll\n * @see SimpleStore~beforeUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateAll} event.\n *\n * @example\n * function onBeforeUpdateAll (mapperName, props, query, opts) {\n * // do something\n * }\n * store.on('beforeUpdateAll', onBeforeUpdateAll);\n *\n * @callback SimpleStore~beforeUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#beforeUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateAll}.\n * @see SimpleStore#event:beforeUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateAll}. See\n * {@link SimpleStore~afterUpdateAllListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateAll\n * @see SimpleStore~afterUpdateAllListener\n * @see SimpleStore#updateAll\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateAll} event.\n *\n * @example\n * function onAfterUpdateAll (mapperName, props, query, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateAll', onAfterUpdateAll);\n *\n * @callback SimpleStore~afterUpdateAllListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} props The `props` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} query The `query` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateAll}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateAll}.\n * @see SimpleStore#event:afterUpdateAll\n * @see SimpleStore#updateAll\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateAll}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post?author_id=1234 {\"status\":\"published\"}\n * store.updateAll('post', { author_id: 1234 }, { status: 'published' }).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.filter('posts', { author_id: 1234 }));\n * });\n *\n * @fires SimpleStore#beforeUpdateAll\n * @fires SimpleStore#afterUpdateAll\n * @fires SimpleStore#add\n * @method SimpleStore#updateAll\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {object} props Passed to {@link Mapper#updateAll}.\n * @param {object} [query] Passed to {@link Mapper#updateAll}.\n * @param {object} [opts] Passed to {@link Mapper#updateAll}. See\n * {@link Mapper#updateAll} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateAll (name, props, query, opts) {\n opts || (opts = {})\n return Container.prototype.updateAll.call(this, name, props, query, opts)\n .then((result) => this._end(name, result, opts))\n },\n\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~beforeUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#beforeUpdateMany\n * @see SimpleStore~beforeUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:beforeUpdateMany} event.\n *\n * @example\n * function onBeforeUpdateMany (mapperName, records, opts) {\n * // do something\n * }\n * store.on('beforeUpdateMany', onBeforeUpdateMany);\n *\n * @callback SimpleStore~beforeUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#beforeUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#beforeUpdateMany}.\n * @see SimpleStore#event:beforeUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Fired during {@link SimpleStore#updateMany}. See\n * {@link SimpleStore~afterUpdateManyListener} for how to listen for this event.\n *\n * @event SimpleStore#afterUpdateMany\n * @see SimpleStore~afterUpdateManyListener\n * @see SimpleStore#updateMany\n */\n /**\n * Callback signature for the {@link SimpleStore#event:afterUpdateMany} event.\n *\n * @example\n * function onAfterUpdateMany (mapperName, records, opts, result) {\n * // do something\n * }\n * store.on('afterUpdateMany', onAfterUpdateMany);\n *\n * @callback SimpleStore~afterUpdateManyListener\n * @param {string} name The `name` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} records The `records` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} opts The `opts` argument received by {@link Mapper#afterUpdateMany}.\n * @param {object} result The `result` argument received by {@link Mapper#afterUpdateMany}.\n * @see SimpleStore#event:afterUpdateMany\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n /**\n * Wrapper for {@link Mapper#updateMany}. Adds the updated {@link Record}s to\n * the store.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * import { HttpAdapter } from 'js-data-http';\n *\n * const store = new SimpleStore();\n * store.registerAdapter('http', new HttpAdapter(), { default: true });\n *\n * store.defineMapper('post');\n *\n * // Since this example uses the http adapter, we'll get something like:\n * //\n * // PUT /post [{\"id\":3,status\":\"published\"},{\"id\":4,status\":\"published\"}]\n * store.updateMany('post', [\n * { id: 3, status: 'published' },\n * { id: 4, status: 'published' }\n * ]).then((posts) => {\n * // The post records have also been updated in the in-memory store\n * console.log(store.getAll('post', 3, 4));\n * });\n *\n * @fires SimpleStore#beforeUpdateMany\n * @fires SimpleStore#afterUpdateMany\n * @fires SimpleStore#add\n * @method SimpleStore#updateMany\n * @param {string} name Name of the {@link Mapper} to target.\n * @param {(Object[]|Record[])} records Passed to {@link Mapper#updateMany}.\n * @param {object} [opts] Passed to {@link Mapper#updateMany}. See\n * {@link Mapper#updateMany} for more configuration options.\n * @returns {Promise} Resolves with the result of the update.\n * @since 3.0.0\n */\n updateMany (name, records, opts) {\n opts || (opts = {})\n return Container.prototype.updateMany.call(this, name, records, opts)\n .then((result) => this._end(name, result, opts))\n }\n}\n\nproxiedCollectionMethods.forEach(function (method) {\n props[method] = function (name, ...args) {\n return this.getCollection(name)[method](...args)\n }\n})\n\nexport default Container.extend(props)\n\n/**\n * Fired when a record changes. Only works for records that have tracked fields.\n * See {@link SimpleStore~changeListener} on how to listen for this event.\n *\n * @event SimpleStore#change\n * @see SimpleStore~changeListener\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:change} event.\n *\n * @example\n * function onChange (mapperName, record, changes) {\n * // do something\n * }\n * store.on('change', onChange);\n *\n * @callback SimpleStore~changeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record} record The Record that changed.\n * @param {object} changes The changes.\n * @see SimpleStore#event:change\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are added to the in-memory store. See\n * {@link SimpleStore~addListener} on how to listen for this event.\n *\n * @event SimpleStore#add\n * @see SimpleStore~addListener\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:add} event.\n *\n * @example\n * function onAdd (mapperName, recordOrRecords) {\n * // do something\n * }\n * store.on('add', onAdd);\n *\n * @callback SimpleStore~addListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} The Record or Records that were added.\n * @see SimpleStore#event:add\n * @see SimpleStore#add\n * @see SimpleStore#create\n * @see SimpleStore#createMany\n * @see SimpleStore#find\n * @see SimpleStore#findAll\n * @see SimpleStore#update\n * @see SimpleStore#updateAll\n * @see SimpleStore#updateMany\n * @since 3.0.0\n */\n\n/**\n * Fired when one or more records are removed from the in-memory store. See\n * {@link SimpleStore~removeListener} for how to listen for this event.\n *\n * @event SimpleStore#remove\n * @see SimpleStore~removeListener\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n */\n\n/**\n * Callback signature for the {@link SimpleStore#event:remove} event.\n *\n * @example\n * function onRemove (mapperName, recordsOrRecords) {\n * // do something\n * }\n * store.on('remove', onRemove);\n *\n * @callback SimpleStore~removeListener\n * @param {string} name The name of the associated {@link Mapper}.\n * @param {Record|Record[]} Record or Records that were removed.\n * @see SimpleStore#event:remove\n * @see SimpleStore#clear\n * @see SimpleStore#destroy\n * @see SimpleStore#destroyAll\n * @see SimpleStore#remove\n * @see SimpleStore#removeAll\n * @since 3.0.0\n */\n\n/**\n * Create a subclass of this SimpleStore:\n * @example SimpleStore.extend\n * const JSData = require('js-data');\n * const { SimpleStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomSimpleStoreClass extends SimpleStore {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customSimpleStore = new CustomSimpleStoreClass();\n * console.log(customSimpleStore.foo());\n * console.log(CustomSimpleStoreClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherSimpleStoreClass = SimpleStore.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const otherSimpleStore = new OtherSimpleStoreClass();\n * console.log(otherSimpleStore.foo());\n * console.log(OtherSimpleStoreClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherSimpleStoreClass () {\n * SimpleStore.call(this)\n * this.created_at = new Date().getTime()\n * }\n * SimpleStore.extend({\n * constructor: AnotherSimpleStoreClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * })\n * const anotherSimpleStore = new AnotherSimpleStoreClass();\n * console.log(anotherSimpleStore.created_at);\n * console.log(anotherSimpleStore.foo());\n * console.log(AnotherSimpleStoreClass.beep());\n *\n * @method SimpleStore.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this SimpleStore class.\n * @since 3.0.0\n */\n","import utils from './utils'\nimport './decorators'\nimport Collection from './Collection'\n\nconst DOMAIN = 'LinkedCollection'\n\n/**\n * Extends {@link Collection}. Used by a {@link DataStore} to implement an\n * Identity Map.\n *\n * ```javascript\n * import {LinkedCollection} from 'js-data'\n * ```\n *\n * @class LinkedCollection\n * @extends Collection\n * @param {array} [records] Initial set of records to insert into the\n * collection. See {@link Collection}.\n * @param {object} [opts] Configuration options. See {@link Collection}.\n * @returns {Mapper}\n */\nfunction LinkedCollection (records, opts) {\n utils.classCallCheck(this, LinkedCollection)\n // Make sure this collection has somewhere to store \"added\" timestamps\n Object.defineProperties(this, {\n _added: {\n value: {}\n },\n datastore: {\n writable: true,\n value: undefined\n }\n })\n\n Collection.call(this, records, opts)\n\n // Make sure this collection has a reference to a datastore\n if (!this.datastore) {\n throw utils.err(`new ${DOMAIN}`, 'opts.datastore')(400, 'DataStore', this.datastore)\n }\n}\n\nexport default Collection.extend({\n constructor: LinkedCollection,\n\n _addMeta (record, timestamp) {\n // Track when this record was added\n this._added[this.recordId(record)] = timestamp\n\n if (utils.isFunction(record._set)) {\n record._set('$', timestamp)\n }\n },\n\n _clearMeta (record) {\n delete this._added[this.recordId(record)]\n if (utils.isFunction(record._set)) {\n record._set('$') // unset\n }\n },\n\n _onRecordEvent (...args) {\n Collection.prototype._onRecordEvent.apply(this, args)\n const event = args[0]\n // This is a very brute force method\n // Lots of room for optimization\n if (utils.isString(event) && event.indexOf('change') === 0) {\n this.updateIndexes(args[1])\n }\n },\n\n add (records, opts) {\n const mapper = this.mapper\n const timestamp = new Date().getTime()\n const singular = utils.isObject(records) && !utils.isArray(records)\n\n if (singular) {\n records = [records]\n }\n records = Collection.prototype.add.call(this, records, opts)\n\n if (mapper.relationList.length && records.length) {\n // Check the currently visited record for relations that need to be\n // inserted into their respective collections.\n mapper.relationList.forEach(function (def) {\n def.addLinkedRecords(records)\n })\n }\n\n records.forEach((record) => this._addMeta(record, timestamp))\n\n return singular ? records[0] : records\n },\n\n remove (idOrRecord, opts) {\n const mapper = this.mapper\n const record = Collection.prototype.remove.call(this, idOrRecord, opts)\n if (record) {\n this._clearMeta(record)\n }\n\n if (mapper.relationList.length && record) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, [record])\n })\n }\n\n return record\n },\n\n removeAll (query, opts) {\n const mapper = this.mapper\n const records = Collection.prototype.removeAll.call(this, query, opts)\n records.forEach(this._clearMeta, this)\n\n if (mapper.relationList.length && records.length) {\n mapper.relationList.forEach(function (def) {\n def.removeLinkedRecords(mapper, records)\n })\n }\n\n return records\n }\n})\n\n/**\n * Create a subclass of this LinkedCollection:\n *\n * @example LinkedCollection.extend\n * const JSData = require('js-data');\n * const { LinkedCollection } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomLinkedCollectionClass extends LinkedCollection {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customLinkedCollection = new CustomLinkedCollectionClass();\n * console.log(customLinkedCollection.foo());\n * console.log(CustomLinkedCollectionClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherLinkedCollectionClass = LinkedCollection.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherLinkedCollection = new OtherLinkedCollectionClass();\n * console.log(otherLinkedCollection.foo());\n * console.log(OtherLinkedCollectionClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherLinkedCollectionClass () {\n * LinkedCollection.call(this);\n * this.created_at = new Date().getTime();\n * }\n * LinkedCollection.extend({\n * constructor: AnotherLinkedCollectionClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherLinkedCollection = new AnotherLinkedCollectionClass();\n * console.log(anotherLinkedCollection.created_at);\n * console.log(anotherLinkedCollection.foo());\n * console.log(AnotherLinkedCollectionClass.beep());\n *\n * @method LinkedCollection.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this LinkedCollection class.\n * @since 3.0.0\n */\n","import utils, { safeSetLink, safeSetProp } from './utils'\n\nimport {\n belongsToType,\n hasManyType,\n hasOneType\n} from './decorators'\nimport SimpleStore from './SimpleStore'\nimport LinkedCollection from './LinkedCollection'\n\nconst DATASTORE_DEFAULTS = {\n /**\n * Whether in-memory relations should be unlinked from records after they are\n * destroyed.\n *\n * @default true\n * @name DataStore#unlinkOnDestroy\n * @since 3.0.0\n * @type {boolean}\n */\n unlinkOnDestroy: true\n}\n\n/**\n * The `DataStore` class is an extension of {@link SimpleStore}. Not only does\n * `DataStore` manage mappers and store data in collections, it uses the\n * {@link LinkedCollection} class to link related records together in memory.\n *\n * ```javascript\n * import { DataStore } from 'js-data';\n * ```\n *\n * @example\n * import { DataStore } from 'js-data';\n * import HttpAdapter from 'js-data-http';\n * const store = new DataStore();\n *\n * // DataStore#defineMapper returns a direct reference to the newly created\n * // Mapper.\n * const UserMapper = store.defineMapper('user');\n *\n * // DataStore#as returns the store scoped to a particular Mapper.\n * const UserStore = store.as('user');\n *\n * // Call \"find\" on \"UserMapper\" (Stateless ORM)\n * UserMapper.find(1).then((user) => {\n * // retrieved a \"user\" record via the http adapter, but that's it\n *\n * // Call \"find\" on \"store\" targeting \"user\" (Stateful DataStore)\n * return store.find('user', 1); // same as \"UserStore.find(1)\"\n * }).then((user) => {\n * // not only was a \"user\" record retrieved, but it was added to the\n * // store's \"user\" collection\n * const cachedUser = store.getCollection('user').get(1);\n * console.log(user === cachedUser); // true\n * });\n *\n * @class DataStore\n * @extends SimpleStore\n * @param {object} [opts] Configuration options. See {@link SimpleStore}.\n * @param {boolean} [opts.collectionClass={@link LinkedCollection}] See {@link DataStore#collectionClass}.\n * @param {boolean} [opts.debug=false] See {@link Component#debug}.\n * @param {boolean} [opts.unlinkOnDestroy=true] See {@link DataStore#unlinkOnDestroy}.\n * @param {boolean|Function} [opts.usePendingFind=true] See {@link DataStore#usePendingFind}.\n * @param {boolean|Function} [opts.usePendingFindAll=true] See {@link DataStore#usePendingFindAll}.\n * @returns {DataStore}\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/working-with-the-datastore\",\"Working with the DataStore\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/jsdata-and-the-browser\",\"Notes on using JSData in the Browser\"]\n */\nfunction DataStore (opts) {\n utils.classCallCheck(this, DataStore)\n\n opts || (opts = {})\n // Fill in any missing options with the defaults\n utils.fillIn(opts, DATASTORE_DEFAULTS)\n opts.collectionClass || (opts.collectionClass = LinkedCollection)\n SimpleStore.call(this, opts)\n}\n\nconst props = {\n constructor: DataStore,\n\n defineMapper (name, opts) {\n // Complexity of this method is beyond simply using => functions to bind context\n const self = this\n const mapper = SimpleStore.prototype.defineMapper.call(self, name, opts)\n const idAttribute = mapper.idAttribute\n const collection = this.getCollection(name)\n\n mapper.relationList.forEach(function (def) {\n const relation = def.relation\n const localField = def.localField\n const path = `links.${localField}`\n const foreignKey = def.foreignKey\n const type = def.type\n const updateOpts = { index: foreignKey }\n let descriptor\n\n const getter = function () { return this._get(path) }\n\n if (type === belongsToType) {\n if (!collection.indexes[foreignKey]) {\n collection.createIndex(foreignKey)\n }\n\n descriptor = {\n get: getter,\n // e.g. profile.user = someUser\n // or comment.post = somePost\n set (record) {\n // e.g. const otherUser = profile.user\n const currentParent = this._get(path)\n // e.g. profile.user === someUser\n if (record === currentParent) {\n return currentParent\n }\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n\n // e.g. profile.user !== someUser\n // or comment.post !== somePost\n if (currentParent && inverseDef) {\n this.removeInverseRelation(currentParent, id, inverseDef, idAttribute)\n }\n if (record) {\n // e.g. profile.user = someUser\n const relatedIdAttribute = def.getRelation().idAttribute\n const relatedId = utils.get(record, relatedIdAttribute)\n\n // Prefer store record\n if (relatedId !== undefined && this._get('$')) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n // e.g. profile.user = someUser\n // or comment.post = somePost\n safeSetLink(this, localField, record)\n safeSetProp(this, foreignKey, relatedId)\n collection.updateIndex(this, updateOpts)\n\n if (inverseDef) {\n this.setupInverseRelation(record, id, inverseDef, idAttribute)\n }\n } else {\n // Unset in-memory link only\n // e.g. profile.user = undefined\n // or comment.post = undefined\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n\n let foreignKeyDescriptor = Object.getOwnPropertyDescriptor(mapper.recordClass.prototype, foreignKey)\n if (!foreignKeyDescriptor) {\n foreignKeyDescriptor = {\n enumerable: true\n }\n }\n const originalGet = foreignKeyDescriptor.get\n foreignKeyDescriptor.get = function () {\n if (originalGet) {\n return originalGet.call(this)\n }\n return this._get(`props.${foreignKey}`)\n }\n const originalSet = foreignKeyDescriptor.set\n foreignKeyDescriptor.set = function (value) {\n if (originalSet) {\n originalSet.call(this, value)\n }\n const currentParent = utils.get(this, localField)\n const id = utils.get(this, idAttribute)\n const inverseDef = def.getInverse(mapper)\n const currentParentId = currentParent ? utils.get(currentParent, def.getRelation().idAttribute) : undefined\n\n if (currentParent && currentParentId !== undefined && currentParentId !== value) {\n if (inverseDef.type === hasOneType) {\n safeSetLink(currentParent, inverseDef.localField, undefined)\n } else if (inverseDef.type === hasManyType) {\n const children = utils.get(currentParent, inverseDef.localField)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n }\n }\n\n safeSetProp(this, foreignKey, value)\n collection.updateIndex(this, updateOpts)\n\n if ((value === undefined || value === null)) {\n if (currentParentId !== undefined) {\n // Unset locals\n utils.set(this, localField, undefined)\n }\n } else if (this._get('$')) {\n const storeRecord = self.get(relation, value)\n if (storeRecord) {\n utils.set(this, localField, storeRecord)\n }\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, foreignKey, foreignKeyDescriptor)\n } else if (type === hasManyType) {\n const localKeys = def.localKeys\n const foreignKeys = def.foreignKeys\n\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n\n descriptor = {\n get () {\n let current = getter.call(this)\n if (!current) {\n this._set(path, [])\n }\n return getter.call(this)\n },\n // e.g. post.comments = someComments\n // or user.groups = someGroups\n // or group.users = someUsers\n set (records) {\n if (records && !utils.isArray(records)) {\n records = [records]\n }\n const id = utils.get(this, idAttribute)\n const relatedIdAttribute = def.getRelation().idAttribute\n const inverseDef = def.getInverse(mapper)\n const inverseLocalField = inverseDef.localField\n const current = this._get(path) || []\n const toLink = []\n const toLinkIds = {}\n\n if (records) {\n records.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n const currentParent = utils.get(record, inverseLocalField)\n if (currentParent && currentParent !== this) {\n const currentChildrenOfParent = utils.get(currentParent, localField)\n // e.g. somePost.comments.remove(comment)\n if (relatedId === undefined) {\n utils.remove(currentChildrenOfParent, (child) => child === record)\n } else {\n utils.remove(currentChildrenOfParent, (child) => child === record || relatedId === utils.get(child, relatedIdAttribute))\n }\n }\n if (relatedId !== undefined) {\n if (this._get('$')) {\n // Prefer store record\n record = self.get(relation, relatedId) || record\n }\n // e.g. toLinkIds[comment.id] = comment\n toLinkIds[relatedId] = record\n }\n toLink.push(record)\n })\n }\n\n // e.g. post.comments = someComments\n if (foreignKey) {\n current.forEach((record) => {\n // e.g. comment.id\n const relatedId = utils.get(record, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(record) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update (unset) inverse relation\n if (records) {\n // e.g. comment.post_id = undefined\n safeSetProp(record, foreignKey, undefined)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n }\n // e.g. comment.post = undefined\n safeSetLink(record, inverseLocalField, undefined)\n }\n })\n toLink.forEach((record) => {\n // Update (set) inverse relation\n // e.g. comment.post_id = post.id\n safeSetProp(record, foreignKey, id)\n // e.g. CommentCollection.updateIndex(comment, { index: 'post_id' })\n self.getCollection(relation).updateIndex(record, updateOpts)\n // e.g. comment.post = post\n safeSetLink(record, inverseLocalField, this)\n })\n } else if (localKeys) {\n // Update locals\n // e.g. group.users = someUsers\n // Update (set) inverse relation\n const ids = toLink.map((child) => utils.get(child, relatedIdAttribute)).filter((id) => id !== undefined)\n // e.g. group.user_ids = [1,2,3,...]\n utils.set(this, localKeys, ids)\n // Update (unset) inverse relation\n if (inverseDef.foreignKeys) {\n current.forEach((child) => {\n const relatedId = utils.get(child, relatedIdAttribute)\n if ((relatedId === undefined && toLink.indexOf(child) === -1) || (relatedId !== undefined && !(relatedId in toLinkIds))) {\n // Update inverse relation\n // safeSetLink(child, inverseLocalField, undefined)\n const parents = utils.get(child, inverseLocalField) || []\n // e.g. someUser.groups.remove(group)\n if (id === undefined) {\n utils.remove(parents, (parent) => parent === this)\n } else {\n utils.remove(parents, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n }\n })\n toLink.forEach((child) => {\n // Update (set) inverse relation\n const parents = utils.get(child, inverseLocalField)\n // e.g. someUser.groups.push(group)\n if (id === undefined) {\n utils.noDupeAdd(parents, this, (parent) => parent === this)\n } else {\n utils.noDupeAdd(parents, this, (parent) => parent === this || id === utils.get(parent, idAttribute))\n }\n })\n }\n } else if (foreignKeys) {\n // e.g. user.groups = someGroups\n // Update (unset) inverse relation\n current.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n // e.g. someGroup.user_ids.remove(user.id)\n utils.remove(ids, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n // e.g. someGroup.users.remove(user)\n if (id === undefined) {\n utils.remove(children, (child) => child === this)\n } else {\n utils.remove(children, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n // Update (set) inverse relation\n toLink.forEach((parent) => {\n const ids = utils.get(parent, foreignKeys) || []\n utils.noDupeAdd(ids, id, (_key) => id === _key)\n const children = utils.get(parent, inverseLocalField)\n if (id === undefined) {\n utils.noDupeAdd(children, this, (child) => child === this)\n } else {\n utils.noDupeAdd(children, this, (child) => child === this || id === utils.get(child, idAttribute))\n }\n })\n }\n\n this._set(path, toLink)\n return toLink\n }\n }\n } else if (type === hasOneType) {\n // TODO: Handle case when belongsTo relation isn't ever defined\n if (self._collections[relation] && foreignKey && !self.getCollection(relation).indexes[foreignKey]) {\n self.getCollection(relation).createIndex(foreignKey)\n }\n descriptor = {\n get: getter,\n // e.g. user.profile = someProfile\n set (record) {\n const current = this._get(path)\n if (record === current) {\n return current\n }\n const inverseLocalField = def.getInverse(mapper).localField\n // Update (unset) inverse relation\n if (current) {\n safeSetProp(current, foreignKey, undefined)\n self.getCollection(relation).updateIndex(current, updateOpts)\n safeSetLink(current, inverseLocalField, undefined)\n }\n if (record) {\n const relatedId = utils.get(record, def.getRelation().idAttribute)\n // Prefer store record\n if (relatedId !== undefined) {\n record = self.get(relation, relatedId) || record\n }\n\n // Set locals\n safeSetLink(this, localField, record)\n\n // Update (set) inverse relation\n safeSetProp(record, foreignKey, utils.get(this, idAttribute))\n self.getCollection(relation).updateIndex(record, updateOpts)\n safeSetLink(record, inverseLocalField, this)\n } else {\n // Unset locals\n safeSetLink(this, localField, undefined)\n }\n return record\n }\n }\n }\n\n if (descriptor) {\n descriptor.enumerable = def.enumerable === undefined ? false : def.enumerable\n if (def.get) {\n let origGet = descriptor.get\n descriptor.get = function () {\n return def.get(def, this, (...args) => origGet.apply(this, args))\n }\n }\n if (def.set) {\n let origSet = descriptor.set\n descriptor.set = function (related) {\n return def.set(def, this, related, (value) => origSet.call(this, value === undefined ? related : value))\n }\n }\n Object.defineProperty(mapper.recordClass.prototype, localField, descriptor)\n }\n })\n\n return mapper\n },\n\n destroy (name, id, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroy.call(this, name, id, opts).then((result) => {\n let record\n if (opts.raw) {\n record = result.data\n } else {\n record = result\n }\n\n if (record && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n utils.set(record, def.localField, undefined)\n })\n }\n return result\n })\n },\n\n destroyAll (name, query, opts) {\n opts || (opts = {})\n return SimpleStore.prototype.destroyAll.call(this, name, query, opts).then((result) => {\n let records\n if (opts.raw) {\n records = result.data\n } else {\n records = result\n }\n\n if (records && records.length && this.unlinkOnDestroy) {\n const _opts = utils.plainCopy(opts)\n _opts.withAll = true\n utils.forEachRelation(this.getMapper(name), _opts, (def) => {\n records.forEach((record) => {\n utils.set(record, def.localField, undefined)\n })\n })\n }\n return result\n })\n }\n}\n\nexport default SimpleStore.extend(props)\n\n/**\n * Create a subclass of this DataStore:\n * @example DataStore.extend\n * const JSData = require('js-data');\n * const { DataStore } = JSData;\n * console.log('Using JSData v' + JSData.version.full);\n *\n * // Extend the class using ES2015 class syntax.\n * class CustomDataStoreClass extends DataStore {\n * foo () { return 'bar'; }\n * static beep () { return 'boop'; }\n * }\n * const customDataStore = new CustomDataStoreClass();\n * console.log(customDataStore.foo());\n * console.log(CustomDataStoreClass.beep());\n *\n * // Extend the class using alternate method.\n * const OtherDataStoreClass = DataStore.extend({\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const otherDataStore = new OtherDataStoreClass();\n * console.log(otherDataStore.foo());\n * console.log(OtherDataStoreClass.beep());\n *\n * // Extend the class, providing a custom constructor.\n * function AnotherDataStoreClass () {\n * DataStore.call(this);\n * this.created_at = new Date().getTime();\n * }\n * DataStore.extend({\n * constructor: AnotherDataStoreClass,\n * foo () { return 'bar'; }\n * }, {\n * beep () { return 'boop'; }\n * });\n * const anotherDataStore = new AnotherDataStoreClass();\n * console.log(anotherDataStore.created_at);\n * console.log(anotherDataStore.foo());\n * console.log(AnotherDataStoreClass.beep());\n *\n * @method DataStore.extend\n * @param {object} [props={}] Properties to add to the prototype of the\n * subclass.\n * @param {object} [props.constructor] Provide a custom constructor function\n * to be used as the subclass itself.\n * @param {object} [classProps={}] Static properties to add to the subclass.\n * @returns {Constructor} Subclass of this DataStore class.\n * @since 3.0.0\n */\n","/**\n * Registered as `js-data` in NPM and Bower.\n *\n * Also available from CDN.JS and JSDelivr.\n *\n * @module js-data\n *\n * @example Install from NPM\n * npm i --save js-data@beta\n * @example Install from Bower\n * bower i --save js-data@3.0.0-beta.1\n * @example Install from CDN.JS\n * \n * @example Install from JSDelivr\n * \n * @example Load into your app via script tag\n * \n * \n * @example Load into your app via CommonJS\n * var JSData = require('js-data');\n * @example Load into your app via ES2015 Modules\n * import * as JSData from 'js-data';\n * @example Load into your app via AMD\n * define('myApp', ['js-data'], function (JSData) { ... });\n */\n\n/**\n * JSData's utility methods.\n *\n * @example\n * import { utils } from 'js-data';\n * console.log(utils.isString('foo')); // true\n *\n * @name module:js-data.utils\n * @property {Function} Promise See {@link utils.Promise}.\n * @see utils\n * @since 3.0.0\n * @type {Object}\n */\nimport utils from './utils'\n\n/**\n * JSData's {@link Collection} class.\n *\n * @example\n * import { Collection } from 'js-data';\n * const collection = new Collection();\n *\n * @name module:js-data.Collection\n * @see Collection\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#collection\",\"Components of JSData: Collection\"]\n * @type {Constructor}\n */\nimport Collection from './Collection'\n\n/**\n * JSData's {@link Component} class. Most components in JSData extend this\n * class.\n *\n * @example\n * import { Component } from 'js-data';\n * // Make a custom component.\n * const MyComponent = Component.extend({\n * myMethod (someArg) { ... }\n * });\n *\n * @name module:js-data.Component\n * @see Component\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Component from './Component'\n\n/**\n * JSData's {@link Container} class. Defines and manages {@link Mapper}s. Used\n * in Node.js and in the browser, though in the browser you may want to use\n * {@link DataStore} instead.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n *\n * @name module:js-data.Container\n * @see Container\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#container\",\"Components of JSData: Container\"]\n * @type {Constructor}\n */\nimport {Container} from './Container'\n\n/**\n * JSData's {@link DataStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import { DataStore } from 'js-data';\n * const store = new DataStore();\n *\n * @name module:js-data.DataStore\n * @see DataStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore\",\"Components of JSData: DataStore\"]\n * @type {Constructor}\n */\nimport DataStore from './DataStore'\n\n/**\n * JSData's {@link Index} class, based on [mindex]{@link https://github.com/internalfx/mindex}.\n *\n * @name module:js-data.Index\n * @see Index\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Index from '../lib/mindex/index'\n\n/**\n * JSData's {@link LinkedCollection} class. Used by the {@link DataStore}\n * component. If you need to create a collection manually, you should probably\n * use the {@link Collection} class.\n *\n * @name module:js-data.LinkedCollection\n * @see DataStore\n * @see LinkedCollection\n * @since 3.0.0\n * @type {Constructor}\n */\nimport LinkedCollection from './LinkedCollection'\n\n/**\n * JSData's {@link Mapper} class. The core of the ORM.\n *\n * @example Recommended use\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n *\n * @example Create Mapper manually\n * import { Mapper } from 'js-data';\n * const UserMapper = new Mapper({ name: 'user' });\n *\n * @name module:js-data.Mapper\n * @see Container\n * @see Mapper\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/modeling-your-data\",\"Modeling your data\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper\",\"Components of JSData: Mapper\"]\n * @type {Constructor}\n */\nimport Mapper from './Mapper'\n\n/**\n * JSData's {@link Query} class. Used by the {@link Collection} component.\n *\n * @name module:js-data.Query\n * @see Query\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Query from './Query'\n\n/**\n * JSData's {@link Record} class.\n *\n * @example\n * import { Container } from 'js-data';\n * const store = new Container();\n * store.defineMapper('user');\n * const user = store.createRecord('user');\n *\n * @name module:js-data.Record\n * @see Record\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#record\",\"Components of JSData: Record\"]\n * @type {Constructor}\n */\nimport Record from './Record'\n\n/**\n * JSData's {@link Schema} class. Implements http://json-schema.org/draft-04.\n *\n * @example\n * import { Container, Schema } from 'js-data';\n * const userSchema = new Schema({\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * });\n * const store = new Container();\n * store.defineMapper('user', {\n * schema: userSchema\n * });\n *\n * @name module:js-data.Schema\n * @see Schema\n * @see http://json-schema.org/\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#schema\",\"Components of JSData: schema\"]\n * @tutorial [\"http://www.js-data.io/v3.0/docs/schemas\",\"JSData's Schema Syntax\"]\n * @type {Constructor}\n */\nimport Schema from './Schema'\n\n/**\n * JSData's {@link Settable} class.\n *\n * @example\n * import { Settable } from 'js-data';\n * const obj = new Settable();\n * obj.set('secret', 'value');\n * console.log(JSON.stringify(obj)); // {}\n *\n * @name module:js-data.Settable\n * @see Settable\n * @since 3.0.0\n * @type {Constructor}\n */\nimport Settable from './Settable'\n\n/**\n * JSData's {@link SimpleStore} class. Primarily for use in the browser. In\n * Node.js you probably want to use {@link Container} instead.\n *\n * @example\n * import { SimpleStore } from 'js-data';\n * const store = new SimpleStore();\n *\n * @name module:js-data.SimpleStore\n * @see SimpleStore\n * @since 3.0.0\n * @tutorial [\"http://www.js-data.io/v3.0/docs/components-of-jsdata#SimpleStore\",\"Components of JSData: SimpleStore\"]\n * @type {Constructor}\n */\nimport SimpleStore from './SimpleStore'\n\n/**\n * Describes the version of this `JSData` object.\n *\n * @example\n * console.log(JSData.version.full); // \"3.0.0-beta.1\"\n *\n * @name version\n * @memberof module:js-data\n * @property {string} full The full semver value.\n * @property {number} major The major version number.\n * @property {number} minor The minor version number.\n * @property {number} patch The patch version number.\n * @property {(string|boolean)} alpha The alpha version value, otherwise `false`\n * if the current version is not alpha.\n * @property {(string|boolean)} beta The beta version value, otherwise `false`\n * if the current version is not beta.\n * @since 2.0.0\n * @type {Object}\n */\nexport const version = '<%= version %>'\n\nexport * from './decorators'\n\nexport {\n Collection,\n Component,\n Container,\n DataStore,\n Index,\n LinkedCollection,\n Mapper,\n Query,\n Record,\n Schema,\n Settable,\n SimpleStore,\n utils\n}\n"],"names":["DOMAIN","INFINITY","MAX_INTEGER","BOOL_TAG","DATE_TAG","FUNC_TAG","NUMBER_TAG","OBJECT_TAG","REGEXP_TAG","STRING_TAG","objToString","Object","prototype","toString","PATH","ERRORS","arguments","toInteger","value","sign","remainder","toStr","call","isPlainObject","constructor","mkdirP","object","path","parts","split","forEach","key","utils","Promise","dest","src","forOwn","undefined","isFunction","indexOf","opts","def","fn","thisArg","relationName","relation","containedName","index","with","_getIndex","localField","withAll","optsCopy","fillIn","getRelation","slice","_activeWith","splice","i","length","substr","list","_relation","isObject","target","props","map","keys","propName","descriptor","getOwnPropertyDescriptor","enumerable","defineProperties","newObject","oldObject","diff","diffObjects","diffCount","added","removed","changed","instance","ctor","err","name","from","to","stackFrom","stackTo","blacklist","plain","isArray","copy","isDate","Date","getTime","isRegExp","RegExp","source","match","lastIndex","create","getPrototypeOf","push","result","hasOwnProperty","isBlacklisted","existing","deepFillIn","deepMixIn","equalsFn","ignore","deepEqual","newKeys","filter","oldKeys","oldValue","newValue","a","b","domain","code","prefix","message","apply","Array","Error","getter","setter","_events","events","args","type","shift","listeners","f","c","all","unshift","func","classProps","superClass","subClass","classCallCheck","obj","setPrototypeOf","strictEs6Class","__proto__","defineProperty","addHiddenPropsToTarget","array","record","mapper","relationList","_forRelation","len","json","isString","JSON","parse","prop","last","pop","isCtor","__super__","array1","array2","item","matches","test","isNumber","log","level","debug","toUpperCase","console","findIndex","_props","reduce","reject","resolve","_path","set","exec","_equal","stringify","safeSetProp","field","_set","safeSetLink","Settable","get","unset","extend","Component","writable","logify","eventify","_listeners","INDEX_ERR","reserved","escapeRegExp","percentRegExp","underscoreRegExp","escape","pattern","replace","Query","collection","data","where","fields","ops","predicates","clause","expr","op","groups","_where","prev","parser","_applyWhereFromArray","_applyWhereFromObject","group","isOr","keep","first","charAt","evaluate","_testArrayGroup","_testObjectGroup","leftKeys","rightKeys","getIndex","between","orderBy","cA","cB","temp","compare","predicate","like","query","getData","sort","skip","offset","limit","forEachFn","keyList","concat","getAll","flags","num","Math","min","mapFn","funcName","intersection","belongsToType","hasManyType","hasOneType","Relation","relatedMapper","options","TYPE_NAME","validateOptions","canAutoAddLinks","add","relatedCollection","datastore","getCollection","related","DOMAIN_ERR","foreignKey","localKey","relationFields","idAttribute","relatedRecord","_setForeignKey","relatedRecords","relatedData","inverse","findInverseRelation","isInversedTo","records","getLocalField","linkRecord","isEmptyLinks","canFindLinkFor","findExistingLinksFor","setLocalField","relatedId","unsaved","setForeignKey","id","relationData","is","createRecord","createLinked","then","BelongsToRelation","HasManyRelation","localKeys","foreignKeys","hasForeignKeys","recordId","ids","findExistingLinksByForeignKey","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","HasOneRelation","RelationType","belongsTo","assignTo","hasMany","hasOne","superMethod","store","bind","creatingPath","noValidatePath","keepChangeHistoryPath","previousPath","Record","noValidate","keepChangeHistory","validateOnSet","toJSON","plainCopy","_get","_mapper","quickHasChanges","areDifferent","validate","currentParent","inverseDef","children","remove","child","noDupeAdd","relations","_","adapter","getAdapterName","dbg","tasks","task","forEachRelation","raw","load","isSorN","previous","preserve","commit","postProcess","changesOnly","changes","silent","hashCode","insertAt","removeAt","binarySearch","lo","hi","compared","mid","Index","fieldList","fieldGetter","isIndex","values","pos","found","dataLocation","newIndex","results","order","cb","visitAll","_between","leftKey","rightKey","leftInclusive","rightInclusive","currKey","peek","isUnique","removeRecord","j","insertRecord","COLLECTION_DEFAULTS","Collection","queryClass","emitRecordEvents","emit","beforeAdd","singular","onConflict","existingNoValidate","commitOnMerge","updateIndexes","indexes","on","_onRecordEvent","afterAdd","run","instances","removeAll","Ctor","initialValue","idOrRecord","beforeRemove","off","afterRemove","queryOrRecords","beforeRemoveAll","afterRemoveAll","mapCall","updateRecord","types","isBoolean","isInteger","isNull","segmentToString","segment","str","makePath","segments","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","schema","max","minLengthCommon","validationKeywords","allErrors","allOf","_schema","validated","anyOf","possibleValues","join","items","checkingTuple","maximum","exclusiveMaximum","maxProperties","minimum","exclusiveMinimum","minProperties","multipleOf","not","oneOf","additionalProperties","properties","patternProperties","toValidate","omit","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","changingPath","changedPath","changeHistoryPath","eventIdPath","silentPath","validationFailureMsg","numeric","Schema","definition","_definition","extends","validationKeyword","unsetter","track","makeDescriptor","hasSet","orig","applyDefaults","keyPath","originalGet","_unset","error","current","changing","setTimeout","changeRecord","timestamp","changeHistory","originalSet","pick","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","LIFECYCLE_METHODS","MAPPER_DEFAULTS","Mapper","recordClass","methods","isPrototypeOf","applySchema","_data","wrap","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","_commitChanges","_end","recordOrRecords","newValues","isRequiresParentId","createParentRecord","context","originalProps","isRequiresChildId","createChildRecord","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","ensureLinkedDataHasProperType","RecordCtor","method","config","lifecycleMethods","upper","before","after","defaults","_value","beforeAssign","adapterArgs","getAdapter","_result","getAdapters","defaultAdapter","_adapters","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","conversionOptions","pass","_opts","_record","some","_name","getMapperByName","getMapper","proxiedMapperMethods","Container","mapperDefaults","mapperClass","original","_mappers","_onMapperEvent","defineRelations","warn","defineMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","_completedQueries","SIMPLESTORE_DEFAULTS","SimpleStore","collectionClass","_collections","_pendingQueries","addToCache","hash","fromJson","self","collectionOpts","indexed","createIndex","_added","_onCollectionEvent","destroy","destroyAll","hashQuery","pendingQuery","usePendingFind","cachedFind","force","promise","find","cacheFind","usePendingFindAll","cachedFindAll","findAll","cacheFindAll","toJson","removeRelated","getForeignKey","update","updateAll","updateMany","LinkedCollection","event","addLinkedRecords","_addMeta","_clearMeta","removeLinkedRecords","DATASTORE_DEFAULTS","DataStore","updateOpts","getInverse","removeInverseRelation","relatedIdAttribute","updateIndex","setupInverseRelation","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","_key","origGet","origSet","unlinkOnDestroy","version"],"mappings":"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"} \ No newline at end of file diff --git a/dist/js-data.min.js b/dist/js-data.min.js index fed65c3c..f90ca653 100644 --- a/dist/js-data.min.js +++ b/dist/js-data.min.js @@ -1,11 +1,11 @@ /*! * js-data -* @version 3.0.1 - Homepage +* @version 3.0.2 - Homepage * @author js-data project authors * @copyright (c) 2014-2016 js-data project authors * @license MIT * * @overview js-data is a framework-agnostic, datastore-agnostic ORM/ODM for Node.js and the Browser. */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define("js-data",["exports"],t):t(e.JSData=e.JSData||{})}(this,function(e){"use strict";function Settable(){var e={};Object.defineProperties(this,{_get:{value:function value(t){return d.get(e,t)}},_set:{value:function value(t,n){return d.set(e,t,n)}},_unset:{value:function value(t){return d.unset(e,t)}}})}function Component(e){Settable.call(this),e||(e={}),this.debug=!!e.hasOwnProperty("debug")&&!!e.debug,Object.defineProperty(this,"_listeners",{value:{},writable:!0})}function Query(e){d.classCallCheck(this,Query),this.collection=e,this.data=null}function Relation(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};d.classCallCheck(this,Relation),n.type=this.constructor.TYPE_NAME,this.validateOptions(e,n),"object"===(void 0===e?"undefined":t(e))&&Object.defineProperty(this,"relatedMapper",{value:e}),Object.defineProperty(this,"inverse",{writable:!0}),d.fillIn(this,n)}function Record(e,t){d.classCallCheck(this,Record),Settable.call(this),e||(e={}),t||(t={});var n=this._set,i=this.constructor.mapper;n(k,!0),n(I,!!t.noValidate),n(F,void 0===t.keepChangeHistory?!i||i.keepChangeHistory:t.keepChangeHistory);var r=i?d.get(e,i.idAttribute):void 0;void 0!==r&&d.set(this,i.idAttribute,r),d.fillIn(this,e),n(k,!1),void 0!==t.validateOnSet?n(I,!t.validateOnSet):i&&void 0!==i.validateOnSet?n(I,!i.validateOnSet):n(I,!1),n(E,i?i.toJSON(e):d.plainCopy(e))}function sort(e,t,n){return e===t?0:(n&&(e=n(e),t=n(t)),null===e&&null===t||void 0===e&&void 0===t?-1:null===e||void 0===e?-1:null===t||void 0===t?1:et?1:0)}function insertAt(e,t,n){return e.splice(t,0,n),e}function removeAt(e,t){return e.splice(t,1),e}function binarySearch(e,t,n){for(var i=0,r=e.length,o=void 0,a=void 0;i=0?o=r:(a=d._getIndex(e.with,t.localField))>=0&&(o=t.localField),e.withAll)n.call(i,t,{});else if(o){var s={};d.fillIn(s,t.getRelation()),d.fillIn(s,e),s.with=e.with.slice(),s._activeWith=s.with.splice(a,1)[0],s.with.forEach(function(e,t){e&&0===e.indexOf(o)&&e.length>=o.length&&"."===e[o.length]?s.with[t]=e.substr(o.length+1):s.with[t]=""}),n.call(i,t,s)}},_getIndex:function _getIndex(e,t){var n=-1;return e.forEach(function(e,i){return e===t?(n=i,!1):d.isObject(e)&&e.relation===t?(n=i,!1):void 0}),n},addHiddenPropsToTarget:function addHiddenPropsToTarget(e,t){var n={};Object.keys(t).forEach(function(e){var i=Object.getOwnPropertyDescriptor(t,e);i.enumerable=!1,n[e]=i}),Object.defineProperties(e,n)},areDifferent:function areDifferent(e,t,n){n||(n={});var i=d.diffObjects(e,t,n);return Object.keys(i.added).length+Object.keys(i.removed).length+Object.keys(i.changed).length>0},classCallCheck:function classCallCheck$$1(e,t){if(!(e instanceof t))throw d.err(""+t.name)(500,"Cannot call a class as a function")},copy:function copy(e,t,n,i,r,o){if(t){if(e===t)throw d.err("utils.copy")(500,"Cannot copy! Source and destination are identical.");if(n=n||[],i=i||[],d.isObject(e)){var a=n.indexOf(e);if(-1!==a)return i[a];n.push(e),i.push(t)}var s=void 0;if(d.isArray(e)){var c=void 0;for(t.length=0,c=0;c1?t-1:0),i=1;i=0&&e.splice(n,1)}},resolve:function resolve(e){return d.Promise.resolve(e)},set:function set$$1(e,t,n){if(d.isObject(t))d.forOwn(t,function(t,n){d.set(e,n,t)});else{var i=o.exec(t);i?u(e,i[1])[i[2]]=n:e[t]=n}},deepEqual:function deepEqual(e,t){if(e===t)return!0;var n=!0;if(d.isArray(e)&&d.isArray(t)){if(e.length!==t.length)return!1;for(var i=e.length;i--;)if(!d.deepEqual(e[i],t[i]))return!1}else{if(!d.isObject(e)||!d.isObject(t))return!1;d.forOwn(e,function(e,i){if(!(n=d.deepEqual(e,t[i])))return!1}),n&&d.forOwn(t,function(t,i){if(!(n=d.deepEqual(t,e[i])))return!1})}return n},toJson:JSON.stringify,unset:function unset(e,t){for(var n=t.split("."),i=n.pop();t=n.shift();)if(null==(e=e[t]))return;e[i]=void 0}},f=function safeSetProp(e,t,n){e&&e._set?e._set("props."+t,n):d.set(e,t,n)},h=function safeSetLink(e,t,n){e&&e._set?e._set("links."+t,n):d.set(e,t,n)};Settable.extend=d.extend;var p=Settable.extend({constructor:Component});Component.extend=d.extend,d.logify(Component.prototype),d.eventify(Component.prototype,function(){return this._listeners},function(e){this._listeners=e});var v="Index inaccessible after first operation",g={limit:"",offset:"",orderBy:"",skip:"",sort:"",where:""},y=/([.*+?^=!:${}()|[\]/\\])/g,m=/%/g,A=/_/g,b=function escape(e){return e.replace(y,"\\$1")},O=p.extend({constructor:Query,_applyWhereFromObject:function _applyWhereFromObject(e){var t=[],n=[],i=[];return d.forOwn(e,function(e,r){d.isObject(e)||(e={"==":e}),d.forOwn(e,function(e,o){t.push(r),n.push(o),i.push(e)})}),{fields:t,ops:n,predicates:i}},_applyWhereFromArray:function _applyWhereFromArray(e){var t=this,n=[];return e.forEach(function(i,r){if(!d.isString(i)){var o=e[r-1],a=(d.isArray(i)?t._applyWhereFromArray:t._applyWhereFromObject).call(t,i);"or"===o&&(a.isOr=!0),n.push(a)}}),n.isArray=!0,n},_testObjectGroup:function _testObjectGroup(e,t,n,i){var r=void 0,o=n.fields,a=n.ops,s=n.predicates,c=a.length;for(r=0;ra?1:t1?t-1:0),i=1;i":function _(e,t){return e>t},">=":function _(e,t){return e>=t},"<":function _(e,t){return e")(400,"string",r)},canFindLinkFor:function canFindLinkFor(e){return!!(this.foreignKey||this.foreignKeys||this.localKeys&&d.get(e,this.localKeys))},linkRecord:function linkRecord(e,t){var n=this,i=this.relatedCollection,r=this.canAutoAddLinks,o=this.foreignKey,a=this.relatedCollection.unsaved();return t.map(function(t){var s=i.recordId(t);return(void 0===s&&-1===a.indexOf(t)||t!==i.get(s))&&(o&&n.setForeignKey(e,t),r&&(t=i.add(t))),t})},findExistingLinksFor:function findExistingLinksFor(e){var t=d.get(e,this.mapper.idAttribute),n=this.localKeys?d.get(e,this.localKeys):null,i=void 0;if(void 0!==t&&this.foreignKey?i=this.findExistingLinksByForeignKey(t):this.localKeys&&n?i=this.findExistingLinksByLocalKeys(n):void 0!==t&&this.foreignKeys&&(i=this.findExistingLinksByForeignKeys(t)),i&&i.length)return i},findExistingLinksByLocalKeys:function findExistingLinksByLocalKeys(e){return this.relatedCollection.filter({where:n({},this.mapper.idAttribute,{in:e})})},findExistingLinksByForeignKeys:function findExistingLinksByForeignKeys(e){return this.relatedCollection.filter({where:n({},this.foreignKeys,{contains:e})})},isRequiresParentId:function isRequiresParentId(){return!!this.localKeys&&this.localKeys.length>0},isRequiresChildId:function isRequiresChildId(){return!!this.foreignKey},createParentRecord:function createParentRecord(e,t){var n=this,i=this.getLocalField(e),r=this.getRelation().idAttribute;return this.createLinked(i,t).then(function(t){d.set(e,n.localKeys,t.map(function(e){return d.get(e,r)}))})},createLinked:function createLinked(e,t){return this.getRelation().createMany(e,t)}},{TYPE_NAME:"hasMany"}),Relation.extend({findExistingLinksFor:function findExistingLinksFor(e,t){var n=d.get(t,e.idAttribute),i=this.findExistingLinksByForeignKey(n);if(i&&i.length)return i[0]},isRequiresChildId:function isRequiresChildId(){return!0}},{TYPE_NAME:"hasOne"})].forEach(function(e){Relation[e.TYPE_NAME]=function(t,n){return new e(t,n)}});var x=function belongsTo(e,t){return function(n){Relation.belongsTo(e,t).assignTo(n)}},C=function hasMany(e,t){return function(n){Relation.hasMany(e,t).assignTo(n)}},w=function hasOne(e,t){return function(n){Relation.hasOne(e,t).assignTo(n)}},R=function superMethod(e,t){var n=e.datastore;return n&&n[t]?function(){for(var i=arguments.length,r=Array(i),o=0;o=0;i--){var r=n[i];t=r.isIndex?t.concat(r.getAll(e)):t.concat(r)}else for(var o=0;oo)break}else if(this.keys[s]>=o)break;if(i=this.values[s].isIndex?i.concat(this.values[s].getAll()):i.concat(this.values[s]),n.limit&&i.length>=n.limit+n.offset)break}}else for(var c=a.index;co)break;if(i=this.values[c].isIndex?l===r?i.concat(this.values[c]._between(d.copy(e),t.map(function(){}),n)):l===o?i.concat(this.values[c]._between(e.map(function(){}),d.copy(t),n)):i.concat(this.values[c].getAll()):i.concat(this.values[c]),n.limit&&i.length>=n.limit+n.offset)break}return n.limit?i.slice(0,n.limit+n.offset):i},peek:function peek(){return this.values.length?this.values[0].isIndex?this.values[0].peek():this.values[0]:[]},clear:function clear(){this.keys=[],this.values=[]},insertRecord:function insertRecord(e){var t=this.fieldList.map(function(t){return d.isFunction(t)?t(e)||void 0:e[t]||void 0});this.set(t,e)},removeRecord:function removeRecord(e){var t=this,n=void 0,i=void 0!==this.hashCode(e);return this.values.forEach(function(r,o){if(r.isIndex){if(r.removeRecord(e))return 0===r.keys.length&&(removeAt(t.keys,o),removeAt(t.values,o)),n=!0,!1}else{var a={};if(void 0!==t.keys[o]&&i)i&&(a=binarySearch(r,e,t.hashCode));else for(var s=r.length-1;s>=0;s--)if(r[s]===e){a={found:!0,index:s};break}if(a.found)return removeAt(r,a.index),0===r.length&&(removeAt(t.keys,o),removeAt(t.values,o)),n=!0,!1}}),n?e:void 0},updateRecord:function updateRecord(e){void 0!==this.removeRecord(e)&&this.insertRecord(e)}});var S=j.noValidatePath,P={commitOnMerge:!0,emitRecordEvents:!0,idAttribute:"id",onConflict:"merge"},M=p.extend({constructor:Collection,_onRecordEvent:function _onRecordEvent(){this.emitRecordEvents&&this.emit.apply(this,arguments)},add:function add(e,t){var n=this;t||(t={}),d._(t,this),e=this.beforeAdd(e,t)||e;var i=!1,r=this.recordId();if(!d.isArray(e)){if(!d.isObject(e))throw d.err("Collection#add","records")(400,"object or array",e);e=[e],i=!0}e=e.map(function(e){var i=n.recordId(e),o=void 0===i?i:n.get(i);if(e===o)return o;if(o){var a=t.onConflict||n.onConflict;if("merge"!==a&&"replace"!==a&&"skip"!==a)throw d.err("Collection#add","opts.onConflict")(400,"one of (merge, replace, skip)",a,!0);var s=o._get(S);t.noValidate&&o._set(S,!0),"merge"===a?d.deepMixIn(o,e):"replace"===a&&(d.forOwn(o,function(t,n){n!==r&&void 0===e[n]&&(o[n]=void 0)}),o.set(e)),t.noValidate&&o._set(S,s),e=o,t.commitOnMerge&&d.isFunction(e.commit)&&e.commit(),n.updateIndexes(e)}else e=n.mapper?n.mapper.createRecord(e,t):e,n.index.insertRecord(e),d.forOwn(n.indexes,function(t,n){t.insertRecord(e)}),e&&d.isFunction(e.on)&&e.on("all",n._onRecordEvent,n);return e});var o=i?e[0]:e;return t.silent||this.emit("add",o),this.afterAdd(e,t,o)||o},afterAdd:function afterAdd(){},afterRemove:function afterRemove(){},afterRemoveAll:function afterRemoveAll(){},beforeAdd:function beforeAdd(){},beforeRemove:function beforeRemove(){},beforeRemoveAll:function beforeRemoveAll(){},between:function between(e,t,n){return this.query().between(e,t,n).run()},createIndex:function createIndex(e,t,n){var i=this;d.isString(e)&&void 0===t&&(t=[e]),n||(n={}),n.hashCode||(n.hashCode=function(e){return i.recordId(e)});var r=this.indexes[e]=new Index(t,n);this.index.visitAll(r.insertRecord,r)},filter:function filter(e,t){return this.query().filter(e,t).run()},forEach:function forEach(e,t){this.index.visitAll(e,t)},get:function get(e){var t=void 0===e?[]:this.query().get(e).run();return t.length?t[0]:void 0},getAll:function getAll(){var e;return(e=this.query()).getAll.apply(e,arguments).run()},getIndex:function getIndex(e){var t=e?this.indexes[e]:this.index;if(!t)throw d.err("Collection#getIndex",e)(404,"index");return t},limit:function limit(e){return this.query().limit(e).run()},map:function map(e,t){var n=[];return this.index.visitAll(function(i){n.push(e.call(t,i))}),n},mapCall:function mapCall(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;ir)return D(t.length,"length no more than "+r,i)},Q=function minLengthCommon(e,t,n,i){var r=n[e];if(t.lengthe:maximum>=e))return r?D(e,"no more than nor equal to "+maximum,i):D(e,"no more than "+maximum,i)},maxItems:function maxItems(e,t,n){if(d.isArray(e))return q("maxItems",e,t,n)},maxLength:function maxLength(e,t,n){return q("maxLength",e,t,n)},maxProperties:function maxProperties(e,t,n){if(d.isObject(e)){var maxProperties=t.maxProperties,i=Object.keys(e).length;return i>maxProperties?D(i,"no more than "+maxProperties+" properties",n):void 0}},minimum:function minimum(e,n,i){var minimum=n.minimum,r=n.exclusiveMinimum;if((void 0===e?"undefined":t(e))===(void 0===minimum?"undefined":t(minimum))&&!(r?e>minimum:e>=minimum))return r?D(e,"no less than nor equal to "+minimum,i):D(e,"no less than "+minimum,i)},minItems:function minItems(e,t,n){if(d.isArray(e))return Q("minItems",e,t,n)},minLength:function minLength(e,t,n){return Q("minLength",e,t,n)},minProperties:function minProperties(e,t,n){if(d.isObject(e)){var minProperties=t.minProperties,i=Object.keys(e).length;return i0;r--)for(i=e[r],o=r-1;o>=0;o--)if(d.deepEqual(i,e[o]))return D(i,"no duplicates",n)}}},B=function runOps(e,t,n,i){var r=[];return e.forEach(function(e){void 0!==n[e]&&(r=r.concat(J[e](t,n,i)||[]))}),r.length?r:void 0},$=["enum","type","allOf","anyOf","oneOf","not"],H=["items","maxItems","minItems","uniqueItems"],U=["multipleOf","maximum","minimum"],V=["maxProperties","minProperties","required","properties","dependencies"],G=["maxLength","minLength","pattern"],W=function validateAny(e,t,n){return B($,e,t,n)},Y=function _validate(e,t,n){var i=[];n||(n={}),n.ctx||(n.ctx={value:e,schema:t});var r=void 0,o=n.prop;if(void 0!==t){if(!d.isObject(t))throw d.err("Schema#validate")(500,'Invalid schema at path: "'+n.path+'"');return void 0===n.path&&(n.path=[]),void 0!==n.prop&&(r=!0,n.path.push(n.prop),n.prop=void 0),t.extends&&(i=d.isFunction(t.extends.validate)?i.concat(t.extends.validate(e,n)||[]):i.concat(_validate(e,t.extends,n)||[])),void 0===e?(!0!==t.required||n.existingOnly||T(e,"a value",n,i),r&&(n.path.pop(),n.prop=o),i.length?i:void 0):(i=i.concat(W(e,t,n)||[]),r&&(n.path.pop(),n.prop=o),i.length?i:void 0)}},z={array:function array(e,t,n){return B(H,e,t,n)},integer:function integer(e,t,n){return z.numeric(e,t,n)},number:function number(e,t,n){return z.numeric(e,t,n)},numeric:function numeric(e,t,n){return B(U,e,t,n)},object:function object(e,t,n){return B(V,e,t,n)},string:function string(e,t,n){return B(G,e,t,n)}},X=p.extend({constructor:Schema,apply:function apply(e,t){var n=this;t||(t={}),t.getter||(t.getter="_get"),t.setter||(t.setter="_set"),t.unsetter||(t.unsetter="_unset"),t.track||(t.track=this.track);var i=this.properties||{};d.forOwn(i,function(i,r){Object.defineProperty(e,r,n.makeDescriptor(r,i,t))})},applyDefaults:function applyDefaults(e){if(e){var t=this.properties||{},n=d.isFunction(e.set)||d.isFunction(e._set);d.forOwn(t,function(t,i){if(t.hasOwnProperty("default")&&void 0===d.get(e,i)&&(n?e.set(i,d.plainCopy(t.default),{silent:!0}):d.set(e,i,d.plainCopy(t.default))),"object"===t.type&&t.properties){if(n){var r=e._get("noValidate");e._set("noValidate",!0),d.set(e,i,d.get(e,i)||{},{silent:!0}),e._set("noValidate",r)}else d.set(e,i,d.get(e,i)||{});t.applyDefaults(d.get(e,i))}})}},makeDescriptor:function makeDescriptor(e,t,i){var r={configurable:!0,enumerable:void 0===t.enumerable||!!t.enumerable},o="props."+e,a="previous."+e,s=i.getter,c=i.setter,l=i.unsetter,u=d.isBoolean(i.track)?i.track:t.track;if(r.get=function(){return this._get(o)},d.isFunction(t.get)){var f=r.get;r.get=function(){return t.get.call(this,f)}}if(r.set=function(i){var r=this,f=this[s],h=this[c],p=this[l];if(!f("noValidate")){var v=t.validate(i,{path:[e]});if(v){var g=new Error("validation failed");throw g.errors=v,g}}if(u&&!f("creating")){var y=f(a),m=f(o),A=f("changing"),b=f("changed");A||(b=[]);var O=b.indexOf(e);m!==i&&-1===O&&b.push(e),y===i&&O>=0&&b.splice(O,1),b.length||(A=!1,p("changing"),p("changed"),f("eventId")&&(clearTimeout(f("eventId")),p("eventId"))),!A&&b.length&&(h("changed",b),h("changing",!0),h("eventId",setTimeout(function(){if(p("changed"),p("eventId"),p("changing"),!f("silent")){var t=void 0;for(t=0;t1?n-1:0),o=1;o1?t-1:0),i=1;i1?t-1:0),i=1;i1?i-1:0),o=1;o1?t-1:0),i=1;i1?i-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:{};d.classCallCheck(this,Relation),n.type=this.constructor.TYPE_NAME,this.validateOptions(e,n),"object"===(void 0===e?"undefined":t(e))&&Object.defineProperty(this,"relatedMapper",{value:e}),Object.defineProperty(this,"inverse",{writable:!0}),d.fillIn(this,n)}function Record(e,t){d.classCallCheck(this,Record),Settable.call(this),e||(e={}),t||(t={});var n=this._set,i=this.constructor.mapper;n(k,!0),n(I,!!t.noValidate),n(F,void 0===t.keepChangeHistory?!i||i.keepChangeHistory:t.keepChangeHistory);var r=i?d.get(e,i.idAttribute):void 0;void 0!==r&&d.set(this,i.idAttribute,r),d.fillIn(this,e),n(k,!1),void 0!==t.validateOnSet?n(I,!t.validateOnSet):i&&void 0!==i.validateOnSet?n(I,!i.validateOnSet):n(I,!1),n(E,i?i.toJSON(e):d.plainCopy(e))}function sort(e,t,n){return e===t?0:(n&&(e=n(e),t=n(t)),null===e&&null===t||void 0===e&&void 0===t?-1:null===e||void 0===e?-1:null===t||void 0===t?1:et?1:0)}function insertAt(e,t,n){return e.splice(t,0,n),e}function removeAt(e,t){return e.splice(t,1),e}function binarySearch(e,t,n){for(var i=0,r=e.length,o=void 0,a=void 0;i=0?o=r:(a=d._getIndex(e.with,t.localField))>=0&&(o=t.localField),e.withAll)n.call(i,t,{});else if(o){var s={};d.fillIn(s,t.getRelation()),d.fillIn(s,e),s.with=e.with.slice(),s._activeWith=s.with.splice(a,1)[0],s.with.forEach(function(e,t){e&&0===e.indexOf(o)&&e.length>=o.length&&"."===e[o.length]?s.with[t]=e.substr(o.length+1):s.with[t]=""}),n.call(i,t,s)}},_getIndex:function _getIndex(e,t){var n=-1;return e.forEach(function(e,i){return e===t?(n=i,!1):d.isObject(e)&&e.relation===t?(n=i,!1):void 0}),n},addHiddenPropsToTarget:function addHiddenPropsToTarget(e,t){var n={};Object.keys(t).forEach(function(e){var i=Object.getOwnPropertyDescriptor(t,e);i.enumerable=!1,n[e]=i}),Object.defineProperties(e,n)},areDifferent:function areDifferent(e,t,n){n||(n={});var i=d.diffObjects(e,t,n);return Object.keys(i.added).length+Object.keys(i.removed).length+Object.keys(i.changed).length>0},classCallCheck:function classCallCheck$$1(e,t){if(!(e instanceof t))throw d.err(""+t.name)(500,"Cannot call a class as a function")},copy:function copy(e,t,n,i,r,o){if(t){if(e===t)throw d.err("utils.copy")(500,"Cannot copy! Source and destination are identical.");if(n=n||[],i=i||[],d.isObject(e)){var a=n.indexOf(e);if(-1!==a)return i[a];n.push(e),i.push(t)}var s=void 0;if(d.isArray(e)){var c=void 0;for(t.length=0,c=0;c1?t-1:0),i=1;i=0&&e.splice(n,1)}},resolve:function resolve(e){return d.Promise.resolve(e)},set:function set$$1(e,t,n){if(d.isObject(t))d.forOwn(t,function(t,n){d.set(e,n,t)});else{var i=o.exec(t);i?u(e,i[1])[i[2]]=n:e[t]=n}},deepEqual:function deepEqual(e,t){if(e===t)return!0;var n=!0;if(d.isArray(e)&&d.isArray(t)){if(e.length!==t.length)return!1;for(var i=e.length;i--;)if(!d.deepEqual(e[i],t[i]))return!1}else{if(!d.isObject(e)||!d.isObject(t))return!1;d.forOwn(e,function(e,i){if(!(n=d.deepEqual(e,t[i])))return!1}),n&&d.forOwn(t,function(t,i){if(!(n=d.deepEqual(t,e[i])))return!1})}return n},toJson:JSON.stringify,unset:function unset(e,t){for(var n=t.split("."),i=n.pop();t=n.shift();)if(null==(e=e[t]))return;e[i]=void 0}},f=function safeSetProp(e,t,n){e&&e._set?e._set("props."+t,n):d.set(e,t,n)},h=function safeSetLink(e,t,n){e&&e._set?e._set("links."+t,n):d.set(e,t,n)};Settable.extend=d.extend;var p=Settable.extend({constructor:Component});Component.extend=d.extend,d.logify(Component.prototype),d.eventify(Component.prototype,function(){return this._listeners},function(e){this._listeners=e});var v="Index inaccessible after first operation",g={limit:"",offset:"",orderBy:"",skip:"",sort:"",where:""},y=/([.*+?^=!:${}()|[\]/\\])/g,m=/%/g,A=/_/g,b=function escape(e){return e.replace(y,"\\$1")},O=p.extend({constructor:Query,_applyWhereFromObject:function _applyWhereFromObject(e){var t=[],n=[],i=[];return d.forOwn(e,function(e,r){d.isObject(e)||(e={"==":e}),d.forOwn(e,function(e,o){t.push(r),n.push(o),i.push(e)})}),{fields:t,ops:n,predicates:i}},_applyWhereFromArray:function _applyWhereFromArray(e){var t=this,n=[];return e.forEach(function(i,r){if(!d.isString(i)){var o=e[r-1],a=(d.isArray(i)?t._applyWhereFromArray:t._applyWhereFromObject).call(t,i);"or"===o&&(a.isOr=!0),n.push(a)}}),n.isArray=!0,n},_testObjectGroup:function _testObjectGroup(e,t,n,i){var r=void 0,o=n.fields,a=n.ops,s=n.predicates,c=a.length;for(r=0;ra?1:t1?t-1:0),i=1;i":function _(e,t){return e>t},">=":function _(e,t){return e>=t},"<":function _(e,t){return e")(400,"string",r)},canFindLinkFor:function canFindLinkFor(e){return!!(this.foreignKey||this.foreignKeys||this.localKeys&&d.get(e,this.localKeys))},linkRecord:function linkRecord(e,t){var n=this,i=this.relatedCollection,r=this.canAutoAddLinks,o=this.foreignKey,a=this.relatedCollection.unsaved();return t.map(function(t){var s=i.recordId(t);return(void 0===s&&-1===a.indexOf(t)||t!==i.get(s))&&(o&&n.setForeignKey(e,t),r&&(t=i.add(t))),t})},findExistingLinksFor:function findExistingLinksFor(e){var t=d.get(e,this.mapper.idAttribute),n=this.localKeys?d.get(e,this.localKeys):null,i=void 0;if(void 0!==t&&this.foreignKey?i=this.findExistingLinksByForeignKey(t):this.localKeys&&n?i=this.findExistingLinksByLocalKeys(n):void 0!==t&&this.foreignKeys&&(i=this.findExistingLinksByForeignKeys(t)),i&&i.length)return i},findExistingLinksByLocalKeys:function findExistingLinksByLocalKeys(e){return this.relatedCollection.filter({where:n({},this.mapper.idAttribute,{in:e})})},findExistingLinksByForeignKeys:function findExistingLinksByForeignKeys(e){return this.relatedCollection.filter({where:n({},this.foreignKeys,{contains:e})})},isRequiresParentId:function isRequiresParentId(){return!!this.localKeys&&this.localKeys.length>0},isRequiresChildId:function isRequiresChildId(){return!!this.foreignKey},createParentRecord:function createParentRecord(e,t){var n=this,i=this.getLocalField(e),r=this.getRelation().idAttribute;return this.createLinked(i,t).then(function(t){d.set(e,n.localKeys,t.map(function(e){return d.get(e,r)}))})},createLinked:function createLinked(e,t){return this.getRelation().createMany(e,t)}},{TYPE_NAME:"hasMany"}),Relation.extend({findExistingLinksFor:function findExistingLinksFor(e,t){var n=d.get(t,e.idAttribute),i=this.findExistingLinksByForeignKey(n);if(i&&i.length)return i[0]},isRequiresChildId:function isRequiresChildId(){return!0}},{TYPE_NAME:"hasOne"})].forEach(function(e){Relation[e.TYPE_NAME]=function(t,n){return new e(t,n)}});var x=function belongsTo(e,t){return function(n){Relation.belongsTo(e,t).assignTo(n)}},C=function hasMany(e,t){return function(n){Relation.hasMany(e,t).assignTo(n)}},w=function hasOne(e,t){return function(n){Relation.hasOne(e,t).assignTo(n)}},R=function superMethod(e,t){var n=e.datastore;return n&&n[t]?function(){for(var i=arguments.length,r=Array(i),o=0;o=0;i--){var r=n[i];t=r.isIndex?t.concat(r.getAll(e)):t.concat(r)}else for(var o=0;oo)break}else if(this.keys[s]>=o)break;if(i=this.values[s].isIndex?i.concat(this.values[s].getAll()):i.concat(this.values[s]),n.limit&&i.length>=n.limit+n.offset)break}}else for(var c=a.index;co)break;if(i=this.values[c].isIndex?l===r?i.concat(this.values[c]._between(d.copy(e),t.map(function(){}),n)):l===o?i.concat(this.values[c]._between(e.map(function(){}),d.copy(t),n)):i.concat(this.values[c].getAll()):i.concat(this.values[c]),n.limit&&i.length>=n.limit+n.offset)break}return n.limit?i.slice(0,n.limit+n.offset):i},peek:function peek(){return this.values.length?this.values[0].isIndex?this.values[0].peek():this.values[0]:[]},clear:function clear(){this.keys=[],this.values=[]},insertRecord:function insertRecord(e){var t=this.fieldList.map(function(t){return d.isFunction(t)?t(e)||void 0:e[t]||void 0});this.set(t,e)},removeRecord:function removeRecord(e){var t=this,n=void 0,i=void 0!==this.hashCode(e);return this.values.forEach(function(r,o){if(r.isIndex){if(r.removeRecord(e))return 0===r.keys.length&&(removeAt(t.keys,o),removeAt(t.values,o)),n=!0,!1}else{var a={};if(void 0!==t.keys[o]&&i)i&&(a=binarySearch(r,e,t.hashCode));else for(var s=r.length-1;s>=0;s--)if(r[s]===e){a={found:!0,index:s};break}if(a.found)return removeAt(r,a.index),0===r.length&&(removeAt(t.keys,o),removeAt(t.values,o)),n=!0,!1}}),n?e:void 0},updateRecord:function updateRecord(e){void 0!==this.removeRecord(e)&&this.insertRecord(e)}});var S=j.noValidatePath,P={commitOnMerge:!0,emitRecordEvents:!0,idAttribute:"id",onConflict:"merge"},M=p.extend({constructor:Collection,_onRecordEvent:function _onRecordEvent(){this.emitRecordEvents&&this.emit.apply(this,arguments)},add:function add(e,t){var n=this;t||(t={}),d._(t,this),e=this.beforeAdd(e,t)||e;var i=!1,r=this.recordId();if(!d.isArray(e)){if(!d.isObject(e))throw d.err("Collection#add","records")(400,"object or array",e);e=[e],i=!0}e=e.map(function(e){var i=n.recordId(e),o=void 0===i?i:n.get(i);if(e===o)return o;if(o){var a=t.onConflict||n.onConflict;if("merge"!==a&&"replace"!==a&&"skip"!==a)throw d.err("Collection#add","opts.onConflict")(400,"one of (merge, replace, skip)",a,!0);var s=o._get(S);t.noValidate&&o._set(S,!0),"merge"===a?d.deepMixIn(o,e):"replace"===a&&(d.forOwn(o,function(t,n){n!==r&&void 0===e[n]&&(o[n]=void 0)}),o.set(e)),t.noValidate&&o._set(S,s),e=o,t.commitOnMerge&&d.isFunction(e.commit)&&e.commit(),n.updateIndexes(e)}else e=n.mapper?n.mapper.createRecord(e,t):e,n.index.insertRecord(e),d.forOwn(n.indexes,function(t,n){t.insertRecord(e)}),e&&d.isFunction(e.on)&&e.on("all",n._onRecordEvent,n);return e});var o=i?e[0]:e;return t.silent||this.emit("add",o),this.afterAdd(e,t,o)||o},afterAdd:function afterAdd(){},afterRemove:function afterRemove(){},afterRemoveAll:function afterRemoveAll(){},beforeAdd:function beforeAdd(){},beforeRemove:function beforeRemove(){},beforeRemoveAll:function beforeRemoveAll(){},between:function between(e,t,n){return this.query().between(e,t,n).run()},createIndex:function createIndex(e,t,n){var i=this;d.isString(e)&&void 0===t&&(t=[e]),n||(n={}),n.hashCode||(n.hashCode=function(e){return i.recordId(e)});var r=this.indexes[e]=new Index(t,n);this.index.visitAll(r.insertRecord,r)},filter:function filter(e,t){return this.query().filter(e,t).run()},forEach:function forEach(e,t){this.index.visitAll(e,t)},get:function get(e){var t=void 0===e?[]:this.query().get(e).run();return t.length?t[0]:void 0},getAll:function getAll(){var e;return(e=this.query()).getAll.apply(e,arguments).run()},getIndex:function getIndex(e){var t=e?this.indexes[e]:this.index;if(!t)throw d.err("Collection#getIndex",e)(404,"index");return t},limit:function limit(e){return this.query().limit(e).run()},map:function map(e,t){var n=[];return this.index.visitAll(function(i){n.push(e.call(t,i))}),n},mapCall:function mapCall(e){for(var t=arguments.length,n=Array(t>1?t-1:0),i=1;ir)return D(t.length,"length no more than "+r,i)},Q=function minLengthCommon(e,t,n,i){var r=n[e];if(t.lengthe:maximum>=e))return r?D(e,"no more than nor equal to "+maximum,i):D(e,"no more than "+maximum,i)},maxItems:function maxItems(e,t,n){if(d.isArray(e))return q("maxItems",e,t,n)},maxLength:function maxLength(e,t,n){return q("maxLength",e,t,n)},maxProperties:function maxProperties(e,t,n){if(d.isObject(e)){var maxProperties=t.maxProperties,i=Object.keys(e).length;return i>maxProperties?D(i,"no more than "+maxProperties+" properties",n):void 0}},minimum:function minimum(e,n,i){var minimum=n.minimum,r=n.exclusiveMinimum;if((void 0===e?"undefined":t(e))===(void 0===minimum?"undefined":t(minimum))&&!(r?e>minimum:e>=minimum))return r?D(e,"no less than nor equal to "+minimum,i):D(e,"no less than "+minimum,i)},minItems:function minItems(e,t,n){if(d.isArray(e))return Q("minItems",e,t,n)},minLength:function minLength(e,t,n){return Q("minLength",e,t,n)},minProperties:function minProperties(e,t,n){if(d.isObject(e)){var minProperties=t.minProperties,i=Object.keys(e).length;return i0;r--)for(i=e[r],o=r-1;o>=0;o--)if(d.deepEqual(i,e[o]))return D(i,"no duplicates",n)}}},B=function runOps(e,t,n,i){var r=[];return e.forEach(function(e){void 0!==n[e]&&(r=r.concat(J[e](t,n,i)||[]))}),r.length?r:void 0},$=["enum","type","allOf","anyOf","oneOf","not"],H=["items","maxItems","minItems","uniqueItems"],U=["multipleOf","maximum","minimum"],V=["maxProperties","minProperties","required","properties","dependencies"],G=["maxLength","minLength","pattern"],W=function validateAny(e,t,n){return B($,e,t,n)},Y=function _validate(e,t,n){var i=[];n||(n={}),n.ctx||(n.ctx={value:e,schema:t});var r=void 0,o=n.prop;if(void 0!==t){if(!d.isObject(t))throw d.err("Schema#validate")(500,'Invalid schema at path: "'+n.path+'"');return void 0===n.path&&(n.path=[]),void 0!==n.prop&&(r=!0,n.path.push(n.prop),n.prop=void 0),t.extends&&(i=d.isFunction(t.extends.validate)?i.concat(t.extends.validate(e,n)||[]):i.concat(_validate(e,t.extends,n)||[])),void 0===e?(!0!==t.required||n.existingOnly||T(e,"a value",n,i),r&&(n.path.pop(),n.prop=o),i.length?i:void 0):(i=i.concat(W(e,t,n)||[]),r&&(n.path.pop(),n.prop=o),i.length?i:void 0)}},z={array:function array(e,t,n){return B(H,e,t,n)},integer:function integer(e,t,n){return z.numeric(e,t,n)},number:function number(e,t,n){return z.numeric(e,t,n)},numeric:function numeric(e,t,n){return B(U,e,t,n)},object:function object(e,t,n){return B(V,e,t,n)},string:function string(e,t,n){return B(G,e,t,n)}},X=p.extend({constructor:Schema,apply:function apply(e,t){var n=this;t||(t={}),t.getter||(t.getter="_get"),t.setter||(t.setter="_set"),t.unsetter||(t.unsetter="_unset"),t.track||(t.track=this.track);var i=this.properties||{};d.forOwn(i,function(i,r){Object.defineProperty(e,r,n.makeDescriptor(r,i,t))})},applyDefaults:function applyDefaults(e){if(e){var t=this.properties||{},n=d.isFunction(e.set)||d.isFunction(e._set);d.forOwn(t,function(t,i){if(t.hasOwnProperty("default")&&void 0===d.get(e,i)&&(n?e.set(i,d.plainCopy(t.default),{silent:!0}):d.set(e,i,d.plainCopy(t.default))),"object"===t.type&&t.properties){if(n){var r=e._get("noValidate");e._set("noValidate",!0),d.set(e,i,d.get(e,i)||{},{silent:!0}),e._set("noValidate",r)}else d.set(e,i,d.get(e,i)||{});t.applyDefaults(d.get(e,i))}})}},makeDescriptor:function makeDescriptor(e,t,i){var r={configurable:!0,enumerable:void 0===t.enumerable||!!t.enumerable},o="props."+e,a="previous."+e,s=i.getter,c=i.setter,l=i.unsetter,u=d.isBoolean(i.track)?i.track:t.track;if(r.get=function(){return this._get(o)},d.isFunction(t.get)){var f=r.get;r.get=function(){return t.get.call(this,f)}}if(r.set=function(i){var r=this,f=this[s],h=this[c],p=this[l];if(!f("noValidate")){var v=t.validate(i,{path:[e]});if(v){var g=new Error("validation failed");throw g.errors=v,g}}if(u&&!f("creating")){var y=f(a),m=f(o),A=f("changing"),b=f("changed");A||(b=[]);var O=b.indexOf(e);m!==i&&-1===O&&b.push(e),y===i&&O>=0&&b.splice(O,1),b.length||(A=!1,p("changing"),p("changed"),f("eventId")&&(clearTimeout(f("eventId")),p("eventId"))),!A&&b.length&&(h("changed",b),h("changing",!0),h("eventId",setTimeout(function(){if(p("changed"),p("eventId"),p("changing"),!f("silent")){var t=void 0;for(t=0;t1?n-1:0),o=1;o1?t-1:0),i=1;i1?t-1:0),i=1;i1?i-1:0),o=1;o1?t-1:0),i=1;i1?i-1:0),o=1;o",">=","<","<=","isectEmpty","isectNotEmpty","in","_in","notIn","contains","notContains","canAutoAddLinks","relatedCollection","getCollection","related","foreignKey","localKey","assignTo","relationFields","canFindLinkFor","getForeignKey","setForeignKey","relatedRecord","_setForeignKey","relatedRecords","getLocalField","setLocalField","relatedData","getInverse","inverse","findInverseRelation","isInversedTo","addLinkedRecords","linkRecord","findExistingLinksFor","removeLinkedRecords","relatedId","unsaved","findExistingLinksByForeignKey","ensureLinkedDataHasProperType","relationData","is","createRecord","isRequiresParentId","isRequiresChildId","createChildRecord","_this4","createLinked","then","createParentRecord","localKeys","foreignKeys","ids","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","RelationType","belongsTo","hasMany","hasOne","superMethod","store","bind","_mapper","DOMAIN$3","afterLoadRelations","beforeLoadRelations","changeHistory","changes","commit","destroy","hasChanges","isNew","isValid","validate","removeInverseRelation","currentParent","inverseDef","children","child","setupInverseRelation","loadRelations","relations","adapter","getAdapterName","tasks","task","raw","load","previous","revert","preserve","save","_this5","postProcess","changesOnly","silent","noValidatePath","pos","dataLocation","newIndex","results","order","_i","visitAll","cb","leftInclusive","rightInclusive","_between","leftKey","rightKey","_i2","currKey","peek","clear","insertRecord","removeRecord","isUnique","j","updateRecord","commitOnMerge","emitRecordEvents","onConflict","_onRecordEvent","beforeAdd","singular","DOMAIN$1","existingNoValidate","updateIndexes","afterAdd","afterRemove","afterRemoveAll","beforeRemove","beforeRemoveAll","createIndex","instances","_query","prune","removeAll","Ctor","initialValue","idOrRecord","queryOrRecords","updateIndex","types","boolean","integer","null","number","string","segmentToString","segment","str","makePath","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","max","minLengthCommon","validationKeywords","allOf","allErrors","_schema","_validate","anyOf","validated","dependencies","enum","_enum","possibleValues","join","checkingTuple","maximum","exclusiveMaximum","maxItems","maxLength","maxProperties","minimum","exclusiveMinimum","minItems","minLength","minProperties","multipleOf","not","oneOf","additionalProperties","patternProperties","toValidate","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","DOMAIN$7","numeric","unsetter","track","makeDescriptor","applyDefaults","hasSet","orig","keyPath","originalGet","error","current","changing","clearTimeout","setTimeout","changeRecord","timestamp","originalSet","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","count","defaults","destroyAll","find","findAll","sum","update","adapterArgs","beforeAssign","updateAll","updateMany","defaultAdapter","afterCount","afterCreate","afterCreateMany","afterDestroy","afterDestroyAll","afterFind","afterFindAll","afterSum","afterUpdate","afterUpdateAll","afterUpdateMany","beforeCreate","beforeCreateMany","beforeCount","beforeDestroy","beforeDestroyAll","beforeFind","beforeFindAll","beforeSum","beforeUpdate","beforeUpdateAll","beforeUpdateMany","_end","_data","wrap","belongsTo$$1","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","originalProps","_commitChanges","recordOrRecords","newValues","createInstance","context","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","RecordCtor","method","_this6","config","upper","before","after","_getAdapter","getAdapter","_result","getAdapters","hasMany$$1","hasOne$$1","registerAdapter","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","_this7","conversionOptions","pass","_this8","_opts","_record","some","defineRelations","_this9","_name","getMapperByName","getMapper","proxiedMapperMethods","_onMapperEvent","as","original","defineMapper","DOMAIN$5","defineResource","warn","_getMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","usePendingFind","usePendingFindAll","props$2","addToCache","_onCollectionEvent","cachedFind","cachedFindAll","cacheFind","cacheFindAll","hash","self","collectionOpts","indexed","hashQuery","eject","ejectAll","pendingQuery","force","DOMAIN$8","inject","removeRelated","_this10","_this11","_this12","_this13","_getCollection","_addMeta","_clearMeta","event","unlinkOnDestroy","props$1","updateOpts","relatedIdAttribute","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","origGet","origSet","DataStore$1","version","full","major","minor","patch","belongsToType","hasManyType","hasOneType"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["dist/js-data.js"],"names":["global","factory","exports","module","define","amd","JSData","this","Settable","_props","Object","defineProperties","_get","value","key","utils","get","_set","_value","set","_unset","unset","Component","opts","call","debug","hasOwnProperty","defineProperty","writable","Query","collection","classCallCheck","data","Relation","relatedMapper","options","arguments","length","undefined","type","constructor","TYPE_NAME","validateOptions","_typeof","fillIn","Record","props","mapper","creatingPath","noValidatePath$1","noValidate","keepChangeHistoryPath","keepChangeHistory","id","idAttribute","validateOnSet","previousPath","toJSON","plainCopy","sort","a","b","hashCode","insertAt","array","index","splice","removeAt","binarySearch","field","lo","hi","compared","mid","found","Index","fieldList","isArray","Error","fieldGetter","isIndex","keys","values","Collection","records","Component$1","isString","queryClass","copy","COLLECTION_DEFAULTS","Query$1","recordId","obj","indexes","isObject","add","Schema","definition","_this","properties","forOwn","_definition","prop","items","extends","forEach","validationKeyword","i","Mapper","_adapters","datastore","lifecycleMethods","LIFECYCLE_METHODS","recordClass","schema","MAPPER_DEFAULTS","name","err","DOMAIN$6","Schema$1","superClass","Record$1","extend","subClass","methods","addHiddenPropsToTarget","prototype","isPrototypeOf","create","apply","applySchema","Container","_mappers","mapperClass","mapperDefaults","Mapper$1","SimpleStore","SIMPLESTORE_DEFAULTS","collectionClass","Collection$1","_collections","_pendingQueries","_completedQueries","LinkedCollection","_added","DOMAIN$9","DataStore","DATASTORE_DEFAULTS","LinkedCollection$1","SimpleStore$1","Symbol","iterator","enumerable","configurable","toConsumableArray","arr","Array","arr2","from","objToString","toString","PATH","ERRORS","400","_","404","toInteger","remainder","toStr","isPlainObject","mkdirP","object","path","split","Promise","dest","src","isFunction","indexOf","_forRelation","def","fn","thisArg","relationName","relation","containedName","with","_getIndex","localField","withAll","optsCopy","getRelation","slice","_activeWith","substr","list","_relation","target","map","propName","descriptor","getOwnPropertyDescriptor","areDifferent","newObject","oldObject","diff","diffObjects","added","removed","changed","classCallCheck$$1","instance","ctor","to","stackFrom","stackTo","blacklist","plain","DOMAIN","push","result","isBlacklisted","isDate","Date","getTime","isRegExp","RegExp","source","match","lastIndex","getPrototypeOf","deepFillIn","existing","deepMixIn","equalsFn","ignore","deepEqual","newKeys","filter","oldKeys","oldValue","newValue","equal","domain","code","prefix","message","eventify","getter","setter","_events","emit","events","_len","args","_key","shift","listeners","f","c","all","unshift","off","func","on","classProps","_subClass","_len2","_key2","setPrototypeOf","strictEs6Class","__proto__","findIndex","record","forEachRelation","relationList","len","fromJson","json","JSON","parse","get$$1","parts","last","pop","getSuper","isCtor","__super__","intersection","array1","array2","item","matches","test","isBoolean","isInteger","isNull","isNumber","isSorN","isUndefined","logify","dbg","log","_len3","_key3","concat","level","_len4","_key4","toUpperCase","console","_console","_console2","noDupeAdd","omit","pick","reduce","reject","remove","resolve","set$$1","_path","exec","_equal","toJson","stringify","safeSetProp","safeSetLink","_listeners","INDEX_ERR","reserved","limit","offset","orderBy","skip","where","escapeRegExp","percentRegExp","underscoreRegExp","escape","pattern","replace","_applyWhereFromObject","fields","ops","predicates","clause","==","expr","op","_applyWhereFromArray","groups","_where","prev","group","isOr","_testObjectGroup","keep","first","charAt","evaluate","_testArrayGroup","between","leftKeys","rightKeys","DOMAIN$2","getIndex","compare","cA","cB","temp","predicate","like","query","_this2","getData","forEachFn","keyList","getAll","_this3","flags","num","Math","min","mapFn","mapCall","funcName","run","=","===","!=","!==",">",">=","<","<=","isectEmpty","isectNotEmpty","in","_in","notIn","contains","notContains","canAutoAddLinks","relatedCollection","getCollection","related","foreignKey","localKey","assignTo","relationFields","canFindLinkFor","getForeignKey","setForeignKey","relatedRecord","_setForeignKey","relatedRecords","getLocalField","setLocalField","relatedData","getInverse","inverse","findInverseRelation","isInversedTo","addLinkedRecords","linkRecord","findExistingLinksFor","removeLinkedRecords","relatedId","unsaved","findExistingLinksByForeignKey","ensureLinkedDataHasProperType","relationData","is","createRecord","isRequiresParentId","isRequiresChildId","createChildRecord","_this4","createLinked","then","createParentRecord","localKeys","foreignKeys","ids","findExistingLinksByLocalKeys","findExistingLinksByForeignKeys","foreignIdField","createMany","RelationType","belongsTo","hasMany","hasOne","superMethod","store","bind","_mapper","DOMAIN$3","afterLoadRelations","beforeLoadRelations","changeHistory","changes","commit","destroy","hasChanges","isNew","isValid","validate","removeInverseRelation","currentParent","inverseDef","children","child","setupInverseRelation","loadRelations","relations","adapter","getAdapterName","tasks","task","raw","load","previous","revert","preserve","save","_this5","postProcess","changesOnly","silent","noValidatePath","pos","dataLocation","newIndex","results","order","_i","visitAll","cb","leftInclusive","rightInclusive","_between","leftKey","rightKey","_i2","currKey","peek","clear","insertRecord","removeRecord","isUnique","j","updateRecord","commitOnMerge","emitRecordEvents","onConflict","_onRecordEvent","beforeAdd","singular","DOMAIN$1","existingNoValidate","updateIndexes","afterAdd","afterRemove","afterRemoveAll","beforeRemove","beforeRemoveAll","createIndex","instances","_query","prune","removeAll","Ctor","initialValue","idOrRecord","queryOrRecords","updateIndex","types","boolean","integer","null","number","string","segmentToString","segment","str","makePath","makeError","actual","expected","addError","errors","maxLengthCommon","keyword","max","minLengthCommon","validationKeywords","allOf","allErrors","_schema","_validate","anyOf","validated","dependencies","enum","_enum","possibleValues","join","checkingTuple","maximum","exclusiveMaximum","maxItems","maxLength","maxProperties","minimum","exclusiveMinimum","minItems","minLength","minProperties","multipleOf","not","oneOf","additionalProperties","patternProperties","toValidate","undef","origProp","required","existingOnly","prevProp","validType","_type","validator","typeGroupValidators","uniqueItems","runOps","ANY_OPS","ARRAY_OPS","NUMERIC_OPS","OBJECT_OPS","STRING_OPS","validateAny","ctx","shouldPop","DOMAIN$7","numeric","unsetter","track","makeDescriptor","applyDefaults","hasSet","orig","keyPath","originalGet","error","current","changing","clearTimeout","setTimeout","changeRecord","timestamp","originalSet","_copy","applyDefaultsHooks","validatingHooks","makeNotify","getSchema","toProcess","originalExistingOnly","notify","notify2","count","defaults","destroyAll","find","findAll","sum","update","adapterArgs","beforeAssign","updateAll","updateMany","defaultAdapter","afterCount","afterCreate","afterCreateMany","afterDestroy","afterDestroyAll","afterFind","afterFindAll","afterSum","afterUpdate","afterUpdateAll","afterUpdateMany","beforeCreate","beforeCreateMany","beforeCount","beforeDestroy","beforeDestroyAll","beforeFind","beforeFindAll","beforeSum","beforeUpdate","beforeUpdateAll","beforeUpdateMany","_end","_data","wrap","belongsTo$$1","crud","originalRecord","parentRelationMap","adapterResponse","_runHook","_createParentRecordIfRequired","relationMap","_invokeAdapterMethod","createdProps","_createOrAssignChildRecordIfRequired","originalProps","_commitChanges","recordOrRecords","newValues","createInstance","context","parent","originalRecords","belongsToRelationData","Boolean","createdRecordsData","belongsToData","createdRecordData","RecordCtor","method","_this6","config","upper","before","after","_getAdapter","getAdapter","_result","getAdapters","hasMany$$1","hasOne$$1","registerAdapter","default","hookName","hookArgs","defaultValueIndex","overridenResult","propsOrRecords","_this7","conversionOptions","pass","_this8","_opts","_record","some","defineRelations","_this9","_name","getMapperByName","getMapper","proxiedMapperMethods","_onMapperEvent","as","original","defineMapper","DOMAIN$5","defineResource","warn","_getMapper","proxiedCollectionMethods","ownMethodsForScoping","cachedFn","hashOrId","cached","usePendingFind","usePendingFindAll","props$2","addToCache","_onCollectionEvent","cachedFind","cachedFindAll","cacheFind","cacheFindAll","hash","self","collectionOpts","indexed","hashQuery","eject","ejectAll","pendingQuery","force","DOMAIN$8","inject","removeRelated","_this10","_this11","_this12","_this13","_getCollection","_addMeta","_clearMeta","event","unlinkOnDestroy","props$1","updateOpts","relatedIdAttribute","foreignKeyDescriptor","currentParentId","storeRecord","inverseLocalField","toLink","toLinkIds","currentChildrenOfParent","parents","origGet","origSet","DataStore$1","version","full","major","minor","patch","belongsToType","hasManyType","hasOneType"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index e6983000..2e367827 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "mocha": "mocha --recursive -t 20000 -R dot -r babel-core/register -r babel-polyfill", "cover": "nyc --require babel-core/register --require babel-polyfill --cache mocha --recursive -t 20000 -R dot && nyc report --reporter=html", "test": "npm run build && npm run cover && npm run karma", - "release": "npm test && npm run doc && repo-tools updates && repo-tools changelog && repo-tools authors" + "release": "npm test && repo-tools changelog && repo-tools authors" }, "devDependencies": { "babel-core": "6.26.0",