'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _jsExtend = require('js-extend');
var _constructor = require('./constructor');
var _constructor2 = _interopRequireDefault(_constructor);
var _inherits = require('inherits');
var _inherits2 = _interopRequireDefault(_inherits);
var _pouchdbCollections = require('pouchdb-collections');
var _pouchdbCollections2 = _interopRequireDefault(_pouchdbCollections);
var _events = require('events');
var _hasLocalStorage = require('./deps/env/hasLocalStorage');
var _hasLocalStorage2 = _interopRequireDefault(_hasLocalStorage);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
_constructor2.default.adapters = {};
_constructor2.default.preferredAdapters = [];
_constructor2.default.prefix = '_pouch_';
var eventEmitter = new _events.EventEmitter();
function setUpEventEmitter(Pouch) {
Object.keys(_events.EventEmitter.prototype).forEach(function (key) {
if (typeof _events.EventEmitter.prototype[key] === 'function') {
Pouch[key] = eventEmitter[key].bind(eventEmitter);
}
});
// these are created in constructor.js, and allow us to notify each DB with
// the same name that it was destroyed, via the constructor object
var destructListeners = Pouch._destructionListeners = new _pouchdbCollections2.default.Map();
Pouch.on('destroyed', function onConstructorDestroyed(name) {
if (!destructListeners.has(name)) {
return;
}
destructListeners.get(name).forEach(function (callback) {
callback();
});
destructListeners.delete(name);
});
}
setUpEventEmitter(_constructor2.default);
_constructor2.default.parseAdapter = function (name, opts) {
var match = name.match(/([a-z\-]*):\/\/(.*)/);
var adapter, adapterName;
if (match) {
// the http adapter expects the fully qualified name
name = /http(s?)/.test(match[1]) ? match[1] + '://' + match[2] : match[2];
adapter = match[1];
/* istanbul ignore if */
Iif (!_constructor2.default.adapters[adapter].valid()) {
throw 'Invalid adapter';
}
return { name: name, adapter: match[1] };
}
// check for browsers that have been upgraded from websql-only to websql+idb
var skipIdb = 'idb' in _constructor2.default.adapters && 'websql' in _constructor2.default.adapters && (0, _hasLocalStorage2.default)() && localStorage['_pouch__websqldb_' + _constructor2.default.prefix + name];
if (opts.adapter) {
adapterName = opts.adapter;
} else if (typeof opts !== 'undefined' && opts.db) {
adapterName = 'leveldb';
} else {
// automatically determine adapter
for (var i = 0; i < _constructor2.default.preferredAdapters.length; ++i) {
adapterName = _constructor2.default.preferredAdapters[i];
Eif (adapterName in _constructor2.default.adapters) {
/* istanbul ignore if */
Iif (skipIdb && adapterName === 'idb') {
// log it, because this can be confusing during development
console.log('PouchDB is downgrading "' + name + '" to WebSQL to' + ' avoid data loss, because it was already opened with WebSQL.');
continue; // keep using websql to avoid user data loss
}
break;
}
}
}
adapter = _constructor2.default.adapters[adapterName];
// if adapter is invalid, then an error will be thrown later
var usePrefix = adapter && 'use_prefix' in adapter ? adapter.use_prefix : true;
return {
name: usePrefix ? _constructor2.default.prefix + name : name,
adapter: adapterName
};
};
_constructor2.default.adapter = function (id, obj, addToPreferredAdapters) {
Eif (obj.valid()) {
_constructor2.default.adapters[id] = obj;
if (addToPreferredAdapters) {
_constructor2.default.preferredAdapters.push(id);
}
}
};
_constructor2.default.plugin = function (obj) {
Object.keys(obj).forEach(function (id) {
_constructor2.default.prototype[id] = obj[id];
});
return _constructor2.default;
};
_constructor2.default.defaults = function (defaultOpts) {
function PouchAlt(name, opts, callback) {
if (!(this instanceof PouchAlt)) {
return new PouchAlt(name, opts, callback);
}
Eif (typeof opts === 'function' || typeof opts === 'undefined') {
callback = opts;
opts = {};
}
if (name && typeof name === 'object') {
opts = name;
name = undefined;
}
opts = (0, _jsExtend.extend)({}, defaultOpts, opts);
_constructor2.default.call(this, name, opts, callback);
}
(0, _inherits2.default)(PouchAlt, _constructor2.default);
setUpEventEmitter(PouchAlt);
PouchAlt.preferredAdapters = _constructor2.default.preferredAdapters.slice();
Object.keys(_constructor2.default).forEach(function (key) {
if (!(key in PouchAlt)) {
PouchAlt[key] = _constructor2.default[key];
}
});
return PouchAlt;
};
exports.default = _constructor2.default;
module.exports = exports['default']; |