From f3bf41c382645b9f56c514b1c78fbbd155162f89 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 11 Feb 2021 16:10:01 +0100 Subject: [PATCH 1/4] fix(jest-resolve): cache package.json lookups --- packages/jest-resolve/package.json | 2 +- packages/jest-resolve/src/defaultResolver.ts | 22 ++++++++++++++++++++ yarn.lock | 6 +++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index 12c22e9c23fd..72b8e84c1d5c 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -20,7 +20,7 @@ "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", "jest-util": "^27.0.0-next.1", - "resolve": "^1.18.1", + "resolve": "^1.20.0", "slash": "^3.0.0" }, "devDependencies": { diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index b97bc182a8c4..172376bda70c 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -50,6 +50,8 @@ export default function defaultResolver( packageFilter: options.packageFilter, paths: options.paths, preserveSymlinks: false, + // @ts-expect-error: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/51182 + readPackageSync, realpathSync, }); @@ -61,6 +63,7 @@ export default function defaultResolver( export function clearDefaultResolverCache(): void { checkedPaths.clear(); checkedRealpathPaths.clear(); + packageContents.clear(); } enum IPathType { @@ -118,6 +121,21 @@ function realpathCached(path: Config.Path): Config.Path { return result; } +const packageContents = new Map(); +function readPackageCached(path: Config.Path): unknown { + let result = packageContents.get(path); + + if (result !== undefined) { + return result; + } + + result = JSON.parse(fs.readFileSync(path, 'utf8')); + + packageContents.set(path, result); + + return result; +} + /* * helper functions */ @@ -132,3 +150,7 @@ function isDirectory(dir: Config.Path): boolean { function realpathSync(file: Config.Path): Config.Path { return realpathCached(file); } + +function readPackageSync(_: unknown, file: Config.Path): unknown { + return readPackageCached(file); +} diff --git a/yarn.lock b/yarn.lock index 32060ab80ec8..2e646f48ffc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12074,7 +12074,7 @@ fsevents@^1.2.7: jest-haste-map: ^27.0.0-next.2 jest-pnp-resolver: ^1.2.2 jest-util: ^27.0.0-next.1 - resolve: ^1.18.1 + resolve: ^1.20.0 slash: ^3.0.0 languageName: unknown linkType: soft @@ -17276,7 +17276,7 @@ react-native@0.63.2: languageName: node linkType: hard -"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.5.0": +"resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.15.0, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.5.0": version: 1.20.0 resolution: "resolve@npm:1.20.0" dependencies: @@ -17286,7 +17286,7 @@ react-native@0.63.2: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.15.0#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.18.1#builtin, resolve@patch:resolve@^1.5.0#builtin": +"resolve@patch:resolve@^1.1.6#builtin, resolve@patch:resolve@^1.10.0#builtin, resolve@patch:resolve@^1.13.1#builtin, resolve@patch:resolve@^1.15.0#builtin, resolve@patch:resolve@^1.17.0#builtin, resolve@patch:resolve@^1.20.0#builtin, resolve@patch:resolve@^1.5.0#builtin": version: 1.20.0 resolution: "resolve@patch:resolve@npm%3A1.20.0#builtin::version=1.20.0&hash=3388aa" dependencies: From bdaae983aac79d28fbf623654dd79915e1303ebf Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 11 Feb 2021 16:15:49 +0100 Subject: [PATCH 2/4] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dc8f3169adf..bf101e20789a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -84,6 +84,7 @@ ### Performance +- `[jest-resolve]` Cache reading and parsing of `package.json`s ([#11076](https://github.com/facebook/jest/pull/11076)) - `[jest-runtime]` Load `chalk` only once per worker ([#10864](https://github.com/facebook/jest/pull/10864)) ## 26.6.3 From 902eacd661fd2916f1b5811686624936ae1010e2 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 18 Feb 2021 18:40:02 +0100 Subject: [PATCH 3/4] update types --- packages/jest-resolve/package.json | 2 +- packages/jest-resolve/src/defaultResolver.ts | 15 +++++++------- packages/jest-resolve/src/index.ts | 4 +--- packages/jest-runtime/src/index.ts | 21 +++++++++----------- yarn.lock | 12 +++++------ 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/packages/jest-resolve/package.json b/packages/jest-resolve/package.json index 72b8e84c1d5c..4328ae3cc25c 100644 --- a/packages/jest-resolve/package.json +++ b/packages/jest-resolve/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@types/graceful-fs": "^4.1.3", - "@types/resolve": "^1.17.0", + "@types/resolve": "^1.20.0", "jest-haste-map": "^27.0.0-next.2" }, "engines": { diff --git a/packages/jest-resolve/src/defaultResolver.ts b/packages/jest-resolve/src/defaultResolver.ts index 172376bda70c..7b3dfe17a3bd 100644 --- a/packages/jest-resolve/src/defaultResolver.ts +++ b/packages/jest-resolve/src/defaultResolver.ts @@ -7,7 +7,7 @@ import * as fs from 'graceful-fs'; import pnpResolver from 'jest-pnp-resolver'; -import {Opts as ResolveOpts, sync as resolveSync} from 'resolve'; +import {sync as resolveSync} from 'resolve'; import type {Config} from '@jest/types'; import {tryRealpath} from 'jest-util'; @@ -19,7 +19,7 @@ type ResolverOptions = { moduleDirectory?: Array; paths?: Array; rootDir?: Config.Path; - packageFilter?: ResolveOpts['packageFilter']; + packageFilter?: (pkg: any, pkgfile: string) => any; }; // https://github.com/facebook/jest/pull/10617 @@ -50,7 +50,6 @@ export default function defaultResolver( packageFilter: options.packageFilter, paths: options.paths, preserveSymlinks: false, - // @ts-expect-error: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/51182 readPackageSync, realpathSync, }); @@ -121,15 +120,17 @@ function realpathCached(path: Config.Path): Config.Path { return result; } -const packageContents = new Map(); -function readPackageCached(path: Config.Path): unknown { +type PkgJson = Record; + +const packageContents = new Map(); +function readPackageCached(path: Config.Path): PkgJson { let result = packageContents.get(path); if (result !== undefined) { return result; } - result = JSON.parse(fs.readFileSync(path, 'utf8')); + result = JSON.parse(fs.readFileSync(path, 'utf8')) as PkgJson; packageContents.set(path, result); @@ -151,6 +152,6 @@ function realpathSync(file: Config.Path): Config.Path { return realpathCached(file); } -function readPackageSync(_: unknown, file: Config.Path): unknown { +function readPackageSync(_: unknown, file: Config.Path): PkgJson { return readPackageCached(file); } diff --git a/packages/jest-resolve/src/index.ts b/packages/jest-resolve/src/index.ts index 76a28c9e4902..2a76b92238b7 100644 --- a/packages/jest-resolve/src/index.ts +++ b/packages/jest-resolve/src/index.ts @@ -48,7 +48,7 @@ const nodePaths = NODE_PATH .map(p => path.resolve(resolvedCwd, p)) : undefined; -class Resolver { +export default class Resolver { private readonly _options: ResolverConfig; private readonly _moduleMap: ModuleMap; private readonly _moduleIDCache: Map; @@ -495,5 +495,3 @@ Please check your configuration for these entries: return error; }; - -export default Resolver; diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 2aa3f6739ec6..fb8689c382d4 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -271,7 +271,7 @@ export default class Runtime { static shouldInstrument = shouldInstrument; - static createContext( + static async createContext( config: Config.ProjectConfig, options: { console?: Console; @@ -288,17 +288,14 @@ export default class Runtime { watch: options.watch, watchman: options.watchman, }); - return instance.build().then( - hasteMap => ({ - config, - hasteFS: hasteMap.hasteFS, - moduleMap: hasteMap.moduleMap, - resolver: Runtime.createResolver(config, hasteMap.moduleMap), - }), - error => { - throw error; - }, - ); + const hasteMap = await instance.build(); + + return { + config, + hasteFS: hasteMap.hasteFS, + moduleMap: hasteMap.moduleMap, + resolver: Runtime.createResolver(config, hasteMap.moduleMap), + }; } static createHasteMap( diff --git a/yarn.lock b/yarn.lock index 2e646f48ffc9..f9a17510e06e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3830,12 +3830,10 @@ __metadata: languageName: node linkType: hard -"@types/resolve@npm:^1.17.0": - version: 1.19.0 - resolution: "@types/resolve@npm:1.19.0" - dependencies: - "@types/node": "*" - checksum: 6dab5d4bf568d4fe7ed2207f839736d3558e04f994cdad122ce3c0a3d75f56080f4f63a297d5dcf61a1d3f450ebb99a8ca3719e3b7147c863d80436f1a9890e2 +"@types/resolve@npm:^1.20.0": + version: 1.20.0 + resolution: "@types/resolve@npm:1.20.0" + checksum: 3c75135d5cf3652453ef8f099b109f7fec5e82fe67bf38048226614dbcd11a943affee383e5d28c12c5f03b049281a3e486395326b9810297f9649c7b00f41fd languageName: node linkType: hard @@ -12067,7 +12065,7 @@ fsevents@^1.2.7: dependencies: "@jest/types": ^27.0.0-next.1 "@types/graceful-fs": ^4.1.3 - "@types/resolve": ^1.17.0 + "@types/resolve": ^1.20.0 chalk: ^4.0.0 escalade: ^3.1.1 graceful-fs: ^4.2.4 From 22606135f5e8d143410877ebf7c880ca722e6d26 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Thu, 18 Feb 2021 19:07:50 +0100 Subject: [PATCH 4/4] update snap --- e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap b/e2e/__tests__/__snapshots__/moduleNameMapper.test.ts.snap index bde4f6ab1366..d742b2ce2943 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/index.js:556:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:558: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/index.js:556:17) + at createNoMappedModuleFoundError (../../packages/jest-resolve/build/index.js:558:17) at Object.require (index.js:10:1) `;