Comparing version 0.8.1 to 0.8.2
@@ -234,3 +234,2 @@ 'use strict'; | ||
var idsToAdd = diffActions.add; | ||
if (idsToDelete.length > 0) { | ||
@@ -237,0 +236,0 @@ var _mergeKey; |
@@ -41,2 +41,4 @@ 'use strict'; | ||
var _fields = require('../fields'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -163,2 +165,3 @@ | ||
var Model = void 0; | ||
var Tag = void 0; | ||
var instance = void 0; | ||
@@ -193,2 +196,16 @@ var sessionMock = void 0; | ||
Model.modelName = 'Model'; | ||
Model.fields = { | ||
tags: new _fields.ManyToMany('Tag') | ||
}; | ||
Tag = function (_BaseModel3) { | ||
(0, _inherits3.default)(Tag, _BaseModel3); | ||
function Tag() { | ||
(0, _classCallCheck3.default)(this, Tag); | ||
return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(Tag).apply(this, arguments)); | ||
} | ||
return Tag; | ||
}(_Model2.default); | ||
Model.markAccessed = function () { | ||
@@ -232,2 +249,30 @@ return undefined; | ||
it('update works correctly when updating many-to-many relation', function () { | ||
var addSpy = _sinon2.default.spy(); | ||
var removeSpy = _sinon2.default.spy(); | ||
var addUpdateSpy = _sinon2.default.spy(); | ||
Model.addUpdate = addUpdateSpy; | ||
Model.fields = { fakem2m: new _fields.ManyToMany('_') }; | ||
instance = new Model({ id: 0, name: 'Tommi', fakem2m: [1, 2, 3] }); | ||
// instance.fakem2m = ... evokes a setter, needs to use defineProperty | ||
// for mocking | ||
Object.defineProperty(instance, 'fakem2m', { | ||
value: { | ||
add: addSpy, | ||
remove: removeSpy, | ||
idArr: [1, 2, 3] | ||
} | ||
}); | ||
instance.update({ fakem2m: [3, 4] }); | ||
expect(removeSpy).to.have.been.calledOnce; | ||
expect(removeSpy).to.have.been.calledWith(1, 2); | ||
expect(addSpy).to.have.been.calledOnce; | ||
expect(addSpy).to.have.been.calledWith(4); | ||
}); | ||
it('set works correctly', function () { | ||
@@ -234,0 +279,0 @@ Model.addUpdate = function () { |
@@ -6,3 +6,3 @@ 'use strict'; | ||
}); | ||
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; | ||
exports.arrayDiffActions = 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; | ||
@@ -45,2 +45,10 @@ var _defineProperty = require('babel-runtime/core-js/object/define-property'); | ||
var _intersection = require('lodash/intersection'); | ||
var _intersection2 = _interopRequireDefault(_intersection); | ||
var _difference = require('lodash/difference'); | ||
var _difference2 = _interopRequireDefault(_difference); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -286,2 +294,16 @@ | ||
function arrayDiffActions(sourceArr, targetArr) { | ||
var itemsInBoth = (0, _intersection2.default)(sourceArr, targetArr); | ||
var deleteItems = (0, _difference2.default)(sourceArr, itemsInBoth); | ||
var addItems = (0, _difference2.default)(targetArr, itemsInBoth); | ||
if (deleteItems.length || addItems.length) { | ||
return { | ||
delete: deleteItems, | ||
add: addItems | ||
}; | ||
} | ||
return null; | ||
} | ||
// A global instance of immutable-ops for general use | ||
@@ -301,2 +323,3 @@ var ops = (0, _immutableOps2.default)(); | ||
exports.ops = ops; | ||
exports.includes = _includes2.default; | ||
exports.includes = _includes2.default; | ||
exports.arrayDiffActions = arrayDiffActions; |
{ | ||
"name": "redux-orm", | ||
"version": "0.8.1", | ||
"version": "0.8.2", | ||
"description": "Simple ORM to manage and query your state trees", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
@@ -417,2 +417,10 @@ redux-orm | ||
### 0.8.2 | ||
Fixed [regression in `Model.prototype.update`](https://github.com/tommikaikkonen/redux-orm/issues/23) | ||
### 0.8.1 | ||
Added `babel-runtime to dependencies` | ||
### 0.8.0 | ||
@@ -419,0 +427,0 @@ |
@@ -564,3 +564,2 @@ import forOwn from 'lodash/forOwn'; | ||
const idsToAdd = diffActions.add; | ||
if (idsToDelete.length > 0) { | ||
@@ -567,0 +566,0 @@ this[mergeKey].remove(...idsToDelete); |
@@ -8,2 +8,3 @@ import chai from 'chai'; | ||
import { UPDATE, DELETE } from '../constants'; | ||
import { ManyToMany } from '../fields'; | ||
@@ -108,2 +109,3 @@ describe('Model', () => { | ||
let Model; | ||
let Tag; | ||
let instance; | ||
@@ -127,2 +129,7 @@ let sessionMock; | ||
Model.modelName = 'Model'; | ||
Model.fields = { | ||
tags: new ManyToMany('Tag'), | ||
}; | ||
Tag = class extends BaseModel {}; | ||
Model.markAccessed = () => undefined; | ||
@@ -164,2 +171,30 @@ | ||
it('update works correctly when updating many-to-many relation', () => { | ||
const addSpy = sinon.spy(); | ||
const removeSpy = sinon.spy(); | ||
const addUpdateSpy = sinon.spy(); | ||
Model.addUpdate = addUpdateSpy; | ||
Model.fields = { fakem2m: new ManyToMany('_') }; | ||
instance = new Model({ id: 0, name: 'Tommi', fakem2m: [1, 2, 3] }); | ||
// instance.fakem2m = ... evokes a setter, needs to use defineProperty | ||
// for mocking | ||
Object.defineProperty(instance, 'fakem2m', { | ||
value: { | ||
add: addSpy, | ||
remove: removeSpy, | ||
idArr: [1, 2, 3], | ||
}, | ||
}); | ||
instance.update({ fakem2m: [3, 4] }); | ||
expect(removeSpy).to.have.been.calledOnce; | ||
expect(removeSpy).to.have.been.calledWith(1, 2); | ||
expect(addSpy).to.have.been.calledOnce; | ||
expect(addSpy).to.have.been.calledWith(4); | ||
}); | ||
it('set works correctly', () => { | ||
@@ -166,0 +201,0 @@ Model.addUpdate = () => undefined; |
import forOwn from 'lodash/forOwn'; | ||
import includes from 'lodash/includes'; | ||
import getImmutableOps from 'immutable-ops'; | ||
import intersection from 'lodash/intersection'; | ||
import difference from 'lodash/difference'; | ||
@@ -228,2 +230,16 @@ /** | ||
function arrayDiffActions(sourceArr, targetArr) { | ||
const itemsInBoth = intersection(sourceArr, targetArr); | ||
const deleteItems = difference(sourceArr, itemsInBoth); | ||
const addItems = difference(targetArr, itemsInBoth); | ||
if (deleteItems.length || addItems.length) { | ||
return { | ||
delete: deleteItems, | ||
add: addItems, | ||
}; | ||
} | ||
return null; | ||
} | ||
// A global instance of immutable-ops for general use | ||
@@ -245,2 +261,3 @@ const ops = getImmutableOps(); | ||
includes, | ||
arrayDiffActions, | ||
}; |
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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1602687
104
7808
549