-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathno-unresolved.js
88 lines (70 loc) · 2.19 KB
/
no-unresolved.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/**
* @fileOverview Ensures that an imported path exists, given resolution rules.
* @author Ben Mosher
*/
import resolve from '../core/resolve'
// todo: check ExportMap for existence first?
module.exports = function (context) {
function checkSourceValue(source) {
if (source == null) return
if (resolve(source.value, context) === undefined) {
context.report(source,
'Unable to resolve path to module \'' + source.value + '\'.')
}
}
// for import-y declarations
function checkSource(node) {
checkSourceValue(node.source)
}
// for CommonJS `require` calls
// adapted from @mctep: http://git.io/v4rAu
function checkCommon(call) {
if (call.callee.type !== 'Identifier') return
if (call.callee.name !== 'require') return
if (call.arguments.length !== 1) return
const modulePath = call.arguments[0]
if (modulePath.type !== 'Literal') return
if (typeof modulePath.value !== 'string') return
checkSourceValue(modulePath)
}
function checkAMD(call) {
if (call.callee.type !== 'Identifier') return
if (call.callee.name !== 'require' &&
call.callee.name !== 'define') return
if (call.arguments.length !== 2) return
const modules = call.arguments[0]
if (modules.type !== 'ArrayExpression') return
for (let element of modules.elements) {
if (element.type !== 'Literal') continue
if (typeof element.value !== 'string') continue
if (element.value === 'require' ||
element.value === 'exports') continue // magic modules: http://git.io/vByan
checkSourceValue(element)
}
}
const visitors = {
'ImportDeclaration': checkSource,
'ExportNamedDeclaration': checkSource,
'ExportAllDeclaration': checkSource,
}
if (context.options[0] != null) {
const { commonjs, amd } = context.options[0]
if (commonjs || amd) {
visitors['CallExpression'] = function (call) {
if (commonjs) checkCommon(call)
if (amd) checkAMD(call)
}
}
}
return visitors
}
module.exports.schema = [
{
'type': 'object',
'properties': {
'commonjs': { 'type': 'boolean' },
'amd': { 'type': 'boolean' },
},
'additionalProperties': false,
},
]