From cc06eaca633e2b99951b2afdb26ee4d9f12d74f1 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Sun, 2 Apr 2017 23:48:07 -0700 Subject: [PATCH 01/12] add auto benchmark --- perf/suites.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/perf/suites.js b/perf/suites.js index ca400dc70..677517ce9 100644 --- a/perf/suites.js +++ b/perf/suites.js @@ -233,6 +233,28 @@ module.exports = [{ fn: function(async, done) { async.waterfall(tasks, done); } +}, { + name: "auto", + args: [ + [5], + [10], + [100] + ], + setup: function setup(count) { + tasks = { + dep1: function (cb) { cb(null, 1); } + }; + _.times(count, function(n) { + var task = ['dep' + (n+1), function(results, cb) { + setImmediate(cb, null, n); + }]; + if (n > 2) task.unshift('dep' + n); + tasks['dep' + (n+2)] = task; + }); + }, + fn: function(async, done) { + async.auto(tasks, done); + } }, { name: "queue", args: [ From 40144660eb1fc75a05102c93d98fe15a16ebd7da Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Sun, 2 Apr 2017 23:49:50 -0700 Subject: [PATCH 02/12] optimize auto, parallel, and waterfall by not useing rest() --- lib/auto.js | 14 +++++++------- lib/internal/parallel.js | 12 ++++++------ lib/internal/slice.js | 9 +++++++++ lib/waterfall.js | 10 ++++++---- 4 files changed, 28 insertions(+), 17 deletions(-) create mode 100644 lib/internal/slice.js diff --git a/lib/auto.js b/lib/auto.js index ba0fdc337..d712cc106 100644 --- a/lib/auto.js +++ b/lib/auto.js @@ -4,7 +4,7 @@ import indexOf from 'lodash/_baseIndexOf'; import isArray from 'lodash/isArray'; import okeys from 'lodash/keys'; import noop from 'lodash/noop'; -import rest from './internal/rest'; +import slice from 'lodash/slice'; import once from './internal/once'; import onlyOnce from './internal/onlyOnce'; @@ -192,26 +192,26 @@ export default function (tasks, concurrency, callback) { function runTask(key, task) { if (hasError) return; - var taskCallback = onlyOnce(rest(function(err, args) { + var taskCallback = onlyOnce(function(err, result) { runningTasks--; - if (args.length <= 1) { - args = args[0]; + if (arguments.length > 2) { + result = slice(arguments, 1); } if (err) { var safeResults = {}; forOwn(results, function(val, rkey) { safeResults[rkey] = val; }); - safeResults[key] = args; + safeResults[key] = result; hasError = true; listeners = Object.create(null); callback(err, safeResults); } else { - results[key] = args; + results[key] = result; taskComplete(key); } - })); + }); runningTasks++; var taskFn = wrapAsync(task[task.length - 1]); diff --git a/lib/internal/parallel.js b/lib/internal/parallel.js index 70993d3dd..f4e934712 100644 --- a/lib/internal/parallel.js +++ b/lib/internal/parallel.js @@ -1,6 +1,6 @@ import noop from 'lodash/noop'; import isArrayLike from 'lodash/isArrayLike'; -import rest from './rest'; +import slice from './slice'; import wrapAsync from './wrapAsync'; export default function _parallel(eachfn, tasks, callback) { @@ -8,13 +8,13 @@ export default function _parallel(eachfn, tasks, callback) { var results = isArrayLike(tasks) ? [] : {}; eachfn(tasks, function (task, key, callback) { - wrapAsync(task)(rest(function (err, args) { - if (args.length <= 1) { - args = args[0]; + wrapAsync(task)(function (err, result) { + if (arguments.length > 2) { + result = slice(arguments, 1); } - results[key] = args; + results[key] = result; callback(err); - })); + }); }, function (err) { callback(err, results); }); diff --git a/lib/internal/slice.js b/lib/internal/slice.js new file mode 100644 index 000000000..cd2e5b38f --- /dev/null +++ b/lib/internal/slice.js @@ -0,0 +1,9 @@ +export default function slice(arrayLike, start) { + start = start|0; + var newLen = Math.max(arrayLike.length - start, 0); + var newArr = Array(newLen); + for(var idx = 0; idx < newLen; idx++) { + newArr[idx] = arrayLike[start + idx]; + } + return newArr; +} diff --git a/lib/waterfall.js b/lib/waterfall.js index 24befac96..bfcf7a4dd 100644 --- a/lib/waterfall.js +++ b/lib/waterfall.js @@ -2,6 +2,7 @@ import isArray from 'lodash/isArray'; import noop from 'lodash/noop'; import once from './internal/once'; import rest from './internal/rest'; +import slice from './internal/slice'; import onlyOnce from './internal/onlyOnce'; import wrapAsync from './internal/wrapAsync'; @@ -74,12 +75,13 @@ export default function(tasks, callback) { return callback.apply(null, [null].concat(args)); } - var taskCallback = onlyOnce(rest(function(err, args) { + var taskCallback = onlyOnce(function(err/*, cbArgs...*/) { + var cbArgs = slice(arguments, 1); if (err) { - return callback.apply(null, [err].concat(args)); + return callback.apply(null, [err].concat(cbArgs)); } - nextTask(args); - })); + nextTask(cbArgs); + }); args.push(taskCallback); From 2857bc74eea2cd888207dfc4e9e23e23a77213bd Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 00:00:32 -0700 Subject: [PATCH 03/12] optimize whilst and family, seq, and reflect --- lib/doDuring.js | 9 +++++---- lib/doWhilst.js | 7 ++++--- lib/reflect.js | 14 +++++--------- lib/seq.js | 6 ++++-- lib/whilst.js | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/doDuring.js b/lib/doDuring.js index 85a69c254..06aa21e27 100644 --- a/lib/doDuring.js +++ b/lib/doDuring.js @@ -1,5 +1,5 @@ import noop from 'lodash/noop'; -import rest from './internal/rest'; +import slice from './internal/slice'; import onlyOnce from './internal/onlyOnce'; import wrapAsync from './internal/wrapAsync'; @@ -28,11 +28,12 @@ export default function doDuring(fn, test, callback) { var _fn = wrapAsync(fn); var _test = wrapAsync(test); - var next = rest(function(err, args) { - if (err) return callback(err); + function next(err/*, args...*/) { + if (err) return callback(err); + var args = slice(arguments, 1); args.push(check); _test.apply(this, args); - }); + }; function check(err, truth) { if (err) return callback(err); diff --git a/lib/doWhilst.js b/lib/doWhilst.js index 4407305f6..fa0787486 100644 --- a/lib/doWhilst.js +++ b/lib/doWhilst.js @@ -1,5 +1,5 @@ import noop from 'lodash/noop'; -import rest from './internal/rest'; +import slice from './internal/slice'; import onlyOnce from './internal/onlyOnce'; import wrapAsync from './internal/wrapAsync'; @@ -29,10 +29,11 @@ import wrapAsync from './internal/wrapAsync'; export default function doWhilst(iteratee, test, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync(iteratee); - var next = rest(function(err, args) { + var next = function(err/*, args...*/) { if (err) return callback(err); + var args = slice(arguments, 1); if (test.apply(this, args)) return _iteratee(next); callback.apply(null, [null].concat(args)); - }); + }; _iteratee(next); } diff --git a/lib/reflect.js b/lib/reflect.js index 9e0613b48..d61c31e44 100644 --- a/lib/reflect.js +++ b/lib/reflect.js @@ -1,5 +1,5 @@ import initialParams from './internal/initialParams'; -import rest from './internal/rest'; +import slice from './internal/slice'; import wrapAsync from './internal/wrapAsync'; /** @@ -44,23 +44,19 @@ import wrapAsync from './internal/wrapAsync'; export default function reflect(fn) { var _fn = wrapAsync(fn); return initialParams(function reflectOn(args, reflectCallback) { - args.push(rest(function callback(err, cbArgs) { + args.push(function callback(err, cbArg) { if (err) { reflectCallback(null, { error: err }); } else { - var value = null; - if (cbArgs.length === 1) { - value = cbArgs[0]; - } else if (cbArgs.length > 1) { - value = cbArgs; - } + var value = cbArg; + if (arguments.length > 2) value = slice(arguments, 1); reflectCallback(null, { value: value }); } - })); + }); return _fn.apply(this, args); }); diff --git a/lib/seq.js b/lib/seq.js index 4fceceb60..9e86aca72 100644 --- a/lib/seq.js +++ b/lib/seq.js @@ -1,5 +1,6 @@ import noop from 'lodash/noop'; import rest from './internal/rest'; +import slice from 'lodash/slice'; import reduce from './reduce'; import wrapAsync from './internal/wrapAsync'; import arrayMap from 'lodash/_arrayMap'; @@ -55,9 +56,10 @@ export default rest(function seq(functions) { } reduce(_functions, args, function(newargs, fn, cb) { - fn.apply(that, newargs.concat(rest(function(err, nextargs) { + fn.apply(that, newargs.concat(function(err/*, nextargs...*/) { + var nextargs = slice(arguments, 1); cb(err, nextargs); - }))); + })); }, function(err, results) { cb.apply(that, [err].concat(results)); diff --git a/lib/whilst.js b/lib/whilst.js index 57edad615..5c8880f0a 100644 --- a/lib/whilst.js +++ b/lib/whilst.js @@ -1,5 +1,5 @@ import noop from 'lodash/noop'; -import rest from './internal/rest'; +import slice from './internal/slice'; import onlyOnce from './internal/onlyOnce'; import wrapAsync from './internal/wrapAsync'; @@ -42,10 +42,10 @@ export default function whilst(test, iteratee, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync(iteratee); if (!test()) return callback(null); - var next = rest(function(err, args) { + var next = function(err/*, args...*/) { if (err) return callback(err); if (test()) return _iteratee(next); - callback.apply(null, [null].concat(args)); - }); + callback.apply(null, [null].concat(slice(arguments, 1))); + }; _iteratee(next); } From 2ae34926f070cdeec38f4bcd0ad173fa6a963904 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 00:38:41 -0700 Subject: [PATCH 04/12] fix lint error --- lib/waterfall.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/waterfall.js b/lib/waterfall.js index bfcf7a4dd..d5245c3a7 100644 --- a/lib/waterfall.js +++ b/lib/waterfall.js @@ -1,7 +1,6 @@ import isArray from 'lodash/isArray'; import noop from 'lodash/noop'; import once from './internal/once'; -import rest from './internal/rest'; import slice from './internal/slice'; import onlyOnce from './internal/onlyOnce'; From 67e76ea150f30561e9ce7624459031197c45a68a Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 01:17:11 -0700 Subject: [PATCH 05/12] remove rest completely --- lib/apply.js | 15 +++++++++------ lib/compose.js | 8 ++++---- lib/constant.js | 13 +++++++------ lib/internal/applyEach.js | 7 ++++--- lib/internal/consoleFunc.js | 12 +++++++----- lib/internal/initialParams.js | 7 ++++--- lib/internal/queue.js | 11 +++++------ lib/internal/rest.js | 8 -------- lib/internal/setImmediate.js | 7 ++++--- lib/memoize.js | 7 ++++--- lib/reduceRight.js | 5 ++--- lib/seq.js | 14 +++++++------- 12 files changed, 57 insertions(+), 57 deletions(-) delete mode 100644 lib/internal/rest.js diff --git a/lib/apply.js b/lib/apply.js index d3fc18b0a..b1ca55a87 100644 --- a/lib/apply.js +++ b/lib/apply.js @@ -1,4 +1,4 @@ -import rest from './internal/rest'; +import slice from './internal/slice'; /** * Creates a continuation function with some arguments already applied. @@ -12,10 +12,11 @@ import rest from './internal/rest'; * @memberOf module:Utils * @method * @category Util - * @param {Function} function - The function you want to eventually apply all + * @param {Function} fn - The function you want to eventually apply all * arguments to. Invokes with (arguments...). * @param {...*} arguments... - Any number of arguments to automatically apply * when the continuation is called. + * @returns {Function} the partially-applied function * @example * * // using apply @@ -44,8 +45,10 @@ import rest from './internal/rest'; * two * three */ -export default rest(function(fn, args) { - return rest(function(callArgs) { +export default function(fn/*, args*/) { + var args = slice(arguments, 1); + return function(/*callArgs*/) { + var callArgs = slice(arguments); return fn.apply(null, args.concat(callArgs)); - }); -}); + }; +}; diff --git a/lib/compose.js b/lib/compose.js index 96632c05b..d9fa760d1 100644 --- a/lib/compose.js +++ b/lib/compose.js @@ -1,5 +1,5 @@ import seq from './seq'; -import rest from './internal/rest'; +import slice from './internal/slice'; /** * Creates a function which is a composition of the passed asynchronous @@ -36,6 +36,6 @@ import rest from './internal/rest'; * // result now equals 15 * }); */ -export default rest(function(args) { - return seq.apply(null, args.reverse()); -}); +export default function(/*...args*/) { + return seq.apply(null, slice(arguments).reverse()); +}; diff --git a/lib/constant.js b/lib/constant.js index ae6ffd099..238ef6144 100644 --- a/lib/constant.js +++ b/lib/constant.js @@ -1,5 +1,4 @@ -import rest from './internal/rest'; -import initialParams from './internal/initialParams'; +import slice from './internal/slice'; /** * Returns a function that when called, calls-back with the values provided. @@ -43,9 +42,11 @@ import initialParams from './internal/initialParams'; * //... * }, callback); */ -export default rest(function(values) { +export default function(/*...values*/) { + var values = slice(arguments); var args = [null].concat(values); - return initialParams(function (ignoredArgs, callback) { + return function (/*...ignoredArgs, callback*/) { + var callback = arguments[arguments.length - 1]; return callback.apply(this, args); - }); -}); + }; +}; diff --git a/lib/internal/applyEach.js b/lib/internal/applyEach.js index 285a6a25e..c0ed402f9 100644 --- a/lib/internal/applyEach.js +++ b/lib/internal/applyEach.js @@ -1,9 +1,10 @@ -import rest from './rest'; +import slice from './slice'; import initialParams from './initialParams'; import wrapAsync from './wrapAsync'; export default function applyEach(eachfn) { - return rest(function(fns, args) { + return function(fns/*, ...args*/) { + var args = slice(arguments, 1); var go = initialParams(function(args, callback) { var that = this; return eachfn(fns, function (fn, cb) { @@ -16,5 +17,5 @@ export default function applyEach(eachfn) { else { return go; } - }); + }; } diff --git a/lib/internal/consoleFunc.js b/lib/internal/consoleFunc.js index 35374d713..92f7e863a 100644 --- a/lib/internal/consoleFunc.js +++ b/lib/internal/consoleFunc.js @@ -1,10 +1,12 @@ import arrayEach from 'lodash/_arrayEach'; -import rest from './rest'; +import slice from './slice'; import wrapAsync from './wrapAsync'; export default function consoleFunc(name) { - return rest(function (fn, args) { - wrapAsync(fn).apply(null, args.concat(rest(function (err, args) { + return function (fn/*, ...args*/) { + var args = slice(arguments, 1); + wrapAsync(fn).apply(null, args.concat(function (err/*, ...args*/) { + var args = slice(arguments, 1); if (typeof console === 'object') { if (err) { if (console.error) { @@ -17,6 +19,6 @@ export default function consoleFunc(name) { }); } } - }))); - }); + })); + }; } diff --git a/lib/internal/initialParams.js b/lib/internal/initialParams.js index cf3038600..207970302 100644 --- a/lib/internal/initialParams.js +++ b/lib/internal/initialParams.js @@ -1,8 +1,9 @@ -import rest from './rest'; +import slice from './slice'; export default function (fn) { - return rest(function (args/*..., callback*/) { + return function (/*...args, callback*/) { + var args = slice(arguments); var callback = args.pop(); fn.call(this, args, callback); - }); + }; } diff --git a/lib/internal/queue.js b/lib/internal/queue.js index 479eaf87b..2eb523a73 100644 --- a/lib/internal/queue.js +++ b/lib/internal/queue.js @@ -1,7 +1,6 @@ import indexOf from 'lodash/_baseIndexOf'; import isArray from 'lodash/isArray'; import noop from 'lodash/noop'; -import rest from './rest'; import onlyOnce from './onlyOnce'; import setImmediate from './setImmediate'; @@ -51,7 +50,7 @@ export default function queue(worker, concurrency, payload) { } function _next(tasks) { - return rest(function(args){ + return function(err){ numRunning -= 1; for (var i = 0, l = tasks.length; i < l; i++) { @@ -61,10 +60,10 @@ export default function queue(worker, concurrency, payload) { workersList.splice(index) } - task.callback.apply(task, args); + task.callback.apply(task, arguments); - if (args[0] != null) { - q.error(args[0], task.data); + if (err != null) { + q.error(err, task.data); } } @@ -76,7 +75,7 @@ export default function queue(worker, concurrency, payload) { q.drain(); } q.process(); - }); + }; } var isProcessing = false; diff --git a/lib/internal/rest.js b/lib/internal/rest.js deleted file mode 100644 index ee70cc614..000000000 --- a/lib/internal/rest.js +++ /dev/null @@ -1,8 +0,0 @@ -import _overRest from 'lodash/_overRest'; -import identity from 'lodash/identity'; - -// Lodash rest function without function.toString() -// remappings -export default function rest(func, start) { - return _overRest(func, start, identity); -} diff --git a/lib/internal/setImmediate.js b/lib/internal/setImmediate.js index c8824c721..95191f904 100644 --- a/lib/internal/setImmediate.js +++ b/lib/internal/setImmediate.js @@ -1,6 +1,6 @@ 'use strict'; -import rest from './rest'; +import slice from './slice'; export var hasSetImmediate = typeof setImmediate === 'function' && setImmediate; export var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function'; @@ -10,11 +10,12 @@ export function fallback(fn) { } export function wrap(defer) { - return rest(function (fn, args) { + return function (fn/*, ...args*/) { + var args = slice(arguments, 1); defer(function () { fn.apply(null, args); }); - }); + }; } var _defer; diff --git a/lib/memoize.js b/lib/memoize.js index de71c33e7..27c08bc32 100644 --- a/lib/memoize.js +++ b/lib/memoize.js @@ -1,5 +1,5 @@ import identity from 'lodash/identity'; -import rest from './internal/rest'; +import slice from './internal/slice'; import setImmediate from './internal/setImmediate'; import initialParams from './internal/initialParams'; @@ -61,14 +61,15 @@ export default function memoize(fn, hasher) { queues[key].push(callback); } else { queues[key] = [callback]; - _fn.apply(null, args.concat(rest(function(args) { + _fn.apply(null, args.concat(function(/*args*/) { + var args = slice(arguments); memo[key] = args; var q = queues[key]; delete queues[key]; for (var i = 0, l = q.length; i < l; i++) { q[i].apply(null, args); } - }))); + })); } }); memoized.memo = memo; diff --git a/lib/reduceRight.js b/lib/reduceRight.js index ca5aa7fb0..1d203c993 100644 --- a/lib/reduceRight.js +++ b/lib/reduceRight.js @@ -1,6 +1,5 @@ import reduce from './reduce'; - -var slice = Array.prototype.slice; +import slice from './internal/slice'; /** * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. @@ -25,6 +24,6 @@ var slice = Array.prototype.slice; * (err, result). */ export default function reduceRight (array, memo, iteratee, callback) { - var reversed = slice.call(array).reverse(); + var reversed = slice(array).reverse(); reduce(reversed, memo, iteratee, callback); } diff --git a/lib/seq.js b/lib/seq.js index 9e86aca72..ccdd27712 100644 --- a/lib/seq.js +++ b/lib/seq.js @@ -1,5 +1,4 @@ import noop from 'lodash/noop'; -import rest from './internal/rest'; import slice from 'lodash/slice'; import reduce from './reduce'; import wrapAsync from './internal/wrapAsync'; @@ -43,9 +42,10 @@ import arrayMap from 'lodash/_arrayMap'; * }); * }); */ -export default rest(function seq(functions) { - var _functions = arrayMap(functions, wrapAsync); - return rest(function(args) { +export default function seq(/*...functions*/) { + var _functions = arrayMap(arguments, wrapAsync); + return function(/*...args*/) { + var args = slice(arguments); var that = this; var cb = args[args.length - 1]; @@ -56,7 +56,7 @@ export default rest(function seq(functions) { } reduce(_functions, args, function(newargs, fn, cb) { - fn.apply(that, newargs.concat(function(err/*, nextargs...*/) { + fn.apply(that, newargs.concat(function(err/*, ...nextargs*/) { var nextargs = slice(arguments, 1); cb(err, nextargs); })); @@ -64,5 +64,5 @@ export default rest(function seq(functions) { function(err, results) { cb.apply(that, [err].concat(results)); }); - }); -}) + }; +} From fddea479f798be3bdf598e10b13ede4ad516cd92 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 01:21:50 -0700 Subject: [PATCH 06/12] fix deprecation warning --- perf/benchmark.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/perf/benchmark.js b/perf/benchmark.js index 42f400a95..393464ff4 100755 --- a/perf/benchmark.js +++ b/perf/benchmark.js @@ -213,8 +213,7 @@ function cloneVersion(tag, callback) { fs.open(versionDir + "/package.json", "r", function (err, handle) { if (!err) { // version has already been cloned - fs.close(handle); - return callback(); + return fs.close(handle, callback); } var repoPath = path.join(__dirname, ".."); From a6bd3a00b505e2bc51d6f322387645aff61abf76 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 22:38:41 -0700 Subject: [PATCH 07/12] replace lodash/slice --- lib/auto.js | 2 +- lib/seq.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/auto.js b/lib/auto.js index d712cc106..e2c0ab912 100644 --- a/lib/auto.js +++ b/lib/auto.js @@ -4,8 +4,8 @@ import indexOf from 'lodash/_baseIndexOf'; import isArray from 'lodash/isArray'; import okeys from 'lodash/keys'; import noop from 'lodash/noop'; -import slice from 'lodash/slice'; +import slice from './internal/slice'; import once from './internal/once'; import onlyOnce from './internal/onlyOnce'; import wrapAsync from './internal/wrapAsync'; diff --git a/lib/seq.js b/lib/seq.js index ccdd27712..8d31e492d 100644 --- a/lib/seq.js +++ b/lib/seq.js @@ -1,5 +1,5 @@ import noop from 'lodash/noop'; -import slice from 'lodash/slice'; +import slice from './internal/slice'; import reduce from './reduce'; import wrapAsync from './internal/wrapAsync'; import arrayMap from 'lodash/_arrayMap'; From 9b0f9eb1854cbc30960251a71ff8ce08bfa9dc0a Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 23:19:02 -0700 Subject: [PATCH 08/12] add a test for a unique waterfall fail case --- mocha_test/waterfall.js | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/mocha_test/waterfall.js b/mocha_test/waterfall.js index 0c21c8024..54ca9f93b 100644 --- a/mocha_test/waterfall.js +++ b/mocha_test/waterfall.js @@ -93,7 +93,6 @@ describe("waterfall", function () { it('multiple callback calls', function(){ var arr = [ function(callback){ - // call the callback twice. this should call function 2 twice callback(null, 'one', 'two'); callback(null, 'one', 'two'); }, @@ -106,6 +105,37 @@ describe("waterfall", function () { }).to.throw(/already called/); }); + it('multiple callback calls (trickier) @nodeonly', function(done){ + + // do a weird dance to catch the async thrown error before mocha + var listeners = process.listeners('uncaughtException'); + process.removeAllListeners('uncaughtException'); + process.once('uncaughtException', function onErr(err) { + listeners.forEach(function(listener) { + process.on('uncaughtException', listener); + }); + // can't throw errors in a uncaughtException handler, defer + setTimeout(checkErr, 0, err) + }) + + function checkErr(err) { + expect(err.message).to.match(/already called/); + done(); + } + + async.waterfall([ + function(callback){ + setTimeout(callback, 0, null, 'one', 'two'); + setTimeout(callback, 10, null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + setTimeout(callback, 15, null, arg1, arg2, 'three'); + } + ], function () { + throw new Error('should not get here') + }); + }); + it('call in another context @nycinvalid @nodeonly', function(done) { var vm = require('vm'); var sandbox = { From dddb9f50a079580f938e69f1ba9d32927a08301c Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 23:45:58 -0700 Subject: [PATCH 09/12] fix ellipsis in comments --- lib/doDuring.js | 2 +- lib/doWhilst.js | 2 +- lib/whilst.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/doDuring.js b/lib/doDuring.js index 06aa21e27..cce61d05c 100644 --- a/lib/doDuring.js +++ b/lib/doDuring.js @@ -28,7 +28,7 @@ export default function doDuring(fn, test, callback) { var _fn = wrapAsync(fn); var _test = wrapAsync(test); - function next(err/*, args...*/) { + function next(err/*, ...args*/) { if (err) return callback(err); var args = slice(arguments, 1); args.push(check); diff --git a/lib/doWhilst.js b/lib/doWhilst.js index fa0787486..5e7d25952 100644 --- a/lib/doWhilst.js +++ b/lib/doWhilst.js @@ -29,7 +29,7 @@ import wrapAsync from './internal/wrapAsync'; export default function doWhilst(iteratee, test, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync(iteratee); - var next = function(err/*, args...*/) { + var next = function(err/*, ...args*/) { if (err) return callback(err); var args = slice(arguments, 1); if (test.apply(this, args)) return _iteratee(next); diff --git a/lib/whilst.js b/lib/whilst.js index 5c8880f0a..5838b7926 100644 --- a/lib/whilst.js +++ b/lib/whilst.js @@ -42,7 +42,7 @@ export default function whilst(test, iteratee, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync(iteratee); if (!test()) return callback(null); - var next = function(err/*, args...*/) { + var next = function(err/*, ...args*/) { if (err) return callback(err); if (test()) return _iteratee(next); callback.apply(null, [null].concat(slice(arguments, 1))); From 53019a85063576c3aa7e48410d5f8018337f348e Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Mon, 3 Apr 2017 23:46:20 -0700 Subject: [PATCH 10/12] simplify waterfall, commit built files --- dist/async.js | 256 +++++++++++++++++++-------------------------- dist/async.min.js | 2 +- dist/async.min.map | 2 +- lib/waterfall.js | 28 +++-- 4 files changed, 123 insertions(+), 165 deletions(-) diff --git a/dist/async.js b/dist/async.js index 4d2aa0882..6d36974fe 100644 --- a/dist/async.js +++ b/dist/async.js @@ -4,59 +4,24 @@ (factory((global.async = global.async || {}))); }(this, (function (exports) { 'use strict'; -/** - * A faster alternative to `Function#apply`, this function invokes `func` - * with the `this` binding of `thisArg` and the arguments of `args`. - * - * @private - * @param {Function} func The function to invoke. - * @param {*} thisArg The `this` binding of `func`. - * @param {Array} args The arguments to invoke `func` with. - * @returns {*} Returns the result of `func`. - */ -function apply(func, thisArg, args) { - switch (args.length) { - case 0: return func.call(thisArg); - case 1: return func.call(thisArg, args[0]); - case 2: return func.call(thisArg, args[0], args[1]); - case 3: return func.call(thisArg, args[0], args[1], args[2]); - } - return func.apply(thisArg, args); -} - -/* Built-in method references for those with the same name as other `lodash` methods. */ -var nativeMax = Math.max; - -/** - * A specialized version of `baseRest` which transforms the rest array. - * - * @private - * @param {Function} func The function to apply a rest parameter to. - * @param {number} [start=func.length-1] The start position of the rest parameter. - * @param {Function} transform The rest array transform. - * @returns {Function} Returns the new function. - */ -function overRest$1(func, start, transform) { - start = nativeMax(start === undefined ? (func.length - 1) : start, 0); - return function() { - var args = arguments, - index = -1, - length = nativeMax(args.length - start, 0), - array = Array(length); - - while (++index < length) { - array[index] = args[start + index]; +function slice(arrayLike, start) { + start = start | 0; + var newLen = Math.max(arrayLike.length - start, 0); + var newArr = Array(newLen); + for (var idx = 0; idx < newLen; idx++) { + newArr[idx] = arrayLike[start + idx]; } - index = -1; - var otherArgs = Array(start + 1); - while (++index < start) { - otherArgs[index] = args[index]; - } - otherArgs[start] = transform(array); - return apply(func, this, otherArgs); - }; + return newArr; } +var initialParams = function (fn) { + return function () /*...args, callback*/{ + var args = slice(arguments); + var callback = args.pop(); + fn.call(this, args, callback); + }; +}; + /** * This method returns the first argument it receives. * @@ -77,19 +42,6 @@ function identity(value) { return value; } -// Lodash rest function without function.toString() -// remappings -function rest(func, start) { - return overRest$1(func, start, identity); -} - -var initialParams = function (fn) { - return rest(function (args /*..., callback*/) { - var callback = args.pop(); - fn.call(this, args, callback); - }); -}; - /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) @@ -221,7 +173,8 @@ function wrapAsync(asyncFn) { var wrapAsync$1 = supportsAsync() ? wrapAsync : identity; function applyEach$1(eachfn) { - return rest(function (fns, args) { + return function (fns /*, ...args*/) { + var args = slice(arguments, 1); var go = initialParams(function (args, callback) { var that = this; return eachfn(fns, function (fn, cb) { @@ -233,7 +186,7 @@ function applyEach$1(eachfn) { } else { return go; } - }); + }; } /** Detect free variable `global` from Node.js. */ @@ -1264,10 +1217,11 @@ var applyEachSeries = applyEach$1(mapSeries); * @memberOf module:Utils * @method * @category Util - * @param {Function} function - The function you want to eventually apply all + * @param {Function} fn - The function you want to eventually apply all * arguments to. Invokes with (arguments...). * @param {...*} arguments... - Any number of arguments to automatically apply * when the continuation is called. + * @returns {Function} the partially-applied function * @example * * // using apply @@ -1296,11 +1250,13 @@ var applyEachSeries = applyEach$1(mapSeries); * two * three */ -var apply$2 = rest(function (fn, args) { - return rest(function (callArgs) { +var apply = function (fn /*, args*/) { + var args = slice(arguments, 1); + return function () /*callArgs*/{ + var callArgs = slice(arguments); return fn.apply(null, args.concat(callArgs)); - }); -}); + }; +}; /** * A specialized version of `_.forEach` for arrays without support for @@ -1620,26 +1576,26 @@ var auto = function (tasks, concurrency, callback) { function runTask(key, task) { if (hasError) return; - var taskCallback = onlyOnce(rest(function (err, args) { + var taskCallback = onlyOnce(function (err, result) { runningTasks--; - if (args.length <= 1) { - args = args[0]; + if (arguments.length > 2) { + result = slice(arguments, 1); } if (err) { var safeResults = {}; baseForOwn(results, function (val, rkey) { safeResults[rkey] = val; }); - safeResults[key] = args; + safeResults[key] = result; hasError = true; listeners = Object.create(null); callback(err, safeResults); } else { - results[key] = args; + results[key] = result; taskComplete(key); } - })); + }); runningTasks++; var taskFn = wrapAsync$1(task[task.length - 1]); @@ -2131,11 +2087,12 @@ function fallback(fn) { } function wrap(defer) { - return rest(function (fn, args) { + return function (fn /*, ...args*/) { + var args = slice(arguments, 1); defer(function () { fn.apply(null, args); }); - }); + }; } var _defer; @@ -2249,7 +2206,7 @@ function queue(worker, concurrency, payload) { } function _next(tasks) { - return rest(function (args) { + return function (err) { numRunning -= 1; for (var i = 0, l = tasks.length; i < l; i++) { @@ -2259,10 +2216,10 @@ function queue(worker, concurrency, payload) { workersList.splice(index); } - task.callback.apply(task, args); + task.callback.apply(task, arguments); - if (args[0] != null) { - q.error(args[0], task.data); + if (err != null) { + q.error(err, task.data); } } @@ -2274,7 +2231,7 @@ function queue(worker, concurrency, payload) { q.drain(); } q.process(); - }); + }; } var isProcessing = false; @@ -2318,11 +2275,12 @@ function queue(worker, concurrency, payload) { data.push(node.data); } + numRunning += 1; + workersList.push(tasks[0]); + if (q._tasks.length === 0) { q.empty(); } - numRunning += 1; - workersList.push(tasks[0]); if (numRunning === q.concurrency) { q.saturated(); @@ -2550,9 +2508,10 @@ function reduce(coll, memo, iteratee, callback) { * }); * }); */ -var seq$1 = rest(function seq(functions) { - var _functions = arrayMap(functions, wrapAsync$1); - return rest(function (args) { +function seq() /*...functions*/{ + var _functions = arrayMap(arguments, wrapAsync$1); + return function () /*...args*/{ + var args = slice(arguments); var that = this; var cb = args[args.length - 1]; @@ -2563,14 +2522,15 @@ var seq$1 = rest(function seq(functions) { } reduce(_functions, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat(rest(function (err, nextargs) { + fn.apply(that, newargs.concat(function (err /*, ...nextargs*/) { + var nextargs = slice(arguments, 1); cb(err, nextargs); - }))); + })); }, function (err, results) { cb.apply(that, [err].concat(results)); }); - }); -}); + }; +} /** * Creates a function which is a composition of the passed asynchronous @@ -2607,9 +2567,9 @@ var seq$1 = rest(function seq(functions) { * // result now equals 15 * }); */ -var compose = rest(function (args) { - return seq$1.apply(null, args.reverse()); -}); +var compose = function () /*...args*/{ + return seq.apply(null, slice(arguments).reverse()); +}; function concat$1(eachfn, arr, fn, callback) { var result = []; @@ -2718,12 +2678,14 @@ var concatSeries = doSeries(concat$1); * //... * }, callback); */ -var constant = rest(function (values) { +var constant = function () /*...values*/{ + var values = slice(arguments); var args = [null].concat(values); - return initialParams(function (ignoredArgs, callback) { + return function () /*...ignoredArgs, callback*/{ + var callback = arguments[arguments.length - 1]; return callback.apply(this, args); - }); -}); + }; +}; function _createTester(check, getResult) { return function (eachfn, arr, iteratee, cb) { @@ -2840,8 +2802,10 @@ var detectLimit = doParallelLimit(_createTester(identity, _findGetResult)); var detectSeries = doLimit(detectLimit, 1); function consoleFunc(name) { - return rest(function (fn, args) { - wrapAsync$1(fn).apply(null, args.concat(rest(function (err, args) { + return function (fn /*, ...args*/) { + var args = slice(arguments, 1); + wrapAsync$1(fn).apply(null, args.concat(function (err /*, ...args*/) { + var args = slice(arguments, 1); if (typeof console === 'object') { if (err) { if (console.error) { @@ -2853,8 +2817,8 @@ function consoleFunc(name) { }); } } - }))); - }); + })); + }; } /** @@ -2913,11 +2877,12 @@ function doDuring(fn, test, callback) { var _fn = wrapAsync$1(fn); var _test = wrapAsync$1(test); - var next = rest(function (err, args) { + function next(err /*, ...args*/) { if (err) return callback(err); + var args = slice(arguments, 1); args.push(check); _test.apply(this, args); - }); + } function check(err, truth) { if (err) return callback(err); @@ -2953,11 +2918,12 @@ function doDuring(fn, test, callback) { function doWhilst(iteratee, test, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync$1(iteratee); - var next = rest(function (err, args) { + var next = function (err /*, ...args*/) { if (err) return callback(err); + var args = slice(arguments, 1); if (test.apply(this, args)) return _iteratee(next); callback.apply(null, [null].concat(args)); - }); + }; _iteratee(next); } @@ -3750,14 +3716,15 @@ function memoize(fn, hasher) { queues[key].push(callback); } else { queues[key] = [callback]; - _fn.apply(null, args.concat(rest(function (args) { + _fn.apply(null, args.concat(function () /*args*/{ + var args = slice(arguments); memo[key] = args; var q = queues[key]; delete queues[key]; for (var i = 0, l = q.length; i < l; i++) { q[i].apply(null, args); } - }))); + })); } }); memoized.memo = memo; @@ -3813,13 +3780,13 @@ function _parallel(eachfn, tasks, callback) { var results = isArrayLike(tasks) ? [] : {}; eachfn(tasks, function (task, key, callback) { - wrapAsync$1(task)(rest(function (err, args) { - if (args.length <= 1) { - args = args[0]; + wrapAsync$1(task)(function (err, result) { + if (arguments.length > 2) { + result = slice(arguments, 1); } - results[key] = args; + results[key] = result; callback(err); - })); + }); }, function (err) { callback(err, results); }); @@ -4143,8 +4110,6 @@ function race(tasks, callback) { } } -var slice = Array.prototype.slice; - /** * Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order. * @@ -4168,7 +4133,7 @@ var slice = Array.prototype.slice; * (err, result). */ function reduceRight(array, memo, iteratee, callback) { - var reversed = slice.call(array).reverse(); + var reversed = slice(array).reverse(); reduce(reversed, memo, iteratee, callback); } @@ -4214,23 +4179,19 @@ function reduceRight(array, memo, iteratee, callback) { function reflect(fn) { var _fn = wrapAsync$1(fn); return initialParams(function reflectOn(args, reflectCallback) { - args.push(rest(function callback(err, cbArgs) { + args.push(function callback(err, cbArg) { if (err) { reflectCallback(null, { error: err }); } else { - var value = null; - if (cbArgs.length === 1) { - value = cbArgs[0]; - } else if (cbArgs.length > 1) { - value = cbArgs; - } + var value = cbArg; + if (arguments.length > 2) value = slice(arguments, 1); reflectCallback(null, { value: value }); } - })); + }); return _fn.apply(this, args); }); @@ -4882,7 +4843,7 @@ function timeout(asyncFn, milliseconds, info) { /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeCeil = Math.ceil; -var nativeMax$1 = Math.max; +var nativeMax = Math.max; /** * The base implementation of `_.range` and `_.rangeRight` which doesn't @@ -4897,7 +4858,7 @@ var nativeMax$1 = Math.max; */ function baseRange(start, end, step, fromRight) { var index = -1, - length = nativeMax$1(nativeCeil((end - start) / (step || 1)), 0), + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result = Array(length); while (length--) { @@ -5093,11 +5054,11 @@ function whilst(test, iteratee, callback) { callback = onlyOnce(callback || noop); var _iteratee = wrapAsync$1(iteratee); if (!test()) return callback(null); - var next = rest(function (err, args) { + var next = function (err /*, ...args*/) { if (err) return callback(err); if (test()) return _iteratee(next); - callback.apply(null, [null].concat(args)); - }); + callback.apply(null, [null].concat(slice(arguments, 1))); + }; _iteratee(next); } @@ -5191,26 +5152,25 @@ var waterfall = function (tasks, callback) { if (!isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); if (!tasks.length) return callback(); var taskIndex = 0; + var args = []; - function nextTask(args) { - if (taskIndex === tasks.length) { - return callback.apply(null, [null].concat(args)); - } - - var taskCallback = onlyOnce(rest(function (err, args) { - if (err) { - return callback.apply(null, [err].concat(args)); - } - nextTask(args); - })); - + function nextTask() { + var task = wrapAsync$1(tasks[taskIndex++]); + var taskCallback = onlyOnce(next); args.push(taskCallback); - var task = wrapAsync$1(tasks[taskIndex++]); task.apply(null, args); } - nextTask([]); + function next(err /*, ...args*/) { + if (err || taskIndex === tasks.length) { + return callback.apply(null, arguments); + } + args = slice(arguments, 1); + nextTask(); + } + + nextTask(); }; /** @@ -5280,7 +5240,7 @@ var waterfall = function (tasks, callback) { var index = { applyEach: applyEach, applyEachSeries: applyEachSeries, - apply: apply$2, + apply: apply, asyncify: asyncify, auto: auto, autoInject: autoInject, @@ -5337,7 +5297,7 @@ var index = { rejectSeries: rejectSeries, retry: retry, retryable: retryable, - seq: seq$1, + seq: seq, series: series, setImmediate: setImmediate$1, some: some, @@ -5375,7 +5335,7 @@ var index = { exports['default'] = index; exports.applyEach = applyEach; exports.applyEachSeries = applyEachSeries; -exports.apply = apply$2; +exports.apply = apply; exports.asyncify = asyncify; exports.auto = auto; exports.autoInject = autoInject; @@ -5432,7 +5392,7 @@ exports.rejectLimit = rejectLimit; exports.rejectSeries = rejectSeries; exports.retry = retry; exports.retryable = retryable; -exports.seq = seq$1; +exports.seq = seq; exports.series = series; exports.setImmediate = setImmediate$1; exports.some = some; diff --git a/dist/async.min.js b/dist/async.min.js index afd1022c1..65fe89c07 100644 --- a/dist/async.min.js +++ b/dist/async.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e.async=e.async||{})}(this,function(exports){"use strict";function apply(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}function overRest$1(e,t,r){return t=nativeMax(void 0===t?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=nativeMax(n.length-t,0),a=Array(i);++o-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function isArrayLike(e){return null!=e&&isLength(e.length)&&!isFunction(e)}function noop(){}function once(e){return function(){if(null!==e){var t=e;e=null,t.apply(this,arguments)}}}function baseTimes(e,t){for(var r=-1,n=Array(e);++r-1&&e%1==0&&eo?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(o);++n=n?e:baseSlice(e,t,r)}function charsEndIndex(e,t){for(var r=e.length;r--&&baseIndexOf(t,e[r],0)>-1;);return r}function charsStartIndex(e,t){for(var r=-1,n=e.length;++r-1;);return r}function asciiToArray(e){return e.split("")}function hasUnicode(e){return reHasUnicode.test(e)}function unicodeToArray(e){return e.match(reUnicode)||[]}function stringToArray(e){return hasUnicode(e)?unicodeToArray(e):asciiToArray(e)}function toString(e){return null==e?"":baseToString(e)}function trim(e,t,r){if(e=toString(e),e&&(r||void 0===t))return e.replace(reTrim,"");if(!e||!(t=baseToString(t)))return e;var n=stringToArray(e),o=stringToArray(t),i=charsStartIndex(n,o),a=charsEndIndex(n,o)+1;return castSlice(n,i,a).join("")}function parseParams(e){return e=e.toString().replace(STRIP_COMMENTS,""),e=e.match(FN_ARGS)[2].replace(" ",""),e=e?e.split(FN_ARG_SPLIT):[],e=e.map(function(e){return trim(e.replace(FN_ARG,""))})}function autoInject(e,t){var r={};baseForOwn(e,function(e,t){function n(t,r){var n=arrayMap(o,function(e){return t[e]});n.push(r),wrapAsync$1(e).apply(null,n)}var o,i=isAsync(e),a=!i&&1===e.length||i&&0===e.length;if(isArray(e))o=e.slice(0,-1),e=e[e.length-1],r[t]=o.concat(o.length>0?n:e);else if(a)r[t]=e;else{if(o=parseParams(e),0===e.length&&!i&&0===o.length)throw new Error("autoInject task functions require explicit parameters.");i||o.pop(),r[t]=o.concat(n)}}),auto(r,t)}function fallback(e){setTimeout(e,0)}function wrap(e){return rest(function(t,r){e(function(){t.apply(null,r)})})}function DLL(){this.head=this.tail=null,this.length=0}function setInitial(e,t){e.length=1,e.head=e.tail=t}function queue(e,t,r){function n(e,t,r){if(null!=r&&"function"!=typeof r)throw new Error("task callback must be a function");if(u.started=!0,isArray(e)||(e=[e]),0===e.length&&u.idle())return setImmediate$1(function(){u.drain()});for(var n=0,o=e.length;n=0&&s.splice(i),o.callback.apply(o,t),null!=t[0]&&u.error(t[0],o.data)}a<=u.concurrency-u.buffer&&u.unsaturated(),u.idle()&&u.drain(),u.process()})}if(null==t)t=1;else if(0===t)throw new Error("Concurrency must not be zero");var i=wrapAsync$1(e),a=0,s=[],c=!1,u={_tasks:new DLL,concurrency:t,payload:r,saturated:noop,unsaturated:noop,buffer:t/4,empty:noop,drain:noop,error:noop,started:!1,paused:!1,push:function(e,t){n(e,!1,t)},kill:function(){u.drain=noop,u._tasks.empty()},unshift:function(e,t){n(e,!0,t)},process:function(){if(!c){for(c=!0;!u.paused&&a1&&(n=t),r(null,{value:n})}})),t.apply(this,e)})}function reject$1(e,t,r,n){_filter(e,t,function(e,t){r(e,function(e,r){t(e,!r)})},n)}function reflectAll(e){var t;return isArray(e)?t=arrayMap(e,reflect):(t={},baseForOwn(e,function(e,r){t[r]=reflect.call(this,e)})),t}function constant$1(e){return function(){return e}}function retry(e,t,r){function n(e,t){if("object"==typeof t)e.times=+t.times||i,e.intervalFunc="function"==typeof t.interval?t.interval:constant$1(+t.interval||a),e.errorFilter=t.errorFilter;else{if("number"!=typeof t&&"string"!=typeof t)throw new Error("Invalid arguments for async.retry");e.times=+t||i}}function o(){c(function(e){e&&u++n?1:0}var o=wrapAsync$1(t);map(e,function(e,t){o(e,function(r,n){return r?t(r):void t(null,{value:e,criteria:n})})},function(e,t){return e?r(e):void r(null,arrayMap(t.sort(n),baseProperty("value")))})}function timeout(e,t,r){function n(){s||(i.apply(null,arguments),clearTimeout(a))}function o(){var t=e.name||"anonymous",n=new Error('Callback function "'+t+'" timed out.');n.code="ETIMEDOUT",r&&(n.info=r),s=!0,i(n)}var i,a,s=!1,c=wrapAsync$1(e);return initialParams(function(e,r){i=r,a=setTimeout(o,t),c.apply(null,e.concat(n))})}function baseRange(e,t,r,n){for(var o=-1,i=nativeMax$1(nativeCeil((t-e)/(r||1)),0),a=Array(i);i--;)a[n?i:++o]=e,e+=r;return a}function timeLimit(e,t,r,n){var o=wrapAsync$1(r);mapLimit(baseRange(0,e,1),t,o,n)}function transform(e,t,r,n){arguments.length<=3&&(n=r,r=t,t=isArray(e)?[]:{}),n=once(n||noop);var o=wrapAsync$1(r);eachOf(e,function(e,r,n){o(t,e,r,n)},function(e){n(e,t)})}function unmemoize(e){return function(){return(e.unmemoized||e).apply(null,arguments)}}function whilst(e,t,r){r=onlyOnce(r||noop);var n=wrapAsync$1(t);if(!e())return r(null);var o=rest(function(t,i){return t?r(t):e()?n(o):void r.apply(null,[null].concat(i))});n(o)}function until(e,t,r){whilst(function(){return!e.apply(this,arguments)},t,r)}var nativeMax=Math.max,initialParams=function(e){return rest(function(t){var r=t.pop();e.call(this,t,r)})},supportsSymbol="function"==typeof Symbol,wrapAsync$1=supportsAsync()?wrapAsync:identity,freeGlobal="object"==typeof global&&global&&global.Object===Object&&global,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),Symbol$1=root.Symbol,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeObjectToString=objectProto.toString,symToStringTag$1=Symbol$1?Symbol$1.toStringTag:void 0,objectProto$1=Object.prototype,nativeObjectToString$1=objectProto$1.toString,nullTag="[object Null]",undefinedTag="[object Undefined]",symToStringTag=Symbol$1?Symbol$1.toStringTag:void 0,asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]",MAX_SAFE_INTEGER=9007199254740991,breakLoop={},iteratorSymbol="function"==typeof Symbol&&Symbol.iterator,getIterator=function(e){return iteratorSymbol&&e[iteratorSymbol]&&e[iteratorSymbol]()},argsTag="[object Arguments]",objectProto$3=Object.prototype,hasOwnProperty$2=objectProto$3.hasOwnProperty,propertyIsEnumerable=objectProto$3.propertyIsEnumerable,isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(e){return isObjectLike(e)&&hasOwnProperty$2.call(e,"callee")&&!propertyIsEnumerable.call(e,"callee")},isArray=Array.isArray,freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,Buffer=moduleExports?root.Buffer:void 0,nativeIsBuffer=Buffer?Buffer.isBuffer:void 0,isBuffer=nativeIsBuffer||stubFalse,MAX_SAFE_INTEGER$1=9007199254740991,reIsUint=/^(?:0|[1-9]\d*)$/,argsTag$1="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag$1="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag$1]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag$1]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var freeExports$1="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule$1=freeExports$1&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports$1=freeModule$1&&freeModule$1.exports===freeExports$1,freeProcess=moduleExports$1&&freeGlobal.process,nodeUtil=function(){try{return freeProcess&&freeProcess.binding("util")}catch(e){}}(),nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray,isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray,objectProto$2=Object.prototype,hasOwnProperty$1=objectProto$2.hasOwnProperty,objectProto$5=Object.prototype,nativeKeys=overArg(Object.keys,Object),objectProto$4=Object.prototype,hasOwnProperty$3=objectProto$4.hasOwnProperty,eachOfGeneric=doLimit(eachOfLimit,1/0),eachOf=function(e,t,r){var n=isArrayLike(e)?eachOfArrayLike:eachOfGeneric;n(e,wrapAsync$1(t),r)},map=doParallel(_asyncMap),applyEach=applyEach$1(map),mapLimit=doParallelLimit(_asyncMap),mapSeries=doLimit(mapLimit,1),applyEachSeries=applyEach$1(mapSeries),apply$2=rest(function(e,t){return rest(function(r){return e.apply(null,t.concat(r))})}),baseFor=createBaseFor(),auto=function(e,t,r){function n(e,t){g.push(function(){s(e,t)})}function o(){if(0===g.length&&0===y)return r(null,p);for(;g.length&&y1?o(p,n):o(n)}}function c(){for(var e,t=0;h.length;)e=h.pop(),t++,arrayEach(u(e),function(e){0===--b[e]&&h.push(e)});if(t!==f)throw new Error("async.auto cannot execute tasks due to a recursive dependency")}function u(t){var r=[];return baseForOwn(e,function(e,n){isArray(e)&&baseIndexOf(e,t,0)>=0&&r.push(n)}),r}"function"==typeof t&&(r=t,t=null),r=once(r||noop);var l=keys(e),f=l.length;if(!f)return r(null);t||(t=f);var p={},y=0,m=!1,d=Object.create(null),g=[],h=[],b={};baseForOwn(e,function(t,r){if(!isArray(t))return n(r,[t]),void h.push(r);var o=t.slice(0,t.length-1),a=o.length;return 0===a?(n(r,t),void h.push(r)):(b[r]=a,void arrayEach(o,function(s){if(!e[s])throw new Error("async.auto task `"+r+"` has a non-existent dependency `"+s+"` in "+o.join(", "));i(s,function(){a--,0===a&&n(r,t)})}))}),c(),o()},symbolTag="[object Symbol]",INFINITY=1/0,symbolProto=Symbol$1?Symbol$1.prototype:void 0,symbolToString=symbolProto?symbolProto.toString:void 0,rsAstralRange="\\ud800-\\udfff",rsComboMarksRange="\\u0300-\\u036f\\ufe20-\\ufe23",rsComboSymbolsRange="\\u20d0-\\u20f0",rsVarRange="\\ufe0e\\ufe0f",rsZWJ="\\u200d",reHasUnicode=RegExp("["+rsZWJ+rsAstralRange+rsComboMarksRange+rsComboSymbolsRange+rsVarRange+"]"),rsAstralRange$1="\\ud800-\\udfff",rsComboMarksRange$1="\\u0300-\\u036f\\ufe20-\\ufe23",rsComboSymbolsRange$1="\\u20d0-\\u20f0",rsVarRange$1="\\ufe0e\\ufe0f",rsAstral="["+rsAstralRange$1+"]",rsCombo="["+rsComboMarksRange$1+rsComboSymbolsRange$1+"]",rsFitz="\\ud83c[\\udffb-\\udfff]",rsModifier="(?:"+rsCombo+"|"+rsFitz+")",rsNonAstral="[^"+rsAstralRange$1+"]",rsRegional="(?:\\ud83c[\\udde6-\\uddff]){2}",rsSurrPair="[\\ud800-\\udbff][\\udc00-\\udfff]",rsZWJ$1="\\u200d",reOptMod=rsModifier+"?",rsOptVar="["+rsVarRange$1+"]?",rsOptJoin="(?:"+rsZWJ$1+"(?:"+[rsNonAstral,rsRegional,rsSurrPair].join("|")+")"+rsOptVar+reOptMod+")*",rsSeq=rsOptVar+reOptMod+rsOptJoin,rsSymbol="(?:"+[rsNonAstral+rsCombo+"?",rsCombo,rsRegional,rsSurrPair,rsAstral].join("|")+")",reUnicode=RegExp(rsFitz+"(?="+rsFitz+")|"+rsSymbol+rsSeq,"g"),reTrim=/^\s+|\s+$/g,FN_ARGS=/^(?:async\s+)?(function)?\s*[^\(]*\(\s*([^\)]*)\)/m,FN_ARG_SPLIT=/,/,FN_ARG=/(=.+)?(\s*)$/,STRIP_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,hasSetImmediate="function"==typeof setImmediate&&setImmediate,hasNextTick="object"==typeof process&&"function"==typeof process.nextTick,_defer;_defer=hasSetImmediate?setImmediate:hasNextTick?process.nextTick:fallback;var setImmediate$1=wrap(_defer);DLL.prototype.removeLink=function(e){return e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=e.next=null,this.length-=1,e},DLL.prototype.empty=DLL,DLL.prototype.insertAfter=function(e,t){t.prev=e,t.next=e.next,e.next?e.next.prev=t:this.tail=t,e.next=t,this.length+=1},DLL.prototype.insertBefore=function(e,t){t.prev=e.prev,t.next=e,e.prev?e.prev.next=t:this.head=t,e.prev=t,this.length+=1},DLL.prototype.unshift=function(e){this.head?this.insertBefore(this.head,e):setInitial(this,e)},DLL.prototype.push=function(e){this.tail?this.insertAfter(this.tail,e):setInitial(this,e)},DLL.prototype.shift=function(){return this.head&&this.removeLink(this.head)},DLL.prototype.pop=function(){return this.tail&&this.removeLink(this.tail)};var eachOfSeries=doLimit(eachOfLimit,1),seq$1=rest(function(e){var t=arrayMap(e,wrapAsync$1);return rest(function(e){var r=this,n=e[e.length-1];"function"==typeof n?e.pop():n=noop,reduce(t,e,function(e,t,n){t.apply(r,e.concat(rest(function(e,t){n(e,t)})))},function(e,t){n.apply(r,[e].concat(t))})})}),compose=rest(function(e){return seq$1.apply(null,e.reverse())}),concat=doParallel(concat$1),concatSeries=doSeries(concat$1),constant=rest(function(e){var t=[null].concat(e);return initialParams(function(e,r){return r.apply(this,t)})}),detect=doParallel(_createTester(identity,_findGetResult)),detectLimit=doParallelLimit(_createTester(identity,_findGetResult)),detectSeries=doLimit(detectLimit,1),dir=consoleFunc("dir"),eachSeries=doLimit(eachLimit$1,1),every=doParallel(_createTester(notId,notId)),everyLimit=doParallelLimit(_createTester(notId,notId)),everySeries=doLimit(everyLimit,1),filter=doParallel(_filter),filterLimit=doParallelLimit(_filter),filterSeries=doLimit(filterLimit,1),groupByLimit=function(e,t,r,n){n=n||noop;var o=wrapAsync$1(r);mapLimit(e,t,function(e,t){o(e,function(r,n){return r?t(r):t(null,{key:n,val:e})})},function(e,t){for(var r={},o=Object.prototype.hasOwnProperty,i=0;i=o.priority;)o=o.next;for(var i=0,a=e.length;i-1&&e%1==0&&e<=MAX_SAFE_INTEGER}function isArrayLike(e){return null!=e&&isLength(e.length)&&!isFunction(e)}function noop(){}function once(e){return function(){if(null!==e){var t=e;e=null,t.apply(this,arguments)}}}function baseTimes(e,t){for(var r=-1,n=Array(e);++r-1&&e%1==0&&ei?0:i+t),r=r>i?i:r,r<0&&(r+=i),i=t>r?0:r-t>>>0,t>>>=0;for(var o=Array(i);++n=n?e:baseSlice(e,t,r)}function charsEndIndex(e,t){for(var r=e.length;r--&&baseIndexOf(t,e[r],0)>-1;);return r}function charsStartIndex(e,t){for(var r=-1,n=e.length;++r-1;);return r}function asciiToArray(e){return e.split("")}function hasUnicode(e){return reHasUnicode.test(e)}function unicodeToArray(e){return e.match(reUnicode)||[]}function stringToArray(e){return hasUnicode(e)?unicodeToArray(e):asciiToArray(e)}function toString(e){return null==e?"":baseToString(e)}function trim(e,t,r){if(e=toString(e),e&&(r||void 0===t))return e.replace(reTrim,"");if(!e||!(t=baseToString(t)))return e;var n=stringToArray(e),i=stringToArray(t),o=charsStartIndex(n,i),a=charsEndIndex(n,i)+1;return castSlice(n,o,a).join("")}function parseParams(e){return e=e.toString().replace(STRIP_COMMENTS,""),e=e.match(FN_ARGS)[2].replace(" ",""),e=e?e.split(FN_ARG_SPLIT):[],e=e.map(function(e){return trim(e.replace(FN_ARG,""))})}function autoInject(e,t){var r={};baseForOwn(e,function(e,t){function n(t,r){var n=arrayMap(i,function(e){return t[e]});n.push(r),wrapAsync$1(e).apply(null,n)}var i,o=isAsync(e),a=!o&&1===e.length||o&&0===e.length;if(isArray(e))i=e.slice(0,-1),e=e[e.length-1],r[t]=i.concat(i.length>0?n:e);else if(a)r[t]=e;else{if(i=parseParams(e),0===e.length&&!o&&0===i.length)throw new Error("autoInject task functions require explicit parameters.");o||i.pop(),r[t]=i.concat(n)}}),auto(r,t)}function fallback(e){setTimeout(e,0)}function wrap(e){return function(t){var r=slice(arguments,1);e(function(){t.apply(null,r)})}}function DLL(){this.head=this.tail=null,this.length=0}function setInitial(e,t){e.length=1,e.head=e.tail=t}function queue(e,t,r){function n(e,t,r){if(null!=r&&"function"!=typeof r)throw new Error("task callback must be a function");if(u.started=!0,isArray(e)||(e=[e]),0===e.length&&u.idle())return setImmediate$1(function(){u.drain()});for(var n=0,i=e.length;n=0&&s.splice(o),i.callback.apply(i,arguments),null!=t&&u.error(t,i.data)}a<=u.concurrency-u.buffer&&u.unsaturated(),u.idle()&&u.drain(),u.process()}}if(null==t)t=1;else if(0===t)throw new Error("Concurrency must not be zero");var o=wrapAsync$1(e),a=0,s=[],c=!1,u={_tasks:new DLL,concurrency:t,payload:r,saturated:noop,unsaturated:noop,buffer:t/4,empty:noop,drain:noop,error:noop,started:!1,paused:!1,push:function(e,t){n(e,!1,t)},kill:function(){u.drain=noop,u._tasks.empty()},unshift:function(e,t){n(e,!0,t)},process:function(){if(!c){for(c=!0;!u.paused&&a2&&(i=slice(arguments,1)),n[t]=i,r(e)})},function(e){r(e,n)})}function parallelLimit(e,t){_parallel(eachOf,e,t)}function parallelLimit$1(e,t,r){_parallel(_eachOfLimit(t),e,r)}function race(e,t){if(t=once(t||noop),!isArray(e))return t(new TypeError("First argument to race must be an array of functions"));if(!e.length)return t();for(var r=0,n=e.length;r2&&(n=slice(arguments,1)),r(null,{value:n})}}),t.apply(this,e)})}function reject$1(e,t,r,n){_filter(e,t,function(e,t){r(e,function(e,r){t(e,!r)})},n)}function reflectAll(e){var t;return isArray(e)?t=arrayMap(e,reflect):(t={},baseForOwn(e,function(e,r){t[r]=reflect.call(this,e)})),t}function constant$1(e){return function(){return e}}function retry(e,t,r){function n(e,t){if("object"==typeof t)e.times=+t.times||o,e.intervalFunc="function"==typeof t.interval?t.interval:constant$1(+t.interval||a),e.errorFilter=t.errorFilter;else{if("number"!=typeof t&&"string"!=typeof t)throw new Error("Invalid arguments for async.retry");e.times=+t||o}}function i(){c(function(e){e&&u++n?1:0}var i=wrapAsync$1(t);map(e,function(e,t){i(e,function(r,n){return r?t(r):void t(null,{value:e,criteria:n})})},function(e,t){return e?r(e):void r(null,arrayMap(t.sort(n),baseProperty("value")))})}function timeout(e,t,r){function n(){s||(o.apply(null,arguments),clearTimeout(a))}function i(){var t=e.name||"anonymous",n=new Error('Callback function "'+t+'" timed out.');n.code="ETIMEDOUT",r&&(n.info=r),s=!0,o(n)}var o,a,s=!1,c=wrapAsync$1(e);return initialParams(function(e,r){o=r,a=setTimeout(i,t),c.apply(null,e.concat(n))})}function baseRange(e,t,r,n){for(var i=-1,o=nativeMax(nativeCeil((t-e)/(r||1)),0),a=Array(o);o--;)a[n?o:++i]=e,e+=r;return a}function timeLimit(e,t,r,n){var i=wrapAsync$1(r);mapLimit(baseRange(0,e,1),t,i,n)}function transform(e,t,r,n){arguments.length<=3&&(n=r,r=t,t=isArray(e)?[]:{}),n=once(n||noop);var i=wrapAsync$1(r);eachOf(e,function(e,r,n){i(t,e,r,n)},function(e){n(e,t)})}function unmemoize(e){return function(){return(e.unmemoized||e).apply(null,arguments)}}function whilst(e,t,r){r=onlyOnce(r||noop);var n=wrapAsync$1(t);if(!e())return r(null);var i=function(t){return t?r(t):e()?n(i):void r.apply(null,[null].concat(slice(arguments,1)))};n(i)}function until(e,t,r){whilst(function(){return!e.apply(this,arguments)},t,r)}var initialParams=function(e){return function(){var t=slice(arguments),r=t.pop();e.call(this,t,r)}},supportsSymbol="function"==typeof Symbol,wrapAsync$1=supportsAsync()?wrapAsync:identity,freeGlobal="object"==typeof global&&global&&global.Object===Object&&global,freeSelf="object"==typeof self&&self&&self.Object===Object&&self,root=freeGlobal||freeSelf||Function("return this")(),Symbol$1=root.Symbol,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,nativeObjectToString=objectProto.toString,symToStringTag$1=Symbol$1?Symbol$1.toStringTag:void 0,objectProto$1=Object.prototype,nativeObjectToString$1=objectProto$1.toString,nullTag="[object Null]",undefinedTag="[object Undefined]",symToStringTag=Symbol$1?Symbol$1.toStringTag:void 0,asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]",MAX_SAFE_INTEGER=9007199254740991,breakLoop={},iteratorSymbol="function"==typeof Symbol&&Symbol.iterator,getIterator=function(e){return iteratorSymbol&&e[iteratorSymbol]&&e[iteratorSymbol]()},argsTag="[object Arguments]",objectProto$3=Object.prototype,hasOwnProperty$2=objectProto$3.hasOwnProperty,propertyIsEnumerable=objectProto$3.propertyIsEnumerable,isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(e){return isObjectLike(e)&&hasOwnProperty$2.call(e,"callee")&&!propertyIsEnumerable.call(e,"callee")},isArray=Array.isArray,freeExports="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule=freeExports&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports=freeModule&&freeModule.exports===freeExports,Buffer=moduleExports?root.Buffer:void 0,nativeIsBuffer=Buffer?Buffer.isBuffer:void 0,isBuffer=nativeIsBuffer||stubFalse,MAX_SAFE_INTEGER$1=9007199254740991,reIsUint=/^(?:0|[1-9]\d*)$/,argsTag$1="[object Arguments]",arrayTag="[object Array]",boolTag="[object Boolean]",dateTag="[object Date]",errorTag="[object Error]",funcTag$1="[object Function]",mapTag="[object Map]",numberTag="[object Number]",objectTag="[object Object]",regexpTag="[object RegExp]",setTag="[object Set]",stringTag="[object String]",weakMapTag="[object WeakMap]",arrayBufferTag="[object ArrayBuffer]",dataViewTag="[object DataView]",float32Tag="[object Float32Array]",float64Tag="[object Float64Array]",int8Tag="[object Int8Array]",int16Tag="[object Int16Array]",int32Tag="[object Int32Array]",uint8Tag="[object Uint8Array]",uint8ClampedTag="[object Uint8ClampedArray]",uint16Tag="[object Uint16Array]",uint32Tag="[object Uint32Array]",typedArrayTags={};typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=typedArrayTags[uint32Tag]=!0,typedArrayTags[argsTag$1]=typedArrayTags[arrayTag]=typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=typedArrayTags[errorTag]=typedArrayTags[funcTag$1]=typedArrayTags[mapTag]=typedArrayTags[numberTag]=typedArrayTags[objectTag]=typedArrayTags[regexpTag]=typedArrayTags[setTag]=typedArrayTags[stringTag]=typedArrayTags[weakMapTag]=!1;var freeExports$1="object"==typeof exports&&exports&&!exports.nodeType&&exports,freeModule$1=freeExports$1&&"object"==typeof module&&module&&!module.nodeType&&module,moduleExports$1=freeModule$1&&freeModule$1.exports===freeExports$1,freeProcess=moduleExports$1&&freeGlobal.process,nodeUtil=function(){try{return freeProcess&&freeProcess.binding("util")}catch(e){}}(),nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray,isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray,objectProto$2=Object.prototype,hasOwnProperty$1=objectProto$2.hasOwnProperty,objectProto$5=Object.prototype,nativeKeys=overArg(Object.keys,Object),objectProto$4=Object.prototype,hasOwnProperty$3=objectProto$4.hasOwnProperty,eachOfGeneric=doLimit(eachOfLimit,1/0),eachOf=function(e,t,r){var n=isArrayLike(e)?eachOfArrayLike:eachOfGeneric;n(e,wrapAsync$1(t),r)},map=doParallel(_asyncMap),applyEach=applyEach$1(map),mapLimit=doParallelLimit(_asyncMap),mapSeries=doLimit(mapLimit,1),applyEachSeries=applyEach$1(mapSeries),apply=function(e){var t=slice(arguments,1);return function(){var r=slice(arguments);return e.apply(null,t.concat(r))}},baseFor=createBaseFor(),auto=function(e,t,r){function n(e,t){g.push(function(){s(e,t)})}function i(){if(0===g.length&&0===y)return r(null,p);for(;g.length&&y2&&(n=slice(arguments,1)),t){var i={};baseForOwn(p,function(e,t){i[t]=e}),i[e]=n,m=!0,d=Object.create(null),r(t,i)}else p[e]=n,a(e)});y++;var i=wrapAsync$1(t[t.length-1]);t.length>1?i(p,n):i(n)}}function c(){for(var e,t=0;h.length;)e=h.pop(),t++,arrayEach(u(e),function(e){0===--b[e]&&h.push(e)});if(t!==f)throw new Error("async.auto cannot execute tasks due to a recursive dependency")}function u(t){var r=[];return baseForOwn(e,function(e,n){isArray(e)&&baseIndexOf(e,t,0)>=0&&r.push(n)}),r}"function"==typeof t&&(r=t,t=null),r=once(r||noop);var l=keys(e),f=l.length;if(!f)return r(null);t||(t=f);var p={},y=0,m=!1,d=Object.create(null),g=[],h=[],b={};baseForOwn(e,function(t,r){if(!isArray(t))return n(r,[t]),void h.push(r);var i=t.slice(0,t.length-1),a=i.length;return 0===a?(n(r,t),void h.push(r)):(b[r]=a,void arrayEach(i,function(s){if(!e[s])throw new Error("async.auto task `"+r+"` has a non-existent dependency `"+s+"` in "+i.join(", "));o(s,function(){a--,0===a&&n(r,t)})}))}),c(),i()},symbolTag="[object Symbol]",INFINITY=1/0,symbolProto=Symbol$1?Symbol$1.prototype:void 0,symbolToString=symbolProto?symbolProto.toString:void 0,rsAstralRange="\\ud800-\\udfff",rsComboMarksRange="\\u0300-\\u036f\\ufe20-\\ufe23",rsComboSymbolsRange="\\u20d0-\\u20f0",rsVarRange="\\ufe0e\\ufe0f",rsZWJ="\\u200d",reHasUnicode=RegExp("["+rsZWJ+rsAstralRange+rsComboMarksRange+rsComboSymbolsRange+rsVarRange+"]"),rsAstralRange$1="\\ud800-\\udfff",rsComboMarksRange$1="\\u0300-\\u036f\\ufe20-\\ufe23",rsComboSymbolsRange$1="\\u20d0-\\u20f0",rsVarRange$1="\\ufe0e\\ufe0f",rsAstral="["+rsAstralRange$1+"]",rsCombo="["+rsComboMarksRange$1+rsComboSymbolsRange$1+"]",rsFitz="\\ud83c[\\udffb-\\udfff]",rsModifier="(?:"+rsCombo+"|"+rsFitz+")",rsNonAstral="[^"+rsAstralRange$1+"]",rsRegional="(?:\\ud83c[\\udde6-\\uddff]){2}",rsSurrPair="[\\ud800-\\udbff][\\udc00-\\udfff]",rsZWJ$1="\\u200d",reOptMod=rsModifier+"?",rsOptVar="["+rsVarRange$1+"]?",rsOptJoin="(?:"+rsZWJ$1+"(?:"+[rsNonAstral,rsRegional,rsSurrPair].join("|")+")"+rsOptVar+reOptMod+")*",rsSeq=rsOptVar+reOptMod+rsOptJoin,rsSymbol="(?:"+[rsNonAstral+rsCombo+"?",rsCombo,rsRegional,rsSurrPair,rsAstral].join("|")+")",reUnicode=RegExp(rsFitz+"(?="+rsFitz+")|"+rsSymbol+rsSeq,"g"),reTrim=/^\s+|\s+$/g,FN_ARGS=/^(?:async\s+)?(function)?\s*[^\(]*\(\s*([^\)]*)\)/m,FN_ARG_SPLIT=/,/,FN_ARG=/(=.+)?(\s*)$/,STRIP_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,hasSetImmediate="function"==typeof setImmediate&&setImmediate,hasNextTick="object"==typeof process&&"function"==typeof process.nextTick,_defer;_defer=hasSetImmediate?setImmediate:hasNextTick?process.nextTick:fallback;var setImmediate$1=wrap(_defer);DLL.prototype.removeLink=function(e){return e.prev?e.prev.next=e.next:this.head=e.next,e.next?e.next.prev=e.prev:this.tail=e.prev,e.prev=e.next=null,this.length-=1,e},DLL.prototype.empty=DLL,DLL.prototype.insertAfter=function(e,t){t.prev=e,t.next=e.next,e.next?e.next.prev=t:this.tail=t,e.next=t,this.length+=1},DLL.prototype.insertBefore=function(e,t){t.prev=e.prev,t.next=e,e.prev?e.prev.next=t:this.head=t,e.prev=t,this.length+=1},DLL.prototype.unshift=function(e){this.head?this.insertBefore(this.head,e):setInitial(this,e)},DLL.prototype.push=function(e){this.tail?this.insertAfter(this.tail,e):setInitial(this,e)},DLL.prototype.shift=function(){return this.head&&this.removeLink(this.head)},DLL.prototype.pop=function(){return this.tail&&this.removeLink(this.tail)};var eachOfSeries=doLimit(eachOfLimit,1),compose=function(){return seq.apply(null,slice(arguments).reverse())},concat=doParallel(concat$1),concatSeries=doSeries(concat$1),constant=function(){var e=slice(arguments),t=[null].concat(e);return function(){var e=arguments[arguments.length-1];return e.apply(this,t)}},detect=doParallel(_createTester(identity,_findGetResult)),detectLimit=doParallelLimit(_createTester(identity,_findGetResult)),detectSeries=doLimit(detectLimit,1),dir=consoleFunc("dir"),eachSeries=doLimit(eachLimit$1,1),every=doParallel(_createTester(notId,notId)),everyLimit=doParallelLimit(_createTester(notId,notId)),everySeries=doLimit(everyLimit,1),filter=doParallel(_filter),filterLimit=doParallelLimit(_filter),filterSeries=doLimit(filterLimit,1),groupByLimit=function(e,t,r,n){n=n||noop;var i=wrapAsync$1(r);mapLimit(e,t,function(e,t){i(e,function(r,n){return r?t(r):t(null,{key:n,val:e})})},function(e,t){for(var r={},i=Object.prototype.hasOwnProperty,o=0;o=i.priority;)i=i.next;for(var o=0,a=e.length;o Date: Tue, 4 Apr 2017 16:37:38 -0700 Subject: [PATCH 11/12] small fixes from review --- lib/apply.js | 2 +- lib/internal/consoleFunc.js | 8 ++++---- lib/reflect.js | 20 ++++++++++---------- lib/waterfall.js | 12 ++++-------- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/apply.js b/lib/apply.js index b1ca55a87..06f630a52 100644 --- a/lib/apply.js +++ b/lib/apply.js @@ -45,7 +45,7 @@ import slice from './internal/slice'; * two * three */ -export default function(fn/*, args*/) { +export default function(fn/*, ...args*/) { var args = slice(arguments, 1); return function(/*callArgs*/) { var callArgs = slice(arguments); diff --git a/lib/internal/consoleFunc.js b/lib/internal/consoleFunc.js index 92f7e863a..eb2e88678 100644 --- a/lib/internal/consoleFunc.js +++ b/lib/internal/consoleFunc.js @@ -5,20 +5,20 @@ import wrapAsync from './wrapAsync'; export default function consoleFunc(name) { return function (fn/*, ...args*/) { var args = slice(arguments, 1); - wrapAsync(fn).apply(null, args.concat(function (err/*, ...args*/) { + args.push(function (err/*, ...args*/) { var args = slice(arguments, 1); if (typeof console === 'object') { if (err) { if (console.error) { console.error(err); } - } - else if (console[name]) { + } else if (console[name]) { arrayEach(args, function (x) { console[name](x); }); } } - })); + }) + wrapAsync(fn).apply(null, args); }; } diff --git a/lib/reflect.js b/lib/reflect.js index d61c31e44..f50d81769 100644 --- a/lib/reflect.js +++ b/lib/reflect.js @@ -44,17 +44,17 @@ import wrapAsync from './internal/wrapAsync'; export default function reflect(fn) { var _fn = wrapAsync(fn); return initialParams(function reflectOn(args, reflectCallback) { - args.push(function callback(err, cbArg) { - if (err) { - reflectCallback(null, { - error: err - }); + args.push(function callback(error, cbArg) { + if (error) { + reflectCallback(null, { error: error }); } else { - var value = cbArg; - if (arguments.length > 2) value = slice(arguments, 1); - reflectCallback(null, { - value: value - }); + var value; + if (arguments.length <= 2) { + value = cbArg + } else { + value = slice(arguments, 1); + } + reflectCallback(null, { value: value }); } }); diff --git a/lib/waterfall.js b/lib/waterfall.js index e4c033a96..092f3ac31 100644 --- a/lib/waterfall.js +++ b/lib/waterfall.js @@ -68,13 +68,10 @@ export default function(tasks, callback) { if (!isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions')); if (!tasks.length) return callback(); var taskIndex = 0; - var args = []; - function nextTask() { + function nextTask(args) { var task = wrapAsync(tasks[taskIndex++]); - var taskCallback = onlyOnce(next); - args.push(taskCallback); - + args.push(onlyOnce(next)); task.apply(null, args); } @@ -82,9 +79,8 @@ export default function(tasks, callback) { if (err || taskIndex === tasks.length) { return callback.apply(null, arguments); } - args = slice(arguments, 1); - nextTask(); + nextTask(slice(arguments, 1)); } - nextTask(); + nextTask([]); } From 6ef3a914a8c94177dd1c3aaecb5a8e6c6dbef9f3 Mon Sep 17 00:00:00 2001 From: Alexander Early Date: Tue, 4 Apr 2017 16:38:53 -0700 Subject: [PATCH 12/12] one more style fix --- lib/whilst.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/whilst.js b/lib/whilst.js index 5838b7926..6c2869ee9 100644 --- a/lib/whilst.js +++ b/lib/whilst.js @@ -45,7 +45,8 @@ export default function whilst(test, iteratee, callback) { var next = function(err/*, ...args*/) { if (err) return callback(err); if (test()) return _iteratee(next); - callback.apply(null, [null].concat(slice(arguments, 1))); + var args = slice(arguments, 1); + callback.apply(null, [null].concat(args)); }; _iteratee(next); }