Skip to content

Commit

Permalink
refactor: remove state pattern and call helpers with correct this c…
Browse files Browse the repository at this point in the history
…ontext

This means that even helpers could be individually required.

```js
PouchDB.plugin({
  add: require('pouchdb-hoodie-api/helpers/add-one')
})
```
  • Loading branch information
boennemann committed Apr 3, 2015
1 parent f9a4492 commit 5ca22d8
Show file tree
Hide file tree
Showing 16 changed files with 73 additions and 79 deletions.
11 changes: 3 additions & 8 deletions lib/add.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@ var addOne = require('./helpers/add-one')
var addMany = require('./helpers/add-many')

module.exports = function add (objects) {
var isArray = Array.isArray(objects)
var state = {
db: this,
Promise: this.constructor.utils.Promise,
errors: this.constructor.Errors
}

return isArray ? addMany(state, objects) : addOne(state, objects)
return Array.isArray(objects) ?
addMany.call(this, objects) :
addOne.call(this, objects)
}
11 changes: 3 additions & 8 deletions lib/find-or-add.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@ var findOrAddOne = require('./helpers/find-or-add-one')
var findOrAddMany = require('./helpers/find-or-add-many')

module.exports = function findOrAdd (idOrObjectOrArray, newObject) {
var state = {
db: this,
Promise: this.constructor.utils.Promise,
errors: this.constructor.Errors
}
var isArray = Array.isArray(idOrObjectOrArray)

return isArray ? findOrAddMany(state, idOrObjectOrArray) : findOrAddOne(state, idOrObjectOrArray, newObject)
return Array.isArray(idOrObjectOrArray) ?
findOrAddMany.call(this, idOrObjectOrArray) :
findOrAddOne.call(this, idOrObjectOrArray, newObject)
}
10 changes: 3 additions & 7 deletions lib/find.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,7 @@ var findOne = require('./helpers/find-one')
var findMany = require('./helpers/find-many')

module.exports = function find (objectsOrIds) {
var state = {
db: this,
errors: this.constructor.Errors
}
var isArray = Array.isArray(objectsOrIds)

return isArray ? findMany(state, objectsOrIds) : findOne(state, objectsOrIds)
return Array.isArray(objectsOrIds) ?
findMany.call(this, objectsOrIds) :
findOne.call(this, objectsOrIds)
}
5 changes: 3 additions & 2 deletions lib/helpers/add-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

var toDoc = require('../utils/to-doc')

module.exports = function addMany (state, objects) {
module.exports = function addMany (objects) {
var docs = objects.map(toDoc)

return state.db.bulkDocs(docs)
return this.bulkDocs(docs)

.then(function (responses) {
return responses.map(function (response, i) {
if (response instanceof Error) return response
Expand Down
11 changes: 8 additions & 3 deletions lib/helpers/add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@

var toDoc = require('../utils/to-doc')

module.exports = function addOne (state, object) {
module.exports = function addOne (object) {
var Promise = this.constructor.utils.Promise
var errors = this.constructor.Errors

if (typeof object !== 'object') {
return state.Promise.reject(state.errors.NOT_AN_OBJECT)
return Promise.reject(errors.NOT_AN_OBJECT)
}

var method = object.id ? 'put' : 'post'
return state.db[method](toDoc(object))

return this[method](toDoc(object))

.then(function (response) {
object.id = response.id
object._rev = response.rev
Expand Down
7 changes: 4 additions & 3 deletions lib/helpers/find-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@
var toId = require('../utils/to-id')
var toObject = require('../utils/to-object')

module.exports = function findMany (state, idsOrObjects) {
module.exports = function findMany (idsOrObjects) {
var errors = this.constructor.Errors
var ids = idsOrObjects.map(toId)

return state.db.allDocs({keys: ids, include_docs: true})
return this.allDocs({keys: ids, include_docs: true})

.then(function (response) {
var foundMap = response.rows.reduce(function (map, row) {
Expand All @@ -17,7 +18,7 @@ module.exports = function findMany (state, idsOrObjects) {
var doc = foundMap[id]
if (doc) return doc

return state.errors.MISSING_DOC
return errors.MISSING_DOC
})

return docs.map(toObject)
Expand Down
4 changes: 2 additions & 2 deletions lib/helpers/find-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
var toId = require('../utils/to-id')
var toObject = require('../utils/to-object')

module.exports = function findOne (state, idOrObject) {
module.exports = function findOne (idOrObject) {
var id = toId(idOrObject)
return state.db.get(id).then(toObject)
return this.get(id).then(toObject)
}
7 changes: 4 additions & 3 deletions lib/helpers/find-or-add-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ var toId = require('../utils/to-id')
var findMany = require('./find-many')
var addMany = require('./add-many')

module.exports = function findOrAddMany (state, passedObjects) {
module.exports = function findOrAddMany (passedObjects) {
var self = this
var foundObjects
var passedObjectIds = passedObjects.map(toId)

return findMany(state, passedObjectIds)
return findMany.call(this, passedObjectIds)

.then(function (_foundObjects) {
foundObjects = _foundObjects
Expand All @@ -19,7 +20,7 @@ module.exports = function findOrAddMany (state, passedObjects) {
return notFoundObjects
}, [])

return addMany(state, notFoundObjects)
return addMany.call(self, notFoundObjects)
})

.then(function (addedObjects) {
Expand Down
14 changes: 9 additions & 5 deletions lib/helpers/find-or-add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@ var toId = require('../utils/to-id')
var findOne = require('./find-one')
var addOne = require('./add-one')

module.exports = function findOrAddOne (state, idOrObject, newObject) {
module.exports = function findOrAddOne (idOrObject, newObject) {
var self = this
var Promise = this.constructor.utils.Promise
var errors = this.constructor.Errors
var id = toId(idOrObject)

if (!id) return state.Promise.reject(state.errors.MISSING_ID)
if (!id) return Promise.reject(errors.MISSING_ID)

if (idOrObject === id && !newObject) {
return state.Promise.reject(state.errors.MISSING_ID)
return Promise.reject(errors.MISSING_ID)
}

return findOne(state, id)
return findOne.call(this, id)

.catch(function (/*error*/) {
if (typeof newObject === 'object') {
newObject.id = id
} else {
newObject = idOrObject
}

return addOne(state, newObject)
return addOne.call(self, newObject)
})
}
10 changes: 6 additions & 4 deletions lib/helpers/update-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ var toDoc = require('../utils/to-doc')
var toId = require('../utils/to-id')
var findMany = require('./find-many')

module.exports = function updateMany (state, array, change) {
module.exports = function updateMany (array, change) {
var self = this
var errors = this.constructor.Errors
var objects
var ids = array.map(toId)

return findMany(state, array)
return findMany.call(this, array)

.then(function (objects) {
if (change) {
Expand All @@ -24,7 +26,7 @@ module.exports = function updateMany (state, array, change) {
return objects.map(function (object, index) {
var passedObject = array[index]
if (object instanceof Error) return object
if (typeof passedObject !== 'object') return state.errors.NOT_AN_OBJECT
if (typeof passedObject !== 'object') return errors.NOT_AN_OBJECT
return extend(object, passedObject)
})
})
Expand All @@ -34,7 +36,7 @@ module.exports = function updateMany (state, array, change) {
var validObjects = objects.filter(function (object) {
return !(object instanceof Error)
})
return state.db.bulkDocs(validObjects.map(toDoc))
return self.bulkDocs(validObjects.map(toDoc))
})

.then(function (responses) {
Expand Down
11 changes: 7 additions & 4 deletions lib/helpers/update-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,17 @@ var changeObject = require('../utils/change-object')
var toDoc = require('../utils/to-doc')
var findOne = require('./find-one')

module.exports = function updateOne (state, idOrObject, change) {
module.exports = function updateOne (idOrObject, change) {
var self = this
var Promise = this.constructor.utils.Promise
var errors = this.constructor.Errors
var object

if (typeof idOrObject === 'string' && !change) {
return state.Promise.reject(state.errors.NOT_AN_OBJECT)
return Promise.reject(errors.NOT_AN_OBJECT)
}

return findOne(state, idOrObject)
return findOne.call(this, idOrObject)

.then(function (object) {
if (!change) return extend(object, idOrObject)
Expand All @@ -22,7 +25,7 @@ module.exports = function updateOne (state, idOrObject, change) {

.then(function (_object) {
object = _object
return state.db.put(toDoc(object))
return self.put(toDoc(object))
})

.then(function (response) {
Expand Down
7 changes: 4 additions & 3 deletions lib/helpers/update-or-add-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ var toId = require('../utils/to-id')
var addMany = require('./add-many')
var updateMany = require('./update-many')

module.exports = function updateOrAddMany (state, passedObjects) {
module.exports = function updateOrAddMany (passedObjects) {
var self = this
var addedObjects
var passedObjectIds = passedObjects.map(toId)

return addMany(state, passedObjects)
return addMany.call(this, passedObjects)

.then(function (_addedObjectsAndErrors) {
addedObjects = _addedObjectsAndErrors
Expand All @@ -20,7 +21,7 @@ module.exports = function updateOrAddMany (state, passedObjects) {
return array
}, [])

return updateMany(state, conflicting)
return updateMany.call(self, conflicting)
})

.then(function (updatedObjects) {
Expand Down
9 changes: 5 additions & 4 deletions lib/helpers/update-or-add-one.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,18 @@ var toId = require('../utils/to-id')
var addOne = require('./add-one')
var updateOne = require('./update-one')

module.exports = function updateOrAddOne (state, idOrObject, newObject) {
return updateOne(state, idOrObject, newObject)
module.exports = function updateOrAddOne (idOrObject, newObject) {
var self = this
return updateOne.call(this, idOrObject, newObject)

.catch(function (error) {
if (error.status !== 404) throw error

if (newObject) {
newObject.id = toId(idOrObject)
return addOne(state, newObject)
return addOne.call(self, newObject)
}

return addOne(state, idOrObject)
return addOne.call(self, idOrObject)
})
}
12 changes: 3 additions & 9 deletions lib/remove.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,7 @@ var updateOne = require('./helpers/update-one')
var updateMany = require('./helpers/update-many')

module.exports = function remove (objectsOrIds) {
var state = {
db: this,
Promise: this.constructor.utils.Promise,
errors: this.constructor.Errors
}
var isArray = Array.isArray(objectsOrIds)

return isArray ? updateMany(state, objectsOrIds, {_deleted: true})
: updateOne(state, objectsOrIds, {_deleted: true})
return Array.isArray(objectsOrIds) ?
updateMany.call(this, objectsOrIds, {_deleted: true}) :
updateOne.call(this, objectsOrIds, {_deleted: true})
}
11 changes: 3 additions & 8 deletions lib/update-or-add.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,7 @@ var updateOrAddOne = require('./helpers/update-or-add-one')
var updateOrAddMany = require('./helpers/update-or-add-many')

module.exports = function updateOrAdd (idOrObjectOrArray, newObject) {
var state = {
db: this,
Promise: this.constructor.utils.Promise,
errors: this.constructor.Errors
}
var isArray = Array.isArray(idOrObjectOrArray)

return isArray ? updateOrAddMany(state, idOrObjectOrArray) : updateOrAddOne(state, idOrObjectOrArray, newObject)
return Array.isArray(idOrObjectOrArray) ?
updateOrAddMany.call(this, idOrObjectOrArray) :
updateOrAddOne.call(this, idOrObjectOrArray, newObject)
}
12 changes: 6 additions & 6 deletions lib/update.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ var updateOne = require('./helpers/update-one')
var updateMany = require('./helpers/update-many')

module.exports = function update (objectsOrIds, change) {
var Promise = this.constructor.utils.Promise
var state = { db: this, Promise: Promise, errors: this.constructor.Errors }
var isArray = Array.isArray(objectsOrIds)

if (typeof objectsOrIds !== 'object' && !change) {
return Promise.reject(new Error('Must provide change'))
return this.constructor.utils.Promise.reject(
new Error('Must provide change')
)
}

return isArray ? updateMany(state, objectsOrIds, change) : updateOne(state, objectsOrIds, change)
return Array.isArray(objectsOrIds) ?
updateMany.call(this, objectsOrIds, change) :
updateOne.call(this, objectsOrIds, change)
}

0 comments on commit 5ca22d8

Please sign in to comment.