Skip to content

Commit 654d284

Browse files
authored
Merge pull request #1024 from patrick-steele-idem/issue-1023
Fixes #1023 - Load exceptions in user resolvers are not reported
2 parents 91cfd6d + 8778d7c commit 654d284

File tree

3 files changed

+42
-18
lines changed

3 files changed

+42
-18
lines changed

tests/files/load-error-resolver.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
throw new Error('TEST ERROR')

tests/src/core/resolve.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,22 @@ describe('resolve', function () {
118118
)).to.equal(utils.testFilePath('./jsx/MyCoolComponent.jsx'))
119119
})
120120

121+
it('reports load exception in a user resolver', function () {
122+
123+
const testContext = utils.testContext({ 'import/resolver': './load-error-resolver' })
124+
const testContextReports = []
125+
testContext.report = function (reportInfo) {
126+
testContextReports.push(reportInfo)
127+
}
128+
129+
expect(resolve( '../files/exception'
130+
, Object.assign({}, testContext, { getFilename: function () { return utils.getFilename('exception.js') } })
131+
)).to.equal(undefined)
132+
expect(testContextReports[0]).to.be.an('object')
133+
expect(testContextReports[0].message).to.equal('Resolve error: TEST ERROR')
134+
expect(testContextReports[0].loc).to.eql({ line: 1, column: 0 })
135+
})
136+
121137
const caseDescribe = (!CASE_SENSITIVE_FS ? describe : describe.skip)
122138
caseDescribe('case sensitivity', function () {
123139
let file

utils/resolve.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,20 @@ exports.CASE_SENSITIVE_FS = CASE_SENSITIVE_FS
1414

1515
const fileExistsCache = new ModuleCache()
1616

17+
function tryRequire(target) {
18+
let resolved;
19+
try {
20+
// Check if the target exists
21+
resolved = require.resolve(target);
22+
} catch(e) {
23+
// If the target does not exist then just return undefined
24+
return undefined;
25+
}
26+
27+
// If the target exists then return the loaded module
28+
return require(resolved);
29+
}
30+
1731
// http://stackoverflow.com/a/27382838
1832
exports.fileExistsWithCaseSync = function fileExistsWithCaseSync(filepath, cacheSettings) {
1933
// don't care if the FS is case-sensitive
@@ -135,27 +149,20 @@ function resolverReducer(resolvers, map) {
135149
throw new Error('invalid resolver config')
136150
}
137151

152+
function getBaseDir(sourceFile) {
153+
return pkgDir.sync(sourceFile) || process.cwd()
154+
}
138155
function requireResolver(name, sourceFile) {
139156
// Try to resolve package with conventional name
140-
try {
141-
return require(`eslint-import-resolver-${name}`)
142-
} catch (err) { /* continue */ }
157+
let resolver = tryRequire(`eslint-import-resolver-${name}`) ||
158+
tryRequire(name) ||
159+
tryRequire(path.resolve(getBaseDir(sourceFile), name))
143160

144-
// Try to resolve package with custom name (@myorg/resolver-name)
145-
try {
146-
return require(name)
147-
} catch (err) { /* continue */ }
148-
149-
// Try to resolve package with path, relative to closest package.json
150-
// or current working directory
151-
try {
152-
const baseDir = pkgDir.sync(sourceFile) || process.cwd()
153-
// absolute paths ignore base, so this covers both
154-
return require(path.resolve(baseDir, name))
155-
} catch (err) { /* continue */ }
156-
157-
// all else failed
158-
throw new Error(`unable to load resolver "${name}".`)
161+
if (!resolver) {
162+
throw new Error(`unable to load resolver "${name}".`)
163+
} else {
164+
return resolver;
165+
}
159166
}
160167

161168
const erroredContexts = new Set()

0 commit comments

Comments
 (0)