Skip to content

Commit

Permalink
fix: pass custom cached realpath function to resolve
Browse files Browse the repository at this point in the history
  • Loading branch information
SimenB committed Apr 23, 2020
1 parent 9443889 commit 0fbd1af
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
20 changes: 17 additions & 3 deletions packages/jest-resolve/src/defaultResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ export default function defaultResolver(

export function clearDefaultResolverCache(): void {
checkedPaths.clear();
checkedRealpathPaths.clear();
}

enum IPathType {
Expand Down Expand Up @@ -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<string, string>();
function realpathCached(path: Config.Path): Config.Path {
let result = checkedRealpathPaths.get(path);

if (result !== undefined) {
return result;
}

try {
result = realpath(path);
} catch (error) {
Expand All @@ -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;
}

Expand All @@ -118,5 +132,5 @@ function isDirectory(dir: Config.Path): boolean {
}

function realpathSync(file: Config.Path): Config.Path {
return tolerantRealpath(file);
return realpathCached(file);
}

0 comments on commit 0fbd1af

Please sign in to comment.