Skip to content

Commit dd6fa6b

Browse files
committed
feat(resolve): implements import-x/resolver-next
1 parent 9b2b7cd commit dd6fa6b

File tree

3 files changed

+68
-38
lines changed

3 files changed

+68
-38
lines changed

src/types.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import type { ImportType as ImportType_, PluginName } from './utils'
77
import type { LegacyImportResolver, LegacyResolver } from './utils/legacy-resolver-settings'
88

99
export type {
10+
LegacyResolver,
11+
1012
LegacyResolverName,
1113
LegacyResolverName as ResolverName,
1214

@@ -47,6 +49,20 @@ export type TsResolverOptions = {
4749
extensions?: string[]
4850
} & Omit<ResolveOptions, 'fileSystem' | 'useSyncFileSystemCalls'>
4951

52+
// TODO: remove prefix New in the next major version
53+
export type NewResolverResolve = (
54+
modulePath: string,
55+
sourceFile: string,
56+
) => ResolvedResult
57+
58+
// TODO: remove prefix New in the next major version
59+
export type NewResolver = {
60+
interfaceVersion: 3,
61+
/** optional name for the resolver, this is used in logs/debug output */
62+
name?: string,
63+
resolve: NewResolverResolve,
64+
}
65+
5066
export type FileExtension = `.${string}`
5167

5268
export type DocStyle = 'jsdoc' | 'tomdoc'
@@ -63,7 +79,7 @@ export type ResultFound = {
6379
path: string | null
6480
}
6581

66-
export type Resolver = LegacyResolver
82+
export type Resolver = LegacyResolver | NewResolver
6783

6884
export type ResolvedResult = ResultNotFound | ResultFound
6985

@@ -80,6 +96,7 @@ export type ImportSettings = {
8096
parsers?: Record<string, readonly FileExtension[]>
8197
resolve?: NodeResolverOptions
8298
resolver?: LegacyImportResolver
99+
'resolver-next'?: NewResolver[]
83100
}
84101

85102
export type WithPluginName<T extends string | object> = T extends string

src/utils/legacy-resolver-settings.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ export type LegacyImportResolver =
6464
| LegacyResolverRecord[]
6565
| LegacyResolverObject[];
6666

67+
export function resolveWithLegacyResolver(resolver: LegacyResolver, config: unknown, modulePath: string, sourceFile: string): ResolvedResult {
68+
if (resolver.interfaceVersion === 2) {
69+
return resolver.resolve(modulePath, sourceFile, config)
70+
}
71+
72+
try {
73+
const resolved = resolver.resolveImport(modulePath, sourceFile, config)
74+
if (resolved === undefined) {
75+
return {
76+
found: false,
77+
}
78+
}
79+
return {
80+
found: true,
81+
path: resolved,
82+
}
83+
} catch {
84+
return {
85+
found: false,
86+
}
87+
}
88+
}
89+
6790
export function normalizeConfigResolvers(
6891
resolvers: LegacyImportResolver,
6992
sourceFile: string,

src/utils/resolve.ts

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import type {
88
PluginSettings,
99
RuleContext,
1010
Resolver,
11+
LegacyResolver,
1112
ResolvedResult,
1213
} from '../types'
1314

1415
import { ModuleCache } from './module-cache'
15-
import { normalizeConfigResolvers } from './legacy-resolver-settings'
16+
import { normalizeConfigResolvers, resolveWithLegacyResolver } from './legacy-resolver-settings'
1617

1718
export const CASE_SENSITIVE_FS = !fs.existsSync(
1819
path.resolve(
@@ -98,49 +99,38 @@ function fullResolve(
9899
return { found: true, path: cachedPath }
99100
}
100101

101-
function withResolver(resolver: Resolver, config: unknown): ResolvedResult {
102-
if (resolver.interfaceVersion === 2) {
103-
return resolver.resolve(modulePath, sourceFile, config)
104-
}
102+
if (Object.prototype.hasOwnProperty.call(settings, 'import-x/resolver-next') && settings['import-x/resolver-next']) {
103+
const configResolvers = settings['import-x/resolver-next']
105104

106-
try {
107-
const resolved = resolver.resolveImport(modulePath, sourceFile, config)
108-
if (resolved === undefined) {
109-
return {
110-
found: false,
111-
}
112-
}
113-
return {
114-
found: true,
115-
path: resolved,
116-
}
117-
} catch {
118-
return {
119-
found: false,
105+
for (const resolver of configResolvers) {
106+
const resolved = resolver.resolve(modulePath, sourceFile)
107+
if (!resolved.found) {
108+
continue
120109
}
121-
}
122-
}
123-
124-
const configResolvers = settings['import-x/resolver'] || {
125-
node: settings['import-x/resolve'],
126-
} // backward compatibility
127110

128-
const resolvers = normalizeConfigResolvers(configResolvers, sourceFile)
129-
130-
for (const { enable, options, resolver } of resolvers) {
131-
if (!enable) {
132-
continue
111+
// else, counts
112+
fileExistsCache.set(cacheKey, resolved.path as string | null)
113+
return resolved
133114
}
115+
} 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)) {
121+
if (!enable) {
122+
continue
123+
}
134124

135-
const resolved = withResolver(resolver, options)
125+
const resolved = resolveWithLegacyResolver(resolver, options, modulePath, sourceFile)
126+
if (!resolved.found) {
127+
continue
128+
}
136129

137-
if (!resolved.found) {
138-
continue
130+
// else, counts
131+
fileExistsCache.set(cacheKey, resolved.path as string | null)
132+
return resolved
139133
}
140-
141-
// else, counts
142-
fileExistsCache.set(cacheKey, resolved.path as string | null)
143-
return resolved
144134
}
145135

146136
// failed

0 commit comments

Comments
 (0)