Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
4 changes: 2 additions & 2 deletions e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
`;
Expand Down Expand Up @@ -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)"
`;
2 changes: 1 addition & 1 deletion e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
`;
Original file line number Diff line number Diff line change
Expand Up @@ -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)"
`;
3 changes: 2 additions & 1 deletion packages/jest-resolve/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
18 changes: 18 additions & 0 deletions packages/jest-resolve/src/__tests__/resolve.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
25 changes: 17 additions & 8 deletions packages/jest-resolve/src/defaultResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -73,6 +74,12 @@
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);
}
Expand Down Expand Up @@ -111,13 +118,12 @@
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) {
Expand All @@ -131,12 +137,13 @@
...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);
}
Expand All @@ -145,8 +152,10 @@
);
};

return finalResolver((resolver: ResolverFactory) =>
async ? resolver.async(basedir, path) : resolver.sync(basedir, path),
return finalResolver(() =>
async
? unrsResolver!.async(basedir, path)

Check warning on line 157 in packages/jest-resolve/src/defaultResolver.ts

View check run for this annotation

Codecov / codecov/patch

packages/jest-resolve/src/defaultResolver.ts#L157

Added line #L157 was not covered by tests
: unrsResolver!.sync(basedir, path),
);
}

Expand Down
27 changes: 27 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down
Loading