Socket
Socket
Sign inDemoInstall

redux-orm

Package Overview
Dependencies
Maintainers
1
Versions
70
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

redux-orm - npm Package Compare versions

Comparing version 0.7.0 to 0.8.0

.babelrc

211

lib/Backend.js
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _assign = require('babel-runtime/core-js/object/assign');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _assign2 = _interopRequireDefault(_assign);
var _lodashCollectionFind = require('lodash/collection/find');
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _lodashCollectionFind2 = _interopRequireDefault(_lodashCollectionFind);
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _lodashObjectOmit = require('lodash/object/omit');
var _createClass2 = require('babel-runtime/helpers/createClass');
var _lodashObjectOmit2 = _interopRequireDefault(_lodashObjectOmit);
var _createClass3 = _interopRequireDefault(_createClass2);
var _utils = require('./utils');
var _immutableOps = require('immutable-ops');
var _immutableOps2 = _interopRequireDefault(_immutableOps);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var globalOps = (0, _immutableOps2.default)();
/**
* Handles the underlying data structure for a {@link Model} class.
*/
var Backend = (function () {
var Backend = function () {
/**

@@ -33,9 +41,5 @@ * Creates a new {@link Backend} instance.

* @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.
* @param {Boolean} [userOpts.indexById=true] - a boolean indicating if the entities
* should be indexed by `idAttribute`.
* @param {string} [userOpts.arrName=items] - the state attribute where an array of
* either entity id's (if `indexById === true`)
* or the entity objects are stored.
* @param {string} [userOpts.mapName=itemsById] - if `indexById === true`, the state
* attribute where the entity objects
* entity id's are stored
* @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects
* are stored in a id to entity object

@@ -49,7 +53,6 @@ * map.

function Backend(userOpts) {
_classCallCheck(this, Backend);
(0, _classCallCheck3.default)(this, Backend);
var defaultOpts = {
idAttribute: 'id',
indexById: true,
arrName: 'items',

@@ -60,3 +63,3 @@ mapName: 'itemsById',

Object.assign(this, defaultOpts, userOpts);
(0, _assign2.default)(this, defaultOpts, userOpts);
}

@@ -74,10 +77,7 @@

_createClass(Backend, [{
(0, _createClass3.default)(Backend, [{
key: 'accessId',
value: function accessId(branch, id) {
if (this.indexById) {
return branch[this.mapName][id];
}
return (0, _lodashCollectionFind2['default'])(branch[this.arrName], _defineProperty({}, this.idAttribute, id));
return branch[this.mapName][id];
}

@@ -89,2 +89,17 @@ }, {

}
}, {
key: 'getOps',
value: function getOps(tx) {
if (!tx) {
return globalOps;
}
if (!tx.meta.hasOwnProperty('ops')) {
tx.meta.ops = (0, _immutableOps2.default)();
tx.meta.ops.open();
tx.onClose(function (_tx) {
_tx.meta.ops.close();
});
}
return tx.meta.ops;
}

@@ -98,2 +113,3 @@ /**

*/
}, {

@@ -104,9 +120,5 @@ key: 'iterator',

if (this.indexById) {
return new _utils.ListIterator(branch[this.arrName], 0, function (list, idx) {
return branch[_this.mapName][list[idx]];
});
}
return new _utils.ListIterator(branch[this.arrName], 0);
return new _utils.ListIterator(branch[this.arrName], 0, function (list, idx) {
return branch[_this.mapName][list[idx]];
});
}

@@ -120,3 +132,3 @@ }, {

var obj = _this2.accessId(branch, id);
return Object.assign(_defineProperty({}, _this2.idAttribute, id), obj);
return (0, _assign2.default)((0, _defineProperty3.default)({}, _this2.idAttribute, id), obj);
});

@@ -129,12 +141,9 @@ }

*/
}, {
key: 'getDefaultState',
value: function getDefaultState() {
if (this.indexById) {
var _ref;
var _ref;
return _ref = {}, _defineProperty(_ref, this.arrName, []), _defineProperty(_ref, this.mapName, {}), _ref;
}
return _defineProperty({}, this.arrName, []);
return _ref = {}, (0, _defineProperty3.default)(_ref, this.arrName, []), (0, _defineProperty3.default)(_ref, this.mapName, {}), _ref;
}

@@ -144,2 +153,3 @@

* Returns the data structure including a new object `entry`
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -149,25 +159,18 @@ * @param {Object} entry - the object to insert

*/
}, {
key: 'insert',
value: function insert(branch, entry) {
if (this.indexById) {
var _ref3;
value: function insert(tx, branch, entry) {
var _ops$merge2;
var id = entry[this.idAttribute];
var ops = this.getOps(tx);
var id = entry[this.idAttribute];
if (this.withMutations) {
branch[this.arrName].push(id);
branch[this.mapName][id] = entry;
return branch;
}
return _ref3 = {}, _defineProperty(_ref3, this.arrName, branch[this.arrName].concat(id)), _defineProperty(_ref3, this.mapName, Object.assign({}, branch[this.mapName], _defineProperty({}, id, entry))), _ref3;
}
if (this.withMutations) {
branch[this.arrName].push(entry);
ops.mutable.push(id, branch[this.arrName]);
ops.mutable.set(id, entry, branch[this.mapName]);
return branch;
}
return _defineProperty({}, this.arrName, branch[this.arrName].concat(entry));
return ops.merge((_ops$merge2 = {}, (0, _defineProperty3.default)(_ops$merge2, this.arrName, ops.push(id, branch[this.arrName])), (0, _defineProperty3.default)(_ops$merge2, this.mapName, ops.merge((0, _defineProperty3.default)({}, id, entry), branch[this.mapName])), _ops$merge2), branch);
}

@@ -179,2 +182,3 @@

*
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -186,56 +190,25 @@ * @param {Array} idArr - the id's of the objects to update

*/
}, {
key: 'update',
value: function update(branch, idArr, mergeObj) {
value: function update(tx, branch, idArr, mergeObj) {
var _this3 = this;
var returnBranch = this.withMutations ? branch : {};
var ops = this.getOps(tx);
var arrName = this.arrName;
var mapName = this.mapName;
var idAttribute = this.idAttribute;
var mapFunction = function mapFunction(entity) {
var assignTo = _this3.withMutations ? entity : {};
var diff = (0, _utils.objectDiff)(entity, mergeObj);
if (diff) {
return Object.assign(assignTo, entity, mergeObj);
}
return entity;
var merge = _this3.withMutations ? ops.mutable.merge : ops.merge;
return merge(mergeObj, entity);
};
if (this.indexById) {
if (!this.withMutations) {
returnBranch[mapName] = Object.assign({}, branch[mapName]);
returnBranch[arrName] = branch[arrName];
}
var set = this.withMutations ? ops.mutable.set : ops.set;
var updatedMap = {};
idArr.reduce(function (map, id) {
var result = mapFunction(branch[mapName][id]);
if (result !== branch[mapName][id]) map[id] = result;
return map;
}, updatedMap);
var diff = (0, _utils.objectDiff)(returnBranch[mapName], updatedMap);
if (diff) {
Object.assign(returnBranch[mapName], diff);
} else {
return branch;
}
return returnBranch;
}
var updated = false;
returnBranch[arrName] = branch[arrName].map(function (entity) {
if (idArr.includes(entity[idAttribute])) {
var result = mapFunction(entity);
if (entity !== result) {
updated = true;
}
return mapFunction(entity);
}
return entity;
});
return updated ? returnBranch : branch;
var newMap = idArr.reduce(function (map, id) {
var result = mapFunction(branch[mapName][id]);
return set(id, result, map);
}, branch[mapName]);
return ops.set(mapName, newMap, branch);
}

@@ -245,2 +218,3 @@

* Returns the data structure without objects with their id included in `idsToDelete`.
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -250,35 +224,22 @@ * @param {Array} idsToDelete - the ids to delete from the data structure

*/
}, {
key: 'delete',
value: function _delete(branch, idsToDelete) {
value: function _delete(tx, branch, idsToDelete) {
var _ops$merge3;
var ops = this.getOps(tx);
var arrName = this.arrName;
var mapName = this.mapName;
var idAttribute = this.idAttribute;
var arr = branch[arrName];
if (this.indexById) {
var _ref5;
if (this.withMutations) {
idsToDelete.forEach(function (id) {
var idx = arr.indexOf(id);
if (idx !== -1) {
arr.splice(idx, 1);
}
delete branch[mapName][id];
});
return branch;
}
return _ref5 = {}, _defineProperty(_ref5, arrName, branch[arrName].filter(function (id) {
return !idsToDelete.includes(id);
})), _defineProperty(_ref5, mapName, (0, _lodashObjectOmit2['default'])(branch[mapName], idsToDelete)), _ref5;
}
if (this.withMutations) {
idsToDelete.forEach(function (id) {
var idx = arr.indexOf(id);
if (idx === -1) {
arr.splice(idx, 1);
if (idx !== -1) {
ops.mutable.splice(idx, 1, [], arr);
}
ops.mutable.omit(id, branch[mapName]);
});

@@ -288,12 +249,10 @@ return branch;

return _defineProperty({}, arrName, arr.filter(function (entity) {
return !idsToDelete.includes(entity[idAttribute]);
}));
return ops.merge((_ops$merge3 = {}, (0, _defineProperty3.default)(_ops$merge3, arrName, ops.filter(function (id) {
return !(0, _utils.includes)(idsToDelete, id);
}, branch[arrName])), (0, _defineProperty3.default)(_ops$merge3, mapName, ops.omit(idsToDelete, branch[mapName])), _ops$merge3), branch);
}
}]);
return Backend;
})();
}();
exports['default'] = Backend;
module.exports = exports['default'];
exports.default = Backend;
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var UPDATE = 'REDUX_ORM_UPDATE';
exports.UPDATE = UPDATE;
var DELETE = 'REDUX_ORM_DELETE';
exports.DELETE = DELETE;
var CREATE = 'REDUX_ORM_CREATE';
exports.CREATE = CREATE;
var UPDATE = exports.UPDATE = 'REDUX_ORM_UPDATE';
var DELETE = exports.DELETE = 'REDUX_ORM_DELETE';
var CREATE = exports.CREATE = 'REDUX_ORM_CREATE';
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.manyToManyDescriptor = exports.backwardManyToOneDescriptor = exports.backwardOneToOneDescriptor = exports.forwardOneToOneDescriptor = exports.forwardManyToOneDescriptor = undefined;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _lodashArrayDifference = require('lodash/array/difference');
var _difference = require('lodash/difference');
var _lodashArrayDifference2 = _interopRequireDefault(_lodashArrayDifference);
var _difference2 = _interopRequireDefault(_difference);

@@ -21,2 +22,4 @@ var _constants = require('./constants');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Forwards side a Foreign Key: returns one object.

@@ -39,3 +42,3 @@ // Also works as forwardsOneToOneDescriptor.

var thisId = this.getId();
var toId = undefined;
var toId = void 0;
if (value instanceof declaredToModel) {

@@ -48,6 +51,6 @@ toId = value.getId();

this.getClass().addUpdate({
type: _constants2['default'],
type: _constants2.default,
payload: {
idArr: [thisId],
updater: _defineProperty({}, fieldName, toId)
updater: (0, _defineProperty3.default)({}, fieldName, toId)
}

@@ -67,5 +70,5 @@ });

var thisId = this.getId();
var found = undefined;
var found = void 0;
try {
found = declaredFromModel.get(_defineProperty({}, declaredFieldName, thisId));
found = declaredFromModel.get((0, _defineProperty3.default)({}, declaredFieldName, thisId));
} catch (e) {

@@ -89,3 +92,3 @@ return null;

var thisId = this.getId();
return declaredFromModel.filter(_defineProperty({}, declaredFieldName, thisId));
return declaredFromModel.filter((0, _defineProperty3.default)({}, declaredFieldName, thisId));
},

@@ -135,3 +138,3 @@ set: function set() {

var existingQs = throughQs.withRefs.filter(function (through) {
return idsToAdd.includes(through[filterWithAttr]);
return (0, _utils.includes)(idsToAdd, through[filterWithAttr]);
});

@@ -154,3 +157,3 @@

throughModel.create((_throughModel$create = {}, _defineProperty(_throughModel$create, fromFieldName, thisId), _defineProperty(_throughModel$create, toFieldName, id), _throughModel$create));
throughModel.create((_throughModel$create = {}, (0, _defineProperty3.default)(_throughModel$create, fromFieldName, thisId), (0, _defineProperty3.default)(_throughModel$create, toFieldName, id), _throughModel$create));
});

@@ -160,3 +163,3 @@ };

qs.clear = function clear() {
throughQs['delete']();
throughQs.delete();
};

@@ -173,3 +176,3 @@

var entitiesToDelete = throughQs.withRefs.filter(function (through) {
return idsToRemove.includes(through[attrInIdsToRemove]);
return (0, _utils.includes)(idsToRemove, through[attrInIdsToRemove]);
});

@@ -182,3 +185,3 @@

});
var unexistingIds = (0, _lodashArrayDifference2['default'])(idsToRemove, entitiesToDeleteIds);
var unexistingIds = (0, _difference2.default)(idsToRemove, entitiesToDeleteIds);

@@ -192,3 +195,3 @@ var toDeleteModel = reverse ? declaredFromModel.modelName : declaredToModel.modelName;

entitiesToDelete['delete']();
entitiesToDelete.delete();
};

@@ -198,3 +201,2 @@

},
set: function set() {

@@ -201,0 +203,0 @@ throw new Error('Tried setting a M2M field. Please use the related QuerySet methods add and remove.');

@@ -6,6 +6,20 @@ "use strict";

});
var _bind = Function.prototype.bind;
exports.OneToOne = exports.ManyToMany = exports.ForeignKey = undefined;
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
exports.fk = fk;

@@ -15,8 +29,6 @@ exports.many = many;

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Field = function Field(toModelName, relatedName) {
_classCallCheck(this, Field);
(0, _classCallCheck3.default)(this, Field);

@@ -27,40 +39,33 @@ this.toModelName = toModelName;

var ForeignKey = (function (_Field) {
_inherits(ForeignKey, _Field);
var ForeignKey = exports.ForeignKey = function (_Field) {
(0, _inherits3.default)(ForeignKey, _Field);
function ForeignKey() {
_classCallCheck(this, ForeignKey);
_get(Object.getPrototypeOf(ForeignKey.prototype), "constructor", this).apply(this, arguments);
(0, _classCallCheck3.default)(this, ForeignKey);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(ForeignKey).apply(this, arguments));
}
return ForeignKey;
})(Field);
exports.ForeignKey = ForeignKey;
var ManyToMany = (function (_Field2) {
_inherits(ManyToMany, _Field2);
}(Field);
var ManyToMany = exports.ManyToMany = function (_Field2) {
(0, _inherits3.default)(ManyToMany, _Field2);
function ManyToMany() {
_classCallCheck(this, ManyToMany);
_get(Object.getPrototypeOf(ManyToMany.prototype), "constructor", this).apply(this, arguments);
(0, _classCallCheck3.default)(this, ManyToMany);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(ManyToMany).apply(this, arguments));
}
return ManyToMany;
})(Field);
exports.ManyToMany = ManyToMany;
var OneToOne = (function (_Field3) {
_inherits(OneToOne, _Field3);
}(Field);
var OneToOne = exports.OneToOne = function (_Field3) {
(0, _inherits3.default)(OneToOne, _Field3);
function OneToOne() {
_classCallCheck(this, OneToOne);
_get(Object.getPrototypeOf(OneToOne.prototype), "constructor", this).apply(this, arguments);
(0, _classCallCheck3.default)(this, OneToOne);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(OneToOne).apply(this, arguments));
}
return OneToOne;
})(Field);
}(Field);
exports.OneToOne = OneToOne;
function fk() {

@@ -71,3 +76,3 @@ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {

return new (_bind.apply(ForeignKey, [null].concat(args)))();
return new (Function.prototype.bind.apply(ForeignKey, [null].concat(args)))();
}

@@ -80,3 +85,3 @@

return new (_bind.apply(ManyToMany, [null].concat(args)))();
return new (Function.prototype.bind.apply(ManyToMany, [null].concat(args)))();
}

@@ -89,3 +94,3 @@

return new (_bind.apply(OneToOne, [null].concat(args)))();
return new (Function.prototype.bind.apply(OneToOne, [null].concat(args)))();
}
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.oneToOne = exports.many = exports.fk = exports.OneToOne = exports.ManyToMany = exports.ForeignKey = exports.Session = exports.Schema = exports.Model = exports.Backend = exports.QuerySet = undefined;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _QuerySet = require('./QuerySet');

@@ -31,7 +30,9 @@

exports.QuerySet = _QuerySet2['default'];
exports.Backend = _Backend2['default'];
exports.Model = _Model2['default'];
exports.Schema = _Schema2['default'];
exports.Session = _Session2['default'];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.QuerySet = _QuerySet2.default;
exports.Backend = _Backend2.default;
exports.Model = _Model2.default;
exports.Schema = _Schema2.default;
exports.Session = _Session2.default;
exports.ForeignKey = _fields.ForeignKey;

@@ -43,2 +44,2 @@ exports.ManyToMany = _fields.ManyToMany;

exports.oneToOne = _fields.oneToOne;
exports['default'] = _Model2['default'];
exports.default = _Model2.default;
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
exports.eqCheck = eqCheck;
exports.memoize = memoize;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _values = require('lodash/values');
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
var _values2 = _interopRequireDefault(_values);
var _lodashObjectValues = require('lodash/object/values');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _lodashObjectValues2 = _interopRequireDefault(_lodashObjectValues);
function eqCheck(a, b) {

@@ -22,3 +25,3 @@ return a === b;

function shouldRun(invalidatorMap, state) {
return (0, _lodashObjectValues2['default'])(invalidatorMap).some(function (invalidate) {
return (0, _values2.default)(invalidatorMap).some(function (invalidate) {
return invalidate(state);

@@ -66,6 +69,6 @@ });

*/
function memoize(func) {
var equalityCheck = arguments.length <= 1 || arguments[1] === undefined ? eqCheck : arguments[1];
var modelSchema = arguments[2];
function memoize(func, equalityCheck, modelSchema) {
if (equalityCheck === undefined) equalityCheck = eqCheck;
var lastOrmState = null;

@@ -84,2 +87,3 @@ var lastResult = null;

var ormIsEqual = lastOrmState === ormState || !shouldRun(modelNameToInvalidatorMap, ormState);

@@ -96,4 +100,4 @@

var session = modelSchema.from(ormState);
var newArgs = [session].concat(_toConsumableArray(otherArgs));
var result = func.apply(undefined, _toConsumableArray(newArgs));
var newArgs = [session].concat((0, _toConsumableArray3.default)(otherArgs));
var result = func.apply(undefined, (0, _toConsumableArray3.default)(newArgs));

@@ -100,0 +104,0 @@ // If a selector has control flow branching, different

'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _defineProperty4 = require('babel-runtime/core-js/object/define-property');
var _lodashObjectForOwn = require('lodash/object/forOwn');
var _defineProperty5 = _interopRequireDefault(_defineProperty4);
var _lodashObjectForOwn2 = _interopRequireDefault(_lodashObjectForOwn);
var _assign = require('babel-runtime/core-js/object/assign');
var _lodashLangIsArray = require('lodash/lang/isArray');
var _assign2 = _interopRequireDefault(_assign);
var _lodashLangIsArray2 = _interopRequireDefault(_lodashLangIsArray);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _lodashArrayUniq = require('lodash/array/uniq');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _lodashArrayUniq2 = _interopRequireDefault(_lodashArrayUniq);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _forOwn = require('lodash/forOwn');
var _forOwn2 = _interopRequireDefault(_forOwn);
var _isArray = require('lodash/isArray');
var _isArray2 = _interopRequireDefault(_isArray);
var _uniq = require('lodash/uniq');
var _uniq2 = _interopRequireDefault(_uniq);
var _Session = require('./Session');

@@ -47,2 +61,4 @@

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -61,3 +77,3 @@ * The heart of an ORM, the data model.

*/
var Model = (function () {
var Model = function () {
/**

@@ -69,3 +85,3 @@ * Creates a Model instance.

function Model(props) {
_classCallCheck(this, Model);
(0, _classCallCheck3.default)(this, Model);

@@ -75,3 +91,3 @@ this._initFields(props);

_createClass(Model, [{
(0, _createClass3.default)(Model, [{
key: '_initFields',

@@ -84,5 +100,5 @@ value: function _initFields(props) {

this._fieldNames = [];
this._fields = Object.assign({}, props);
this._fields = (0, _assign2.default)({}, props);
(0, _lodashObjectForOwn2['default'])(props, function (fieldValue, fieldName) {
(0, _forOwn2.default)(props, function (fieldValue, fieldName) {
_this._fields[fieldName] = fieldValue;

@@ -93,3 +109,3 @@ _this._fieldNames.push(fieldName);

if (!ModelClass.definedProperties[fieldName]) {
Object.defineProperty(_this, fieldName, {
(0, _defineProperty5.default)(_this, fieldName, {
get: function get() {

@@ -111,5 +127,7 @@ return fieldValue;

*/
}, {
key: 'getClass',
/**

@@ -130,2 +148,3 @@ * Gets the {@link Model} class or subclass constructor (the class that

*/
}, {

@@ -143,5 +162,7 @@ key: 'getId',

*/
}, {
key: 'toString',
/**

@@ -170,2 +191,3 @@ * Returns a string representation of the {@link Model} instance.

*/
}, {

@@ -185,6 +207,7 @@ key: 'equals',

*/
}, {
key: 'set',
value: function set(propertyName, value) {
this.update(_defineProperty({}, propertyName, value));
this.update((0, _defineProperty3.default)({}, propertyName, value));
}

@@ -199,2 +222,3 @@

*/
}, {

@@ -204,3 +228,3 @@ key: 'update',

var relFields = this.getClass().fields;
var mergeObj = Object.assign({}, userMergeObj);
var mergeObj = (0, _assign2.default)({}, userMergeObj);

@@ -211,2 +235,3 @@ // If an array of entities or id's is supplied for a

for (var mergeKey in mergeObj) {
// eslint-disable-line no-restricted-syntax
if (relFields.hasOwnProperty(mergeKey)) {

@@ -221,3 +246,3 @@ var field = relFields[mergeKey];

if (diffActions) {
var idsToDelete = diffActions['delete'];
var idsToDelete = diffActions.delete;
var idsToAdd = diffActions.add;

@@ -228,3 +253,3 @@

(_mergeKey = this[mergeKey]).remove.apply(_mergeKey, _toConsumableArray(idsToDelete));
(_mergeKey = this[mergeKey]).remove.apply(_mergeKey, (0, _toConsumableArray3.default)(idsToDelete));
}

@@ -234,3 +259,3 @@ if (idsToAdd.length > 0) {

(_mergeKey2 = this[mergeKey]).add.apply(_mergeKey2, _toConsumableArray(idsToAdd));
(_mergeKey2 = this[mergeKey]).add.apply(_mergeKey2, (0, _toConsumableArray3.default)(idsToAdd));
}

@@ -247,3 +272,3 @@ }

if (session && session.withMutations) {
this._initFields(Object.assign({}, this._fields, mergeObj));
this._initFields((0, _assign2.default)({}, this._fields, mergeObj));
}

@@ -264,2 +289,3 @@

*/
}, {

@@ -287,3 +313,3 @@ key: 'delete',

if (relatedQs.exists()) {
relatedQs.update(_defineProperty({}, field.relatedName, null));
relatedQs.update((0, _defineProperty3.default)({}, field.relatedName, null));
}

@@ -319,2 +345,3 @@ } else if (field instanceof _fields.OneToOne) {

*/
}, {

@@ -341,6 +368,7 @@ key: 'backend',

*/
}, {
key: 'getBackendClass',
value: function getBackendClass() {
return _Backend2['default'];
return _Backend2.default;
}

@@ -350,2 +378,3 @@ }, {

/**

@@ -381,8 +410,12 @@ * Gets the {@link Backend} instance linked to this {@link Model}.

* @private
* @param {Transction} tx - the current Transaction instance
* @return {Object} The next state.
*/
}, {
key: 'getNextState',
value: function getNextState() {
var state = undefined;
value: function getNextState(_tx) {
var tx = _tx || this.session.currentTx;
var state = void 0;
if (this._sessionData.hasOwnProperty('nextState')) {

@@ -394,7 +427,8 @@ state = this._sessionData.nextState;

var updates = this.session.getUpdatesFor(this);
var updates = tx.getUpdatesFor(this);
if (updates.length > 0) {
var nextState = updates.reduce(this.updateReducer.bind(this), state);
var nextState = updates.reduce(this.updateReducer.bind(this, tx), state);
this._sessionData.nextState = nextState;
tx.markApplied(this);
return nextState;

@@ -416,14 +450,14 @@ }

*/
}, {
key: 'updateReducer',
value: function updateReducer(state, action) {
value: function updateReducer(tx, state, action) {
var backend = this.getBackend();
switch (action.type) {
case _constants.CREATE:
return backend.insert(state, action.payload);
return backend.insert(tx, state, action.payload);
case _constants.UPDATE:
return backend.update(state, action.payload.idArr, action.payload.mergeObj);
return backend.update(tx, state, action.payload.idArr, action.payload.mergeObj);
case _constants.DELETE:
return backend['delete'](state, action.payload);
return backend.delete(tx, state, action.payload);
default:

@@ -444,2 +478,3 @@ return state;

*/
}, {

@@ -449,3 +484,3 @@ key: 'reducer',

// eslint-disable-line
return model.getNextState();
return this.getNextState();
}

@@ -460,2 +495,3 @@

*/
}, {

@@ -478,5 +514,7 @@ key: 'getDefaultState',

*/
}, {
key: 'accessId',
/**

@@ -498,2 +536,3 @@ * A convenience method to call {@link Backend#accessId} from

*/
}, {

@@ -524,6 +563,7 @@ key: 'accessIds',

*/
}, {
key: 'connect',
value: function connect(session) {
if (!session instanceof _Session2['default']) {
if (!session instanceof _Session2.default) {
throw Error('A model can only connect to a Session instance.');

@@ -540,5 +580,7 @@ }

*/
}, {
key: 'addUpdate',
/**

@@ -561,2 +603,3 @@ * A convenience method that delegates to the current {@link Session} instane.

*/
}, {

@@ -570,3 +613,3 @@ key: 'nextId',

} else {
this._sessionData.nextId = Math.max.apply(Math, _toConsumableArray(idArr)) + 1;
this._sessionData.nextId = Math.max.apply(Math, (0, _toConsumableArray3.default)(idArr)) + 1;
}

@@ -597,2 +640,3 @@ }

/**

@@ -612,2 +656,3 @@ * Returns a {@link QuerySet} containing all {@link Model} instances.

*/
}, {

@@ -619,3 +664,3 @@ key: 'create',

var idAttribute = this.idAttribute;
var props = Object.assign({}, userProps);
var props = (0, _assign2.default)({}, userProps);

@@ -635,3 +680,3 @@ if (!props.hasOwnProperty(idAttribute)) {

(0, _lodashObjectForOwn2['default'])(userProps, function (value, key) {
(0, _forOwn2.default)(userProps, function (value, key) {
props[key] = (0, _utils.normalizeEntity)(value);

@@ -641,3 +686,3 @@

// discard them from props and save for later processing.
if ((0, _lodashLangIsArray2['default'])(value)) {
if ((0, _isArray2.default)(value)) {
if (_this3.fields.hasOwnProperty(key) && _this3.fields[key] instanceof _fields.ManyToMany) {

@@ -657,7 +702,7 @@ m2mVals[key] = value;

(0, _lodashObjectForOwn2['default'])(m2mVals, function (value, key) {
(0, _forOwn2.default)(m2mVals, function (value, key) {
var _instance$key;
var ids = value.map(_utils.normalizeEntity);
var uniqueIds = (0, _lodashArrayUniq2['default'])(ids);
var uniqueIds = (0, _uniq2.default)(ids);

@@ -668,3 +713,3 @@ if (ids.length !== uniqueIds.length) {

}
(_instance$key = instance[key]).add.apply(_instance$key, _toConsumableArray(ids));
(_instance$key = instance[key]).add.apply(_instance$key, (0, _toConsumableArray3.default)(ids));
});

@@ -682,2 +727,3 @@

*/
}, {

@@ -704,2 +750,3 @@ key: 'withId',

*/
}, {

@@ -722,2 +769,3 @@ key: 'hasId',

*/
}, {

@@ -785,5 +833,4 @@ key: 'get',

}]);
return Model;
})();
}();

@@ -793,5 +840,4 @@ Model.fields = {};

Model.virtualFields = {};
Model.querySetClass = _QuerySet2['default'];
Model.querySetClass = _QuerySet2.default;
exports['default'] = Model;
module.exports = exports['default'];
exports.default = Model;
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _typeof2 = require('babel-runtime/helpers/typeof');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _typeof3 = _interopRequireDefault(_typeof2);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _assign = require('babel-runtime/core-js/object/assign');
var _lodashCollectionReject = require('lodash/collection/reject');
var _assign2 = _interopRequireDefault(_assign);
var _lodashCollectionReject2 = _interopRequireDefault(_lodashCollectionReject);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _lodashCollectionFilter = require('lodash/collection/filter');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _lodashCollectionFilter2 = _interopRequireDefault(_lodashCollectionFilter);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _lodashObjectMapValues = require('lodash/object/mapValues');
var _createClass3 = _interopRequireDefault(_createClass2);
var _lodashObjectMapValues2 = _interopRequireDefault(_lodashObjectMapValues);
var _reject = require('lodash/reject');
var _lodashCollectionSortByOrder = require('lodash/collection/sortByOrder');
var _reject2 = _interopRequireDefault(_reject);
var _lodashCollectionSortByOrder2 = _interopRequireDefault(_lodashCollectionSortByOrder);
var _filter = require('lodash/filter');
var _filter2 = _interopRequireDefault(_filter);
var _mapValues = require('lodash/mapValues');
var _mapValues2 = _interopRequireDefault(_mapValues);
var _orderBy2 = require('lodash/orderBy');
var _orderBy3 = _interopRequireDefault(_orderBy2);
var _utils = require('./utils');
var _constantsJs = require('./constants.js');
var _constants = require('./constants.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -40,3 +52,3 @@ * A chainable class that keeps track of a list of objects and

*/
var QuerySet = (function () {
var QuerySet = function () {
/**

@@ -51,5 +63,5 @@ * Creates a QuerySet.

function QuerySet(modelClass, idArr, opts) {
_classCallCheck(this, QuerySet);
(0, _classCallCheck3.default)(this, QuerySet);
Object.assign(this, {
(0, _assign2.default)(this, {
modelClass: modelClass,

@@ -72,6 +84,6 @@ idArr: idArr

_createClass(QuerySet, [{
(0, _createClass3.default)(QuerySet, [{
key: '_new',
value: function _new(ids, userOpts) {
var opts = Object.assign({}, this._opts, userOpts);
var opts = (0, _assign2.default)({}, this._opts, userOpts);
return new this.constructor(this.modelClass, ids, opts);

@@ -86,2 +98,3 @@ }

*/
}, {

@@ -92,5 +105,6 @@ key: 'toString',

return 'QuerySet contents: \n - ' + this.idArr.map(function (id) {
var contents = this.idArr.map(function (id) {
return _this.modelClass.withId(id).toString();
}).join('\n - ');
return 'QuerySet contents: \n - ' + contents;
}

@@ -105,2 +119,3 @@

*/
}, {

@@ -120,2 +135,3 @@ key: 'toRefArray',

*/
}, {

@@ -136,2 +152,3 @@ key: 'toModelArray',

*/
}, {

@@ -148,2 +165,3 @@ key: 'count',

*/
}, {

@@ -164,2 +182,3 @@ key: 'exists',

*/
}, {

@@ -178,2 +197,3 @@ key: 'at',

*/
}, {

@@ -189,2 +209,3 @@ key: 'first',

*/
}, {

@@ -200,2 +221,3 @@ key: 'last',

*/
}, {

@@ -213,2 +235,3 @@ key: 'all',

*/
}, {

@@ -226,2 +249,3 @@ key: 'filter',

*/
}, {

@@ -237,6 +261,6 @@ key: 'exclude',

var func = exclude ? _lodashCollectionReject2['default'] : _lodashCollectionFilter2['default'];
var func = exclude ? _reject2.default : _filter2.default;
var lookupObj = _lookupObj;
var operationWithRefs = true;
var entities = undefined;
var entities = void 0;
if (typeof lookupObj === 'function') {

@@ -253,4 +277,4 @@ // For filtering with function,

} else {
if (typeof lookupObj === 'object') {
lookupObj = (0, _lodashObjectMapValues2['default'])(lookupObj, _utils.normalizeEntity);
if ((typeof lookupObj === 'undefined' ? 'undefined' : (0, _typeof3.default)(lookupObj)) === 'object') {
lookupObj = (0, _mapValues2.default)(lookupObj, _utils.normalizeEntity);
}

@@ -283,2 +307,3 @@

*/
}, {

@@ -300,2 +325,3 @@ key: 'forEach',

*/
}, {

@@ -313,3 +339,3 @@ key: 'map',

* Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending
* order, unless otherwise specified. Delegates to `lodash.sortByOrder`.
* order, unless otherwise specified. Delegates to `lodash.orderBy`.
*

@@ -327,2 +353,3 @@ * @param {string[]|Function[]} iteratees - an array where each item can be a string or a

*/
}, {

@@ -353,3 +380,3 @@ key: 'orderBy',

}
var sortedEntities = _lodashCollectionSortByOrder2['default'].call(null, entities, iterateeArgs, orders);
var sortedEntities = _orderBy3.default.call(null, entities, iterateeArgs, orders);
return this._new(sortedEntities.map(function (entity) {

@@ -368,2 +395,3 @@ return entity[_this6.modelClass.idAttribute];

*/
}, {

@@ -373,3 +401,3 @@ key: 'update',

this.modelClass.addUpdate({
type: _constantsJs.UPDATE,
type: _constants.UPDATE,
payload: {

@@ -386,2 +414,3 @@ idArr: this.idArr,

*/
}, {

@@ -391,3 +420,3 @@ key: 'delete',

this.modelClass.addUpdate({
type: _constantsJs.DELETE,
type: _constants.DELETE,
payload: this.idArr

@@ -413,2 +442,3 @@ });

*/
}, {

@@ -426,2 +456,3 @@ key: 'ref',

*/
}, {

@@ -441,9 +472,7 @@ key: 'withModels',

}]);
return QuerySet;
})();
}();
QuerySet.sharedMethods = ['count', 'at', 'all', 'last', 'first', 'forEach', 'exists', 'filter', 'map', 'exclude', 'orderBy', 'update', 'delete', 'ref', 'withRefs', 'withModels'];
exports['default'] = QuerySet;
module.exports = exports['default'];
exports.default = QuerySet;
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _defineProperty2 = require('babel-runtime/core-js/object/define-property');
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _getOwnPropertyDescriptor = require('babel-runtime/core-js/object/get-own-property-descriptor');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var _getOwnPropertyDescriptor2 = _interopRequireDefault(_getOwnPropertyDescriptor);
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _defineProperty4 = require('babel-runtime/helpers/defineProperty');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _defineProperty5 = _interopRequireDefault(_defineProperty4);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _reselect = require('reselect');
var _lodashObjectForOwn = require('lodash/object/forOwn');
var _forOwn = require('lodash/forOwn');
var _lodashObjectForOwn2 = _interopRequireDefault(_lodashObjectForOwn);
var _forOwn2 = _interopRequireDefault(_forOwn);
var _lodashCollectionFind = require('lodash/collection/find');
var _find = require('lodash/find');
var _lodashCollectionFind2 = _interopRequireDefault(_lodashCollectionFind);
var _find2 = _interopRequireDefault(_find);

@@ -45,2 +65,4 @@ var _Session = require('./Session');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -53,3 +75,3 @@ * Schema's responsibility is tracking the set of {@link Model} classes used in the database.

*/
var Schema = (function () {
var Schema = function () {
/**

@@ -60,3 +82,3 @@ * Creates a new Schema.

function Schema() {
_classCallCheck(this, Schema);
(0, _classCallCheck3.default)(this, Schema);

@@ -82,16 +104,16 @@ this.registry = [];

_createClass(Schema, [{
(0, _createClass3.default)(Schema, [{
key: 'define',
value: function define(modelName, relatedFields, reducer, backendOpts) {
var ShortcutDefinedModel = (function (_Model) {
_inherits(ShortcutDefinedModel, _Model);
var ShortcutDefinedModel = function (_Model) {
(0, _inherits3.default)(ShortcutDefinedModel, _Model);
function ShortcutDefinedModel() {
_classCallCheck(this, ShortcutDefinedModel);
_get(Object.getPrototypeOf(ShortcutDefinedModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, ShortcutDefinedModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(ShortcutDefinedModel).apply(this, arguments));
}
return ShortcutDefinedModel;
})(_Model4['default']);
}(_Model4.default);

@@ -121,6 +143,7 @@ ShortcutDefinedModel.modelName = modelName;

*/
}, {
key: 'register',
value: function register() {
var _this = this;
var _this2 = this;

@@ -131,4 +154,4 @@ var models = Array.prototype.slice.call(arguments);

_this.registerManyToManyModelsFor(model);
_this.registry.push(model);
_this2.registerManyToManyModelsFor(model);
_this2.registry.push(model);
});

@@ -139,3 +162,3 @@ }

value: function registerManyToManyModelsFor(model) {
var _this2 = this;
var _this4 = this;

@@ -145,7 +168,7 @@ var fields = model.fields;

(0, _lodashObjectForOwn2['default'])(fields, function (fieldInstance, fieldName) {
(0, _forOwn2.default)(fields, function (fieldInstance, fieldName) {
if (fieldInstance instanceof _fields.ManyToMany) {
var _Through$fields;
var toModelName = undefined;
var toModelName = void 0;
if (fieldInstance.toModelName === 'this') {

@@ -160,20 +183,19 @@ toModelName = thisModelName;

var Through = (function (_Model2) {
_inherits(ThroughModel, _Model2);
var Through = function (_Model2) {
(0, _inherits3.default)(ThroughModel, _Model2);
function ThroughModel() {
_classCallCheck(this, ThroughModel);
_get(Object.getPrototypeOf(ThroughModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, ThroughModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(ThroughModel).apply(this, arguments));
}
return ThroughModel;
})(_Model4['default']);
}(_Model4.default);
Through.modelName = (0, _utils.m2mName)(thisModelName, fieldName);
Through.fields = (_Through$fields = {}, _defineProperty(_Through$fields, fromFieldName, new _fields.ForeignKey(thisModelName)), _defineProperty(_Through$fields, toFieldName, new _fields.ForeignKey(toModelName)), _Through$fields);
Through.fields = (_Through$fields = {}, (0, _defineProperty5.default)(_Through$fields, fromFieldName, new _fields.ForeignKey(thisModelName)), (0, _defineProperty5.default)(_Through$fields, toFieldName, new _fields.ForeignKey(toModelName)), _Through$fields);
Through.invalidateClassCache();
_this2.implicitThroughModels.push(Through);
_this4.implicitThroughModels.push(Through);
}

@@ -189,8 +211,10 @@ });

*/
}, {
key: 'get',
value: function get(modelName) {
var found = (0, _lodashCollectionFind2['default'])(this.registry.concat(this.implicitThroughModels), function (model) {
var found = (0, _find2.default)(this.registry.concat(this.implicitThroughModels), function (model) {
return model.modelName === modelName;
});
if (typeof found === 'undefined') {

@@ -217,3 +241,3 @@ throw new Error('Did not find model ' + modelName + ' from registry.');

value: function _setupModelPrototypes() {
var _this3 = this;
var _this5 = this;

@@ -223,11 +247,11 @@ this.registry.forEach(function (model) {

var fields = model.fields;
(0, _lodashObjectForOwn2['default'])(fields, function (fieldInstance, fieldName) {
var descriptor = Object.getOwnPropertyDescriptor(model.prototype, fieldName);
(0, _forOwn2.default)(fields, function (fieldInstance, fieldName) {
var descriptor = (0, _getOwnPropertyDescriptor2.default)(model.prototype, fieldName);
if (typeof descriptor === 'undefined') {
var toModelName = fieldInstance.toModelName;
var toModel = toModelName === 'this' ? model : _this3.get(toModelName);
var toModel = toModelName === 'this' ? model : _this5.get(toModelName);
if (fieldInstance instanceof _fields.ForeignKey) {
// Forwards.
Object.defineProperty(model.prototype, fieldName, (0, _descriptors.forwardManyToOneDescriptor)(fieldName, toModel.modelName));
(0, _defineProperty3.default)(model.prototype, fieldName, (0, _descriptors.forwardManyToOneDescriptor)(fieldName, toModel.modelName));
model.definedProperties[fieldName] = true;

@@ -243,3 +267,3 @@

Object.defineProperty(toModel.prototype, backwardsFieldName, (0, _descriptors.backwardManyToOneDescriptor)(fieldName, model.modelName));
(0, _defineProperty3.default)(toModel.prototype, backwardsFieldName, (0, _descriptors.backwardManyToOneDescriptor)(fieldName, model.modelName));
toModel.definedProperties[backwardsFieldName] = true;

@@ -252,3 +276,3 @@ toModel.virtualFields[backwardsFieldName] = new _fields.ForeignKey(model.modelName, fieldName);

Object.defineProperty(model.prototype, fieldName, (0, _descriptors.manyToManyDescriptor)(model.modelName, toModel.modelName, throughModelName, false));
(0, _defineProperty3.default)(model.prototype, fieldName, (0, _descriptors.manyToManyDescriptor)(model.modelName, toModel.modelName, throughModelName, false));
model.definedProperties[fieldName] = true;

@@ -258,32 +282,32 @@ model.virtualFields[fieldName] = new _fields.ManyToMany(toModel.modelName, fieldName);

// Backwards.
var backwardsFieldName = fieldInstance.relatedName ? fieldInstance.relatedName : (0, _utils.reverseFieldName)(model.modelName);
var _backwardsFieldName = fieldInstance.relatedName ? fieldInstance.relatedName : (0, _utils.reverseFieldName)(model.modelName);
if (toModel.definedProperties[backwardsFieldName]) {
var errorMsg = (0, _utils.reverseFieldErrorMessage)(model.modelName, fieldName, toModel.modelName, backwardsFieldName);
throw new Error(errorMsg);
if (toModel.definedProperties[_backwardsFieldName]) {
var _errorMsg = (0, _utils.reverseFieldErrorMessage)(model.modelName, fieldName, toModel.modelName, _backwardsFieldName);
throw new Error(_errorMsg);
}
Object.defineProperty(toModel.prototype, backwardsFieldName, (0, _descriptors.manyToManyDescriptor)(model.modelName, toModel.modelName, throughModelName, true));
toModel.definedProperties[backwardsFieldName] = true;
toModel.virtualFields[backwardsFieldName] = new _fields.ManyToMany(model.modelName, fieldName);
(0, _defineProperty3.default)(toModel.prototype, _backwardsFieldName, (0, _descriptors.manyToManyDescriptor)(model.modelName, toModel.modelName, throughModelName, true));
toModel.definedProperties[_backwardsFieldName] = true;
toModel.virtualFields[_backwardsFieldName] = new _fields.ManyToMany(model.modelName, fieldName);
} else if (fieldInstance instanceof _fields.OneToOne) {
// Forwards.
Object.defineProperty(model.prototype, fieldName, (0, _descriptors.forwardOneToOneDescriptor)(fieldName, toModel.modelName));
(0, _defineProperty3.default)(model.prototype, fieldName, (0, _descriptors.forwardOneToOneDescriptor)(fieldName, toModel.modelName));
model.definedProperties[fieldName] = true;
// Backwards.
var backwardsFieldName = fieldInstance.relatedName ? fieldInstance.relatedName : model.modelName.toLowerCase();
var _backwardsFieldName2 = fieldInstance.relatedName ? fieldInstance.relatedName : model.modelName.toLowerCase();
if (toModel.definedProperties[backwardsFieldName]) {
var errorMsg = (0, _utils.reverseFieldErrorMessage)(model.modelName, fieldName, toModel.modelName, backwardsFieldName);
throw new Error(errorMsg);
if (toModel.definedProperties[_backwardsFieldName2]) {
var _errorMsg2 = (0, _utils.reverseFieldErrorMessage)(model.modelName, fieldName, toModel.modelName, _backwardsFieldName2);
throw new Error(_errorMsg2);
}
Object.defineProperty(toModel.prototype, backwardsFieldName, (0, _descriptors.backwardOneToOneDescriptor)(fieldName, model.modelName));
toModel.definedProperties[backwardsFieldName] = true;
toModel.virtualFields[backwardsFieldName] = new _fields.OneToOne(model.modelName, fieldName);
(0, _defineProperty3.default)(toModel.prototype, _backwardsFieldName2, (0, _descriptors.backwardOneToOneDescriptor)(fieldName, model.modelName));
toModel.definedProperties[_backwardsFieldName2] = true;
toModel.virtualFields[_backwardsFieldName2] = new _fields.OneToOne(model.modelName, fieldName);
}
}
});
_this3._attachQuerySetMethods(model);
_this5._attachQuerySetMethods(model);
model.isSetUp = true;

@@ -295,10 +319,10 @@ }

if (!model.isSetUp) {
(0, _lodashObjectForOwn2['default'])(model.fields, function (fieldInstance, fieldName) {
(0, _forOwn2.default)(model.fields, function (fieldInstance, fieldName) {
var toModelName = fieldInstance.toModelName;
var toModel = toModelName === 'this' ? model : _this3.get(toModelName);
var toModel = toModelName === 'this' ? model : _this5.get(toModelName);
// Only Forwards.
Object.defineProperty(model.prototype, fieldName, (0, _descriptors.forwardManyToOneDescriptor)(fieldName, toModel.modelName));
(0, _defineProperty3.default)(model.prototype, fieldName, (0, _descriptors.forwardManyToOneDescriptor)(fieldName, toModel.modelName));
model.definedProperties[fieldName] = true;
});
_this3._attachQuerySetMethods(model);
_this5._attachQuerySetMethods(model);
model.isSetUp = true;

@@ -313,2 +337,3 @@ }

*/
}, {

@@ -332,6 +357,7 @@ key: 'getDefaultState',

*/
}, {
key: 'from',
value: function from(state, action) {
return new _Session2['default'](this, state, action);
return new _Session2.default(this, state, action);
}

@@ -346,6 +372,7 @@

*/
}, {
key: 'withMutations',
value: function withMutations(state, action) {
return new _Session2['default'](this, state, action, true);
return new _Session2.default(this, state, action, true);
}

@@ -369,9 +396,10 @@

*/
}, {
key: 'reducer',
value: function reducer() {
var _this4 = this;
var _this6 = this;
return function (state, action) {
return _this4.from(state, action).reduce();
return _this6.from(state, action).reduce();
};

@@ -419,20 +447,15 @@ }

*/
}, {
key: 'createSelector',
value: function createSelector() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
if (arguments.length === 1) {
return (0, _memoize.memoize)(arguments.length <= 0 ? undefined : arguments[0], _memoize.eqCheck, this);
}
if (args.length === 1) {
return (0, _memoize.memoize)(args[0], _memoize.eqCheck, this);
}
return this.selectorCreator.apply(this, args);
return this.selectorCreator.apply(this, arguments);
}
}]);
return Schema;
})();
}();
exports['default'] = Schema;
module.exports = exports['default'];
exports.default = Schema;
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
var _defineProperty = require('babel-runtime/core-js/object/define-property');
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _defineProperty2 = _interopRequireDefault(_defineProperty);
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _lodashCollectionPartition = require('lodash/collection/partition');
var _inherits2 = require('babel-runtime/helpers/inherits');
var _lodashCollectionPartition2 = _interopRequireDefault(_lodashCollectionPartition);
var _inherits3 = _interopRequireDefault(_inherits2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _Transaction = require('./Transaction');
var _Transaction2 = _interopRequireDefault(_Transaction);
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -27,3 +43,3 @@ * Session handles a single

*/
var Session = (function () {
var Session = function () {
/**

@@ -40,5 +56,5 @@ * Creates a new Session.

function Session(schema, state, action, withMutations) {
var _this = this;
var _this2 = this;
_classCallCheck(this, Session);
(0, _classCallCheck3.default)(this, Session);

@@ -50,3 +66,3 @@ this.schema = schema;

this.updates = [];
this.currentTx = new _Transaction2.default();

@@ -59,14 +75,13 @@ this._accessedModels = {};

this.sessionBoundModels = this.models.map(function (modelClass) {
var sessionBoundModel = (function (_modelClass) {
_inherits(SessionBoundModel, _modelClass);
var sessionBoundModel = function (_modelClass) {
(0, _inherits3.default)(SessionBoundModel, _modelClass);
function SessionBoundModel() {
_classCallCheck(this, SessionBoundModel);
_get(Object.getPrototypeOf(SessionBoundModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, SessionBoundModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(SessionBoundModel).apply(this, arguments));
}
return SessionBoundModel;
})(modelClass);
Object.defineProperty(_this, modelClass.modelName, {
}(modelClass);
(0, _defineProperty2.default)(_this2, modelClass.modelName, {
get: function get() {

@@ -77,3 +92,3 @@ return sessionBoundModel;

sessionBoundModel.connect(_this);
sessionBoundModel.connect(_this2);
return sessionBoundModel;

@@ -83,3 +98,3 @@ });

_createClass(Session, [{
(0, _createClass3.default)(Session, [{
key: 'markAccessed',

@@ -108,2 +123,3 @@ value: function markAccessed(model) {

*/
}, {

@@ -118,30 +134,16 @@ key: 'addUpdate',

// will mutate the model state.
this[modelName].updateReducer(modelState, update);
this[modelName].updateReducer(null, modelState, update);
} else {
this.updates.push(update);
this.currentTx.addUpdate(update);
}
}
/**
* Gets the recorded updates for `modelClass` and
* deletes them from the {@link Session} instance updates list.
*
* @private
* @param {Model} modelClass - the model class to get updates for
* @return {Object[]} A list of the user-recorded updates for `modelClass`.
*/
}, {
key: 'getUpdatesFor',
value: function getUpdatesFor(modelClass) {
var _partition = (0, _lodashCollectionPartition2['default'])(this.updates, 'meta.name', modelClass.modelName);
value: function getUpdatesFor(modelName) {
return this.currentTx.getUpdatesFor(modelName);
}
}, {
key: 'getState',
var _partition2 = _slicedToArray(_partition, 2);
var updates = _partition2[0];
var other = _partition2[1];
this.updates = other;
return updates;
}
/**

@@ -154,4 +156,2 @@ * Returns the current state for a model with name `modelName`.

*/
}, {
key: 'getState',
value: function getState(modelName) {

@@ -170,6 +170,7 @@ return this.state[modelName];

*/
}, {
key: 'getNextState',
value: function getNextState(userOpts) {
var _this2 = this;
var _this3 = this;

@@ -187,56 +188,36 @@ if (this.withMutations) return this.state;

var nextState = this.sessionBoundModels.reduce(function (_nextState, modelClass) {
var modelState = _this2.getState(modelClass.modelName);
var tx = this.currentTx;
_utils.ops.open();
var nextModelState = undefined;
var nextState = prevState;
if (runReducers) {
nextState = this.sessionBoundModels.reduce(function (_nextState, modelClass) {
var modelState = _this3.getState(modelClass.modelName);
if (runReducers) {
nextModelState = modelClass.reducer(modelState, action, modelClass, _this2);
}
var returnValue = modelClass.reducer(modelState, action, modelClass, _this3);
if (typeof returnValue === 'undefined') {
returnValue = modelClass.getNextState(tx);
}
return _utils.ops.set(modelClass.modelName, returnValue, _nextState);
}, nextState);
}
if (typeof nextModelState === 'undefined') {
// If the reducer wasn't run or it didn't
// return the next state,
// we get the next state manually.
nextModelState = modelClass.getNextState();
}
if (nextModelState !== prevState[modelClass.modelName]) {
if (_nextState === prevState) {
// We know that something has changed, so we cannot
// return the previous state. Switching this reduce function
// to use a shallowcopied version of the previous state.
var prevStateCopied = Object.assign({}, prevState);
prevStateCopied[modelClass.modelName] = nextModelState;
return prevStateCopied;
// There might be some m2m updates left.
var unappliedUpdates = this.currentTx.getUnappliedUpdatesByModel();
if (unappliedUpdates) {
nextState = this.sessionBoundModels.reduce(function (_nextState, modelClass) {
var modelName = modelClass.modelName;
if (!unappliedUpdates.hasOwnProperty(modelName)) {
return _nextState;
}
_nextState[modelClass.modelName] = nextModelState;
}
return _nextState;
}, prevState);
// The remaining updates are for M2M tables.
var finalState = nextState;
if (this.updates.length > 0) {
if (finalState === prevState) {
// If we're still working with the previous state,
// shallow copy it since we have updates for sure now.
finalState = Object.assign({}, prevState);
}
finalState = this.updates.reduce(function (state, update) {
var modelName = update.meta.name;
state[modelName] = _this2[modelName].getNextState();
return state;
}, finalState);
} else {
finalState = nextState;
return _utils.ops.set(modelName, modelClass.getNextState(tx), _nextState);
}, nextState);
}
this.updates = [];
_utils.ops.close();
tx.close();
this.currentTx = new _Transaction2.default();
return finalState;
return nextState;
}

@@ -251,2 +232,3 @@

*/
}, {

@@ -260,6 +242,6 @@ key: 'reduce',

get: function get() {
var _this3 = this;
var _this4 = this;
return this.sessionBoundModels.filter(function (model) {
return !!_this3.getDataForModel(model.modelName).accessed;
return !!_this4.getDataForModel(model.modelName).accessed;
}).map(function (model) {

@@ -269,8 +251,13 @@ return model.modelName;

}
}, {
key: 'updates',
get: function get() {
return this.currentTx.updates.map(function (update) {
return update.update;
});
}
}]);
return Session;
})();
}();
exports['default'] = Session;
module.exports = exports['default'];
exports.default = Session;
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _chai = require('chai');

@@ -19,5 +17,8 @@

_chai2['default'].use(_sinonChai2['default']);
var expect = _chai2['default'].expect;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_sinonChai2.default);
var expect = _chai2.default.expect;
describe('Backend', function () {

@@ -42,3 +43,5 @@ describe('prototype methods', function () {

};
var backend = new _Backend2['default']();
var mockTx = { meta: {}, onClose: function onClose() {}
};
var backend = new _Backend2.default();

@@ -79,3 +82,3 @@ it('correctly accesses an id', function () {

var entry = { id: 3, data: 'newdata!' };
var newState = backend.insert(state, entry);
var newState = backend.insert(mockTx, state, entry);

@@ -107,3 +110,3 @@ expect(newState).to.not.equal(state);

var idsToUpdate = [1, 2];
var newState = backend.update(state, idsToUpdate, toMergeObj);
var newState = backend.update(mockTx, state, idsToUpdate, toMergeObj);

@@ -130,3 +133,3 @@ expect(newState).to.not.equal(state);

var idsToDelete = [1, 2];
var newState = backend['delete'](state, idsToDelete);
var newState = backend.delete(mockTx, state, idsToDelete);

@@ -133,0 +136,0 @@ expect(newState).to.not.equal(state);

'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _chai = require('chai');
var _Model2 = require('../Model');
var _Model3 = _interopRequireDefault(_Model2);
var _QuerySet = require('../QuerySet');

@@ -11,2 +33,6 @@

var _Schema = require('../Schema');
var _Schema2 = _interopRequireDefault(_Schema);
var _utils = require('./utils');

@@ -18,13 +44,15 @@

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
describe('Integration', function () {
var session = undefined;
var schema = undefined;
var state = undefined;
var session = void 0;
var schema = void 0;
var state = void 0;
beforeEach(function () {
var _createTestSessionWithData = (0, _utils.createTestSessionWithData)();
var _createTestSessionWit = (0, _utils.createTestSessionWithData)();
session = _createTestSessionWithData.session;
schema = _createTestSessionWithData.schema;
state = _createTestSessionWithData.state;
session = _createTestSessionWit.session;
schema = _createTestSessionWit.schema;
state = _createTestSessionWit.state;
});

@@ -36,3 +64,3 @@

// mutate the state.
(0, _deepFreeze2['default'])(state);
(0, _deepFreeze2.default)(state);
});

@@ -44,15 +72,15 @@

(0, _chai.expect)(state.Book.items).to.have.length(3);
(0, _chai.expect)(Object.keys(state.Book.itemsById)).to.have.length(3);
(0, _chai.expect)((0, _keys2.default)(state.Book.itemsById)).to.have.length(3);
(0, _chai.expect)(state.Cover.items).to.have.length(3);
(0, _chai.expect)(Object.keys(state.Cover.itemsById)).to.have.length(3);
(0, _chai.expect)((0, _keys2.default)(state.Cover.itemsById)).to.have.length(3);
(0, _chai.expect)(state.Genre.items).to.have.length(4);
(0, _chai.expect)(Object.keys(state.Genre.itemsById)).to.have.length(4);
(0, _chai.expect)((0, _keys2.default)(state.Genre.itemsById)).to.have.length(4);
(0, _chai.expect)(state.BookGenres.items).to.have.length(5);
(0, _chai.expect)(Object.keys(state.BookGenres.itemsById)).to.have.length(5);
(0, _chai.expect)((0, _keys2.default)(state.BookGenres.itemsById)).to.have.length(5);
(0, _chai.expect)(state.Author.items).to.have.length(3);
(0, _chai.expect)(Object.keys(state.Author.itemsById)).to.have.length(3);
(0, _chai.expect)((0, _keys2.default)(state.Author.itemsById)).to.have.length(3);
});

@@ -64,5 +92,5 @@

(0, _chai.expect)(Book.hasId(0)).to.be['true'];
(0, _chai.expect)(Book.hasId(92384)).to.be['false'];
(0, _chai.expect)(Book.hasId()).to.be['false'];
(0, _chai.expect)(Book.hasId(0)).to.be.true;
(0, _chai.expect)(Book.hasId(92384)).to.be.false;
(0, _chai.expect)(Book.hasId()).to.be.false;
});

@@ -91,2 +119,3 @@

var newProps = {

@@ -101,3 +130,3 @@ name: 'New Book',

return Book.create(newProps);
}).to['throw']('Book.genres');
}).to.throw('Book.genres');
});

@@ -110,5 +139,4 @@

(0, _chai.expect)(Book.count()).to.equal(3);
Book.withId(0).delete();
Book.withId(0)['delete']();
var nextState = session.reduce();

@@ -140,3 +168,3 @@ var nextSession = schema.from(nextState);

return Book.withId(10);
}).to['throw'](Error);
}).to.throw(Error);
});

@@ -150,5 +178,6 @@

// Forward (from many-to-many field declaration)
var book = Book.first();
var relatedGenres = book.genres;
(0, _chai.expect)(relatedGenres).to.be.an.instanceOf(_QuerySet2['default']);
(0, _chai.expect)(relatedGenres).to.be.an.instanceOf(_QuerySet2.default);
(0, _chai.expect)(relatedGenres.modelClass).to.equal(Genre);

@@ -160,3 +189,3 @@ (0, _chai.expect)(relatedGenres.count()).to.equal(2);

var relatedBooks = genre.books;
(0, _chai.expect)(relatedBooks).to.be.an.instanceOf(_QuerySet2['default']);
(0, _chai.expect)(relatedBooks).to.be.an.instanceOf(_QuerySet2.default);
(0, _chai.expect)(relatedBooks.modelClass).to.equal(Book);

@@ -189,3 +218,3 @@ });

return book.genres.add(existingId);
}).to['throw'](existingId.toString());
}).to.throw(existingId.toString());
});

@@ -217,3 +246,3 @@

return book.genres.remove(0, unexistingId);
}).to['throw'](unexistingId.toString());
}).to.throw(unexistingId.toString());
});

@@ -241,2 +270,3 @@

// Forward
var book = Book.first();

@@ -250,3 +280,3 @@ var author = book.author;

var relatedBooks = author.books;
(0, _chai.expect)(relatedBooks).to.be.an.instanceOf(_QuerySet2['default']);
(0, _chai.expect)(relatedBooks).to.be.an.instanceOf(_QuerySet2.default);
(0, _chai.expect)(relatedBooks.idArr).to.include(book.getId());

@@ -262,2 +292,3 @@ (0, _chai.expect)(relatedBooks.modelClass).to.equal(Book);

// Forward
var book = Book.first();

@@ -287,2 +318,3 @@ var cover = book.cover;

var cover = Cover.create({ src: 'somecover.png' });

@@ -333,2 +365,40 @@ var coverId = cover.getId();

});
});
describe('Big Data Test', function () {
var Item = void 0;
var schema = void 0;
beforeEach(function () {
Item = function (_Model) {
(0, _inherits3.default)(Item, _Model);
function Item() {
(0, _classCallCheck3.default)(this, Item);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(Item).apply(this, arguments));
}
return Item;
}(_Model3.default);
Item.modelName = 'Item';
schema = new _Schema2.default();
schema.register(Item);
});
it('adds a big amount of items in acceptable time', function () {
this.timeout(30000);
var session = schema.from(schema.getDefaultState());
var start = new Date().getTime();
var amount = 10000;
for (var i = 0; i < amount; i++) {
session.Item.create({ id: i, name: 'TestItem' });
}
var nextState = session.getNextState();
var end = new Date().getTime();
var tookSeconds = (end - start) / 1000;
console.log('Creating ' + amount + ' objects took ' + tookSeconds + 's');
(0, _chai.expect)(tookSeconds).to.be.at.most(3);
});
});
'use strict';
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _create = require('babel-runtime/core-js/object/create');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _create2 = _interopRequireDefault(_create);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _chai = require('chai');

@@ -29,8 +41,11 @@

_chai2['default'].use(_sinonChai2['default']);
var expect = _chai2['default'].expect;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_sinonChai2.default);
var expect = _chai2.default.expect;
describe('Model', function () {
describe('static method', function () {
var Model = undefined;
var Model = void 0;
var sessionMock = {};

@@ -50,13 +65,12 @@ var stateMock = {};

// won't survive longer than each test.
Model = (function (_BaseModel) {
_inherits(TestModel, _BaseModel);
Model = function (_BaseModel) {
(0, _inherits3.default)(TestModel, _BaseModel);
function TestModel() {
_classCallCheck(this, TestModel);
_get(Object.getPrototypeOf(TestModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, TestModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(TestModel).apply(this, arguments));
}
return TestModel;
})(_Model2['default']);
}(_Model2.default);
Model.modelName = 'Model';

@@ -79,3 +93,3 @@ });

it('getBackend works correctly', function () {
var BackendMockClass = _sinon2['default'].stub();
var BackendMockClass = _sinon2.default.stub();
Model.getBackendClass = function () {

@@ -91,12 +105,12 @@ return BackendMockClass;

describe('static method delegates to Backend', function () {
var Model = undefined;
var backendMock = undefined;
var sessionMock = undefined;
var markAccessedSpy = undefined;
var Model = void 0;
var backendMock = void 0;
var sessionMock = void 0;
var markAccessedSpy = void 0;
var stateMock = {};
beforeEach(function () {
Model = Object.create(_Model2['default']);
Model = (0, _create2.default)(_Model2.default);
Model.modelName = 'Model';
markAccessedSpy = _sinon2['default'].spy();
markAccessedSpy = _sinon2.default.spy();
sessionMock = { markAccessed: markAccessedSpy };

@@ -116,3 +130,3 @@ backendMock = {};

it('accessId correctly delegates', function () {
var accessIdSpy = _sinon2['default'].spy();
var accessIdSpy = _sinon2.default.spy();
backendMock.accessId = accessIdSpy;

@@ -129,3 +143,3 @@

it('accessIds correctly delegates', function () {
var accessIdsSpy = _sinon2['default'].spy();
var accessIdsSpy = _sinon2.default.spy();
backendMock.accessIdList = accessIdsSpy;

@@ -141,3 +155,3 @@

it('accessList correctly delegates', function () {
var accessIdsSpy = _sinon2['default'].spy();
var accessIdsSpy = _sinon2.default.spy();
backendMock.accessIdList = accessIdsSpy;

@@ -154,7 +168,7 @@

describe('Instance methods', function () {
var Model = undefined;
var instance = undefined;
var sessionMock = undefined;
var stateMock = undefined;
var actionMock = undefined;
var Model = void 0;
var instance = void 0;
var sessionMock = void 0;
var stateMock = void 0;
var actionMock = void 0;

@@ -174,13 +188,12 @@ beforeEach(function () {

// won't survive longer than each test.
Model = (function (_BaseModel2) {
_inherits(TestModel, _BaseModel2);
Model = function (_BaseModel2) {
(0, _inherits3.default)(TestModel, _BaseModel2);
function TestModel() {
_classCallCheck(this, TestModel);
_get(Object.getPrototypeOf(TestModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, TestModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(TestModel).apply(this, arguments));
}
return TestModel;
})(_Model2['default']);
}(_Model2.default);
Model.modelName = 'Model';

@@ -195,7 +208,7 @@ Model.markAccessed = function () {

it('delete works correctly', function () {
var addUpdateSpy = _sinon2['default'].spy();
var addUpdateSpy = _sinon2.default.spy();
Model.addUpdate = addUpdateSpy;
expect(addUpdateSpy).not.called;
instance['delete']();
instance.delete();
expect(addUpdateSpy).calledOnce;

@@ -209,3 +222,3 @@ expect(addUpdateSpy.getCall(0).args[0]).to.deep.equal({

it('update works correctly', function () {
var addUpdateSpy = _sinon2['default'].spy();
var addUpdateSpy = _sinon2.default.spy();
Model.addUpdate = addUpdateSpy;

@@ -232,3 +245,3 @@

var updateSpy = _sinon2['default'].spy(instance, 'update');
var updateSpy = _sinon2.default.spy(instance, 'update');

@@ -235,0 +248,0 @@ expect(updateSpy).not.called;

'use strict';
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _chai = require('chai');

@@ -41,13 +51,16 @@

_chai2['default'].use(_sinonChai2['default']);
var expect = _chai2['default'].expect;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_sinonChai2.default);
var expect = _chai2.default.expect;
describe('QuerySet tests', function () {
var session = undefined;
var bookQs = undefined;
var genreQs = undefined;
var session = void 0;
var bookQs = void 0;
var genreQs = void 0;
beforeEach(function () {
var _createTestSessionWithData = (0, _utils.createTestSessionWithData)();
var _createTestSessionWit = (0, _utils.createTestSessionWithData)();
session = _createTestSessionWithData.session;
session = _createTestSessionWit.session;

@@ -64,10 +77,10 @@ bookQs = session.Book.getQuerySet();

it('exists works correctly', function () {
expect(bookQs.exists()).to.be['true'];
expect(bookQs.exists()).to.be.true;
var emptyQs = new _QuerySet3['default'](session.Book, []);
expect(emptyQs.exists()).to.be['false'];
var emptyQs = new _QuerySet3.default(session.Book, []);
expect(emptyQs.exists()).to.be.false;
});
it('at works correctly', function () {
expect(bookQs.at(0)).to.be.an.instanceOf(_Model2['default']);
expect(bookQs.at(0)).to.be.an.instanceOf(_Model2.default);
expect(bookQs.ref.at(0)).to.equal(session.Book.state.itemsById[0]);

@@ -144,3 +157,3 @@ });

expect(session.updates).to.have.length(0);
bookQs['delete']();
bookQs.delete();
expect(session.updates).to.have.length.of.at.least(1);

@@ -165,14 +178,14 @@

var currentYear = 2015;
var CustomQuerySet = (function (_QuerySet) {
_inherits(CustomQuerySet, _QuerySet);
var CustomQuerySet = function (_QuerySet) {
(0, _inherits3.default)(CustomQuerySet, _QuerySet);
function CustomQuerySet() {
_classCallCheck(this, CustomQuerySet);
_get(Object.getPrototypeOf(CustomQuerySet.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, CustomQuerySet);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(CustomQuerySet).apply(this, arguments));
}
_createClass(CustomQuerySet, [{
(0, _createClass3.default)(CustomQuerySet, [{
key: 'unreleased',

@@ -185,5 +198,4 @@ value: function unreleased() {

}]);
return CustomQuerySet;
})(_QuerySet3['default']);
}(_QuerySet3.default);

@@ -194,9 +206,10 @@ CustomQuerySet.addSharedMethod('unreleased');

var schema = new _Schema2['default']();
var schema = new _Schema2.default();
schema.register(Book, Genre, Cover, Author);
var _createTestSessionWithData2 = (0, _utils.createTestSessionWithData)(schema);
var _createTestSessionWit2 = (0, _utils.createTestSessionWithData)(schema);
var sess = _createTestSessionWithData2.session;
var sess = _createTestSessionWit2.session;
var customQs = sess.Book.getQuerySet();

@@ -203,0 +216,0 @@

'use strict';
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _assign = require('babel-runtime/core-js/object/assign');
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _assign2 = _interopRequireDefault(_assign);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _getOwnPropertyDescriptor = require('babel-runtime/core-js/object/get-own-property-descriptor');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _getOwnPropertyDescriptor2 = _interopRequireDefault(_getOwnPropertyDescriptor);
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _chai = require('chai');

@@ -41,8 +55,11 @@

_chai2['default'].use(_sinonChai2['default']);
var expect = _chai2['default'].expect;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_sinonChai2.default);
var expect = _chai2.default.expect;
describe('Schema', function () {
it('constructor works', function () {
var schema = new _Schema2['default']();
var schema = new _Schema2.default();
expect(schema.selectorCreator).to.be.a('function');

@@ -53,27 +70,25 @@ });

it('with multiple one-to-one fields to the same model without related name', function () {
var A = (function (_Model) {
_inherits(A, _Model);
var A = function (_Model) {
(0, _inherits3.default)(A, _Model);
function A() {
_classCallCheck(this, A);
_get(Object.getPrototypeOf(A.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, A);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(A).apply(this, arguments));
}
return A;
})(_Model8['default']);
}(_Model8.default);
A.modelName = 'A';
var B = (function (_Model2) {
_inherits(B, _Model2);
var B = function (_Model2) {
(0, _inherits3.default)(B, _Model2);
function B() {
_classCallCheck(this, B);
_get(Object.getPrototypeOf(B.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, B);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(B).apply(this, arguments));
}
return B;
})(_Model8['default']);
}(_Model8.default);

@@ -85,35 +100,33 @@ B.modelName = 'B';

};
var schema = new _Schema2['default']();
var schema = new _Schema2.default();
schema.register(A, B);
expect(function () {
return schema.getModelClasses();
}).to['throw'](/field/);
}).to.throw(/field/);
});
it('with multiple foreign keys to the same model without related name', function () {
var A = (function (_Model3) {
_inherits(A, _Model3);
var A = function (_Model3) {
(0, _inherits3.default)(A, _Model3);
function A() {
_classCallCheck(this, A);
_get(Object.getPrototypeOf(A.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, A);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(A).apply(this, arguments));
}
return A;
})(_Model8['default']);
}(_Model8.default);
A.modelName = 'A';
var B = (function (_Model4) {
_inherits(B, _Model4);
var B = function (_Model4) {
(0, _inherits3.default)(B, _Model4);
function B() {
_classCallCheck(this, B);
_get(Object.getPrototypeOf(B.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, B);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(B).apply(this, arguments));
}
return B;
})(_Model8['default']);
}(_Model8.default);

@@ -125,35 +138,33 @@ B.modelName = 'B';

};
var schema = new _Schema2['default']();
var schema = new _Schema2.default();
schema.register(A, B);
expect(function () {
return schema.getModelClasses();
}).to['throw'](/field/);
}).to.throw(/field/);
});
it('with multiple many-to-manys to the same model without related name', function () {
var A = (function (_Model5) {
_inherits(A, _Model5);
var A = function (_Model5) {
(0, _inherits3.default)(A, _Model5);
function A() {
_classCallCheck(this, A);
_get(Object.getPrototypeOf(A.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, A);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(A).apply(this, arguments));
}
return A;
})(_Model8['default']);
}(_Model8.default);
A.modelName = 'A';
var B = (function (_Model6) {
_inherits(B, _Model6);
var B = function (_Model6) {
(0, _inherits3.default)(B, _Model6);
function B() {
_classCallCheck(this, B);
_get(Object.getPrototypeOf(B.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, B);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(B).apply(this, arguments));
}
return B;
})(_Model8['default']);
}(_Model8.default);

@@ -165,7 +176,7 @@ B.modelName = 'B';

};
var schema = new _Schema2['default']();
var schema = new _Schema2.default();
schema.register(A, B);
expect(function () {
return schema.getModelClasses();
}).to['throw'](/field/);
}).to.throw(/field/);
});

@@ -175,7 +186,7 @@ });

describe('simple schema', function () {
var schema = undefined;
var Book = undefined;
var Author = undefined;
var Cover = undefined;
var Genre = undefined;
var schema = void 0;
var Book = void 0;
var Author = void 0;
var Cover = void 0;
var Genre = void 0;
beforeEach(function () {

@@ -189,3 +200,4 @@ var _createTestModels = (0, _utils.createTestModels)();

schema = new _Schema2['default']();
schema = new _Schema2.default();
});

@@ -210,3 +222,3 @@

var session = schema.from(initialState);
expect(session).to.be.instanceOf(_Session2['default']);
expect(session).to.be.instanceOf(_Session2.default);
});

@@ -223,7 +235,7 @@

var coverDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'cover');
var coverDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'cover');
expect(coverDescriptor).to.be.undefined;
var authorDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'author');
var authorDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'author');
expect(authorDescriptor).to.be.undefined;
var genresDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'genres');
var genresDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'genres');
expect(genresDescriptor).to.be.undefined;

@@ -235,11 +247,11 @@

coverDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'cover');
coverDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'cover');
expect(coverDescriptor.get).to.be.a('function');
expect(coverDescriptor.set).to.be.a('function');
authorDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'author');
authorDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'author');
expect(authorDescriptor.get).to.be.a('function');
expect(authorDescriptor.set).to.be.a('function');
genresDescriptor = Object.getOwnPropertyDescriptor(Book.prototype, 'genres');
genresDescriptor = (0, _getOwnPropertyDescriptor2.default)(Book.prototype, 'genres');
expect(genresDescriptor.get).to.be.a('function');

@@ -302,3 +314,3 @@ expect(genresDescriptor.set).to.be.a('function');

var _selectorFunc = _sinon2['default'].spy();
var _selectorFunc = _sinon2.default.spy();

@@ -323,3 +335,3 @@ var selector = schema.createSelector(function (state) {

expect(_selectorFunc.lastCall.args[0]).to.be.an.instanceOf(_Session2['default']);
expect(_selectorFunc.lastCall.args[0]).to.be.an.instanceOf(_Session2.default);
expect(_selectorFunc.lastCall.args[0].state).to.equal(_state);

@@ -332,3 +344,3 @@

var otherUserState = _extends({}, appState, { selectedUser: 0 });
var otherUserState = (0, _assign2.default)({}, appState, { selectedUser: 0 });

@@ -343,6 +355,6 @@ selector(otherUserState);

var session = schema.withMutations(initialState);
expect(session).to.be.an.instanceOf(_Session2['default']);
expect(session.withMutations).to.be['true'];
expect(session).to.be.an.instanceOf(_Session2.default);
expect(session.withMutations).to.be.true;
});
});
});
'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _chai = require('chai');

@@ -25,12 +23,15 @@

_chai2['default'].use(_sinonChai2['default']);
var expect = _chai2['default'].expect;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_chai2.default.use(_sinonChai2.default);
var expect = _chai2.default.expect;
describe('Session', function () {
var schema = undefined;
var Book = undefined;
var Cover = undefined;
var Genre = undefined;
var Author = undefined;
var defaultState = undefined;
var schema = void 0;
var Book = void 0;
var Cover = void 0;
var Genre = void 0;
var Author = void 0;
var defaultState = void 0;
beforeEach(function () {

@@ -44,3 +45,3 @@ var _createTestModels = (0, _utils.createTestModels)();

schema = new _Schema2['default']();
schema = new _Schema2.default();
schema.register(Book, Cover, Genre, Author);

@@ -66,6 +67,6 @@ defaultState = schema.getDefaultState();

var session = schema.from(defaultState);
expect((0, _utils.isSubclass)(session.Book, Book)).to.be['true'];
expect((0, _utils.isSubclass)(session.Author, Author)).to.be['true'];
expect((0, _utils.isSubclass)(session.Cover, Cover)).to.be['true'];
expect((0, _utils.isSubclass)(session.Genre, Genre)).to.be['true'];
expect((0, _utils.isSubclass)(session.Book, Book)).to.be.true;
expect((0, _utils.isSubclass)(session.Author, Author)).to.be.true;
expect((0, _utils.isSubclass)(session.Cover, Cover)).to.be.true;
expect((0, _utils.isSubclass)(session.Genre, Genre)).to.be.true;
});

@@ -90,6 +91,5 @@

expect(session.updates).to.have.length(0);
var updateObj = {};
var updateObj = { meta: { name: 'MockModel' } };
session.addUpdate(updateObj);
expect(session.updates).to.have.length(1);
expect(session.updates[0]).to.equal(updateObj);
});

@@ -108,3 +108,3 @@

session.updates.push({
session.addUpdate({
type: _constants.CREATE,

@@ -115,2 +115,3 @@ meta: {

payload: {
id: 0,
name: 'Caesar'

@@ -135,6 +136,6 @@ }

var authorReducerSpy = _sinon2['default'].spy(Author, 'reducer');
var bookReducerSpy = _sinon2['default'].spy(Book, 'reducer');
var coverReducerSpy = _sinon2['default'].spy(Cover, 'reducer');
var genreReducerSpy = _sinon2['default'].spy(Genre, 'reducer');
var authorReducerSpy = _sinon2.default.spy(Author, 'reducer');
var bookReducerSpy = _sinon2.default.spy(Book, 'reducer');
var coverReducerSpy = _sinon2.default.spy(Cover, 'reducer');
var genreReducerSpy = _sinon2.default.spy(Genre, 'reducer');

@@ -152,6 +153,6 @@ session.getNextState({ runReducers: true });

var authorReducerSpy = _sinon2['default'].spy(Author, 'reducer');
var bookReducerSpy = _sinon2['default'].spy(Book, 'reducer');
var coverReducerSpy = _sinon2['default'].spy(Cover, 'reducer');
var genreReducerSpy = _sinon2['default'].spy(Genre, 'reducer');
var authorReducerSpy = _sinon2.default.spy(Author, 'reducer');
var bookReducerSpy = _sinon2.default.spy(Book, 'reducer');
var coverReducerSpy = _sinon2.default.spy(Cover, 'reducer');
var genreReducerSpy = _sinon2.default.spy(Genre, 'reducer');

@@ -169,3 +170,3 @@ session.getNextState({ runReducers: false });

var session = schema.from(defaultState);
var getNextStateSpy = _sinon2['default'].spy(session, 'getNextState');
var getNextStateSpy = _sinon2.default.spy(session, 'getNextState');

@@ -172,0 +173,0 @@ session.reduce();

'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isSubclass = undefined;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
exports.createTestModels = createTestModels;

@@ -16,8 +33,2 @@ exports.createTestSchema = createTestSchema;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _Schema = require('../Schema');

@@ -33,2 +44,4 @@

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -88,12 +101,11 @@ * These utils create a database schema for testing.

function createTestModels() {
var Book = (function (_Model) {
_inherits(BookModel, _Model);
var Book = function (_Model) {
(0, _inherits3.default)(BookModel, _Model);
function BookModel() {
_classCallCheck(this, BookModel);
_get(Object.getPrototypeOf(BookModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, BookModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(BookModel).apply(this, arguments));
}
_createClass(BookModel, null, [{
(0, _createClass3.default)(BookModel, null, [{
key: 'fields',

@@ -108,45 +120,41 @@ get: function get() {

}]);
return BookModel;
})(_Model6['default']);
}(_Model6.default);
Book.modelName = 'Book';
var Author = (function (_Model2) {
_inherits(AuthorModel, _Model2);
var Author = function (_Model2) {
(0, _inherits3.default)(AuthorModel, _Model2);
function AuthorModel() {
_classCallCheck(this, AuthorModel);
_get(Object.getPrototypeOf(AuthorModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, AuthorModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(AuthorModel).apply(this, arguments));
}
return AuthorModel;
})(_Model6['default']);
}(_Model6.default);
Author.modelName = 'Author';
var Cover = (function (_Model3) {
_inherits(CoverModel, _Model3);
var Cover = function (_Model3) {
(0, _inherits3.default)(CoverModel, _Model3);
function CoverModel() {
_classCallCheck(this, CoverModel);
_get(Object.getPrototypeOf(CoverModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, CoverModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(CoverModel).apply(this, arguments));
}
return CoverModel;
})(_Model6['default']);
}(_Model6.default);
Cover.modelName = 'Cover';
var Genre = (function (_Model4) {
_inherits(GenreModel, _Model4);
var Genre = function (_Model4) {
(0, _inherits3.default)(GenreModel, _Model4);
function GenreModel() {
_classCallCheck(this, GenreModel);
_get(Object.getPrototypeOf(GenreModel.prototype), 'constructor', this).apply(this, arguments);
(0, _classCallCheck3.default)(this, GenreModel);
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(GenreModel).apply(this, arguments));
}
return GenreModel;
})(_Model6['default']);
}(_Model6.default);
Genre.modelName = 'Genre';

@@ -169,3 +177,4 @@

var schema = new _Schema2['default']();
var schema = new _Schema2.default();
schema.register(Book, Author, Cover, Genre);

@@ -202,5 +211,4 @@ return schema;

var isSubclass = function isSubclass(a, b) {
var isSubclass = exports.isSubclass = function isSubclass(a, b) {
return a.prototype instanceof b;
};
exports.isSubclass = isSubclass;
};
'use strict';
Object.defineProperty(exports, '__esModule', {
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.includes = exports.ops = exports.objectShallowEquals = exports.reverseFieldErrorMessage = exports.normalizeEntity = exports.ListIterator = exports.reverseFieldName = exports.m2mToFieldName = exports.m2mFromFieldName = exports.m2mName = exports.attachQuerySetMethods = exports.match = undefined;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _defineProperty = require('babel-runtime/core-js/object/define-property');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _defineProperty2 = _interopRequireDefault(_defineProperty);
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _getOwnPropertyDescriptor = require('babel-runtime/core-js/object/get-own-property-descriptor');
var _lodashObjectForOwn = require('lodash/object/forOwn');
var _getOwnPropertyDescriptor2 = _interopRequireDefault(_getOwnPropertyDescriptor);
var _lodashObjectForOwn2 = _interopRequireDefault(_lodashObjectForOwn);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _lodashArrayIntersection = require('lodash/array/intersection');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _lodashArrayIntersection2 = _interopRequireDefault(_lodashArrayIntersection);
var _keys = require('babel-runtime/core-js/object/keys');
var _lodashArrayDifference = require('lodash/array/difference');
var _keys2 = _interopRequireDefault(_keys);
var _lodashArrayDifference2 = _interopRequireDefault(_lodashArrayDifference);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _forOwn = require('lodash/forOwn');
var _forOwn2 = _interopRequireDefault(_forOwn);
var _includes = require('lodash/includes');
var _includes2 = _interopRequireDefault(_includes);
var _immutableOps = require('immutable-ops');
var _immutableOps2 = _interopRequireDefault(_immutableOps);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**

@@ -33,3 +54,3 @@ * @module utils

var ListIterator = (function () {
var ListIterator = function () {
/**

@@ -45,3 +66,3 @@ * Creates a new ListIterator instance.

function ListIterator(list, idx, getValue) {
_classCallCheck(this, ListIterator);
(0, _classCallCheck3.default)(this, ListIterator);

@@ -57,14 +78,2 @@ this.list = list;

/**
* Checks if the properties in `lookupObj` match
* the corresponding properties in `entity`.
*
* @private
* @param {Object} lookupObj - properties to match against
* @param {Object} entity - object to match
* @return {Boolean} Returns `true` if the property names in
* `lookupObj` have the same values in `lookupObj`
* and `entity`, `false` if not.
*/
/**
* The default implementation for the `getValue` function.

@@ -77,3 +86,4 @@ *

_createClass(ListIterator, [{
(0, _createClass3.default)(ListIterator, [{
key: 'getValue',

@@ -94,2 +104,3 @@ value: function getValue(idx, list) {

*/
}, {

@@ -113,8 +124,20 @@ key: 'next',

}]);
return ListIterator;
})();
}();
/**
* Checks if the properties in `lookupObj` match
* the corresponding properties in `entity`.
*
* @private
* @param {Object} lookupObj - properties to match against
* @param {Object} entity - object to match
* @return {Boolean} Returns `true` if the property names in
* `lookupObj` have the same values in `lookupObj`
* and `entity`, `false` if not.
*/
function match(lookupObj, entity) {
var keys = Object.keys(lookupObj);
var keys = (0, _keys2.default)(lookupObj);
return keys.every(function (key) {

@@ -198,3 +221,3 @@ return lookupObj[key] === entity[key];

func(currClass);
currClass = Object.getPrototypeOf(currClass);
currClass = (0, _getPrototypeOf2.default)(currClass);
}

@@ -213,7 +236,7 @@ }

var methodName = leftToDefine[i];
var descriptor = Object.getOwnPropertyDescriptor(cls.prototype, methodName);
var descriptor = (0, _getOwnPropertyDescriptor2.default)(cls.prototype, methodName);
if (typeof descriptor !== 'undefined') {
if (typeof descriptor.get !== 'undefined') {
descriptor.get = querySetGetterDelegatorFactory(methodName);
Object.defineProperty(modelClass, methodName, descriptor);
(0, _defineProperty2.default)(modelClass, methodName, descriptor);
defined = true;

@@ -247,45 +270,2 @@ } else if (typeof descriptor.value === 'function') {

/**
* Checks if `target` needs to be merged with
* `source`. Does a shallow equal check on the `source`
* object's own properties against the same
* properties on `target`. If all properties are equal,
* returns `null`. Otherwise returns an object
* with the properties that did not pass
* the equality check. The returned object
* can be used to update `target` immutably
* while sharing more structure.
*
* @private
* @param {Object} target - the object to update
* @param {Object} source - the updated props
* @return {Object|null} an object with the inequal props from `source`
* or `null` if no updates or needed.
*/
function objectDiff(target, source) {
var diffObj = {};
var shouldUpdate = false;
(0, _lodashObjectForOwn2['default'])(source, function (value, key) {
if (!target.hasOwnProperty(key) || target[key] !== source[key]) {
shouldUpdate = true;
diffObj[key] = value;
}
});
return shouldUpdate ? diffObj : null;
}
function arrayDiffActions(targetArr, sourceArr) {
var itemsInBoth = (0, _lodashArrayIntersection2['default'])(targetArr, sourceArr);
var deleteItems = (0, _lodashArrayDifference2['default'])(targetArr, itemsInBoth);
var addItems = (0, _lodashArrayDifference2['default'])(sourceArr, itemsInBoth);
if (deleteItems.length || addItems.length) {
return {
'delete': deleteItems,
add: addItems
};
}
return null;
}
function reverseFieldErrorMessage(modelName, fieldName, toModelName, backwardsFieldName) {

@@ -299,3 +279,3 @@ return ['Reverse field ' + backwardsFieldName + ' already defined', ' on model ' + toModelName + '. To fix, set a custom related', ' name on ' + modelName + '.' + fieldName + '.'].join('');

(0, _lodashObjectForOwn2['default'])(a, function (value, key) {
(0, _forOwn2.default)(a, function (value, key) {
if (!b.hasOwnProperty(key) || b[key] !== value) {

@@ -314,2 +294,5 @@ return false;

// A global instance of immutable-ops for general use
var ops = (0, _immutableOps2.default)();
exports.match = match;

@@ -323,5 +306,5 @@ exports.attachQuerySetMethods = attachQuerySetMethods;

exports.normalizeEntity = normalizeEntity;
exports.objectDiff = objectDiff;
exports.arrayDiffActions = arrayDiffActions;
exports.reverseFieldErrorMessage = reverseFieldErrorMessage;
exports.objectShallowEquals = objectShallowEquals;
exports.objectShallowEquals = objectShallowEquals;
exports.ops = ops;
exports.includes = _includes2.default;
{
"name": "redux-orm",
"version": "0.7.0",
"version": "0.8.0",
"description": "Simple ORM to manage and query your state trees",

@@ -21,9 +21,14 @@ "main": "lib/index.js",

"devDependencies": {
"babel": "^5.8.24",
"babel-core": "^5.8.24",
"babel-eslint": "^4.1.5",
"babel-cli": "^6.8.0",
"babel-core": "^6.7.7",
"babel-eslint": "^6.0.4",
"babel-plugin-transform-runtime": "^6.8.0",
"babel-preset-es2015": "^6.6.0",
"babel-preset-stage-2": "^6.5.0",
"babel-register": "^6.8.0",
"chai": "^3.0.0",
"deep-freeze": "0.0.1",
"eslint": "^1.10.1",
"eslint-config-airbnb": "1.0.0",
"eslint": "^2.9.0",
"eslint-config-airbnb": "9.0.1",
"eslint-plugin-import": "^1.7.0",
"gulp": "^3.9.0",

@@ -37,5 +42,6 @@ "gulp-gh-pages": "^0.5.4",

"dependencies": {
"lodash": "^3.10.1",
"immutable-ops": "^0.4.2",
"lodash": "^4.12.0",
"reselect": "^2.0.1"
}
}

@@ -232,3 +232,3 @@ redux-orm

`redux-orm` runs a mini-redux inside it. It queues any updates the library user records with action-like objects, and when `getNextState` is called, it applies those actions with its internal reducers. There's some room here to provide performance optimizations similar to Immutable.js.
`redux-orm` runs a mini-redux inside it. It queues any updates the library user records with action-like objects, and when `getNextState` is called, it applies those actions with its internal reducers. Updates within each `getNextState` are implemented with batched mutations, so even a big number of updates should be pretty performant.

@@ -408,5 +408,4 @@ ### Customizability

idAttribute: 'id',
indexById: true, // if false, data will be held in a single object array
arrName: 'items',
mapName: 'itemsById', // will be ignored if `indexById` is `false`
mapName: 'itemsById',
};

@@ -420,2 +419,12 @@ ```

### 0.8.0
Adds **batched mutations.** This is a big performance improvement. Previously adding 10,000 objects would take 15s, now it takes about 0.5s. Batched mutations are implemented using [`immutable-ops`](https://github.com/tommikaikkonen/immutable-ops) internally.
**Breaking changes**:
- Removed `indexById` option from Backend. This means that data will always be stored in both an array of id's and a map of `id => entity`, which was the default setting. If you didn't explicitly set `indexById` to `false`, you don't need to change anything.
- Batched mutations brought some internal changes. If you had custom `Backend` or `Session` classes, or have overridden `Model.getNextState`, please check out the diff.
### 0.7.0

@@ -422,0 +431,0 @@

@@ -1,5 +0,6 @@

import find from 'lodash/collection/find';
import omit from 'lodash/object/omit';
import {ListIterator, objectDiff} from './utils';
import { ListIterator, includes } from './utils';
import getImmutableOps from 'immutable-ops';
const globalOps = getImmutableOps();
/**

@@ -13,9 +14,5 @@ * Handles the underlying data structure for a {@link Model} class.

* @param {string} [userOpts.idAttribute=id] - the id attribute of the entity.
* @param {Boolean} [userOpts.indexById=true] - a boolean indicating if the entities
* should be indexed by `idAttribute`.
* @param {string} [userOpts.arrName=items] - the state attribute where an array of
* either entity id's (if `indexById === true`)
* or the entity objects are stored.
* @param {string} [userOpts.mapName=itemsById] - if `indexById === true`, the state
* attribute where the entity objects
* entity id's are stored
* @param {string} [userOpts.mapName=itemsById] - the state attribute where the entity objects
* are stored in a id to entity object

@@ -30,3 +27,2 @@ * map.

idAttribute: 'id',
indexById: true,
arrName: 'items',

@@ -50,7 +46,3 @@ mapName: 'itemsById',

accessId(branch, id) {
if (this.indexById) {
return branch[this.mapName][id];
}
return find(branch[this.arrName], {[this.idAttribute]: id});
return branch[this.mapName][id];
}

@@ -62,2 +54,16 @@

getOps(tx) {
if (!tx) {
return globalOps;
}
if (!tx.meta.hasOwnProperty('ops')) {
tx.meta.ops = getImmutableOps();
tx.meta.ops.open();
tx.onClose(_tx => {
_tx.meta.ops.close();
});
}
return tx.meta.ops;
}
/**

@@ -71,7 +77,7 @@ * Returns a {@link ListIterator} instance for

iterator(branch) {
if (this.indexById) {
return new ListIterator(branch[this.arrName], 0, (list, idx) => branch[this.mapName][list[idx]]);
}
return new ListIterator(branch[this.arrName], 0);
return new ListIterator(
branch[this.arrName],
0,
(list, idx) => branch[this.mapName][list[idx]]
);
}

@@ -82,3 +88,3 @@

const obj = this.accessId(branch, id);
return Object.assign({[this.idAttribute]: id}, obj);
return Object.assign({ [this.idAttribute]: id }, obj);
});

@@ -92,11 +98,5 @@ }

getDefaultState() {
if (this.indexById) {
return {
[this.arrName]: [],
[this.mapName]: {},
};
}
return {
[this.arrName]: [],
[this.mapName]: {},
};

@@ -107,2 +107,3 @@ }

* Returns the data structure including a new object `entry`
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -112,26 +113,17 @@ * @param {Object} entry - the object to insert

*/
insert(branch, entry) {
if (this.indexById) {
const id = entry[this.idAttribute];
insert(tx, branch, entry) {
const ops = this.getOps(tx);
const id = entry[this.idAttribute];
if (this.withMutations) {
branch[this.arrName].push(id);
branch[this.mapName][id] = entry;
return branch;
}
return {
[this.arrName]: branch[this.arrName].concat(id),
[this.mapName]: Object.assign({}, branch[this.mapName], {[id]: entry}),
};
}
if (this.withMutations) {
branch[this.arrName].push(entry);
ops.mutable.push(id, branch[this.arrName]);
ops.mutable.set(id, entry, branch[this.mapName]);
return branch;
}
return {
[this.arrName]: branch[this.arrName].concat(entry),
};
return ops.merge({
[this.arrName]: ops.push(id, branch[this.arrName]),
[this.mapName]: ops.merge({ [id]: entry }, branch[this.mapName]),
}, branch);
}

@@ -143,2 +135,3 @@

*
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -150,54 +143,21 @@ * @param {Array} idArr - the id's of the objects to update

*/
update(branch, idArr, mergeObj) {
const returnBranch = this.withMutations ? branch : {};
update(tx, branch, idArr, mergeObj) {
const ops = this.getOps(tx);
const {
arrName,
mapName,
idAttribute,
} = this;
const mapFunction = entity => {
const assignTo = this.withMutations ? entity : {};
const diff = objectDiff(entity, mergeObj);
if (diff) {
return Object.assign(assignTo, entity, mergeObj);
}
return entity;
const merge = this.withMutations ? ops.mutable.merge : ops.merge;
return merge(mergeObj, entity);
};
if (this.indexById) {
if (!this.withMutations) {
returnBranch[mapName] = Object.assign({}, branch[mapName]);
returnBranch[arrName] = branch[arrName];
}
const set = this.withMutations ? ops.mutable.set : ops.set;
const updatedMap = {};
idArr.reduce((map, id) => {
const result = mapFunction(branch[mapName][id]);
if (result !== branch[mapName][id]) map[id] = result;
return map;
}, updatedMap);
const diff = objectDiff(returnBranch[mapName], updatedMap);
if (diff) {
Object.assign(returnBranch[mapName], diff);
} else {
return branch;
}
return returnBranch;
}
let updated = false;
returnBranch[arrName] = branch[arrName].map(entity => {
if (idArr.includes(entity[idAttribute])) {
const result = mapFunction(entity);
if (entity !== result) {
updated = true;
}
return mapFunction(entity);
}
return entity;
});
return updated ? returnBranch : branch;
const newMap = idArr.reduce((map, id) => {
const result = mapFunction(branch[mapName][id]);
return set(id, result, map);
}, branch[mapName]);
return ops.set(mapName, newMap, branch);
}

@@ -207,2 +167,3 @@

* Returns the data structure without objects with their id included in `idsToDelete`.
* @param {Object} session - the current Session instance
* @param {Object} branch - the data structure state

@@ -212,29 +173,15 @@ * @param {Array} idsToDelete - the ids to delete from the data structure

*/
delete(branch, idsToDelete) {
const {arrName, mapName, idAttribute} = this;
delete(tx, branch, idsToDelete) {
const ops = this.getOps(tx);
const { arrName, mapName } = this;
const arr = branch[arrName];
if (this.indexById) {
if (this.withMutations) {
idsToDelete.forEach(id => {
const idx = arr.indexOf(id);
if (idx !== -1) {
arr.splice(idx, 1);
}
delete branch[mapName][id];
});
return branch;
}
return {
[arrName]: branch[arrName].filter(id => !idsToDelete.includes(id)),
[mapName]: omit(branch[mapName], idsToDelete),
};
}
if (this.withMutations) {
idsToDelete.forEach(id => {
const idx = arr.indexOf(id);
if (idx === -1) {
arr.splice(idx, 1);
if (idx !== -1) {
ops.mutable.splice(idx, 1, [], arr);
}
ops.mutable.omit(id, branch[mapName]);
});

@@ -244,5 +191,6 @@ return branch;

return {
[arrName]: arr.filter(entity => !idsToDelete.includes(entity[idAttribute])),
};
return ops.merge({
[arrName]: ops.filter(id => !includes(idsToDelete, id), branch[arrName]),
[mapName]: ops.omit(idsToDelete, branch[mapName]),
}, branch);
}

@@ -249,0 +197,0 @@ };

@@ -1,2 +0,2 @@

import difference from 'lodash/array/difference';
import difference from 'lodash/difference';
import UPDATE from './constants';

@@ -7,2 +7,3 @@ import {

normalizeEntity,
includes,
} from './utils';

@@ -57,3 +58,3 @@

try {
found = declaredFromModel.get({[declaredFieldName]: thisId});
found = declaredFromModel.get({ [declaredFieldName]: thisId });
} catch (e) {

@@ -77,3 +78,3 @@ return null;

const thisId = this.getId();
return declaredFromModel.filter({[declaredFieldName]: thisId});
return declaredFromModel.filter({ [declaredFieldName]: thisId });
},

@@ -116,5 +117,4 @@ set() {

const existingQs = throughQs.withRefs.filter(through => {
return idsToAdd.includes(through[filterWithAttr]);
});
const existingQs = throughQs.withRefs
.filter(through => includes(idsToAdd, through[filterWithAttr]));

@@ -151,5 +151,4 @@ if (existingQs.exists()) {

const attrInIdsToRemove = reverse ? fromFieldName : toFieldName;
const entitiesToDelete = throughQs.withRefs.filter(through => {
return idsToRemove.includes(through[attrInIdsToRemove]);
});
const entitiesToDelete = throughQs.withRefs
.filter(through => includes(idsToRemove, through[attrInIdsToRemove]));

@@ -156,0 +155,0 @@ if (entitiesToDelete.count() !== idsToRemove.length) {

@@ -6,3 +6,10 @@ import QuerySet from './QuerySet';

import Session from './Session';
import {ForeignKey, ManyToMany, OneToOne, fk, many, oneToOne} from './fields';
import {
ForeignKey,
ManyToMany,
OneToOne,
fk,
many,
oneToOne,
} from './fields';

@@ -9,0 +16,0 @@ export {

@@ -1,2 +0,2 @@

import values from 'lodash/object/values';
import values from 'lodash/values';

@@ -61,5 +61,5 @@ export function eqCheck(a, b) {

const argsAreEqual = lastArgs && otherArgs.every((value, index) => {
return equalityCheck(value, lastArgs[index]);
});
const argsAreEqual = lastArgs && otherArgs.every(
(value, index) => equalityCheck(value, lastArgs[index])
);

@@ -80,5 +80,4 @@ if (ormIsEqual && argsAreEqual) {

if (!modelNameToInvalidatorMap.hasOwnProperty(modelName)) {
modelNameToInvalidatorMap[modelName] = nextState => {
return lastOrmState[modelName] !== nextState[modelName];
};
modelNameToInvalidatorMap[modelName] = nextState =>
lastOrmState[modelName] !== nextState[modelName];
}

@@ -85,0 +84,0 @@ });

@@ -1,4 +0,4 @@

import forOwn from 'lodash/object/forOwn';
import isArray from 'lodash/lang/isArray';
import uniq from 'lodash/array/uniq';
import forOwn from 'lodash/forOwn';
import isArray from 'lodash/isArray';
import uniq from 'lodash/uniq';

@@ -142,5 +142,8 @@ import Session from './Session';

* @private
* @param {Transction} tx - the current Transaction instance
* @return {Object} The next state.
*/
static getNextState() {
static getNextState(_tx) {
const tx = _tx || this.session.currentTx;
let state;

@@ -153,7 +156,8 @@ if (this._sessionData.hasOwnProperty('nextState')) {

const updates = this.session.getUpdatesFor(this);
const updates = tx.getUpdatesFor(this);
if (updates.length > 0) {
const nextState = updates.reduce(this.updateReducer.bind(this), state);
const nextState = updates.reduce(this.updateReducer.bind(this, tx), state);
this._sessionData.nextState = nextState;
tx.markApplied(this);
return nextState;

@@ -175,12 +179,11 @@ }

*/
static updateReducer(state, action) {
static updateReducer(tx, state, action) {
const backend = this.getBackend();
switch (action.type) {
case CREATE:
return backend.insert(state, action.payload);
return backend.insert(tx, state, action.payload);
case UPDATE:
return backend.update(state, action.payload.idArr, action.payload.mergeObj);
return backend.update(tx, state, action.payload.idArr, action.payload.mergeObj);
case DELETE:
return backend.delete(state, action.payload);
return backend.delete(tx, state, action.payload);
default:

@@ -202,3 +205,3 @@ return state;

static reducer(state, action, model, session) { // eslint-disable-line
return model.getNextState();
return this.getNextState();
}

@@ -293,3 +296,3 @@

static addUpdate(update) {
update.meta = {name: this.modelName};
update.meta = { name: this.modelName };
this.session.addUpdate(update);

@@ -537,3 +540,3 @@ }

set(propertyName, value) {
this.update({[propertyName]: value});
this.update({ [propertyName]: value });
}

@@ -555,3 +558,3 @@

// and add the new ones.
for (const mergeKey in mergeObj) {
for (const mergeKey in mergeObj) { // eslint-disable-line no-restricted-syntax
if (relFields.hasOwnProperty(mergeKey)) {

@@ -619,3 +622,3 @@ const field = relFields[mergeKey];

if (relatedQs.exists()) {
relatedQs.update({[field.relatedName]: null});
relatedQs.update({ [field.relatedName]: null });
}

@@ -622,0 +625,0 @@ } else if (field instanceof OneToOne) {

@@ -1,5 +0,5 @@

import reject from 'lodash/collection/reject';
import filter from 'lodash/collection/filter';
import mapValues from 'lodash/object/mapValues';
import sortByOrder from 'lodash/collection/sortByOrder';
import reject from 'lodash/reject';
import filter from 'lodash/filter';
import mapValues from 'lodash/mapValues';
import orderBy from 'lodash/orderBy';
import { normalizeEntity } from './utils';

@@ -63,3 +63,3 @@

if (!this._withRefs) {
return this._new(this.idArr, {withRefs: true});
return this._new(this.idArr, { withRefs: true });
}

@@ -85,3 +85,3 @@ return this;

if (this._withRefs) {
return this._new(this.idArr, {withRefs: false});
return this._new(this.idArr, { withRefs: false });
}

@@ -92,5 +92,6 @@ return this;

toString() {
return 'QuerySet contents: \n - ' + this.idArr.map(id => {
return this.modelClass.withId(id).toString();
}).join('\n - ');
const contents = this.idArr.map(id =>
this.modelClass.withId(id).toString()
).join('\n - ');
return `QuerySet contents: \n - ${contents}`;
}

@@ -106,5 +107,3 @@

toRefArray() {
return this.idArr.map(id => {
return this.modelClass.accessId(id);
});
return this.idArr.map(id => this.modelClass.accessId(id));
}

@@ -117,5 +116,3 @@

toModelArray() {
return this.idArr.map((_, idx) => {
return this.at(idx);
});
return this.idArr.map((_, idx) => this.at(idx));
}

@@ -232,3 +229,3 @@

return this._new(newIdArr, {withRefs: false});
return this._new(newIdArr, { withRefs: false });
}

@@ -262,5 +259,3 @@

map(func) {
return this.idArr.map((_, idx) => {
return func(this.at(idx));
});
return this.idArr.map((_, idx) => func(this.at(idx)));
}

@@ -270,3 +265,3 @@

* Returns a new {@link QuerySet} instance with entities ordered by `iteratees` in ascending
* order, unless otherwise specified. Delegates to `lodash.sortByOrder`.
* order, unless otherwise specified. Delegates to `lodash.orderBy`.
*

@@ -305,6 +300,6 @@ * @param {string[]|Function[]} iteratees - an array where each item can be a string or a

}
const sortedEntities = sortByOrder.call(null, entities, iterateeArgs, orders);
const sortedEntities = orderBy.call(null, entities, iterateeArgs, orders);
return this._new(
sortedEntities.map(entity => entity[this.modelClass.idAttribute]),
{withRefs: false});
{ withRefs: false });
}

@@ -311,0 +306,0 @@

@@ -1,4 +0,4 @@

import {createSelectorCreator} from 'reselect';
import forOwn from 'lodash/object/forOwn';
import find from 'lodash/collection/find';
import { createSelectorCreator } from 'reselect';
import forOwn from 'lodash/forOwn';
import find from 'lodash/find';

@@ -19,3 +19,3 @@ import Session from './Session';

} from './descriptors';
import {memoize, eqCheck} from './memoize';
import { memoize, eqCheck } from './memoize';

@@ -134,3 +134,7 @@ import {

get(modelName) {
const found = find(this.registry.concat(this.implicitThroughModels), (model) => model.modelName === modelName);
const found = find(
this.registry.concat(this.implicitThroughModels),
(model) => model.modelName === modelName
);
if (typeof found === 'undefined') {

@@ -148,3 +152,3 @@ throw new Error(`Did not find model ${modelName} from registry.`);

_attachQuerySetMethods(model) {
const {querySetClass} = model;
const { querySetClass } = model;
attachQuerySetMethods(model, querySetClass);

@@ -349,5 +353,4 @@ }

reducer() {
return (state, action) => {
return this.from(state, action).reduce();
};
return (state, action) =>
this.from(state, action).reduce();
}

@@ -354,0 +357,0 @@

@@ -1,2 +0,3 @@

import partition from 'lodash/collection/partition';
import Transaction from './Transaction';
import { ops } from './utils';

@@ -23,3 +24,3 @@ /**

this.updates = [];
this.currentTx = new Transaction();

@@ -47,5 +48,5 @@ this._accessedModels = {};

get accessedModels() {
return this.sessionBoundModels.filter(model => {
return !!this.getDataForModel(model.modelName).accessed;
}).map(model => model.modelName);
return this.sessionBoundModels
.filter(model => !!this.getDataForModel(model.modelName).accessed)
.map(model => model.modelName);
}

@@ -77,24 +78,14 @@

// will mutate the model state.
this[modelName].updateReducer(modelState, update);
this[modelName].updateReducer(null, modelState, update);
} else {
this.updates.push(update);
this.currentTx.addUpdate(update);
}
}
/**
* Gets the recorded updates for `modelClass` and
* deletes them from the {@link Session} instance updates list.
*
* @private
* @param {Model} modelClass - the model class to get updates for
* @return {Object[]} A list of the user-recorded updates for `modelClass`.
*/
getUpdatesFor(modelClass) {
const [updates, other] = partition(
this.updates,
'meta.name',
modelClass.modelName);
getUpdatesFor(modelName) {
return this.currentTx.getUpdatesFor(modelName);
}
this.updates = other;
return updates;
get updates() {
return this.currentTx.updates.map(update => update.update);
}

@@ -136,56 +127,36 @@

const nextState = this.sessionBoundModels.reduce((_nextState, modelClass) => {
const modelState = this.getState(modelClass.modelName);
const tx = this.currentTx;
ops.open();
let nextModelState;
let nextState = prevState;
if (runReducers) {
nextState = this.sessionBoundModels.reduce((_nextState, modelClass) => {
const modelState = this.getState(modelClass.modelName);
if (runReducers) {
nextModelState = modelClass.reducer(modelState, action, modelClass, this);
}
let returnValue = modelClass.reducer(modelState, action, modelClass, this);
if (typeof returnValue === 'undefined') {
returnValue = modelClass.getNextState(tx);
}
return ops.set(modelClass.modelName, returnValue, _nextState);
}, nextState);
}
if (typeof nextModelState === 'undefined') {
// If the reducer wasn't run or it didn't
// return the next state,
// we get the next state manually.
nextModelState = modelClass.getNextState();
}
if (nextModelState !== prevState[modelClass.modelName]) {
if (_nextState === prevState) {
// We know that something has changed, so we cannot
// return the previous state. Switching this reduce function
// to use a shallowcopied version of the previous state.
const prevStateCopied = Object.assign({}, prevState);
prevStateCopied[modelClass.modelName] = nextModelState;
return prevStateCopied;
// There might be some m2m updates left.
const unappliedUpdates = this.currentTx.getUnappliedUpdatesByModel();
if (unappliedUpdates) {
nextState = this.sessionBoundModels.reduce((_nextState, modelClass) => {
const modelName = modelClass.modelName;
if (!unappliedUpdates.hasOwnProperty(modelName)) {
return _nextState;
}
_nextState[modelClass.modelName] = nextModelState;
}
return _nextState;
}, prevState);
// The remaining updates are for M2M tables.
let finalState = nextState;
if (this.updates.length > 0) {
if (finalState === prevState) {
// If we're still working with the previous state,
// shallow copy it since we have updates for sure now.
finalState = Object.assign({}, prevState);
}
finalState = this.updates.reduce((state, update) => {
const modelName = update.meta.name;
state[modelName] = this[modelName].getNextState();
return state;
}, finalState);
} else {
finalState = nextState;
return ops.set(modelName, modelClass.getNextState(tx), _nextState);
}, nextState);
}
this.updates = [];
ops.close();
tx.close();
this.currentTx = new Transaction();
return finalState;
return nextState;
}

@@ -192,0 +163,0 @@

@@ -27,2 +27,3 @@ import chai from 'chai';

};
const mockTx = { meta: {}, onClose() {} };
const backend = new Backend();

@@ -49,3 +50,3 @@

value: state.itemsById[iteratorIndex],
done: done,
done,
});

@@ -64,4 +65,4 @@ iteratorIndex++;

it('correctly inserts an entry', () => {
const entry = {id: 3, data: 'newdata!'};
const newState = backend.insert(state, entry);
const entry = { id: 3, data: 'newdata!' };
const newState = backend.insert(mockTx, state, entry);

@@ -91,5 +92,5 @@ expect(newState).to.not.equal(state);

it('correctly updates entries with a merging object', () => {
const toMergeObj = {data: 'modifiedData'};
const toMergeObj = { data: 'modifiedData' };
const idsToUpdate = [1, 2];
const newState = backend.update(state, idsToUpdate, toMergeObj);
const newState = backend.update(mockTx, state, idsToUpdate, toMergeObj);

@@ -116,3 +117,3 @@ expect(newState).to.not.equal(state);

const idsToDelete = [1, 2];
const newState = backend.delete(state, idsToDelete);
const newState = backend.delete(mockTx, state, idsToDelete);

@@ -119,0 +120,0 @@ expect(newState).to.not.equal(state);

import { expect } from 'chai';
import Model from '../Model';
import QuerySet from '../QuerySet';
import Schema from '../Schema';
import {

@@ -56,3 +58,3 @@ createTestSessionWithData,

it('Models correctly create new instances', () => {
const {Book} = session;
const { Book } = session;
expect(session.updates).to.have.length(0);

@@ -87,3 +89,2 @@ const book = Book.create({

expect(Book.count()).to.equal(3);
Book.withId(0).delete();

@@ -97,3 +98,3 @@

it('Models correctly update when setting properties', () => {
const {Book} = session;
const { Book } = session;
const book = Book.first();

@@ -240,3 +241,3 @@ const newName = 'New Name';

const cover = Cover.create({src: 'somecover.png'});
const cover = Cover.create({ src: 'somecover.png' });
const coverId = cover.getId();

@@ -287,1 +288,30 @@

});
describe('Big Data Test', () => {
let Item;
let schema;
beforeEach(() => {
Item = class extends Model {};
Item.modelName = 'Item';
schema = new Schema();
schema.register(Item);
});
it('adds a big amount of items in acceptable time', function () {
this.timeout(30000);
const session = schema.from(schema.getDefaultState());
const start = new Date().getTime();
const amount = 10000;
for (let i = 0; i < amount; i++) {
session.Item.create({ id: i, name: 'TestItem' });
}
const nextState = session.getNextState();
const end = new Date().getTime();
const tookSeconds = (end - start) / 1000;
console.log(`Creating ${amount} objects took ${tookSeconds}s`);
expect(tookSeconds).to.be.at.most(3);
});
});

@@ -61,3 +61,3 @@ import chai from 'chai';

markAccessedSpy = sinon.spy();
sessionMock = {markAccessed: markAccessedSpy};
sessionMock = { markAccessed: markAccessedSpy };
backendMock = {};

@@ -128,3 +128,3 @@ Model.getBackend = () => backendMock;

instance = new Model({id: 0, name: 'Tommi'});
instance = new Model({ id: 0, name: 'Tommi' });
});

@@ -150,3 +150,3 @@

expect(addUpdateSpy).not.called;
instance.update({name: 'Matt'});
instance.update({ name: 'Matt' });
expect(addUpdateSpy).calledOnce;

@@ -189,3 +189,3 @@ expect(addUpdateSpy.getCall(0).args[0]).to.deep.equal({

it('equals works correctly', () => {
const anotherInstance = new Model({id: 0, name: 'Tommi'});
const anotherInstance = new Model({ id: 0, name: 'Tommi' });
expect(instance.equals(anotherInstance)).to.be.ok;

@@ -192,0 +192,0 @@ });

@@ -63,3 +63,3 @@ import chai from 'chai';

it('filter works correctly with object argument', () => {
const filtered = bookQs.withRefs.filter({name: 'Clean Code'});
const filtered = bookQs.withRefs.filter({ name: 'Clean Code' });
expect(filtered.count()).to.equal(1);

@@ -88,3 +88,3 @@ expect(filtered.ref.first()).to.equal(session.Book.state.itemsById[1]);

it('exclude works correctly with object argument', () => {
const excluded = bookQs.exclude({name: 'Clean Code'});
const excluded = bookQs.exclude({ name: 'Clean Code' });
expect(excluded.count()).to.equal(2);

@@ -95,3 +95,3 @@ expect(excluded.idArr).to.deep.equal([0, 2]);

it('update records a update', () => {
const mergeObj = {name: 'Updated Book Name'};
const mergeObj = { name: 'Updated Book Name' };
expect(session.updates).to.have.length(0);

@@ -164,4 +164,4 @@ bookQs.update(mergeObj);

expect(sess.Book.unreleased().count()).to.equal(1);
expect(sess.Book.withRefs.filter({name: 'Clean Code'}).count()).to.equal(1);
expect(sess.Book.withRefs.filter({ name: 'Clean Code' }).count()).to.equal(1);
});
});

@@ -236,3 +236,3 @@ import chai from 'chai';

const otherUserState = { ...appState, selectedUser: 0 };
const otherUserState = Object.assign({}, appState, { selectedUser: 0 });

@@ -239,0 +239,0 @@ selector(otherUserState);

@@ -73,6 +73,5 @@ import chai from 'chai';

expect(session.updates).to.have.length(0);
const updateObj = {};
const updateObj = { meta: { name: 'MockModel' } };
session.addUpdate(updateObj);
expect(session.updates).to.have.length(1);
expect(session.updates[0]).to.equal(updateObj);
});

@@ -91,3 +90,3 @@

session.updates.push({
session.addUpdate({
type: CREATE,

@@ -98,2 +97,3 @@ meta: {

payload: {
id: 0,
name: 'Caesar',

@@ -100,0 +100,0 @@ },

import Schema from '../Schema';
import Model from '../Model';
import {fk, many, oneToOne} from '../fields';
import { fk, many, oneToOne } from '../fields';

@@ -136,5 +136,5 @@ /**

const normalSession = schema.from(state);
return {session: normalSession, schema, state};
return { session: normalSession, schema, state };
}
export const isSubclass = (a, b) => a.prototype instanceof b;

@@ -1,4 +0,4 @@

import forOwn from 'lodash/object/forOwn';
import intersection from 'lodash/array/intersection';
import difference from 'lodash/array/difference';
import forOwn from 'lodash/forOwn';
import includes from 'lodash/includes';
import getImmutableOps from 'immutable-ops';

@@ -81,5 +81,3 @@ /**

const keys = Object.keys(lookupObj);
return keys.every((key) => {
return lookupObj[key] === entity[key];
});
return keys.every(key => lookupObj[key] === entity[key]);
}

@@ -207,46 +205,2 @@

/**
* Checks if `target` needs to be merged with
* `source`. Does a shallow equal check on the `source`
* object's own properties against the same
* properties on `target`. If all properties are equal,
* returns `null`. Otherwise returns an object
* with the properties that did not pass
* the equality check. The returned object
* can be used to update `target` immutably
* while sharing more structure.
*
* @private
* @param {Object} target - the object to update
* @param {Object} source - the updated props
* @return {Object|null} an object with the inequal props from `source`
* or `null` if no updates or needed.
*/
function objectDiff(target, source) {
const diffObj = {};
let shouldUpdate = false;
forOwn(source, (value, key) => {
if (!target.hasOwnProperty(key) ||
target[key] !== source[key]) {
shouldUpdate = true;
diffObj[key] = value;
}
});
return shouldUpdate ? diffObj : null;
}
function arrayDiffActions(targetArr, sourceArr) {
const itemsInBoth = intersection(targetArr, sourceArr);
const deleteItems = difference(targetArr, itemsInBoth);
const addItems = difference(sourceArr, itemsInBoth);
if (deleteItems.length || addItems.length) {
return {
delete: deleteItems,
add: addItems,
};
}
return null;
}
function reverseFieldErrorMessage(modelName, fieldName, toModelName, backwardsFieldName) {

@@ -276,2 +230,5 @@ return [`Reverse field ${backwardsFieldName} already defined`,

// A global instance of immutable-ops for general use
const ops = getImmutableOps();
export {

@@ -286,6 +243,6 @@ match,

normalizeEntity,
objectDiff,
arrayDiffActions,
reverseFieldErrorMessage,
objectShallowEquals,
ops,
includes,
};

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc