const lodash = require('lodash');
|
const assert = require('assert');
|
const is = require('is-type-of');
|
const FileSync = require('./adapters/FileSync');
|
|
class JsonDBMain {
|
|
constructor(options = {}) {
|
this.opt = options;
|
}
|
|
create() {
|
const adapter = new FileSync(this.opt);
|
|
assert(typeof adapter === 'object', 'An adapter must be provided');
|
|
// Create a fresh copy of lodash
|
const _ = lodash.runInContext()
|
const db = _.chain({})
|
|
// Add write function to lodash
|
// Calls save before returning result
|
_.prototype.write = _.wrap(_.prototype.value, function(func) {
|
const funcRes = func.apply(this)
|
return db.write(funcRes)
|
})
|
|
function plant(state) {
|
db.__wrapped__ = state
|
return db
|
}
|
|
// Expose _ for mixins
|
db._ = _
|
|
db.read = () => {
|
const r = adapter.read()
|
return is.promise(r) ? r.then(plant) : plant(r)
|
}
|
|
db.write = returnValue => {
|
const w = adapter.write(db.getState())
|
return is.promise(w) ? w.then(() => returnValue) : returnValue
|
}
|
|
db.getState = () => db.__wrapped__
|
|
db.setState = state => plant(state)
|
|
return db.read()
|
}
|
|
}
|
|
module.exports = JsonDBMain;
|