all files / lib/ setup.js

100% Statements 83/83
80.77% Branches 42/52
100% Functions 12/12
100% Lines 82/82
3 statements, 2 branches Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158                                      104× 80×           31278× 27429×   3849× 6648×   3849×         6845× 6845× 6845×   2967× 2967×   2967×   2967×       3878×   3878× 3877× 27×     3850× 3850× 3850×   3850×     3850×         3878×     3878×   3878×                                             189× 98×          
'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'];