Skip to content

Commit e475117

Browse files
authored
ES6-ify codebase (#1553)
* cancelable foreach * cancelable waterfall * cancellable auto * fix lint * fix tests * cancelable whilst/until/during/forever * fix waterfall test. It WILL get there * docs * use rest params instead of slice * clean up internals * remove property func * clarify uses of createTester * happy path async funtions in asyncify * stop using arguments * DLL to class * moar arrows * fix merge issues * remove forOwn * moar arrows * fix merge mistake * even more arrows, what can stop him * mo more fn.apply(null,...) * remove more spurious uses of apply * update lint config * just when you thought there couldn't possibly be more arrows * use eslint:recommended * even less uses or aguments * get rid of prototype cuteness * fix concat tests * fix more tests
1 parent 6405b10 commit e475117

File tree

125 files changed

+2663
-3133
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

125 files changed

+2663
-3133
lines changed

.eslintrc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"ecmaVersion": 8,
1010
"sourceType": "module"
1111
},
12+
"extends": "eslint:recommended",
1213
"rules": {
1314
"eqeqeq": 0,
1415
"guard-for-in": 2,
@@ -19,6 +20,7 @@
1920
"SwitchCase": 1
2021
}
2122
],
23+
"no-console": 0,
2224
"no-caller": 2,
2325
"no-undef": 2,
2426
"no-unused-vars": 2,
@@ -28,10 +30,14 @@
2830
"last"
2931
],
3032
"semi": 0,
33+
"prefer-arrow-callback": 2,
34+
"arrow-spacing": 2,
35+
"object-shorthand": 2,
3136
"no-eq-null": 0,
3237
"no-unused-expressions": 0,
3338
"no-loop-func": 2,
3439
"dot-notation": 0,
40+
"no-trailing-spaces": 2,
3541
"valid-jsdoc": ["error", {
3642
"requireReturn": false,
3743
"requireReturnDescription": false,

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ clean:
6161
rm -rf perf/versions/
6262

6363
lint:
64-
eslint $(LINT_FILES)
64+
eslint --fix $(LINT_FILES)
6565

6666
# Compile the ES6 modules to singular bundles, and individual bundles
6767
build-bundle: build-modules $(UMD_BUNDLE)

lib/apply.js

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import slice from './internal/slice';
2-
31
/**
42
* Creates a continuation function with some arguments already applied.
53
*
@@ -45,10 +43,6 @@ import slice from './internal/slice';
4543
* two
4644
* three
4745
*/
48-
export default function(fn/*, ...args*/) {
49-
var args = slice(arguments, 1);
50-
return function(/*callArgs*/) {
51-
var callArgs = slice(arguments);
52-
return fn.apply(null, args.concat(callArgs));
53-
};
54-
};
46+
export default function(fn, ...args) {
47+
return (...callArgs) => fn(...args,...callArgs);
48+
}

lib/asyncify.js

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import initialParams from './internal/initialParams';
22
import setImmediate from './internal/setImmediate';
3+
import { isAsync } from './internal/wrapAsync'
34

45
/**
56
* Take a sync function and make it async, passing its return value to a
@@ -58,6 +59,14 @@ import setImmediate from './internal/setImmediate';
5859
* q.push(files);
5960
*/
6061
export default function asyncify(func) {
62+
if (isAsync(func)) {
63+
return function (...args/*, callback*/) {
64+
const callback = args.pop()
65+
const promise = func.apply(this, args)
66+
return handlePromise(promise, callback)
67+
}
68+
}
69+
6170
return initialParams(function (args, callback) {
6271
var result;
6372
try {
@@ -67,25 +76,25 @@ export default function asyncify(func) {
6776
}
6877
// if result is Promise object
6978
if (result && typeof result.then === 'function') {
70-
result.then(function(value) {
71-
invokeCallback(callback, null, value);
72-
}, function(err) {
73-
invokeCallback(callback, err.message ? err : new Error(err));
74-
});
79+
return handlePromise(result, callback)
7580
} else {
7681
callback(null, result);
7782
}
7883
});
7984
}
8085

86+
function handlePromise(promise, callback) {
87+
return promise.then(value => {
88+
invokeCallback(callback, null, value);
89+
}, err => {
90+
invokeCallback(callback, err.message ? err : new Error(err));
91+
});
92+
}
93+
8194
function invokeCallback(callback, error, value) {
8295
try {
8396
callback(error, value);
84-
} catch (e) {
85-
setImmediate(rethrow, e);
97+
} catch (err) {
98+
setImmediate(e => { throw e }, err);
8699
}
87100
}
88-
89-
function rethrow(error) {
90-
throw error;
91-
}

lib/auto.js

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import noop from './internal/noop';
22

3-
import forOwn from './internal/forOwn';
4-
import slice from './internal/slice';
53
import once from './internal/once';
64
import onlyOnce from './internal/onlyOnce';
75
import wrapAsync from './internal/wrapAsync';
@@ -114,7 +112,8 @@ export default function (tasks, concurrency, callback) {
114112
// without the possibility of returning to an ancestor task
115113
var uncheckedDependencies = {};
116114

117-
forOwn(tasks, function (task, key) {
115+
Object.keys(tasks).forEach(key => {
116+
var task = tasks[key]
118117
if (!Array.isArray(task)) {
119118
// no dependencies
120119
enqueueTask(key, [task]);
@@ -131,14 +130,14 @@ export default function (tasks, concurrency, callback) {
131130
}
132131
uncheckedDependencies[key] = remainingDependencies;
133132

134-
dependencies.forEach(function (dependencyName) {
133+
dependencies.forEach(dependencyName => {
135134
if (!tasks[dependencyName]) {
136135
throw new Error('async.auto task `' + key +
137136
'` has a non-existent dependency `' +
138137
dependencyName + '` in ' +
139138
dependencies.join(', '));
140139
}
141-
addListener(dependencyName, function () {
140+
addListener(dependencyName, () => {
142141
remainingDependencies--;
143142
if (remainingDependencies === 0) {
144143
enqueueTask(key, task);
@@ -151,9 +150,7 @@ export default function (tasks, concurrency, callback) {
151150
processQueue();
152151

153152
function enqueueTask(key, task) {
154-
readyTasks.push(function () {
155-
runTask(key, task);
156-
});
153+
readyTasks.push(() => runTask(key, task));
157154
}
158155

159156
function processQueue() {
@@ -179,29 +176,27 @@ export default function (tasks, concurrency, callback) {
179176

180177
function taskComplete(taskName) {
181178
var taskListeners = listeners[taskName] || [];
182-
taskListeners.forEach(function (fn) {
183-
fn();
184-
});
179+
taskListeners.forEach(fn => fn());
185180
processQueue();
186181
}
187182

188183

189184
function runTask(key, task) {
190185
if (hasError) return;
191186

192-
var taskCallback = onlyOnce(function(err, result) {
187+
var taskCallback = onlyOnce((err, ...result) => {
193188
runningTasks--;
194189
if (err === false) {
195190
canceled = true
196191
return
197192
}
198-
if (arguments.length > 2) {
199-
result = slice(arguments, 1);
193+
if (result.length < 2) {
194+
result = result[0];
200195
}
201196
if (err) {
202197
var safeResults = {};
203-
forOwn(results, function(val, rkey) {
204-
safeResults[rkey] = val;
198+
Object.keys(results).forEach(rkey => {
199+
safeResults[rkey] = results[rkey];
205200
});
206201
safeResults[key] = result;
207202
hasError = true;
@@ -232,7 +227,7 @@ export default function (tasks, concurrency, callback) {
232227
while (readyToCheck.length) {
233228
currentTask = readyToCheck.pop();
234229
counter++;
235-
getDependents(currentTask).forEach(function (dependent) {
230+
getDependents(currentTask).forEach(dependent => {
236231
if (--uncheckedDependencies[dependent] === 0) {
237232
readyToCheck.push(dependent);
238233
}
@@ -248,7 +243,8 @@ export default function (tasks, concurrency, callback) {
248243

249244
function getDependents(taskName) {
250245
var result = [];
251-
forOwn(tasks, function (task, key) {
246+
Object.keys(tasks).forEach(key => {
247+
const task = tasks[key]
252248
if (Array.isArray(task) && task.indexOf(taskName) >= 0) {
253249
result.push(key);
254250
}

lib/autoInject.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import auto from './auto';
2-
import forOwn from './internal/forOwn';
32
import wrapAsync from './internal/wrapAsync';
43
import { isAsync } from './internal/wrapAsync';
54

6-
var FN_ARGS = /^(?:async\s+)?(function)?\s*[^\(]*\(\s*([^\)]*)\)/m;
5+
var FN_ARGS = /^(?:async\s+)?(function)?\s*[^(]*\(\s*([^)]*)\)/m;
76
var FN_ARG_SPLIT = /,/;
87
var FN_ARG = /(=.+)?(\s*)$/;
98
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
@@ -12,7 +11,7 @@ function parseParams(func) {
1211
func = func.toString().replace(STRIP_COMMENTS, '');
1312
func = func.match(FN_ARGS)[2].replace(' ', '');
1413
func = func ? func.split(FN_ARG_SPLIT) : [];
15-
func = func.map(function (arg){
14+
func = func.map((arg) => {
1615
return arg.replace(FN_ARG, '').trim();
1716
});
1817
return func;
@@ -103,16 +102,17 @@ function parseParams(func) {
103102
export default function autoInject(tasks, callback) {
104103
var newTasks = {};
105104

106-
forOwn(tasks, function (taskFn, key) {
105+
Object.keys(tasks).forEach(key => {
106+
var taskFn = tasks[key]
107107
var params;
108108
var fnIsAsync = isAsync(taskFn);
109109
var hasNoDeps =
110110
(!fnIsAsync && taskFn.length === 1) ||
111111
(fnIsAsync && taskFn.length === 0);
112112

113113
if (Array.isArray(taskFn)) {
114-
params = taskFn.slice(0, -1);
115-
taskFn = taskFn[taskFn.length - 1];
114+
params = [...taskFn];
115+
taskFn = params.pop();
116116

117117
newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);
118118
} else if (hasNoDeps) {
@@ -131,11 +131,9 @@ export default function autoInject(tasks, callback) {
131131
}
132132

133133
function newTask(results, taskCb) {
134-
var newArgs = params.map(function (name) {
135-
return results[name];
136-
});
134+
var newArgs = params.map(name => results[name])
137135
newArgs.push(taskCb);
138-
wrapAsync(taskFn).apply(null, newArgs);
136+
wrapAsync(taskFn)(...newArgs);
139137
}
140138
});
141139

lib/compose.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import seq from './seq';
2-
import slice from './internal/slice';
32

43
/**
54
* Creates a function which is a composition of the passed asynchronous
@@ -36,6 +35,6 @@ import slice from './internal/slice';
3635
* // result now equals 15
3736
* });
3837
*/
39-
export default function(/*...args*/) {
40-
return seq.apply(null, slice(arguments).reverse());
41-
};
38+
export default function(...args) {
39+
return seq(...args.reverse());
40+
}

lib/concatLimit.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import noop from './internal/noop';
22
import wrapAsync from './internal/wrapAsync';
3-
import slice from './internal/slice';
43
import mapLimit from './mapLimit';
54

6-
var _concat = Array.prototype.concat;
7-
85
/**
96
* The same as [`concat`]{@link module:Collections.concat} but runs a maximum of `limit` async operations at a time.
107
*
@@ -26,16 +23,16 @@ var _concat = Array.prototype.concat;
2623
export default function(coll, limit, iteratee, callback) {
2724
callback = callback || noop;
2825
var _iteratee = wrapAsync(iteratee);
29-
mapLimit(coll, limit, function(val, callback) {
30-
_iteratee(val, function(err /*, ...args*/) {
26+
mapLimit(coll, limit, (val, callback) => {
27+
_iteratee(val, (err, ...args) => {
3128
if (err) return callback(err);
32-
return callback(null, slice(arguments, 1));
29+
return callback(null, args);
3330
});
34-
}, function(err, mapResults) {
31+
}, (err, mapResults) => {
3532
var result = [];
3633
for (var i = 0; i < mapResults.length; i++) {
3734
if (mapResults[i]) {
38-
result = _concat.apply(result, mapResults[i]);
35+
result = result.concat(...mapResults[i]);
3936
}
4037
}
4138

lib/constant.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import slice from './internal/slice';
2-
31
/**
42
* Returns a function that when called, calls-back with the values provided.
53
* Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to
@@ -42,11 +40,9 @@ import slice from './internal/slice';
4240
* //...
4341
* }, callback);
4442
*/
45-
export default function(/*...values*/) {
46-
var values = slice(arguments);
47-
var args = [null].concat(values);
48-
return function (/*...ignoredArgs, callback*/) {
49-
var callback = arguments[arguments.length - 1];
50-
return callback.apply(this, args);
43+
export default function(...args) {
44+
return function (...ignoredArgs/*, callback*/) {
45+
var callback = ignoredArgs.pop();
46+
return callback(null, ...args);
5147
};
52-
};
48+
}

lib/detect.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import identity from './internal/identity';
21
import createTester from './internal/createTester';
32
import doParallel from './internal/doParallel';
4-
import findGetResult from './internal/findGetResult';
53

64
/**
75
* Returns the first value in `coll` that passes an async truth test. The
@@ -38,4 +36,4 @@ import findGetResult from './internal/findGetResult';
3836
* // result now equals the first file in the list that exists
3937
* });
4038
*/
41-
export default doParallel(createTester(identity, findGetResult));
39+
export default doParallel(createTester(bool => bool, (res, item) => item));

lib/detectLimit.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import identity from './internal/identity';
21
import createTester from './internal/createTester';
32
import doParallelLimit from './internal/doParallelLimit';
4-
import findGetResult from './internal/findGetResult';
53

64
/**
75
* The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a
@@ -25,4 +23,4 @@ import findGetResult from './internal/findGetResult';
2523
* (iteratee) or the value `undefined` if none passed. Invoked with
2624
* (err, result).
2725
*/
28-
export default doParallelLimit(createTester(identity, findGetResult));
26+
export default doParallelLimit(createTester(bool => bool, (res, item) => item));

lib/doDuring.js

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import noop from './internal/noop';
2-
import slice from './internal/slice';
32
import onlyOnce from './internal/onlyOnce';
43
import wrapAsync from './internal/wrapAsync';
54

@@ -28,13 +27,11 @@ export default function doDuring(fn, test, callback) {
2827
var _fn = wrapAsync(fn);
2928
var _test = wrapAsync(test);
3029

31-
function next(err/*, ...args*/) {
30+
function next(err, ...args) {
3231
if (err) return callback(err);
3332
if (err === false) return;
34-
var args = slice(arguments, 1);
35-
args.push(check);
36-
_test.apply(this, args);
37-
};
33+
_test(...args, check);
34+
}
3835

3936
function check(err, truth) {
4037
if (err) return callback(err);

0 commit comments

Comments
 (0)