From 51b6e3de87ef410e9ccd4359bc3ec9523e8d0dbc Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Sun, 20 Mar 2016 09:22:52 -0700 Subject: [PATCH] Linting (including Karma file indent); Babelify/Uglify/ESLint and add source maps for test worker; Avoid polyfill double-loading; Put test worker in test directory; Grunt: Reorder tasks to be more in normal order of execution; Load polyfill in worker for sake of PhantomJS tests; Overcome or workaround Karma/PhantomJS issues with workers, Documenting limitations; Remove ecmaFeatures:modules (not needed); Allow override of Saucekey env var. Rename web workers file to enable to execute first and avoid PhantomJS interaction problem with server-handlers.js; Promise rejection for bad schema callback or IDBKeyRange call --- .babelrc | 3 +- Gruntfile.js | 88 ++-- dist/db.js | 436 +++++++++++++++++- dist/db.js.map | 2 +- dist/db.min.js | 2 +- dist/db.min.js.map | 2 +- karma.conf.js | 158 +++---- package.json | 7 +- src/db.js | 35 +- test-worker.js => src/test-worker.js | 8 +- tests/helpers/chai-setup.js | 1 + tests/helpers/guid.js | 7 +- tests/helpers/phantom.js | 134 +++--- .../specs/{web-workers.js => _web-workers.js} | 7 +- tests/specs/blocked-events.js | 1 + tests/specs/close-db.js | 6 +- tests/specs/cmp.js | 2 +- tests/specs/delete-db.js | 1 + tests/specs/indexes.js | 1 + tests/specs/open-db.js | 13 +- tests/specs/query.js | 5 +- tests/specs/server-add.js | 1 + tests/specs/server-count.js | 1 + tests/specs/server-handlers.js | 8 +- tests/specs/server-remove.js | 1 + tests/specs/server-update.js | 1 + tests/specs/thenable-integration.js | 1 + tests/test-worker.js | 2 + tests/test-worker.js.map | 1 + tests/views/index.jade | 3 +- 30 files changed, 703 insertions(+), 235 deletions(-) rename test-worker.js => src/test-worker.js (82%) rename tests/specs/{web-workers.js => _web-workers.js} (91%) create mode 100644 tests/test-worker.js create mode 100644 tests/test-worker.js.map diff --git a/.babelrc b/.babelrc index c13c5f6..6f20dd0 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,4 @@ { - "presets": ["es2015"] + "presets": ["es2015"], + "plugins": ["transform-es2015-modules-commonjs"] } diff --git a/Gruntfile.js b/Gruntfile.js index c5b2184..167fa71 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,10 +1,10 @@ -module.exports = function(grunt) { +module.exports = function (grunt) { 'use strict'; // Project configuration. var saucekey = process.env.saucekey; if (!saucekey) { - console.warn('Unable to load saucelabs key'); + console.warn('Unable to load Saucelabs key'); } grunt.initConfig({ @@ -51,55 +51,79 @@ module.exports = function(grunt) { platform: 'Windows 2008' }] }, - onTestComplete: function(result, callback) { + onTestComplete: function (result, callback) { console.dir(result); } } }, - 'babel': { + karma: { + options: { + configFile: 'karma.conf.js' + }, + ci: { + singleRun: true, + browsers: ['PhantomJS'] + }, + dev: { + singleRun: false, + browsers: ['PhantomJS'] + }, + 'dev-single': { + singleRun: true, + browsers: ['PhantomJS'] + } + }, + + eslint: { + target: ['src/db.js', 'src/test-worker.js'] + }, + + babel: { options: { sourceMap: true }, dist: { files: { - 'dist/db.js': 'src/db.js' + 'dist/db.js': 'src/db.js', + 'tests/test-worker.js': 'src/test-worker.js' } } }, - 'eslint': { - target: ['src/db.js'] + browserify: { + dist: { + files: { + 'dist/db.js': 'dist/db.js' + }, + options: { + browserifyOptions: { + standalone: 'db' + } + } + } }, uglify: { options: { sourceMap: true, - sourceMapIncludeSources: true, - sourceMapIn: 'dist/db.js.map' // input sourcemap from a previous compilation + sourceMapIncludeSources: true }, - dist: { + dbjs: { + options: { + sourceMapIn: 'dist/db.js.map' // input sourcemap from a previous compilation + }, files: { 'dist/db.min.js': ['dist/db.js'] } - } - }, - - karma: { - options: { - configFile: 'karma.conf.js' }, - ci: { - singleRun: true, - browsers: ['PhantomJS'] - }, - dev: { - singleRun: false, - browsers: ['PhantomJS'] - }, - 'dev-single': { - singleRun: true, - browsers: ['PhantomJS'] + testworker: { + options: { + sourceMapIn: 'tests/test-worker.js.map' // input sourcemap from a previous compilation + }, + files: { + 'tests/test-worker.js': ['tests/test-worker.js'] + } } } }); @@ -107,19 +131,19 @@ module.exports = function(grunt) { // load all grunt tasks require('matchdep').filterDev(['grunt-*', '!grunt-cli']).forEach(grunt.loadNpmTasks); - grunt.registerTask('forever', function() { + grunt.registerTask('forever', function () { this.async(); }); - var devJobs = ['eslint', 'babel', 'uglify', 'clean', 'jade']; + var devJobs = ['eslint', 'babel', 'browserify', 'uglify', 'clean', 'jade']; var testJobs = devJobs.concat('connect'); if (saucekey && !process.env.TRAVIS_PULL_REQUEST) { - console.info('adding saucelabs integration'); + console.info('adding Saucelabs integration'); testJobs.push('saucelabs-mocha'); } if (process.env.TRAVIS_JOB_ID) { - testJobs = testJobs.concat('karma:ci'); + testJobs.push('karma:ci'); } else { testJobs.push('karma:dev-single'); } @@ -127,7 +151,7 @@ module.exports = function(grunt) { grunt.registerTask('dev', devJobs); grunt.registerTask('test', testJobs); grunt.registerTask('default', 'test'); - grunt.registerTask('test:local', function() { + grunt.registerTask('test:local', function () { grunt.task.run(devJobs); grunt.task.run('connect:server:keepalive'); }); diff --git a/dist/db.js b/dist/db.js index 6ae4610..360bd55 100644 --- a/dist/db.js +++ b/dist/db.js @@ -1,9 +1,16 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.db = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o version) { + options.version = idbschemaVersion; + } + } catch (e) { + reject(e); + return { + v: void 0 + }; + } + } + if (typeof schema === 'function') { + try { + schema = schema(); + } catch (e) { + reject(e); + return { + v: void 0 + }; + } + } var request = indexedDB.open(server, version); request.onsuccess = function (e) { - return _open(e, server, options.noServerMethods, version, options.schema).then(resolve, reject); + return _open(e, server, noServerMethods, version).then(resolve, reject); }; - request.onupgradeneeded = function (e) { - return createSchema(e, options.schema, e.target.result); + request.onupgradeneeded = idbschema ? idbschema.callback() : function (e) { + return createSchema(e, schema, e.target.result); }; request.onerror = function (e) { return reject(e); @@ -674,7 +709,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr // the user unblocks by closing the blocking // connection request.onsuccess = function (ev) { - _open(ev, server, options.noServerMethods, version, options.schema).then(res, rej); + _open(ev, server, noServerMethods, version).then(res, rej); }; request.onerror = function (e) { return rej(e); @@ -683,7 +718,9 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr e.resume = resume; reject(e); }; - })(); + }(); + + if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v; } }); }, @@ -742,4 +779,377 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr local.db = db; } })(self); -//# sourceMappingURL=db.js.map + + +},{"idb-schema":2}],2:[function(require,module,exports){ +'use strict'; + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _objectValues = require('object-values'); + +var _objectValues2 = _interopRequireDefault(_objectValues); + +var _isInteger = require('is-integer'); + +var _isInteger2 = _interopRequireDefault(_isInteger); + +var _isPlainObj = require('is-plain-obj'); + +var _isPlainObj2 = _interopRequireDefault(_isPlainObj); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +/** + * Maximum version value (unsigned long long) + * http://www.w3.org/TR/IndexedDB/#events + */ + +var MAX_VERSION = Math.pow(2, 32) - 1; + +/** + * Export `Schema`. + */ + +var Schema = (function () { + function Schema() { + _classCallCheck(this, Schema); + + this._stores = {}; + this._current = {}; + this._versions = {}; + this.version(1); + } + + /** + * Get/Set new version. + * + * @param {Number} [version] + * @return {Schema|Number} + */ + + _createClass(Schema, [{ + key: 'version', + value: function version(_version) { + if (!arguments.length) return this._current.version; + if (!(0, _isInteger2.default)(_version) || _version < 1 || _version < this.version() || _version > MAX_VERSION) { + throw new TypeError('invalid version'); + } + + this._current = { version: _version, store: null }; + this._versions[_version] = { + stores: [], // db.createObjectStore + dropStores: [], // db.deleteObjectStore + indexes: [], // store.createIndex + dropIndexes: [], // store.deleteIndex + callbacks: [], + version: _version }; + + // version + return this; + } + + /** + * Add store. + * + * @param {String} name + * @param {Object} [opts] { key: null, increment: false } + * @return {Schema} + */ + + }, { + key: 'addStore', + value: function addStore(name) { + var opts = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; + + if (typeof name !== 'string' || !name) throw new TypeError('"name" is required'); + if (this._stores[name]) throw new TypeError('"' + name + '" store is already defined'); + + var store = { + name: name, + indexes: {}, + keyPath: opts.key || opts.keyPath || null, + autoIncrement: opts.increment || opts.autoIncrement || false + }; + if (store.autoIncrement && !store.keyPath) { + throw new TypeError('set keyPath in order to use autoIncrement'); + } + + this._stores[name] = store; + this._versions[this.version()].stores.push(store); + this._current.store = store; + + return this; + } + + /** + * Delete store. + * + * @param {String} name + * @return {Schema} + */ + + }, { + key: 'delStore', + value: function delStore(name) { + if (typeof name !== 'string' || !name) throw new TypeError('"name" is required'); + var store = this._stores[name]; + if (!store) throw new TypeError('"' + name + '" store is not defined'); + delete this._stores[name]; + this._versions[this.version()].dropStores.push(store); + this._current.store = null; + return this; + } + + /** + * Change current store. + * + * @param {String} name + * @return {Schema} + */ + + }, { + key: 'getStore', + value: function getStore(name) { + if (typeof name !== 'string' || !name) throw new TypeError('"name" is required'); + if (!this._stores[name]) throw new TypeError('"' + name + '" store is not defined'); + this._current.store = this._stores[name]; + return this; + } + + /** + * Add index. + * + * @param {String} name + * @param {String|Array} field + * @param {Object} [opts] { unique: false, multi: false } + * @return {Schema} + */ + + }, { + key: 'addIndex', + value: function addIndex(name, field) { + var opts = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; + + if (typeof name !== 'string' || !name) throw new TypeError('"name" is required'); + if (typeof field !== 'string' && !Array.isArray(field)) { + throw new TypeError('"field" is required'); + } + var store = this._current.store; + if (!store) throw new TypeError('set current store using "getStore" or "addStore"'); + if (store.indexes[name]) throw new TypeError('"' + name + '" index is already defined'); + + var index = { + name: name, + field: field, + storeName: store.name, + multiEntry: opts.multi || opts.multiEntry || false, + unique: opts.unique || false + }; + store.indexes[name] = index; + this._versions[this.version()].indexes.push(index); + + return this; + } + + /** + * Delete index. + * + * @param {String} name + * @return {Schema} + */ + + }, { + key: 'delIndex', + value: function delIndex(name) { + if (typeof name !== 'string' || !name) throw new TypeError('"name" is required'); + var index = this._current.store.indexes[name]; + if (!index) throw new TypeError('"' + name + '" index is not defined'); + delete this._current.store.indexes[name]; + this._versions[this.version()].dropIndexes.push(index); + return this; + } + + /** + * Add a callback to be executed at the end of the `upgradeneeded` event. + * Callback will be supplied the `upgradeneeded` event object. + * + * @param {Function} cb + * @return {Schema} + */ + + }, { + key: 'addCallback', + value: function addCallback(cb) { + this._versions[this.version()].callbacks.push(cb); + return this; + } + + /** + * Generate onupgradeneeded callback. + * + * @return {Function} + */ + + }, { + key: 'callback', + value: function callback() { + var versions = (0, _objectValues2.default)(_clone(this._versions)).sort(function (a, b) { + return a.version - b.version; + }); + return function onupgradeneeded(e) { + var oldVersion = e.oldVersion > MAX_VERSION ? 0 : e.oldVersion; // Safari bug + var db = e.target.result; + var tr = e.target.transaction; + + versions.forEach(function (versionSchema) { + if (oldVersion >= versionSchema.version) return; + + versionSchema.stores.forEach(function (s) { + // Only pass the options that are explicitly specified to createObjectStore() otherwise IE/Edge + // can throw an InvalidAccessError - see https://msdn.microsoft.com/en-us/library/hh772493(v=vs.85).aspx + var opts = {}; + if (s.keyPath) opts.keyPath = s.keyPath; + if (s.autoIncrement) opts.autoIncrement = s.autoIncrement; + db.createObjectStore(s.name, opts); + }); + + versionSchema.dropStores.forEach(function (s) { + db.deleteObjectStore(s.name); + }); + + versionSchema.indexes.forEach(function (i) { + tr.objectStore(i.storeName).createIndex(i.name, i.field, { + unique: i.unique, + multiEntry: i.multiEntry + }); + }); + + versionSchema.dropIndexes.forEach(function (i) { + tr.objectStore(i.storeName).deleteIndex(i.name); + }); + + versionSchema.callbacks.forEach(function (cb) { + cb(e); + }); + }); + }; + } + + /** + * Get a description of the stores. + * It creates a deep clone of `this._stores` object + * and transform it to an array. + * + * @return {Array} + */ + + }, { + key: 'stores', + value: function stores() { + return (0, _objectValues2.default)(_clone(this._stores)).map(function (store) { + store.indexes = (0, _objectValues2.default)(store.indexes).map(function (index) { + delete index.storeName; + return index; + }); + return store; + }); + } + + /** + * Clone `this` to new schema object. + * + * @return {Schema} - new object + */ + + }, { + key: 'clone', + value: function clone() { + var _this = this; + + var schema = new Schema(); + Object.keys(this).forEach(function (key) { + return schema[key] = _clone(_this[key]); + }); + return schema; + } + }]); + + return Schema; +})(); + +/** + * Clone `obj`. + * https://github.com/component/clone/blob/master/index.js + */ + +exports.default = Schema; +function _clone(obj) { + if (Array.isArray(obj)) { + return obj.map(function (val) { + return _clone(val); + }); + } + if ((0, _isPlainObj2.default)(obj)) { + return Object.keys(obj).reduce(function (copy, key) { + copy[key] = _clone(obj[key]); + return copy; + }, {}); + } + return obj; +} +module.exports = exports['default']; +},{"is-integer":4,"is-plain-obj":5,"object-values":7}],3:[function(require,module,exports){ +'use strict'; +var numberIsNan = require('number-is-nan'); + +module.exports = Number.isFinite || function (val) { + return !(typeof val !== 'number' || numberIsNan(val) || val === Infinity || val === -Infinity); +}; + +},{"number-is-nan":6}],4:[function(require,module,exports){ +// https://github.com/paulmillr/es6-shim +// http://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isinteger +var isFinite = require("is-finite"); +module.exports = Number.isInteger || function(val) { + return typeof val === "number" && + isFinite(val) && + Math.floor(val) === val; +}; + +},{"is-finite":3}],5:[function(require,module,exports){ +'use strict'; +var toString = Object.prototype.toString; + +module.exports = function (x) { + var prototype; + return toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({})); +}; + +},{}],6:[function(require,module,exports){ +'use strict'; +module.exports = Number.isNaN || function (x) { + return x !== x; +}; + +},{}],7:[function(require,module,exports){ +'use strict'; +module.exports = function (obj) { + var keys = Object.keys(obj); + var ret = []; + + for (var i = 0; i < keys.length; i++) { + ret.push(obj[keys[i]]); + } + + return ret; +}; + +},{}]},{},[1])(1) +}); \ No newline at end of file diff --git a/dist/db.js.map b/dist/db.js.map index eabe572..9daf072 100644 --- a/dist/db.js.map +++ b/dist/db.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/db.js"],"names":[],"mappings":"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","file":"db.js","sourcesContent":["(function (local) {\r\n 'use strict';\r\n\r\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\r\n const transactionModes = {\r\n readonly: 'readonly',\r\n readwrite: 'readwrite'\r\n };\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n const defaultMapper = x => x;\r\n\r\n let indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n var keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n var key = keys[0];\r\n var val = opts[key];\r\n var name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n var x = opts[keys[0]];\r\n var y = opts[keys[1]];\r\n var pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n var Server = function (db, name, noServerMethods, version) {\r\n var closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => {\r\n // prevent Firefox from throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n records.forEach(function (record) {\r\n var req;\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n var target = e.target;\r\n var keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n records.forEach(function (record) {\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n store.put(record, key);\r\n } else {\r\n store.put(record);\r\n }\r\n });\r\n });\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(key);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.delete(key);\r\n });\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = store.get(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.query = function (table, index) {\r\n var error = closed ? 'Database has been closed' : null;\r\n return new IndexQuery(table, db, index, error);\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = key === undefined ? store.count() : store.count(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n var err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n var keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n var IndexQuery = function (table, db, indexName, preexistingError) {\r\n var modifyObj = false;\r\n\r\n var runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n var keyRange = type ? IDBKeyRange[type](...args) : null;\r\n var results = [];\r\n var indexArgs = [keyRange];\r\n var counter = 0;\r\n\r\n var transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.oncomplete = () => resolve(results);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var index = indexName ? store.index(indexName) : store;\r\n\r\n limitRange = limitRange || null;\r\n filters = filters || [];\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n var modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n var modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n var val = modifyObj[key];\r\n if (val instanceof Function) { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) {\r\n var cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]);\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // out of limit range... skip\r\n } else {\r\n var matchFilter = true;\r\n var result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n filters.forEach(function (filter) {\r\n if (!filter || !filter.length) {\r\n // Invalid filter do nothing\r\n } else if (filter.length === 2) {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n } else {\r\n matchFilter = matchFilter && filter[0](result);\r\n }\r\n });\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // if we're doing a modify, run it now\r\n if (modifyObj) {\r\n result = modifyRecord(result);\r\n cursor.update(result);\r\n }\r\n results.push(mapper(result));\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n var Query = function (type, args, queuedError) {\r\n var direction = 'next';\r\n var cursorType = 'openCursor';\r\n var filters = [];\r\n var limitRange = null;\r\n var mapper = defaultMapper;\r\n var unique = false;\r\n var error = preexistingError || queuedError;\r\n\r\n var execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n var limit = function (...args) {\r\n limitRange = args.slice(0, 2);\r\n if (limitRange.length === 1) {\r\n limitRange.unshift(0);\r\n }\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n var count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n\r\n var filter, desc, distinct, modify, map;\r\n var keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n execute,\r\n filter,\r\n distinct,\r\n map\r\n };\r\n };\r\n filter = function (...args) {\r\n filters.push(args.slice(0, 2));\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n distinct,\r\n modify,\r\n map\r\n };\r\n };\r\n distinct = function () {\r\n unique = true;\r\n return {\r\n keys,\r\n count,\r\n execute,\r\n filter,\r\n desc,\r\n modify,\r\n map\r\n };\r\n };\r\n modify = function (update) {\r\n modifyObj = update;\r\n return {\r\n execute\r\n };\r\n };\r\n map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n var error;\r\n var keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n var query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n var createSchema = function (e, schema, db) {\r\n if (typeof schema === 'function') {\r\n schema = schema();\r\n }\r\n\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < db.objectStoreNames.length; i++) {\r\n var name = db.objectStoreNames[i];\r\n if (!schema.hasOwnProperty(name)) {\r\n e.currentTarget.transaction.db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n var tableName;\r\n for (tableName in schema) {\r\n var table = schema[tableName];\r\n var store;\r\n if (!hasOwn.call(schema, tableName) || db.objectStoreNames.contains(tableName)) {\r\n store = e.currentTarget.transaction.objectStore(tableName);\r\n } else {\r\n store = db.createObjectStore(tableName, table.key);\r\n }\r\n\r\n var indexKey;\r\n for (indexKey in table.indexes) {\r\n var index = table.indexes[indexKey];\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n store.createIndex(indexKey, index.key || indexKey, Object.keys(index).length ? index : { unique: false });\r\n }\r\n }\r\n }\r\n };\r\n\r\n var open = function (e, server, noServerMethods, version, schema) {\r\n var db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n var s = new Server(db, server, noServerMethods, version);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n var db = {\r\n version: '0.14.0',\r\n open: function (options) {\r\n var server = options.server;\r\n var version = options.version || 1;\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, options.noServerMethods, version, options.schema)\r\n .then(resolve, reject);\r\n } else {\r\n let request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, options.noServerMethods, version, options.schema).then(resolve, reject);\r\n request.onupgradeneeded = e => createSchema(e, options.schema, e.target.result);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, options.noServerMethods, version, options.schema)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n var request = indexedDB.deleteDatabase(dbName);\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return indexedDB.cmp(param1, param2);\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db.js"],"names":[],"mappings":"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","file":"db.js","sourcesContent":["import IdbSchema from 'idb-schema';\r\n\r\n(function (local) {\r\n 'use strict';\r\n\r\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\r\n const transactionModes = {\r\n readonly: 'readonly',\r\n readwrite: 'readwrite'\r\n };\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n const defaultMapper = x => x;\r\n\r\n let indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n var keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n var key = keys[0];\r\n var val = opts[key];\r\n var name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n var x = opts[keys[0]];\r\n var y = opts[keys[1]];\r\n var pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n var Server = function (db, name, noServerMethods, version) {\r\n var closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => {\r\n // prevent Firefox from throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n records.forEach(function (record) {\r\n var req;\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n var target = e.target;\r\n var keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n records.forEach(function (record) {\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n store.put(record, key);\r\n } else {\r\n store.put(record);\r\n }\r\n });\r\n });\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(key);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.delete(key);\r\n });\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = store.get(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.query = function (table, index) {\r\n var error = closed ? 'Database has been closed' : null;\r\n return new IndexQuery(table, db, index, error);\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = key === undefined ? store.count() : store.count(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n var err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n var keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n var IndexQuery = function (table, db, indexName, preexistingError) {\r\n var modifyObj = false;\r\n\r\n var runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n var keyRange = type ? IDBKeyRange[type](...args) : null;\r\n var results = [];\r\n var indexArgs = [keyRange];\r\n var counter = 0;\r\n\r\n var transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.oncomplete = () => resolve(results);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var index = indexName ? store.index(indexName) : store;\r\n\r\n limitRange = limitRange || null;\r\n filters = filters || [];\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n var modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n var modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n var val = modifyObj[key];\r\n if (val instanceof Function) { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) {\r\n var cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]);\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // out of limit range... skip\r\n } else {\r\n var matchFilter = true;\r\n var result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n filters.forEach(function (filter) {\r\n if (!filter || !filter.length) {\r\n // Invalid filter do nothing\r\n } else if (filter.length === 2) {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n } else {\r\n matchFilter = matchFilter && filter[0](result);\r\n }\r\n });\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // if we're doing a modify, run it now\r\n if (modifyObj) {\r\n result = modifyRecord(result);\r\n cursor.update(result);\r\n }\r\n results.push(mapper(result));\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n var Query = function (type, args, queuedError) {\r\n var direction = 'next';\r\n var cursorType = 'openCursor';\r\n var filters = [];\r\n var limitRange = null;\r\n var mapper = defaultMapper;\r\n var unique = false;\r\n var error = preexistingError || queuedError;\r\n\r\n var execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n var limit = function (...args) {\r\n limitRange = args.slice(0, 2);\r\n if (limitRange.length === 1) {\r\n limitRange.unshift(0);\r\n }\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n var count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n\r\n var filter, desc, distinct, modify, map;\r\n var keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n execute,\r\n filter,\r\n distinct,\r\n map\r\n };\r\n };\r\n filter = function (...args) {\r\n filters.push(args.slice(0, 2));\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n distinct,\r\n modify,\r\n map\r\n };\r\n };\r\n distinct = function () {\r\n unique = true;\r\n return {\r\n keys,\r\n count,\r\n execute,\r\n filter,\r\n desc,\r\n modify,\r\n map\r\n };\r\n };\r\n modify = function (update) {\r\n modifyObj = update;\r\n return {\r\n execute\r\n };\r\n };\r\n map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n var error;\r\n var keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n var query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n var createSchema = function (e, schema, db) {\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < db.objectStoreNames.length; i++) {\r\n var name = db.objectStoreNames[i];\r\n if (!schema.hasOwnProperty(name)) {\r\n e.currentTarget.transaction.db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n var tableName;\r\n for (tableName in schema) {\r\n var table = schema[tableName];\r\n var store;\r\n if (!hasOwn.call(schema, tableName) || db.objectStoreNames.contains(tableName)) {\r\n store = e.currentTarget.transaction.objectStore(tableName);\r\n } else {\r\n store = db.createObjectStore(tableName, table.key);\r\n }\r\n\r\n var indexKey;\r\n for (indexKey in table.indexes) {\r\n var index = table.indexes[indexKey];\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n store.createIndex(indexKey, index.key || indexKey, Object.keys(index).length ? index : { unique: false });\r\n }\r\n }\r\n }\r\n };\r\n\r\n var open = function (e, server, noServerMethods, version) {\r\n var db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n var s = new Server(db, server, noServerMethods, version);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n var db = {\r\n version: '0.14.0',\r\n open: function (options) {\r\n let server = options.server;\r\n let version = options.version || 1;\r\n let schema = options.schema;\r\n let noServerMethods = options.noServerMethods;\r\n let idbschema;\r\n\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, noServerMethods, version)\r\n .then(resolve, reject);\r\n } else {\r\n if (options.schemaBuilder) {\r\n idbschema = new IdbSchema();\r\n let idbschemaVersion = idbschema.version();\r\n try {\r\n options.schemaBuilder(idbschema);\r\n if (options.version && idbschemaVersion < version) {\r\n throw new Error('Your highest schema building (IDBSchema) version must not be less than a designated version.');\r\n }\r\n if (!options.version && idbschemaVersion > version) {\r\n options.version = idbschemaVersion;\r\n }\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n if (typeof schema === 'function') {\r\n try {\r\n schema = schema();\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n let request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, noServerMethods, version).then(resolve, reject);\r\n request.onupgradeneeded = idbschema ? idbschema.callback() : e => createSchema(e, schema, e.target.result);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, noServerMethods, version)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n var request = indexedDB.deleteDatabase(dbName);\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return indexedDB.cmp(param1, param2);\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file diff --git a/dist/db.min.js b/dist/db.min.js index d6e13d4..9c450cc 100644 --- a/dist/db.min.js +++ b/dist/db.min.js @@ -1,2 +1,2 @@ -"use strict";function _toConsumableArray(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b1?c-1:0),f=1;c>f;f++)d[f-1]=arguments[f];return new Promise(function(c,f){var g=this;if(h)return void f("Database has been closed");var i=d.reduce(function(a,b){return a.concat(b)},[]),j=a.transaction(b,e.readwrite);j.oncomplete=function(){return c(i,g)},j.onerror=function(a){a.preventDefault(),f(a)},j.onabort=function(a){return f(a)};var k=j.objectStore(b);i.forEach(function(a){var b;if(a.item&&a.key){var c=a.key;a=a.item,b=k.add(a,c)}else b=k.add(a);b.onsuccess=function(b){var c=b.target,d=c.source.keyPath;null===d&&(d="__id__"),Object.defineProperty(a,d,{value:c.result,enumerable:!0})}})})},this.update=function(b){for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;c>f;f++)d[f-1]=arguments[f];return new Promise(function(c,f){var g=this;if(h)return void f("Database has been closed");var i=a.transaction(b,e.readwrite);i.oncomplete=function(){return c(k,g)},i.onerror=function(a){return f(a)},i.onabort=function(a){return f(a)};var j=i.objectStore(b),k=d.reduce(function(a,b){return a.concat(b)},[]);k.forEach(function(a){if(a.item&&a.key){var b=a.key;a=a.item,j.put(a,b)}else j.put(a)})})},this.remove=function(b,c){return new Promise(function(d,f){if(h)return void f("Database has been closed");var g=a.transaction(b,e.readwrite);g.oncomplete=function(){return d(c)},g.onerror=function(a){return f(a)},g.onabort=function(a){return f(a)};var i=g.objectStore(b);i["delete"](c)})},this.clear=function(b){return new Promise(function(c,d){if(h)return void d("Database has been closed");var f=a.transaction(b,e.readwrite);f.oncomplete=function(){return c()},f.onerror=function(a){return d(a)},f.onabort=function(a){return d(a)};var g=f.objectStore(b);g.clear()})},this.close=function(){return new Promise(function(c,d){h&&d("Database has been closed"),a.close(),h=!0,delete i[b][f],c()})},this.get=function(b,d){return new Promise(function(e,f){if(h)return void f("Database has been closed");var g=a.transaction(b);g.onerror=function(a){return f(a)},g.onabort=function(a){return f(a)};var i=g.objectStore(b);try{d=c(d)}catch(j){f(j)}var k=i.get(d);k.onsuccess=function(a){return e(a.target.result)}})},this.query=function(b,c){var d=h?"Database has been closed":null;return new l(b,a,c,d)},this.count=function(b,d){return new Promise(function(e,f){if(h)return void f("Database has been closed");var g=a.transaction(b);g.onerror=function(a){return f(a)},g.onabort=function(a){return f(a)};var i=g.objectStore(b);try{d=c(d)}catch(j){f(j)}var k=void 0===d?i.count():i.count(d);k.onsuccess=function(a){return e(a.target.result)}})},this.addEventListener=function(b,c){if(!j.includes(b))throw new Error("Unrecognized event type "+b);a.addEventListener(b,c)},this.removeEventListener=function(b,c){if(!j.includes(b))throw new Error("Unrecognized event type "+b);a.removeEventListener(b,c)},j.forEach(function(a){this[a]=function(b){this.addEventListener(a,b)}},this),!d){var k;return[].some.call(a.objectStoreNames,function(a){if(g[a])return k=new Error('The store name, "'+a+'", which you have attempted to load, conflicts with db.js method names."'),g.close(),!0;g[a]={};var b=Object.keys(g);b.filter(function(a){return![].concat(j,["close","addEventListener","removeEventListener"]).includes(a)}).map(function(b){return g[a][b]=function(){for(var c=arguments.length,d=Array(c),e=0;c>e;e++)d[e]=arguments[e];return g[b].apply(g,[a].concat(d))}})}),k}},l=function(a,c,f,h){var i=this,j=!1,k=function(b,g,h,i,k,l,m){return new Promise(function(n,o){var p=b?d[b].apply(d,_toConsumableArray(g)):null,q=[],r=[p],s=0,t=c.transaction(a,j?e.readwrite:e.readonly);t.oncomplete=function(){return n(q)},t.onerror=function(a){return o(a)},t.onabort=function(a){return o(a)};var u=t.objectStore(a),v=f?u.index(f):u;k=k||null,l=l||[],"count"!==h&&r.push(i||"next");var w=j?Object.keys(j):[],x=function(a){return w.forEach(function(b){var c=j[b];c instanceof Function&&(c=c(a)),a[b]=c}),a};v[h].apply(v,r).onsuccess=function(a){var b=a.target.result;if("number"==typeof b)q=b;else if(b)if(null!==k&&k[0]>s)s=k[0],b.advance(k[0]);else if(null!==k&&s>=k[0]+k[1]);else{var c=!0,d="value"in b?b.value:b.key;l.forEach(function(a){a&&a.length&&(c=2===a.length?c&&d[a[0]]===a[1]:c&&a[0](d))}),c&&(s++,j&&(d=x(d),b.update(d)),q.push(m(d))),b["continue"]()}}})},l=function(a,b,c){var d,e,f,i,l,m="next",n="openCursor",o=[],p=null,q=g,r=!1,s=h||c,t=function(){return s?Promise.reject(s):k(a,b,n,r?m+"unique":m,p,o,q)},u=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];return p=b.slice(0,2),1===p.length&&p.unshift(0),{execute:t}},v=function(){return m=null,n="count",{execute:t}},w=function(){return n="openKeyCursor",{desc:e,execute:t,filter:d,distinct:f,map:l}};return d=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];return o.push(b.slice(0,2)),{keys:w,execute:t,filter:d,desc:e,distinct:f,modify:i,limit:u,map:l}},e=function(){return m="prev",{keys:w,execute:t,filter:d,distinct:f,modify:i,map:l}},f=function(){return r=!0,{keys:w,count:v,execute:t,filter:d,desc:e,modify:i,map:l}},i=function(a){return j=a,{execute:t}},l=function(a){return q=a,{execute:t,count:v,keys:w,filter:d,desc:e,distinct:f,modify:i,limit:u,map:l}},{execute:t,count:v,keys:w,filter:d,desc:e,distinct:f,modify:i,limit:u,map:l}};["only","bound","upperBound","lowerBound"].forEach(function(a){i[a]=function(){return l(a,arguments)}}),this.range=function(a){var c,d=[null,null];try{d=b(a)}catch(e){c=e}return l.apply(void 0,_toConsumableArray(d).concat([c]))},this.filter=function(){var a=l(null,null);return a.filter.apply(a,arguments)},this.all=function(){return this.filter()}},m=function(a,b,c){if("function"==typeof b&&(b=b()),b&&0!==b.length){for(var d=0;d1?c-1:0),e=1;c>e;e++)d[e-1]=arguments[e];return new Promise(function(c,e){var f=this;if(g)return void e("Database has been closed");var h=d.reduce(function(a,b){return a.concat(b)},[]),i=a.transaction(b,k.readwrite);i.oncomplete=function(){return c(h,f)},i.onerror=function(a){a.preventDefault(),e(a)},i.onabort=function(a){return e(a)};var j=i.objectStore(b);h.forEach(function(a){var b;if(a.item&&a.key){var c=a.key;a=a.item,b=j.add(a,c)}else b=j.add(a);b.onsuccess=function(b){var c=b.target,d=c.source.keyPath;null===d&&(d="__id__"),Object.defineProperty(a,d,{value:c.result,enumerable:!0})}})})},this.update=function(b){for(var c=arguments.length,d=Array(c>1?c-1:0),e=1;c>e;e++)d[e-1]=arguments[e];return new Promise(function(c,e){var f=this;if(g)return void e("Database has been closed");var h=a.transaction(b,k.readwrite);h.oncomplete=function(){return c(j,f)},h.onerror=function(a){return e(a)},h.onabort=function(a){return e(a)};var i=h.objectStore(b),j=d.reduce(function(a,b){return a.concat(b)},[]);j.forEach(function(a){if(a.item&&a.key){var b=a.key;a=a.item,i.put(a,b)}else i.put(a)})})},this.remove=function(b,c){return new Promise(function(d,e){if(g)return void e("Database has been closed");var f=a.transaction(b,k.readwrite);f.oncomplete=function(){return d(c)},f.onerror=function(a){return e(a)},f.onabort=function(a){return e(a)};var h=f.objectStore(b);h["delete"](c)})},this.clear=function(b){return new Promise(function(c,d){if(g)return void d("Database has been closed");var e=a.transaction(b,k.readwrite);e.oncomplete=function(){return c()},e.onerror=function(a){return d(a)},e.onabort=function(a){return d(a)};var f=e.objectStore(b);f.clear()})},this.close=function(){return new Promise(function(c,e){g&&e("Database has been closed"),a.close(),g=!0,delete o[b][d],c()})},this.get=function(b,c){return new Promise(function(d,f){if(g)return void f("Database has been closed");var h=a.transaction(b);h.onerror=function(a){return f(a)},h.onabort=function(a){return f(a)};var i=h.objectStore(b);try{c=e(c)}catch(j){f(j)}var k=i.get(c);k.onsuccess=function(a){return d(a.target.result)}})},this.query=function(b,c){var d=g?"Database has been closed":null;return new r(b,a,c,d)},this.count=function(b,c){return new Promise(function(d,f){if(g)return void f("Database has been closed");var h=a.transaction(b);h.onerror=function(a){return f(a)},h.onabort=function(a){return f(a)};var i=h.objectStore(b);try{c=e(c)}catch(j){f(j)}var k=void 0===c?i.count():i.count(c);k.onsuccess=function(a){return d(a.target.result)}})},this.addEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);a.addEventListener(b,c)},this.removeEventListener=function(b,c){if(!p.includes(b))throw new Error("Unrecognized event type "+b);a.removeEventListener(b,c)},p.forEach(function(a){this[a]=function(b){this.addEventListener(a,b)}},this),!c){var h;return[].some.call(a.objectStoreNames,function(a){if(f[a])return h=new Error('The store name, "'+a+'", which you have attempted to load, conflicts with db.js method names."'),f.close(),!0;f[a]={};var b=Object.keys(f);b.filter(function(a){return![].concat(p,["close","addEventListener","removeEventListener"]).includes(a)}).map(function(b){return f[a][b]=function(){for(var c=arguments.length,d=Array(c),e=0;c>e;e++)d[e]=arguments[e];return f[b].apply(f,[a].concat(d))}})}),h}},r=function(a,b,c,e){var g=this,h=!1,j=function(d,e,g,j,l,m,n){return new Promise(function(o,p){var q=d?i[d].apply(i,f(e)):null,r=[],s=[q],t=0,u=b.transaction(a,h?k.readwrite:k.readonly);u.oncomplete=function(){return o(r)},u.onerror=function(a){return p(a)},u.onabort=function(a){return p(a)};var v=u.objectStore(a),w=c?v.index(c):v;l=l||null,m=m||[],"count"!==g&&s.push(j||"next");var x=h?Object.keys(h):[],y=function(a){return x.forEach(function(b){var c=h[b];c instanceof Function&&(c=c(a)),a[b]=c}),a};w[g].apply(w,s).onsuccess=function(a){var b=a.target.result;if("number"==typeof b)r=b;else if(b)if(null!==l&&l[0]>t)t=l[0],b.advance(l[0]);else if(null!==l&&t>=l[0]+l[1]);else{var c=!0,d="value"in b?b.value:b.key;m.forEach(function(a){a&&a.length&&(c=2===a.length?c&&d[a[0]]===a[1]:c&&a[0](d))}),c&&(t++,h&&(d=y(d),b.update(d)),r.push(n(d))),b["continue"]()}}})},l=function(a,b,c){var d,f,g,i,k,l="next",n="openCursor",o=[],p=null,q=m,r=!1,s=e||c,t=function(){return s?Promise.reject(s):j(a,b,n,r?l+"unique":l,p,o,q)},u=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];return p=b.slice(0,2),1===p.length&&p.unshift(0),{execute:t}},v=function(){return l=null,n="count",{execute:t}},w=function(){return n="openKeyCursor",{desc:f,execute:t,filter:d,distinct:g,map:k}};return d=function(){for(var a=arguments.length,b=Array(a),c=0;a>c;c++)b[c]=arguments[c];return o.push(b.slice(0,2)),{keys:w,execute:t,filter:d,desc:f,distinct:g,modify:i,limit:u,map:k}},f=function(){return l="prev",{keys:w,execute:t,filter:d,distinct:g,modify:i,map:k}},g=function(){return r=!0,{keys:w,count:v,execute:t,filter:d,desc:f,modify:i,map:k}},i=function(a){return h=a,{execute:t}},k=function(a){return q=a,{execute:t,count:v,keys:w,filter:d,desc:f,distinct:g,modify:i,limit:u,map:k}},{execute:t,count:v,keys:w,filter:d,desc:f,distinct:g,modify:i,limit:u,map:k}};["only","bound","upperBound","lowerBound"].forEach(function(a){g[a]=function(){return l(a,arguments)}}),this.range=function(a){var b,c=[null,null];try{c=d(a)}catch(e){b=e}return l.apply(void 0,f(c).concat([b]))},this.filter=function(){var a=l(null,null);return a.filter.apply(a,arguments)},this.all=function(){return this.filter()}},s=function(a,b,c){if(b&&0!==b.length){for(var d=0;dh)throw new Error("Your highest schema building (IDBSchema) version must not be less than a designated version.");!a.version&&h>c&&(a.version=h)}catch(k){return i(k),{v:void 0}}}if("function"==typeof d)try{d=d()}catch(k){return i(k),{v:void 0}}var l=n.open(b,c);l.onsuccess=function(a){return t(a,b,e,c).then(g,i)},l.onupgradeneeded=f?f.callback():function(a){return s(a,d,a.target.result)},l.onerror=function(a){return i(a)},l.onblocked=function(a){var d=new Promise(function(a,d){l.onsuccess=function(f){t(f,b,e,c).then(a,d)},l.onerror=function(a){return d(a)}});a.resume=d,i(a)}}();if("object"===("undefined"==typeof k?"undefined":h(k)))return k.v}})},"delete":function(a){return new Promise(function(b,c){var d=n.deleteDatabase(a);d.onsuccess=function(a){return b(a)},d.onerror=function(a){return c(a)},d.onblocked=function(a){var b=new Promise(function(b,c){d.onsuccess=function(c){"newVersion"in c||(c.newVersion=a.newVersion),"oldVersion"in c||(c.oldVersion=a.oldVersion),b(c)},d.onerror=function(a){return c(a)}});a.resume=b,c(a)}})},cmp:function(a,b){return n.cmp(a,b)}};"undefined"!=typeof c&&"undefined"!=typeof c.exports?c.exports=u:"function"==typeof a&&a.amd?a(function(){return u}):b.db=u}(self)},{"idb-schema":2}],2:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{"default":a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a){return Array.isArray(a)?a.map(function(a){return f(a)}):(0,m["default"])(a)?Object.keys(a).reduce(function(b,c){return b[c]=f(a[c]),b},{}):a}var g=function(){function a(a,b){for(var c=0;ca||an)throw new TypeError("invalid version");return this._current={version:a,store:null},this._versions[a]={stores:[],dropStores:[],indexes:[],dropIndexes:[],callbacks:[],version:a},this}},{key:"addStore",value:function(a){var b=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];if("string"!=typeof a||!a)throw new TypeError('"name" is required');if(this._stores[a])throw new TypeError('"'+a+'" store is already defined');var c={name:a,indexes:{},keyPath:b.key||b.keyPath||null,autoIncrement:b.increment||b.autoIncrement||!1};if(c.autoIncrement&&!c.keyPath)throw new TypeError("set keyPath in order to use autoIncrement");return this._stores[a]=c,this._versions[this.version()].stores.push(c),this._current.store=c,this}},{key:"delStore",value:function(a){if("string"!=typeof a||!a)throw new TypeError('"name" is required');var b=this._stores[a];if(!b)throw new TypeError('"'+a+'" store is not defined');return delete this._stores[a],this._versions[this.version()].dropStores.push(b),this._current.store=null,this}},{key:"getStore",value:function(a){if("string"!=typeof a||!a)throw new TypeError('"name" is required');if(!this._stores[a])throw new TypeError('"'+a+'" store is not defined');return this._current.store=this._stores[a],this}},{key:"addIndex",value:function(a,b){var c=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];if("string"!=typeof a||!a)throw new TypeError('"name" is required');if("string"!=typeof b&&!Array.isArray(b))throw new TypeError('"field" is required');var d=this._current.store;if(!d)throw new TypeError('set current store using "getStore" or "addStore"');if(d.indexes[a])throw new TypeError('"'+a+'" index is already defined');var e={name:a,field:b,storeName:d.name,multiEntry:c.multi||c.multiEntry||!1,unique:c.unique||!1};return d.indexes[a]=e,this._versions[this.version()].indexes.push(e),this}},{key:"delIndex",value:function(a){if("string"!=typeof a||!a)throw new TypeError('"name" is required');var b=this._current.store.indexes[a];if(!b)throw new TypeError('"'+a+'" index is not defined');return delete this._current.store.indexes[a],this._versions[this.version()].dropIndexes.push(b),this}},{key:"addCallback",value:function(a){return this._versions[this.version()].callbacks.push(a),this}},{key:"callback",value:function(){var a=(0,i["default"])(f(this._versions)).sort(function(a,b){return a.version-b.version});return function(b){var c=b.oldVersion>n?0:b.oldVersion,d=b.target.result,e=b.target.transaction;a.forEach(function(a){c>=a.version||(a.stores.forEach(function(a){var b={};a.keyPath&&(b.keyPath=a.keyPath),a.autoIncrement&&(b.autoIncrement=a.autoIncrement),d.createObjectStore(a.name,b)}),a.dropStores.forEach(function(a){d.deleteObjectStore(a.name)}),a.indexes.forEach(function(a){e.objectStore(a.storeName).createIndex(a.name,a.field,{unique:a.unique,multiEntry:a.multiEntry})}),a.dropIndexes.forEach(function(a){e.objectStore(a.storeName).deleteIndex(a.name)}),a.callbacks.forEach(function(a){a(b)}))})}}},{key:"stores",value:function(){return(0,i["default"])(f(this._stores)).map(function(a){return a.indexes=(0,i["default"])(a.indexes).map(function(a){return delete a.storeName,a}),a})}},{key:"clone",value:function(){var b=this,c=new a;return Object.keys(this).forEach(function(a){return c[a]=f(b[a])}),c}}]),a}();c["default"]=o,b.exports=c["default"]},{"is-integer":4,"is-plain-obj":5,"object-values":7}],3:[function(a,b,c){"use strict";var d=a("number-is-nan");b.exports=Number.isFinite||function(a){return!("number"!=typeof a||d(a)||a===1/0||a===-(1/0))}},{"number-is-nan":6}],4:[function(a,b,c){var d=a("is-finite");b.exports=Number.isInteger||function(a){return"number"==typeof a&&d(a)&&Math.floor(a)===a}},{"is-finite":3}],5:[function(a,b,c){"use strict";var d=Object.prototype.toString;b.exports=function(a){var b;return"[object Object]"===d.call(a)&&(b=Object.getPrototypeOf(a),null===b||b===Object.getPrototypeOf({}))}},{}],6:[function(a,b,c){"use strict";b.exports=Number.isNaN||function(a){return a!==a}},{}],7:[function(a,b,c){"use strict";b.exports=function(a){for(var b=Object.keys(a),c=[],d=0;d x;\r\n\r\n let indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n var keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n var key = keys[0];\r\n var val = opts[key];\r\n var name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n var x = opts[keys[0]];\r\n var y = opts[keys[1]];\r\n var pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n var Server = function (db, name, noServerMethods, version) {\r\n var closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => {\r\n // prevent Firefox from throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n records.forEach(function (record) {\r\n var req;\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n var target = e.target;\r\n var keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n records.forEach(function (record) {\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n store.put(record, key);\r\n } else {\r\n store.put(record);\r\n }\r\n });\r\n });\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(key);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.delete(key);\r\n });\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = store.get(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.query = function (table, index) {\r\n var error = closed ? 'Database has been closed' : null;\r\n return new IndexQuery(table, db, index, error);\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = key === undefined ? store.count() : store.count(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n var err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n var keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n var IndexQuery = function (table, db, indexName, preexistingError) {\r\n var modifyObj = false;\r\n\r\n var runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n var keyRange = type ? IDBKeyRange[type](...args) : null;\r\n var results = [];\r\n var indexArgs = [keyRange];\r\n var counter = 0;\r\n\r\n var transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.oncomplete = () => resolve(results);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var index = indexName ? store.index(indexName) : store;\r\n\r\n limitRange = limitRange || null;\r\n filters = filters || [];\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n var modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n var modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n var val = modifyObj[key];\r\n if (val instanceof Function) { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) {\r\n var cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]);\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // out of limit range... skip\r\n } else {\r\n var matchFilter = true;\r\n var result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n filters.forEach(function (filter) {\r\n if (!filter || !filter.length) {\r\n // Invalid filter do nothing\r\n } else if (filter.length === 2) {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n } else {\r\n matchFilter = matchFilter && filter[0](result);\r\n }\r\n });\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // if we're doing a modify, run it now\r\n if (modifyObj) {\r\n result = modifyRecord(result);\r\n cursor.update(result);\r\n }\r\n results.push(mapper(result));\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n var Query = function (type, args, queuedError) {\r\n var direction = 'next';\r\n var cursorType = 'openCursor';\r\n var filters = [];\r\n var limitRange = null;\r\n var mapper = defaultMapper;\r\n var unique = false;\r\n var error = preexistingError || queuedError;\r\n\r\n var execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n var limit = function (...args) {\r\n limitRange = args.slice(0, 2);\r\n if (limitRange.length === 1) {\r\n limitRange.unshift(0);\r\n }\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n var count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n\r\n var filter, desc, distinct, modify, map;\r\n var keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n execute,\r\n filter,\r\n distinct,\r\n map\r\n };\r\n };\r\n filter = function (...args) {\r\n filters.push(args.slice(0, 2));\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n distinct,\r\n modify,\r\n map\r\n };\r\n };\r\n distinct = function () {\r\n unique = true;\r\n return {\r\n keys,\r\n count,\r\n execute,\r\n filter,\r\n desc,\r\n modify,\r\n map\r\n };\r\n };\r\n modify = function (update) {\r\n modifyObj = update;\r\n return {\r\n execute\r\n };\r\n };\r\n map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n var error;\r\n var keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n var query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n var createSchema = function (e, schema, db) {\r\n if (typeof schema === 'function') {\r\n schema = schema();\r\n }\r\n\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < db.objectStoreNames.length; i++) {\r\n var name = db.objectStoreNames[i];\r\n if (!schema.hasOwnProperty(name)) {\r\n e.currentTarget.transaction.db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n var tableName;\r\n for (tableName in schema) {\r\n var table = schema[tableName];\r\n var store;\r\n if (!hasOwn.call(schema, tableName) || db.objectStoreNames.contains(tableName)) {\r\n store = e.currentTarget.transaction.objectStore(tableName);\r\n } else {\r\n store = db.createObjectStore(tableName, table.key);\r\n }\r\n\r\n var indexKey;\r\n for (indexKey in table.indexes) {\r\n var index = table.indexes[indexKey];\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n store.createIndex(indexKey, index.key || indexKey, Object.keys(index).length ? index : { unique: false });\r\n }\r\n }\r\n }\r\n };\r\n\r\n var open = function (e, server, noServerMethods, version, schema) {\r\n var db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n var s = new Server(db, server, noServerMethods, version);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n var db = {\r\n version: '0.14.0',\r\n open: function (options) {\r\n var server = options.server;\r\n var version = options.version || 1;\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, options.noServerMethods, version, options.schema)\r\n .then(resolve, reject);\r\n } else {\r\n let request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, options.noServerMethods, version, options.schema).then(resolve, reject);\r\n request.onupgradeneeded = e => createSchema(e, options.schema, e.target.result);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, options.noServerMethods, version, options.schema)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n var request = indexedDB.deleteDatabase(dbName);\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return indexedDB.cmp(param1, param2);\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/db.js"],"names":["local","mongoDBToKeyRangeArgs","opts","keys","Object","sort","length","name","inclusive","key","val","TypeError","x","y","pattern","mongoifyKey","_typeof","IDBKeyRange","type","_mongoDBToKeyRangeArg2","apply","_toConsumableArray","args","webkitIDBKeyRange","transactionModes","readonly","readwrite","hasOwn","prototype","hasOwnProperty","indexedDB","webkitIndexedDB","mozIndexedDB","oIndexedDB","msIndexedDB","shimIndexedDB","Error","dbCache","db","closed","_key","arguments","reject","records","reduce","aip","concat","transaction","table","oncomplete","resolve","_this","e","preventDefault","onabort","store","objectStore","forEach","record","req","item","add","onsuccess","target","keyPath","source","defineProperty","value","result","enumerable","_key2","_this2","onerror","put","this","remove","Promise","clear","close","version","get","query","index","error","IndexQuery","count","undefined","addEventListener","eventName","handler","serverEvents","includes","removeEventListener","evName","noServerMethods","err","some","call","objectStoreNames","storeName","_this3","runQuery","cursorType","direction","limitRange","filters","mapper","keyRange","results","indexArgs","modifyObj","push","modifyRecord","modifyKeys","Function","cursor","counter","advance","matchFilter","filter","update","Query","queuedError","_filter","desc","distinct","modify","_map","defaultMapper","unique","execute","_key4","slice","unshift","map","_key5","limit","fn","_this4","range","all","createSchema","schema","i","currentTarget","deleteObjectStore","tableName","contains","createObjectStore","indexKey","indexes","createIndex","_open","server","s","Server","open","options","then","_ret","schemaBuilder","idbschema","_idbSchema2","idbschemaVersion","v","callback","request","onblocked","ev","res","rej","resume","delete","dbName","newVersion","oldVersion","cmp","param1","param2","module","exports","define","amd"],"mappings":"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","file":"db.min.js","sourcesContent":["import IdbSchema from 'idb-schema';\r\n\r\n(function (local) {\r\n 'use strict';\r\n\r\n const IDBKeyRange = local.IDBKeyRange || local.webkitIDBKeyRange;\r\n const transactionModes = {\r\n readonly: 'readonly',\r\n readwrite: 'readwrite'\r\n };\r\n const hasOwn = Object.prototype.hasOwnProperty;\r\n const defaultMapper = x => x;\r\n\r\n let indexedDB = local.indexedDB || local.webkitIndexedDB ||\r\n local.mozIndexedDB || local.oIndexedDB || local.msIndexedDB ||\r\n local.shimIndexedDB || (function () {\r\n throw new Error('IndexedDB required');\r\n }());\r\n\r\n const dbCache = {};\r\n const serverEvents = ['abort', 'error', 'versionchange'];\r\n\r\n function mongoDBToKeyRangeArgs (opts) {\r\n var keys = Object.keys(opts).sort();\r\n if (keys.length === 1) {\r\n var key = keys[0];\r\n var val = opts[key];\r\n var name, inclusive;\r\n switch (key) {\r\n case 'eq': name = 'only'; break;\r\n case 'gt':\r\n name = 'lowerBound';\r\n inclusive = true;\r\n break;\r\n case 'lt':\r\n name = 'upperBound';\r\n inclusive = true;\r\n break;\r\n case 'gte': name = 'lowerBound'; break;\r\n case 'lte': name = 'upperBound'; break;\r\n default: throw new TypeError('`' + key + '` is not valid key');\r\n }\r\n return [name, [val, inclusive]];\r\n }\r\n var x = opts[keys[0]];\r\n var y = opts[keys[1]];\r\n var pattern = keys.join('-');\r\n\r\n switch (pattern) {\r\n case 'gt-lt': case 'gt-lte': case 'gte-lt': case 'gte-lte':\r\n return ['bound', [x, y, keys[0] === 'gt', keys[1] === 'lt']];\r\n default: throw new TypeError(\r\n '`' + pattern + '` are conflicted keys'\r\n );\r\n }\r\n }\r\n function mongoifyKey (key) {\r\n if (key && typeof key === 'object' && !(key instanceof IDBKeyRange)) {\r\n let [type, args] = mongoDBToKeyRangeArgs(key);\r\n return IDBKeyRange[type](...args);\r\n }\r\n return key;\r\n }\r\n\r\n var Server = function (db, name, noServerMethods, version) {\r\n var closed = false;\r\n\r\n this.getIndexedDB = () => db;\r\n this.isClosed = () => closed;\r\n\r\n this.add = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => {\r\n // prevent Firefox from throwing a ConstraintError and aborting (hard)\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=872873\r\n e.preventDefault();\r\n reject(e);\r\n };\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n records.forEach(function (record) {\r\n var req;\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n req = store.add(record, key);\r\n } else {\r\n req = store.add(record);\r\n }\r\n\r\n req.onsuccess = function (e) {\r\n var target = e.target;\r\n var keyPath = target.source.keyPath;\r\n if (keyPath === null) {\r\n keyPath = '__id__';\r\n }\r\n Object.defineProperty(record, keyPath, {\r\n value: target.result,\r\n enumerable: true\r\n });\r\n };\r\n });\r\n });\r\n };\r\n\r\n this.update = function (table, ...args) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(records, this);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var records = args.reduce(function (records, aip) {\r\n return records.concat(aip);\r\n }, []);\r\n records.forEach(function (record) {\r\n if (record.item && record.key) {\r\n var key = record.key;\r\n record = record.item;\r\n store.put(record, key);\r\n } else {\r\n store.put(record);\r\n }\r\n });\r\n });\r\n };\r\n\r\n this.remove = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve(key);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.delete(key);\r\n });\r\n };\r\n\r\n this.clear = function (table) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table, transactionModes.readwrite);\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n store.clear();\r\n });\r\n };\r\n\r\n this.close = function () {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n }\r\n db.close();\r\n closed = true;\r\n delete dbCache[name][version];\r\n resolve();\r\n });\r\n };\r\n\r\n this.get = function (table, key) {\r\n return new Promise(function (resolve, reject) {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = store.get(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.query = function (table, index) {\r\n var error = closed ? 'Database has been closed' : null;\r\n return new IndexQuery(table, db, index, error);\r\n };\r\n\r\n this.count = function (table, key) {\r\n return new Promise((resolve, reject) => {\r\n if (closed) {\r\n reject('Database has been closed');\r\n return;\r\n }\r\n var transaction = db.transaction(table);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n try {\r\n key = mongoifyKey(key);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n var req = key === undefined ? store.count() : store.count(key);\r\n req.onsuccess = e => resolve(e.target.result);\r\n });\r\n };\r\n\r\n this.addEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.addEventListener(eventName, handler);\r\n };\r\n\r\n this.removeEventListener = function (eventName, handler) {\r\n if (!serverEvents.includes(eventName)) {\r\n throw new Error('Unrecognized event type ' + eventName);\r\n }\r\n db.removeEventListener(eventName, handler);\r\n };\r\n\r\n serverEvents.forEach(function (evName) {\r\n this[evName] = function (handler) {\r\n this.addEventListener(evName, handler);\r\n };\r\n }, this);\r\n\r\n if (noServerMethods) {\r\n return;\r\n }\r\n\r\n var err;\r\n [].some.call(db.objectStoreNames, storeName => {\r\n if (this[storeName]) {\r\n err = new Error('The store name, \"' + storeName + '\", which you have attempted to load, conflicts with db.js method names.\"');\r\n this.close();\r\n return true;\r\n }\r\n this[storeName] = {};\r\n var keys = Object.keys(this);\r\n keys.filter(key => !(([...serverEvents, 'close', 'addEventListener', 'removeEventListener']).includes(key)))\r\n .map(key =>\r\n this[storeName][key] = (...args) => this[key](storeName, ...args)\r\n );\r\n });\r\n return err;\r\n };\r\n\r\n var IndexQuery = function (table, db, indexName, preexistingError) {\r\n var modifyObj = false;\r\n\r\n var runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) {\r\n return new Promise(function (resolve, reject) {\r\n var keyRange = type ? IDBKeyRange[type](...args) : null;\r\n var results = [];\r\n var indexArgs = [keyRange];\r\n var counter = 0;\r\n\r\n var transaction = db.transaction(table, modifyObj ? transactionModes.readwrite : transactionModes.readonly);\r\n transaction.oncomplete = () => resolve(results);\r\n transaction.onerror = e => reject(e);\r\n transaction.onabort = e => reject(e);\r\n\r\n var store = transaction.objectStore(table);\r\n var index = indexName ? store.index(indexName) : store;\r\n\r\n limitRange = limitRange || null;\r\n filters = filters || [];\r\n if (cursorType !== 'count') {\r\n indexArgs.push(direction || 'next');\r\n }\r\n\r\n // create a function that will set in the modifyObj properties into\r\n // the passed record.\r\n var modifyKeys = modifyObj ? Object.keys(modifyObj) : [];\r\n\r\n var modifyRecord = function (record) {\r\n modifyKeys.forEach(key => {\r\n var val = modifyObj[key];\r\n if (val instanceof Function) { val = val(record); }\r\n record[key] = val;\r\n });\r\n return record;\r\n };\r\n\r\n index[cursorType](...indexArgs).onsuccess = function (e) {\r\n var cursor = e.target.result;\r\n if (typeof cursor === 'number') {\r\n results = cursor;\r\n } else if (cursor) {\r\n if (limitRange !== null && limitRange[0] > counter) {\r\n counter = limitRange[0];\r\n cursor.advance(limitRange[0]);\r\n } else if (limitRange !== null && counter >= (limitRange[0] + limitRange[1])) {\r\n // out of limit range... skip\r\n } else {\r\n var matchFilter = true;\r\n var result = 'value' in cursor ? cursor.value : cursor.key;\r\n\r\n filters.forEach(function (filter) {\r\n if (!filter || !filter.length) {\r\n // Invalid filter do nothing\r\n } else if (filter.length === 2) {\r\n matchFilter = matchFilter && (result[filter[0]] === filter[1]);\r\n } else {\r\n matchFilter = matchFilter && filter[0](result);\r\n }\r\n });\r\n\r\n if (matchFilter) {\r\n counter++;\r\n // if we're doing a modify, run it now\r\n if (modifyObj) {\r\n result = modifyRecord(result);\r\n cursor.update(result);\r\n }\r\n results.push(mapper(result));\r\n }\r\n cursor.continue();\r\n }\r\n }\r\n };\r\n });\r\n };\r\n\r\n var Query = function (type, args, queuedError) {\r\n var direction = 'next';\r\n var cursorType = 'openCursor';\r\n var filters = [];\r\n var limitRange = null;\r\n var mapper = defaultMapper;\r\n var unique = false;\r\n var error = preexistingError || queuedError;\r\n\r\n var execute = function () {\r\n if (error) {\r\n return Promise.reject(error);\r\n }\r\n return runQuery(type, args, cursorType, unique ? direction + 'unique' : direction, limitRange, filters, mapper);\r\n };\r\n\r\n var limit = function (...args) {\r\n limitRange = args.slice(0, 2);\r\n if (limitRange.length === 1) {\r\n limitRange.unshift(0);\r\n }\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n var count = function () {\r\n direction = null;\r\n cursorType = 'count';\r\n\r\n return {\r\n execute: execute\r\n };\r\n };\r\n\r\n var filter, desc, distinct, modify, map;\r\n var keys = function () {\r\n cursorType = 'openKeyCursor';\r\n\r\n return {\r\n desc,\r\n execute,\r\n filter,\r\n distinct,\r\n map\r\n };\r\n };\r\n filter = function (...args) {\r\n filters.push(args.slice(0, 2));\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n desc = function () {\r\n direction = 'prev';\r\n\r\n return {\r\n keys,\r\n execute,\r\n filter,\r\n distinct,\r\n modify,\r\n map\r\n };\r\n };\r\n distinct = function () {\r\n unique = true;\r\n return {\r\n keys,\r\n count,\r\n execute,\r\n filter,\r\n desc,\r\n modify,\r\n map\r\n };\r\n };\r\n modify = function (update) {\r\n modifyObj = update;\r\n return {\r\n execute\r\n };\r\n };\r\n map = function (fn) {\r\n mapper = fn;\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n return {\r\n execute,\r\n count,\r\n keys,\r\n filter,\r\n desc,\r\n distinct,\r\n modify,\r\n limit,\r\n map\r\n };\r\n };\r\n\r\n ['only', 'bound', 'upperBound', 'lowerBound'].forEach((name) => {\r\n this[name] = function () {\r\n return Query(name, arguments);\r\n };\r\n });\r\n\r\n this.range = function (opts) {\r\n var error;\r\n var keyRange = [null, null];\r\n try {\r\n keyRange = mongoDBToKeyRangeArgs(opts);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return Query(...keyRange, error);\r\n };\r\n\r\n this.filter = function (...args) {\r\n var query = Query(null, null);\r\n return query.filter(...args);\r\n };\r\n\r\n this.all = function () {\r\n return this.filter();\r\n };\r\n };\r\n\r\n var createSchema = function (e, schema, db) {\r\n if (!schema || schema.length === 0) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < db.objectStoreNames.length; i++) {\r\n var name = db.objectStoreNames[i];\r\n if (!schema.hasOwnProperty(name)) {\r\n e.currentTarget.transaction.db.deleteObjectStore(name);\r\n }\r\n }\r\n\r\n var tableName;\r\n for (tableName in schema) {\r\n var table = schema[tableName];\r\n var store;\r\n if (!hasOwn.call(schema, tableName) || db.objectStoreNames.contains(tableName)) {\r\n store = e.currentTarget.transaction.objectStore(tableName);\r\n } else {\r\n store = db.createObjectStore(tableName, table.key);\r\n }\r\n\r\n var indexKey;\r\n for (indexKey in table.indexes) {\r\n var index = table.indexes[indexKey];\r\n try {\r\n store.index(indexKey);\r\n } catch (err) {\r\n store.createIndex(indexKey, index.key || indexKey, Object.keys(index).length ? index : { unique: false });\r\n }\r\n }\r\n }\r\n };\r\n\r\n var open = function (e, server, noServerMethods, version) {\r\n var db = e.target.result;\r\n dbCache[server][version] = db;\r\n\r\n var s = new Server(db, server, noServerMethods, version);\r\n return s instanceof Error ? Promise.reject(s) : Promise.resolve(s);\r\n };\r\n\r\n var db = {\r\n version: '0.14.0',\r\n open: function (options) {\r\n let server = options.server;\r\n let version = options.version || 1;\r\n let schema = options.schema;\r\n let noServerMethods = options.noServerMethods;\r\n let idbschema;\r\n\r\n if (!dbCache[server]) {\r\n dbCache[server] = {};\r\n }\r\n return new Promise(function (resolve, reject) {\r\n if (dbCache[server][version]) {\r\n open({\r\n target: {\r\n result: dbCache[server][version]\r\n }\r\n }, server, noServerMethods, version)\r\n .then(resolve, reject);\r\n } else {\r\n if (options.schemaBuilder) {\r\n idbschema = new IdbSchema();\r\n let idbschemaVersion = idbschema.version();\r\n try {\r\n options.schemaBuilder(idbschema);\r\n if (options.version && idbschemaVersion < version) {\r\n throw new Error('Your highest schema building (IDBSchema) version must not be less than a designated version.');\r\n }\r\n if (!options.version && idbschemaVersion > version) {\r\n options.version = idbschemaVersion;\r\n }\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n if (typeof schema === 'function') {\r\n try {\r\n schema = schema();\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n }\r\n let request = indexedDB.open(server, version);\r\n\r\n request.onsuccess = e => open(e, server, noServerMethods, version).then(resolve, reject);\r\n request.onupgradeneeded = idbschema ? idbschema.callback() : e => createSchema(e, schema, e.target.result);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // open() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = (ev) => {\r\n open(ev, server, noServerMethods, version)\r\n .then(res, rej);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n }\r\n });\r\n },\r\n\r\n delete: function (dbName) {\r\n return new Promise(function (resolve, reject) {\r\n var request = indexedDB.deleteDatabase(dbName);\r\n\r\n request.onsuccess = e => resolve(e);\r\n request.onerror = e => reject(e);\r\n request.onblocked = e => {\r\n var resume = new Promise(function (res, rej) {\r\n // We overwrite handlers rather than make a new\r\n // delete() since the original request is still\r\n // open and its onsuccess will still fire if\r\n // the user unblocks by closing the blocking\r\n // connection\r\n request.onsuccess = ev => {\r\n // Attempt to workaround Firefox event version problem: https://bugzilla.mozilla.org/show_bug.cgi?id=1220279\r\n if (!('newVersion' in ev)) {\r\n ev.newVersion = e.newVersion;\r\n }\r\n\r\n if (!('oldVersion' in ev)) {\r\n ev.oldVersion = e.oldVersion;\r\n }\r\n\r\n res(ev);\r\n };\r\n request.onerror = e => rej(e);\r\n });\r\n e.resume = resume;\r\n reject(e);\r\n };\r\n });\r\n },\r\n\r\n cmp: function (param1, param2) {\r\n return indexedDB.cmp(param1, param2);\r\n }\r\n };\r\n\r\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\r\n module.exports = db;\r\n } else if (typeof define === 'function' && define.amd) {\r\n define(function () { return db; });\r\n } else {\r\n local.db = db;\r\n }\r\n}(self));\r\n"]} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 7e0969b..5fe7f9d 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,95 +1,99 @@ // Karma configuration // Generated on Fri Feb 26 2016 11:48:37 GMT+1100 (AUS Eastern Summer Time) -module.exports = function(config) { - config.set({ +module.exports = function (config) { + config.set({ - // base path that will be used to resolve all patterns (eg. files, exclude) - basePath: '', - - client: { - captureConsole: true, - mocha: { - bail: true - } - }, - - // frameworks to use - // available frameworks: https://npmjs.org/browse/keyword/karma-adapter - frameworks: ['mocha'], - - - // list of files / patterns to load in the browser - files: [ - 'node_modules/babel-polyfill/dist/polyfill.js', - 'dist/db.min.js', - 'node_modules/chai/chai.js', - 'tests/helpers/**/*.js', - 'tests/specs/**/*.js' - ], - - - // list of files to exclude - exclude: [ - // exclude the jQuery integration tests for karma - 'tests/specs/thenable-integration.js', - // phantom doesn't support web workers - 'tests/specs/web-workers.js' - ], - - - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - preprocessors: { - }, - - - // test results reporter to use - // possible values: 'dots', 'progress' - // available reporters: https://npmjs.org/browse/keyword/karma-reporter - reporters: ['progress'], - - - // web server port - port: 9876, + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + client: { + captureConsole: true, + mocha: { + bail: true + } + }, - // enable / disable colors in the output (reporters and logs) - colors: true, + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha'], + + // list of files / patterns to load in the browser + files: [ + 'dist/db.min.js', + 'node_modules/chai/chai.js', + 'node_modules/babel-polyfill/dist/polyfill.js', + 'node_modules/jquery/dist/jquery.min.js', + 'tests/helpers/**/*.js', + 'tests/specs/**/*.js', + 'tests/test-worker.js' + ], + + // list of files to exclude + exclude: [ + ], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + '**/*.js': ['replacer'] + }, + replacerPreprocessor: { + replacer: function (file, content) { + return content + // PhantomJS issue with paths: https://github.com/ariya/phantomjs/issues/14119 + .replace(/(importScripts\(")\//g, '$1../') + .replace(/(new Worker\(')/g, '$1/base/tests/') + // Apparently an access issue here; colon being added to URL; for a more complete solution, see https://www.npmjs.com/package/karma-json-fixtures-preprocessor + .replace(/\$\.getJSON\('foo'\);/g, '$.Deferred().resolve();') + // Karma or PhantomJS is executing twice, once in window scope without importScripts: https://github.com/karma-runner/karma/issues/1518 + .replace(/(importScripts\("..\/node_modules)/, 'if (typeof importScripts !== \'function\') {return;}\n$1') + // Escape tests for sake of PhantomJS: https://github.com/ariya/phantomjs/issues/14118 + .replace(/(navigator\.serviceWorker\.register)/g, 'if (!navigator.serviceWorker) {done();return;}\n$1'); + } + }, - // level of logging - // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG - logLevel: config.LOG_INFO, + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + // web server port + port: 9876, - // enable / disable watching file and executing tests whenever any file changes - autoWatch: true, + // enable / disable colors in the output (reporters and logs) + colors: true, + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['PhantomJS'], + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['PhantomJS'], - // Continuous Integration mode - // if true, Karma captures browsers, runs the tests and exits - singleRun: false, + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, - // Concurrency level - // how many browser should be started simultaneous - concurrency: Infinity, + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity, - customLaunchers: { - 'PhantomJS_custom': { - base: 'PhantomJS', - options: { - windowName: 'my-window', - }, - flags: ['--load-images=true'], - debug: true - } + customLaunchers: { + 'PhantomJS_custom': { + base: 'PhantomJS', + options: { + windowName: 'my-window' + }, + flags: ['--load-images=true'], + debug: true + } - } - }) + } + }); }; diff --git a/package.json b/package.json index 60867ee..3ba0c14 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ }, "dependencies": {}, "devDependencies": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.7.0", "babel-polyfill": "^6.6.1", "babel-preset-es2015": "^6.0.15", "body-parser": "1.x", @@ -36,19 +37,21 @@ "express": "^4.13.4", "grunt": "~0.4.1", "grunt-babel": "^6.0.0", + "grunt-browserify": "^5.0.0", "grunt-cli": "^0.1.13", "grunt-contrib-clean": "~0.4.1", - "grunt-contrib-connect": "^0.9.0", + "grunt-contrib-connect": "^1.0.0", "grunt-contrib-jade": "~0.5.1", "grunt-contrib-uglify": "^0.10.0", "grunt-eslint": "^17.3.1", "grunt-karma": "^0.12.1", "grunt-saucelabs": "^8.6.0", "jade": "^1.11.0", - "jquery": "^2.2.1", + "jquery": "^2.2.2", "karma": "^0.13.21", "karma-mocha": "^0.2.2", "karma-phantomjs-launcher": "^1.0.0", + "karma-replacer-preprocessor": "0.0.1", "matchdep": "^1.0.1", "mocha": "^2.4.5", "phantomjs-prebuilt": "^2.1.4" diff --git a/src/db.js b/src/db.js index 9c3cd9c..61f85ea 100644 --- a/src/db.js +++ b/src/db.js @@ -279,7 +279,11 @@ var runQuery = function (type, args, cursorType, direction, limitRange, filters, mapper) { return new Promise(function (resolve, reject) { - var keyRange = type ? IDBKeyRange[type](...args) : null; + try { + var keyRange = type ? IDBKeyRange[type](...args) : null; + } catch (e) { + reject(e); + } var results = []; var indexArgs = [keyRange]; var counter = 0; @@ -499,10 +503,6 @@ }; var createSchema = function (e, schema, db) { - if (typeof schema === 'function') { - schema = schema(); - } - if (!schema || schema.length === 0) { return; } @@ -536,7 +536,7 @@ } }; - var open = function (e, server, noServerMethods, version, schema) { + var open = function (e, server, noServerMethods, version) { var db = e.target.result; dbCache[server][version] = db; @@ -547,8 +547,11 @@ var db = { version: '0.14.0', open: function (options) { - var server = options.server; - var version = options.version || 1; + let server = options.server; + let version = options.version || 1; + let schema = options.schema; + let noServerMethods = options.noServerMethods; + if (!dbCache[server]) { dbCache[server] = {}; } @@ -558,13 +561,21 @@ target: { result: dbCache[server][version] } - }, server, options.noServerMethods, version, options.schema) + }, server, noServerMethods, version) .then(resolve, reject); } else { + if (typeof schema === 'function') { + try { + schema = schema(); + } catch (e) { + reject(e); + return; + } + } let request = indexedDB.open(server, version); - request.onsuccess = e => open(e, server, options.noServerMethods, version, options.schema).then(resolve, reject); - request.onupgradeneeded = e => createSchema(e, options.schema, e.target.result); + request.onsuccess = e => open(e, server, noServerMethods, version).then(resolve, reject); + request.onupgradeneeded = e => createSchema(e, schema, e.target.result); request.onerror = e => reject(e); request.onblocked = e => { var resume = new Promise(function (res, rej) { @@ -574,7 +585,7 @@ // the user unblocks by closing the blocking // connection request.onsuccess = (ev) => { - open(ev, server, options.noServerMethods, version, options.schema) + open(ev, server, noServerMethods, version) .then(res, rej); }; request.onerror = e => rej(e); diff --git a/test-worker.js b/src/test-worker.js similarity index 82% rename from test-worker.js rename to src/test-worker.js index dadb40b..9957b94 100644 --- a/test-worker.js +++ b/src/test-worker.js @@ -1,7 +1,9 @@ +/*global importScripts, db */ (function () { - 'use strict' - importScripts('dist/db.min.js'); - onmessage = function (e) { + 'use strict'; + importScripts('/node_modules/babel-polyfill/dist/polyfill.js'); + importScripts('/dist/db.min.js'); + self.onmessage = function (e) { var dbName = e.data.dbName; var msg = e.data.message; var version = e.data.version; diff --git a/tests/helpers/chai-setup.js b/tests/helpers/chai-setup.js index 583ac5a..a0bd0df 100644 --- a/tests/helpers/chai-setup.js +++ b/tests/helpers/chai-setup.js @@ -1 +1,2 @@ +/*global chai*/ window.expect = chai.expect; diff --git a/tests/helpers/guid.js b/tests/helpers/guid.js index 8381db8..f8600b5 100644 --- a/tests/helpers/guid.js +++ b/tests/helpers/guid.js @@ -1,9 +1,10 @@ -function guid() { - function s4() { +/* exported guid */ +function guid () { // eslint-disable-line no-unused-vars + function s4 () { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); -} \ No newline at end of file +} diff --git a/tests/helpers/phantom.js b/tests/helpers/phantom.js index c320e7c..bcbf0bd 100644 --- a/tests/helpers/phantom.js +++ b/tests/helpers/phantom.js @@ -1,78 +1,78 @@ // Production steps of ECMA-262, Edition 6, 22.1.2.1 // Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from if (!Array.from) { - Array.from = (function () { - var toStr = Object.prototype.toString; - var isCallable = function (fn) { - return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; - }; - var toInteger = function (value) { - var number = Number(value); - if (isNaN(number)) { return 0; } - if (number === 0 || !isFinite(number)) { return number; } - return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); - }; - var maxSafeInteger = Math.pow(2, 53) - 1; - var toLength = function (value) { - var len = toInteger(value); - return Math.min(Math.max(len, 0), maxSafeInteger); - }; + Array.from = (function () { + var toStr = Object.prototype.toString; + var isCallable = function (fn) { + return typeof fn === 'function' || toStr.call(fn) === '[object Function]'; + }; + var toInteger = function (value) { + var number = Number(value); + if (isNaN(number)) { return 0; } + if (number === 0 || !isFinite(number)) { return number; } + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + var maxSafeInteger = Math.pow(2, 53) - 1; + var toLength = function (value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; - // The length property of the from method is 1. - return function from(arrayLike/*, mapFn, thisArg */) { - // 1. Let C be the this value. - var C = this; + // The length property of the from method is 1. + return function from (arrayLike/*, mapFn, thisArg */) { + // 1. Let C be the this value. + var C = this; - // 2. Let items be ToObject(arrayLike). - var items = Object(arrayLike); + // 2. Let items be ToObject(arrayLike). + var items = Object(arrayLike); - // 3. ReturnIfAbrupt(items). - if (arrayLike == null) { - throw new TypeError("Array.from requires an array-like object - not null or undefined"); - } + // 3. ReturnIfAbrupt(items). + if (arrayLike == null) { + throw new TypeError('Array.from requires an array-like object - not null or undefined'); + } - // 4. If mapfn is undefined, then let mapping be false. - var mapFn = arguments.length > 1 ? arguments[1] : void undefined; - var T; - if (typeof mapFn !== 'undefined') { - // 5. else - // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. - if (!isCallable(mapFn)) { - throw new TypeError('Array.from: when provided, the second argument must be a function'); - } + // 4. If mapfn is undefined, then let mapping be false. + var mapFn = arguments.length > 1 ? arguments[1] : void undefined; + var T; + if (typeof mapFn !== 'undefined') { + // 5. else + // 5. a If IsCallable(mapfn) is false, throw a TypeError exception. + if (!isCallable(mapFn)) { + throw new TypeError('Array.from: when provided, the second argument must be a function'); + } - // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. - if (arguments.length > 2) { - T = arguments[2]; - } - } + // 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 2) { + T = arguments[2]; + } + } - // 10. Let lenValue be Get(items, "length"). - // 11. Let len be ToLength(lenValue). - var len = toLength(items.length); + // 10. Let lenValue be Get(items, "length"). + // 11. Let len be ToLength(lenValue). + var len = toLength(items.length); - // 13. If IsConstructor(C) is true, then - // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. - // 14. a. Else, Let A be ArrayCreate(len). - var A = isCallable(C) ? Object(new C(len)) : new Array(len); + // 13. If IsConstructor(C) is true, then + // 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len. + // 14. a. Else, Let A be ArrayCreate(len). + var A = isCallable(C) ? Object(new C(len)) : new Array(len); - // 16. Let k be 0. - var k = 0; - // 17. Repeat, while k < len… (also steps a - h) - var kValue; - while (k < len) { - kValue = items[k]; - if (mapFn) { - A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); - } else { - A[k] = kValue; - } - k += 1; - } - // 18. Let putStatus be Put(A, "length", len, true). - A.length = len; - // 20. Return A. - return A; - }; - }()); -} \ No newline at end of file + // 16. Let k be 0. + var k = 0; + // 17. Repeat, while k < len… (also steps a - h) + var kValue; + while (k < len) { + kValue = items[k]; + if (mapFn) { + A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k); + } else { + A[k] = kValue; + } + k += 1; + } + // 18. Let putStatus be Put(A, "length", len, true). + A.length = len; + // 20. Return A. + return A; + }; + }()); +} diff --git a/tests/specs/web-workers.js b/tests/specs/_web-workers.js similarity index 91% rename from tests/specs/web-workers.js rename to tests/specs/_web-workers.js index 2d35f12..48cf28f 100644 --- a/tests/specs/web-workers.js +++ b/tests/specs/_web-workers.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('web workers', function () { @@ -30,7 +31,7 @@ }); it('should open a created db in a web worker', function (done) { - var tw = new Worker('../test-worker.js'); + var tw = new Worker('test-worker.js'); tw.onmessage = function (e) { expect(e.data).to.be.true; tw.terminate(); @@ -41,11 +42,11 @@ it('should open a created db in a service worker', function (done) { var spec = this; - navigator.serviceWorker.register('../test-worker.js').then(function() { + navigator.serviceWorker.register('test-worker.js').then(function () { return navigator.serviceWorker.ready; }).then(function (serviceWorker) { var messageChannel = new MessageChannel(); - messageChannel.port1.onmessage = function(e) { + messageChannel.port1.onmessage = function (e) { expect(e.data).to.be.true; done(); }; diff --git a/tests/specs/blocked-events.js b/tests/specs/blocked-events.js index 94dab65..5d9cd19 100644 --- a/tests/specs/blocked-events.js +++ b/tests/specs/blocked-events.js @@ -1,3 +1,4 @@ +/*globals guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('blocked events', function () { diff --git a/tests/specs/close-db.js b/tests/specs/close-db.js index bafe773..79fb1ac 100644 --- a/tests/specs/close-db.js +++ b/tests/specs/close-db.js @@ -1,4 +1,4 @@ -/*global window, console*/ +/*global window, console, guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('db.close', function () { @@ -30,7 +30,7 @@ }); it('should close the database', function (done) { - db.open({ + db.open({ server: this.dbName, version: 1, schema: { @@ -54,7 +54,7 @@ }); }); - it ('should reject when trying to work with a closed database', function (done) { + it('should reject when trying to work with a closed database', function (done) { db.open({ server: this.dbName, version: 1, diff --git a/tests/specs/cmp.js b/tests/specs/cmp.js index bacece2..252ef58 100644 --- a/tests/specs/cmp.js +++ b/tests/specs/cmp.js @@ -1,4 +1,4 @@ -/*global window*/ +/*global window, guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; var key1, key2; diff --git a/tests/specs/delete-db.js b/tests/specs/delete-db.js index 5d03069..834c2aa 100644 --- a/tests/specs/delete-db.js +++ b/tests/specs/delete-db.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('db.delete', function () { diff --git a/tests/specs/indexes.js b/tests/specs/indexes.js index c5aa391..ac87653 100644 --- a/tests/specs/indexes.js +++ b/tests/specs/indexes.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; diff --git a/tests/specs/open-db.js b/tests/specs/open-db.js index 8f8760f..a4c6063 100644 --- a/tests/specs/open-db.js +++ b/tests/specs/open-db.js @@ -1,4 +1,4 @@ -/*global window, console, jasmine */ +/*global window, console, guid */ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('db.open', function () { @@ -177,7 +177,7 @@ }); }); - it('should remove object stores no longer defined in the schema', function(done){ + it('should remove object stores no longer defined in the schema', function (done) { var spec = this; db.open({ server: this.dbName, @@ -190,12 +190,12 @@ s.close(); db.open({ - server: spec.dbName, - version: newVersion, - schema: { + server: spec.dbName, + version: newVersion, + schema: { test_2: {} } - }).then(function(s){ + }).then(function (s) { s.close(); var req = indexedDB.open(spec.dbName); @@ -215,6 +215,5 @@ done(err); }); }); - }); }(window.db, window.describe, window.it, window.expect, window.beforeEach, window.afterEach)); diff --git a/tests/specs/query.js b/tests/specs/query.js index ac3369a..ce00927 100644 --- a/tests/specs/query.js +++ b/tests/specs/query.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; @@ -55,7 +56,7 @@ this.server = undefined; // PhantomJS doesn't like handlers added here - var req = indexedDB.deleteDatabase(this.dbName); + var req = indexedDB.deleteDatabase(this.dbName); // eslint-disable-line no-unused-vars }); it('should allow getting by key', function (done) { @@ -769,7 +770,7 @@ this.server = undefined; // PhantomJS doesn't like handlers added here - var req = indexedDB.deleteDatabase(this.dbName); + var req = indexedDB.deleteDatabase(this.dbName); // eslint-disable-line no-unused-vars }); it('should query for data in a multiEntry index', function (done) { diff --git a/tests/specs/server-add.js b/tests/specs/server-add.js index c70a84e..0d670dd 100644 --- a/tests/specs/server-add.js +++ b/tests/specs/server-add.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; diff --git a/tests/specs/server-count.js b/tests/specs/server-count.js index ca7dd3a..3b498b5 100644 --- a/tests/specs/server-count.js +++ b/tests/specs/server-count.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('server.count', function () { diff --git a/tests/specs/server-handlers.js b/tests/specs/server-handlers.js index e8e2523..38a7d04 100644 --- a/tests/specs/server-handlers.js +++ b/tests/specs/server-handlers.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; describe('handlers', function () { @@ -61,7 +62,7 @@ this.server = undefined; // PhantomJS doesn't like handlers added here - var req = indexedDB.deleteDatabase(this.dbName); + var req = indexedDB.deleteDatabase(this.dbName); // eslint-disable-line no-unused-vars }); it('should receive abort events', function (done) { @@ -190,10 +191,10 @@ // Trigger error var tx = this.server.getIndexedDB().transaction('test', 'readwrite'); var store = tx.objectStore('test'); - var request = store.add({specialID: 5}); + var request = store.add({specialID: 5}); // eslint-disable-line no-unused-vars // Trigger abort - var tx = this.server.getIndexedDB().transaction('test'); + tx = this.server.getIndexedDB().transaction('test'); tx.abort(); // Trigger versionchange @@ -207,7 +208,6 @@ dbr.close(); } }); - }); }); }(window.db, window.describe, window.it, window.expect, window.beforeEach, window.afterEach)); diff --git a/tests/specs/server-remove.js b/tests/specs/server-remove.js index 8f82895..558c728 100644 --- a/tests/specs/server-remove.js +++ b/tests/specs/server-remove.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; diff --git a/tests/specs/server-update.js b/tests/specs/server-update.js index ac49639..82f933d 100644 --- a/tests/specs/server-update.js +++ b/tests/specs/server-update.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach) { 'use strict'; diff --git a/tests/specs/thenable-integration.js b/tests/specs/thenable-integration.js index f69817c..6203712 100644 --- a/tests/specs/thenable-integration.js +++ b/tests/specs/thenable-integration.js @@ -1,3 +1,4 @@ +/*global guid*/ (function (db, describe, it, expect, beforeEach, afterEach, $) { 'use strict'; diff --git a/tests/test-worker.js b/tests/test-worker.js new file mode 100644 index 0000000..efc3034 --- /dev/null +++ b/tests/test-worker.js @@ -0,0 +1,2 @@ +"use strict";!function(){importScripts("/node_modules/babel-polyfill/dist/polyfill.js"),importScripts("/dist/db.min.js"),self.onmessage=function(a){var b=a.data.dbName,c=a.data.message,d=a.data.version;switch(c){case"web worker open":db.open({server:b,version:d}).then(function(a){var b="undefined"!=typeof a;a.close(),postMessage(b)});break;case"service worker open":db.open({server:b,version:d}).then(function(b){var c="undefined"!=typeof b;b.close(),a.ports[0].postMessage(c)})}}}(); +//# sourceMappingURL=test-worker.js.map \ No newline at end of file diff --git a/tests/test-worker.js.map b/tests/test-worker.js.map new file mode 100644 index 0000000..cecd634 --- /dev/null +++ b/tests/test-worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/test-worker.js"],"names":["importScripts","self","onmessage","e","dbName","data","msg","message","version","db","open","server","then","result","close","postMessage","ports"],"mappings":"cACA,WAEIA,cAAc,iDACdA,cAAc,mBACdC,KAAKC,UAAY,SAAUC,GACvB,GAAIC,GAASD,EAAEE,KAAKD,OAChBE,EAAMH,EAAEE,KAAKE,QACbC,EAAUL,EAAEE,KAAKG,OACrB,QAAQF,GACR,IAAK,kBACDG,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QAFeC,YAGVF,IAEhB,MAVJ,KAWK,sBACDJ,GAAGC,MACCC,OAAQP,EACRI,QAASA,IACVI,KAAK,SAAUD,GACd,GAAIE,GAA2B,mBAAXF,EACpBA,GAAOG,QAFeX,EAGpBa,MAAM,GAAGD,YAAYF;;;AA1BvC,CAAC,YAAY;AACT,iBADS;;AAET,kBAAc,+CAAd,EAFS;AAGT,kBAAc,iBAAd,EAHS;AAIT,SAAK,SAAL,GAAiB,UAAU,CAAV,EAAa;AAC1B,YAAI,SAAS,EAAE,IAAF,CAAO,MAAP,CADa;AAE1B,YAAI,MAAM,EAAE,IAAF,CAAO,OAAP,CAFgB;AAG1B,YAAI,UAAU,EAAE,IAAF,CAAO,OAAP,CAHY;AAI1B,gBAAQ,GAAR;AACA,iBAAK,iBAAL;AACI,mBAAG,IAAH,CAAQ;AACJ,4BAAQ,MAAR;AACA,6BAAS,OAAT;iBAFJ,EAGG,IAHH,CAGQ,UAAU,MAAV,EAAkB;AACtB,wBAAI,SAAS,OAAO,MAAP,KAAkB,WAAlB,CADS;AAEtB,2BAAO,KAAP;AAFsB,+BAGtB,CAAY,MAAZ,EAHsB;iBAAlB,CAHR,CADJ;AASI,sBATJ;AADA,iBAWK,qBAAL;AACI,mBAAG,IAAH,CAAQ;AACJ,4BAAQ,MAAR;AACA,6BAAS,OAAT;iBAFJ,EAGG,IAHH,CAGQ,UAAU,MAAV,EAAkB;AACtB,wBAAI,SAAS,OAAO,MAAP,KAAkB,WAAlB,CADS;AAEtB,2BAAO,KAAP;AAFsB,qBAGtB,CAAE,KAAF,CAAQ,CAAR,EAAW,WAAX,CAAuB,MAAvB,EAHsB;iBAAlB,CAHR,CADJ;AASI,sBATJ;AAXA,SAJ0B;KAAb,CAJR;CAAZ,GAAD","file":"test-worker.js","sourcesContent":["/*global importScripts, db */\r\n(function () {\r\n 'use strict';\r\n importScripts('/node_modules/babel-polyfill/dist/polyfill.js');\r\n importScripts('/dist/db.min.js');\r\n self.onmessage = function (e) {\r\n var dbName = e.data.dbName;\r\n var msg = e.data.message;\r\n var version = e.data.version;\r\n switch (msg) {\r\n case 'web worker open':\r\n db.open({\r\n server: dbName,\r\n version: version\r\n }).then(function (server) {\r\n let result = typeof server !== 'undefined';\r\n server.close(); // Prevent subsequent blocking\r\n postMessage(result);\r\n });\r\n break;\r\n case 'service worker open':\r\n db.open({\r\n server: dbName,\r\n version: version\r\n }).then(function (server) {\r\n let result = typeof server !== 'undefined';\r\n server.close(); // Prevent subsequent blocking\r\n e.ports[0].postMessage(result);\r\n });\r\n break;\r\n }\r\n };\r\n}());\r\n"]} \ No newline at end of file diff --git a/tests/views/index.jade b/tests/views/index.jade index ad18e64..b188c71 100644 --- a/tests/views/index.jade +++ b/tests/views/index.jade @@ -1,7 +1,6 @@ extends layout append scripts - script(src='../node_modules/babel-polyfill/dist/polyfill.js') script(src='../node_modules/jquery/dist/jquery.min.js') script(src='specs/open-db.js') script(src='specs/close-db.js') @@ -16,4 +15,4 @@ append scripts script(src='specs/query.js') script(src='specs/indexes.js') script(src='specs/thenable-integration.js') - script(src='specs/web-workers.js') + script(src='specs/_web-workers.js')