forked from jestjs/jest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
eslint_import_resolver.js
83 lines (70 loc) · 2.02 KB
/
eslint_import_resolver.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
/**
* Copyright (c) 2014, Facebook, Inc. All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* Adapted from node resolver: https://github.com/benmosher/eslint-plugin-import/tree/master/resolvers/node
*
*/
'use strict';
const resolve = require('resolve');
const path = require('path');
const log = require('debug')('eslint-plugin-import:resolver:node');
module.exports.interfaceVersion = 2;
module.exports.resolve = function(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};
}
};
function opts(file, config) {
return Object.assign(
{
// more closely matches Node (#333)
extensions: ['.js', '.json'],
},
config,
{
// path.resolve will handle paths relative to CWD
basedir: path.dirname(path.resolve(file)),
packageFilter,
}
);
}
function packageFilter(pkg) {
if (pkg['jsnext:main']) {
pkg['main'] = pkg['jsnext:main'];
}
return pkg;
}
function 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;
}