-
Notifications
You must be signed in to change notification settings - Fork 70
/
eslint-import-resolver-local.js
69 lines (56 loc) · 1.7 KB
/
eslint-import-resolver-local.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
/* eslint-disable import/no-extraneous-dependencies,strict,no-param-reassign */
// THIS FILE IS COPIED FROM jest
// https://github.com/facebook/jest/blob/master/eslintImportResolver.js
const path = require('path')
const resolve = require('resolve')
const log = require('debug')('eslint-plugin-import:resolver:node')
module.exports.interfaceVersion = 2
const packageFilter = (pkg) => {
if (pkg['jsnext:main']) {
pkg.main = pkg['jsnext:main']
}
return pkg
}
const opts = (file, config) => ({
// more closely matches Node (#333)
extensions: ['.js', '.json'],
...config,
// path.resolve will handle paths relative to CWD
basedir: path.dirname(path.resolve(file)),
packageFilter,
})
const applyModuleNameMapper = (source, config) => {
Object.keys(config.moduleNameMapper).forEach((regex) => {
const mappedModuleName = config.moduleNameMapper[regex]
if (source.match(regex)) {
const matches = source.match(regex)
if (!matches) {
source = mappedModuleName
} else {
source = mappedModuleName.replace(
/\$([0-9]+)/g,
(_, index) => matches[parseInt(index, 10)]
)
}
source = path.resolve(source)
}
})
return source
}
module.exports.resolve = (source, file, config) => {
log('Resolving:', source, 'from:', file)
let resolvedPath
if (resolve.isCore(source)) {
log('resolved to core')
return { found: true, path: null }
}
source = applyModuleNameMapper(source, config)
try {
resolvedPath = resolve.sync(source, opts(file, config))
log('Resolved to:', resolvedPath)
return { found: true, path: resolvedPath }
} catch (err) {
log('resolve threw error:', err)
return { found: false }
}
}