Use resolveJsId when resolving tailwindcss/package.json (#15041)

This PR uses the `enhanced-resolve` instead of
`createRequire(…).resolve` which improves the usability when running the
upgrade tool locally using Bun.

While testing, we also noticed that it is not possible to use a
`cjs`-only plugin inside of an `esm` project. It was also not possible
to use an `esm`-only plugin inside of a `cjs` project.

# Test plan

We added integration tests in both the CLI (the CLI is an mjs project)
and in the PostCSS (where we can configure a `cjs` and `esm` PostCSS
config) integration tests where we created an `esm` and `cjs` based
project with 4 plugins (`cjs`-only, `esm`-only, and TypeScript based
plugins: `cts`-only and `mts`-only).
This commit is contained in:
Robin Malfait 2024-11-19 18:39:49 +01:00 • committed by GitHub
parent e4bfa8c9b7
commit fe9fc9abba
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 365 additions and 16 deletions

View file

@ -174,11 +174,18 @@ async function resolveCssId(id: string, base: string): Promise<string | false |
return runResolver(cssResolver, id, base)
}
const jsResolver = EnhancedResolve.ResolverFactory.createResolver({
const esmResolver = EnhancedResolve.ResolverFactory.createResolver({
fileSystem: new EnhancedResolve.CachedInputFileSystem(fs, 4000),
useSyncFileSystemCalls: true,
extensions: ['.js', '.json', '.node', '.ts'],
conditionNames: import.meta.url ? ['node', 'import'] : ['node', 'require'],
conditionNames: ['node', 'import'],
})
const cjsResolver = EnhancedResolve.ResolverFactory.createResolver({
fileSystem: new EnhancedResolve.CachedInputFileSystem(fs, 4000),
useSyncFileSystemCalls: true,
extensions: ['.js', '.json', '.node', '.ts'],
conditionNames: ['node', 'require'],
})
function resolveJsId(id: string, base: string): Promise<string | false | undefined> {
@ -188,7 +195,7 @@ function resolveJsId(id: string, base: string): Promise<string | false | undefin
return Promise.resolve(resolved)
}
}
return runResolver(jsResolver, id, base)
return runResolver(esmResolver, id, base).catch(() => runResolver(cjsResolver, id, base))
}
function runResolver(