fix: cannot read properties of undefined (reading missingPeersOfChildren) (#8054)

close #8041
This commit is contained in:
Zoltan Kochan
2024-05-06 09:21:08 +02:00
committed by GitHub
parent 21de734b5a
commit 7a0536e23d
6 changed files with 17 additions and 9 deletions

View File

@@ -0,0 +1,7 @@
---
"@pnpm/resolve-dependencies": patch
"@pnpm/lockfile-utils": patch
"pnpm": patch
---
Fix `Cannot read properties of undefined (reading 'missingPeersOfChildren')` exception that happens on install [#8041](https://github.com/pnpm/pnpm/issues/8041).

View File

@@ -5,6 +5,7 @@ export interface NameVer {
name: string
peersSuffix: string | undefined
version: string
nonSemverVersion?: string
}
export function nameVerFromPkgSnapshot (
@@ -16,5 +17,6 @@ export function nameVerFromPkgSnapshot (
name: pkgInfo.name as string,
peersSuffix: pkgInfo.peersSuffix,
version: pkgSnapshot.version ?? pkgInfo.version as string,
nonSemverVersion: pkgInfo.nonSemverVersion,
}
}

View File

@@ -1,4 +0,0 @@
/// <reference path="../../../__typings__/local.d.ts"/>
import './nameVerFromPkgSnapshot'
import './pkgSnapshotToResolution'
import './satisfiesPackageManifest'

View File

@@ -11,6 +11,7 @@ test('nameVerFromPkgSnapshot()', () => {
name: 'foo',
peersSuffix: undefined,
version: '1.0.0',
nonSemverVersion: 'some-weird-path',
})
expect(nameVerFromPkgSnapshot('foo@1.0.0', {

View File

@@ -287,7 +287,7 @@ async function resolveAndFetch (
isLocal: false as const,
isInstallable: isInstallable ?? undefined,
latest,
manifest: manifest ?? (await fetchResult.fetching()).bundledManifest,
manifest,
normalizedPref,
resolution,
resolvedVia,

View File

@@ -12,7 +12,6 @@ import {
} from '@pnpm/lockfile-types'
import {
nameVerFromPkgSnapshot,
packageIdFromSnapshot,
pkgSnapshotToResolution,
} from '@pnpm/lockfile-utils'
import { logger } from '@pnpm/logger'
@@ -1047,19 +1046,22 @@ function getInfoFromLockfile (
}
}
const { name, version, nonSemverVersion } = nameVerFromPkgSnapshot(depPath, dependencyLockfile)
return {
...nameVerFromPkgSnapshot(depPath, dependencyLockfile),
name,
version,
dependencyLockfile,
depPath,
pkgId: packageIdFromSnapshot(depPath, dependencyLockfile),
pkgId: nonSemverVersion ?? `${name}@${version}`,
// resolution may not exist if lockfile is broken, and an unexpected error will be thrown
// if resolution does not exist, return undefined so it can be autofixed later
resolution: dependencyLockfile.resolution && pkgSnapshotToResolution(depPath, dependencyLockfile, registries),
}
} else {
const parsed = dp.parse(depPath)
return {
depPath,
pkgId: dp.tryGetPackageId(depPath) ?? depPath, // Does it make sense to set pkgId when we're not sure?
pkgId: parsed.nonSemverVersion ?? (parsed.name && parsed.version ? `${parsed.name}@${parsed.version}` : depPath), // Does it make sense to set pkgId when we're not sure?
}
}
}