From 0a098d202fbb11341b2b1e95e3664d943f8698a0 Mon Sep 17 00:00:00 2001 From: ishabi Date: Wed, 16 Jul 2025 12:52:29 +0200 Subject: [PATCH] src: add cache to nearest parent package json --- lib/internal/modules/package_json_reader.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/internal/modules/package_json_reader.js b/lib/internal/modules/package_json_reader.js index 7f41dd43eb81e4..0dc15c9cd0bfe3 100644 --- a/lib/internal/modules/package_json_reader.js +++ b/lib/internal/modules/package_json_reader.js @@ -5,6 +5,7 @@ const { JSONParse, ObjectDefineProperty, RegExpPrototypeExec, + SafeMap, StringPrototypeIndexOf, StringPrototypeSlice, } = primordials; @@ -28,6 +29,8 @@ const path = require('path'); const { validateString } = require('internal/validators'); const internalFsBinding = internalBinding('fs'); +const nearestParentPackageJSONCache = new SafeMap(); + /** * @typedef {import('typings/internalBinding/modules').DeserializedPackageConfig} DeserializedPackageConfig * @typedef {import('typings/internalBinding/modules').PackageConfig} PackageConfig @@ -131,13 +134,21 @@ function read(jsonPath, { base, specifier, isESM } = kEmptyObject) { * @returns {undefined | DeserializedPackageConfig} */ function getNearestParentPackageJSON(checkPath) { + if (nearestParentPackageJSONCache.has(checkPath)) { + return nearestParentPackageJSONCache.get(checkPath); + } + const result = modulesBinding.getNearestParentPackageJSON(checkPath); if (result === undefined) { + nearestParentPackageJSONCache.set(checkPath, undefined); return undefined; } - return deserializePackageJSON(checkPath, result); + const packageConfig = deserializePackageJSON(checkPath, result); + nearestParentPackageJSONCache.set(checkPath, packageConfig); + + return packageConfig; } /**