Skip to content

Commit

Permalink
fix: store('foo').add({type: 'bar'}) should reject with TypeError
Browse files Browse the repository at this point in the history
  • Loading branch information
capellini committed Sep 21, 2016
1 parent 81b2651 commit e4119f3
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 31 deletions.
2 changes: 1 addition & 1 deletion lib/scoped/add.js
Expand Up @@ -2,7 +2,7 @@ module.exports = add

var addType = require('../utils/add-type')

function add (type, api, objects) {
function add (api, type, objects) {
if (Array.isArray(objects)) {
objects = objects.map(addType.bind(null, type))
} else {
Expand Down
2 changes: 1 addition & 1 deletion lib/scoped/find-all.js
Expand Up @@ -2,7 +2,7 @@ module.exports = findAll

var typeFilter = require('../utils/type-filter')

function findAll (type, api, filterFunction) {
function findAll (api, type, filterFunction) {
return api.findAll(typeFilter.bind(null, type))

.then(function (scopedObjects) {
Expand Down
8 changes: 4 additions & 4 deletions lib/scoped/find-or-add.js
Expand Up @@ -4,8 +4,8 @@ var toId = require('pouchdb-hoodie-api/utils/to-id')
var find = require('./find')
var add = require('./add')

function findOrAdd (type, api, idOrObjectOrArray, newObject) {
return find(type, api, idOrObjectOrArray)
function findOrAdd (api, type, idOrObjectOrArray, newObject) {
return find(api, type, idOrObjectOrArray)

.then(function (typedObjects) {
if (Array.isArray(idOrObjectOrArray)) {
Expand All @@ -19,7 +19,7 @@ function findOrAdd (type, api, idOrObjectOrArray, newObject) {
return notFoundObjects
}, [])

return add(type, api, notFoundObjects)
return add(api, type, notFoundObjects)

.then(function (addedObjects) {
var passedObjectIds = idOrObjectOrArray.map(toId)
Expand Down Expand Up @@ -54,6 +54,6 @@ function findOrAdd (type, api, idOrObjectOrArray, newObject) {
newObject = idOrObjectOrArray
}

return add(type, api, newObject)
return add(api, type, newObject)
})
}
2 changes: 1 addition & 1 deletion lib/scoped/find.js
Expand Up @@ -2,7 +2,7 @@ module.exports = find

var typeFilter = require('../utils/type-filter')

function find (type, api, objectsOrIds) {
function find (api, type, objectsOrIds) {
return api.find(objectsOrIds)

.then(function (storedObjects) {
Expand Down
20 changes: 11 additions & 9 deletions lib/scoped/index.js
Expand Up @@ -5,16 +5,18 @@ var EventEmitter = require('events').EventEmitter
function scoped (state, api, type) {
var emitter = new EventEmitter()

var boundTypeChecker = require('../utils/type-check-wrapper').bind(null, type)

var scopedApi = {
add: require('./add').bind(null, type, api),
find: require('./find').bind(null, type, api),
findOrAdd: require('./find-or-add').bind(null, type, api),
findAll: require('./find-all').bind(null, type, api),
update: require('./update').bind(null, type, api),
updateOrAdd: require('./update-or-add').bind(null, type, api),
updateAll: require('./update-all').bind(null, type, api),
remove: require('./remove').bind(null, type, api),
removeAll: require('./remove-all').bind(null, type, api),
add: boundTypeChecker(require('./add').bind(null, api)),
find: boundTypeChecker(require('./find').bind(null, api)),
findOrAdd: boundTypeChecker(require('./find-or-add').bind(null, api)),
findAll: require('./find-all').bind(null, api, type),
update: boundTypeChecker(require('./update').bind(null, api)),
updateOrAdd: boundTypeChecker(require('./update-or-add').bind(null, api)),
updateAll: boundTypeChecker(require('./update-all').bind(null, api)),
remove: boundTypeChecker(require('./remove').bind(null, api)),
removeAll: boundTypeChecker(require('./remove-all').bind(null, api)),
on: function (eventName, handler) {
emitter.on(type + ':' + eventName, handler)

Expand Down
6 changes: 3 additions & 3 deletions lib/scoped/remove-all.js
Expand Up @@ -3,14 +3,14 @@ module.exports = removeAll
var findAll = require('./find-all')
var remove = require('./remove')

function removeAll (type, api, filterFunction) {
return findAll(type, api)
function removeAll (api, type, filterFunction) {
return findAll(api, type)

.then(function (scopedObjects) {
if (scopedObjects.length === 0) {
return Promise.resolve(scopedObjects)
}

return filterFunction ? remove(type, api, scopedObjects.filter(filterFunction)) : remove(type, api, scopedObjects)
return filterFunction ? remove(api, type, scopedObjects.filter(filterFunction)) : remove(api, type, scopedObjects)
})
}
6 changes: 3 additions & 3 deletions lib/scoped/remove.js
Expand Up @@ -3,8 +3,8 @@ module.exports = remove
var update = require('./update')
var markAsDeleted = require('pouchdb-hoodie-api/utils/mark-as-deleted')

function remove (type, api, objectsOrIds, change) {
function remove (api, type, objectsOrIds, change) {
return Array.isArray(objectsOrIds)
? update(type, api, objectsOrIds.map(markAsDeleted.bind(null, change)))
: update(type, api, objectsOrIds, markAsDeleted(change, objectsOrIds))
? update(api, type, objectsOrIds.map(markAsDeleted.bind(null, change)))
: update(api, type, objectsOrIds, markAsDeleted(change, objectsOrIds))
}
6 changes: 3 additions & 3 deletions lib/scoped/update-all.js
Expand Up @@ -3,10 +3,10 @@ module.exports = updateAll
var findAll = require('./find-all')
var update = require('./update')

function updateAll (type, api, changedProperties) {
return findAll(type, api)
function updateAll (api, type, changedProperties) {
return findAll(api, type)

.then(function (foundObjects) {
return update(type, api, foundObjects, changedProperties)
return update(api, type, foundObjects, changedProperties)
})
}
8 changes: 4 additions & 4 deletions lib/scoped/update-or-add.js
Expand Up @@ -4,8 +4,8 @@ var update = require('./update')
var add = require('./add')
var toId = require('pouchdb-hoodie-api/utils/to-id')

function updateOrAdd (type, api, idOrObjectOrArray, newObject) {
return update(type, api, idOrObjectOrArray, newObject)
function updateOrAdd (api, type, idOrObjectOrArray, newObject) {
return update(api, type, idOrObjectOrArray, newObject)

.then(function (updatedItemsOrErrors) {
if (!Array.isArray(updatedItemsOrErrors)) {
Expand All @@ -17,7 +17,7 @@ function updateOrAdd (type, api, idOrObjectOrArray, newObject) {
// ensure that none are errors
return Promise.all(updatedItemsOrErrors.map(function (updatedItemOrError, index) {
if (isNotFoundError(updatedItemOrError)) {
return add(type, api, idOrObjectOrArray[index])
return add(api, type, idOrObjectOrArray[index])
}

return Promise.resolve(updatedItemOrError)
Expand All @@ -41,7 +41,7 @@ function updateOrAdd (type, api, idOrObjectOrArray, newObject) {
newObject = idOrObjectOrArray
}

return add(type, api, newObject)
return add(api, type, newObject)
})
}

Expand Down
4 changes: 2 additions & 2 deletions lib/scoped/update.js
Expand Up @@ -3,8 +3,8 @@ module.exports = update
var find = require('./find')
var merge = require('lodash/merge')

function update (type, api, objectsOrIds, change) {
return find(type, api, objectsOrIds)
function update (api, type, objectsOrIds, change) {
return find(api, type, objectsOrIds)

.then(function (storedObjects) {
// objectsOrIds may contain updated information for the respective storedObject
Expand Down
21 changes: 21 additions & 0 deletions lib/utils/type-check-wrapper.js
@@ -0,0 +1,21 @@
module.exports = typeCheckWrapper

function typeCheckWrapper (type, scopedFunction) {
var rejectMessage = '\'type\' field in document does not match scoped store type of \'' + type + '\''

return function (objects, secondArgument) {
if (typeErrorExists(objects, type) || typeErrorExists(secondArgument, type)) {
return Promise.reject(new TypeError(rejectMessage))
}

return scopedFunction(type, objects, secondArgument)
}
}

function typeErrorExists (objects, type) {
if (Array.isArray(objects)) {
return objects.some(function (object) { object.type && object.type !== type })
}

return typeof objects === 'object' && objects.type && objects.type !== type
}

0 comments on commit e4119f3

Please sign in to comment.