diff --git a/CHANGELOG.md b/CHANGELOG.md index 1af0d3e822cf..4380a6f2855b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Fixes +- `[jest-resolver]` Support `node:` prefix when importing Node core modules with ESM ([#11817](https://github.com/facebook/jest/pull/11817)) - `[jest-types]` Export the `PrettyFormatOptions` interface ([#11801](https://github.com/facebook/jest/pull/11801)) ### Chore & Maintenance diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index e6c44c61c5e4..4431860f7880 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -41,7 +41,7 @@ FAIL __tests__/index.js 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/resolver.js:561:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/resolver.js:566:17) at Object.require (index.js:10:1) `; @@ -70,6 +70,6 @@ FAIL __tests__/index.js 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/resolver.js:561:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/resolver.js:566:17) at Object.require (index.js:10:1) `; diff --git a/e2e/__tests__/__snapshots__/nativeEsm.test.ts.snap b/e2e/__tests__/__snapshots__/nativeEsm.test.ts.snap index 27a97a8da96a..e530b3607f71 100644 --- a/e2e/__tests__/__snapshots__/nativeEsm.test.ts.snap +++ b/e2e/__tests__/__snapshots__/nativeEsm.test.ts.snap @@ -10,7 +10,7 @@ Ran all test suites matching /native-esm.tla.test.js/i. exports[`on node ^12.16.0 || >=13.7.0 runs test with native ESM 1`] = ` Test Suites: 1 passed, 1 total -Tests: 20 passed, 20 total +Tests: 21 passed, 21 total Snapshots: 0 total Time: <> Ran all test suites matching /native-esm.test.js/i. diff --git a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap index 284c4c43706a..10321533f870 100644 --- a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap +++ b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap @@ -37,6 +37,6 @@ FAIL __tests__/test.js | ^ 9 | - at Resolver.resolveModule (../../packages/jest-resolve/build/resolver.js:313:11) + at Resolver.resolveModule (../../packages/jest-resolve/build/resolver.js:318:11) at Object.require (index.js:8:18) `; diff --git a/e2e/native-esm/__tests__/native-esm.test.js b/e2e/native-esm/__tests__/native-esm.test.js index edff8b0fbc81..340a9b3cae10 100644 --- a/e2e/native-esm/__tests__/native-esm.test.js +++ b/e2e/native-esm/__tests__/native-esm.test.js @@ -5,12 +5,14 @@ * LICENSE file in the root directory of this source tree. */ +import dns from 'dns'; // the point here is that it's the node core module // eslint-disable-next-line no-restricted-imports import {readFileSync} from 'fs'; import {createRequire} from 'module'; import {dirname, resolve} from 'path'; import {fileURLToPath} from 'url'; +import prefixDns from 'node:dns'; import {jest as jestObject} from '@jest/globals'; import staticImportedStatefulFromCjs from '../fromCjs.mjs'; import {double} from '../index'; @@ -188,3 +190,7 @@ test('can mock module', async () => { expect(Object.keys(importedMock)).toEqual(['foo']); expect(importedMock.foo).toEqual('bar'); }); + +test('supports imports using "node:" prefix', () => { + expect(dns).toBe(prefixDns); +}); diff --git a/packages/jest-resolve/src/resolver.ts b/packages/jest-resolve/src/resolver.ts index c0800eef94cf..b532c73ba410 100644 --- a/packages/jest-resolve/src/resolver.ts +++ b/packages/jest-resolve/src/resolver.ts @@ -176,8 +176,12 @@ export default class Resolver { const skipResolution = options && options.skipNodeResolution && !moduleName.includes(path.sep); - const resolveNodeModule = (name: Config.Path, throwIfNotFound = false) => - Resolver.findNodeModule(name, { + const resolveNodeModule = (name: Config.Path, throwIfNotFound = false) => { + if (this.isCoreModule(name)) { + return name; + } + + return Resolver.findNodeModule(name, { basedir: dirname, extensions, moduleDirectory, @@ -186,6 +190,7 @@ export default class Resolver { rootDir: this._options.rootDir, throwIfNotFound, }); + }; if (!skipResolution) { module = resolveNodeModule(moduleName, Boolean(process.versions.pnp));