diff --git a/.babelrc b/.babelrc deleted file mode 100644 index a62784ac7..000000000 --- a/.babelrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "env": { - "cjs": { - "presets": [["es2015", { "loose": true }], "react", "stage-2"], - "plugins": ["annotate-pure-calls"] - }, - "es": { - "presets": [["es2015", { "loose": true, "modules": false }], "react", "stage-2"], - "plugins": ["annotate-pure-calls"] - } - }, -} diff --git a/.babelrc.js b/.babelrc.js new file mode 100644 index 000000000..e2a343053 --- /dev/null +++ b/.babelrc.js @@ -0,0 +1,15 @@ +module.exports = { + presets: [ + [ + '@babel/env', + { + loose: true, + modules: process.env.BABEL_ENV === 'cjs' ? 'commonjs' : false, + forceAllTransforms: process.env.NODE_ENV === 'production', + }, + ], + '@babel/react', + '@babel/stage-2', + ], + plugins: ['annotate-pure-calls'], +} diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 000000000..324cebe7e --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +Firefox ESR +ie >= 10 diff --git a/dist/redux-saga.js b/dist/redux-saga.js index 173db90d3..2a800fa29 100644 --- a/dist/redux-saga.js +++ b/dist/redux-saga.js @@ -4,112 +4,124 @@ (factory((global.ReduxSaga = {}))); }(this, (function (exports) { '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 && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - - - - - - - - - -var defineEnumerableProperties = function (obj, descs) { - for (var key in descs) { - var desc = descs[key]; - desc.configurable = desc.enumerable = true; - if ("value" in desc) desc.writable = true; - Object.defineProperty(obj, key, desc); +function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; } - return obj; -}; - - - - + return _typeof(obj); +} -var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } } } - } - - return target; -}; - - - - - - - - + return target; + }; + return _extends.apply(this, arguments); +} +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } -var objectWithoutProperties = function (obj, keys) { - var target = {}; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (var i in obj) { - if (keys.indexOf(i) >= 0) continue; - if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; - target[i] = obj[i]; + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } } return target; -}; +} var sym = function sym(id) { - return '@@redux-saga/' + id; + id = "@@redux-saga/" + id; + return typeof Symbol === 'function' ? Symbol(id) : id; }; -var TASK = /*#__PURE__*/sym('TASK'); -var HELPER = /*#__PURE__*/sym('HELPER'); -var MATCH = /*#__PURE__*/sym('MATCH'); -var CANCEL = /*#__PURE__*/sym('CANCEL_PROMISE'); -var SAGA_ACTION = /*#__PURE__*/sym('SAGA_ACTION'); -var SELF_CANCELLATION = /*#__PURE__*/sym('SELF_CANCELLATION'); +var CANCEL = +/*#__PURE__*/ +sym('CANCEL_PROMISE'); +var CHANNEL_END = +/*#__PURE__*/ +sym('CHANNEL_END'); +var CHANNEL_END_TYPE = +/*#__PURE__*/ +sym('CHANNEL_END'); +var IO = +/*#__PURE__*/ +sym('IO'); +var MATCH = +/*#__PURE__*/ +sym('MATCH'); +var MULTICAST = +/*#__PURE__*/ +sym('MULTICAST'); +var SAGA_ACTION = +/*#__PURE__*/ +sym('SAGA_ACTION'); +var SELF_CANCELLATION = +/*#__PURE__*/ +sym('SELF_CANCELLATION'); +var TASK = +/*#__PURE__*/ +sym('TASK'); +var TASK_CANCEL = +/*#__PURE__*/ +sym('TASK_CANCEL'); + var konst = function konst(v) { return function () { return v; }; }; -var kTrue = /*#__PURE__*/konst(true); -var kFalse = /*#__PURE__*/konst(false); +var kTrue = +/*#__PURE__*/ +konst(true); +var kFalse = +/*#__PURE__*/ +konst(false); var noop = function noop() {}; -var ident = function ident(v) { +var identity = function identity(v) { return v; }; - function check(value, predicate, error) { if (!predicate(value)) { - // TODO: should be removed maybe? - log('error', 'uncaught at check', error); throw new Error(error); } } - var hasOwnProperty = Object.prototype.hasOwnProperty; function hasOwn(object, property) { return is.notUndef(object) && hasOwnProperty.call(object, property); } - var is = { undef: function undef(v) { return v === null || v === undefined; @@ -128,7 +140,7 @@ var is = { }, array: Array.isArray, object: function object(obj) { - return obj && !is.array(obj) && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object'; + return obj && !is.array(obj) && _typeof(obj) === 'object'; }, promise: function promise(p) { return p && is.func(p.then); @@ -149,19 +161,21 @@ var is = { return buf && is.func(buf.isEmpty) && is.func(buf.take) && is.func(buf.put); }, pattern: function pattern(pat) { - return pat && (is.string(pat) || (typeof pat === 'undefined' ? 'undefined' : _typeof(pat)) === 'symbol' || is.func(pat) || is.array(pat)); + return pat && (is.string(pat) || is.symbol(pat) || is.func(pat) || is.array(pat)); }, channel: function channel(ch) { return ch && is.func(ch.take) && is.func(ch.close); }, - helper: function helper(it) { - return it && it[HELPER]; - }, stringableFunc: function stringableFunc(f) { return is.func(f) && hasOwn(f, 'toString'); + }, + symbol: function symbol(sym) { + return _typeof(sym) === 'symbol'; + }, + multicast: function multicast(ch) { + return is.channel(ch) && ch[MULTICAST]; } }; - var object = { assign: function assign(target, source) { for (var i in source) { @@ -171,28 +185,41 @@ var object = { } } }; - function remove(array, item) { var index = array.indexOf(item); + if (index >= 0) { array.splice(index, 1); } } - var array = { from: function from(obj) { var arr = Array(obj.length); + for (var i in obj) { if (hasOwn(obj, i)) { arr[i] = obj[i]; } } + return arr; } }; +function once(fn) { + var called = false; + return function () { + if (called) { + return; + } -function deferred() { - var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + called = true; + fn(); + }; +} +function deferred(props) { + if (props === void 0) { + props = {}; + } var def = _extends({}, props); var promise = new Promise(function (resolve, reject) { @@ -202,19 +229,21 @@ function deferred() { def.promise = promise; return def; } - -function arrayOfDeffered(length) { +function arrayOfDeferred(length) { var arr = []; + for (var i = 0; i < length; i++) { arr.push(deferred()); } + return arr; } +function delay(ms, val) { + if (val === void 0) { + val = true; + } -function delay(ms) { - var val = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - - var timeoutId = void 0; + var timeoutId; var promise = new Promise(function (resolve) { timeoutId = setTimeout(function () { return resolve(val); @@ -227,13 +256,12 @@ function delay(ms) { return promise; } - function createMockTask() { var _ref; var running = true; - var _result = void 0, - _error = void 0; + + var _result, _error; return _ref = {}, _ref[TASK] = true, _ref.isRunning = function isRunning() { return running; @@ -249,97 +277,103 @@ function createMockTask() { return _error = e; }, _ref; } - -function autoInc() { - var seed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; +function autoInc(seed) { + if (seed === void 0) { + seed = 0; + } return function () { return ++seed; }; } - -var uid = /*#__PURE__*/autoInc(); +var uid = +/*#__PURE__*/ +autoInc(); var kThrow = function kThrow(err) { throw err; }; + var kReturn = function kReturn(value) { - return { value: value, done: true }; + return { + value: value, + done: true + }; }; -function makeIterator(next) { - var thro = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : kThrow; - var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var isHelper = arguments[3]; - var iterator = { name: name, next: next, throw: thro, return: kReturn }; +function makeIterator(next, thro, name) { + if (thro === void 0) { + thro = kThrow; + } - if (isHelper) { - iterator[HELPER] = true; + if (name === void 0) { + name = 'iterator'; } + + var iterator = { + name: name, + next: next, + throw: thro, + return: kReturn + }; + if (typeof Symbol !== 'undefined') { iterator[Symbol.iterator] = function () { return iterator; }; } + return iterator; } - /** Print error in a useful way whether in a browser environment (with expandable error stack traces), or in a node.js environment (text-only log output) **/ -function log(level, message) { - var error = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + +function log(level, message, error) { + if (error === void 0) { + error = ''; + } /*eslint-disable no-console*/ if (typeof window === 'undefined') { - console.log('redux-saga ' + level + ': ' + message + '\n' + (error && error.stack || error)); + console.log("redux-saga " + level + ": " + message + "\n" + (error && error.stack || error)); } else { console[level](message, error); } } -function deprecate(fn, deprecationWarning) { - return function () { - log('warn', deprecationWarning); - return fn.apply(undefined, arguments); - }; -} - -var updateIncentive = function updateIncentive(deprecated, preferred) { - return deprecated + ' has been deprecated in favor of ' + preferred + ', please update your code'; -}; var internalErr = function internalErr(err) { - return new Error('\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project\'s github repo.\n Error: ' + err + '\n'); + return new Error("\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: " + err + "\n"); }; - var createSetContextWarning = function createSetContextWarning(ctx, props) { - return (ctx ? ctx + '.' : '') + 'setContext(props): argument ' + props + ' is not a plain object'; + return (ctx ? ctx + '.' : '') + "setContext(props): argument " + props + " is not a plain object"; }; - var wrapSagaDispatch = function wrapSagaDispatch(dispatch) { return function (action) { - return dispatch(Object.defineProperty(action, SAGA_ACTION, { value: true })); + return dispatch(Object.defineProperty(action, SAGA_ACTION, { + value: true + })); }; }; var cloneableGenerator = function cloneableGenerator(generatorFunc) { return function () { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var history = []; - var gen = generatorFunc.apply(undefined, args); + var gen = generatorFunc.apply(void 0, args); return { next: function next(arg) { history.push(arg); return gen.next(arg); }, clone: function clone() { - var clonedGen = cloneableGenerator(generatorFunc).apply(undefined, args); + var clonedGen = cloneableGenerator(generatorFunc).apply(void 0, args); history.forEach(function (arg) { return clonedGen.next(arg); }); @@ -356,17 +390,20 @@ var cloneableGenerator = function cloneableGenerator(generatorFunc) { }; var BUFFER_OVERFLOW = "Channel's Buffer overflow!"; - var ON_OVERFLOW_THROW = 1; var ON_OVERFLOW_DROP = 2; var ON_OVERFLOW_SLIDE = 3; var ON_OVERFLOW_EXPAND = 4; +var zeroBuffer = { + isEmpty: kTrue, + put: noop, + take: noop +}; -var zeroBuffer = { isEmpty: kTrue, put: noop, take: noop }; - -function ringBuffer() { - var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10; - var overflowAction = arguments[1]; +function ringBuffer(limit, overflowAction) { + if (limit === void 0) { + limit = 10; + } var arr = new Array(limit); var length = 0; @@ -391,9 +428,11 @@ function ringBuffer() { var flush = function flush() { var items = []; + while (length) { items.push(take()); } + return items; }; @@ -405,31 +444,31 @@ function ringBuffer() { if (length < limit) { push(it); } else { - var doubledLimit = void 0; + var doubledLimit; + switch (overflowAction) { case ON_OVERFLOW_THROW: throw new Error(BUFFER_OVERFLOW); + case ON_OVERFLOW_SLIDE: arr[pushIndex] = it; pushIndex = (pushIndex + 1) % limit; popIndex = pushIndex; break; + case ON_OVERFLOW_EXPAND: doubledLimit = 2 * limit; - arr = flush(); - length = arr.length; pushIndex = arr.length; popIndex = 0; - arr.length = doubledLimit; limit = doubledLimit; - push(it); break; - default: - // DROP + + default: // DROP + } } }, @@ -438,23 +477,31 @@ function ringBuffer() { }; } -var buffers = { - none: function none() { - return zeroBuffer; - }, - fixed: function fixed(limit) { - return ringBuffer(limit, ON_OVERFLOW_THROW); - }, - dropping: function dropping(limit) { - return ringBuffer(limit, ON_OVERFLOW_DROP); - }, - sliding: function sliding(limit) { - return ringBuffer(limit, ON_OVERFLOW_SLIDE); - }, - expanding: function expanding(initialSize) { - return ringBuffer(initialSize, ON_OVERFLOW_EXPAND); - } +var none = function none() { + return zeroBuffer; +}; +var fixed = function fixed(limit) { + return ringBuffer(limit, ON_OVERFLOW_THROW); +}; +var dropping = function dropping(limit) { + return ringBuffer(limit, ON_OVERFLOW_DROP); +}; +var sliding = function sliding(limit) { + return ringBuffer(limit, ON_OVERFLOW_SLIDE); }; +var expanding = function expanding(initialSize) { + return ringBuffer(initialSize, ON_OVERFLOW_EXPAND); +}; + + + +var buffers = Object.freeze({ + none: none, + fixed: fixed, + dropping: dropping, + sliding: sliding, + expanding: expanding +}); var queue = []; /** @@ -464,13 +511,14 @@ var queue = []; - Decrementing releases a lock. Zero locks puts the scheduler in a `released` state. This triggers flushing the queued tasks. **/ -var semaphore = 0; +var semaphore = 0; /** Executes a task 'atomically'. Tasks scheduled during this execution will be queued and flushed after this task has finished (assuming the scheduler endup in a released state). **/ + function exec(task) { try { suspend(); @@ -479,10 +527,11 @@ function exec(task) { release(); } } - /** Executes or queues a task depending on the state of the scheduler (`suspended` or `released`) **/ + + function asap(task) { queue.push(task); @@ -491,59 +540,96 @@ function asap(task) { flush(); } } - /** Puts the scheduler in a `suspended` state. Scheduled tasks will be queued until the scheduler is released. **/ + function suspend() { semaphore++; } - /** Puts the scheduler in a `released` state. **/ + function release() { semaphore--; } - /** Releases the current lock. Executes all queued tasks if the scheduler is in the released state. **/ + + function flush() { release(); + var task; - var task = void 0; while (!semaphore && (task = queue.shift()) !== undefined) { exec(task); } } -var CHANNEL_END_TYPE = '@@redux-saga/CHANNEL_END'; -var END = { type: CHANNEL_END_TYPE }; -var isEnd = function isEnd(a) { - return a && a.type === CHANNEL_END_TYPE; +var array$1 = function array$$1(patterns) { + return function (input) { + return patterns.some(function (p) { + return matcher(p)(input); + }); + }; +}; +var predicate = function predicate(_predicate) { + return function (input) { + return _predicate(input); + }; +}; +var string = function string(pattern) { + return function (input) { + return input.type === String(pattern); + }; +}; +var symbol = function symbol(pattern) { + return function (input) { + return input.type === pattern; + }; +}; +var wildcard = function wildcard() { + return kTrue; }; +function matcher(pattern) { + // prettier-ignore + var matcherCreator = pattern === '*' ? wildcard : is.string(pattern) ? string : is.array(pattern) ? array$1 : is.stringableFunc(pattern) ? string : is.func(pattern) ? predicate : is.symbol(pattern) ? symbol : null; -var INVALID_BUFFER = 'invalid buffer passed to channel factory function'; -var UNDEFINED_INPUT_ERROR = 'Saga was provided with an undefined action'; + if (matcherCreator === null) { + throw new Error("invalid pattern: " + pattern); + } -{ - UNDEFINED_INPUT_ERROR += '\nHints:\n - check that your Action Creator returns a non-undefined value\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners\n '; + return matcherCreator(pattern); } -function channel() { - var buffer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : buffers.expanding(); +var END = { + type: CHANNEL_END_TYPE +}; +var isEnd = function isEnd(a) { + return a && a.type === CHANNEL_END_TYPE; +}; +var INVALID_BUFFER = 'invalid buffer passed to channel factory function'; +var UNDEFINED_INPUT_ERROR = "Saga or channel was provided with an undefined action\nHints:\n - check that your Action Creator returns a non-undefined value\n - if the Saga was started using runSaga, check that your subscribe source provides the action to its listeners"; +function channel(buffer) { + if (buffer === void 0) { + buffer = expanding(); + } var closed = false; var takers = []; - check(buffer, is.buffer, INVALID_BUFFER); + { + check(buffer, is.buffer, INVALID_BUFFER); + } function checkForbiddenStates() { if (closed && takers.length) { throw internalErr('Cannot have a closed channel with pending takers'); } + if (takers.length && !buffer.isEmpty()) { throw internalErr('Cannot have pending takers with non empty buffer'); } @@ -551,25 +637,30 @@ function channel() { function put(input) { checkForbiddenStates(); - check(input, is.notUndef, UNDEFINED_INPUT_ERROR); + + { + check(input, is.notUndef, UNDEFINED_INPUT_ERROR); + } + if (closed) { return; } + if (!takers.length) { return buffer.put(input); } - for (var i = 0; i < takers.length; i++) { - var cb = takers[i]; - if (!cb[MATCH] || cb[MATCH](input)) { - takers.splice(i, 1); - return cb(input); - } - } + + var cb = takers[0]; + takers.splice(0, 1); + cb(input); } function take(cb) { checkForbiddenStates(); - check(cb, is.func, "channel.take's callback must be a function"); + + { + check(cb, is.func, "channel.take's callback must be a function"); + } if (closed && buffer.isEmpty()) { cb(END); @@ -577,6 +668,7 @@ function channel() { cb(buffer.take()); } else { takers.push(cb); + cb.cancel = function () { return remove(takers, cb); }; @@ -585,23 +677,32 @@ function channel() { function flush$$1(cb) { checkForbiddenStates(); // TODO: check if some new state should be forbidden now - check(cb, is.func, "channel.flush' callback must be a function"); + + { + check(cb, is.func, "channel.flush' callback must be a function"); + } + if (closed && buffer.isEmpty()) { cb(END); return; } + cb(buffer.flush()); } function close() { checkForbiddenStates(); + if (!closed) { closed = true; + if (takers.length) { var arr = takers; takers = []; + for (var i = 0, len = arr.length; i < len; i++) { - arr[i](END); + var taker = arr[i]; + taker(END); } } } @@ -611,155 +712,326 @@ function channel() { take: take, put: put, flush: flush$$1, - close: close, - get __takers__() { - return takers; - }, - get __closed__() { - return closed; - } + close: close }; } - -function eventChannel(subscribe) { - var buffer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : buffers.none(); - var matcher = arguments[2]; - - /** - should be if(typeof matcher !== undefined) instead? - see PR #273 for a background discussion - **/ - if (arguments.length > 2) { - check(matcher, is.func, 'Invalid match function passed to eventChannel'); +function eventChannel(subscribe, buffer) { + if (buffer === void 0) { + buffer = none(); } + var closed = false; + var unsubscribe; var chan = channel(buffer); + var close = function close() { - if (!chan.__closed__) { - if (unsubscribe) { - unsubscribe(); - } - chan.close(); + if (is.func(unsubscribe)) { + unsubscribe(); } + + chan.close(); }; - var unsubscribe = subscribe(function (input) { + + unsubscribe = subscribe(function (input) { if (isEnd(input)) { close(); + closed = true; return; } - if (matcher && !matcher(input)) { - return; - } + chan.put(input); }); - if (chan.__closed__) { - unsubscribe(); - } if (!is.func(unsubscribe)) { throw new Error('in eventChannel: subscribe should return a function to unsubscribe'); } + unsubscribe = once(unsubscribe); + + if (closed) { + unsubscribe(); + } + return { take: chan.take, flush: chan.flush, close: close }; } +function multicastChannel() { + var _ref; + + var closed = false; + var currentTakers = []; + var nextTakers = currentTakers; + + var ensureCanMutateNextTakers = function ensureCanMutateNextTakers() { + if (nextTakers !== currentTakers) { + return; + } + + nextTakers = currentTakers.slice(); + }; // TODO: check if its possible to extract closing function and reuse it in both unicasts and multicasts -function multicast() { - var chan = channel(buffers.none()); - var putLock = false; - var pendingTakers = []; - return _extends({}, chan, { - put: function put(input) { - // TODO: should I check forbidden state here? 1 of them is even impossible - // as we do not possibility of buffer here + + var close = function close() { + closed = true; + var takers = currentTakers = nextTakers; + + for (var i = 0; i < takers.length; i++) { + var taker = takers[i]; + taker(END); + } + + nextTakers = []; + }; + + return _ref = {}, _ref[MULTICAST] = true, _ref.put = function put(input) { + // TODO: should I check forbidden state here? 1 of them is even impossible + // as we do not possibility of buffer here + { check(input, is.notUndef, UNDEFINED_INPUT_ERROR); - if (chan.__closed__) { - return; - } - if (isEnd(input)) { - chan.close(); - return; - } - var takers = chan.__takers__; - putLock = true; - for (var i = 0; i < takers.length; i++) { - var cb = takers[i]; - if (!cb[MATCH] || cb[MATCH](input)) { - takers.splice(i, 1); - cb(input); - i--; - } - } - putLock = false; + } - pendingTakers.forEach(chan.take); - pendingTakers = []; - }, - take: function take(cb) { - if (putLock) { - pendingTakers.push(cb); - cb.cancel = function () { - return remove(pendingTakers, cb); - }; - return; + if (closed) { + return; + } + + if (isEnd(input)) { + close(); + return; + } + + var takers = currentTakers = nextTakers; + + for (var i = 0; i < takers.length; i++) { + var taker = takers[i]; + + if (taker[MATCH](input)) { + taker.cancel(); + taker(input); } - chan.take(cb); } - }); -} + }, _ref.take = function take(cb, matcher$$1) { + if (matcher$$1 === void 0) { + matcher$$1 = wildcard; + } + if (closed) { + cb(END); + return; + } + + cb[MATCH] = matcher$$1; + ensureCanMutateNextTakers(); + nextTakers.push(cb); + cb.cancel = once(function () { + ensureCanMutateNextTakers(); + remove(nextTakers, cb); + }); + }, _ref.close = close, _ref; +} function stdChannel() { - var chan = multicast(); - return _extends({}, chan, { - put: function put(input) { - if (input[SAGA_ACTION]) { - chan.put(input); - return; - } - asap(function () { - return chan.put(input); - }); - }, + var chan = multicastChannel(); + var put = chan.put; - // TODO: rethink the matcher, seems hacky - // maybe we could keep takers in a hashmap - // and search for a hash when something is put on the channel - // this could also help perf-wise - // downside - pattern might be a predicate so aint rly feasible to apply technique for such case - // eventChannel's matcher could got deprecated now (when stdChannel is no longer dependent on it) - // such functionality is easily achievable in user land - take: function take(cb, matcher) { - if (arguments.length > 1) { - check(matcher, is.func, "channel.take's matcher argument must be a function"); - cb[MATCH] = matcher; - } - chan.take(cb); + chan.put = function (input) { + if (input[SAGA_ACTION]) { + put(input); + return; } + + asap(function () { + return put(input); + }); + }; + + return chan; +} + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = freeGlobal || freeSelf || Function('return this')(); + +/** Used for built-in method references. */ + +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + +/** Used for built-in method references. */ +var funcProto = Function.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +function symbolObservablePonyfill(root) { + var result; + var Symbol = root.Symbol; + + if (typeof Symbol === 'function') { + if (Symbol.observable) { + result = Symbol.observable; + } else { + result = Symbol('observable'); + Symbol.observable = result; + } + } else { + result = '@@observable'; + } + + return result; +} + +/* global window */ +var root$2; + +if (typeof self !== 'undefined') { + root$2 = self; +} else if (typeof window !== 'undefined') { + root$2 = window; +} else if (typeof global !== 'undefined') { + root$2 = global; +} else if (typeof module !== 'undefined') { + root$2 = module; +} else { + root$2 = Function('return this')(); +} + +var result = symbolObservablePonyfill(root$2); + +/** + * These are private action types reserved by Redux. + * For any unknown actions, you must return the current state. + * If the current state is undefined, you must return the initial state. + * Do not reference these action types directly in your code. + */ + +/** + * Prints a warning in the console if it exists. + * + * @param {String} message The warning message. + * @returns {void} + */ +function warning(message) { + /* eslint-disable no-console */ + if (typeof console !== 'undefined' && typeof console.error === 'function') { + console.error(message); + } + /* eslint-enable no-console */ + try { + // This error was thrown as a convenience so that if you enable + // "break on all exceptions" in your console, + // it would pause the execution at this line. + throw new Error(message); + /* eslint-disable no-empty */ + } catch (e) {} + /* eslint-enable no-empty */ +} + +/** + * Composes single-argument functions from right to left. The rightmost + * function can take multiple arguments as it provides the signature for + * the resulting composite function. + * + * @param {...Function} funcs The functions to compose. + * @returns {Function} A function obtained by composing the argument functions + * from right to left. For example, compose(f, g, h) is identical to doing + * (...args) => f(g(h(...args))). + */ + +function compose() { + for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) { + funcs[_key] = arguments[_key]; + } + + if (funcs.length === 0) { + return function (arg) { + return arg; + }; + } + + if (funcs.length === 1) { + return funcs[0]; + } + + return funcs.reduce(function (a, b) { + return function () { + return a(b.apply(undefined, arguments)); + }; }); } -var done = { done: true, value: undefined }; -var qEnd = {}; +/* +* This is a dummy function to check if the function name has been altered by minification. +* If the function has been minified and NODE_ENV !== 'production', warn the user. +*/ +function isCrushed() {} +if ("development" !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') { + warning('You are currently using minified code outside of NODE_ENV === \'production\'. ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or DefinePlugin for webpack (http://stackoverflow.com/questions/30030031) ' + 'to ensure you have the correct code for your production build.'); +} + +var done = { + done: true, + value: undefined +}; +var qEnd = {}; function safeName(patternOrChannel) { if (is.channel(patternOrChannel)) { return 'channel'; - } else if (Array.isArray(patternOrChannel)) { - return String(patternOrChannel.map(function (entry) { - return String(entry); - })); - } else { + } + + if (is.stringableFunc(patternOrChannel)) { return String(patternOrChannel); } -} -function fsmIterator(fsm, q0) { - var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'iterator'; + if (is.func(patternOrChannel)) { + return patternOrChannel.name; + } - var updateState = void 0, + return String(patternOrChannel); +} +function fsmIterator(fsm, q0, name) { + var updateState, qNext = q0; function next(arg, error) { @@ -786,20 +1058,27 @@ function fsmIterator(fsm, q0) { return makeIterator(next, function (error) { return next(null, error); - }, name, true); + }, name); } -function takeEvery$2(patternOrChannel, worker) { - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { +function takeEvery$1(patternOrChannel, worker) { + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - var yTake = { done: false, value: take(patternOrChannel) }; + var yTake = { + done: false, + value: take(patternOrChannel) + }; + var yFork = function yFork(ac) { - return { done: false, value: fork.apply(undefined, [worker].concat(args, [ac])) }; + return { + done: false, + value: fork.apply(void 0, [worker].concat(args, [ac])) + }; }; - var action = void 0, + var action, setAction = function setAction(ac) { return action = ac; }; @@ -811,27 +1090,39 @@ function takeEvery$2(patternOrChannel, worker) { q2: function q2() { return action === END ? [qEnd] : ['q1', yFork(action)]; } - }, 'q1', 'takeEvery(' + safeName(patternOrChannel) + ', ' + worker.name + ')'); + }, 'q1', "takeEvery(" + safeName(patternOrChannel) + ", " + worker.name + ")"); } -function takeLatest$2(patternOrChannel, worker) { - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { +function takeLatest$1(patternOrChannel, worker) { + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - var yTake = { done: false, value: take(patternOrChannel) }; + var yTake = { + done: false, + value: take(patternOrChannel) + }; + var yFork = function yFork(ac) { - return { done: false, value: fork.apply(undefined, [worker].concat(args, [ac])) }; + return { + done: false, + value: fork.apply(void 0, [worker].concat(args, [ac])) + }; }; + var yCancel = function yCancel(task) { - return { done: false, value: cancel(task) }; + return { + done: false, + value: cancel(task) + }; }; - var task = void 0, - action = void 0; + var task, action; + var setTask = function setTask(t) { return task = t; }; + var setAction = function setAction(ac) { return action = ac; }; @@ -846,29 +1137,43 @@ function takeLatest$2(patternOrChannel, worker) { q3: function q3() { return ['q1', yFork(action), setTask]; } - }, 'q1', 'takeLatest(' + safeName(patternOrChannel) + ', ' + worker.name + ')'); + }, 'q1', "takeLatest(" + safeName(patternOrChannel) + ", " + worker.name + ")"); } -function throttle$2(delayLength, pattern, worker) { - for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { +function throttle$1(delayLength, pattern, worker) { + for (var _len = arguments.length, args = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { args[_key - 3] = arguments[_key]; } - var action = void 0, - channel$$1 = void 0; + var action, channel$$1; + var yActionChannel = { + done: false, + value: actionChannel(pattern, sliding(1)) + }; - var yActionChannel = { done: false, value: actionChannel(pattern, buffers.sliding(1)) }; var yTake = function yTake() { - return { done: false, value: take(channel$$1) }; + return { + done: false, + value: take(channel$$1) + }; }; + var yFork = function yFork(ac) { - return { done: false, value: fork.apply(undefined, [worker].concat(args, [ac])) }; + return { + done: false, + value: fork.apply(void 0, [worker].concat(args, [ac])) + }; + }; + + var yDelay = { + done: false, + value: call(delay, delayLength) }; - var yDelay = { done: false, value: call(delay, delayLength) }; var setAction = function setAction(ac) { return action = ac; }; + var setChannel = function setChannel(ch) { return channel$$1 = ch; }; @@ -886,18 +1191,9 @@ function throttle$2(delayLength, pattern, worker) { q4: function q4() { return ['q2', yDelay]; } - }, 'q1', 'throttle(' + safeName(pattern) + ', ' + worker.name + ')'); + }, 'q1', "throttle(" + safeName(pattern) + ", " + worker.name + ")"); } -var deprecationWarning = function deprecationWarning(helperName) { - return 'import { ' + helperName + ' } from \'redux-saga\' has been deprecated in favor of import { ' + helperName + ' } from \'redux-saga/effects\'.\nThe latter will not work with yield*, as helper effects are wrapped automatically for you in fork effect.\nTherefore yield ' + helperName + ' will return task descriptor to your saga and execute next lines of code.'; -}; - -var takeEvery$1 = /*#__PURE__*/deprecate(takeEvery$2, /*#__PURE__*/deprecationWarning('takeEvery')); -var takeLatest$1 = /*#__PURE__*/deprecate(takeLatest$2, /*#__PURE__*/deprecationWarning('takeLatest')); -var throttle$1 = /*#__PURE__*/deprecate(throttle$2, /*#__PURE__*/deprecationWarning('throttle')); - -var IO = /*#__PURE__*/sym('IO'); var TAKE = 'TAKE'; var PUT = 'PUT'; var ALL = 'ALL'; @@ -913,7 +1209,6 @@ var CANCELLED = 'CANCELLED'; var FLUSH = 'FLUSH'; var GET_CONTEXT = 'GET_CONTEXT'; var SET_CONTEXT = 'SET_CONTEXT'; - var TEST_HINT = '\n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)'; var effect = function effect(type, payload) { @@ -923,67 +1218,92 @@ var effect = function effect(type, payload) { }; var detach = function detach(eff) { - check(asEffect.fork(eff), is.object, 'detach(eff): argument must be a fork effect'); + { + check(asEffect.fork(eff), is.object, 'detach(eff): argument must be a fork effect'); + } + eff[FORK].detached = true; return eff; }; +function take(patternOrChannel, multicastPattern) { + if (patternOrChannel === void 0) { + patternOrChannel = '*'; + } -function take() { - var patternOrChannel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '*'; - - if (arguments.length) { + if ("development" === 'development' && arguments.length) { check(arguments[0], is.notUndef, 'take(patternOrChannel): patternOrChannel is undefined'); } + if (is.pattern(patternOrChannel)) { - return effect(TAKE, { pattern: patternOrChannel }); + return effect(TAKE, { + pattern: patternOrChannel + }); } + + if (is.multicast(patternOrChannel) && is.notUndef(multicastPattern) && is.pattern(multicastPattern)) { + return effect(TAKE, { + channel: patternOrChannel, + pattern: multicastPattern + }); + } + if (is.channel(patternOrChannel)) { - return effect(TAKE, { channel: patternOrChannel }); + return effect(TAKE, { + channel: patternOrChannel + }); } - throw new Error('take(patternOrChannel): argument ' + String(patternOrChannel) + ' is not valid channel or a valid pattern'); + + throw new Error("take(patternOrChannel): argument " + patternOrChannel + " is not valid channel or a valid pattern"); } -take.maybe = function () { - var eff = take.apply(undefined, arguments); +var takeMaybe = function takeMaybe() { + var eff = take.apply(void 0, arguments); eff[TAKE].maybe = true; return eff; }; -var takem = /*#__PURE__*/deprecate(take.maybe, /*#__PURE__*/updateIncentive('takem', 'take.maybe')); - function put(channel, action) { - if (arguments.length > 1) { - check(channel, is.notUndef, 'put(channel, action): argument channel is undefined'); - check(channel, is.channel, 'put(channel, action): argument ' + channel + ' is not a valid channel'); - check(action, is.notUndef, 'put(channel, action): argument action is undefined'); - } else { - check(channel, is.notUndef, 'put(action): argument action is undefined'); + { + if (arguments.length > 1) { + check(channel, is.notUndef, 'put(channel, action): argument channel is undefined'); + check(channel, is.channel, "put(channel, action): argument " + channel + " is not a valid channel"); + check(action, is.notUndef, 'put(channel, action): argument action is undefined'); + } else { + check(channel, is.notUndef, 'put(action): argument action is undefined'); + } + } + + if (is.undef(action)) { action = channel; channel = null; } - return effect(PUT, { channel: channel, action: action }); + + return effect(PUT, { + channel: channel, + action: action + }); } -put.resolve = function () { - var eff = put.apply(undefined, arguments); +var putResolve = function putResolve() { + var eff = put.apply(void 0, arguments); eff[PUT].resolve = true; return eff; }; -put.sync = /*#__PURE__*/deprecate(put.resolve, /*#__PURE__*/updateIncentive('put.sync', 'put.resolve')); - function all(effects) { return effect(ALL, effects); } - function race(effects) { return effect(RACE, effects); } function getFnCallDesc(meth, fn, args) { - check(fn, is.notUndef, meth + ': argument fn is undefined'); + { + check(fn, is.notUndef, meth + ": argument fn is undefined"); + } var context = null; + if (is.array(fn)) { var _fn = fn; context = _fn[0]; @@ -993,54 +1313,62 @@ function getFnCallDesc(meth, fn, args) { context = _fn2.context; fn = _fn2.fn; } + if (context && is.string(fn) && is.func(context[fn])) { fn = context[fn]; } - check(fn, is.func, meth + ': argument ' + fn + ' is not a function'); - return { context: context, fn: fn, args: args }; + { + check(fn, is.func, meth + ": argument " + fn + " is not a function"); + } + + return { + context: context, + fn: fn, + args: args + }; } function call(fn) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return effect(CALL, getFnCallDesc('call', fn, args)); } +function apply(context, fn, args) { + if (args === void 0) { + args = []; + } -function apply(context, fn) { - var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; - - return effect(CALL, getFnCallDesc('apply', { context: context, fn: fn }, args)); + return effect(CALL, getFnCallDesc('apply', { + context: context, + fn: fn + }, args)); } - function cps(fn) { - for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } return effect(CPS, getFnCallDesc('cps', fn, args)); } - function fork(fn) { - for (var _len3 = arguments.length, args = Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { args[_key3 - 1] = arguments[_key3]; } return effect(FORK, getFnCallDesc('fork', fn, args)); } - function spawn(fn) { - for (var _len4 = arguments.length, args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { args[_key4 - 1] = arguments[_key4]; } - return detach(fork.apply(undefined, [fn].concat(args))); + return detach(fork.apply(void 0, [fn].concat(args))); } - function join() { - for (var _len5 = arguments.length, tasks = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + for (var _len5 = arguments.length, tasks = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { tasks[_key5] = arguments[_key5]; } @@ -1049,14 +1377,18 @@ function join() { return join(t); })); } + var task = tasks[0]; - check(task, is.notUndef, 'join(task): argument task is undefined'); - check(task, is.task, 'join(task): argument ' + task + ' is not a valid Task object ' + TEST_HINT); + + { + check(task, is.notUndef, 'join(task): argument task is undefined'); + check(task, is.task, "join(task): argument " + task + " is not a valid Task object " + TEST_HINT); + } + return effect(JOIN, task); } - function cancel() { - for (var _len6 = arguments.length, tasks = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { + for (var _len6 = arguments.length, tasks = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { tasks[_key6] = arguments[_key6]; } @@ -1065,81 +1397,98 @@ function cancel() { return cancel(t); })); } + var task = tasks[0]; - if (tasks.length === 1) { + + if ("development" === 'development' && tasks.length === 1) { check(task, is.notUndef, 'cancel(task): argument task is undefined'); - check(task, is.task, 'cancel(task): argument ' + task + ' is not a valid Task object ' + TEST_HINT); + check(task, is.task, "cancel(task): argument " + task + " is not a valid Task object " + TEST_HINT); } + return effect(CANCEL$1, task || SELF_CANCELLATION); } - function select(selector) { - for (var _len7 = arguments.length, args = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { + if (selector === void 0) { + selector = identity; + } + + for (var _len7 = arguments.length, args = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { args[_key7 - 1] = arguments[_key7]; } - if (arguments.length === 0) { - selector = ident; - } else { - check(selector, is.notUndef, 'select(selector,[...]): argument selector is undefined'); - check(selector, is.func, 'select(selector,[...]): argument ' + selector + ' is not a function'); + if ("development" === 'development' && arguments.length) { + check(arguments[0], is.notUndef, 'select(selector, [...]): argument selector is undefined'); + check(selector, is.func, "select(selector, [...]): argument " + selector + " is not a function"); } - return effect(SELECT, { selector: selector, args: args }); -} + return effect(SELECT, { + selector: selector, + args: args + }); +} /** - channel(pattern, [buffer]) => creates an event channel for store actions + channel(pattern, [buffer]) => creates a proxy channel for store actions **/ + function actionChannel(pattern, buffer) { - check(pattern, is.notUndef, 'actionChannel(pattern,...): argument pattern is undefined'); - if (arguments.length > 1) { - check(buffer, is.notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined'); - check(buffer, is.buffer, 'actionChannel(pattern, buffer): argument ' + buffer + ' is not a valid buffer'); + { + check(pattern, is.notUndef, 'actionChannel(pattern,...): argument pattern is undefined'); + + if (arguments.length > 1) { + check(buffer, is.notUndef, 'actionChannel(pattern, buffer): argument buffer is undefined'); + check(buffer, is.buffer, "actionChannel(pattern, buffer): argument " + buffer + " is not a valid buffer"); + } } - return effect(ACTION_CHANNEL, { pattern: pattern, buffer: buffer }); -} + return effect(ACTION_CHANNEL, { + pattern: pattern, + buffer: buffer + }); +} function cancelled() { return effect(CANCELLED, {}); } - function flush$1(channel) { - check(channel, is.channel, 'flush(channel): argument ' + channel + ' is not valid channel'); + { + check(channel, is.channel, "flush(channel): argument " + channel + " is not valid channel"); + } + return effect(FLUSH, channel); } - function getContext(prop) { - check(prop, is.string, 'getContext(prop): argument ' + prop + ' is not a string'); + { + check(prop, is.string, "getContext(prop): argument " + prop + " is not a string"); + } + return effect(GET_CONTEXT, prop); } - function setContext(props) { - check(props, is.object, createSetContextWarning(null, props)); + { + check(props, is.object, createSetContextWarning(null, props)); + } + return effect(SET_CONTEXT, props); } - function takeEvery(patternOrChannel, worker) { - for (var _len8 = arguments.length, args = Array(_len8 > 2 ? _len8 - 2 : 0), _key8 = 2; _key8 < _len8; _key8++) { + for (var _len8 = arguments.length, args = new Array(_len8 > 2 ? _len8 - 2 : 0), _key8 = 2; _key8 < _len8; _key8++) { args[_key8 - 2] = arguments[_key8]; } - return fork.apply(undefined, [takeEvery$2, patternOrChannel, worker].concat(args)); + return fork.apply(void 0, [takeEvery$1, patternOrChannel, worker].concat(args)); } - function takeLatest(patternOrChannel, worker) { - for (var _len9 = arguments.length, args = Array(_len9 > 2 ? _len9 - 2 : 0), _key9 = 2; _key9 < _len9; _key9++) { + for (var _len9 = arguments.length, args = new Array(_len9 > 2 ? _len9 - 2 : 0), _key9 = 2; _key9 < _len9; _key9++) { args[_key9 - 2] = arguments[_key9]; } - return fork.apply(undefined, [takeLatest$2, patternOrChannel, worker].concat(args)); + return fork.apply(void 0, [takeLatest$1, patternOrChannel, worker].concat(args)); } - function throttle(ms, pattern, worker) { - for (var _len10 = arguments.length, args = Array(_len10 > 3 ? _len10 - 3 : 0), _key10 = 3; _key10 < _len10; _key10++) { + for (var _len10 = arguments.length, args = new Array(_len10 > 3 ? _len10 - 3 : 0), _key10 = 3; _key10 < _len10; _key10++) { args[_key10 - 3] = arguments[_key10]; } - return fork.apply(undefined, [throttle$2, ms, pattern, worker].concat(args)); + return fork.apply(void 0, [throttle$1, ms, pattern, worker].concat(args)); } var createAsEffectType = function createAsEffectType(type) { @@ -1149,66 +1498,67 @@ var createAsEffectType = function createAsEffectType(type) { }; var asEffect = { - take: /*#__PURE__*/createAsEffectType(TAKE), - put: /*#__PURE__*/createAsEffectType(PUT), - all: /*#__PURE__*/createAsEffectType(ALL), - race: /*#__PURE__*/createAsEffectType(RACE), - call: /*#__PURE__*/createAsEffectType(CALL), - cps: /*#__PURE__*/createAsEffectType(CPS), - fork: /*#__PURE__*/createAsEffectType(FORK), - join: /*#__PURE__*/createAsEffectType(JOIN), - cancel: /*#__PURE__*/createAsEffectType(CANCEL$1), - select: /*#__PURE__*/createAsEffectType(SELECT), - actionChannel: /*#__PURE__*/createAsEffectType(ACTION_CHANNEL), - cancelled: /*#__PURE__*/createAsEffectType(CANCELLED), - flush: /*#__PURE__*/createAsEffectType(FLUSH), - getContext: /*#__PURE__*/createAsEffectType(GET_CONTEXT), - setContext: /*#__PURE__*/createAsEffectType(SET_CONTEXT) + take: + /*#__PURE__*/ + createAsEffectType(TAKE), + put: + /*#__PURE__*/ + createAsEffectType(PUT), + all: + /*#__PURE__*/ + createAsEffectType(ALL), + race: + /*#__PURE__*/ + createAsEffectType(RACE), + call: + /*#__PURE__*/ + createAsEffectType(CALL), + cps: + /*#__PURE__*/ + createAsEffectType(CPS), + fork: + /*#__PURE__*/ + createAsEffectType(FORK), + join: + /*#__PURE__*/ + createAsEffectType(JOIN), + cancel: + /*#__PURE__*/ + createAsEffectType(CANCEL$1), + select: + /*#__PURE__*/ + createAsEffectType(SELECT), + actionChannel: + /*#__PURE__*/ + createAsEffectType(ACTION_CHANNEL), + cancelled: + /*#__PURE__*/ + createAsEffectType(CANCELLED), + flush: + /*#__PURE__*/ + createAsEffectType(FLUSH), + getContext: + /*#__PURE__*/ + createAsEffectType(GET_CONTEXT), + setContext: + /*#__PURE__*/ + createAsEffectType(SET_CONTEXT) }; -var NOT_ITERATOR_ERROR = 'proc first argument (Saga function result) must be an iterator'; +// also check again whats the difference between CHANNEL_END and CHANNEL_END_TYPE +// maybe this could become MAYBE_END +// I guess this gets exported so takeMaybe result can be checked -var CHANNEL_END = { +var CHANNEL_END$1 = { toString: function toString() { - return '@@redux-saga/CHANNEL_END'; + return CHANNEL_END; } }; -var TASK_CANCEL = { +var TASK_CANCEL$1 = { toString: function toString() { - return '@@redux-saga/TASK_CANCEL'; - } -}; - -var matchers = { - wildcard: function wildcard() { - return kTrue; - }, - default: function _default(pattern) { - return (typeof pattern === 'undefined' ? 'undefined' : _typeof(pattern)) === 'symbol' ? function (input) { - return input.type === pattern; - } : function (input) { - return input.type === String(pattern); - }; - }, - array: function array$$1(patterns) { - return function (input) { - return patterns.some(function (p) { - return matcher(p)(input); - }); - }; - }, - predicate: function predicate(_predicate) { - return function (input) { - return _predicate(input); - }; + return TASK_CANCEL; } }; - -function matcher(pattern) { - // prettier-ignore - return (pattern === '*' ? matchers.wildcard : is.array(pattern) ? matchers.array : is.stringableFunc(pattern) ? matchers.default : is.func(pattern) ? matchers.predicate : matchers.default)(pattern); -} - /** Used to track a parent task and its forks In the new fork model, forked tasks are attached by default to their parent @@ -1224,9 +1574,10 @@ function matcher(pattern) { - It aborts if any uncaught error bubbles up from forks - If it completes, the return value is the one returned by the main task **/ + function forkQueue(name, mainTask, cb) { var tasks = [], - result = void 0, + result, completed = false; addTask(mainTask); @@ -1237,6 +1588,7 @@ function forkQueue(name, mainTask, cb) { function addTask(task) { tasks.push(task); + task.cont = function (res, isErr) { if (completed) { return; @@ -1244,25 +1596,28 @@ function forkQueue(name, mainTask, cb) { remove(tasks, task); task.cont = noop; + if (isErr) { abort(res); } else { if (task === mainTask) { result = res; } + if (!tasks.length) { completed = true; cb(result); } } - }; - // task.cont.cancel = task.cancel + }; // task.cont.cancel = task.cancel + } function cancelAll() { if (completed) { return; } + completed = true; tasks.forEach(function (t) { t.cont = noop; @@ -1293,32 +1648,40 @@ function createTaskIterator(_ref) { if (is.iterator(fn)) { return fn; - } + } // catch synchronous failures; see #152 and #441 + + + var result, error; - // catch synchronous failures; see #152 and #441 - var result = void 0, - error = void 0; try { result = fn.apply(context, args); } catch (err) { error = err; - } + } // i.e. a generator function returns an iterator + - // i.e. a generator function returns an iterator if (is.iterator(result)) { return result; - } - - // do not bubble up synchronous failures for detached forks + } // do not bubble up synchronous failures for detached forks // instead create a failed task. See #152 and #441 + + return error ? makeIterator(function () { throw error; }) : makeIterator(function () { - var pc = void 0; - var eff = { done: false, value: result }; + var pc; + var eff = { + done: false, + value: result + }; + var ret = function ret(value) { - return { done: true, value: value }; + return { + done: true, + value: value + }; }; + return function (arg) { if (!pc) { pc = true; @@ -1330,66 +1693,78 @@ function createTaskIterator(_ref) { }()); } -var wrapHelper = function wrapHelper(helper) { - return { fn: helper }; -}; +function proc(iterator, stdChannel$$1, dispatch, getState, parentContext, options, parentEffectId, name, cont) { + if (dispatch === void 0) { + dispatch = noop; + } -function proc(iterator, stdChannel$$1) { - var dispatch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop; - var getState = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : noop; - var parentContext = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; - var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; - var parentEffectId = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0; - var name = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 'anonymous'; - var cont = arguments[8]; + if (getState === void 0) { + getState = noop; + } - check(iterator, is.iterator, NOT_ITERATOR_ERROR); + if (parentContext === void 0) { + parentContext = {}; + } - var effectsString = '[...effects]'; - var runParallelEffect = deprecate(runAllEffect, updateIncentive(effectsString, 'all(' + effectsString + ')')); + if (options === void 0) { + options = {}; + } - var sagaMonitor = options.sagaMonitor, - logger = options.logger, - onError = options.onError; + if (parentEffectId === void 0) { + parentEffectId = 0; + } + + if (name === void 0) { + name = 'anonymous'; + } + var _options = options, + sagaMonitor = _options.sagaMonitor, + logger = _options.logger, + onError = _options.onError, + middleware = _options.middleware; var log$$1 = logger || log; + var logError = function logError(err) { var message = err.sagaStack; if (!message && err.stack) { - message = err.stack.split('\n')[0].indexOf(err.message) !== -1 ? err.stack : 'Error: ' + err.message + '\n' + err.stack; + message = err.stack.split('\n')[0].indexOf(err.message) !== -1 ? err.stack : "Error: " + err.message + "\n" + err.stack; } - log$$1('error', 'uncaught at ' + name, message || err.message || err); + log$$1('error', "uncaught at " + name, message || err.message || err); }; var taskContext = Object.create(parentContext); - /** Tracks the current effect cancellation Each time the generator progresses. calling runEffect will set a new value on it. It allows propagating cancellation to child effects **/ - next.cancel = noop; + next.cancel = noop; /** Creates a new task descriptor for this generator, We'll also create a main task to track the main flow (besides other forked tasks) **/ + var task = newTask(parentEffectId, name, iterator, cont); - var mainTask = { name: name, cancel: cancelMain, isRunning: true }; + var mainTask = { + name: name, + cancel: cancelMain, + isRunning: true + }; var taskQueue = forkQueue(name, mainTask, end); - /** cancellation of the main task. We'll simply resume the Generator with a Cancel **/ + function cancelMain() { if (mainTask.isRunning && !mainTask.isCancelled) { mainTask.isCancelled = true; - next(TASK_CANCEL); + next(TASK_CANCEL$1); } } - /** This may be called by a parent generator to trigger/propagate cancellation cancel all pending tasks (including the main task), then end the current task. @@ -1397,6 +1772,8 @@ function proc(iterator, stdChannel$$1) { It's also propagated to all joiners of this task and their execution tree/joiners Cancellation is noop for terminated/Cancelled tasks tasks **/ + + function cancel$$1() { /** We need to check both Running and Cancelled status @@ -1408,29 +1785,29 @@ function proc(iterator, stdChannel$$1) { /** Ending with a Never result will propagate the Cancellation to all joiners **/ - end(TASK_CANCEL); + + end(TASK_CANCEL$1); } } /** attaches cancellation logic to this task's continuation this will permit cancellation to propagate down the call chain **/ - cont && (cont.cancel = cancel$$1); - // tracks the running status - iterator._isRunning = true; - // kicks up the generator - next(); + cont && (cont.cancel = cancel$$1); // tracks the running status - // then return the task descriptor to the caller - return task; + iterator._isRunning = true; // kicks up the generator + + next(); // then return the task descriptor to the caller + return task; /** This is the generator driver It's a recursive async/continuation function which calls itself until the generator terminates or throws **/ + function next(arg, isErr) { // Preventive measure. If we end up here, then there is really something wrong if (!mainTask.isRunning) { @@ -1438,10 +1815,11 @@ function proc(iterator, stdChannel$$1) { } try { - var result = void 0; + var result; + if (isErr) { result = iterator.throw(arg); - } else if (arg === TASK_CANCEL) { + } else if (arg === TASK_CANCEL$1) { /** getting TASK_CANCEL automatically cancels the main task We can get this value here @@ -1452,21 +1830,28 @@ function proc(iterator, stdChannel$$1) { /** Cancels the current effect; this will propagate the cancellation down to any called tasks **/ + next.cancel(); /** If this Generator has a `return` method then invokes it This will jump to the finally block **/ - result = is.func(iterator.return) ? iterator.return(TASK_CANCEL) : { done: true, value: TASK_CANCEL }; - } else if (arg === CHANNEL_END) { + + result = is.func(iterator.return) ? iterator.return(TASK_CANCEL$1) : { + done: true, + value: TASK_CANCEL$1 + }; + } else if (arg === CHANNEL_END$1) { // We get CHANNEL_END by taking from a channel that ended using `take` (and not `takem` used to trap End of channels) - result = is.func(iterator.return) ? iterator.return() : { done: true }; + result = is.func(iterator.return) ? iterator.return() : { + done: true + }; } else { result = iterator.next(arg); } if (!result.done) { - runEffect(result.value, parentEffectId, '', next); + digestEffect(result.value, parentEffectId, '', next); } else { /** This Generator has ended, terminate the main task and notify the fork queue @@ -1478,14 +1863,14 @@ function proc(iterator, stdChannel$$1) { if (mainTask.isCancelled) { logError(error); } + mainTask.isMainRunning = false; mainTask.cont(error, true); } } function end(result, isErr) { - iterator._isRunning = false; - // stdChannel.close() + iterator._isRunning = false; // stdChannel.close() if (!isErr) { iterator._result = result; @@ -1493,10 +1878,11 @@ function proc(iterator, stdChannel$$1) { } else { if (result instanceof Error) { Object.defineProperty(result, 'sagaStack', { - value: 'at ' + name + ' \n ' + (result.sagaStack || result.stack), + value: "at " + name + " \n " + (result.sagaStack || result.stack), configurable: true }); } + if (!task.cont) { if (result instanceof Error && onError) { onError(result); @@ -1505,10 +1891,12 @@ function proc(iterator, stdChannel$$1) { logError(result); } } + iterator._error = result; iterator._isAborted = true; iterator._deferredEnd && iterator._deferredEnd.reject(result); } + task.cont && task.cont(result, isErr); task.joiners.forEach(function (j) { return j.cb(result, isErr); @@ -1516,21 +1904,53 @@ function proc(iterator, stdChannel$$1) { task.joiners = null; } - function runEffect(effect, parentEffectId) { - var label = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - var cb = arguments[3]; + function runEffect(effect, effectId, label, currCb) { + if (label === void 0) { + label = ''; + } - var effectId = uid(); - sagaMonitor && sagaMonitor.effectTriggered({ effectId: effectId, parentEffectId: parentEffectId, label: label, effect: effect }); + /** + each effect runner must attach its own logic of cancellation to the provided callback + it allows this generator to propagate cancellation downward. + ATTENTION! effect runners must setup the cancel logic by setting cb.cancel = [cancelMethod] + And the setup must occur before calling the callback + This is a sort of inversion of control: called async functions are responsible + of completing the flow by calling the provided continuation; while caller functions + are responsible for aborting the current flow by calling the attached cancel function + Library users can attach their own cancellation logic to promises by defining a + promise[CANCEL] method in their returned promises + ATTENTION! calling cancel must have no effect on an already completed or cancelled effect + **/ + var data; // prettier-ignore + + return (// Non declarative effect + is.promise(effect) ? resolvePromise(effect, currCb) : is.iterator(effect) ? resolveIterator(effect, effectId, name, currCb) // declarative effects + : (data = asEffect.take(effect)) ? runTakeEffect(data, currCb) : (data = asEffect.put(effect)) ? runPutEffect(data, currCb) : (data = asEffect.all(effect)) ? runAllEffect(data, effectId, currCb) : (data = asEffect.race(effect)) ? runRaceEffect(data, effectId, currCb) : (data = asEffect.call(effect)) ? runCallEffect(data, effectId, currCb) : (data = asEffect.cps(effect)) ? runCPSEffect(data, currCb) : (data = asEffect.fork(effect)) ? runForkEffect(data, effectId, currCb) : (data = asEffect.join(effect)) ? runJoinEffect(data, currCb) : (data = asEffect.cancel(effect)) ? runCancelEffect(data, currCb) : (data = asEffect.select(effect)) ? runSelectEffect(data, currCb) : (data = asEffect.actionChannel(effect)) ? runChannelEffect(data, currCb) : (data = asEffect.flush(effect)) ? runFlushEffect(data, currCb) : (data = asEffect.cancelled(effect)) ? runCancelledEffect(data, currCb) : (data = asEffect.getContext(effect)) ? runGetContextEffect(data, currCb) : (data = asEffect.setContext(effect)) ? runSetContextEffect(data, currCb) : + /* anything else returned as is */ + currCb(effect) + ); + } + + function digestEffect(effect, parentEffectId, label, cb) { + if (label === void 0) { + label = ''; + } + var effectId = uid(); + sagaMonitor && sagaMonitor.effectTriggered({ + effectId: effectId, + parentEffectId: parentEffectId, + label: label, + effect: effect + }); /** completion callback and cancel callback are mutually exclusive We can't cancel an already completed effect And We can't complete an already cancelled effectId **/ - var effectSettled = void 0; - // Completion callback passed to the appropriate effect runner + var effectSettled; // Completion callback passed to the appropriate effect runner + function currCb(res, isErr) { if (effectSettled) { return; @@ -1538,15 +1958,17 @@ function proc(iterator, stdChannel$$1) { effectSettled = true; cb.cancel = noop; // defensive measure + if (sagaMonitor) { isErr ? sagaMonitor.effectRejected(effectId, res) : sagaMonitor.effectResolved(effectId, res); } + cb(res, isErr); - } - // tracks down the current cancel - currCb.cancel = noop; + } // tracks down the current cancel + + + currCb.cancel = noop; // setup cancellation logic on the parent cb - // setup cancellation logic on the parent cb cb.cancel = function () { // prevents cancelling an already completed effect if (effectSettled) { @@ -1559,41 +1981,35 @@ function proc(iterator, stdChannel$$1) { catch uncaught cancellations errors; since we can no longer call the completion callback, log errors raised during cancellations into the console **/ + try { currCb.cancel(); } catch (err) { logError(err); } + currCb.cancel = noop; // defensive measure sagaMonitor && sagaMonitor.effectCancelled(effectId); - }; + }; // if one can find a way to decouple runEffect from closure variables + // so it could be the call to it could be referentially transparent + // this potentially could be simplified, finalRunEffect created beforehand + // and this part of the code wouldnt have to know about middleware stuff - /** - each effect runner must attach its own logic of cancellation to the provided callback - it allows this generator to propagate cancellation downward. - ATTENTION! effect runners must setup the cancel logic by setting cb.cancel = [cancelMethod] - And the setup must occur before calling the callback - This is a sort of inversion of control: called async functions are responsible - for completing the flow by calling the provided continuation; while caller functions - are responsible for aborting the current flow by calling the attached cancel function - Library users can attach their own cancellation logic to promises by defining a - promise[CANCEL] method in their returned promises - ATTENTION! calling cancel must have no effect on an already completed or cancelled effect - **/ - var data = void 0; - // prettier-ignore - return ( - // Non declarative effect - is.promise(effect) ? resolvePromise(effect, currCb) : is.helper(effect) ? runForkEffect(wrapHelper(effect), effectId, currCb) : is.iterator(effect) ? resolveIterator(effect, effectId, name, currCb) - - // declarative effects - : is.array(effect) ? runParallelEffect(effect, effectId, currCb) : (data = asEffect.take(effect)) ? runTakeEffect(data, currCb) : (data = asEffect.put(effect)) ? runPutEffect(data, currCb) : (data = asEffect.all(effect)) ? runAllEffect(data, effectId, currCb) : (data = asEffect.race(effect)) ? runRaceEffect(data, effectId, currCb) : (data = asEffect.call(effect)) ? runCallEffect(data, effectId, currCb) : (data = asEffect.cps(effect)) ? runCPSEffect(data, currCb) : (data = asEffect.fork(effect)) ? runForkEffect(data, effectId, currCb) : (data = asEffect.join(effect)) ? runJoinEffect(data, currCb) : (data = asEffect.cancel(effect)) ? runCancelEffect(data, currCb) : (data = asEffect.select(effect)) ? runSelectEffect(data, currCb) : (data = asEffect.actionChannel(effect)) ? runChannelEffect(data, currCb) : (data = asEffect.flush(effect)) ? runFlushEffect(data, currCb) : (data = asEffect.cancelled(effect)) ? runCancelledEffect(data, currCb) : (data = asEffect.getContext(effect)) ? runGetContextEffect(data, currCb) : (data = asEffect.setContext(effect)) ? runSetContextEffect(data, currCb) : /* anything else returned as is */currCb(effect) - ); + + if (is.func(middleware)) { + middleware(function (eff) { + return runEffect(eff, effectId, label, currCb); + })(effect); + return; + } + + runEffect(effect, effectId, label, currCb); } function resolvePromise(promise, cb) { var cancelPromise = promise[CANCEL]; + if (is.func(cancelPromise)) { cb.cancel = cancelPromise; } else if (is.func(promise.abort)) { @@ -1601,6 +2017,7 @@ function proc(iterator, stdChannel$$1) { return promise.abort(); }; } + promise.then(cb, function (error) { return cb(error, true); }); @@ -1611,20 +2028,32 @@ function proc(iterator, stdChannel$$1) { } function runTakeEffect(_ref2, cb) { - var channel$$1 = _ref2.channel, + var _ref2$channel = _ref2.channel, + channel$$1 = _ref2$channel === void 0 ? stdChannel$$1 : _ref2$channel, pattern = _ref2.pattern, maybe = _ref2.maybe; - channel$$1 = channel$$1 || stdChannel$$1; - var takeCb = function takeCb(inp) { - return inp instanceof Error ? cb(inp, true) : isEnd(inp) && !maybe ? cb(CHANNEL_END) : cb(inp); + var takeCb = function takeCb(input) { + if (input instanceof Error) { + cb(input, true); + return; + } + + if (isEnd(input) && !maybe) { + cb(CHANNEL_END$1); + return; + } + + cb(input); }; + try { - channel$$1.take(takeCb, matcher(pattern)); + channel$$1.take(takeCb, is.notUndef(pattern) ? matcher(pattern) : null); } catch (err) { cb(err, true); return; } + cb.cancel = takeCb.cancel; } @@ -1639,13 +2068,14 @@ function proc(iterator, stdChannel$$1) { this put has terminated. **/ asap(function () { - var result = void 0; + var result; + try { result = (channel$$1 ? channel$$1.put : dispatch)(action); } catch (error) { - logError(error); - // TODO: should such error here be passed to `onError`? + logError(error); // TODO: should such error here be passed to `onError`? // or is it already if we dropped error swallowing + cb(error, true); return; } @@ -1656,23 +2086,22 @@ function proc(iterator, stdChannel$$1) { cb(result); return; } - }); - // Put effects are non cancellables + }); // Put effects are non cancellables } function runCallEffect(_ref4, effectId, cb) { var context = _ref4.context, fn = _ref4.fn, args = _ref4.args; + var result; // catch synchronous failures; see #152 - var result = void 0; - // catch synchronous failures; see #152 try { result = fn.apply(context, args); } catch (error) { cb(error, true); return; } + return is.promise(result) ? resolvePromise(result, cb) : is.iterator(result) ? resolveIterator(result, effectId, fn.name, cb) : cb(result); } @@ -1683,13 +2112,14 @@ function proc(iterator, stdChannel$$1) { // CPS (ie node style functions) can define their own cancellation logic // by setting cancel field on the cb - // catch synchronous failures; see #152 try { var cpsCb = function cpsCb(err, res) { return is.undef(err) ? cb(res) : cb(err, true); }; + fn.apply(context, args.concat(cpsCb)); + if (cpsCb.cancel) { cb.cancel = function () { return cpsCb.cancel(); @@ -1706,11 +2136,15 @@ function proc(iterator, stdChannel$$1) { fn = _ref6.fn, args = _ref6.args, detached = _ref6.detached; - - var taskIterator = createTaskIterator({ context: context, fn: fn, args: args }); + var taskIterator = createTaskIterator({ + context: context, + fn: fn, + args: args + }); try { suspend(); + var _task = proc(taskIterator, stdChannel$$1, dispatch, getState, taskContext, options, effectId, fn.name, detached ? null : noop); if (detached) { @@ -1727,16 +2161,21 @@ function proc(iterator, stdChannel$$1) { } } finally { flush(); - } - // Fork effects are non cancellables + } // Fork effects are non cancellables + } function runJoinEffect(t, cb) { if (t.isRunning()) { - var joiner = { task: task, cb: cb }; + var joiner = { + task: task, + cb: cb + }; + cb.cancel = function () { return remove(t.joiners, joiner); }; + t.joiners.push(joiner); } else { t.isAborted() ? cb(t.error(), true) : cb(t.result()); @@ -1747,11 +2186,12 @@ function proc(iterator, stdChannel$$1) { if (taskToCancel === SELF_CANCELLATION) { taskToCancel = task; } + if (taskToCancel.isRunning()) { taskToCancel.cancel(); } - cb(); - // cancel effects are non cancellables + + cb(); // cancel effects are non cancellables } function runAllEffect(effects, effectId, cb) { @@ -1763,14 +2203,16 @@ function proc(iterator, stdChannel$$1) { } var completedCount = 0; - var completed = void 0; + var completed; var results = {}; var childCbs = {}; function checkEffectEnd() { if (completedCount === keys.length) { completed = true; - cb(is.array(effects) ? array.from(_extends({}, results, { length: keys.length })) : results); + cb(is.array(effects) ? array.from(_extends({}, results, { + length: keys.length + })) : results); } } @@ -1779,7 +2221,8 @@ function proc(iterator, stdChannel$$1) { if (completed) { return; } - if (isErr || isEnd(res) || res === CHANNEL_END || res === TASK_CANCEL) { + + if (isErr || isEnd(res) || res === CHANNEL_END$1 || res === TASK_CANCEL$1) { cb.cancel(); cb(res, isErr); } else { @@ -1788,6 +2231,7 @@ function proc(iterator, stdChannel$$1) { checkEffectEnd(); } }; + chCbAtKey.cancel = noop; childCbs[key] = chCbAtKey; }); @@ -1802,15 +2246,14 @@ function proc(iterator, stdChannel$$1) { }; keys.forEach(function (key) { - return runEffect(effects[key], effectId, key, childCbs[key]); + return digestEffect(effects[key], effectId, key, childCbs[key]); }); } function runRaceEffect(effects, effectId, cb) { - var completed = void 0; + var completed; var keys = Object.keys(effects); var childCbs = {}; - keys.forEach(function (key) { var chCbAtKey = function chCbAtKey(res, isErr) { if (completed) { @@ -1821,15 +2264,18 @@ function proc(iterator, stdChannel$$1) { // Race Auto cancellation cb.cancel(); cb(res, true); - } else if (!isEnd(res) && res !== CHANNEL_END && res !== TASK_CANCEL) { + } else if (!isEnd(res) && res !== CHANNEL_END$1 && res !== TASK_CANCEL$1) { var _response; cb.cancel(); completed = true; var response = (_response = {}, _response[key] = res, _response); - cb(is.array(effects) ? [].slice.call(_extends({}, response, { length: keys.length })) : response); + cb(is.array(effects) ? [].slice.call(_extends({}, response, { + length: keys.length + })) : response); } }; + chCbAtKey.cancel = noop; childCbs[key] = chCbAtKey; }); @@ -1843,11 +2289,13 @@ function proc(iterator, stdChannel$$1) { }); } }; + keys.forEach(function (key) { if (completed) { return; } - runEffect(effects[key], effectId, key, childCbs[key]); + + digestEffect(effects[key], effectId, key, childCbs[key]); }); } @@ -1856,7 +2304,7 @@ function proc(iterator, stdChannel$$1) { args = _ref7.args; try { - var state = selector.apply(undefined, [getState()].concat(args)); + var state = selector.apply(void 0, [getState()].concat(args)); cb(state); } catch (error) { cb(error, true); @@ -1866,9 +2314,7 @@ function proc(iterator, stdChannel$$1) { function runChannelEffect(_ref8, cb) { var pattern = _ref8.pattern, buffer = _ref8.buffer; - - // TODO: something weird is going here - // rething this code + rething how END is handled + // TODO: rethink how END is handled var chan = channel(buffer); var match = matcher(pattern); @@ -1876,6 +2322,7 @@ function proc(iterator, stdChannel$$1) { if (!isEnd(action)) { stdChannel$$1.take(taker, match); } + chan.put(action); }; @@ -1883,12 +2330,6 @@ function proc(iterator, stdChannel$$1) { cb(chan); } - // function runChannelEffect({ pattern, buffer = buffers.expanding() }, cb) { - // const match = matcher(pattern) - // match.pattern = pattern - // cb(eventChannel(subscribe, buffer, match)) - // } - function runCancelledEffect(data, cb) { cb(!!mainTask.isCancelled); } @@ -1907,20 +2348,26 @@ function proc(iterator, stdChannel$$1) { } function newTask(id, name, iterator, cont) { - var _done, _ref9, _mutatorMap; + var _ref9; iterator._deferredEnd = null; - return _ref9 = {}, _ref9[TASK] = true, _ref9.id = id, _ref9.name = name, _done = 'done', _mutatorMap = {}, _mutatorMap[_done] = _mutatorMap[_done] || {}, _mutatorMap[_done].get = function () { + return _ref9 = {}, _ref9[TASK] = true, _ref9.id = id, _ref9.name = name, _ref9.toPromise = function toPromise() { if (iterator._deferredEnd) { return iterator._deferredEnd.promise; - } else { - var def = deferred(); - iterator._deferredEnd = def; - if (!iterator._isRunning) { - iterator._error ? def.reject(iterator._error) : def.resolve(iterator._result); + } + + var def = deferred(); + iterator._deferredEnd = def; + + if (!iterator._isRunning) { + if (iterator._isAborted) { + def.reject(iterator._error); + } else { + def.resolve(iterator._result); } - return def.promise; } + + return def.promise; }, _ref9.cont = cont, _ref9.joiners = [], _ref9.cancel = cancel$$1, _ref9.isRunning = function isRunning() { return iterator._isRunning; }, _ref9.isCancelled = function isCancelled() { @@ -1932,46 +2379,41 @@ function proc(iterator, stdChannel$$1) { }, _ref9.error = function error() { return iterator._error; }, _ref9.setContext = function setContext$$1(props) { - check(props, is.object, createSetContextWarning('task', props)); + { + check(props, is.object, createSetContextWarning('task', props)); + } + object.assign(taskContext, props); - }, defineEnumerableProperties(_ref9, _mutatorMap), _ref9; + }, _ref9; } } -var RUN_SAGA_SIGNATURE = 'runSaga(storeInterface, saga, ...args)'; -var NON_GENERATOR_ERR = RUN_SAGA_SIGNATURE + ': saga argument must be a Generator function!'; - -function runSaga(storeInterface, saga) { - for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { +var RUN_SAGA_SIGNATURE = 'runSaga(options, saga, ...args)'; +var NON_GENERATOR_ERR = RUN_SAGA_SIGNATURE + ": saga argument must be a Generator function!"; +function runSaga(options, saga) { + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - var iterator = void 0; - - if (is.iterator(storeInterface)) { - { - log('warn', 'runSaga(iterator, storeInterface) has been deprecated in favor of ' + RUN_SAGA_SIGNATURE); - } - iterator = storeInterface; - storeInterface = saga; - } else { + { check(saga, is.func, NON_GENERATOR_ERR); - iterator = saga.apply(undefined, args); - check(iterator, is.iterator, NON_GENERATOR_ERR); } - var _storeInterface = storeInterface, - channel$$1 = _storeInterface.channel, - _storeInterface$subsc = _storeInterface.subscribe, - subscribe = _storeInterface$subsc === undefined ? noop : _storeInterface$subsc, - dispatch = _storeInterface.dispatch, - getState = _storeInterface.getState, - context = _storeInterface.context, - sagaMonitor = _storeInterface.sagaMonitor, - logger = _storeInterface.logger, - onError = _storeInterface.onError; + var iterator = saga.apply(void 0, args); + { + check(iterator, is.iterator, NON_GENERATOR_ERR); + } + var _options$channel = options.channel, + channel$$1 = _options$channel === void 0 ? stdChannel() : _options$channel, + dispatch = options.dispatch, + getState = options.getState, + context = options.context, + sagaMonitor = options.sagaMonitor, + logger = options.logger, + effectMiddlewares = options.effectMiddlewares, + onError = options.onError; var effectId = uid(); if (sagaMonitor) { @@ -1981,28 +2423,33 @@ function runSaga(storeInterface, saga) { sagaMonitor.effectRejected = sagaMonitor.effectRejected || noop; sagaMonitor.effectCancelled = sagaMonitor.effectCancelled || noop; sagaMonitor.actionDispatched = sagaMonitor.actionDispatched || noop; - - sagaMonitor.effectTriggered({ effectId: effectId, root: true, parentEffectId: 0, effect: { root: true, saga: saga, args: args } }); + sagaMonitor.effectTriggered({ + effectId: effectId, + root: true, + parentEffectId: 0, + effect: { + root: true, + saga: saga, + args: args + } + }); } - var chan = channel$$1 ? channel$$1 : function () { - { - // TODO: write better deprecation warning - log('warn', 'runSaga({ subscribe }, ...) has been deprecated in favor of runSaga({ channel })'); - } - var chan = stdChannel(); - var unsubscribe = subscribe(chan.put); - return _extends({}, chan, { - close: function close() { - if (is.func(unsubscribe)) { - unsubscribe(); - } - chan.close(); - } + if (("development" === 'development' || "development" === 'test') && is.notUndef(effectMiddlewares)) { + var MIDDLEWARE_TYPE_ERROR = 'effectMiddlewares must be an array of functions'; + check(effectMiddlewares, is.array, MIDDLEWARE_TYPE_ERROR); + effectMiddlewares.forEach(function (effectMiddleware) { + return check(effectMiddleware, is.func, MIDDLEWARE_TYPE_ERROR); }); - }(); + } - var task = proc(iterator, chan, wrapSagaDispatch(dispatch), getState, context, { sagaMonitor: sagaMonitor, logger: logger, onError: onError }, effectId, saga.name); + var middleware = effectMiddlewares && compose.apply(void 0, effectMiddlewares); + var task = proc(iterator, channel$$1, wrapSagaDispatch(dispatch), getState, context, { + sagaMonitor: sagaMonitor, + logger: logger, + onError: onError, + middleware: middleware + }, effectId, saga.name); if (sagaMonitor) { sagaMonitor.effectResolved(effectId, task); @@ -2011,46 +2458,39 @@ function runSaga(storeInterface, saga) { return task; } -function sagaMiddlewareFactory() { - var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; +function sagaMiddlewareFactory(_ref) { + if (_ref === void 0) { + _ref = {}; + } - var _ref$context = _ref.context, - context = _ref$context === undefined ? {} : _ref$context, - options = objectWithoutProperties(_ref, ['context']); + var _ref2 = _ref, + _ref2$context = _ref2.context, + context = _ref2$context === void 0 ? {} : _ref2$context, + options = _objectWithoutProperties(_ref2, ["context"]); var sagaMonitor = options.sagaMonitor, logger = options.logger, - onError = options.onError; + onError = options.onError, + effectMiddlewares = options.effectMiddlewares; - - if (is.func(options)) { - { - throw new Error('You passed a function to the Saga middleware. You are likely trying to start a Saga by directly passing it to the middleware. This is no longer possible starting from 0.10.0. To run a Saga, you must do it dynamically AFTER mounting the middleware into the store.\n Example:\n import createSagaMiddleware from \'redux-saga\'\n ... other imports\n\n const sagaMiddleware = createSagaMiddleware()\n const store = createStore(reducer, applyMiddleware(sagaMiddleware))\n sagaMiddleware.run(saga, ...args)\n '); + { + if (is.notUndef(logger)) { + check(logger, is.func, 'options.logger passed to the Saga middleware is not a function!'); } - } - - if (logger && !is.func(logger)) { - throw new Error('`options.logger` passed to the Saga middleware is not a function!'); - } - - if ("development" === 'development' && options.onerror) { - throw new Error('`options.onerror` was removed. Use `options.onError` instead.'); - } - if (onError && !is.func(onError)) { - throw new Error('`options.onError` passed to the Saga middleware is not a function!'); - } + if (is.notUndef(onError)) { + check(onError, is.func, 'options.onError passed to the Saga middleware is not a function!'); + } - if (options.emitter && !is.func(options.emitter)) { - throw new Error('`options.emitter` passed to the Saga middleware is not a function!'); + if (is.notUndef(options.emitter)) { + check(options.emitter, is.func, 'options.emitter passed to the Saga middleware is not a function!'); + } } - function sagaMiddleware(_ref2) { - var getState = _ref2.getState, - dispatch = _ref2.dispatch; - + function sagaMiddleware(_ref3) { + var getState = _ref3.getState, + dispatch = _ref3.dispatch; var channel$$1 = stdChannel(); - channel$$1.put = (options.emitter || ident)(channel$$1.put); - + channel$$1.put = (options.emitter || identity)(channel$$1.put); sagaMiddleware.run = runSaga.bind(null, { context: context, channel: channel$$1, @@ -2058,15 +2498,17 @@ function sagaMiddlewareFactory() { getState: getState, sagaMonitor: sagaMonitor, logger: logger, - onError: onError + onError: onError, + effectMiddlewares: effectMiddlewares }); - return function (next) { return function (action) { if (sagaMonitor && sagaMonitor.actionDispatched) { sagaMonitor.actionDispatched(action); } + var result = next(action); // hit reducers + channel$$1.put(action); return result; }; @@ -2078,7 +2520,10 @@ function sagaMiddlewareFactory() { }; sagaMiddleware.setContext = function (props) { - check(props, is.object, createSetContextWarning('sagaMiddleware', props)); + { + check(props, is.object, createSetContextWarning('sagaMiddleware', props)); + } + object.assign(context, props); }; @@ -2089,8 +2534,9 @@ function sagaMiddlewareFactory() { var effects = Object.freeze({ take: take, - takem: takem, + takeMaybe: takeMaybe, put: put, + putResolve: putResolve, all: all, race: race, call: call, @@ -2114,33 +2560,30 @@ var effects = Object.freeze({ var utils = Object.freeze({ - TASK: TASK, - SAGA_ACTION: SAGA_ACTION, noop: noop, is: is, deferred: deferred, - arrayOfDeffered: arrayOfDeffered, + arrayOfDeferred: arrayOfDeferred, createMockTask: createMockTask, cloneableGenerator: cloneableGenerator, + SAGA_ACTION: SAGA_ACTION, + TASK: TASK, asEffect: asEffect, - CHANNEL_END: CHANNEL_END + CHANNEL_END: CHANNEL_END$1 }); exports['default'] = sagaMiddlewareFactory; exports.effects = effects; exports.utils = utils; +exports.buffers = buffers; exports.runSaga = runSaga; exports.END = END; exports.eventChannel = eventChannel; exports.channel = channel; -exports.multicast = multicast; +exports.multicastChannel = multicastChannel; exports.stdChannel = stdChannel; -exports.buffers = buffers; -exports.takeEvery = takeEvery$1; -exports.takeLatest = takeLatest$1; -exports.throttle = throttle$1; -exports.delay = delay; exports.CANCEL = CANCEL; +exports.delay = delay; exports.detach = detach; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/redux-saga.min.js b/dist/redux-saga.min.js index 6674b9f4d..568f3891f 100644 --- a/dist/redux-saga.min.js +++ b/dist/redux-saga.min.js @@ -1 +1 @@ -!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.ReduxSaga={})}(this,function(n){"use strict";function t(n,t,e){if(!t(n))throw c("error","uncaught at check",e),Error(e)}function e(n,t){return $.notUndef(n)&&Z.call(n,t)}function r(n,t){var e=n.indexOf(t);0>e||n.splice(e,1)}function o(){var n=D({},arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),t=new Promise(function(t,e){n.resolve=t,n.reject=e});return n.promise=t,n}function a(n){var t=1>=arguments.length||void 0===arguments[1]||arguments[1],e=void 0,r=new Promise(function(r){e=setTimeout(function(){return r(t)},n)});return r[B]=function(){return clearTimeout(e)},r}function u(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:rn,e={name:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",next:n,throw:t,return:on};return arguments[3]&&(e[K]=!0),"undefined"!=typeof Symbol&&(e[Symbol.iterator]=function(){return e}),e}function c(n,t){var e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";"undefined"==typeof window?console.log("redux-saga "+n+": "+t+"\n"+(e&&e.stack||e)):console[n](t,e)}function i(n,t){return function(){return n.apply(void 0,arguments)}}function f(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10,t=arguments[1],e=Array(n),r=0,o=0,a=0,u=function(t){e[o]=t,o=(o+1)%n,r++},c=function(){if(0!=r){var t=e[a];return e[a]=null,r--,a=(a+1)%n,t}},i=function(){for(var n=[];r;)n.push(c());return n};return{isEmpty:function(){return 0==r},put:function(c){if(n>r)u(c);else{var f=void 0;switch(t){case sn:throw Error(ln);case dn:e[o]=c,a=o=(o+1)%n;break;case vn:f=2*n,e=i(),r=e.length,o=e.length,a=0,e.length=f,n=f,u(c)}}},take:c,flush:i}}function l(n){try{d(),n()}finally{v()}}function s(n){pn.push(n),yn||(d(),g())}function d(){yn++}function v(){yn--}function g(){v();for(var n=void 0;!yn&&void 0!==(n=pn.shift());)l(n)}function h(){function n(){if(o&&a.length)throw un("Cannot have a closed channel with pending takers");if(a.length&&!e.isEmpty())throw un("Cannot have pending takers with non empty buffer")}var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:hn.expanding(),o=!1,a=[];return t(e,$.buffer,kn),{take:function(u){n(),t(u,$.func,"channel.take's callback must be a function"),o&&e.isEmpty()?u(mn):e.isEmpty()?(a.push(u),u.cancel=function(){return r(a,u)}):u(e.take())},put:function(r){if(n(),t(r,$.notUndef,En),!o){if(!a.length)return e.put(r);for(var u=0;a.length>u;u++){var c=a[u];if(!c[z]||c[z](r))return a.splice(u,1),c(r)}}},flush:function(r){n(),t(r,$.func,"channel.flush' callback must be a function"),r(o&&e.isEmpty()?mn:e.flush())},close:function(){if(n(),!o&&(o=!0,a.length)){var t=a;a=[];for(var e=0,r=t.length;r>e;e++)t[e](mn)}},get __takers__(){return a},get __closed__(){return o}}}function p(){var n=h(hn.none()),e=!1,o=[];return D({},n,{put:function(r){if(t(r,$.notUndef,En),!n.__closed__)if(bn(r))n.close();else{var a=n.__takers__;e=!0;for(var u=0;a.length>u;u++){var c=a[u];c[z]&&!c[z](r)||(a.splice(u,1),c(r),u--)}e=!1,o.forEach(n.take),o=[]}},take:function(t){if(e)return o.push(t),void(t.cancel=function(){return r(o,t)});n.take(t)}})}function y(){var n=p();return D({},n,{put:function(t){t[X]?n.put(t):s(function(){return n.put(t)})},take:function(e,r){arguments.length>1&&(t(r,$.func,"channel.take's matcher argument must be a function"),e[z]=r),n.take(e)}})}function m(n){return $.channel(n)?"channel":Array.isArray(n)?n.map(function(n){return n+""})+"":n+""}function b(n,t){function e(t,e){if(o===Cn)return _n;if(e)throw o=Cn,e;r&&r(t);var a=n[o](),u=a[1];return o=a[0],r=a[2],o===Cn?_n:u}var r=void 0,o=t;return u(e,function(n){return e(null,n)},arguments.length>2&&void 0!==arguments[2]?arguments[2]:"iterator",!0)}function k(n,t){for(var e=arguments.length,r=Array(e>2?e-2:0),o=2;e>o;o++)r[o-2]=arguments[o];var a={done:!1,value:C(n)},u=function(n){return{done:!1,value:j.apply(void 0,[t].concat(r,[n]))}},c=void 0,i=function(n){return c=n};return b({q1:function(){return["q2",a,i]},q2:function(){return c===mn?[Cn]:["q1",u(c)]}},"q1","takeEvery("+m(n)+", "+t.name+")")}function E(n,t){for(var e=arguments.length,r=Array(e>2?e-2:0),o=2;e>o;o++)r[o-2]=arguments[o];var a={done:!1,value:C(n)},u=function(n){return{done:!1,value:j.apply(void 0,[t].concat(r,[n]))}},c=function(n){return{done:!1,value:O(n)}},i=void 0,f=void 0,l=function(n){return i=n},s=function(n){return f=n};return b({q1:function(){return["q2",a,s]},q2:function(){return f===mn?[Cn]:i?["q3",c(i)]:["q1",u(f),l]},q3:function(){return["q1",u(f),l]}},"q1","takeLatest("+m(n)+", "+t.name+")")}function _(n,t,e){for(var r=arguments.length,o=Array(r>3?r-3:0),u=3;r>u;u++)o[u-3]=arguments[u];var c=void 0,i=void 0,f={done:!1,value:N(t,hn.sliding(1))},l=function(){return{done:!1,value:C(i)}},s=function(n){return{done:!1,value:j.apply(void 0,[e].concat(o,[n]))}},d={done:!1,value:S(a,n)},v=function(n){return c=n},g=function(n){return i=n};return b({q1:function(){return["q2",f,g]},q2:function(){return["q3",l(),v]},q3:function(){return c===mn?[Cn]:["q4",s(c)]},q4:function(){return["q2",d]}},"q1","throttle("+m(t)+", "+e.name+")")}function C(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"*";if(arguments.length&&t(arguments[0],$.notUndef,"take(patternOrChannel): patternOrChannel is undefined"),$.pattern(n))return Bn(Tn,{pattern:n});if($.channel(n))return Bn(Tn,{channel:n});throw Error("take(patternOrChannel): argument "+n+" is not valid channel or a valid pattern")}function A(n,e){return arguments.length>1?(t(n,$.notUndef,"put(channel, action): argument channel is undefined"),t(n,$.channel,"put(channel, action): argument "+n+" is not a valid channel"),t(e,$.notUndef,"put(channel, action): argument action is undefined")):(t(n,$.notUndef,"put(action): argument action is undefined"),e=n,n=null),Bn(On,{channel:n,action:e})}function x(n){return Bn(Nn,n)}function w(n,e,r){t(e,$.notUndef,n+": argument fn is undefined");var o=null;if($.array(e)){var a=e;o=a[0],e=a[1]}else if(e.fn){var u=e;o=u.context,e=u.fn}return o&&$.string(e)&&$.func(o[e])&&(e=o[e]),t(e,$.func,n+": argument "+e+" is not a function"),{context:o,fn:e,args:r}}function S(n){for(var t=arguments.length,e=Array(t>1?t-1:0),r=1;t>r;r++)e[r-1]=arguments[r];return Bn(Ln,w("call",n,e))}function j(n){for(var t=arguments.length,e=Array(t>1?t-1:0),r=1;t>r;r++)e[r-1]=arguments[r];return Bn(Un,w("fork",n,e))}function T(){for(var n=arguments.length,e=Array(n),r=0;n>r;r++)e[r]=arguments[r];if(e.length>1)return x(e.map(function(n){return T(n)}));var o=e[0];return t(o,$.notUndef,"join(task): argument task is undefined"),t(o,$.task,"join(task): argument "+o+" is not a valid Task object "+zn),Bn(Mn,o)}function O(){for(var n=arguments.length,e=Array(n),r=0;n>r;r++)e[r]=arguments[r];if(e.length>1)return x(e.map(function(n){return O(n)}));var o=e[0];return 1===e.length&&(t(o,$.notUndef,"cancel(task): argument task is undefined"),t(o,$.task,"cancel(task): argument "+o+" is not a valid Task object "+zn)),Bn(In,o||J)}function N(n,e){return t(n,$.notUndef,"actionChannel(pattern,...): argument pattern is undefined"),arguments.length>1&&(t(e,$.notUndef,"actionChannel(pattern, buffer): argument buffer is undefined"),t(e,$.buffer,"actionChannel(pattern, buffer): argument "+e+" is not a valid buffer")),Bn(Dn,{pattern:n,buffer:e})}function R(n){return("*"===n?$n.wildcard:$.array(n)?$n.array:$.stringableFunc(n)?$n.default:$.func(n)?$n.predicate:$n.default)(n)}function L(n,t,e){function o(n){u(),e(n,!0)}function a(n){c.push(n),n.cont=function(a,u){f||(r(c,n),n.cont=W,u?o(a):(n===t&&(i=a),c.length||(f=!0,e(i))))}}function u(){f||(f=!0,c.forEach(function(n){n.cont=W,n.cancel()}),c=[])}var c=[],i=void 0,f=!1;return a(t),{addTask:a,cancelAll:u,abort:o,getTasks:function(){return c},taskNames:function(){return c.map(function(n){return n.name})}}}function q(n){var t=n.context,e=n.fn,r=n.args;if($.iterator(e))return e;var o=void 0,a=void 0;try{o=e.apply(t,r)}catch(n){a=n}return $.iterator(o)?o:u(a?function(){throw a}:function(){var n=void 0,t={done:!1,value:o},e=function(n){return{done:!0,value:n}};return function(r){return n?e(r):(n=!0,t)}}())}function U(n,e){function a(){n._isRunning&&!n._isCancelled&&(n._isCancelled=!0,ln.cancelAll(),f(Zn))}function u(t,e){if(!fn.isRunning)throw Error("Trying to resume an already finished generator");try{var r=void 0;e?r=n.throw(t):t===Zn?(fn.isCancelled=!0,u.cancel(),r=$.func(n.return)?n.return(Zn):{done:!0,value:Zn}):r=t===Yn?$.func(n.return)?n.return():{done:!0}:n.next(t),r.done?(fn.isMainRunning=!1,fn.cont&&fn.cont(r.value)):l(r.value,K,"",u)}catch(n){fn.isCancelled&&rn(n),fn.isMainRunning=!1,fn.cont(n,!0)}}function f(t,e){n._isRunning=!1,e?(t instanceof Error&&Object.defineProperty(t,"sagaStack",{value:"at "+z+" \n "+(t.sagaStack||t.stack),configurable:!0}),un.cont||(t instanceof Error&&Y?Y(t):rn(t)),n._error=t,n._isAborted=!0,n._deferredEnd&&n._deferredEnd.reject(t)):(n._result=t,n._deferredEnd&&n._deferredEnd.resolve(t)),un.cont&&un.cont(t,e),un.joiners.forEach(function(n){return n.cb(t,e)}),un.joiners=null}function l(n,t){function e(n,t){u||(u=!0,o.cancel=W,V&&(t?V.effectRejected(a,n):V.effectResolved(a,n)),o(n,t))}var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",o=arguments[3],a=en();V&&V.effectTriggered({effectId:a,parentEffectId:t,label:r,effect:n});var u=void 0;e.cancel=W,o.cancel=function(){if(!u){u=!0;try{e.cancel()}catch(n){rn(n)}e.cancel=W,V&&V.effectCancelled(a)}};var c=void 0;return $.promise(n)?v(n,e):$.helper(n)?E(nt(n),a,e):$.iterator(n)?p(n,a,z,e):$.array(n)?Q(n,a,e):(c=Vn.take(n))?y(c,e):(c=Vn.put(n))?m(c,e):(c=Vn.all(n))?A(c,a,e):(c=Vn.race(n))?x(c,a,e):(c=Vn.call(n))?b(c,a,e):(c=Vn.cps(n))?k(c,e):(c=Vn.fork(n))?E(c,a,e):(c=Vn.join(n))?_(c,e):(c=Vn.cancel(n))?C(c,e):(c=Vn.select(n))?w(c,e):(c=Vn.actionChannel(n))?S(c,e):(c=Vn.flush(n))?T(c,e):(c=Vn.cancelled(n))?j(c,e):(c=Vn.getContext(n))?O(c,e):(c=Vn.setContext(n))?N(c,e):e(n)}function v(n,t){var e=n[B];$.func(e)?t.cancel=e:$.func(n.abort)&&(t.cancel=function(){return n.abort()}),n.then(t,function(n){return t(n,!0)})}function p(n,t,r,o){U(n,e,M,I,on,G,t,r,o)}function y(n,t){var r=n.channel,o=n.pattern,a=n.maybe;r=r||e;var u=function(n){return n instanceof Error?t(n,!0):t(bn(n)&&!a?Yn:n)};try{r.take(u,R(o))}catch(n){return void t(n,!0)}t.cancel=u.cancel}function m(n,t){var e=n.channel,r=n.action,o=n.resolve;s(function(){var n=void 0;try{n=(e?e.put:M)(r)}catch(n){return rn(n),void t(n,!0)}o&&$.promise(n)?v(n,t):t(n)})}function b(n,t,e){var r=n.context,o=n.fn,a=n.args,u=void 0;try{u=o.apply(r,a)}catch(n){return void e(n,!0)}return $.promise(u)?v(u,e):$.iterator(u)?p(u,t,o.name,e):e(u)}function k(n,t){var e=n.context,r=n.fn,o=n.args;try{var a=function(n,e){return $.undef(n)?t(e):t(n,!0)};r.apply(e,o.concat(a)),a.cancel&&(t.cancel=function(){return a.cancel()})}catch(n){return void t(n,!0)}}function E(n,t,r){var o=n.fn,a=n.detached,u=q({context:n.context,fn:o,args:n.args});try{d();var c=U(u,e,M,I,on,G,t,o.name,a?null:W);a?r(c):u._isRunning?(ln.addTask(c),r(c)):u._error?ln.abort(u._error):r(c)}finally{g()}}function _(n,t){if(n.isRunning()){var e={task:un,cb:t};t.cancel=function(){return r(n.joiners,e)},n.joiners.push(e)}else n.isAborted()?t(n.error(),!0):t(n.result())}function C(n,t){n===J&&(n=un),n.isRunning()&&n.cancel(),t()}function A(n,t,e){function r(){a===o.length&&(u=!0,e($.array(n)?tn.from(D({},c,{length:o.length})):c))}var o=Object.keys(n);if(o.length){var a=0,u=void 0,c={},i={};o.forEach(function(n){var t=function(t,o){u||(o||bn(t)||t===Yn||t===Zn?(e.cancel(),e(t,o)):(c[n]=t,a++,r()))};t.cancel=W,i[n]=t}),e.cancel=function(){u||(u=!0,o.forEach(function(n){return i[n].cancel()}))},o.forEach(function(e){return l(n[e],t,e,i[e])})}else e($.array(n)?[]:{})}function x(n,t,e){var r=void 0,o=Object.keys(n),a={};o.forEach(function(t){var u=function(a,u){if(!r)if(u)e.cancel(),e(a,!0);else if(!bn(a)&&a!==Yn&&a!==Zn){var c;e.cancel(),r=!0;var i=(c={},c[t]=a,c);e($.array(n)?[].slice.call(D({},i,{length:o.length})):i)}};u.cancel=W,a[t]=u}),e.cancel=function(){r||(r=!0,o.forEach(function(n){return a[n].cancel()}))},o.forEach(function(e){r||l(n[e],t,e,a[e])})}function w(n,t){var e=n.selector,r=n.args;try{var o=e.apply(void 0,[I()].concat(r));t(o)}catch(n){t(n,!0)}}function S(n,t){var r=n.pattern,o=h(n.buffer),a=R(r);e.take(function n(t){bn(t)||e.take(n,a),o.put(t)},a),t(o)}function j(n,t){t(!!fn.isCancelled)}function T(n,t){n.flush(t)}function O(n,t){t(on[n])}function N(n,t){nn.assign(on,n),t()}var M=arguments.length>2&&void 0!==arguments[2]?arguments[2]:W,I=arguments.length>3&&void 0!==arguments[3]?arguments[3]:W,H=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},G=arguments.length>5&&void 0!==arguments[5]?arguments[5]:{},K=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,z=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"anonymous",X=arguments[8];t(n,$.iterator,Wn);var Q=i(A,an("[...effects]","all([...effects])")),V=G.sagaMonitor,Y=G.onError,Z=G.logger||c,rn=function(n){var t=n.sagaStack;!t&&n.stack&&(t=-1!==n.stack.split("\n")[0].indexOf(n.message)?n.stack:"Error: "+n.message+"\n"+n.stack),Z("error","uncaught at "+z,t||n.message||n)},on=Object.create(H);u.cancel=W;var un=function(n,e,r,u){var c,i;return r._deferredEnd=null,c={},c[F]=!0,c.id=n,c.name=e,i={},i.done=i.done||{},i.done.get=function(){if(r._deferredEnd)return r._deferredEnd.promise;var n=o();return r._deferredEnd=n,r._isRunning||(r._error?n.reject(r._error):n.resolve(r._result)),n.promise},c.cont=u,c.joiners=[],c.cancel=a,c.isRunning=function(){return r._isRunning},c.isCancelled=function(){return r._isCancelled},c.isAborted=function(){return r._isAborted},c.result=function(){return r._result},c.error=function(){return r._error},c.setContext=function(n){t(n,$.object,cn("task",n)),nn.assign(on,n)},P(c,i),c}(K,z,n,X),fn={name:z,cancel:function(){fn.isRunning&&!fn.isCancelled&&(fn.isCancelled=!0,u(Zn))},isRunning:!0},ln=L(z,fn,f);return X&&(X.cancel=a),n._isRunning=!0,u(),un}function M(n,e){for(var r=arguments.length,o=Array(r>2?r-2:0),a=2;r>a;a++)o[a-2]=arguments[a];var u=void 0;$.iterator(n)?(u=n,n=e):(t(e,$.func,tt),t(u=e.apply(void 0,o),$.iterator,tt));var c=n,i=c.channel,f=c.subscribe,l=void 0===f?W:f,s=c.dispatch,d=c.getState,v=c.context,g=c.sagaMonitor,h=c.logger,p=c.onError,m=en();g&&(g.effectTriggered=g.effectTriggered||W,g.effectResolved=g.effectResolved||W,g.effectRejected=g.effectRejected||W,g.effectCancelled=g.effectCancelled||W,g.actionDispatched=g.actionDispatched||W,g.effectTriggered({effectId:m,root:!0,parentEffectId:0,effect:{root:!0,saga:e,args:o}}));var b=U(u,i||function(){var n=y(),t=l(n.put);return D({},n,{close:function(){$.func(t)&&t(),n.close()}})}(),fn(s),d,v,{sagaMonitor:g,logger:h,onError:p},m,e.name);return g&&g.effectResolved(m,b),b}var I="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},P=function(n,t){for(var e in t){var r=t[e];r.configurable=r.enumerable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(n,e,r)}return n},D=Object.assign||function(n){for(var t=1;arguments.length>t;t++){var e=arguments[t];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r])}return n},H=function(n,t){var e={};for(var r in n)0>t.indexOf(r)&&Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);return e},G=function(n){return"@@redux-saga/"+n},F=G("TASK"),K=G("HELPER"),z=G("MATCH"),B=G("CANCEL_PROMISE"),X=G("SAGA_ACTION"),J=G("SELF_CANCELLATION"),Q=function(n){return function(){return n}},V=Q(!0),W=function(){},Y=function(n){return n},Z=Object.prototype.hasOwnProperty,$={undef:function(n){return null===n||void 0===n},notUndef:function(n){return null!==n&&void 0!==n},func:function(n){return"function"==typeof n},number:function(n){return"number"==typeof n},string:function(n){return"string"==typeof n},array:Array.isArray,object:function(n){return n&&!$.array(n)&&"object"===(void 0===n?"undefined":I(n))},promise:function(n){return n&&$.func(n.then)},iterator:function(n){return n&&$.func(n.next)&&$.func(n.throw)},iterable:function(n){return n&&$.func(Symbol)?$.func(n[Symbol.iterator]):$.array(n)},task:function(n){return n&&n[F]},observable:function(n){return n&&$.func(n.subscribe)},buffer:function(n){return n&&$.func(n.isEmpty)&&$.func(n.take)&&$.func(n.put)},pattern:function(n){return n&&($.string(n)||"symbol"===(void 0===n?"undefined":I(n))||$.func(n)||$.array(n))},channel:function(n){return n&&$.func(n.take)&&$.func(n.close)},helper:function(n){return n&&n[K]},stringableFunc:function(n){return $.func(n)&&e(n,"toString")}},nn={assign:function(n,t){for(var r in t)e(t,r)&&(n[r]=t[r])}},tn={from:function(n){var t=Array(n.length);for(var r in n)e(n,r)&&(t[r]=n[r]);return t}},en=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;return function(){return++n}}(),rn=function(n){throw n},on=function(n){return{value:n,done:!0}},an=function(n,t){return n+" has been deprecated in favor of "+t+", please update your code"},un=function(n){return Error("\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: "+n+"\n")},cn=function(n,t){return(n?n+".":"")+"setContext(props): argument "+t+" is not a plain object"},fn=function(n){return function(t){return n(Object.defineProperty(t,X,{value:!0}))}},ln="Channel's Buffer overflow!",sn=1,dn=3,vn=4,gn={isEmpty:V,put:W,take:W},hn={none:function(){return gn},fixed:function(n){return f(n,sn)},dropping:function(n){return f(n,2)},sliding:function(n){return f(n,dn)},expanding:function(n){return f(n,vn)}},pn=[],yn=0,mn={type:"@@redux-saga/CHANNEL_END"},bn=function(n){return n&&"@@redux-saga/CHANNEL_END"===n.type},kn="invalid buffer passed to channel factory function",En="Saga was provided with an undefined action",_n={done:!0,value:void 0},Cn={},An=function(n){return"import { "+n+" } from 'redux-saga' has been deprecated in favor of import { "+n+" } from 'redux-saga/effects'.\nThe latter will not work with yield*, as helper effects are wrapped automatically for you in fork effect.\nTherefore yield "+n+" will return task descriptor to your saga and execute next lines of code."},xn=i(k,An("takeEvery")),wn=i(E,An("takeLatest")),Sn=i(_,An("throttle")),jn=G("IO"),Tn="TAKE",On="PUT",Nn="ALL",Rn="RACE",Ln="CALL",qn="CPS",Un="FORK",Mn="JOIN",In="CANCEL",Pn="SELECT",Dn="ACTION_CHANNEL",Hn="CANCELLED",Gn="FLUSH",Fn="GET_CONTEXT",Kn="SET_CONTEXT",zn="\n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)",Bn=function(n,t){var e;return e={},e[jn]=!0,e[n]=t,e},Xn=function(n){return t(Vn.fork(n),$.object,"detach(eff): argument must be a fork effect"),n[Un].detached=!0,n},Jn=i(C.maybe=function(){var n=C.apply(void 0,arguments);return n[Tn].maybe=!0,n},an("takem","take.maybe"));A.sync=i(A.resolve=function(){var n=A.apply(void 0,arguments);return n[On].resolve=!0,n},an("put.sync","put.resolve"));var Qn=function(n){return function(t){return t&&t[jn]&&t[n]}},Vn={take:Qn(Tn),put:Qn(On),all:Qn(Nn),race:Qn(Rn),call:Qn(Ln),cps:Qn(qn),fork:Qn(Un),join:Qn(Mn),cancel:Qn(In),select:Qn(Pn),actionChannel:Qn(Dn),cancelled:Qn(Hn),flush:Qn(Gn),getContext:Qn(Fn),setContext:Qn(Kn)},Wn="proc first argument (Saga function result) must be an iterator",Yn={toString:function(){return"@@redux-saga/CHANNEL_END"}},Zn={toString:function(){return"@@redux-saga/TASK_CANCEL"}},$n={wildcard:function(){return V},default:function(n){return"symbol"===(void 0===n?"undefined":I(n))?function(t){return t.type===n}:function(t){return t.type===n+""}},array:function(n){return function(t){return n.some(function(n){return R(n)(t)})}},predicate:function(n){return function(t){return n(t)}}},nt=function(n){return{fn:n}},tt="runSaga(storeInterface, saga, ...args): saga argument must be a Generator function!";n.default=function(){function n(t){var e=t.getState,r=t.dispatch,f=y();return f.put=(a.emitter||Y)(f.put),n.run=M.bind(null,{context:o,channel:f,dispatch:r,getState:e,sagaMonitor:u,logger:c,onError:i}),function(n){return function(t){u&&u.actionDispatched&&u.actionDispatched(t);var e=n(t);return f.put(t),e}}}var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e.context,o=void 0===r?{}:r,a=H(e,["context"]),u=a.sagaMonitor,c=a.logger,i=a.onError;if($.func(a))throw Error("Saga middleware no longer accept Generator functions. Use sagaMiddleware.run instead");if(c&&!$.func(c))throw Error("`options.logger` passed to the Saga middleware is not a function!");if(i&&!$.func(i))throw Error("`options.onError` passed to the Saga middleware is not a function!");if(a.emitter&&!$.func(a.emitter))throw Error("`options.emitter` passed to the Saga middleware is not a function!");return n.run=function(){throw Error("Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware")},n.setContext=function(n){t(n,$.object,cn("sagaMiddleware",n)),nn.assign(o,n)},n},n.effects=Object.freeze({take:C,takem:Jn,put:A,all:x,race:function(n){return Bn(Rn,n)},call:S,apply:function(n,t){return Bn(Ln,w("apply",{context:n,fn:t},arguments.length>2&&void 0!==arguments[2]?arguments[2]:[]))},cps:function(n){for(var t=arguments.length,e=Array(t>1?t-1:0),r=1;t>r;r++)e[r-1]=arguments[r];return Bn(qn,w("cps",n,e))},fork:j,spawn:function(n){for(var t=arguments.length,e=Array(t>1?t-1:0),r=1;t>r;r++)e[r-1]=arguments[r];return Xn(j.apply(void 0,[n].concat(e)))},join:T,cancel:O,select:function(n){for(var e=arguments.length,r=Array(e>1?e-1:0),o=1;e>o;o++)r[o-1]=arguments[o];return 0===arguments.length?n=Y:(t(n,$.notUndef,"select(selector,[...]): argument selector is undefined"),t(n,$.func,"select(selector,[...]): argument "+n+" is not a function")),Bn(Pn,{selector:n,args:r})},actionChannel:N,cancelled:function(){return Bn(Hn,{})},flush:function(n){return t(n,$.channel,"flush(channel): argument "+n+" is not valid channel"),Bn(Gn,n)},getContext:function(n){return t(n,$.string,"getContext(prop): argument "+n+" is not a string"),Bn(Fn,n)},setContext:function(n){return t(n,$.object,cn(null,n)),Bn(Kn,n)},takeEvery:function(n,t){for(var e=arguments.length,r=Array(e>2?e-2:0),o=2;e>o;o++)r[o-2]=arguments[o];return j.apply(void 0,[k,n,t].concat(r))},takeLatest:function(n,t){for(var e=arguments.length,r=Array(e>2?e-2:0),o=2;e>o;o++)r[o-2]=arguments[o];return j.apply(void 0,[E,n,t].concat(r))},throttle:function(n,t,e){for(var r=arguments.length,o=Array(r>3?r-3:0),a=3;r>a;a++)o[a-3]=arguments[a];return j.apply(void 0,[_,n,t,e].concat(o))}}),n.utils=Object.freeze({TASK:F,SAGA_ACTION:X,noop:W,is:$,deferred:o,arrayOfDeffered:function(n){for(var t=[],e=0;n>e;e++)t.push(o());return t},createMockTask:function(){var n,t=!0,e=void 0,r=void 0;return n={},n[F]=!0,n.isRunning=function(){return t},n.result=function(){return e},n.error=function(){return r},n.setRunning=function(n){return t=n},n.setResult=function(n){return e=n},n.setError=function(n){return r=n},n},cloneableGenerator:function n(t){return function(){for(var e=arguments.length,r=Array(e),o=0;e>o;o++)r[o]=arguments[o];var a=[],u=t.apply(void 0,r);return{next:function(n){return a.push(n),u.next(n)},clone:function(){var e=n(t).apply(void 0,r);return a.forEach(function(n){return e.next(n)}),e},return:function(n){return u.return(n)},throw:function(n){return u.throw(n)}}}},asEffect:Vn,CHANNEL_END:Yn}),n.runSaga=M,n.END=mn,n.eventChannel=function(n){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:hn.none(),r=arguments[2];arguments.length>2&&t(r,$.func,"Invalid match function passed to eventChannel");var o=h(e),a=function(){o.__closed__||(u&&u(),o.close())},u=n(function(n){bn(n)?a():r&&!r(n)||o.put(n)});if(o.__closed__&&u(),!$.func(u))throw Error("in eventChannel: subscribe should return a function to unsubscribe");return{take:o.take,flush:o.flush,close:a}},n.channel=h,n.multicast=p,n.stdChannel=y,n.buffers=hn,n.takeEvery=xn,n.takeLatest=wn,n.throttle=Sn,n.delay=a,n.CANCEL=B,n.detach=Xn,Object.defineProperty(n,"__esModule",{value:!0})}); +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.ReduxSaga={})}(this,function(n){"use strict";function t(n){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n})(n)}function r(){return(r=Object.assign||function(n){for(var t=1;arguments.length>t;t++){var r=arguments[t];for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(n[e]=r[e])}return n}).apply(this,arguments)}function e(n,t){return Q.notUndef(n)&&J.call(n,t)}function o(n,t){var r=n.indexOf(t);0>r||n.splice(r,1)}function u(n){var t=!1;return function(){t||(t=!0,n())}}function c(n){void 0===n&&(n={});var t=r({},n),e=new Promise(function(n,r){t.resolve=n,t.reject=r});return t.promise=e,t}function i(n,t){void 0===t&&(t=!0);var r,e=new Promise(function(e){r=setTimeout(function(){return e(t)},n)});return e[q]=function(){return clearTimeout(r)},e}function a(n,t,r){void 0===t&&(t=Z),void 0===r&&(r="iterator");var e={name:r,next:n,throw:t,return:$};return"undefined"!=typeof Symbol&&(e[Symbol.iterator]=function(){return e}),e}function f(n,t){void 0===n&&(n=10);var r=Array(n),e=0,o=0,u=0,c=function(t){r[o]=t,o=(o+1)%n,e++},i=function(){if(0!=e){var t=r[u];return r[u]=null,e--,u=(u+1)%n,t}},a=function(){for(var n=[];e;)n.push(i());return n};return{isEmpty:function(){return 0==e},put:function(i){if(n>e)c(i);else{var f;switch(t){case en:throw Error(rn);case on:r[o]=i,u=o=(o+1)%n;break;case un:f=2*n,r=a(),e=r.length,o=r.length,u=0,r.length=f,n=f,c(i)}}},take:i,flush:a}}function l(n){dn.push(n),vn||(s(),v())}function s(){vn++}function d(){vn--}function v(){d();for(var n;!vn&&void 0!==(n=dn.shift());)!function(n){try{s(),n()}finally{d()}}(n)}function p(n){var t="*"===n?bn:Q.string(n)?hn:Q.array(n)?pn:Q.stringableFunc(n)?hn:Q.func(n)?gn:Q.symbol(n)?yn:null;if(null===t)throw Error("invalid pattern: "+n);return t(n)}function g(n){function t(){if(r&&e.length)throw nn("Cannot have a closed channel with pending takers");if(e.length&&!n.isEmpty())throw nn("Cannot have pending takers with non empty buffer")}void 0===n&&(n=ln());var r=!1,e=[];return{take:function(u){t(),r&&n.isEmpty()?u(mn):n.isEmpty()?(e.push(u),u.cancel=function(){return o(e,u)}):u(n.take())},put:function(o){if(t(),!r){if(!e.length)return n.put(o);var u=e[0];e.splice(0,1),u(o)}},flush:function(e){t(),e(r&&n.isEmpty()?mn:n.flush())},close:function(){if(t(),!r&&(r=!0,e.length)){var n=e;e=[];for(var o=0,u=n.length;u>o;o++)(0,n[o])(mn)}}}}function h(){var n,t=!1,r=[],e=r,c=function(){e===r&&(e=r.slice())},i=function(){t=!0;for(var n=r=e,o=0;n.length>o;o++)(0,n[o])(mn);e=[]};return n={},n[D]=!0,n.put=function(n){if(!t)if(En(n))i();else for(var o=r=e,u=0;o.length>u;u++){var c=o[u];c[P](n)&&(c.cancel(),c(n))}},n.take=function(n,r){void 0===r&&(r=bn),t?n(mn):(n[P]=r,c(),e.push(n),n.cancel=u(function(){c(),o(e,n)}))},n.close=i,n}function y(){var n=h(),t=n.put;return n.put=function(n){n[F]?t(n):l(function(){return t(n)})},n}function b(n){return Q.channel(n)?"channel":Q.stringableFunc(n)?n+"":Q.func(n)?n.name:n+""}function m(n,t,r){function e(t,r){if(u===jn)return kn;if(r)throw u=jn,r;o&&o(t);var e=n[u]();return u=e[0],o=e[2],u===jn?kn:e[1]}var o,u=t;return a(e,function(n){return e(null,n)},r)}function E(n,t){if(void 0===n&&(n="*"),Q.pattern(n))return Un(On,{pattern:n});if(Q.multicast(n)&&Q.notUndef(t)&&Q.pattern(t))return Un(On,{channel:n,pattern:t});if(Q.channel(n))return Un(On,{channel:n});throw Error("take(patternOrChannel): argument "+n+" is not valid channel or a valid pattern")}function C(n,t){return Q.undef(t)&&(t=n,n=null),Un(Sn,{channel:n,action:t})}function A(n){return Un(_n,n)}function k(n,t,r){var e=null;if(Q.array(t)){var o=t;e=o[0],t=o[1]}else if(t.fn){var u=t;e=u.context,t=u.fn}return e&&Q.string(t)&&Q.func(e[t])&&(t=e[t]),{context:e,fn:t,args:r}}function j(n){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];return Un(xn,k(0,n,r))}function O(n){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];return Un(Rn,k(0,n,r))}function S(){for(var n=arguments.length,t=Array(n),r=0;n>r;r++)t[r]=arguments[r];return t.length>1?A(t.map(function(n){return S(n)})):Un(Nn,t[0])}function _(){for(var n=arguments.length,t=Array(n),r=0;n>r;r++)t[r]=arguments[r];if(t.length>1)return A(t.map(function(n){return _(n)}));var e=t[0];return Un(qn,e||U)}function w(n,t){return Un(Mn,{pattern:n,buffer:t})}function x(n,t,e,u,i,f,d,h,y){function b(){n._isRunning&&!n._isCancelled&&(n._isCancelled=!0,I.cancelAll(),E(Bn))}function m(t,r){if(!M.isRunning)throw Error("Trying to resume an already finished generator");try{var e;r?e=n.throw(t):t===Bn?(M.isCancelled=!0,m.cancel(),e=Q.func(n.return)?n.return(Bn):{done:!0,value:Bn}):e=t===zn?Q.func(n.return)?n.return():{done:!0}:n.next(t),e.done?(M.isMainRunning=!1,M.cont&&M.cont(e.value)):A(e.value,d,"",m)}catch(n){M.isCancelled&&R(n),M.isMainRunning=!1,M.cont(n,!0)}}function E(t,r){n._isRunning=!1,r?(t instanceof Error&&Object.defineProperty(t,"sagaStack",{value:"at "+h+" \n "+(t.sagaStack||t.stack),configurable:!0}),L.cont||(t instanceof Error&&_?_(t):R(t)),n._error=t,n._isAborted=!0,n._deferredEnd&&n._deferredEnd.reject(t)):(n._result=t,n._deferredEnd&&n._deferredEnd.resolve(t)),L.cont&&L.cont(t,r),L.joiners.forEach(function(n){return n.cb(t,r)}),L.joiners=null}function C(n,c,i,d){void 0===i&&(i="");var y;return Q.promise(n)?k(n,d):Q.iterator(n)?j(n,c,h,d):(y=Gn.take(n))?function(n,r){var e=n.channel,o=void 0===e?t:e,u=n.pattern,c=n.maybe,i=function(n){n instanceof Error?r(n,!0):r(!En(n)||c?n:zn)};try{o.take(i,Q.notUndef(u)?p(u):null)}catch(n){return void r(n,!0)}r.cancel=i.cancel}(y,d):(y=Gn.put(n))?function(n,t){var r=n.channel,o=n.action,u=n.resolve;l(function(){var n;try{n=(r?r.put:e)(o)}catch(n){return R(n),void t(n,!0)}u&&Q.promise(n)?k(n,t):t(n)})}(y,d):(y=Gn.all(n))?function(n,t,e){var o=Object.keys(n);if(!o.length)return void e(Q.array(n)?[]:{});var u,c=0,i={},a={};o.forEach(function(t){var f=function(a,f){u||(f||En(a)||a===zn||a===Bn?(e.cancel(),e(a,f)):(i[t]=a,++c===o.length&&(u=!0,e(Q.array(n)?W.from(r({},i,{length:o.length})):i))))};f.cancel=B,a[t]=f}),e.cancel=function(){u||(u=!0,o.forEach(function(n){return a[n].cancel()}))},o.forEach(function(r){return A(n[r],t,r,a[r])})}(y,c,d):(y=Gn.race(n))?function(n,t,e){var o,u=Object.keys(n),c={};u.forEach(function(t){var i=function(c,i){if(!o)if(i)e.cancel(),e(c,!0);else if(!En(c)&&c!==zn&&c!==Bn){var a;e.cancel(),o=!0;var f=(a={},a[t]=c,a);e(Q.array(n)?[].slice.call(r({},f,{length:u.length})):f)}};i.cancel=B,c[t]=i}),e.cancel=function(){o||(o=!0,u.forEach(function(n){return c[n].cancel()}))},u.forEach(function(r){o||A(n[r],t,r,c[r])})}(y,c,d):(y=Gn.call(n))?function(n,t,r){var e,o=n.context,u=n.fn,c=n.args;try{e=u.apply(o,c)}catch(n){return void r(n,!0)}return Q.promise(e)?k(e,r):Q.iterator(e)?j(e,t,u.name,r):r(e)}(y,c,d):(y=Gn.cps(n))?function(n,t){var r=n.context,e=n.fn,o=n.args;try{var u=function(n,r){return Q.undef(n)?t(r):t(n,!0)};e.apply(r,o.concat(u)),u.cancel&&(t.cancel=function(){return u.cancel()})}catch(n){return void t(n,!0)}}(y,d):(y=Gn.fork(n))?function(n,r,o){var c=n.fn,i=n.detached,l=function(n){var t=n.context,r=n.fn,e=n.args;if(Q.iterator(r))return r;var o,u;try{o=r.apply(t,e)}catch(n){u=n}return Q.iterator(o)?o:a(u?function(){throw u}:function(){var n,t={done:!1,value:o};return function(r){return n?function(n){return{done:!0,value:r}}():(n=!0,t)}}())}({context:n.context,fn:c,args:n.args});try{s();var d=x(l,t,e,u,N,f,r,c.name,i?null:B);i?o(d):l._isRunning?(I.addTask(d),o(d)):l._error?I.abort(l._error):o(d)}finally{v()}}(y,c,d):(y=Gn.join(n))?function(n,t){if(n.isRunning()){var r={task:L,cb:t};t.cancel=function(){return o(n.joiners,r)},n.joiners.push(r)}else n.isAborted()?t(n.error(),!0):t(n.result())}(y,d):(y=Gn.cancel(n))?function(n,t){n===U&&(n=L);n.isRunning()&&n.cancel();t()}(y,d):(y=Gn.select(n))?function(n,t){var r=n.selector,e=n.args;try{var o=r.apply(void 0,[u()].concat(e));t(o)}catch(n){t(n,!0)}}(y,d):(y=Gn.actionChannel(n))?function(n,r){var e=n.pattern,o=g(n.buffer),u=p(e);t.take(function n(r){En(r)||t.take(n,u),o.put(r)},u),r(o)}(y,d):(y=Gn.flush(n))?function(n,t){n.flush(t)}(y,d):(y=Gn.cancelled(n))?function(n,t){t(!!M.isCancelled)}(0,d):(y=Gn.getContext(n))?function(n,t){t(N[n])}(y,d):(y=Gn.setContext(n))?function(n,t){V.assign(N,n),t()}(y,d):d(n)}function A(n,t,r,e){function o(n,t){c||(c=!0,e.cancel=B,S&&(t?S.effectRejected(u,n):S.effectResolved(u,n)),e(n,t))}void 0===r&&(r="");var u=Y();S&&S.effectTriggered({effectId:u,parentEffectId:t,label:r,effect:n});var c;o.cancel=B,e.cancel=function(){if(!c){c=!0;try{o.cancel()}catch(n){R(n)}o.cancel=B,S&&S.effectCancelled(u)}},Q.func(w)?w(function(n){return C(n,u,r,o)})(n):C(n,u,r,o)}function k(n,t){var r=n[q];Q.func(r)?t.cancel=r:Q.func(n.abort)&&(t.cancel=function(){return n.abort()}),n.then(t,function(n){return t(n,!0)})}function j(n,r,o,c){x(n,t,e,u,N,f,r,o,c)}void 0===e&&(e=B),void 0===u&&(u=B),void 0===i&&(i={}),void 0===f&&(f={}),void 0===d&&(d=0),void 0===h&&(h="anonymous");var O=f,S=O.sagaMonitor,_=O.onError,w=O.middleware,T=O.logger||function(n,t,r){void 0===r&&(r=""),"undefined"==typeof window?console.log("redux-saga "+n+": "+t+"\n"+(r&&r.stack||r)):console[n](t,r)},R=function(n){var t=n.sagaStack;!t&&n.stack&&(t=-1!==n.stack.split("\n")[0].indexOf(n.message)?n.stack:"Error: "+n.message+"\n"+n.stack),T("error","uncaught at "+h,t||n.message||n)},N=Object.create(i);m.cancel=B;var L=function(n,t,r,e){var o;return r._deferredEnd=null,o={},o[H]=!0,o.id=n,o.name=t,o.toPromise=function(){if(r._deferredEnd)return r._deferredEnd.promise;var n=c();return r._deferredEnd=n,r._isRunning||(r._isAborted?n.reject(r._error):n.resolve(r._result)),n.promise},o.cont=e,o.joiners=[],o.cancel=b,o.isRunning=function(){return r._isRunning},o.isCancelled=function(){return r._isCancelled},o.isAborted=function(){return r._isAborted},o.result=function(){return r._result},o.error=function(){return r._error},o.setContext=function(n){V.assign(N,n)},o}(d,h,n,y),M={name:h,cancel:function(){M.isRunning&&!M.isCancelled&&(M.isCancelled=!0,m(Bn))},isRunning:!0},I=function(n,t,r){function e(n){c(),r(n,!0)}function u(n){a.push(n),n.cont=function(u,c){f||(o(a,n),n.cont=B,c?e(u):(n===t&&(i=u),a.length||(f=!0,r(i))))}}function c(){f||(f=!0,a.forEach(function(n){n.cont=B,n.cancel()}),a=[])}var i,a=[],f=!1;return u(t),{addTask:u,cancelAll:c,abort:e,getTasks:function(){return a},taskNames:function(){return a.map(function(n){return n.name})}}}(0,M,E);return y&&(y.cancel=b),n._isRunning=!0,m(),L}function T(n,t){for(var r=arguments.length,e=Array(r>2?r-2:0),o=2;r>o;o++)e[o-2]=arguments[o];var u=t.apply(void 0,e),c=n.channel,i=void 0===c?y():c,a=n.dispatch,f=n.getState,l=n.context,s=n.sagaMonitor,d=n.logger,v=n.effectMiddlewares,p=n.onError,g=Y();s&&(s.effectTriggered=s.effectTriggered||B,s.effectResolved=s.effectResolved||B,s.effectRejected=s.effectRejected||B,s.effectCancelled=s.effectCancelled||B,s.actionDispatched=s.actionDispatched||B,s.effectTriggered({effectId:g,root:!0,parentEffectId:0,effect:{root:!0,saga:t,args:e}}));var h=v&&function(){for(var n=arguments.length,t=Array(n),r=0;n>r;r++)t[r]=arguments[r];return 0===t.length?function(n){return n}:1===t.length?t[0]:t.reduce(function(n,t){return function(){return n(t.apply(void 0,arguments))}})}.apply(void 0,v),b=x(u,i,tn(a),f,l,{sagaMonitor:s,logger:d,onError:p,middleware:h},g,t.name);return s&&s.effectResolved(g,b),b}var R,N=function(n){return n="@@redux-saga/"+n,"function"==typeof Symbol?Symbol(n):n},q=N("CANCEL_PROMISE"),L=N("CHANNEL_END"),M=N("CHANNEL_END"),I=N("IO"),P=N("MATCH"),D=N("MULTICAST"),F=N("SAGA_ACTION"),U=N("SELF_CANCELLATION"),H=N("TASK"),K=N("TASK_CANCEL"),G=function(n){return function(){return n}},z=G(!0),B=function(){},X=function(n){return n},J=Object.prototype.hasOwnProperty,Q={undef:function(n){return null===n||void 0===n},notUndef:function(n){return null!==n&&void 0!==n},func:function(n){return"function"==typeof n},number:function(n){return"number"==typeof n},string:function(n){return"string"==typeof n},array:Array.isArray,object:function(n){return n&&!Q.array(n)&&"object"===t(n)},promise:function(n){return n&&Q.func(n.then)},iterator:function(n){return n&&Q.func(n.next)&&Q.func(n.throw)},iterable:function(n){return n&&Q.func(Symbol)?Q.func(n[Symbol.iterator]):Q.array(n)},task:function(n){return n&&n[H]},observable:function(n){return n&&Q.func(n.subscribe)},buffer:function(n){return n&&Q.func(n.isEmpty)&&Q.func(n.take)&&Q.func(n.put)},pattern:function(n){return n&&(Q.string(n)||Q.symbol(n)||Q.func(n)||Q.array(n))},channel:function(n){return n&&Q.func(n.take)&&Q.func(n.close)},stringableFunc:function(n){return Q.func(n)&&e(n,"toString")},symbol:function(n){return"symbol"===t(n)},multicast:function(n){return Q.channel(n)&&n[D]}},V={assign:function(n,t){for(var r in t)e(t,r)&&(n[r]=t[r])}},W={from:function(n){var t=Array(n.length);for(var r in n)e(n,r)&&(t[r]=n[r]);return t}},Y=function(n){return void 0===n&&(n=0),function(){return++n}}(),Z=function(n){throw n},$=function(n){return{value:n,done:!0}},nn=function(n){return Error("\n redux-saga: Error checking hooks detected an inconsistent state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: "+n+"\n")},tn=function(n){return function(t){return n(Object.defineProperty(t,F,{value:!0}))}},rn="Channel's Buffer overflow!",en=1,on=3,un=4,cn={isEmpty:z,put:B,take:B},an=function(){return cn},fn=function(n){return f(n,on)},ln=function(n){return f(n,un)},sn=Object.freeze({none:an,fixed:function(n){return f(n,en)},dropping:function(n){return f(n,2)},sliding:fn,expanding:ln}),dn=[],vn=0,pn=function(n){return function(t){return n.some(function(n){return p(n)(t)})}},gn=function(n){return function(t){return n(t)}},hn=function(n){return function(t){return t.type===n+""}},yn=function(n){return function(t){return t.type===n}},bn=function(){return z},mn={type:M},En=function(n){return n&&n.type===M},Cn="object"==typeof global&&global&&global.Object===Object&&global,An="object"==typeof self&&self&&self.Object===Object&&self,kn=(Cn||An||Function("return this")(),Function.prototype.toString.call(Object),function(n){var t,r=n.Symbol;"function"==typeof r?r.observable?t=r.observable:(t=r("observable"),r.observable=t):t="@@observable"}(R="undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof module?module:Function("return this")()),{done:!0,value:void 0}),jn={},On="TAKE",Sn="PUT",_n="ALL",wn="RACE",xn="CALL",Tn="CPS",Rn="FORK",Nn="JOIN",qn="CANCEL",Ln="SELECT",Mn="ACTION_CHANNEL",In="CANCELLED",Pn="FLUSH",Dn="GET_CONTEXT",Fn="SET_CONTEXT",Un=function(n,t){var r;return r={},r[I]=!0,r[n]=t,r},Hn=function(n){return n[Rn].detached=!0,n},Kn=function(n){return function(t){return t&&t[I]&&t[n]}},Gn={take:Kn(On),put:Kn(Sn),all:Kn(_n),race:Kn(wn),call:Kn(xn),cps:Kn(Tn),fork:Kn(Rn),join:Kn(Nn),cancel:Kn(qn),select:Kn(Ln),actionChannel:Kn(Mn),cancelled:Kn(In),flush:Kn(Pn),getContext:Kn(Dn),setContext:Kn(Fn)},zn={toString:function(){return L}},Bn={toString:function(){return K}},Xn=Object.freeze({take:E,takeMaybe:function(){var n=E.apply(void 0,arguments);return n[On].maybe=!0,n},put:C,putResolve:function(){var n=C.apply(void 0,arguments);return n[Sn].resolve=!0,n},all:A,race:function(n){return Un(wn,n)},call:j,apply:function(n,t,r){return void 0===r&&(r=[]),Un(xn,k(0,{context:n,fn:t},r))},cps:function(n){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];return Un(Tn,k(0,n,r))},fork:O,spawn:function(n){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];return Hn(O.apply(void 0,[n].concat(r)))},join:S,cancel:_,select:function(n){void 0===n&&(n=X);for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];return Un(Ln,{selector:n,args:r})},actionChannel:w,cancelled:function(){return Un(In,{})},flush:function(n){return Un(Pn,n)},getContext:function(n){return Un(Dn,n)},setContext:function(n){return Un(Fn,n)},takeEvery:function(n,t){for(var r=arguments.length,e=Array(r>2?r-2:0),o=2;r>o;o++)e[o-2]=arguments[o];return O.apply(void 0,[function(n,t){for(var r=arguments.length,e=Array(r>2?r-2:0),o=2;r>o;o++)e[o-2]=arguments[o];var u,c={done:!1,value:E(n)};return m({q1:function(){return["q2",c,function(n){return u=n}]},q2:function(){return u===mn?[jn]:["q1",{done:!1,value:O.apply(void 0,[t].concat(e,[u]))}]}},"q1","takeEvery("+b(n)+", "+t.name+")")},n,t].concat(e))},takeLatest:function(n,t){for(var r=arguments.length,e=Array(r>2?r-2:0),o=2;r>o;o++)e[o-2]=arguments[o];return O.apply(void 0,[function(n,t){for(var r=arguments.length,e=Array(r>2?r-2:0),o=2;r>o;o++)e[o-2]=arguments[o];var u,c,i={done:!1,value:E(n)},a=function(n){return{done:!1,value:O.apply(void 0,[t].concat(e,[n]))}},f=function(n){return u=n};return m({q1:function(){return["q2",i,function(n){return c=n}]},q2:function(){return c===mn?[jn]:u?["q3",function(n){return{done:!1,value:_(n)}}(u)]:["q1",a(c),f]},q3:function(){return["q1",a(c),f]}},"q1","takeLatest("+b(n)+", "+t.name+")")},n,t].concat(e))},throttle:function(n,t,r){for(var e=arguments.length,o=Array(e>3?e-3:0),u=3;e>u;u++)o[u-3]=arguments[u];return O.apply(void 0,[function(n,t,r){for(var e=arguments.length,o=Array(e>3?e-3:0),u=3;e>u;u++)o[u-3]=arguments[u];var c,a,f={done:!1,value:w(t,fn(1))},l={done:!1,value:j(i,n)};return m({q1:function(){return["q2",f,function(n){return a=n}]},q2:function(){return["q3",{done:!1,value:E(a)},function(n){return c=n}]},q3:function(){return c===mn?[jn]:["q4",{done:!1,value:O.apply(void 0,[r].concat(o,[c]))}]},q4:function(){return["q2",l]}},"q1","throttle("+b(t)+", "+r.name+")")},n,t,r].concat(o))}}),Jn=Object.freeze({noop:B,is:Q,deferred:c,arrayOfDeferred:function(n){for(var t=[],r=0;n>r;r++)t.push(c());return t},createMockTask:function(){var n,t,r,e=!0;return n={},n[H]=!0,n.isRunning=function(){return e},n.result=function(){return t},n.error=function(){return r},n.setRunning=function(n){return e=n},n.setResult=function(n){return t=n},n.setError=function(n){return r=n},n},cloneableGenerator:function n(t){return function(){for(var r=arguments.length,e=Array(r),o=0;r>o;o++)e[o]=arguments[o];var u=[],c=t.apply(void 0,e);return{next:function(n){return u.push(n),c.next(n)},clone:function(){var r=n(t).apply(void 0,e);return u.forEach(function(n){return r.next(n)}),r},return:function(n){return c.return(n)},throw:function(n){return c.throw(n)}}}},SAGA_ACTION:F,TASK:H,asEffect:Gn,CHANNEL_END:zn});n.default=function(n){function t(n){var r=n.getState,e=n.dispatch,l=y();return l.put=(u.emitter||X)(l.put),t.run=T.bind(null,{context:o,channel:l,dispatch:e,getState:r,sagaMonitor:c,logger:i,onError:a,effectMiddlewares:f}),function(n){return function(t){c&&c.actionDispatched&&c.actionDispatched(t);var r=n(t);return l.put(t),r}}}void 0===n&&(n={});var r=n,e=r.context,o=void 0===e?{}:e,u=function(n,t){if(null==n)return{};var r,e,o={},u=Object.keys(n);for(e=0;u.length>e;e++)0>t.indexOf(r=u[e])&&(o[r]=n[r]);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(n);for(e=0;c.length>e;e++)0>t.indexOf(r=c[e])&&Object.prototype.propertyIsEnumerable.call(n,r)&&(o[r]=n[r])}return o}(r,["context"]),c=u.sagaMonitor,i=u.logger,a=u.onError,f=u.effectMiddlewares;return t.run=function(){throw Error("Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware")},t.setContext=function(n){V.assign(o,n)},t},n.effects=Xn,n.utils=Jn,n.buffers=sn,n.runSaga=T,n.END=mn,n.eventChannel=function(n,t){void 0===t&&(t=an());var r,e=!1,o=g(t),c=function(){Q.func(r)&&r(),o.close()};if(r=n(function(n){if(En(n))return c(),void(e=!0);o.put(n)}),!Q.func(r))throw Error("in eventChannel: subscribe should return a function to unsubscribe");return r=u(r),e&&r(),{take:o.take,flush:o.flush,close:c}},n.channel=g,n.multicastChannel=h,n.stdChannel=y,n.CANCEL=q,n.delay=i,n.detach=Hn,Object.defineProperty(n,"__esModule",{value:!0})}); diff --git a/examples/async/webpack.config.js b/examples/async/webpack.config.js index 5adb8be86..bfa2e43c2 100644 --- a/examples/async/webpack.config.js +++ b/examples/async/webpack.config.js @@ -5,51 +5,50 @@ module.exports = { devtool: 'cheap-module-eval-source-map', entry: [ 'webpack-hot-middleware/client?reload=true', - path.join(__dirname, 'src', 'main') + path.join(__dirname, 'src', 'main'), ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js', - publicPath: '/static/' + publicPath: '/static/', }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('development') - }) + 'process.env.NODE_ENV': JSON.stringify('development'), + }), ], module: { - loaders: [{ + rules: [{ test: /\.js$/, - loaders: [ 'babel' ], + use: [ 'babel-loader' ], exclude: /node_modules/, - include: __dirname - }] - } + include: __dirname, + }], + }, } -// When inside Redux repo, prefer src to compiled version. +// When inside Redux-Saga repo, prefer src to compiled version. // You can safely delete these lines in your project. var reduxSagaSrc = path.join(__dirname, '..', '..', 'src') var reduxNodeModules = path.join(__dirname, '..', '..', 'node_modules') var fs = require('fs') if (fs.existsSync(reduxSagaSrc) && fs.existsSync(reduxNodeModules)) { - // Resolve Redux to source + // Resolve Redux-Saga to source module.exports.resolve = { alias: { 'redux-saga': reduxSagaSrc } } - // Compile Redux from source - module.exports.module.loaders.push({ + // Compile Redux-Saga from source + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: reduxSagaSrc + use: [ 'babel-loader' ], + include: reduxSagaSrc, }) // include sagaMonitor - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: path.join(__dirname, '..', 'sagaMonitor') + use: [ 'babel-loader' ], + include: path.join(__dirname, '..', 'sagaMonitor'), }) } diff --git a/examples/cancellable-counter/webpack.config.js b/examples/cancellable-counter/webpack.config.js index 5adb8be86..a77c69dce 100644 --- a/examples/cancellable-counter/webpack.config.js +++ b/examples/cancellable-counter/webpack.config.js @@ -5,29 +5,28 @@ module.exports = { devtool: 'cheap-module-eval-source-map', entry: [ 'webpack-hot-middleware/client?reload=true', - path.join(__dirname, 'src', 'main') + path.join(__dirname, 'src', 'main'), ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js', - publicPath: '/static/' + publicPath: '/static/', }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('development') - }) + 'process.env.NODE_ENV': JSON.stringify('development'), + }), ], module: { - loaders: [{ + rules: [{ test: /\.js$/, - loaders: [ 'babel' ], + use: [ 'babel-loader' ], exclude: /node_modules/, - include: __dirname - }] - } + include: __dirname, + }], + }, } @@ -40,16 +39,16 @@ if (fs.existsSync(reduxSagaSrc) && fs.existsSync(reduxNodeModules)) { // Resolve Redux to source module.exports.resolve = { alias: { 'redux-saga': reduxSagaSrc } } // Compile Redux from source - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: reduxSagaSrc + use: [ 'babel-loader' ], + include: reduxSagaSrc, }) // include sagaMonitor - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: path.join(__dirname, '..', 'sagaMonitor') + use: [ 'babel-loader' ], + include: path.join(__dirname, '..', 'sagaMonitor'), }) } diff --git a/examples/counter/webpack.config.js b/examples/counter/webpack.config.js index 5adb8be86..a77c69dce 100644 --- a/examples/counter/webpack.config.js +++ b/examples/counter/webpack.config.js @@ -5,29 +5,28 @@ module.exports = { devtool: 'cheap-module-eval-source-map', entry: [ 'webpack-hot-middleware/client?reload=true', - path.join(__dirname, 'src', 'main') + path.join(__dirname, 'src', 'main'), ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js', - publicPath: '/static/' + publicPath: '/static/', }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('development') - }) + 'process.env.NODE_ENV': JSON.stringify('development'), + }), ], module: { - loaders: [{ + rules: [{ test: /\.js$/, - loaders: [ 'babel' ], + use: [ 'babel-loader' ], exclude: /node_modules/, - include: __dirname - }] - } + include: __dirname, + }], + }, } @@ -40,16 +39,16 @@ if (fs.existsSync(reduxSagaSrc) && fs.existsSync(reduxNodeModules)) { // Resolve Redux to source module.exports.resolve = { alias: { 'redux-saga': reduxSagaSrc } } // Compile Redux from source - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: reduxSagaSrc + use: [ 'babel-loader' ], + include: reduxSagaSrc, }) // include sagaMonitor - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: path.join(__dirname, '..', 'sagaMonitor') + use: [ 'babel-loader' ], + include: path.join(__dirname, '..', 'sagaMonitor'), }) } diff --git a/examples/real-world/.babelrc b/examples/real-world/.babelrc deleted file mode 100644 index 27b5c0dc7..000000000 --- a/examples/real-world/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["es2015", "react", "stage-2"] -} diff --git a/examples/real-world/.babelrc.js b/examples/real-world/.babelrc.js new file mode 100644 index 000000000..e61b10489 --- /dev/null +++ b/examples/real-world/.babelrc.js @@ -0,0 +1,14 @@ +module.exports = { + presets: [ + [ + 'env', + { + loose: true, + modules: process.env.BABEL_ENV === 'es' ? false : 'commonjs', + forceAllTransforms: process.env.NODE_ENV === 'production', + }, + ], + 'react', + 'stage-2', + ], +} diff --git a/examples/real-world/package.json b/examples/real-world/package.json index d73e95240..657fa5a50 100644 --- a/examples/real-world/package.json +++ b/examples/real-world/package.json @@ -29,20 +29,20 @@ "serve-favicon": "^2.3.0" }, "devDependencies": { - "babel-core": "^6.3.21", - "babel-loader": "^6.2.0", - "babel-polyfill": "^6.3.14", - "babel-preset-es2015": "^6.3.13", - "babel-preset-react": "^6.3.13", - "babel-preset-stage-2": "^6.3.13", - "babel-register": "^6.9.0", + "babel-core": "7.0.0-beta.0", + "babel-loader": "^7.1.2", + "babel-polyfill": "7.0.0-beta.0", + "babel-preset-env": "^2.0.0-beta.0", + "babel-preset-react": "7.0.0-beta.0", + "babel-preset-stage-2": "7.0.0-beta.0", + "babel-register": "7.0.0-beta.0", "concurrently": "^0.1.1", "express": "^4.13.3", "redux-devtools": "^3.0.0-beta-3", "redux-devtools-dock-monitor": "^1.0.0-beta-3", "redux-devtools-log-monitor": "^1.0.0-beta-3", - "webpack": "^1.9.11", - "webpack-dev-middleware": "^1.2.0", - "webpack-hot-middleware": "^2.2.0" + "webpack": "^3.6.0", + "webpack-dev-middleware": "^1.12.0", + "webpack-hot-middleware": "^2.19.1" } } diff --git a/examples/real-world/webpack.config.js b/examples/real-world/webpack.config.js index 69dbcc5ad..b38cac6e7 100644 --- a/examples/real-world/webpack.config.js +++ b/examples/real-world/webpack.config.js @@ -5,29 +5,25 @@ module.exports = { devtool: 'cheap-module-eval-source-map', entry: [ 'webpack-hot-middleware/client?reload=true', - path.join(__dirname, 'index') + path.join(__dirname, 'index'), ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js', - publicPath: '/static/' + publicPath: '/static/', }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), - new webpack.NoErrorsPlugin() + new webpack.NoErrorsPlugin(), ], module: { - loaders: [{ + rules: [{ test: /\.js$/, - loader: 'babel', + use: 'babel-loader', exclude: /node_modules/, include: [__dirname], - query: { - presets: ['es2015', 'react', 'stage-2'] - } - }] - } + }], + }, } console.log('resolveLoader', path.resolve(path.join(__dirname, 'node_modules'))) @@ -41,6 +37,6 @@ if (fs.existsSync(reduxSagaSrc) && fs.existsSync(reduxSagaNodeModules)) { // Resolve Redux-Saga to source module.exports.resolve = { alias: { 'redux-saga': reduxSagaSrc } } // Compile Redux-Saga from source - module.exports.module.loaders[0].include.push(reduxSagaSrc) - module.exports.module.loaders[0].include.push(path.join(__dirname, '..', 'sagaMonitor')) + module.exports.module.rules[0].include.push(reduxSagaSrc) + module.exports.module.rules[0].include.push(path.join(__dirname, '..', 'sagaMonitor')) } diff --git a/examples/shopping-cart/webpack.config.js b/examples/shopping-cart/webpack.config.js index 5adb8be86..a77c69dce 100644 --- a/examples/shopping-cart/webpack.config.js +++ b/examples/shopping-cart/webpack.config.js @@ -5,29 +5,28 @@ module.exports = { devtool: 'cheap-module-eval-source-map', entry: [ 'webpack-hot-middleware/client?reload=true', - path.join(__dirname, 'src', 'main') + path.join(__dirname, 'src', 'main'), ], output: { path: path.join(__dirname, 'dist'), filename: 'bundle.js', - publicPath: '/static/' + publicPath: '/static/', }, plugins: [ - new webpack.optimize.OccurenceOrderPlugin(), new webpack.HotModuleReplacementPlugin(), new webpack.NoErrorsPlugin(), new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('development') - }) + 'process.env.NODE_ENV': JSON.stringify('development'), + }), ], module: { - loaders: [{ + rules: [{ test: /\.js$/, - loaders: [ 'babel' ], + use: [ 'babel-loader' ], exclude: /node_modules/, - include: __dirname - }] - } + include: __dirname, + }], + }, } @@ -40,16 +39,16 @@ if (fs.existsSync(reduxSagaSrc) && fs.existsSync(reduxNodeModules)) { // Resolve Redux to source module.exports.resolve = { alias: { 'redux-saga': reduxSagaSrc } } // Compile Redux from source - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: reduxSagaSrc + use: [ 'babel-loader' ], + include: reduxSagaSrc, }) // include sagaMonitor - module.exports.module.loaders.push({ + module.exports.module.rules.push({ test: /\.js$/, - loaders: [ 'babel' ], - include: path.join(__dirname, '..', 'sagaMonitor') + use: [ 'babel-loader' ], + include: path.join(__dirname, '..', 'sagaMonitor'), }) } diff --git a/package.json b/package.json index 8f4d5ab51..3d520862e 100644 --- a/package.json +++ b/package.json @@ -79,16 +79,16 @@ "redux": "^3.5.1" }, "devDependencies": { - "babel-cli": "^6.1.18", - "babel-core": "^6.21.0", - "babel-eslint": "^6.0.3", - "babel-loader": "^6.2.5", - "babel-plugin-annotate-pure-calls": "^0.2.1", - "babel-plugin-external-helpers": "^6.22.0", - "babel-polyfill": "^6.7.4", - "babel-preset-es2015": "^6.14.0", - "babel-preset-react": "^6.11.1", - "babel-preset-stage-2": "^6.13.0", + "@babel/cli": "7.0.0-beta.31", + "@babel/core": "7.0.0-beta.31", + "@babel/node": "7.0.0-beta.31", + "@babel/polyfill": "7.0.0-beta.31", + "@babel/preset-env": "7.0.0-beta.31", + "@babel/preset-react": "7.0.0-beta.31", + "@babel/preset-stage-2": "7.0.0-beta.31", + "babel-eslint": "^8.0.1", + "babel-loader": "8.0.0-beta.0", + "babel-plugin-annotate-pure-calls": "Andarist/babel-plugin-annotate-pure-calls#babel7", "bundlesize": "^0.11.0", "cross-env": "^1.0.8", "eslint": "^2.8.0", @@ -106,7 +106,7 @@ "react-redux": "^4.4.5", "rimraf": "^2.4.3", "rollup": "^0.50.0", - "rollup-plugin-babel": "^2.7.1", + "rollup-plugin-babel": "4.0.0-beta.0", "rollup-plugin-node-resolve": "^3.0.0", "rollup-plugin-replace": "^1.1.1", "rollup-plugin-uglify": "^2.0.1", @@ -114,9 +114,9 @@ "tape": "^4.2.2", "typescript": "^2.2.1", "typings-tester": "^0.2.2", - "webpack": "1.13.0", - "webpack-dev-middleware": "^1.4.0", - "webpack-hot-middleware": "^2.6.0" + "webpack": "^3.8.1", + "webpack-dev-middleware": "^1.12.0", + "webpack-hot-middleware": "^2.19.1" }, "typings": "./index.d.ts", "npmName": "redux-saga", diff --git a/rollup.config.js b/rollup.config.js index cc4d76aa7..44ff9a44e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -2,7 +2,7 @@ import nodeResolve from 'rollup-plugin-node-resolve'; import babel from 'rollup-plugin-babel'; import replace from 'rollup-plugin-replace'; import uglify from 'rollup-plugin-uglify'; -import { list as babelHelpersList } from 'babel-helpers'; +import { list as babelHelpersList } from '@babel/helpers'; var env = process.env.NODE_ENV var config = { @@ -17,8 +17,7 @@ var config = { }), babel({ exclude: 'node_modules/**', - plugins: ['external-helpers'], - externalHelpersWhitelist: babelHelpersList.filter(helperName => helperName !== 'asyncGenerator'), + externalHelpersWhitelist: babelHelpersList.filter(helperName => helperName !== 'AsyncGenerator'), }), replace({ 'process.env.NODE_ENV': JSON.stringify(env),