mirror of
https://github.com/pnpm/pnpm.git
synced 2026-04-28 02:53:15 -04:00
perf: using pkgId as nodeId for leaf deps
This commit is contained in:
5
.changeset/mean-zoos-shout.md
Normal file
5
.changeset/mean-zoos-shout.md
Normal file
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@pnpm/resolve-dependencies": major
|
||||
---
|
||||
|
||||
In case of leaf dependencies (dependencies that have no prod deps or peer deps), we only ever need to analyze one leaf dep in a graph, so the nodeId can be short and stateless, like the package ID.
|
||||
@@ -8,6 +8,7 @@ export function nodeIdContainsSequence (nodeId: string, pkgId1: string, pkgId2:
|
||||
}
|
||||
|
||||
export function createNodeId (parentNodeId: string, pkgId: string) {
|
||||
// using ">" as a separator because it will never be used inside a package ID
|
||||
return `${parentNodeId}${pkgId}>`
|
||||
}
|
||||
|
||||
|
||||
@@ -677,8 +677,11 @@ async function resolveDependency (
|
||||
})
|
||||
}
|
||||
|
||||
// using colon as it will never be used inside a package ID
|
||||
const nodeId = createNodeId(options.parentPkg.nodeId, pkgResponse.body.id)
|
||||
// In case of leaf dependencies (dependencies that have no prod deps or peer deps),
|
||||
// we only ever need to analyze one leaf dep in a graph, so the nodeId can be short and stateless.
|
||||
const nodeId = pkgIsLeaf(pkg)
|
||||
? pkgResponse.body.id
|
||||
: createNodeId(options.parentPkg.nodeId, pkgResponse.body.id)
|
||||
|
||||
const currentIsInstallable = (
|
||||
ctx.force ||
|
||||
@@ -732,13 +735,17 @@ async function resolveDependency (
|
||||
ctx.resolvedPackagesByPackageId[pkgResponse.body.id].dev = ctx.resolvedPackagesByPackageId[pkgResponse.body.id].dev || wantedDependency.dev
|
||||
ctx.resolvedPackagesByPackageId[pkgResponse.body.id].optional = ctx.resolvedPackagesByPackageId[pkgResponse.body.id].optional && wantedDependency.optional
|
||||
|
||||
ctx.pendingNodes.push({
|
||||
alias: wantedDependency.alias || pkg.name,
|
||||
depth: options.currentDepth,
|
||||
installable,
|
||||
nodeId,
|
||||
resolvedPackage: ctx.resolvedPackagesByPackageId[pkgResponse.body.id],
|
||||
})
|
||||
if (ctx.dependenciesTree[nodeId]) {
|
||||
ctx.dependenciesTree[nodeId].depth = Math.min(ctx.dependenciesTree[nodeId].depth, options.currentDepth)
|
||||
} else {
|
||||
ctx.pendingNodes.push({
|
||||
alias: wantedDependency.alias || pkg.name,
|
||||
depth: options.currentDepth,
|
||||
installable,
|
||||
nodeId,
|
||||
resolvedPackage: ctx.resolvedPackagesByPackageId[pkgResponse.body.id],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
@@ -758,6 +765,12 @@ async function resolveDependency (
|
||||
}
|
||||
}
|
||||
|
||||
function pkgIsLeaf (pkg: PackageManifest) {
|
||||
return R.isEmpty(pkg.dependencies ?? {}) &&
|
||||
R.isEmpty(pkg.optionalDependencies ?? {}) &&
|
||||
R.isEmpty(pkg.peerDependencies ?? {})
|
||||
}
|
||||
|
||||
function getResolvedPackage (
|
||||
options: {
|
||||
dependencyLockfile?: PackageSnapshot
|
||||
|
||||
Reference in New Issue
Block a user