mirror of
https://github.com/pnpm/pnpm.git
synced 2025-12-25 16:18:06 -05:00
8
.changeset/nasty-gorillas-punch.md
Normal file
8
.changeset/nasty-gorillas-punch.md
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user