From 308eb2c9bc340b4da83fd07d5ee6a048f728aa01 Mon Sep 17 00:00:00 2001 From: bohan Date: Sat, 4 Feb 2023 01:11:47 +0800 Subject: [PATCH] fix: use Map to prevent odd manifest name (#6031) close #6010 --- .changeset/nasty-gorillas-punch.md | 8 +++++++ .../src/createPackageExtender.ts | 14 +++++++----- .../test/createPackageExtender.test.ts | 22 +++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 .changeset/nasty-gorillas-punch.md diff --git a/.changeset/nasty-gorillas-punch.md b/.changeset/nasty-gorillas-punch.md new file mode 100644 index 000000000..a0f1c8e71 --- /dev/null +++ b/.changeset/nasty-gorillas-punch.md @@ -0,0 +1,8 @@ +--- +"@pnpm/plugin-commands-installation": patch +"@pnpm/hooks.read-package-hook": patch +"@pnpm/core": patch +"pnpm": patch +--- + +Use Map rather than Object in `createPackageExtender` to prevent read the prototype property to native function diff --git a/hooks/read-package-hook/src/createPackageExtender.ts b/hooks/read-package-hook/src/createPackageExtender.ts index 89f1fe098..d956f4ec3 100644 --- a/hooks/read-package-hook/src/createPackageExtender.ts +++ b/hooks/read-package-hook/src/createPackageExtender.ts @@ -7,23 +7,25 @@ interface PackageExtensionMatch { range: string | undefined } +type ExtensionsByPkgName = Map + export function createPackageExtender ( packageExtensions: Record ): ReadPackageHook { - const extensionsByPkgName = {} as Record + const extensionsByPkgName: ExtensionsByPkgName = new Map() Object.entries(packageExtensions) .forEach(([selector, packageExtension]) => { const { alias, pref } = parseWantedDependency(selector) - if (!extensionsByPkgName[alias!]) { - extensionsByPkgName[alias!] = [] + if (!extensionsByPkgName.has(alias!)) { + extensionsByPkgName.set(alias!, []) } - extensionsByPkgName[alias!].push({ packageExtension, range: pref }) + extensionsByPkgName.get(alias!)!.push({ packageExtension, range: pref }) }) return extendPkgHook.bind(null, extensionsByPkgName) as ReadPackageHook } -function extendPkgHook (extensionsByPkgName: Record, manifest: PackageManifest) { - const extensions = extensionsByPkgName[manifest.name] +function extendPkgHook (extensionsByPkgName: ExtensionsByPkgName, manifest: PackageManifest) { + const extensions = extensionsByPkgName.get(manifest.name) if (extensions == null) return manifest extendPkg(manifest, extensions) return manifest diff --git a/hooks/read-package-hook/test/createPackageExtender.test.ts b/hooks/read-package-hook/test/createPackageExtender.test.ts index fb58c299d..efeb87785 100644 --- a/hooks/read-package-hook/test/createPackageExtender.test.ts +++ b/hooks/read-package-hook/test/createPackageExtender.test.ts @@ -96,3 +96,25 @@ test('createPackageExtender() does not override existing fields', () => { }, }) }) + +test('createPackageExtender() should works for odd names', () => { + const extender = createPackageExtender({ + constructor: { + dependencies: { + foo: '1', + }, + }, + }) + expect( + extender({ + name: 'constructor', + dependencies: { + }, + }) + ).toStrictEqual({ + name: 'constructor', + dependencies: { + foo: '1', + }, + }) +})