From 9a1d013095f24b851fd970f39464209e088a7b98 Mon Sep 17 00:00:00 2001 From: Takayuki Sato Date: Fri, 22 Mar 2024 10:00:24 +0900 Subject: [PATCH] chore: Augment `task not found` error with helpful properties (#262) --- lib/versioned/^4.0.0/index.js | 10 ++++++-- lib/versioned/^4.0.0/normalize-error.js | 26 +++++++++++++++++++++ test/execution-errors.js | 15 ++++++++++++ test/lib/check-task-not-found.js | 31 +++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 lib/versioned/^4.0.0/normalize-error.js create mode 100644 test/lib/check-task-not-found.js diff --git a/lib/versioned/^4.0.0/index.js b/lib/versioned/^4.0.0/index.js index 137ad438..c1888bb3 100644 --- a/lib/versioned/^4.0.0/index.js +++ b/lib/versioned/^4.0.0/index.js @@ -12,6 +12,7 @@ var tildify = require('../../shared/tildify'); var logTasks = require('../../shared/log/tasks'); var logEvents = require('./log/events'); var logSyncTask = require('./log/sync-task'); +var normalizeError = require('./normalize-error'); var logTasksSimple = require('./log/tasks-simple'); var registerExports = require('../../shared/register-exports'); @@ -85,8 +86,13 @@ function execute(env, cfg, opts) { } }); } catch (err) { - log.error(chalk.red(err.message)); - log.error('To list available tasks, try running: gulp --tasks'); + normalizeError(err); + if (err.task) { + log.error(chalk.red(err.message)); + log.error(chalk.red('To list available tasks, try running: gulp --tasks')); + } else /* istanbul ignore next */ { + log.error(chalk.red(err.message)); + } exit(1); } }); diff --git a/lib/versioned/^4.0.0/normalize-error.js b/lib/versioned/^4.0.0/normalize-error.js new file mode 100644 index 00000000..0f58d0c4 --- /dev/null +++ b/lib/versioned/^4.0.0/normalize-error.js @@ -0,0 +1,26 @@ +'use strict'; + +// Normalize an undertaker v1 error like an undertaker v2 error +function normalizeError(err) { + /* istanbul ignore if */ + if (!err || !err.message) { + return; + } + + var fixed0 = 'Task never defined: '; + var fixed1 = ' - did you mean? '; + + if (err.message.startsWith(fixed0)) { + var task = err.message.slice(fixed0.length); + var index = task.indexOf(fixed1); + + if (index >= 0) { + err.similar = task.slice(index + fixed1.length).split(', '); + err.task = task.slice(0, index); + } else { + err.task = task + } + } +} + +module.exports = normalizeError; diff --git a/test/execution-errors.js b/test/execution-errors.js index 769832a9..bd607e43 100644 --- a/test/execution-errors.js +++ b/test/execution-errors.js @@ -29,6 +29,21 @@ describe('execution error', function() { } }); + it('should output an error if a task is not defined but a similar task is found', function(done) { + var opts = { cwd: path.join(__dirname, './fixtures/gulpfiles') }; + exec(gulp('test0'), opts, cb); + + function cb(err, stdout, stderr) { + expect(err).not.toBeNull(); + expect(err.code).toEqual(1); + expect(eraseTime(stdout)).toMatch('Using gulpfile '); + expect(eraseTime(stderr)).toEqual( + 'Task never defined: test0 - did you mean? test1, test2, test3, test4, test5, test6, test7, test8\n' + + 'To list available tasks, try running: gulp --tasks\n'); + done(); + } + }); + it('should output an error if gulp version is unsupported', function(done) { var opts = { cwd: path.join(__dirname, './fixtures/errors/bad-gulp-version') }; exec(gulp(), opts, cb); diff --git a/test/lib/check-task-not-found.js b/test/lib/check-task-not-found.js new file mode 100644 index 00000000..d06aef95 --- /dev/null +++ b/test/lib/check-task-not-found.js @@ -0,0 +1,31 @@ +'use strict'; + +var expect = require('expect'); +var normalizeError = require('../../lib/versioned/^4.0.0/normalize-error'); + +describe('lib: normalizeError', function() { + + it('Should return target task and similar tasks if both are included in error message', function(done) { + var err = new Error('Task never defined: task2 - did you mean? task0, task1'); + normalizeError(err); + expect(err).toHaveProperty('task', 'task2'); + expect(err).toHaveProperty('similar', ['task0', 'task1']); + done(); + }); + + it('Should return only target task if similar tasks is not included in error message', function(done) { + var err = new Error('Task never defined: task2'); + normalizeError(err) + expect(err).toHaveProperty('task', 'task2'); + expect(err).not.toHaveProperty('similar'); + done(); + }); + + it('Should return undefined if error is other', function(done) { + var err = new Error('xxx'); + normalizeError(err) + expect(err).not.toHaveProperty('task'); + expect(err).not.toHaveProperty('similar'); + done(); + }); +});