fix: use Map to prevent odd manifest name (#6031)

close #6010
This commit is contained in:
bohan
2023-02-04 01:11:47 +08:00
committed by GitHub
parent 93d34632fe
commit 308eb2c9bc
3 changed files with 38 additions and 6 deletions

View File

@@ -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

View File

@@ -7,23 +7,25 @@ interface PackageExtensionMatch {
range: string | undefined
}
type ExtensionsByPkgName = Map<string, PackageExtensionMatch[]>
export function createPackageExtender (
packageExtensions: Record<string, PackageExtension>
): ReadPackageHook {
const extensionsByPkgName = {} as Record<string, PackageExtensionMatch[]>
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<string, PackageExtensionMatch[]>, 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

View File

@@ -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',
},
})
})