@@ -5,15 +5,16 @@ import stableHash from 'stable-hash'
5
5
6
6
import type {
7
7
ImportSettings ,
8
+ NewResolver ,
8
9
PluginSettings ,
9
10
RuleContext ,
10
- Resolver ,
11
- LegacyResolver ,
12
- ResolvedResult ,
13
11
} from '../types'
14
12
13
+ import {
14
+ normalizeConfigResolvers ,
15
+ resolveWithLegacyResolver ,
16
+ } from './legacy-resolver-settings'
15
17
import { ModuleCache } from './module-cache'
16
- import { normalizeConfigResolvers , resolveWithLegacyResolver } from './legacy-resolver-settings'
17
18
18
19
export const CASE_SENSITIVE_FS = ! fs . existsSync (
19
20
path . resolve (
@@ -26,7 +27,6 @@ export const IMPORT_RESOLVE_ERROR_NAME = 'EslintPluginImportResolveError'
26
27
27
28
export const fileExistsCache = new ModuleCache ( )
28
29
29
-
30
30
// https://stackoverflow.com/a/27382838
31
31
export function fileExistsWithCaseSync (
32
32
filepath : string | null ,
@@ -69,6 +69,38 @@ export function fileExistsWithCaseSync(
69
69
let prevSettings : PluginSettings | null = null
70
70
let memoizedHash : string
71
71
72
+ function isNamedResolver ( resolver : unknown ) : resolver is { name : string } {
73
+ return ! ! (
74
+ typeof resolver === 'object' &&
75
+ resolver &&
76
+ 'name' in resolver &&
77
+ typeof resolver . name === 'string'
78
+ )
79
+ }
80
+
81
+ function isValidNewResolver ( resolver : unknown ) : resolver is NewResolver {
82
+ if ( typeof resolver !== 'object' || resolver == null ) {
83
+ return false
84
+ }
85
+
86
+ if ( ! ( 'resolve' in resolver ) || ! ( 'interfaceVersion' in resolver ) ) {
87
+ return false
88
+ }
89
+
90
+ if (
91
+ typeof resolver . interfaceVersion !== 'number' ||
92
+ resolver . interfaceVersion !== 3
93
+ ) {
94
+ return false
95
+ }
96
+
97
+ if ( typeof resolver . resolve !== 'function' ) {
98
+ return false
99
+ }
100
+
101
+ return true
102
+ }
103
+
72
104
function fullResolve (
73
105
modulePath : string ,
74
106
sourceFile : string ,
@@ -99,10 +131,24 @@ function fullResolve(
99
131
return { found : true , path : cachedPath }
100
132
}
101
133
102
- if ( Object . prototype . hasOwnProperty . call ( settings , 'import-x/resolver-next' ) && settings [ 'import-x/resolver-next' ] ) {
134
+ if (
135
+ Object . prototype . hasOwnProperty . call ( settings , 'import-x/resolver-next' ) &&
136
+ settings [ 'import-x/resolver-next' ]
137
+ ) {
103
138
const configResolvers = settings [ 'import-x/resolver-next' ]
104
139
105
- for ( const resolver of configResolvers ) {
140
+ for ( let i = 0 , len = configResolvers . length ; i < len ; i ++ ) {
141
+ const resolver = configResolvers [ i ]
142
+ const resolverName = isNamedResolver ( resolver )
143
+ ? resolver . name
144
+ : `settings['import-x/resolver-next'][${ i } ]`
145
+
146
+ if ( ! isValidNewResolver ( resolver ) ) {
147
+ const err = new TypeError ( `${ resolverName } is not a valid import resolver for eslint-plugin-import-x!` )
148
+ err . name = IMPORT_RESOLVE_ERROR_NAME
149
+ throw err
150
+ }
151
+
106
152
const resolved = resolver . resolve ( modulePath , sourceFile )
107
153
if ( ! resolved . found ) {
108
154
continue
@@ -113,16 +159,25 @@ function fullResolve(
113
159
return resolved
114
160
}
115
161
} else {
116
- const configResolvers = settings [ 'import-x/resolver' ] || {
117
- node : settings [ 'import-x/resolve' ] ,
118
- } // backward compatibility
119
-
120
- for ( const { enable, options, resolver } of normalizeConfigResolvers ( configResolvers , sourceFile ) ) {
162
+ const configResolvers = settings [ 'import-x/resolver-legacy' ] ||
163
+ settings [ 'import-x/resolver' ] || {
164
+ node : settings [ 'import-x/resolve' ] ,
165
+ } // backward compatibility
166
+
167
+ for ( const { enable, options, resolver } of normalizeConfigResolvers (
168
+ configResolvers ,
169
+ sourceFile ,
170
+ ) ) {
121
171
if ( ! enable ) {
122
172
continue
123
173
}
124
174
125
- const resolved = resolveWithLegacyResolver ( resolver , options , modulePath , sourceFile )
175
+ const resolved = resolveWithLegacyResolver (
176
+ resolver ,
177
+ options ,
178
+ modulePath ,
179
+ sourceFile ,
180
+ )
126
181
if ( ! resolved . found ) {
127
182
continue
128
183
}
@@ -178,5 +233,3 @@ export function resolve(p: string, context: RuleContext) {
178
233
}
179
234
}
180
235
}
181
-
182
-
0 commit comments