fix: resolve builtin modules correctly (#15683)

This commit is contained in:
JounQin 2025-06-18 20:10:59 +08:00 committed by GitHub
parent 42c8e7de64
commit edc3272abc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 72 additions and 13 deletions

View File

@ -4,6 +4,10 @@
- `[jest-resolver]` Implement the `defaultAsyncResolver` ([#15679](https://github.com/jestjs/jest/pull/15679))
### Fixes
- `[jest-resolver]` Resolve builtin modules correctly ([#15683](https://github.com/jestjs/jest/pull/15683))
### Chore & Maintenance
- `[*]` Remove and deprecate `jest-repl` package ([#15673](https://github.com/jestjs/jest/pull/15673))

View File

@ -41,7 +41,7 @@ exports[`moduleNameMapper wrong array configuration 1`] = `
12 | module.exports = () => 'test';
13 |
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1129:17)
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1142:17)
at Object.require (index.js:10:1)
at Object.require (__tests__/index.js:10:20)"
`;
@ -71,7 +71,7 @@ exports[`moduleNameMapper wrong configuration 1`] = `
12 | module.exports = () => 'test';
13 |
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1129:17)
at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1142:17)
at Object.require (index.js:10:1)
at Object.require (__tests__/index.js:10:20)"
`;

View File

@ -26,7 +26,7 @@ exports[`shows a proper error from deep requires 1`] = `
12 | test('dummy', () => {
13 | expect(1).toBe(1);
at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:875:11)
at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:888:11)
at Object.<anonymous> (node_modules/discord.js/src/index.js:21:12)
at Object.require (__tests__/test.js:10:1)"
`;

View File

@ -37,7 +37,7 @@ exports[`show error message with matching files 1`] = `
| ^
9 |
at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:875:11)
at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:888:11)
at Object.require (index.js:8:18)
at Object.require (__tests__/test.js:8:11)"
`;

View File

@ -29,7 +29,8 @@
"unrs-resolver": "^1.7.11"
},
"devDependencies": {
"@types/graceful-fs": "^4.1.9"
"@types/graceful-fs": "^4.1.9",
"url": "^0.11.4"
},
"engines": {
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"

View File

@ -84,6 +84,24 @@ describe('isCoreModule', () => {
});
describe('findNodeModule', () => {
it('should resolve builtin modules as-is', () => {
expect(
Resolver.findNodeModule('url', {
basedir: __dirname,
}),
).toBe('url');
expect(
Resolver.findNodeModule('node:url', {
basedir: __dirname,
}),
).toBe('node:url');
expect(
Resolver.findNodeModule('url/', {
basedir: __dirname,
}),
).toBe(path.resolve('node_modules/url/url.js'));
});
it('is possible to override the default resolver', () => {
const cwd = process.cwd();
const resolvedCwd = fs.realpathSync(cwd) || cwd;

View File

@ -5,6 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/
import {isBuiltin} from 'module';
import {fileURLToPath} from 'url';
import pnpResolver from 'jest-pnp-resolver';
import {
@ -73,6 +74,12 @@ function baseResolver(
options: ResolverOptions,
async?: true,
): string | Promise<string> {
// https://github.com/oxc-project/oxc-resolver/issues/565
// https://github.com/jestjs/jest/issues/15676
if (isBuiltin(path)) {
return path;
}
if (process.versions.pnp && options.allowPnp !== false) {
return pnpResolver(path, options);
}
@ -111,13 +118,12 @@ function baseResolver(
unrsResolver = unrsResolver.cloneWithOptions(resolveOptions);
} else {
unrsResolver = new ResolverFactory(resolveOptions);
setResolver(unrsResolver);
}
setResolver(unrsResolver);
const finalResolver = (
resolve: (
resolver: ResolverFactory,
) => ResolveResult | Promise<ResolveResult>,
resolve: () => ResolveResult | Promise<ResolveResult>,
) => {
const resolveWithPathsFallback = (result: ResolveResult) => {
if (!result.path && paths?.length) {
@ -131,12 +137,13 @@ function baseResolver(
...resolveOptions,
modules: paths,
});
return resolve(unrsResolver);
setResolver(unrsResolver);
return resolve();
}
}
return result;
};
const result = resolve(unrsResolver!);
const result = resolve();
if ('then' in result) {
return result.then(resolveWithPathsFallback).then(handleResolveResult);
}
@ -145,8 +152,10 @@ function baseResolver(
);
};
return finalResolver((resolver: ResolverFactory) =>
async ? resolver.async(basedir, path) : resolver.sync(basedir, path),
return finalResolver(() =>
async
? unrsResolver!.async(basedir, path)
: unrsResolver!.sync(basedir, path),
);
}

View File

@ -13797,6 +13797,7 @@ __metadata:
jest-validate: "workspace:*"
slash: "npm:^3.0.0"
unrs-resolver: "npm:^1.7.11"
url: "npm:^0.11.4"
languageName: unknown
linkType: soft
@ -18400,6 +18401,13 @@ __metadata:
languageName: node
linkType: hard
"punycode@npm:^1.4.1":
version: 1.4.1
resolution: "punycode@npm:1.4.1"
checksum: 10/af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4
languageName: node
linkType: hard
"punycode@npm:^2.1.0, punycode@npm:^2.3.1":
version: 2.3.1
resolution: "punycode@npm:2.3.1"
@ -18432,6 +18440,15 @@ __metadata:
languageName: node
linkType: hard
"qs@npm:^6.12.3":
version: 6.14.0
resolution: "qs@npm:6.14.0"
dependencies:
side-channel: "npm:^1.1.0"
checksum: 10/a60e49bbd51c935a8a4759e7505677b122e23bf392d6535b8fc31c1e447acba2c901235ecb192764013cd2781723dc1f61978b5fdd93cc31d7043d31cdc01974
languageName: node
linkType: hard
"queue-microtask@npm:^1.2.2":
version: 1.2.3
resolution: "queue-microtask@npm:1.2.3"
@ -21567,6 +21584,16 @@ __metadata:
languageName: node
linkType: hard
"url@npm:^0.11.4":
version: 0.11.4
resolution: "url@npm:0.11.4"
dependencies:
punycode: "npm:^1.4.1"
qs: "npm:^6.12.3"
checksum: 10/e787d070f0756518b982a4653ef6cdf4d9030d8691eee2d483344faf2b530b71d302287fa63b292299455fea5075c502a5ad5f920cb790e95605847f957a65e4
languageName: node
linkType: hard
"util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1":
version: 1.0.2
resolution: "util-deprecate@npm:1.0.2"