diff --git a/.changeset/mighty-rats-suffer.md b/.changeset/mighty-rats-suffer.md new file mode 100644 index 00000000000..42a09753749 --- /dev/null +++ b/.changeset/mighty-rats-suffer.md @@ -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). diff --git a/lockfile/lockfile-utils/src/nameVerFromPkgSnapshot.ts b/lockfile/lockfile-utils/src/nameVerFromPkgSnapshot.ts index eeaa89c136b..e4c470a6db9 100644 --- a/lockfile/lockfile-utils/src/nameVerFromPkgSnapshot.ts +++ b/lockfile/lockfile-utils/src/nameVerFromPkgSnapshot.ts @@ -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, } } diff --git a/pkg-manager/package-requester/src/packageRequester.ts b/pkg-manager/package-requester/src/packageRequester.ts index 82b8cf9cf95..65e9c92e09b 100644 --- a/pkg-manager/package-requester/src/packageRequester.ts +++ b/pkg-manager/package-requester/src/packageRequester.ts @@ -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, diff --git a/pkg-manager/resolve-dependencies/src/resolveDependencies.ts b/pkg-manager/resolve-dependencies/src/resolveDependencies.ts index cb51ab48539..216837b45a7 100644 --- a/pkg-manager/resolve-dependencies/src/resolveDependencies.ts +++ b/pkg-manager/resolve-dependencies/src/resolveDependencies.ts @@ -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? } } }