react / wstein / node_modules / jest-cli / node_modules / istanbul / node_modules / async / lib / async.js
80684 views/*!1* async2* https://github.com/caolan/async3*4* Copyright 2010-2014 Caolan McMahon5* Released under the MIT license6*/7/*jshint onevar: false, indent:4 */8/*global setImmediate: false, setTimeout: false, console: false */9(function () {1011var async = {};1213// global on the server, window in the browser14var root, previous_async;1516root = this;17if (root != null) {18previous_async = root.async;19}2021async.noConflict = function () {22root.async = previous_async;23return async;24};2526function only_once(fn) {27var called = false;28return function() {29if (called) throw new Error("Callback was already called.");30called = true;31fn.apply(root, arguments);32}33}3435//// cross-browser compatiblity functions ////3637var _toString = Object.prototype.toString;3839var _isArray = Array.isArray || function (obj) {40return _toString.call(obj) === '[object Array]';41};4243var _each = function (arr, iterator) {44for (var i = 0; i < arr.length; i += 1) {45iterator(arr[i], i, arr);46}47};4849var _map = function (arr, iterator) {50if (arr.map) {51return arr.map(iterator);52}53var results = [];54_each(arr, function (x, i, a) {55results.push(iterator(x, i, a));56});57return results;58};5960var _reduce = function (arr, iterator, memo) {61if (arr.reduce) {62return arr.reduce(iterator, memo);63}64_each(arr, function (x, i, a) {65memo = iterator(memo, x, i, a);66});67return memo;68};6970var _keys = function (obj) {71if (Object.keys) {72return Object.keys(obj);73}74var keys = [];75for (var k in obj) {76if (obj.hasOwnProperty(k)) {77keys.push(k);78}79}80return keys;81};8283//// exported async module functions ////8485//// nextTick implementation with browser-compatible fallback ////86if (typeof process === 'undefined' || !(process.nextTick)) {87if (typeof setImmediate === 'function') {88async.nextTick = function (fn) {89// not a direct alias for IE10 compatibility90setImmediate(fn);91};92async.setImmediate = async.nextTick;93}94else {95async.nextTick = function (fn) {96setTimeout(fn, 0);97};98async.setImmediate = async.nextTick;99}100}101else {102async.nextTick = process.nextTick;103if (typeof setImmediate !== 'undefined') {104async.setImmediate = function (fn) {105// not a direct alias for IE10 compatibility106setImmediate(fn);107};108}109else {110async.setImmediate = async.nextTick;111}112}113114async.each = function (arr, iterator, callback) {115callback = callback || function () {};116if (!arr.length) {117return callback();118}119var completed = 0;120_each(arr, function (x) {121iterator(x, only_once(done) );122});123function done(err) {124if (err) {125callback(err);126callback = function () {};127}128else {129completed += 1;130if (completed >= arr.length) {131callback();132}133}134}135};136async.forEach = async.each;137138async.eachSeries = function (arr, iterator, callback) {139callback = callback || function () {};140if (!arr.length) {141return callback();142}143var completed = 0;144var iterate = function () {145iterator(arr[completed], function (err) {146if (err) {147callback(err);148callback = function () {};149}150else {151completed += 1;152if (completed >= arr.length) {153callback();154}155else {156iterate();157}158}159});160};161iterate();162};163async.forEachSeries = async.eachSeries;164165async.eachLimit = function (arr, limit, iterator, callback) {166var fn = _eachLimit(limit);167fn.apply(null, [arr, iterator, callback]);168};169async.forEachLimit = async.eachLimit;170171var _eachLimit = function (limit) {172173return function (arr, iterator, callback) {174callback = callback || function () {};175if (!arr.length || limit <= 0) {176return callback();177}178var completed = 0;179var started = 0;180var running = 0;181182(function replenish () {183if (completed >= arr.length) {184return callback();185}186187while (running < limit && started < arr.length) {188started += 1;189running += 1;190iterator(arr[started - 1], function (err) {191if (err) {192callback(err);193callback = function () {};194}195else {196completed += 1;197running -= 1;198if (completed >= arr.length) {199callback();200}201else {202replenish();203}204}205});206}207})();208};209};210211212var doParallel = function (fn) {213return function () {214var args = Array.prototype.slice.call(arguments);215return fn.apply(null, [async.each].concat(args));216};217};218var doParallelLimit = function(limit, fn) {219return function () {220var args = Array.prototype.slice.call(arguments);221return fn.apply(null, [_eachLimit(limit)].concat(args));222};223};224var doSeries = function (fn) {225return function () {226var args = Array.prototype.slice.call(arguments);227return fn.apply(null, [async.eachSeries].concat(args));228};229};230231232var _asyncMap = function (eachfn, arr, iterator, callback) {233arr = _map(arr, function (x, i) {234return {index: i, value: x};235});236if (!callback) {237eachfn(arr, function (x, callback) {238iterator(x.value, function (err) {239callback(err);240});241});242} else {243var results = [];244eachfn(arr, function (x, callback) {245iterator(x.value, function (err, v) {246results[x.index] = v;247callback(err);248});249}, function (err) {250callback(err, results);251});252}253};254async.map = doParallel(_asyncMap);255async.mapSeries = doSeries(_asyncMap);256async.mapLimit = function (arr, limit, iterator, callback) {257return _mapLimit(limit)(arr, iterator, callback);258};259260var _mapLimit = function(limit) {261return doParallelLimit(limit, _asyncMap);262};263264// reduce only has a series version, as doing reduce in parallel won't265// work in many situations.266async.reduce = function (arr, memo, iterator, callback) {267async.eachSeries(arr, function (x, callback) {268iterator(memo, x, function (err, v) {269memo = v;270callback(err);271});272}, function (err) {273callback(err, memo);274});275};276// inject alias277async.inject = async.reduce;278// foldl alias279async.foldl = async.reduce;280281async.reduceRight = function (arr, memo, iterator, callback) {282var reversed = _map(arr, function (x) {283return x;284}).reverse();285async.reduce(reversed, memo, iterator, callback);286};287// foldr alias288async.foldr = async.reduceRight;289290var _filter = function (eachfn, arr, iterator, callback) {291var results = [];292arr = _map(arr, function (x, i) {293return {index: i, value: x};294});295eachfn(arr, function (x, callback) {296iterator(x.value, function (v) {297if (v) {298results.push(x);299}300callback();301});302}, function (err) {303callback(_map(results.sort(function (a, b) {304return a.index - b.index;305}), function (x) {306return x.value;307}));308});309};310async.filter = doParallel(_filter);311async.filterSeries = doSeries(_filter);312// select alias313async.select = async.filter;314async.selectSeries = async.filterSeries;315316var _reject = function (eachfn, arr, iterator, callback) {317var results = [];318arr = _map(arr, function (x, i) {319return {index: i, value: x};320});321eachfn(arr, function (x, callback) {322iterator(x.value, function (v) {323if (!v) {324results.push(x);325}326callback();327});328}, function (err) {329callback(_map(results.sort(function (a, b) {330return a.index - b.index;331}), function (x) {332return x.value;333}));334});335};336async.reject = doParallel(_reject);337async.rejectSeries = doSeries(_reject);338339var _detect = function (eachfn, arr, iterator, main_callback) {340eachfn(arr, function (x, callback) {341iterator(x, function (result) {342if (result) {343main_callback(x);344main_callback = function () {};345}346else {347callback();348}349});350}, function (err) {351main_callback();352});353};354async.detect = doParallel(_detect);355async.detectSeries = doSeries(_detect);356357async.some = function (arr, iterator, main_callback) {358async.each(arr, function (x, callback) {359iterator(x, function (v) {360if (v) {361main_callback(true);362main_callback = function () {};363}364callback();365});366}, function (err) {367main_callback(false);368});369};370// any alias371async.any = async.some;372373async.every = function (arr, iterator, main_callback) {374async.each(arr, function (x, callback) {375iterator(x, function (v) {376if (!v) {377main_callback(false);378main_callback = function () {};379}380callback();381});382}, function (err) {383main_callback(true);384});385};386// all alias387async.all = async.every;388389async.sortBy = function (arr, iterator, callback) {390async.map(arr, function (x, callback) {391iterator(x, function (err, criteria) {392if (err) {393callback(err);394}395else {396callback(null, {value: x, criteria: criteria});397}398});399}, function (err, results) {400if (err) {401return callback(err);402}403else {404var fn = function (left, right) {405var a = left.criteria, b = right.criteria;406return a < b ? -1 : a > b ? 1 : 0;407};408callback(null, _map(results.sort(fn), function (x) {409return x.value;410}));411}412});413};414415async.auto = function (tasks, callback) {416callback = callback || function () {};417var keys = _keys(tasks);418var remainingTasks = keys.length419if (!remainingTasks) {420return callback();421}422423var results = {};424425var listeners = [];426var addListener = function (fn) {427listeners.unshift(fn);428};429var removeListener = function (fn) {430for (var i = 0; i < listeners.length; i += 1) {431if (listeners[i] === fn) {432listeners.splice(i, 1);433return;434}435}436};437var taskComplete = function () {438remainingTasks--439_each(listeners.slice(0), function (fn) {440fn();441});442};443444addListener(function () {445if (!remainingTasks) {446var theCallback = callback;447// prevent final callback from calling itself if it errors448callback = function () {};449450theCallback(null, results);451}452});453454_each(keys, function (k) {455var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];456var taskCallback = function (err) {457var args = Array.prototype.slice.call(arguments, 1);458if (args.length <= 1) {459args = args[0];460}461if (err) {462var safeResults = {};463_each(_keys(results), function(rkey) {464safeResults[rkey] = results[rkey];465});466safeResults[k] = args;467callback(err, safeResults);468// stop subsequent errors hitting callback multiple times469callback = function () {};470}471else {472results[k] = args;473async.setImmediate(taskComplete);474}475};476var requires = task.slice(0, Math.abs(task.length - 1)) || [];477var ready = function () {478return _reduce(requires, function (a, x) {479return (a && results.hasOwnProperty(x));480}, true) && !results.hasOwnProperty(k);481};482if (ready()) {483task[task.length - 1](taskCallback, results);484}485else {486var listener = function () {487if (ready()) {488removeListener(listener);489task[task.length - 1](taskCallback, results);490}491};492addListener(listener);493}494});495};496497async.retry = function(times, task, callback) {498var DEFAULT_TIMES = 5;499var attempts = [];500// Use defaults if times not passed501if (typeof times === 'function') {502callback = task;503task = times;504times = DEFAULT_TIMES;505}506// Make sure times is a number507times = parseInt(times, 10) || DEFAULT_TIMES;508var wrappedTask = function(wrappedCallback, wrappedResults) {509var retryAttempt = function(task, finalAttempt) {510return function(seriesCallback) {511task(function(err, result){512seriesCallback(!err || finalAttempt, {err: err, result: result});513}, wrappedResults);514};515};516while (times) {517attempts.push(retryAttempt(task, !(times-=1)));518}519async.series(attempts, function(done, data){520data = data[data.length - 1];521(wrappedCallback || callback)(data.err, data.result);522});523}524// If a callback is passed, run this as a controll flow525return callback ? wrappedTask() : wrappedTask526};527528async.waterfall = function (tasks, callback) {529callback = callback || function () {};530if (!_isArray(tasks)) {531var err = new Error('First argument to waterfall must be an array of functions');532return callback(err);533}534if (!tasks.length) {535return callback();536}537var wrapIterator = function (iterator) {538return function (err) {539if (err) {540callback.apply(null, arguments);541callback = function () {};542}543else {544var args = Array.prototype.slice.call(arguments, 1);545var next = iterator.next();546if (next) {547args.push(wrapIterator(next));548}549else {550args.push(callback);551}552async.setImmediate(function () {553iterator.apply(null, args);554});555}556};557};558wrapIterator(async.iterator(tasks))();559};560561var _parallel = function(eachfn, tasks, callback) {562callback = callback || function () {};563if (_isArray(tasks)) {564eachfn.map(tasks, function (fn, callback) {565if (fn) {566fn(function (err) {567var args = Array.prototype.slice.call(arguments, 1);568if (args.length <= 1) {569args = args[0];570}571callback.call(null, err, args);572});573}574}, callback);575}576else {577var results = {};578eachfn.each(_keys(tasks), function (k, callback) {579tasks[k](function (err) {580var args = Array.prototype.slice.call(arguments, 1);581if (args.length <= 1) {582args = args[0];583}584results[k] = args;585callback(err);586});587}, function (err) {588callback(err, results);589});590}591};592593async.parallel = function (tasks, callback) {594_parallel({ map: async.map, each: async.each }, tasks, callback);595};596597async.parallelLimit = function(tasks, limit, callback) {598_parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);599};600601async.series = function (tasks, callback) {602callback = callback || function () {};603if (_isArray(tasks)) {604async.mapSeries(tasks, function (fn, callback) {605if (fn) {606fn(function (err) {607var args = Array.prototype.slice.call(arguments, 1);608if (args.length <= 1) {609args = args[0];610}611callback.call(null, err, args);612});613}614}, callback);615}616else {617var results = {};618async.eachSeries(_keys(tasks), function (k, callback) {619tasks[k](function (err) {620var args = Array.prototype.slice.call(arguments, 1);621if (args.length <= 1) {622args = args[0];623}624results[k] = args;625callback(err);626});627}, function (err) {628callback(err, results);629});630}631};632633async.iterator = function (tasks) {634var makeCallback = function (index) {635var fn = function () {636if (tasks.length) {637tasks[index].apply(null, arguments);638}639return fn.next();640};641fn.next = function () {642return (index < tasks.length - 1) ? makeCallback(index + 1): null;643};644return fn;645};646return makeCallback(0);647};648649async.apply = function (fn) {650var args = Array.prototype.slice.call(arguments, 1);651return function () {652return fn.apply(653null, args.concat(Array.prototype.slice.call(arguments))654);655};656};657658var _concat = function (eachfn, arr, fn, callback) {659var r = [];660eachfn(arr, function (x, cb) {661fn(x, function (err, y) {662r = r.concat(y || []);663cb(err);664});665}, function (err) {666callback(err, r);667});668};669async.concat = doParallel(_concat);670async.concatSeries = doSeries(_concat);671672async.whilst = function (test, iterator, callback) {673if (test()) {674iterator(function (err) {675if (err) {676return callback(err);677}678async.whilst(test, iterator, callback);679});680}681else {682callback();683}684};685686async.doWhilst = function (iterator, test, callback) {687iterator(function (err) {688if (err) {689return callback(err);690}691var args = Array.prototype.slice.call(arguments, 1);692if (test.apply(null, args)) {693async.doWhilst(iterator, test, callback);694}695else {696callback();697}698});699};700701async.until = function (test, iterator, callback) {702if (!test()) {703iterator(function (err) {704if (err) {705return callback(err);706}707async.until(test, iterator, callback);708});709}710else {711callback();712}713};714715async.doUntil = function (iterator, test, callback) {716iterator(function (err) {717if (err) {718return callback(err);719}720var args = Array.prototype.slice.call(arguments, 1);721if (!test.apply(null, args)) {722async.doUntil(iterator, test, callback);723}724else {725callback();726}727});728};729730async.queue = function (worker, concurrency) {731if (concurrency === undefined) {732concurrency = 1;733}734function _insert(q, data, pos, callback) {735if (!q.started){736q.started = true;737}738if (!_isArray(data)) {739data = [data];740}741if(data.length == 0) {742// call drain immediately if there are no tasks743return async.setImmediate(function() {744if (q.drain) {745q.drain();746}747});748}749_each(data, function(task) {750var item = {751data: task,752callback: typeof callback === 'function' ? callback : null753};754755if (pos) {756q.tasks.unshift(item);757} else {758q.tasks.push(item);759}760761if (q.saturated && q.tasks.length === q.concurrency) {762q.saturated();763}764async.setImmediate(q.process);765});766}767768var workers = 0;769var q = {770tasks: [],771concurrency: concurrency,772saturated: null,773empty: null,774drain: null,775started: false,776paused: false,777push: function (data, callback) {778_insert(q, data, false, callback);779},780kill: function () {781q.drain = null;782q.tasks = [];783},784unshift: function (data, callback) {785_insert(q, data, true, callback);786},787process: function () {788if (!q.paused && workers < q.concurrency && q.tasks.length) {789var task = q.tasks.shift();790if (q.empty && q.tasks.length === 0) {791q.empty();792}793workers += 1;794var next = function () {795workers -= 1;796if (task.callback) {797task.callback.apply(task, arguments);798}799if (q.drain && q.tasks.length + workers === 0) {800q.drain();801}802q.process();803};804var cb = only_once(next);805worker(task.data, cb);806}807},808length: function () {809return q.tasks.length;810},811running: function () {812return workers;813},814idle: function() {815return q.tasks.length + workers === 0;816},817pause: function () {818if (q.paused === true) { return; }819q.paused = true;820},821resume: function () {822if (q.paused === false) { return; }823q.paused = false;824// Need to call q.process once per concurrent825// worker to preserve full concurrency after pause826for (var w = 1; w <= q.concurrency; w++) {827async.setImmediate(q.process);828}829}830};831return q;832};833834async.priorityQueue = function (worker, concurrency) {835836function _compareTasks(a, b){837return a.priority - b.priority;838};839840function _binarySearch(sequence, item, compare) {841var beg = -1,842end = sequence.length - 1;843while (beg < end) {844var mid = beg + ((end - beg + 1) >>> 1);845if (compare(item, sequence[mid]) >= 0) {846beg = mid;847} else {848end = mid - 1;849}850}851return beg;852}853854function _insert(q, data, priority, callback) {855if (!q.started){856q.started = true;857}858if (!_isArray(data)) {859data = [data];860}861if(data.length == 0) {862// call drain immediately if there are no tasks863return async.setImmediate(function() {864if (q.drain) {865q.drain();866}867});868}869_each(data, function(task) {870var item = {871data: task,872priority: priority,873callback: typeof callback === 'function' ? callback : null874};875876q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);877878if (q.saturated && q.tasks.length === q.concurrency) {879q.saturated();880}881async.setImmediate(q.process);882});883}884885// Start with a normal queue886var q = async.queue(worker, concurrency);887888// Override push to accept second parameter representing priority889q.push = function (data, priority, callback) {890_insert(q, data, priority, callback);891};892893// Remove unshift function894delete q.unshift;895896return q;897};898899async.cargo = function (worker, payload) {900var working = false,901tasks = [];902903var cargo = {904tasks: tasks,905payload: payload,906saturated: null,907empty: null,908drain: null,909drained: true,910push: function (data, callback) {911if (!_isArray(data)) {912data = [data];913}914_each(data, function(task) {915tasks.push({916data: task,917callback: typeof callback === 'function' ? callback : null918});919cargo.drained = false;920if (cargo.saturated && tasks.length === payload) {921cargo.saturated();922}923});924async.setImmediate(cargo.process);925},926process: function process() {927if (working) return;928if (tasks.length === 0) {929if(cargo.drain && !cargo.drained) cargo.drain();930cargo.drained = true;931return;932}933934var ts = typeof payload === 'number'935? tasks.splice(0, payload)936: tasks.splice(0, tasks.length);937938var ds = _map(ts, function (task) {939return task.data;940});941942if(cargo.empty) cargo.empty();943working = true;944worker(ds, function () {945working = false;946947var args = arguments;948_each(ts, function (data) {949if (data.callback) {950data.callback.apply(null, args);951}952});953954process();955});956},957length: function () {958return tasks.length;959},960running: function () {961return working;962}963};964return cargo;965};966967var _console_fn = function (name) {968return function (fn) {969var args = Array.prototype.slice.call(arguments, 1);970fn.apply(null, args.concat([function (err) {971var args = Array.prototype.slice.call(arguments, 1);972if (typeof console !== 'undefined') {973if (err) {974if (console.error) {975console.error(err);976}977}978else if (console[name]) {979_each(args, function (x) {980console[name](x);981});982}983}984}]));985};986};987async.log = _console_fn('log');988async.dir = _console_fn('dir');989/*async.info = _console_fn('info');990async.warn = _console_fn('warn');991async.error = _console_fn('error');*/992993async.memoize = function (fn, hasher) {994var memo = {};995var queues = {};996hasher = hasher || function (x) {997return x;998};999var memoized = function () {1000var args = Array.prototype.slice.call(arguments);1001var callback = args.pop();1002var key = hasher.apply(null, args);1003if (key in memo) {1004async.nextTick(function () {1005callback.apply(null, memo[key]);1006});1007}1008else if (key in queues) {1009queues[key].push(callback);1010}1011else {1012queues[key] = [callback];1013fn.apply(null, args.concat([function () {1014memo[key] = arguments;1015var q = queues[key];1016delete queues[key];1017for (var i = 0, l = q.length; i < l; i++) {1018q[i].apply(null, arguments);1019}1020}]));1021}1022};1023memoized.memo = memo;1024memoized.unmemoized = fn;1025return memoized;1026};10271028async.unmemoize = function (fn) {1029return function () {1030return (fn.unmemoized || fn).apply(null, arguments);1031};1032};10331034async.times = function (count, iterator, callback) {1035var counter = [];1036for (var i = 0; i < count; i++) {1037counter.push(i);1038}1039return async.map(counter, iterator, callback);1040};10411042async.timesSeries = function (count, iterator, callback) {1043var counter = [];1044for (var i = 0; i < count; i++) {1045counter.push(i);1046}1047return async.mapSeries(counter, iterator, callback);1048};10491050async.seq = function (/* functions... */) {1051var fns = arguments;1052return function () {1053var that = this;1054var args = Array.prototype.slice.call(arguments);1055var callback = args.pop();1056async.reduce(fns, args, function (newargs, fn, cb) {1057fn.apply(that, newargs.concat([function () {1058var err = arguments[0];1059var nextargs = Array.prototype.slice.call(arguments, 1);1060cb(err, nextargs);1061}]))1062},1063function (err, results) {1064callback.apply(that, [err].concat(results));1065});1066};1067};10681069async.compose = function (/* functions... */) {1070return async.seq.apply(null, Array.prototype.reverse.call(arguments));1071};10721073var _applyEach = function (eachfn, fns /*args...*/) {1074var go = function () {1075var that = this;1076var args = Array.prototype.slice.call(arguments);1077var callback = args.pop();1078return eachfn(fns, function (fn, cb) {1079fn.apply(that, args.concat([cb]));1080},1081callback);1082};1083if (arguments.length > 2) {1084var args = Array.prototype.slice.call(arguments, 2);1085return go.apply(this, args);1086}1087else {1088return go;1089}1090};1091async.applyEach = doParallel(_applyEach);1092async.applyEachSeries = doSeries(_applyEach);10931094async.forever = function (fn, callback) {1095function next(err) {1096if (err) {1097if (callback) {1098return callback(err);1099}1100throw err;1101}1102fn(next);1103}1104next();1105};11061107// Node.js1108if (typeof module !== 'undefined' && module.exports) {1109module.exports = async;1110}1111// AMD / RequireJS1112else if (typeof define !== 'undefined' && define.amd) {1113define([], function () {1114return async;1115});1116}1117// included directly via <script> tag1118else {1119root.async = async;1120}11211122}());112311241125