@@ -4,6 +4,7 @@ var assert = require('assert');
4
4
5
5
var map = require ( 'arr-map' ) ;
6
6
var flatten = require ( 'arr-flatten' ) ;
7
+ var levenshtein = require ( 'fast-levenshtein' ) ;
7
8
8
9
function normalizeArgs ( registry , args ) {
9
10
function getFunction ( task ) {
@@ -12,7 +13,14 @@ function normalizeArgs(registry, args) {
12
13
}
13
14
14
15
var fn = registry . get ( task ) ;
15
- assert ( fn , 'Task never defined: ' + task ) ;
16
+ if ( ! fn ) {
17
+ var similar = similarTasks ( registry , task ) ;
18
+ if ( similar . length > 0 ) {
19
+ assert ( false , 'Task never defined: ' + task + ' - did you mean? ' + similar . join ( ', ' ) ) ;
20
+ } else {
21
+ assert ( false , 'Task never defined: ' + task ) ;
22
+ }
23
+ }
16
24
return fn ;
17
25
}
18
26
@@ -22,4 +30,23 @@ function normalizeArgs(registry, args) {
22
30
return map ( flattenArgs , getFunction ) ;
23
31
}
24
32
33
+ function similarTasks ( registry , queryTask ) {
34
+ if ( typeof queryTask !== 'string' ) {
35
+ return [ ] ;
36
+ }
37
+
38
+ var tasks = registry . tasks ( ) ;
39
+ var similarTasks = [ ] ;
40
+ for ( var task in tasks ) {
41
+ if ( tasks . hasOwnProperty ( task ) ) {
42
+ var distance = levenshtein . get ( task , queryTask ) ;
43
+ var allowedDistance = Math . floor ( 0.4 * task . length ) + 1 ;
44
+ if ( distance < allowedDistance ) {
45
+ similarTasks . push ( task ) ;
46
+ }
47
+ }
48
+ }
49
+ return similarTasks ;
50
+ }
51
+
25
52
module . exports = normalizeArgs ;
0 commit comments