@@ -14,39 +14,61 @@ function getDependencies(context) {
14
14
return {
15
15
dependencies : packageContent . dependencies || { } ,
16
16
devDependencies : packageContent . devDependencies || { } ,
17
+ optionalDependencies : packageContent . optionalDependencies || { } ,
17
18
}
18
19
} catch ( e ) {
19
20
return null
20
21
}
21
22
}
22
23
23
24
function missingErrorMessage ( packageName ) {
24
- return `'${ packageName } ' is not listed in the project's dependencies. ` +
25
- `Run 'npm i -S ${ packageName } ' to add it`
25
+ return `'${ packageName } ' should be listed in the project's dependencies. ` +
26
+ `Run 'npm i -S ${ packageName } ' to add it`
26
27
}
27
28
28
29
function devDepErrorMessage ( packageName ) {
29
- return `'${ packageName } ' is not listed in the project's dependencies, not devDependencies.`
30
+ return `'${ packageName } ' should be listed in the project's dependencies, not devDependencies.`
30
31
}
31
32
32
- function reportIfMissing ( context , deps , allowDevDeps , node , name ) {
33
+ function optDepErrorMessage ( packageName ) {
34
+ return `'${ packageName } ' should be listed in the project's dependencies, ` +
35
+ `not optionalDependencies.`
36
+ }
37
+
38
+ function reportIfMissing ( context , deps , allowDevDeps , allowOptDeps , node , name ) {
33
39
if ( importType ( name , context ) !== 'external' ) {
34
40
return
35
41
}
36
42
const packageName = name . split ( '/' ) [ 0 ]
37
43
38
- if ( deps . dependencies [ packageName ] === undefined ) {
39
- if ( ! allowDevDeps ) {
40
- context . report ( node , devDepErrorMessage ( packageName ) )
41
- } else if ( deps . devDependencies [ packageName ] === undefined ) {
42
- context . report ( node , missingErrorMessage ( packageName ) )
43
- }
44
+ const isInDeps = deps . dependencies [ packageName ] !== undefined
45
+ const isInDevDeps = deps . devDependencies [ packageName ] !== undefined
46
+ const isInOptDeps = deps . optionalDependencies [ packageName ] !== undefined
47
+
48
+ if ( isInDeps ||
49
+ ( allowDevDeps && isInDevDeps ) ||
50
+ ( allowOptDeps && isInOptDeps )
51
+ ) {
52
+ return
53
+ }
54
+
55
+ if ( isInDevDeps && ! allowDevDeps ) {
56
+ context . report ( node , devDepErrorMessage ( packageName ) )
57
+ return
58
+ }
59
+
60
+ if ( isInOptDeps && ! allowOptDeps ) {
61
+ context . report ( node , optDepErrorMessage ( packageName ) )
62
+ return
44
63
}
64
+
65
+ context . report ( node , missingErrorMessage ( packageName ) )
45
66
}
46
67
47
68
module . exports = function ( context ) {
48
69
const options = context . options [ 0 ] || { }
49
70
const allowDevDeps = options . devDependencies !== false
71
+ const allowOptDeps = options . optionalDependencies !== false
50
72
const deps = getDependencies ( context )
51
73
52
74
if ( ! deps ) {
@@ -56,11 +78,11 @@ module.exports = function (context) {
56
78
// todo: use module visitor from module-utils core
57
79
return {
58
80
ImportDeclaration : function ( node ) {
59
- reportIfMissing ( context , deps , allowDevDeps , node , node . source . value )
81
+ reportIfMissing ( context , deps , allowDevDeps , allowOptDeps , node , node . source . value )
60
82
} ,
61
83
CallExpression : function handleRequires ( node ) {
62
84
if ( isStaticRequire ( node ) ) {
63
- reportIfMissing ( context , deps , allowDevDeps , node , node . arguments [ 0 ] . value )
85
+ reportIfMissing ( context , deps , allowDevDeps , allowOptDeps , node , node . arguments [ 0 ] . value )
64
86
}
65
87
} ,
66
88
}
@@ -71,6 +93,7 @@ module.exports.schema = [
71
93
'type' : 'object' ,
72
94
'properties' : {
73
95
'devDependencies' : { 'type' : 'boolean' } ,
96
+ 'optionalDependencies' : { 'type' : 'boolean' } ,
74
97
} ,
75
98
'additionalProperties' : false ,
76
99
} ,
0 commit comments