Comparing version 1.4.1 to 1.5.0
1595
bin/index.js
@@ -1,1595 +0,16 @@ | ||
(function webpackUniversalModuleDefinition(root, factory) { | ||
if(typeof exports === 'object' && typeof module === 'object') | ||
module.exports = factory(); | ||
else if(typeof define === 'function' && define.amd) | ||
define("delux", [], factory); | ||
else if(typeof exports === 'object') | ||
exports["delux"] = factory(); | ||
else | ||
root["delux"] = factory(); | ||
})(this, function() { | ||
return /******/ (function(modules) { // webpackBootstrap | ||
/******/ // The module cache | ||
/******/ var installedModules = {}; | ||
/******/ // The require function | ||
/******/ function __webpack_require__(moduleId) { | ||
/******/ // Check if module is in cache | ||
/******/ if(installedModules[moduleId]) | ||
/******/ return installedModules[moduleId].exports; | ||
/******/ // Create a new module (and put it into the cache) | ||
/******/ var module = installedModules[moduleId] = { | ||
/******/ i: moduleId, | ||
/******/ l: false, | ||
/******/ exports: {} | ||
/******/ }; | ||
/******/ // Execute the module function | ||
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||
/******/ // Flag the module as loaded | ||
/******/ module.l = true; | ||
/******/ // Return the exports of the module | ||
/******/ return module.exports; | ||
/******/ } | ||
/******/ // expose the modules object (__webpack_modules__) | ||
/******/ __webpack_require__.m = modules; | ||
/******/ // expose the module cache | ||
/******/ __webpack_require__.c = installedModules; | ||
/******/ // identity function for calling harmory imports with the correct context | ||
/******/ __webpack_require__.i = function(value) { return value; }; | ||
/******/ // define getter function for harmory exports | ||
/******/ __webpack_require__.d = function(exports, name, getter) { | ||
/******/ Object.defineProperty(exports, name, { | ||
/******/ configurable: false, | ||
/******/ enumerable: true, | ||
/******/ get: getter | ||
/******/ }); | ||
/******/ }; | ||
/******/ // getDefaultExport function for compatibility with non-harmony modules | ||
/******/ __webpack_require__.n = function(module) { | ||
/******/ var getter = module && module.__esModule ? | ||
/******/ function getDefault() { return module['default']; } : | ||
/******/ function getModuleExports() { return module; }; | ||
/******/ __webpack_require__.d(getter, 'a', getter); | ||
/******/ return getter; | ||
/******/ }; | ||
/******/ // Object.prototype.hasOwnProperty.call | ||
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; | ||
/******/ // __webpack_public_path__ | ||
/******/ __webpack_require__.p = ""; | ||
/******/ // Load entry module and return exports | ||
/******/ return __webpack_require__(__webpack_require__.s = 7); | ||
/******/ }) | ||
/************************************************************************/ | ||
/******/ ([ | ||
/* 0 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
'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; }; }(); | ||
var _store = require('./store'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var _store2 = _interopRequireDefault(_store); | ||
var _require = __webpack_require__(1); | ||
var _collection = require('./collection'); | ||
var forceArray = _require.forceArray; | ||
var _collection2 = _interopRequireDefault(_collection); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
module.exports = function () { | ||
function Collection(init) { | ||
_classCallCheck(this, Collection); | ||
require('es6-promise').polyfill(); | ||
this.reducers = {}; | ||
this.observers = []; | ||
this.state = init; | ||
} | ||
_createClass(Collection, [{ | ||
key: 'on', | ||
value: function on(types, reducer) { | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
for (var _iterator = forceArray(types)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
var type = _step.value; | ||
this.reducers[type] = reducer; | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
} | ||
} | ||
}]); | ||
return Collection; | ||
}(); | ||
/***/ }, | ||
/* 1 */ | ||
/***/ function(module, exports) { | ||
"use strict"; | ||
"use strict"; | ||
var forceArray = function forceArray(array) { | ||
return Array.isArray(array) ? array : [array]; | ||
}; | ||
function getByKeys(object, keys) { | ||
var relevant = {}; | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
for (var _iterator = forceArray(keys)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
var key = _step.value; | ||
relevant[key] = object[key]; | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
} | ||
return relevant; | ||
} | ||
module.exports = { forceArray: forceArray, getByKeys: getByKeys }; | ||
/***/ }, | ||
/* 2 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
'use strict'; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; | ||
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; }; }(); | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var Collection = __webpack_require__(0); | ||
var _require = __webpack_require__(1); | ||
var forceArray = _require.forceArray; | ||
var getByKeys = _require.getByKeys; | ||
/** | ||
* The Store holds the whole application state and it's mutation logic. | ||
*/ | ||
module.exports = function () { | ||
function Store() { | ||
_classCallCheck(this, Store); | ||
this.middlewares = []; | ||
this.queued = Promise.resolve(); | ||
this.state = { | ||
get: function get(collections) { | ||
return getByKeys(this, collections); | ||
} | ||
}; | ||
} | ||
/** | ||
* object with mutations of the collections' states | ||
*/ | ||
_createClass(Store, [{ | ||
key: 'use', | ||
/** | ||
* Adds an observer for mutations in the store's collections | ||
* @param {function|string|object} middleware|type|{type:middleware} | ||
* @param {function} middleware | ||
*/ | ||
value: function use(middleware) { | ||
var _this = this; | ||
var _arguments = Array.prototype.slice.call(arguments); | ||
var arg0 = _arguments[0]; | ||
var arg1 = _arguments[1]; | ||
({ | ||
function: function _function() { | ||
return _this.middlewares.push(middleware); | ||
}, | ||
string: function string() { | ||
return _this.middlewares.push(function (action) { | ||
if (action.type === arg0) { | ||
arg1(action); | ||
} | ||
}); | ||
}, | ||
object: function object() { | ||
return _this.middlewares.push(function (action) { | ||
if (arg0[action.type]) { | ||
arg0[action.type](action); | ||
} | ||
}); | ||
} | ||
})[typeof arg0 === 'undefined' ? 'undefined' : _typeof(arg0)](); | ||
} | ||
/** | ||
* Dispatches a Flux Standard Action on the state. | ||
* @param {object} action | ||
* @returns {Promise} - resolves to the mutated store state. | ||
*/ | ||
}, { | ||
key: 'dispatch', | ||
value: function dispatch(action) { | ||
var _this2 = this; | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
try { | ||
var _loop = function _loop() { | ||
var middleware = _step.value; | ||
_this2.queue(function () { | ||
return Promise.resolve(middleware(action)); | ||
}); | ||
}; | ||
for (var _iterator = this.middlewares[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
_loop(); | ||
} | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
} | ||
return this.queue(function () { | ||
return Promise.all(Object.keys(_this2).filter(function (name) { | ||
return _this2[name] instanceof Collection && _this2[name].reducers[action.type]; | ||
}).map(function (name) { | ||
var collection = _this2[name]; | ||
var state = collection.state; | ||
var reducers = collection.reducers; | ||
return Promise.resolve(reducers[action.type](state, action)).then(function () { | ||
var newCollectionState = arguments.length <= 0 || arguments[0] === undefined ? state : arguments[0]; | ||
if (newCollectionState !== state) { | ||
collection.state = newCollectionState; | ||
var _iteratorNormalCompletion2 = true; | ||
var _didIteratorError2 = false; | ||
var _iteratorError2 = undefined; | ||
try { | ||
for (var _iterator2 = collection.observers[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { | ||
var observer = _step2.value; | ||
observer(Object.assign(_this2.state, _defineProperty({}, name, newCollectionState)), action, name); | ||
} | ||
} catch (err) { | ||
_didIteratorError2 = true; | ||
_iteratorError2 = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion2 && _iterator2.return) { | ||
_iterator2.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError2) { | ||
throw _iteratorError2; | ||
} | ||
} | ||
} | ||
} | ||
return newCollectionState; | ||
}); | ||
})).then(function () { | ||
return _this2.state; | ||
}); | ||
}); | ||
} | ||
/** | ||
* Adds an observer for mutations in the store's collections. | ||
* @param {string | array} collectionNames - collections to observe | ||
* @param {function} observer | ||
*/ | ||
}, { | ||
key: 'observe', | ||
value: function observe(collectionNames, observer) { | ||
var _iteratorNormalCompletion3 = true; | ||
var _didIteratorError3 = false; | ||
var _iteratorError3 = undefined; | ||
try { | ||
for (var _iterator3 = forceArray(collectionNames)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { | ||
var name = _step3.value; | ||
this[name].observers.push(observer); | ||
} | ||
} catch (err) { | ||
_didIteratorError3 = true; | ||
_iteratorError3 = err; | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion3 && _iterator3.return) { | ||
_iterator3.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError3) { | ||
throw _iteratorError3; | ||
} | ||
} | ||
} | ||
} | ||
/** | ||
* Adds a function to the store's execute queue | ||
* @param {function} action | ||
* @returns {Promise} - resolves after the action resolves. | ||
*/ | ||
}, { | ||
key: 'queue', | ||
value: function queue(action) { | ||
return this.queued = this.queued.then(action); | ||
} | ||
}]); | ||
return Store; | ||
}(); | ||
/***/ }, | ||
/* 3 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
/* WEBPACK VAR INJECTION */(function(process, global) {var require;var __WEBPACK_AMD_DEFINE_RESULT__;/*! | ||
* @overview es6-promise - a tiny implementation of Promises/A+. | ||
* @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) | ||
* @license Licensed under MIT license | ||
* See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE | ||
* @version 3.2.1 | ||
*/ | ||
(function() { | ||
"use strict"; | ||
function lib$es6$promise$utils$$objectOrFunction(x) { | ||
return typeof x === 'function' || (typeof x === 'object' && x !== null); | ||
} | ||
function lib$es6$promise$utils$$isFunction(x) { | ||
return typeof x === 'function'; | ||
} | ||
function lib$es6$promise$utils$$isMaybeThenable(x) { | ||
return typeof x === 'object' && x !== null; | ||
} | ||
var lib$es6$promise$utils$$_isArray; | ||
if (!Array.isArray) { | ||
lib$es6$promise$utils$$_isArray = function (x) { | ||
return Object.prototype.toString.call(x) === '[object Array]'; | ||
}; | ||
} else { | ||
lib$es6$promise$utils$$_isArray = Array.isArray; | ||
} | ||
var lib$es6$promise$utils$$isArray = lib$es6$promise$utils$$_isArray; | ||
var lib$es6$promise$asap$$len = 0; | ||
var lib$es6$promise$asap$$vertxNext; | ||
var lib$es6$promise$asap$$customSchedulerFn; | ||
var lib$es6$promise$asap$$asap = function asap(callback, arg) { | ||
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len] = callback; | ||
lib$es6$promise$asap$$queue[lib$es6$promise$asap$$len + 1] = arg; | ||
lib$es6$promise$asap$$len += 2; | ||
if (lib$es6$promise$asap$$len === 2) { | ||
// If len is 2, that means that we need to schedule an async flush. | ||
// If additional callbacks are queued before the queue is flushed, they | ||
// will be processed by this flush that we are scheduling. | ||
if (lib$es6$promise$asap$$customSchedulerFn) { | ||
lib$es6$promise$asap$$customSchedulerFn(lib$es6$promise$asap$$flush); | ||
} else { | ||
lib$es6$promise$asap$$scheduleFlush(); | ||
} | ||
} | ||
} | ||
function lib$es6$promise$asap$$setScheduler(scheduleFn) { | ||
lib$es6$promise$asap$$customSchedulerFn = scheduleFn; | ||
} | ||
function lib$es6$promise$asap$$setAsap(asapFn) { | ||
lib$es6$promise$asap$$asap = asapFn; | ||
} | ||
var lib$es6$promise$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined; | ||
var lib$es6$promise$asap$$browserGlobal = lib$es6$promise$asap$$browserWindow || {}; | ||
var lib$es6$promise$asap$$BrowserMutationObserver = lib$es6$promise$asap$$browserGlobal.MutationObserver || lib$es6$promise$asap$$browserGlobal.WebKitMutationObserver; | ||
var lib$es6$promise$asap$$isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]'; | ||
// test for web worker but not in IE10 | ||
var lib$es6$promise$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' && | ||
typeof importScripts !== 'undefined' && | ||
typeof MessageChannel !== 'undefined'; | ||
// node | ||
function lib$es6$promise$asap$$useNextTick() { | ||
// node version 0.10.x displays a deprecation warning when nextTick is used recursively | ||
// see https://github.com/cujojs/when/issues/410 for details | ||
return function() { | ||
process.nextTick(lib$es6$promise$asap$$flush); | ||
}; | ||
} | ||
// vertx | ||
function lib$es6$promise$asap$$useVertxTimer() { | ||
return function() { | ||
lib$es6$promise$asap$$vertxNext(lib$es6$promise$asap$$flush); | ||
}; | ||
} | ||
function lib$es6$promise$asap$$useMutationObserver() { | ||
var iterations = 0; | ||
var observer = new lib$es6$promise$asap$$BrowserMutationObserver(lib$es6$promise$asap$$flush); | ||
var node = document.createTextNode(''); | ||
observer.observe(node, { characterData: true }); | ||
return function() { | ||
node.data = (iterations = ++iterations % 2); | ||
}; | ||
} | ||
// web worker | ||
function lib$es6$promise$asap$$useMessageChannel() { | ||
var channel = new MessageChannel(); | ||
channel.port1.onmessage = lib$es6$promise$asap$$flush; | ||
return function () { | ||
channel.port2.postMessage(0); | ||
}; | ||
} | ||
function lib$es6$promise$asap$$useSetTimeout() { | ||
return function() { | ||
setTimeout(lib$es6$promise$asap$$flush, 1); | ||
}; | ||
} | ||
var lib$es6$promise$asap$$queue = new Array(1000); | ||
function lib$es6$promise$asap$$flush() { | ||
for (var i = 0; i < lib$es6$promise$asap$$len; i+=2) { | ||
var callback = lib$es6$promise$asap$$queue[i]; | ||
var arg = lib$es6$promise$asap$$queue[i+1]; | ||
callback(arg); | ||
lib$es6$promise$asap$$queue[i] = undefined; | ||
lib$es6$promise$asap$$queue[i+1] = undefined; | ||
} | ||
lib$es6$promise$asap$$len = 0; | ||
} | ||
function lib$es6$promise$asap$$attemptVertx() { | ||
try { | ||
var r = require; | ||
var vertx = __webpack_require__(6); | ||
lib$es6$promise$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext; | ||
return lib$es6$promise$asap$$useVertxTimer(); | ||
} catch(e) { | ||
return lib$es6$promise$asap$$useSetTimeout(); | ||
} | ||
} | ||
var lib$es6$promise$asap$$scheduleFlush; | ||
// Decide what async method to use to triggering processing of queued callbacks: | ||
if (lib$es6$promise$asap$$isNode) { | ||
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useNextTick(); | ||
} else if (lib$es6$promise$asap$$BrowserMutationObserver) { | ||
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMutationObserver(); | ||
} else if (lib$es6$promise$asap$$isWorker) { | ||
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useMessageChannel(); | ||
} else if (lib$es6$promise$asap$$browserWindow === undefined && "function" === 'function') { | ||
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$attemptVertx(); | ||
} else { | ||
lib$es6$promise$asap$$scheduleFlush = lib$es6$promise$asap$$useSetTimeout(); | ||
} | ||
function lib$es6$promise$then$$then(onFulfillment, onRejection) { | ||
var parent = this; | ||
var child = new this.constructor(lib$es6$promise$$internal$$noop); | ||
if (child[lib$es6$promise$$internal$$PROMISE_ID] === undefined) { | ||
lib$es6$promise$$internal$$makePromise(child); | ||
} | ||
var state = parent._state; | ||
if (state) { | ||
var callback = arguments[state - 1]; | ||
lib$es6$promise$asap$$asap(function(){ | ||
lib$es6$promise$$internal$$invokeCallback(state, child, callback, parent._result); | ||
}); | ||
} else { | ||
lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection); | ||
} | ||
return child; | ||
} | ||
var lib$es6$promise$then$$default = lib$es6$promise$then$$then; | ||
function lib$es6$promise$promise$resolve$$resolve(object) { | ||
/*jshint validthis:true */ | ||
var Constructor = this; | ||
if (object && typeof object === 'object' && object.constructor === Constructor) { | ||
return object; | ||
} | ||
var promise = new Constructor(lib$es6$promise$$internal$$noop); | ||
lib$es6$promise$$internal$$resolve(promise, object); | ||
return promise; | ||
} | ||
var lib$es6$promise$promise$resolve$$default = lib$es6$promise$promise$resolve$$resolve; | ||
var lib$es6$promise$$internal$$PROMISE_ID = Math.random().toString(36).substring(16); | ||
function lib$es6$promise$$internal$$noop() {} | ||
var lib$es6$promise$$internal$$PENDING = void 0; | ||
var lib$es6$promise$$internal$$FULFILLED = 1; | ||
var lib$es6$promise$$internal$$REJECTED = 2; | ||
var lib$es6$promise$$internal$$GET_THEN_ERROR = new lib$es6$promise$$internal$$ErrorObject(); | ||
function lib$es6$promise$$internal$$selfFulfillment() { | ||
return new TypeError("You cannot resolve a promise with itself"); | ||
} | ||
function lib$es6$promise$$internal$$cannotReturnOwn() { | ||
return new TypeError('A promises callback cannot return that same promise.'); | ||
} | ||
function lib$es6$promise$$internal$$getThen(promise) { | ||
try { | ||
return promise.then; | ||
} catch(error) { | ||
lib$es6$promise$$internal$$GET_THEN_ERROR.error = error; | ||
return lib$es6$promise$$internal$$GET_THEN_ERROR; | ||
} | ||
} | ||
function lib$es6$promise$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) { | ||
try { | ||
then.call(value, fulfillmentHandler, rejectionHandler); | ||
} catch(e) { | ||
return e; | ||
} | ||
} | ||
function lib$es6$promise$$internal$$handleForeignThenable(promise, thenable, then) { | ||
lib$es6$promise$asap$$asap(function(promise) { | ||
var sealed = false; | ||
var error = lib$es6$promise$$internal$$tryThen(then, thenable, function(value) { | ||
if (sealed) { return; } | ||
sealed = true; | ||
if (thenable !== value) { | ||
lib$es6$promise$$internal$$resolve(promise, value); | ||
} else { | ||
lib$es6$promise$$internal$$fulfill(promise, value); | ||
} | ||
}, function(reason) { | ||
if (sealed) { return; } | ||
sealed = true; | ||
lib$es6$promise$$internal$$reject(promise, reason); | ||
}, 'Settle: ' + (promise._label || ' unknown promise')); | ||
if (!sealed && error) { | ||
sealed = true; | ||
lib$es6$promise$$internal$$reject(promise, error); | ||
} | ||
}, promise); | ||
} | ||
function lib$es6$promise$$internal$$handleOwnThenable(promise, thenable) { | ||
if (thenable._state === lib$es6$promise$$internal$$FULFILLED) { | ||
lib$es6$promise$$internal$$fulfill(promise, thenable._result); | ||
} else if (thenable._state === lib$es6$promise$$internal$$REJECTED) { | ||
lib$es6$promise$$internal$$reject(promise, thenable._result); | ||
} else { | ||
lib$es6$promise$$internal$$subscribe(thenable, undefined, function(value) { | ||
lib$es6$promise$$internal$$resolve(promise, value); | ||
}, function(reason) { | ||
lib$es6$promise$$internal$$reject(promise, reason); | ||
}); | ||
} | ||
} | ||
function lib$es6$promise$$internal$$handleMaybeThenable(promise, maybeThenable, then) { | ||
if (maybeThenable.constructor === promise.constructor && | ||
then === lib$es6$promise$then$$default && | ||
constructor.resolve === lib$es6$promise$promise$resolve$$default) { | ||
lib$es6$promise$$internal$$handleOwnThenable(promise, maybeThenable); | ||
} else { | ||
if (then === lib$es6$promise$$internal$$GET_THEN_ERROR) { | ||
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$GET_THEN_ERROR.error); | ||
} else if (then === undefined) { | ||
lib$es6$promise$$internal$$fulfill(promise, maybeThenable); | ||
} else if (lib$es6$promise$utils$$isFunction(then)) { | ||
lib$es6$promise$$internal$$handleForeignThenable(promise, maybeThenable, then); | ||
} else { | ||
lib$es6$promise$$internal$$fulfill(promise, maybeThenable); | ||
} | ||
} | ||
} | ||
function lib$es6$promise$$internal$$resolve(promise, value) { | ||
if (promise === value) { | ||
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$selfFulfillment()); | ||
} else if (lib$es6$promise$utils$$objectOrFunction(value)) { | ||
lib$es6$promise$$internal$$handleMaybeThenable(promise, value, lib$es6$promise$$internal$$getThen(value)); | ||
} else { | ||
lib$es6$promise$$internal$$fulfill(promise, value); | ||
} | ||
} | ||
function lib$es6$promise$$internal$$publishRejection(promise) { | ||
if (promise._onerror) { | ||
promise._onerror(promise._result); | ||
} | ||
lib$es6$promise$$internal$$publish(promise); | ||
} | ||
function lib$es6$promise$$internal$$fulfill(promise, value) { | ||
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } | ||
promise._result = value; | ||
promise._state = lib$es6$promise$$internal$$FULFILLED; | ||
if (promise._subscribers.length !== 0) { | ||
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, promise); | ||
} | ||
} | ||
function lib$es6$promise$$internal$$reject(promise, reason) { | ||
if (promise._state !== lib$es6$promise$$internal$$PENDING) { return; } | ||
promise._state = lib$es6$promise$$internal$$REJECTED; | ||
promise._result = reason; | ||
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publishRejection, promise); | ||
} | ||
function lib$es6$promise$$internal$$subscribe(parent, child, onFulfillment, onRejection) { | ||
var subscribers = parent._subscribers; | ||
var length = subscribers.length; | ||
parent._onerror = null; | ||
subscribers[length] = child; | ||
subscribers[length + lib$es6$promise$$internal$$FULFILLED] = onFulfillment; | ||
subscribers[length + lib$es6$promise$$internal$$REJECTED] = onRejection; | ||
if (length === 0 && parent._state) { | ||
lib$es6$promise$asap$$asap(lib$es6$promise$$internal$$publish, parent); | ||
} | ||
} | ||
function lib$es6$promise$$internal$$publish(promise) { | ||
var subscribers = promise._subscribers; | ||
var settled = promise._state; | ||
if (subscribers.length === 0) { return; } | ||
var child, callback, detail = promise._result; | ||
for (var i = 0; i < subscribers.length; i += 3) { | ||
child = subscribers[i]; | ||
callback = subscribers[i + settled]; | ||
if (child) { | ||
lib$es6$promise$$internal$$invokeCallback(settled, child, callback, detail); | ||
} else { | ||
callback(detail); | ||
} | ||
} | ||
promise._subscribers.length = 0; | ||
} | ||
function lib$es6$promise$$internal$$ErrorObject() { | ||
this.error = null; | ||
} | ||
var lib$es6$promise$$internal$$TRY_CATCH_ERROR = new lib$es6$promise$$internal$$ErrorObject(); | ||
function lib$es6$promise$$internal$$tryCatch(callback, detail) { | ||
try { | ||
return callback(detail); | ||
} catch(e) { | ||
lib$es6$promise$$internal$$TRY_CATCH_ERROR.error = e; | ||
return lib$es6$promise$$internal$$TRY_CATCH_ERROR; | ||
} | ||
} | ||
function lib$es6$promise$$internal$$invokeCallback(settled, promise, callback, detail) { | ||
var hasCallback = lib$es6$promise$utils$$isFunction(callback), | ||
value, error, succeeded, failed; | ||
if (hasCallback) { | ||
value = lib$es6$promise$$internal$$tryCatch(callback, detail); | ||
if (value === lib$es6$promise$$internal$$TRY_CATCH_ERROR) { | ||
failed = true; | ||
error = value.error; | ||
value = null; | ||
} else { | ||
succeeded = true; | ||
} | ||
if (promise === value) { | ||
lib$es6$promise$$internal$$reject(promise, lib$es6$promise$$internal$$cannotReturnOwn()); | ||
return; | ||
} | ||
} else { | ||
value = detail; | ||
succeeded = true; | ||
} | ||
if (promise._state !== lib$es6$promise$$internal$$PENDING) { | ||
// noop | ||
} else if (hasCallback && succeeded) { | ||
lib$es6$promise$$internal$$resolve(promise, value); | ||
} else if (failed) { | ||
lib$es6$promise$$internal$$reject(promise, error); | ||
} else if (settled === lib$es6$promise$$internal$$FULFILLED) { | ||
lib$es6$promise$$internal$$fulfill(promise, value); | ||
} else if (settled === lib$es6$promise$$internal$$REJECTED) { | ||
lib$es6$promise$$internal$$reject(promise, value); | ||
} | ||
} | ||
function lib$es6$promise$$internal$$initializePromise(promise, resolver) { | ||
try { | ||
resolver(function resolvePromise(value){ | ||
lib$es6$promise$$internal$$resolve(promise, value); | ||
}, function rejectPromise(reason) { | ||
lib$es6$promise$$internal$$reject(promise, reason); | ||
}); | ||
} catch(e) { | ||
lib$es6$promise$$internal$$reject(promise, e); | ||
} | ||
} | ||
var lib$es6$promise$$internal$$id = 0; | ||
function lib$es6$promise$$internal$$nextId() { | ||
return lib$es6$promise$$internal$$id++; | ||
} | ||
function lib$es6$promise$$internal$$makePromise(promise) { | ||
promise[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$id++; | ||
promise._state = undefined; | ||
promise._result = undefined; | ||
promise._subscribers = []; | ||
} | ||
function lib$es6$promise$promise$all$$all(entries) { | ||
return new lib$es6$promise$enumerator$$default(this, entries).promise; | ||
} | ||
var lib$es6$promise$promise$all$$default = lib$es6$promise$promise$all$$all; | ||
function lib$es6$promise$promise$race$$race(entries) { | ||
/*jshint validthis:true */ | ||
var Constructor = this; | ||
if (!lib$es6$promise$utils$$isArray(entries)) { | ||
return new Constructor(function(resolve, reject) { | ||
reject(new TypeError('You must pass an array to race.')); | ||
}); | ||
} else { | ||
return new Constructor(function(resolve, reject) { | ||
var length = entries.length; | ||
for (var i = 0; i < length; i++) { | ||
Constructor.resolve(entries[i]).then(resolve, reject); | ||
} | ||
}); | ||
} | ||
} | ||
var lib$es6$promise$promise$race$$default = lib$es6$promise$promise$race$$race; | ||
function lib$es6$promise$promise$reject$$reject(reason) { | ||
/*jshint validthis:true */ | ||
var Constructor = this; | ||
var promise = new Constructor(lib$es6$promise$$internal$$noop); | ||
lib$es6$promise$$internal$$reject(promise, reason); | ||
return promise; | ||
} | ||
var lib$es6$promise$promise$reject$$default = lib$es6$promise$promise$reject$$reject; | ||
function lib$es6$promise$promise$$needsResolver() { | ||
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); | ||
} | ||
function lib$es6$promise$promise$$needsNew() { | ||
throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); | ||
} | ||
var lib$es6$promise$promise$$default = lib$es6$promise$promise$$Promise; | ||
/** | ||
Promise objects represent the eventual result of an asynchronous operation. The | ||
primary way of interacting with a promise is through its `then` method, which | ||
registers callbacks to receive either a promise's eventual value or the reason | ||
why the promise cannot be fulfilled. | ||
Terminology | ||
----------- | ||
- `promise` is an object or function with a `then` method whose behavior conforms to this specification. | ||
- `thenable` is an object or function that defines a `then` method. | ||
- `value` is any legal JavaScript value (including undefined, a thenable, or a promise). | ||
- `exception` is a value that is thrown using the throw statement. | ||
- `reason` is a value that indicates why a promise was rejected. | ||
- `settled` the final resting state of a promise, fulfilled or rejected. | ||
A promise can be in one of three states: pending, fulfilled, or rejected. | ||
Promises that are fulfilled have a fulfillment value and are in the fulfilled | ||
state. Promises that are rejected have a rejection reason and are in the | ||
rejected state. A fulfillment value is never a thenable. | ||
Promises can also be said to *resolve* a value. If this value is also a | ||
promise, then the original promise's settled state will match the value's | ||
settled state. So a promise that *resolves* a promise that rejects will | ||
itself reject, and a promise that *resolves* a promise that fulfills will | ||
itself fulfill. | ||
Basic Usage: | ||
------------ | ||
```js | ||
var promise = new Promise(function(resolve, reject) { | ||
// on success | ||
resolve(value); | ||
// on failure | ||
reject(reason); | ||
}); | ||
promise.then(function(value) { | ||
// on fulfillment | ||
}, function(reason) { | ||
// on rejection | ||
}); | ||
``` | ||
Advanced Usage: | ||
--------------- | ||
Promises shine when abstracting away asynchronous interactions such as | ||
`XMLHttpRequest`s. | ||
```js | ||
function getJSON(url) { | ||
return new Promise(function(resolve, reject){ | ||
var xhr = new XMLHttpRequest(); | ||
xhr.open('GET', url); | ||
xhr.onreadystatechange = handler; | ||
xhr.responseType = 'json'; | ||
xhr.setRequestHeader('Accept', 'application/json'); | ||
xhr.send(); | ||
function handler() { | ||
if (this.readyState === this.DONE) { | ||
if (this.status === 200) { | ||
resolve(this.response); | ||
} else { | ||
reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); | ||
} | ||
} | ||
}; | ||
}); | ||
} | ||
getJSON('/posts.json').then(function(json) { | ||
// on fulfillment | ||
}, function(reason) { | ||
// on rejection | ||
}); | ||
``` | ||
Unlike callbacks, promises are great composable primitives. | ||
```js | ||
Promise.all([ | ||
getJSON('/posts'), | ||
getJSON('/comments') | ||
]).then(function(values){ | ||
values[0] // => postsJSON | ||
values[1] // => commentsJSON | ||
return values; | ||
}); | ||
``` | ||
@class Promise | ||
@param {function} resolver | ||
Useful for tooling. | ||
@constructor | ||
*/ | ||
function lib$es6$promise$promise$$Promise(resolver) { | ||
this[lib$es6$promise$$internal$$PROMISE_ID] = lib$es6$promise$$internal$$nextId(); | ||
this._result = this._state = undefined; | ||
this._subscribers = []; | ||
if (lib$es6$promise$$internal$$noop !== resolver) { | ||
typeof resolver !== 'function' && lib$es6$promise$promise$$needsResolver(); | ||
this instanceof lib$es6$promise$promise$$Promise ? lib$es6$promise$$internal$$initializePromise(this, resolver) : lib$es6$promise$promise$$needsNew(); | ||
} | ||
} | ||
lib$es6$promise$promise$$Promise.all = lib$es6$promise$promise$all$$default; | ||
lib$es6$promise$promise$$Promise.race = lib$es6$promise$promise$race$$default; | ||
lib$es6$promise$promise$$Promise.resolve = lib$es6$promise$promise$resolve$$default; | ||
lib$es6$promise$promise$$Promise.reject = lib$es6$promise$promise$reject$$default; | ||
lib$es6$promise$promise$$Promise._setScheduler = lib$es6$promise$asap$$setScheduler; | ||
lib$es6$promise$promise$$Promise._setAsap = lib$es6$promise$asap$$setAsap; | ||
lib$es6$promise$promise$$Promise._asap = lib$es6$promise$asap$$asap; | ||
lib$es6$promise$promise$$Promise.prototype = { | ||
constructor: lib$es6$promise$promise$$Promise, | ||
/** | ||
The primary way of interacting with a promise is through its `then` method, | ||
which registers callbacks to receive either a promise's eventual value or the | ||
reason why the promise cannot be fulfilled. | ||
```js | ||
findUser().then(function(user){ | ||
// user is available | ||
}, function(reason){ | ||
// user is unavailable, and you are given the reason why | ||
}); | ||
``` | ||
Chaining | ||
-------- | ||
The return value of `then` is itself a promise. This second, 'downstream' | ||
promise is resolved with the return value of the first promise's fulfillment | ||
or rejection handler, or rejected if the handler throws an exception. | ||
```js | ||
findUser().then(function (user) { | ||
return user.name; | ||
}, function (reason) { | ||
return 'default name'; | ||
}).then(function (userName) { | ||
// If `findUser` fulfilled, `userName` will be the user's name, otherwise it | ||
// will be `'default name'` | ||
}); | ||
findUser().then(function (user) { | ||
throw new Error('Found user, but still unhappy'); | ||
}, function (reason) { | ||
throw new Error('`findUser` rejected and we're unhappy'); | ||
}).then(function (value) { | ||
// never reached | ||
}, function (reason) { | ||
// if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. | ||
// If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. | ||
}); | ||
``` | ||
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. | ||
```js | ||
findUser().then(function (user) { | ||
throw new PedagogicalException('Upstream error'); | ||
}).then(function (value) { | ||
// never reached | ||
}).then(function (value) { | ||
// never reached | ||
}, function (reason) { | ||
// The `PedgagocialException` is propagated all the way down to here | ||
}); | ||
``` | ||
Assimilation | ||
------------ | ||
Sometimes the value you want to propagate to a downstream promise can only be | ||
retrieved asynchronously. This can be achieved by returning a promise in the | ||
fulfillment or rejection handler. The downstream promise will then be pending | ||
until the returned promise is settled. This is called *assimilation*. | ||
```js | ||
findUser().then(function (user) { | ||
return findCommentsByAuthor(user); | ||
}).then(function (comments) { | ||
// The user's comments are now available | ||
}); | ||
``` | ||
If the assimliated promise rejects, then the downstream promise will also reject. | ||
```js | ||
findUser().then(function (user) { | ||
return findCommentsByAuthor(user); | ||
}).then(function (comments) { | ||
// If `findCommentsByAuthor` fulfills, we'll have the value here | ||
}, function (reason) { | ||
// If `findCommentsByAuthor` rejects, we'll have the reason here | ||
}); | ||
``` | ||
Simple Example | ||
-------------- | ||
Synchronous Example | ||
```javascript | ||
var result; | ||
try { | ||
result = findResult(); | ||
// success | ||
} catch(reason) { | ||
// failure | ||
} | ||
``` | ||
Errback Example | ||
```js | ||
findResult(function(result, err){ | ||
if (err) { | ||
// failure | ||
} else { | ||
// success | ||
} | ||
}); | ||
``` | ||
Promise Example; | ||
```javascript | ||
findResult().then(function(result){ | ||
// success | ||
}, function(reason){ | ||
// failure | ||
}); | ||
``` | ||
Advanced Example | ||
-------------- | ||
Synchronous Example | ||
```javascript | ||
var author, books; | ||
try { | ||
author = findAuthor(); | ||
books = findBooksByAuthor(author); | ||
// success | ||
} catch(reason) { | ||
// failure | ||
} | ||
``` | ||
Errback Example | ||
```js | ||
function foundBooks(books) { | ||
} | ||
function failure(reason) { | ||
} | ||
findAuthor(function(author, err){ | ||
if (err) { | ||
failure(err); | ||
// failure | ||
} else { | ||
try { | ||
findBoooksByAuthor(author, function(books, err) { | ||
if (err) { | ||
failure(err); | ||
} else { | ||
try { | ||
foundBooks(books); | ||
} catch(reason) { | ||
failure(reason); | ||
} | ||
} | ||
}); | ||
} catch(error) { | ||
failure(err); | ||
} | ||
// success | ||
} | ||
}); | ||
``` | ||
Promise Example; | ||
```javascript | ||
findAuthor(). | ||
then(findBooksByAuthor). | ||
then(function(books){ | ||
// found books | ||
}).catch(function(reason){ | ||
// something went wrong | ||
}); | ||
``` | ||
@method then | ||
@param {Function} onFulfilled | ||
@param {Function} onRejected | ||
Useful for tooling. | ||
@return {Promise} | ||
*/ | ||
then: lib$es6$promise$then$$default, | ||
/** | ||
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same | ||
as the catch block of a try/catch statement. | ||
```js | ||
function findAuthor(){ | ||
throw new Error('couldn't find that author'); | ||
} | ||
// synchronous | ||
try { | ||
findAuthor(); | ||
} catch(reason) { | ||
// something went wrong | ||
} | ||
// async with promises | ||
findAuthor().catch(function(reason){ | ||
// something went wrong | ||
}); | ||
``` | ||
@method catch | ||
@param {Function} onRejection | ||
Useful for tooling. | ||
@return {Promise} | ||
*/ | ||
'catch': function(onRejection) { | ||
return this.then(null, onRejection); | ||
} | ||
}; | ||
var lib$es6$promise$enumerator$$default = lib$es6$promise$enumerator$$Enumerator; | ||
function lib$es6$promise$enumerator$$Enumerator(Constructor, input) { | ||
this._instanceConstructor = Constructor; | ||
this.promise = new Constructor(lib$es6$promise$$internal$$noop); | ||
if (!this.promise[lib$es6$promise$$internal$$PROMISE_ID]) { | ||
lib$es6$promise$$internal$$makePromise(this.promise); | ||
} | ||
if (lib$es6$promise$utils$$isArray(input)) { | ||
this._input = input; | ||
this.length = input.length; | ||
this._remaining = input.length; | ||
this._result = new Array(this.length); | ||
if (this.length === 0) { | ||
lib$es6$promise$$internal$$fulfill(this.promise, this._result); | ||
} else { | ||
this.length = this.length || 0; | ||
this._enumerate(); | ||
if (this._remaining === 0) { | ||
lib$es6$promise$$internal$$fulfill(this.promise, this._result); | ||
} | ||
} | ||
} else { | ||
lib$es6$promise$$internal$$reject(this.promise, lib$es6$promise$enumerator$$validationError()); | ||
} | ||
} | ||
function lib$es6$promise$enumerator$$validationError() { | ||
return new Error('Array Methods must be provided an Array'); | ||
} | ||
lib$es6$promise$enumerator$$Enumerator.prototype._enumerate = function() { | ||
var length = this.length; | ||
var input = this._input; | ||
for (var i = 0; this._state === lib$es6$promise$$internal$$PENDING && i < length; i++) { | ||
this._eachEntry(input[i], i); | ||
} | ||
}; | ||
lib$es6$promise$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) { | ||
var c = this._instanceConstructor; | ||
var resolve = c.resolve; | ||
if (resolve === lib$es6$promise$promise$resolve$$default) { | ||
var then = lib$es6$promise$$internal$$getThen(entry); | ||
if (then === lib$es6$promise$then$$default && | ||
entry._state !== lib$es6$promise$$internal$$PENDING) { | ||
this._settledAt(entry._state, i, entry._result); | ||
} else if (typeof then !== 'function') { | ||
this._remaining--; | ||
this._result[i] = entry; | ||
} else if (c === lib$es6$promise$promise$$default) { | ||
var promise = new c(lib$es6$promise$$internal$$noop); | ||
lib$es6$promise$$internal$$handleMaybeThenable(promise, entry, then); | ||
this._willSettleAt(promise, i); | ||
} else { | ||
this._willSettleAt(new c(function(resolve) { resolve(entry); }), i); | ||
} | ||
} else { | ||
this._willSettleAt(resolve(entry), i); | ||
} | ||
}; | ||
lib$es6$promise$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) { | ||
var promise = this.promise; | ||
if (promise._state === lib$es6$promise$$internal$$PENDING) { | ||
this._remaining--; | ||
if (state === lib$es6$promise$$internal$$REJECTED) { | ||
lib$es6$promise$$internal$$reject(promise, value); | ||
} else { | ||
this._result[i] = value; | ||
} | ||
} | ||
if (this._remaining === 0) { | ||
lib$es6$promise$$internal$$fulfill(promise, this._result); | ||
} | ||
}; | ||
lib$es6$promise$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) { | ||
var enumerator = this; | ||
lib$es6$promise$$internal$$subscribe(promise, undefined, function(value) { | ||
enumerator._settledAt(lib$es6$promise$$internal$$FULFILLED, i, value); | ||
}, function(reason) { | ||
enumerator._settledAt(lib$es6$promise$$internal$$REJECTED, i, reason); | ||
}); | ||
}; | ||
function lib$es6$promise$polyfill$$polyfill() { | ||
var local; | ||
if (typeof global !== 'undefined') { | ||
local = global; | ||
} else if (typeof self !== 'undefined') { | ||
local = self; | ||
} else { | ||
try { | ||
local = Function('return this')(); | ||
} catch (e) { | ||
throw new Error('polyfill failed because global object is unavailable in this environment'); | ||
} | ||
} | ||
var P = local.Promise; | ||
if (P && Object.prototype.toString.call(P.resolve()) === '[object Promise]' && !P.cast) { | ||
return; | ||
} | ||
local.Promise = lib$es6$promise$promise$$default; | ||
} | ||
var lib$es6$promise$polyfill$$default = lib$es6$promise$polyfill$$polyfill; | ||
var lib$es6$promise$umd$$ES6Promise = { | ||
'Promise': lib$es6$promise$promise$$default, | ||
'polyfill': lib$es6$promise$polyfill$$default | ||
}; | ||
/* global define:true module:true window: true */ | ||
if (true) { | ||
!(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return lib$es6$promise$umd$$ES6Promise; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); | ||
} else if (typeof module !== 'undefined' && module['exports']) { | ||
module['exports'] = lib$es6$promise$umd$$ES6Promise; | ||
} else if (typeof this !== 'undefined') { | ||
this['ES6Promise'] = lib$es6$promise$umd$$ES6Promise; | ||
} | ||
lib$es6$promise$polyfill$$default(); | ||
}).call(this); | ||
/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4), __webpack_require__(5))) | ||
/***/ }, | ||
/* 4 */ | ||
/***/ function(module, exports) { | ||
// shim for using process in browser | ||
var process = module.exports = {}; | ||
// cached from whatever global is present so that test runners that stub it | ||
// don't break things. But we need to wrap it in a try catch in case it is | ||
// wrapped in strict mode code which doesn't define any globals. It's inside a | ||
// function because try/catches deoptimize in certain engines. | ||
var cachedSetTimeout; | ||
var cachedClearTimeout; | ||
function defaultSetTimout() { | ||
throw new Error('setTimeout has not been defined'); | ||
} | ||
function defaultClearTimeout () { | ||
throw new Error('clearTimeout has not been defined'); | ||
} | ||
(function () { | ||
try { | ||
if (typeof setTimeout === 'function') { | ||
cachedSetTimeout = setTimeout; | ||
} else { | ||
cachedSetTimeout = defaultSetTimout; | ||
} | ||
} catch (e) { | ||
cachedSetTimeout = defaultSetTimout; | ||
} | ||
try { | ||
if (typeof clearTimeout === 'function') { | ||
cachedClearTimeout = clearTimeout; | ||
} else { | ||
cachedClearTimeout = defaultClearTimeout; | ||
} | ||
} catch (e) { | ||
cachedClearTimeout = defaultClearTimeout; | ||
} | ||
} ()) | ||
function runTimeout(fun) { | ||
if (cachedSetTimeout === setTimeout) { | ||
//normal enviroments in sane situations | ||
return setTimeout(fun, 0); | ||
} | ||
// if setTimeout wasn't available but was latter defined | ||
if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { | ||
cachedSetTimeout = setTimeout; | ||
return setTimeout(fun, 0); | ||
} | ||
try { | ||
// when when somebody has screwed with setTimeout but no I.E. maddness | ||
return cachedSetTimeout(fun, 0); | ||
} catch(e){ | ||
try { | ||
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | ||
return cachedSetTimeout.call(null, fun, 0); | ||
} catch(e){ | ||
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error | ||
return cachedSetTimeout.call(this, fun, 0); | ||
} | ||
} | ||
} | ||
function runClearTimeout(marker) { | ||
if (cachedClearTimeout === clearTimeout) { | ||
//normal enviroments in sane situations | ||
return clearTimeout(marker); | ||
} | ||
// if clearTimeout wasn't available but was latter defined | ||
if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { | ||
cachedClearTimeout = clearTimeout; | ||
return clearTimeout(marker); | ||
} | ||
try { | ||
// when when somebody has screwed with setTimeout but no I.E. maddness | ||
return cachedClearTimeout(marker); | ||
} catch (e){ | ||
try { | ||
// When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally | ||
return cachedClearTimeout.call(null, marker); | ||
} catch (e){ | ||
// same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. | ||
// Some versions of I.E. have different rules for clearTimeout vs setTimeout | ||
return cachedClearTimeout.call(this, marker); | ||
} | ||
} | ||
} | ||
var queue = []; | ||
var draining = false; | ||
var currentQueue; | ||
var queueIndex = -1; | ||
function cleanUpNextTick() { | ||
if (!draining || !currentQueue) { | ||
return; | ||
} | ||
draining = false; | ||
if (currentQueue.length) { | ||
queue = currentQueue.concat(queue); | ||
} else { | ||
queueIndex = -1; | ||
} | ||
if (queue.length) { | ||
drainQueue(); | ||
} | ||
} | ||
function drainQueue() { | ||
if (draining) { | ||
return; | ||
} | ||
var timeout = runTimeout(cleanUpNextTick); | ||
draining = true; | ||
var len = queue.length; | ||
while(len) { | ||
currentQueue = queue; | ||
queue = []; | ||
while (++queueIndex < len) { | ||
if (currentQueue) { | ||
currentQueue[queueIndex].run(); | ||
} | ||
} | ||
queueIndex = -1; | ||
len = queue.length; | ||
} | ||
currentQueue = null; | ||
draining = false; | ||
runClearTimeout(timeout); | ||
} | ||
process.nextTick = function (fun) { | ||
var args = new Array(arguments.length - 1); | ||
if (arguments.length > 1) { | ||
for (var i = 1; i < arguments.length; i++) { | ||
args[i - 1] = arguments[i]; | ||
} | ||
} | ||
queue.push(new Item(fun, args)); | ||
if (queue.length === 1 && !draining) { | ||
runTimeout(drainQueue); | ||
} | ||
}; | ||
// v8 likes predictible objects | ||
function Item(fun, array) { | ||
this.fun = fun; | ||
this.array = array; | ||
} | ||
Item.prototype.run = function () { | ||
this.fun.apply(null, this.array); | ||
}; | ||
process.title = 'browser'; | ||
process.browser = true; | ||
process.env = {}; | ||
process.argv = []; | ||
process.version = ''; // empty string to avoid regexp issues | ||
process.versions = {}; | ||
function noop() {} | ||
process.on = noop; | ||
process.addListener = noop; | ||
process.once = noop; | ||
process.off = noop; | ||
process.removeListener = noop; | ||
process.removeAllListeners = noop; | ||
process.emit = noop; | ||
process.binding = function (name) { | ||
throw new Error('process.binding is not supported'); | ||
}; | ||
process.cwd = function () { return '/' }; | ||
process.chdir = function (dir) { | ||
throw new Error('process.chdir is not supported'); | ||
}; | ||
process.umask = function() { return 0; }; | ||
/***/ }, | ||
/* 5 */ | ||
/***/ function(module, exports) { | ||
var g; | ||
// This works in non-strict mode | ||
g = (function() { return this; })(); | ||
try { | ||
// This works if eval is allowed (see CSP) | ||
g = g || Function("return this")() || (1,eval)("this"); | ||
} catch(e) { | ||
// This works if the window reference is available | ||
if(typeof window === "object") | ||
g = window; | ||
} | ||
// g can still be undefined, but nothing to do about it... | ||
// We return undefined, instead of nothing here, so it's | ||
// easier to handle this case. if(!global) { ...} | ||
module.exports = g; | ||
/***/ }, | ||
/* 6 */ | ||
/***/ function(module, exports) { | ||
/* (ignored) */ | ||
/***/ }, | ||
/* 7 */ | ||
/***/ function(module, exports, __webpack_require__) { | ||
"use strict"; | ||
'use strict'; | ||
var Store = __webpack_require__(2); | ||
var Collection = __webpack_require__(0); | ||
__webpack_require__(3).polyfill(); | ||
module.exports = Store; | ||
module.exports.Collection = Collection; | ||
/***/ } | ||
/******/ ]) | ||
}); | ||
; | ||
module.exports = _store2.default; | ||
module.exports.Collection = _collection2.default; |
{ | ||
"name": "delux", | ||
"version": "1.4.1", | ||
"version": "1.5.0", | ||
"description": "Beautiful, light and simple state manager inspired by Redux", | ||
@@ -18,5 +18,5 @@ "main": "bin/index.js", | ||
"scripts": { | ||
"start": "webpack --progress --watch", | ||
"build": "webpack --progress", | ||
"test": "jest" | ||
"start": "npm run build -- --watch", | ||
"build": "babel src --out-dir bin", | ||
"test": "jest $2" | ||
}, | ||
@@ -30,11 +30,12 @@ "author": "Iddan Aharonson <mail@iddan.co> (http://iddan.co)", | ||
"dependencies": { | ||
"es6-promise": "3.2.1" | ||
"es6-promise": "3.2.1", | ||
"flux-standard-action": "^0.6.1" | ||
}, | ||
"devDependencies": { | ||
"babel-core": "^6.14.0", | ||
"babel-loader": "^6.2.5", | ||
"babel-cli": "^6.18.0", | ||
"babel-preset-es2015": "^6.14.0", | ||
"babel-preset-stage-0": "^6.5.0", | ||
"jest": "^16.0.0", | ||
"webpack": "^2.1.0-beta.25" | ||
"chai": "^3.5.0", | ||
"chokidar": "^1.6.1", | ||
"jest": "^16.0.0" | ||
}, | ||
@@ -41,0 +42,0 @@ "babel": { |
@@ -1,9 +0,24 @@ | ||
const {forceArray} = require('./utils'); | ||
import {forceArray} from './utils'; | ||
module.exports = class Collection { | ||
reducers = {}; | ||
observers = []; | ||
export default class Collection { | ||
reducers = {}; | ||
subscribers = []; | ||
constructor (init) { | ||
this.state = init; | ||
let set = ::this.set; | ||
Object.defineProperty(this, 'state', { | ||
get () { | ||
return Object.freeze(Object.assign({set}, init)); | ||
}, | ||
set (state) { | ||
init = state; | ||
return this.state; | ||
}, | ||
}); | ||
} | ||
/** | ||
* Adds a reducer for specific action types. | ||
* @param {array | string} types - action types to apply reducer on. | ||
* @param {function} reducer - a function which mutates the collection state by returning it's new state. | ||
* @returns {Collection} this | ||
*/ | ||
on (types, reducer) { | ||
@@ -13,3 +28,12 @@ for (let type of forceArray(types)) { | ||
} | ||
return this; | ||
} | ||
}; | ||
/** | ||
* Mutates the current state with new data. | ||
* @param {object} data - the new data to assign to the state. | ||
* @returns {object} state - the new state. | ||
*/ | ||
set (data) { | ||
return Object.assign(new this.state.constructor(), this.state, data); | ||
} | ||
} |
@@ -1,3 +0,3 @@ | ||
const Store = require('./store'); | ||
const Collection = require('./collection'); | ||
import Store from './store'; | ||
import Collection from './collection'; | ||
require('es6-promise').polyfill(); | ||
@@ -4,0 +4,0 @@ |
118
src/store.js
@@ -1,3 +0,5 @@ | ||
const Collection = require('./collection'); | ||
const {forceArray, getByKeys} = require('./utils'); | ||
import {isFSA} from 'flux-standard-action'; | ||
import Collection from './collection'; | ||
import State from './state'; | ||
import {forceArray} from './utils'; | ||
@@ -7,41 +9,67 @@ /** | ||
*/ | ||
module.exports = class Store { | ||
export default class Store { | ||
middlewares = []; | ||
queued = Promise.resolve(); | ||
queued = Promise.resolve(); | ||
/** | ||
* object with mutations of the collections' states | ||
*/ | ||
state = { | ||
get (collections) { | ||
return getByKeys(this, collections); | ||
} | ||
}; | ||
get state () { | ||
return new State(this); | ||
} | ||
/** | ||
* Array of the collection names. | ||
*/ | ||
get collectionNames () { | ||
return Object.keys(this).filter(key => this[key] instanceof Collection); | ||
} | ||
/** | ||
* Array of the collection objects. | ||
*/ | ||
get collections () { | ||
return Object.values(this).filter(value => value instanceof Collection); | ||
} | ||
/** | ||
* Array of the collections entries. | ||
*/ | ||
get collectionEntries () { | ||
return Object.entries(this).filter((entry) => entry[1] instanceof Collection); | ||
} | ||
/** | ||
* Adds an observer for mutations in the store's collections | ||
* @param {function|string|object} middleware|type|{type:middleware} | ||
* @param {function} middleware | ||
* @param {function} middleware - function to execute each time an action dispatches before it reaches the reducers. | ||
* @returns {Store} this | ||
*/ | ||
use (middleware) { | ||
const [arg0, arg1] = arguments; | ||
({ | ||
function: () => this.middlewares.push(middleware), | ||
string: () => this.middlewares.push((action) => { | ||
this.middlewares.push({ | ||
// store.use(function) | ||
function: middleware, | ||
// store.use(string, function) | ||
string (action) { | ||
if (action.type === arg0) { | ||
arg1(action); | ||
return arg1(action); | ||
} | ||
}), | ||
object: () => this.middlewares.push((action) => { | ||
}, | ||
// store.use(object) | ||
object (action) { | ||
if (arg0[action.type]) { | ||
arg0[action.type](action); | ||
return arg0[action.type](action); | ||
} | ||
}) | ||
})[typeof arg0](); | ||
} | ||
}[typeof arg0]); | ||
return this; | ||
} | ||
/** | ||
* Dispatches a Flux Standard Action on the state. | ||
* @param {object} action | ||
* @param {object} action - FSA | ||
* @returns {Promise} - resolves to the mutated store state. | ||
*/ | ||
dispatch (action) { | ||
for (let middleware of this.middlewares) { | ||
const {middlewares, collectionEntries} = this; | ||
if (!isFSA(action)) { | ||
throw new TypeError('Dispatched action must follow the Flux Standard Action scheme. https://github.com/acdlite/flux-standard-action'); | ||
} | ||
// wait for the middlewares to mutate the actions | ||
for (let middleware of middlewares) { | ||
this.queue(() => Promise.resolve(middleware(action))); | ||
@@ -51,10 +79,7 @@ } | ||
Promise.all( | ||
Object.keys(this) | ||
.filter(name => | ||
this[name] instanceof Collection && | ||
this[name].reducers[action.type] | ||
) | ||
.map(name => { | ||
let collection = this[name]; | ||
let {state, reducers} = collection; | ||
collectionEntries.map(([name, collection]) => { | ||
let {state, reducers, subscribers} = collection; | ||
if (!reducers[action.type]) { | ||
return Promise.resolve(); | ||
} | ||
return Promise.resolve(reducers[action.type](state, action)) | ||
@@ -64,6 +89,4 @@ .then((newCollectionState = state) => { | ||
collection.state = newCollectionState; | ||
for (let observer of collection.observers) { | ||
observer(Object.assign(this.state, { | ||
[name]: newCollectionState | ||
}), action, name); | ||
for (let subscriber of subscribers) { | ||
subscriber(this.state, action, name); | ||
} | ||
@@ -76,17 +99,32 @@ } | ||
.then(() => this.state) | ||
.catch(err => { | ||
throw err; | ||
}) | ||
); | ||
} | ||
/** | ||
* Adds an observer for mutations in the store's collections. | ||
* @param {string | array} collectionNames - collections to observe | ||
* @param {function} observer | ||
* Subscribes for mutations in the store's collections. | ||
* @param {string | array} collectionNames - collections to subscribe to. | ||
* @param {function} subscriber - function to execute each time the collection state mutates | ||
* @returns {undefined} | ||
*/ | ||
observe (collectionNames, observer) { | ||
subscribe (collectionNames, subscriber) { | ||
for (let name of forceArray(collectionNames)) { | ||
this[name].observers.push(observer); | ||
this[name].subscribers.push(subscriber); | ||
} | ||
} | ||
/** | ||
* Unsubscribes the subscriber function provided for the collections. | ||
* @param {string | array} collectionNames - collections to unsubscribe to. | ||
* @param {function} subscriber - a function that was assigned for those collections mutations. | ||
* @returns {undefined} | ||
*/ | ||
unsubscribe (collectionNames, subscriber) { | ||
for (let name of forceArray(collectionNames)) { | ||
this[name].subscribers = this[name].subscribers.filter(func => func === subscriber); | ||
} | ||
} | ||
/** | ||
* Adds a function to the store's execute queue | ||
* @param {function} action | ||
* @param {function} action - function to apply | ||
* @returns {Promise} - resolves after the action resolves. | ||
@@ -97,2 +135,2 @@ */ | ||
} | ||
}; | ||
} |
@@ -1,11 +0,8 @@ | ||
let forceArray = array => Array.isArray(array) ? array : [array]; | ||
export let forceArray = array => Array.isArray(array) ? array : [array]; | ||
function getByKeys (object, keys) { | ||
let relevant = {}; | ||
for (let key of forceArray(keys)) { | ||
relevant[key] = object[key]; | ||
} | ||
return relevant; | ||
} | ||
module.exports = {forceArray, getByKeys}; | ||
export let getByKeys = (object, keys) => | ||
forceArray(keys) | ||
.reduce( | ||
(relevant, key) => Object.assign(relevant, {[key]: object[key]}), | ||
{} | ||
); |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 2 instances in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
150934
23
0
2
2
763
+ Addedflux-standard-action@^0.6.1
+ Addedflux-standard-action@0.6.1(transitive)
+ Addedlodash._basefor@3.0.3(transitive)
+ Addedlodash.isarguments@3.1.0(transitive)
+ Addedlodash.isarray@3.0.4(transitive)
+ Addedlodash.isplainobject@3.2.0(transitive)
+ Addedlodash.keysin@3.0.8(transitive)