From e4fd64f0563744b5408fcf98e810c6b38d911f21 Mon Sep 17 00:00:00 2001 From: JounQin Date: Sat, 24 May 2025 10:23:26 +0800 Subject: [PATCH 1/3] chore: migrate `resolve` and `resolve.exports` to `unrs-resolver` close #15600 --- docs/Configuration.md | 4 - .../moduleNameMapper.test.ts.snap | 4 +- .../requireMissingExt.test.ts.snap | 2 +- .../__tests__/undeclared-dependency.test.js | 2 +- packages/jest-resolve/package.json | 10 +- .../src/__tests__/resolve.test.ts | 73 +---- packages/jest-resolve/src/defaultResolver.ts | 242 +++------------ packages/jest-resolve/src/index.ts | 2 - packages/jest-resolve/src/resolver.ts | 6 +- yarn.lock | 276 ++++++------------ 10 files changed, 151 insertions(+), 470 deletions(-) diff --git a/docs/Configuration.md b/docs/Configuration.md index ac7a5bd01104..0fc00f0fbed3 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -1482,10 +1482,6 @@ type ResolverOptions = { moduleDirectory?: Array; /** List of `require.paths` to use if nothing is found in `node_modules`. */ paths?: Array; - /** Allows transforming parsed `package.json` contents. */ - packageFilter?: (pkg: PackageJSON, file: string, dir: string) => PackageJSON; - /** Allows transforms a path within a package. */ - pathFilter?: (pkg: PackageJSON, path: string, relativePath: string) => string; /** Current root directory. */ rootDir?: string; }; diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index e7a3b80a7c1b..0160887b6f8c 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -41,7 +41,7 @@ exports[`moduleNameMapper wrong array configuration 1`] = ` 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1184:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1080: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:1184:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1080:17) at Object.require (index.js:10:1) at Object.require (__tests__/index.js:10:20)" `; diff --git a/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap index e1595406b736..bcc91628149c 100644 --- a/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap +++ b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap @@ -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:930:11) + at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:826:11) at Object. (node_modules/discord.js/src/index.js:21:12) at Object.require (__tests__/test.js:10:1)" `; diff --git a/e2e/pnp/__tests__/undeclared-dependency.test.js b/e2e/pnp/__tests__/undeclared-dependency.test.js index 6843fa065fc8..e27b2b5b8fa9 100644 --- a/e2e/pnp/__tests__/undeclared-dependency.test.js +++ b/e2e/pnp/__tests__/undeclared-dependency.test.js @@ -9,5 +9,5 @@ it('should surface pnp errors', () => { expect(() => { require('undeclared'); - }).toThrow(expect.objectContaining({code: 'MODULE_NOT_FOUND'})); + }).toThrow("Cannot find module 'unesitent_module__'"); }); diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index 5007231415a3..d60307339ee3 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -22,17 +22,13 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "workspace:*", - "jest-pnp-resolver": "^1.2.3", "jest-util": "workspace:*", "jest-validate": "workspace:*", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "slash": "^3.0.0", + "unrs-resolver": "^1.7.8" }, "devDependencies": { - "@types/graceful-fs": "^4.1.3", - "@types/pnpapi": "^0.0.5", - "@types/resolve": "^1.20.2" + "@types/graceful-fs": "^4.1.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" diff --git a/packages/jest-resolve/src/__tests__/resolve.test.ts b/packages/jest-resolve/src/__tests__/resolve.test.ts index 0228a53f6243..70de6a603f43 100644 --- a/packages/jest-resolve/src/__tests__/resolve.test.ts +++ b/packages/jest-resolve/src/__tests__/resolve.test.ts @@ -6,43 +6,26 @@ * */ -import * as path from 'path'; -import {fileURLToPath, pathToFileURL} from 'url'; import * as fs from 'graceful-fs'; -import {sync as resolveSync} from 'resolve'; import {type IModuleMap, ModuleMap} from 'jest-haste-map'; +import * as path from 'path'; +import {pathToFileURL} from 'url'; + import userResolver from '../__mocks__/userResolver'; import userResolverAsync from '../__mocks__/userResolverAsync'; -import defaultResolver, {type PackageFilter} from '../defaultResolver'; +import defaultResolver from '../defaultResolver'; import nodeModulesPaths from '../nodeModulesPaths'; import Resolver from '../resolver'; import type {ResolverConfig} from '../types'; jest.mock('../__mocks__/userResolver').mock('../__mocks__/userResolverAsync'); -// Do not fully mock `resolve` because it is used by Jest. Doing it will crash -// in very strange ways. Instead, just spy on it and its `sync` method. -jest.mock('resolve', () => { - const originalModule = - jest.requireActual('resolve'); - - const m = jest.fn((...args) => - originalModule(...args), - ); - Object.assign(m, originalModule); - m.sync = jest.spyOn(originalModule, 'sync'); - - return m; -}); - const mockUserResolver = jest.mocked(userResolver); const mockUserResolverAsync = jest.mocked(userResolverAsync); -const mockResolveSync = jest.mocked(resolveSync); beforeEach(() => { mockUserResolver.mockClear(); mockUserResolverAsync.async.mockClear(); - mockResolveSync.mockClear(); Resolver.clearDefaultResolverCache(); }); @@ -134,25 +117,6 @@ describe('findNodeModule', () => { }); }); - it('wraps passed packageFilter to the resolve module when using the default resolver', () => { - const packageFilter = jest.fn(); - - // A resolver that delegates to defaultResolver with a packageFilter implementation - mockUserResolver.mockImplementation((request, opts) => - opts.defaultResolver(request, {...opts, packageFilter}), - ); - - Resolver.findNodeModule('./test', { - basedir: path.resolve(__dirname, '../__mocks__/'), - resolver: require.resolve('../__mocks__/userResolver'), - }); - - expect(packageFilter).toHaveBeenCalledWith( - expect.objectContaining({name: '__mocks__'}), - expect.any(String), - ); - }); - it('supports file URLs', () => { const path = pathToFileURL(__filename).href; const newPath = Resolver.findNodeModule(path, { @@ -209,7 +173,7 @@ describe('findNodeModule', () => { ); }); - test('respects order in package.json, not conditions', () => { + test('respects order in conditions over package.json', () => { const resultImport = Resolver.findNodeModule('exports', { basedir: conditionsRoot, conditions: ['import', 'require'], @@ -219,7 +183,7 @@ describe('findNodeModule', () => { conditions: ['require', 'import'], }); - expect(resultImport).toEqual(resultRequire); + expect(resultImport).not.toEqual(resultRequire); }); test('supports nested paths', () => { @@ -407,7 +371,9 @@ describe('findNodeModule', () => { basedir: path.resolve(importsRoot, './foo-import/index.js'), conditions: [], }); - }).toThrow('Missing "#something-else" specifier in "foo-import" package'); + }).toThrow( + `Package import specifier "#something-else" is not defined in package ${path.join(importsRoot, 'foo-import/package.json')}`, + ); }); }); }); @@ -446,27 +412,6 @@ describe('findNodeModuleAsync', () => { }); }); - it('passes packageFilter to the resolve module when using the default resolver', async () => { - const packageFilter = jest.fn(); - - // A resolver that delegates to defaultResolver with a packageFilter implementation - mockUserResolverAsync.async.mockImplementation((request, opts) => - Promise.resolve(opts.defaultResolver(request, {...opts, packageFilter})), - ); - - await Resolver.findNodeModuleAsync('test', { - basedir: '/', - resolver: require.resolve('../__mocks__/userResolverAsync'), - }); - - expect(mockResolveSync).toHaveBeenCalledWith( - 'test', - expect.objectContaining({ - packageFilter, - }), - ); - }); - it('supports file URLs', async () => { const path = pathToFileURL(__filename).href; const newPath = await Resolver.findNodeModuleAsync(path, { diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 2ee685999c3c..aba4665495f5 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -5,62 +5,19 @@ * LICENSE file in the root directory of this source tree. */ -import {dirname, isAbsolute, resolve as pathResolve} from 'path'; import {fileURLToPath} from 'url'; -import pnpResolver from 'jest-pnp-resolver'; import { - type SyncOpts as UpstreamResolveOptions, - sync as resolveSync, -} from 'resolve'; -import * as resolve from 'resolve.exports'; -import { - findClosestPackageJson, - isDirectory, - isFile, - readPackageCached, - realpathSync, -} from './fileWalkers'; -import type {PackageJSON} from './types'; - -/** - * Allows transforming parsed `package.json` contents. - * - * @param pkg - Parsed `package.json` contents. - * @param file - Path to `package.json` file. - * @param dir - Directory that contains the `package.json`. - * - * @returns Transformed `package.json` contents. - */ -export type PackageFilter = ( - pkg: PackageJSON, - file: string, - dir: string, -) => PackageJSON; - -/** - * Allows transforming a path within a package. - * - * @param pkg - Parsed `package.json` contents. - * @param path - Path being resolved. - * @param relativePath - Path relative from the `package.json` location. - * - * @returns Relative path that will be joined from the `package.json` location. - */ -export type PathFilter = ( - pkg: PackageJSON, - path: string, - relativePath: string, -) => string; + ResolverFactory, + type NapiResolveOptions as UpstreamResolveOptions, +} from 'unrs-resolver'; -export type ResolverOptions = { +export interface ResolverOptions extends UpstreamResolveOptions { /** Directory to begin resolving from. */ basedir: string; /** List of export conditions. */ conditions?: Array; /** Instance of default resolver. */ defaultResolver: typeof defaultResolver; - /** List of file extensions to search in order. */ - extensions?: Array; /** * List of directory names to be looked up for modules recursively. * @@ -75,16 +32,9 @@ export type ResolverOptions = { * The default is `undefined`. */ paths?: Array; - /** Allows transforming parsed `package.json` contents. */ - packageFilter?: PackageFilter; - /** Allows transforms a path within a package. */ - pathFilter?: PathFilter; /** Current root directory. */ rootDir?: string; -}; - -type UpstreamResolveOptionsWithConditions = UpstreamResolveOptions & - ResolverOptions; +} export type SyncResolver = (path: string, options: ResolverOptions) => string; export type AsyncResolver = ( @@ -94,160 +44,58 @@ export type AsyncResolver = ( export type Resolver = SyncResolver | AsyncResolver; -const defaultResolver: SyncResolver = (path, options) => { - // Yarn 2 adds support to `resolve` automatically so the pnpResolver is only - // needed for Yarn 1 which implements version 1 of the pnp spec - if (process.versions.pnp === '1') { - return pnpResolver(path, options); - } - - const resolveOptions: UpstreamResolveOptionsWithConditions = { - ...options, - isDirectory, - isFile, - preserveSymlinks: false, - readPackageSync, - realpathSync, - }; - - const pathToResolve = getPathInModule(path, resolveOptions); - - // resolveSync dereferences symlinks to ensure we don't create a separate - // module instance depending on how it was referenced. - const result = resolveSync(pathToResolve, resolveOptions); - - return result; -}; - -export default defaultResolver; - -/* - * helper functions - */ - -function readPackageSync(_: unknown, file: string): PackageJSON { - return readPackageCached(file); -} - -function getPathInModule( - path: string, - options: UpstreamResolveOptionsWithConditions, -): string { +const defaultResolver: SyncResolver = ( + path, + { + basedir, + conditions, + conditionNames, + modules, + moduleDirectory, + paths, + roots, + rootDir, + ...rest + }, +) => { if (path.startsWith('file://')) { path = fileURLToPath(path); } - if (shouldIgnoreRequestForExports(path)) { - return path; - } - - if (path.startsWith('#')) { - const closestPackageJson = findClosestPackageJson(options.basedir); + modules = modules || moduleDirectory; - if (!closestPackageJson) { - throw new Error( - `Jest: unable to locate closest package.json from ${options.basedir} when resolving import "${path}"`, - ); - } + const resolveOptions: UpstreamResolveOptions = { + conditionNames: conditionNames || + conditions || ['require', 'node', 'default'], + modules, + roots: roots || (rootDir ? [rootDir] : undefined), + ...rest, + }; - const pkg = readPackageCached(closestPackageJson); + let unrsResolver = new ResolverFactory(resolveOptions); - const resolved = resolve.imports( - pkg, - path as resolve.Imports.Entry, - createResolveOptions(options.conditions), - ); + let result = unrsResolver.sync(basedir, path); - if (resolved) { - const target = resolved[0]; - return target.startsWith('.') - ? // internal relative filepath - pathResolve(dirname(closestPackageJson), target) - : // this is an external module, re-resolve it - defaultResolver(target, options); + if (!result.path && paths?.length) { + const modulesArr = + modules == null || Array.isArray(modules) ? modules : [modules]; + if (modulesArr?.length) { + paths = paths.filter(p => !modulesArr.includes(p)); } - - if (pkg.imports) { - throw new Error( - '`imports` exists, but no results - this is a bug in Jest. Please report an issue', - ); + if (paths.length > 0) { + unrsResolver = unrsResolver.cloneWithOptions({ + ...resolveOptions, + modules: paths, + }); + result = unrsResolver.sync(basedir, path); } } - const segments = path.split('/'); - - let moduleName = segments.shift(); - - if (moduleName) { - if (moduleName.startsWith('@')) { - moduleName = `${moduleName}/${segments.shift()}`; - } - - // self-reference - const closestPackageJson = findClosestPackageJson(options.basedir); - if (closestPackageJson) { - const pkg = readPackageCached(closestPackageJson); - - if (pkg.name === moduleName) { - const resolved = resolve.exports( - pkg, - (segments.join('/') || '.') as resolve.Exports.Entry, - createResolveOptions(options.conditions), - ); - - if (resolved) { - return pathResolve(dirname(closestPackageJson), resolved[0]); - } - - if (pkg.exports) { - throw new Error( - '`exports` exists, but no results - this is a bug in Jest. Please report an issue', - ); - } - } - } - - let packageJsonPath = ''; - - try { - packageJsonPath = resolveSync(`${moduleName}/package.json`, options); - } catch { - // ignore if package.json cannot be found - } - - if (packageJsonPath && isFile(packageJsonPath)) { - const pkg = readPackageCached(packageJsonPath); - - const resolved = resolve.exports( - pkg, - (segments.join('/') || '.') as resolve.Exports.Entry, - createResolveOptions(options.conditions), - ); - - if (resolved) { - return pathResolve(dirname(packageJsonPath), resolved[0]); - } - - if (pkg.exports) { - throw new Error( - '`exports` exists, but no results - this is a bug in Jest. Please report an issue', - ); - } - } + if (result.error) { + throw new Error(result.error); } - return path; -} - -function createResolveOptions( - conditions: Array | undefined, -): resolve.Options { - return conditions - ? {conditions, unsafe: true} - : // no conditions were passed - let's assume this is Jest internal and it should be `require` - {browser: false, require: true}; -} + return result.path!; +}; -// if it's a relative import or an absolute path, imports/exports are ignored -const shouldIgnoreRequestForExports = (path: string) => - path.startsWith('.') || isAbsolute(path); +export default defaultResolver; diff --git a/packages/jest-resolve/src/index.ts b/packages/jest-resolve/src/index.ts index f859e3ed0005..b3a1b5d54c2d 100644 --- a/packages/jest-resolve/src/index.ts +++ b/packages/jest-resolve/src/index.ts @@ -10,8 +10,6 @@ import Resolver from './resolver'; export type { AsyncResolver, SyncResolver, - PackageFilter, - PathFilter, ResolverOptions, } from './defaultResolver'; export type { diff --git a/packages/jest-resolve/src/resolver.ts b/packages/jest-resolve/src/resolver.ts index e80582f5b399..7f89c87b424c 100644 --- a/packages/jest-resolve/src/resolver.ts +++ b/packages/jest-resolve/src/resolver.ts @@ -341,7 +341,7 @@ export default class Resolver { resolveModule( from: string, moduleName: string, - options: ResolveModuleConfig, + options?: ResolveModuleConfig, ): string { const dirname = path.dirname(from); const module = @@ -491,7 +491,7 @@ export default class Resolver { getMockModule( from: string, name: string, - options: Pick, + options?: Pick, ): string | null { const mock = this._moduleMap.getMockModule(name); if (mock) { @@ -737,7 +737,7 @@ export default class Resolver { resolveStubModuleName( from: string, moduleName: string, - options: Pick, + options?: Pick, ): string | null { const dirname = path.dirname(from); diff --git a/yarn.lock b/yarn.lock index 1f8bdffdee84..e910116be266 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4680,7 +4680,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^0.2.9": +"@napi-rs/wasm-runtime@npm:^0.2.10": version: 0.2.10 resolution: "@napi-rs/wasm-runtime@npm:0.2.10" dependencies: @@ -6144,19 +6144,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": - version: 5.0.6 - resolution: "@types/express-serve-static-core@npm:5.0.6" - dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - "@types/send": "*" - checksum: bc3ea44923da7d1ffaa29eff7cc41a2b05f7340e8879fe9ee40717859937d73bcd635fcc0f8232f66af942624cc48bff42971e9e2c4075db6afe478534245855 - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.6 resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: @@ -6168,18 +6156,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:*": - version: 5.0.2 - resolution: "@types/express@npm:5.0.2" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^5.0.0 - "@types/serve-static": "*" - checksum: c6f73c75c2b62e293e5fadcfd7de61716e3d0c0eaecda082b1921c9c8e56ddc37c530c5d4d68404794b38c7e8f5b893719ffc04c6fba2efa2fb13223bfb0346b - languageName: node - linkType: hard - -"@types/express@npm:^4.17.13": +"@types/express@npm:*, @types/express@npm:^4.17.13": version: 4.17.22 resolution: "@types/express@npm:4.17.22" dependencies: @@ -6434,13 +6411,6 @@ __metadata: languageName: node linkType: hard -"@types/pnpapi@npm:^0.0.5": - version: 0.0.5 - resolution: "@types/pnpapi@npm:0.0.5" - checksum: 46d8474b77358c8cc48b957c059de6ad0839d18d8e90252c500c6bc30702e44e2629cf330350f7b291f35d863190b5390b641992c0601853a5d8b129fa91bd4d - languageName: node - linkType: hard - "@types/prettier-v2@npm:@types/prettier@^2.1.5": version: 2.7.3 resolution: "@types/prettier@npm:2.7.3" @@ -6562,13 +6532,6 @@ __metadata: languageName: node linkType: hard -"@types/resolve@npm:^1.20.2": - version: 1.20.6 - resolution: "@types/resolve@npm:1.20.6" - checksum: dc35f5517606b6687cd971c0281ac58bdee2c50c051b030f04647d3991688be2259c304ee97e5b5d4b9936072c36767eb5933b54611a407d6557972bb6fea4f6 - languageName: node - linkType: hard - "@types/retry@npm:0.12.0": version: 0.12.0 resolution: "@types/retry@npm:0.12.0" @@ -6808,20 +6771,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:8.32.1": +"@typescript-eslint/types@npm:8.32.1, @typescript-eslint/types@npm:^8.11.0": version: 8.32.1 resolution: "@typescript-eslint/types@npm:8.32.1" checksum: e7062c51507c5aa2a18991965b1212ffd02d9ed815277c99e51985d55d4f2e692861e807e1d5c2e0a56dfbe655de3971a9be9e1215b8b72683f29473554c014b languageName: node linkType: hard -"@typescript-eslint/types@npm:^8.11.0": - version: 8.33.0 - resolution: "@typescript-eslint/types@npm:8.33.0" - checksum: 3fa8c4598960c93e4f002d0d62c39072617b58808af88237b87d26a506576fd33cf5822505128575cf3c817257d7ee08a696f015369f6958303c2e73a1c83fc5 - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.32.1": version: 8.32.1 resolution: "@typescript-eslint/typescript-estree@npm:8.32.1" @@ -6872,123 +6828,123 @@ __metadata: languageName: node linkType: hard -"@unrs/resolver-binding-darwin-arm64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.2" +"@unrs/resolver-binding-darwin-arm64@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.7.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-darwin-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.2" +"@unrs/resolver-binding-darwin-x64@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.7.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-freebsd-x64@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.2" +"@unrs/resolver-binding-freebsd-x64@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.7.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.7.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.2" +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.7.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.7.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-arm64-musl@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.7.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.7.8" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.7.8" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.7.8" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.7.8" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-gnu@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.7.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@unrs/resolver-binding-linux-x64-musl@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.2" +"@unrs/resolver-binding-linux-x64-musl@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.7.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@unrs/resolver-binding-wasm32-wasi@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.2" +"@unrs/resolver-binding-wasm32-wasi@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.7.8" dependencies: - "@napi-rs/wasm-runtime": ^0.2.9 + "@napi-rs/wasm-runtime": ^0.2.10 conditions: cpu=wasm32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.7.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.7.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2": - version: 1.7.2 - resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.2" +"@unrs/resolver-binding-win32-x64-msvc@npm:1.7.8": + version: 1.7.8 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.7.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -7333,15 +7289,15 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0": - version: 8.17.1 - resolution: "ajv@npm:8.17.1" +"ajv@npm:^8.0.0, ajv@npm:^8.6.0, ajv@npm:^8.9.0, ajv@npm:~8.13.0": + version: 8.13.0 + resolution: "ajv@npm:8.13.0" dependencies: fast-deep-equal: ^3.1.3 - fast-uri: ^3.0.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 - checksum: 1797bf242cfffbaf3b870d13565bd1716b73f214bb7ada9a497063aada210200da36e3ed40237285f3255acc4feeae91b1fb183625331bad27da95973f7253d9 + uri-js: ^4.4.1 + checksum: 6de82d0b2073e645ca3300561356ddda0234f39b35d2125a8700b650509b296f41c00ab69f53178bbe25ad688bd6ac3747ab44101f2f4bd245952e8fd6ccc3c1 languageName: node linkType: hard @@ -7357,18 +7313,6 @@ __metadata: languageName: node linkType: hard -"ajv@npm:~8.13.0": - version: 8.13.0 - resolution: "ajv@npm:8.13.0" - dependencies: - fast-deep-equal: ^3.1.3 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.4.1 - checksum: 6de82d0b2073e645ca3300561356ddda0234f39b35d2125a8700b650509b296f41c00ab69f53178bbe25ad688bd6ac3747ab44101f2f4bd245952e8fd6ccc3c1 - languageName: node - linkType: hard - "algoliasearch-helper@npm:^3.22.6": version: 3.25.0 resolution: "algoliasearch-helper@npm:3.25.0" @@ -11282,13 +11226,6 @@ __metadata: languageName: node linkType: hard -"fast-uri@npm:^3.0.1": - version: 3.0.6 - resolution: "fast-uri@npm:3.0.6" - checksum: 7161ba2a7944778d679ba8e5f00d6a2bb479a2142df0982f541d67be6c979b17808f7edbb0ce78161c85035974bde3fa52b5137df31da46c0828cb629ba67c4e - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.19.1 resolution: "fastq@npm:1.19.1" @@ -14021,18 +13958,6 @@ __metadata: languageName: unknown linkType: soft -"jest-pnp-resolver@npm:^1.2.3": - version: 1.2.3 - resolution: "jest-pnp-resolver@npm:1.2.3" - peerDependencies: - jest-resolve: "*" - peerDependenciesMeta: - jest-resolve: - optional: true - checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 - languageName: node - linkType: hard - "jest-regex-util@npm:^29.0.0": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -14090,17 +14015,13 @@ __metadata: resolution: "jest-resolve@workspace:packages/jest-resolve" dependencies: "@types/graceful-fs": ^4.1.3 - "@types/pnpapi": ^0.0.5 - "@types/resolve": ^1.20.2 chalk: ^4.0.0 graceful-fs: ^4.2.9 jest-haste-map: "workspace:*" - jest-pnp-resolver: ^1.2.3 jest-util: "workspace:*" jest-validate: "workspace:*" - resolve: ^1.20.0 - resolve.exports: ^2.0.0 slash: ^3.0.0 + unrs-resolver: ^1.7.8 languageName: unknown linkType: soft @@ -16261,20 +16182,13 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0": +"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard -"mime-db@npm:>= 1.43.0 < 2": - version: 1.54.0 - resolution: "mime-db@npm:1.54.0" - checksum: e99aaf2f23f5bd607deb08c83faba5dd25cf2fec90a7cc5b92d8260867ee08dab65312e1a589e60093dc7796d41e5fae013268418482f1db4c7d52d0a0960ac9 - languageName: node - linkType: hard - "mime-db@npm:~1.33.0": version: 1.33.0 resolution: "mime-db@npm:1.33.0" @@ -19865,13 +19779,6 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": - version: 2.0.3 - resolution: "resolve.exports@npm:2.0.3" - checksum: abfb9f98278dcd0c19b8a49bb486abfafa23df4636d49128ea270dc982053c3ef230a530aecda1fae1322873fdfa6c97674fc539651ddfdb375ac58e0b8ef6df - languageName: node - linkType: hard - "resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1, resolve@npm:~1.22.2": version: 1.22.10 resolution: "resolve@npm:1.22.10" @@ -20027,7 +19934,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 @@ -20996,16 +20903,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:~1.1.1": version: 1.1.1 resolution: "string_decoder@npm:1.1.1" dependencies: @@ -22049,27 +21947,27 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.7.2": - version: 1.7.2 - resolution: "unrs-resolver@npm:1.7.2" - dependencies: - "@unrs/resolver-binding-darwin-arm64": 1.7.2 - "@unrs/resolver-binding-darwin-x64": 1.7.2 - "@unrs/resolver-binding-freebsd-x64": 1.7.2 - "@unrs/resolver-binding-linux-arm-gnueabihf": 1.7.2 - "@unrs/resolver-binding-linux-arm-musleabihf": 1.7.2 - "@unrs/resolver-binding-linux-arm64-gnu": 1.7.2 - "@unrs/resolver-binding-linux-arm64-musl": 1.7.2 - "@unrs/resolver-binding-linux-ppc64-gnu": 1.7.2 - "@unrs/resolver-binding-linux-riscv64-gnu": 1.7.2 - "@unrs/resolver-binding-linux-riscv64-musl": 1.7.2 - "@unrs/resolver-binding-linux-s390x-gnu": 1.7.2 - "@unrs/resolver-binding-linux-x64-gnu": 1.7.2 - "@unrs/resolver-binding-linux-x64-musl": 1.7.2 - "@unrs/resolver-binding-wasm32-wasi": 1.7.2 - "@unrs/resolver-binding-win32-arm64-msvc": 1.7.2 - "@unrs/resolver-binding-win32-ia32-msvc": 1.7.2 - "@unrs/resolver-binding-win32-x64-msvc": 1.7.2 +"unrs-resolver@npm:^1.7.2, unrs-resolver@npm:^1.7.8": + version: 1.7.8 + resolution: "unrs-resolver@npm:1.7.8" + dependencies: + "@unrs/resolver-binding-darwin-arm64": 1.7.8 + "@unrs/resolver-binding-darwin-x64": 1.7.8 + "@unrs/resolver-binding-freebsd-x64": 1.7.8 + "@unrs/resolver-binding-linux-arm-gnueabihf": 1.7.8 + "@unrs/resolver-binding-linux-arm-musleabihf": 1.7.8 + "@unrs/resolver-binding-linux-arm64-gnu": 1.7.8 + "@unrs/resolver-binding-linux-arm64-musl": 1.7.8 + "@unrs/resolver-binding-linux-ppc64-gnu": 1.7.8 + "@unrs/resolver-binding-linux-riscv64-gnu": 1.7.8 + "@unrs/resolver-binding-linux-riscv64-musl": 1.7.8 + "@unrs/resolver-binding-linux-s390x-gnu": 1.7.8 + "@unrs/resolver-binding-linux-x64-gnu": 1.7.8 + "@unrs/resolver-binding-linux-x64-musl": 1.7.8 + "@unrs/resolver-binding-wasm32-wasi": 1.7.8 + "@unrs/resolver-binding-win32-arm64-msvc": 1.7.8 + "@unrs/resolver-binding-win32-ia32-msvc": 1.7.8 + "@unrs/resolver-binding-win32-x64-msvc": 1.7.8 napi-postinstall: ^0.2.2 dependenciesMeta: "@unrs/resolver-binding-darwin-arm64": @@ -22106,7 +22004,7 @@ __metadata: optional: true "@unrs/resolver-binding-win32-x64-msvc": optional: true - checksum: 6eb2472f4142bdcd321f461dd057a2a3c7ffc59ffb3da9fc2f6dc7c6c6a92e7ef53f6ae9e3c160e7459bb6fd0e09c537035ecd0335e367e278f3e981ef682b4c + checksum: b1fd54b477c6b92bf8f0df05843f889eb7cf0060e715e9a0c13988523ec7029fca8e91fdd77c6678e56e904891571959d130c3c58aa8e914d1ebb34c617c1f64 languageName: node linkType: hard From a3f0ce454c4c5abc4b6cff4da790a47b3051c639 Mon Sep 17 00:00:00 2001 From: JounQin Date: Tue, 3 Jun 2025 04:40:43 +0800 Subject: [PATCH 2/3] refactor: add jest-pnp-resolver back temporarily, fix known failing test cases --- .../moduleNameMapper.test.ts.snap | 4 +-- .../requireMissingExt.test.ts.snap | 2 +- .../resolveNoFileExtensions.test.ts.snap | 2 +- .../__tests__/undeclared-dependency.test.js | 2 +- .../src/__tests__/dependency_resolver.test.ts | 7 +++- .../__typetests__/resolver.test.ts | 19 ----------- packages/jest-resolve/package.json | 1 + packages/jest-resolve/src/defaultResolver.ts | 32 ++++++++++++++----- yarn.lock | 13 ++++++++ 9 files changed, 49 insertions(+), 33 deletions(-) diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index 0160887b6f8c..6452c4ba8347 100644 --- a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap +++ b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap @@ -41,7 +41,7 @@ exports[`moduleNameMapper wrong array configuration 1`] = ` 12 | module.exports = () => 'test'; 13 | - at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1080:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1105: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:1080:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:1105:17) at Object.require (index.js:10:1) at Object.require (__tests__/index.js:10:20)" `; diff --git a/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap index bcc91628149c..26cebf9aa133 100644 --- a/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap +++ b/e2e/__tests__/__snapshots__/requireMissingExt.test.ts.snap @@ -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:826:11) + at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:851:11) at Object. (node_modules/discord.js/src/index.js:21:12) at Object.require (__tests__/test.js:10:1)" `; diff --git a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap index f940e60a113a..be0426f6d0cd 100644 --- a/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap +++ b/e2e/__tests__/__snapshots__/resolveNoFileExtensions.test.ts.snap @@ -37,7 +37,7 @@ exports[`show error message with matching files 1`] = ` | ^ 9 | - at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:930:11) + at Resolver._throwModNotFoundError (../../packages/jest-resolve/build/index.js:851:11) at Object.require (index.js:8:18) at Object.require (__tests__/test.js:8:11)" `; diff --git a/e2e/pnp/__tests__/undeclared-dependency.test.js b/e2e/pnp/__tests__/undeclared-dependency.test.js index e27b2b5b8fa9..6843fa065fc8 100644 --- a/e2e/pnp/__tests__/undeclared-dependency.test.js +++ b/e2e/pnp/__tests__/undeclared-dependency.test.js @@ -9,5 +9,5 @@ it('should surface pnp errors', () => { expect(() => { require('undeclared'); - }).toThrow("Cannot find module 'unesitent_module__'"); + }).toThrow(expect.objectContaining({code: 'MODULE_NOT_FOUND'})); }); diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index 5c4273a9a830..be9b59e1e982 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -31,7 +31,11 @@ beforeEach(async () => { cacheDirectory: path.resolve(tmpdir(), 'jest-resolve-dependencies-test'), moduleDirectories: ['node_modules'], moduleNameMapper: [['^\\$asdf/(.*)$', '/$1']], - rootDir: '.', + /** + * `filter` must be an absolute path + * @See https://github.com/jestjs/jest/blob/76632c6ec3f56708ec5781158972a295d0cc9332/packages/jest-haste-map/src/lib/fast_path.ts#L19-L25 + */ + rootDir: process.cwd(), roots: ['./packages/jest-resolve-dependencies'], }); const runtimeContext = await Runtime.createContext(config, { @@ -98,6 +102,7 @@ test('resolves no inverse dependencies for set of non-existent paths', () => { test('resolves inverse dependencies for existing path', () => { const paths = new Set([path.resolve(__dirname, '__fixtures__/file.js')]); const resolved = dependencyResolver.resolveInverse(paths, filter); + console.log('resolved', resolved); expect(resolved).toEqual([ expect.stringContaining( path.join('__tests__', '__fixtures__', 'file.test.js'), diff --git a/packages/jest-resolve/__typetests__/resolver.test.ts b/packages/jest-resolve/__typetests__/resolver.test.ts index 7007a242b2a7..4d8c877b1abe 100644 --- a/packages/jest-resolve/__typetests__/resolver.test.ts +++ b/packages/jest-resolve/__typetests__/resolver.test.ts @@ -9,9 +9,7 @@ import {expect} from 'tstyche'; import type { AsyncResolver, JestResolver, - PackageFilter, PackageJSON, - PathFilter, ResolverOptions, SyncResolver, } from 'jest-resolve'; @@ -30,19 +28,6 @@ expect().type.not.toBeAssignableWith({ filter: () => {}, }); -// PackageFilter - -const packageFilter = (pkg: PackageJSON, file: string, dir: string) => pkg; - -expect().type.toBeAssignableWith(packageFilter); - -// PathFilter - -const pathFilter = (pkg: PackageJSON, path: string, relativePath: string) => - relativePath; - -expect().type.toBeAssignableWith(pathFilter); - // ResolverOptions function customSyncResolver(path: string, options: ResolverOptions): string { @@ -68,8 +53,6 @@ const asyncResolver: AsyncResolver = async (path, options) => { expect(options.defaultResolver).type.toBe(); expect(options.extensions).type.toBe | undefined>(); expect(options.moduleDirectory).type.toBe | undefined>(); - expect(options.packageFilter).type.toBe(); - expect(options.pathFilter).type.toBe(); expect(options.paths).type.toBe | undefined>(); expect(options.rootDir).type.toBe(); @@ -91,8 +74,6 @@ const syncResolver: SyncResolver = (path, options) => { expect(options.defaultResolver).type.toBe(); expect(options.extensions).type.toBe | undefined>(); expect(options.moduleDirectory).type.toBe | undefined>(); - expect(options.packageFilter).type.toBe(); - expect(options.pathFilter).type.toBe(); expect(options.paths).type.toBe | undefined>(); expect(options.rootDir).type.toBe(); diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index d60307339ee3..b1125e0203dd 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -22,6 +22,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "workspace:*", + "jest-pnp-resolver": "^1.2.3", "jest-util": "workspace:*", "jest-validate": "workspace:*", "slash": "^3.0.0", diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index aba4665495f5..941348c73388 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -5,7 +5,9 @@ * LICENSE file in the root directory of this source tree. */ +import {resolve} from 'path'; import {fileURLToPath} from 'url'; +import pnpResolver from 'jest-pnp-resolver'; import { ResolverFactory, type NapiResolveOptions as UpstreamResolveOptions, @@ -34,6 +36,12 @@ export interface ResolverOptions extends UpstreamResolveOptions { paths?: Array; /** Current root directory. */ rootDir?: string; + + /** + * @internal Whether to allow the `jest-pnp-resolver` to be used. + * @see https://github.com/arcanis/jest-pnp-resolver/blob/ae8e3992349f3b43d1476572e9315e14358e8944/index.js#L49 + */ + allowPnp?: boolean; } export type SyncResolver = (path: string, options: ResolverOptions) => string; @@ -44,9 +52,17 @@ export type AsyncResolver = ( export type Resolver = SyncResolver | AsyncResolver; -const defaultResolver: SyncResolver = ( - path, - { +const defaultResolver: SyncResolver = (path, options) => { + if (process.versions.pnp && options.allowPnp !== false) { + return pnpResolver(path, options); + } + + if (path.startsWith('file://')) { + path = fileURLToPath(path); + } + + /* eslint-disable prefer-const */ + let { basedir, conditions, conditionNames, @@ -56,11 +72,11 @@ const defaultResolver: SyncResolver = ( roots, rootDir, ...rest - }, -) => { - if (path.startsWith('file://')) { - path = fileURLToPath(path); - } + /* eslint-enable prefer-const */ + } = options; + + // make sure that `basedir` is an absolute path + basedir = resolve(basedir); modules = modules || moduleDirectory; diff --git a/yarn.lock b/yarn.lock index e910116be266..1cb42396c658 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13958,6 +13958,18 @@ __metadata: languageName: unknown linkType: soft +"jest-pnp-resolver@npm:^1.2.3": + version: 1.2.3 + resolution: "jest-pnp-resolver@npm:1.2.3" + peerDependencies: + jest-resolve: "*" + peerDependenciesMeta: + jest-resolve: + optional: true + checksum: db1a8ab2cb97ca19c01b1cfa9a9c8c69a143fde833c14df1fab0766f411b1148ff0df878adea09007ac6a2085ec116ba9a996a6ad104b1e58c20adbf88eed9b2 + languageName: node + linkType: hard + "jest-regex-util@npm:^29.0.0": version: 29.6.3 resolution: "jest-regex-util@npm:29.6.3" @@ -14018,6 +14030,7 @@ __metadata: chalk: ^4.0.0 graceful-fs: ^4.2.9 jest-haste-map: "workspace:*" + jest-pnp-resolver: ^1.2.3 jest-util: "workspace:*" jest-validate: "workspace:*" slash: ^3.0.0 From 36463cb4e459968119b0197ee22c19925ad3c7f1 Mon Sep 17 00:00:00 2001 From: Christoph Nakazawa Date: Wed, 4 Jun 2025 08:43:37 +0900 Subject: [PATCH 3/3] Update dependency_resolver.test.ts --- .../src/__tests__/dependency_resolver.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts index be9b59e1e982..e0086a59a952 100644 --- a/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts +++ b/packages/jest-resolve-dependencies/src/__tests__/dependency_resolver.test.ts @@ -102,7 +102,6 @@ test('resolves no inverse dependencies for set of non-existent paths', () => { test('resolves inverse dependencies for existing path', () => { const paths = new Set([path.resolve(__dirname, '__fixtures__/file.js')]); const resolved = dependencyResolver.resolveInverse(paths, filter); - console.log('resolved', resolved); expect(resolved).toEqual([ expect.stringContaining( path.join('__tests__', '__fixtures__', 'file.test.js'),