Skip to content

Commit 9a1d013

Browse files
authored
chore: Augment task not found error with helpful properties (#262)
1 parent e5c7983 commit 9a1d013

File tree

4 files changed

+80
-2
lines changed

4 files changed

+80
-2
lines changed

lib/versioned/^4.0.0/index.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var tildify = require('../../shared/tildify');
1212
var logTasks = require('../../shared/log/tasks');
1313
var logEvents = require('./log/events');
1414
var logSyncTask = require('./log/sync-task');
15+
var normalizeError = require('./normalize-error');
1516
var logTasksSimple = require('./log/tasks-simple');
1617
var registerExports = require('../../shared/register-exports');
1718

@@ -85,8 +86,13 @@ function execute(env, cfg, opts) {
8586
}
8687
});
8788
} catch (err) {
88-
log.error(chalk.red(err.message));
89-
log.error('To list available tasks, try running: gulp --tasks');
89+
normalizeError(err);
90+
if (err.task) {
91+
log.error(chalk.red(err.message));
92+
log.error(chalk.red('To list available tasks, try running: gulp --tasks'));
93+
} else /* istanbul ignore next */ {
94+
log.error(chalk.red(err.message));
95+
}
9096
exit(1);
9197
}
9298
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
'use strict';
2+
3+
// Normalize an undertaker v1 error like an undertaker v2 error
4+
function normalizeError(err) {
5+
/* istanbul ignore if */
6+
if (!err || !err.message) {
7+
return;
8+
}
9+
10+
var fixed0 = 'Task never defined: ';
11+
var fixed1 = ' - did you mean? ';
12+
13+
if (err.message.startsWith(fixed0)) {
14+
var task = err.message.slice(fixed0.length);
15+
var index = task.indexOf(fixed1);
16+
17+
if (index >= 0) {
18+
err.similar = task.slice(index + fixed1.length).split(', ');
19+
err.task = task.slice(0, index);
20+
} else {
21+
err.task = task
22+
}
23+
}
24+
}
25+
26+
module.exports = normalizeError;

test/execution-errors.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ describe('execution error', function() {
2929
}
3030
});
3131

32+
it('should output an error if a task is not defined but a similar task is found', function(done) {
33+
var opts = { cwd: path.join(__dirname, './fixtures/gulpfiles') };
34+
exec(gulp('test0'), opts, cb);
35+
36+
function cb(err, stdout, stderr) {
37+
expect(err).not.toBeNull();
38+
expect(err.code).toEqual(1);
39+
expect(eraseTime(stdout)).toMatch('Using gulpfile ');
40+
expect(eraseTime(stderr)).toEqual(
41+
'Task never defined: test0 - did you mean? test1, test2, test3, test4, test5, test6, test7, test8\n' +
42+
'To list available tasks, try running: gulp --tasks\n');
43+
done();
44+
}
45+
});
46+
3247
it('should output an error if gulp version is unsupported', function(done) {
3348
var opts = { cwd: path.join(__dirname, './fixtures/errors/bad-gulp-version') };
3449
exec(gulp(), opts, cb);

test/lib/check-task-not-found.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
'use strict';
2+
3+
var expect = require('expect');
4+
var normalizeError = require('../../lib/versioned/^4.0.0/normalize-error');
5+
6+
describe('lib: normalizeError', function() {
7+
8+
it('Should return target task and similar tasks if both are included in error message', function(done) {
9+
var err = new Error('Task never defined: task2 - did you mean? task0, task1');
10+
normalizeError(err);
11+
expect(err).toHaveProperty('task', 'task2');
12+
expect(err).toHaveProperty('similar', ['task0', 'task1']);
13+
done();
14+
});
15+
16+
it('Should return only target task if similar tasks is not included in error message', function(done) {
17+
var err = new Error('Task never defined: task2');
18+
normalizeError(err)
19+
expect(err).toHaveProperty('task', 'task2');
20+
expect(err).not.toHaveProperty('similar');
21+
done();
22+
});
23+
24+
it('Should return undefined if error is other', function(done) {
25+
var err = new Error('xxx');
26+
normalizeError(err)
27+
expect(err).not.toHaveProperty('task');
28+
expect(err).not.toHaveProperty('similar');
29+
done();
30+
});
31+
});

0 commit comments

Comments
 (0)