Skip to content

Commit 0a20ff4

Browse files
committed
perf: cache options and resolver
1 parent f0ae4c7 commit 0a20ff4

File tree

1 file changed

+34
-28
lines changed

1 file changed

+34
-28
lines changed

src/index.ts

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,30 @@ export interface TsResolverOptions
9494
extensions?: string[]
9595
}
9696

97+
type InternalResolverOptions = Required<
98+
Pick<
99+
ResolveOptions,
100+
| 'conditionNames'
101+
| 'extensionAlias'
102+
| 'extensions'
103+
| 'mainFields'
104+
| 'useSyncFileSystemCalls'
105+
>
106+
> &
107+
ResolveOptions &
108+
TsResolverOptions
109+
97110
const fileSystem = fs as FileSystem
98111

99112
const JS_EXT_PATTERN = /\.(?:[cm]js|jsx?)$/
100113
const RELATIVE_PATH_PATTERN = /^\.{1,2}(?:\/.*)?$/
101114

102-
let mappersCachedOptions: TsResolverOptions
115+
let cachedOptions: InternalResolverOptions | undefined
116+
117+
let mappersCachedOptions: InternalResolverOptions
103118
let mappers: Array<((specifier: string) => string[]) | null> | undefined
104119

105-
let resolverCachedOptions: TsResolverOptions
120+
let resolverCachedOptions: InternalResolverOptions
106121
let resolver: Resolver | undefined
107122

108123
/**
@@ -119,30 +134,21 @@ export function resolve(
119134
found: boolean
120135
path?: string | null
121136
} {
122-
const opts: Required<
123-
Pick<
124-
ResolveOptions,
125-
| 'conditionNames'
126-
| 'extensionAlias'
127-
| 'extensions'
128-
| 'mainFields'
129-
| 'useSyncFileSystemCalls'
130-
>
131-
> &
132-
ResolveOptions &
133-
TsResolverOptions = {
134-
...options,
135-
conditionNames: options?.conditionNames ?? defaultConditionNames,
136-
extensions: options?.extensions ?? defaultExtensions,
137-
extensionAlias: options?.extensionAlias ?? defaultExtensionAlias,
138-
mainFields: options?.mainFields ?? defaultMainFields,
139-
fileSystem,
140-
useSyncFileSystemCalls: true,
137+
if (!cachedOptions || cachedOptions !== options) {
138+
cachedOptions = {
139+
...options,
140+
conditionNames: options?.conditionNames ?? defaultConditionNames,
141+
extensions: options?.extensions ?? defaultExtensions,
142+
extensionAlias: options?.extensionAlias ?? defaultExtensionAlias,
143+
mainFields: options?.mainFields ?? defaultMainFields,
144+
fileSystem,
145+
useSyncFileSystemCalls: true,
146+
}
141147
}
142148

143-
if (!resolver || resolverCachedOptions !== opts) {
144-
resolver = ResolverFactory.createResolver(opts)
145-
resolverCachedOptions = opts
149+
if (!resolver || resolverCachedOptions !== cachedOptions) {
150+
resolver = ResolverFactory.createResolver(cachedOptions)
151+
resolverCachedOptions = cachedOptions
146152
}
147153

148154
log('looking for:', source)
@@ -159,9 +165,9 @@ export function resolve(
159165
}
160166
}
161167

162-
initMappers(opts)
168+
initMappers(cachedOptions)
163169

164-
const mappedPath = getMappedPath(source, file, opts.extensions, true)
170+
const mappedPath = getMappedPath(source, file, cachedOptions.extensions, true)
165171
if (mappedPath) {
166172
log('matched ts path:', mappedPath)
167173
}
@@ -183,7 +189,7 @@ export function resolve(
183189
// if path is neither absolute nor relative
184190
if (
185191
(JS_EXT_PATTERN.test(foundNodePath!) ||
186-
(opts.alwaysTryTypes && !foundNodePath)) &&
192+
(cachedOptions.alwaysTryTypes && !foundNodePath)) &&
187193
!/^@types[/\\]/.test(source) &&
188194
!path.isAbsolute(source) &&
189195
!source.startsWith('.')
@@ -304,7 +310,7 @@ function getMappedPath(
304310
return paths[0]
305311
}
306312

307-
function initMappers(options: TsResolverOptions) {
313+
function initMappers(options: InternalResolverOptions) {
308314
if (mappers && mappersCachedOptions === options) {
309315
return
310316
}

0 commit comments

Comments
 (0)