59 lines
1.2 KiB
JavaScript
59 lines
1.2 KiB
JavaScript
var util = require('../src/util')
|
|
var slice = util.slice
|
|
var assign = util.assign
|
|
|
|
var updatePlugin = require('./update')
|
|
|
|
module.exports = [updatePlugin, operationsPlugin]
|
|
|
|
function operationsPlugin() {
|
|
return {
|
|
// array
|
|
push: push,
|
|
pop: pop,
|
|
shift: shift,
|
|
unshift: unshift,
|
|
|
|
// obj
|
|
assign: assign_,
|
|
}
|
|
|
|
// array
|
|
function push(_, key, val1, val2, val3, etc) {
|
|
return _arrayOp.call(this, 'push', arguments)
|
|
}
|
|
function pop(_, key) {
|
|
return _arrayOp.call(this, 'pop', arguments)
|
|
}
|
|
function shift(_, key) {
|
|
return _arrayOp.call(this, 'shift', arguments)
|
|
}
|
|
function unshift(_, key, val1, val2, val3, etc) {
|
|
return _arrayOp.call(this, 'unshift', arguments)
|
|
}
|
|
|
|
// obj
|
|
function assign_(_, key, props1, props2, props3, etc) {
|
|
var varArgs = slice(arguments, 2)
|
|
return this.update(key, {}, function(val) {
|
|
if (typeof val != 'object') {
|
|
throw new Error('store.assign called for non-object value with key "'+key+'"')
|
|
}
|
|
varArgs.unshift(val)
|
|
return assign.apply(Object, varArgs)
|
|
})
|
|
}
|
|
|
|
// internal
|
|
///////////
|
|
function _arrayOp(arrayFn, opArgs) {
|
|
var res
|
|
var key = opArgs[1]
|
|
var rest = slice(opArgs, 2)
|
|
this.update(key, [], function(arrVal) {
|
|
res = Array.prototype[arrayFn].apply(arrVal, rest)
|
|
})
|
|
return res
|
|
}
|
|
}
|