From 6019ec8a546dc00098e48329c2b479f9857d95b2 Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Sun, 28 Apr 2019 13:57:14 +0300 Subject: [PATCH 1/6] Cache checked files in fs --- packages/jest-resolve/src/defaultResolver.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 44d94620b2b6..63ba2ccef372 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -142,11 +142,15 @@ function resolveSync( } } +const checkedFiles = new Map(); /* * helper functions */ function isFile(file: Config.Path): boolean { - let result; + let result = checkedFiles.get(file); + if (result !== undefined) { + return result; + } try { const stat = fs.statSync(file); @@ -158,6 +162,7 @@ function isFile(file: Config.Path): boolean { result = false; } + checkedFiles.set(file, result); return result; } From f0c622ac0f7c636fcf6e424ec562c8fe2da36c50 Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Sun, 28 Apr 2019 15:19:09 +0300 Subject: [PATCH 2/6] Cache checked dirs in fs --- packages/jest-resolve/src/defaultResolver.ts | 22 +++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 63ba2ccef372..a0b560d3c9a7 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -142,18 +142,25 @@ function resolveSync( } } -const checkedFiles = new Map(); +const checkedPaths = new Map(); +function statSyncCached(path: string): fs.Stats { + const result = checkedPaths.get(path); + if (result !== undefined) { + return result; + } + + const stat = fs.statSync(path); + checkedPaths.set(path, stat); + return stat; +} /* * helper functions */ function isFile(file: Config.Path): boolean { - let result = checkedFiles.get(file); - if (result !== undefined) { - return result; - } + let result; try { - const stat = fs.statSync(file); + const stat = statSyncCached(file); result = stat.isFile() || stat.isFIFO(); } catch (e) { if (!(e && e.code === 'ENOENT')) { @@ -162,7 +169,6 @@ function isFile(file: Config.Path): boolean { result = false; } - checkedFiles.set(file, result); return result; } @@ -170,7 +176,7 @@ function isDirectory(dir: Config.Path): boolean { let result; try { - const stat = fs.statSync(dir); + const stat = statSyncCached(dir); result = stat.isDirectory(); } catch (e) { if (!(e && (e.code === 'ENOENT' || e.code === 'ENOTDIR'))) { From 4a4eb34dc839f2713fbe8cbc7f7ccd6a02875be0 Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Sun, 28 Apr 2019 20:37:15 +0300 Subject: [PATCH 3/6] Refactoring isfile --- packages/jest-resolve/src/defaultResolver.ts | 58 ++++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index a0b560d3c9a7..505d49fb6007 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -142,50 +142,48 @@ function resolveSync( } } -const checkedPaths = new Map(); -function statSyncCached(path: string): fs.Stats { +const IS_PATH_FILE = 1; +const IS_PATH_DIRECTORY = 2; +const IS_PATH_OTHER = 3; +const checkedPaths = new Map(); +function statSyncCached(path: string): number { const result = checkedPaths.get(path); if (result !== undefined) { return result; } - const stat = fs.statSync(path); - checkedPaths.set(path, stat); - return stat; -} -/* - * helper functions - */ -function isFile(file: Config.Path): boolean { - let result; - + let stat; try { - const stat = statSyncCached(file); - result = stat.isFile() || stat.isFIFO(); + stat = fs.statSync(path); } catch (e) { - if (!(e && e.code === 'ENOENT')) { + if (!(e && (e.code === 'ENOENT' || e.code === 'ENOTDIR'))) { throw e; } - result = false; } - return result; -} - -function isDirectory(dir: Config.Path): boolean { - let result; - - try { - const stat = statSyncCached(dir); - result = stat.isDirectory(); - } catch (e) { - if (!(e && (e.code === 'ENOENT' || e.code === 'ENOTDIR'))) { - throw e; + if (stat) { + if (stat.isFile() || stat.isFIFO()) { + checkedPaths.set(path, IS_PATH_FILE); + return IS_PATH_FILE; + } else if (stat.isDirectory()) { + checkedPaths.set(path, IS_PATH_DIRECTORY); + return IS_PATH_DIRECTORY; } - result = false; } - return result; + checkedPaths.set(path, IS_PATH_OTHER); + return IS_PATH_OTHER; +} + +/* + * helper functions + */ +function isFile(file: Config.Path): boolean { + return statSyncCached(file) === IS_PATH_FILE; +} + +function isDirectory(dir: Config.Path): boolean { + return statSyncCached(dir) === IS_PATH_DIRECTORY; } function isCurrentDirectory(testPath: Config.Path): boolean { From 7ae8c3d1a36b449a81895b017ecb74961dddd27b Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Sun, 28 Apr 2019 21:59:06 +0300 Subject: [PATCH 4/6] Add to change.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6391a1227bfa..1ab84a39e625 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ - `[@jest/reporters]` Migrate away from `istanbul-api` ([#8294](https://github.com/facebook/jest/pull/8294)) - `[*]` Delete obsolete emails tag from header comment in test files ([#8377](https://github.com/facebook/jest/pull/8377)) - `[expect]` optimize compare nodes ([#8368](https://github.com/facebook/jest/pull/8368)) +- `[jest-resolve]` optimize resolve module path ([#8388](https://github.com/facebook/jest/pull/8388)) ### Performance From 3a494d24f077319ba41d4736463ba9ad8116f02d Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Wed, 1 May 2019 13:29:41 +0300 Subject: [PATCH 5/6] Use unem instead of const --- packages/jest-resolve/src/defaultResolver.ts | 26 +++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 505d49fb6007..8a2e4c9d8c15 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -142,10 +142,12 @@ function resolveSync( } } -const IS_PATH_FILE = 1; -const IS_PATH_DIRECTORY = 2; -const IS_PATH_OTHER = 3; -const checkedPaths = new Map(); +enum IPathType { + FILE = 1, + DIRECTORY = 2, + OTHER = 3, +} +const checkedPaths = new Map(); function statSyncCached(path: string): number { const result = checkedPaths.get(path); if (result !== undefined) { @@ -163,27 +165,27 @@ function statSyncCached(path: string): number { if (stat) { if (stat.isFile() || stat.isFIFO()) { - checkedPaths.set(path, IS_PATH_FILE); - return IS_PATH_FILE; + checkedPaths.set(path, IPathType.FILE); + return IPathType.FILE; } else if (stat.isDirectory()) { - checkedPaths.set(path, IS_PATH_DIRECTORY); - return IS_PATH_DIRECTORY; + checkedPaths.set(path, IPathType.DIRECTORY); + return IPathType.DIRECTORY; } } - checkedPaths.set(path, IS_PATH_OTHER); - return IS_PATH_OTHER; + checkedPaths.set(path, IPathType.OTHER); + return IPathType.OTHER; } /* * helper functions */ function isFile(file: Config.Path): boolean { - return statSyncCached(file) === IS_PATH_FILE; + return statSyncCached(file) === IPathType.FILE; } function isDirectory(dir: Config.Path): boolean { - return statSyncCached(dir) === IS_PATH_DIRECTORY; + return statSyncCached(dir) === IPathType.DIRECTORY; } function isCurrentDirectory(testPath: Config.Path): boolean { From 4bf5f36e831492e1cf34155b4de073b5cda683dd Mon Sep 17 00:00:00 2001 From: Mihail Bodrov Date: Wed, 1 May 2019 14:26:44 +0300 Subject: [PATCH 6/6] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ab84a39e625..e8ed064057cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,11 +33,11 @@ - `[@jest/reporters]` Migrate away from `istanbul-api` ([#8294](https://github.com/facebook/jest/pull/8294)) - `[*]` Delete obsolete emails tag from header comment in test files ([#8377](https://github.com/facebook/jest/pull/8377)) - `[expect]` optimize compare nodes ([#8368](https://github.com/facebook/jest/pull/8368)) -- `[jest-resolve]` optimize resolve module path ([#8388](https://github.com/facebook/jest/pull/8388)) ### Performance - `[jest-runtime]` Fix module registry memory leak ([#8282](https://github.com/facebook/jest/pull/8282)) +- `[jest-resolve]` optimize resolve module path ([#8388](https://github.com/facebook/jest/pull/8388)) ## 24.7.1