Skip to content

Commit bfa1241

Browse files
committed
Use enhanced-resolve to load files
1 parent d98c840 commit bfa1241

File tree

4 files changed

+48
-22
lines changed

4 files changed

+48
-22
lines changed

package-lock.json

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"ast-types": "^0.14.2",
4444
"clear-module": "^4.1.2",
4545
"cpy-cli": "^5.0.0",
46+
"enhanced-resolve": "^5.17.1",
4647
"esbuild": "^0.19.8",
4748
"escalade": "^3.1.1",
4849
"import-sort-style-module": "^6.0.0",

src/config.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import loadConfigFallback from 'tailwindcss/loadConfig'
1717
import resolveConfigFallback from 'tailwindcss/resolveConfig'
1818
import type { RequiredConfig } from 'tailwindcss/types/config.js'
1919
import { expiringMap } from './expiring-map.js'
20-
import { resolveFrom, resolveIn } from './resolve'
20+
import { resolveJsFrom } from './resolve'
2121
import type { ContextContainer } from './types'
2222

2323
let sourceToPathMap = new Map<string, string | null>()
@@ -104,7 +104,7 @@ async function loadTailwindConfig(
104104
let tailwindConfig: RequiredConfig = { content: [] }
105105

106106
try {
107-
let pkgFile = resolveIn('tailwindcss/package.json', [baseDir])
107+
let pkgFile = resolveJsFrom(baseDir, 'tailwindcss/package.json')
108108
let pkgDir = path.dirname(pkgFile)
109109

110110
try {
@@ -163,7 +163,8 @@ function createLoader<T>({
163163

164164
async function loadFile(id: string, base: string) {
165165
try {
166-
let resolved = resolveFrom(base, id)
166+
let resolved = resolveJsFrom(base, id)
167+
167168
let url = pathToFileURL(resolved)
168169
url.searchParams.append('t', cacheKey)
169170

@@ -183,7 +184,8 @@ async function loadV4(
183184
entryPoint: string | null,
184185
) {
185186
// Import Tailwind — if this is v4 it'll have APIs we can use directly
186-
let pkgPath = resolveIn('tailwindcss', [baseDir])
187+
let pkgPath = resolveJsFrom(baseDir, 'tailwindcss')
188+
187189
let tw = await import(pathToFileURL(pkgPath).toString())
188190

189191
// This is not Tailwind v4

src/resolve.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import { createRequire as req } from 'node:module'
2-
import resolveFrom from 'resolve-from'
1+
import fs from 'node:fs'
2+
import { fileURLToPath } from 'node:url'
3+
import { CachedInputFileSystem, ResolverFactory } from 'enhanced-resolve'
34
import { expiringMap } from './expiring-map'
45

5-
const localRequire = req(import.meta.url)
6+
const esmResolver = ResolverFactory.createResolver({
7+
fileSystem: new CachedInputFileSystem(fs, 30_000),
8+
useSyncFileSystemCalls: true,
9+
extensions: ['.mjs', '.js', '.cjs'],
10+
mainFields: ['module', 'main'],
11+
conditionNames: ['node', 'import', 'require'],
12+
})
613

714
// This is a long-lived cache for resolved modules whether they exist or not
815
// Because we're compatible with a large number of plugins, we need to check
@@ -11,17 +18,11 @@ const localRequire = req(import.meta.url)
1118
// failed module resolutions making repeated checks very expensive.
1219
const resolveCache = expiringMap<string, string | null>(30_000)
1320

14-
export function resolveIn(id: string, paths: string[]) {
15-
return localRequire.resolve(id, {
16-
paths,
17-
})
18-
}
19-
2021
export function maybeResolve(name: string) {
2122
let modpath = resolveCache.get(name)
2223

2324
if (modpath === undefined) {
24-
modpath = freshMaybeResolve(name)
25+
modpath = resolveJsFrom(fileURLToPath(import.meta.url), name)
2526
resolveCache.set(name, modpath)
2627
}
2728

@@ -39,12 +40,11 @@ export async function loadIfExists<T>(name: string): Promise<T | null> {
3940
return null
4041
}
4142

42-
function freshMaybeResolve(name: string) {
43-
try {
44-
return localRequire.resolve(name)
45-
} catch (err) {
46-
return null
47-
}
48-
}
43+
export function resolveJsFrom(base: string, id: string): string {
44+
let result = esmResolver.resolveSync({}, base, id)
45+
if (result) return result
4946

50-
export { resolveFrom }
47+
throw new Error(
48+
`Cannot find module "${id}" (searching relative to: "${base}")`,
49+
)
50+
}

0 commit comments

Comments
 (0)