From bc1c6841f536bc17f1287ca0e54f0b4ec38b00c5 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 23 Apr 2020 17:40:12 +0200 Subject: [PATCH] fix: pass custom cached realpath function to `resolve` (#9873) --- CHANGELOG.md | 1 + packages/jest-resolve/src/defaultResolver.ts | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec36a2f6f407..9be830431972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ ### Performance - `[jest-resolve]` Update `resolve` to a version using native `realpath`, which is faster than the default JS implementation ([#9872](https://github.com/facebook/jest/pull/9872)) +- `[jest-resolve]` Pass custom cached `realpath` function to `resolve` ([#9873](https://github.com/facebook/jest/pull/9873)) ## 25.4.0 diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 2481a8c606c4..0e20699364ba 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -52,6 +52,7 @@ export default function defaultResolver( export function clearDefaultResolverCache(): void { checkedPaths.clear(); + checkedRealpathPaths.clear(); } enum IPathType { @@ -89,8 +90,14 @@ function statSyncCached(path: string): IPathType { return IPathType.OTHER; } -function tolerantRealpath(path: Config.Path): Config.Path { - let result: Config.Path | undefined = undefined; +const checkedRealpathPaths = new Map(); +function realpathCached(path: Config.Path): Config.Path { + let result = checkedRealpathPaths.get(path); + + if (result !== undefined) { + return result; + } + try { result = realpath(path); } catch (error) { @@ -103,6 +110,13 @@ function tolerantRealpath(path: Config.Path): Config.Path { result = path; } + checkedRealpathPaths.set(path, result); + + if (path !== result) { + // also cache the result in case it's ever referenced directly - no reason to `realpath` that as well + checkedRealpathPaths.set(result, result); + } + return result; } @@ -118,5 +132,5 @@ function isDirectory(dir: Config.Path): boolean { } function realpathSync(file: Config.Path): Config.Path { - return tolerantRealpath(file); + return realpathCached(file); }