@pnpm/installing.deps-resolver 1008.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +17 -0
  3. package/lib/dedupeInjectedDeps.d.ts +14 -0
  4. package/lib/dedupeInjectedDeps.js +72 -0
  5. package/lib/depPathToRef.d.ts +4 -0
  6. package/lib/depPathToRef.js +7 -0
  7. package/lib/getCatalogSnapshots.d.ts +4 -0
  8. package/lib/getCatalogSnapshots.js +21 -0
  9. package/lib/getExactSinglePreferredVersions.d.ts +6 -0
  10. package/lib/getExactSinglePreferredVersions.js +11 -0
  11. package/lib/getNonDevWantedDependencies.d.ts +12 -0
  12. package/lib/getNonDevWantedDependencies.js +29 -0
  13. package/lib/getWantedDependencies.d.ts +14 -0
  14. package/lib/getWantedDependencies.js +45 -0
  15. package/lib/hoistPeers.d.ts +10 -0
  16. package/lib/hoistPeers.js +75 -0
  17. package/lib/index.d.ts +53 -0
  18. package/lib/index.js +335 -0
  19. package/lib/mergePeers.d.ts +7 -0
  20. package/lib/mergePeers.js +30 -0
  21. package/lib/nextNodeId.d.ts +6 -0
  22. package/lib/nextNodeId.js +5 -0
  23. package/lib/parentIdsContainSequence.d.ts +2 -0
  24. package/lib/parentIdsContainSequence.js +9 -0
  25. package/lib/replaceVersionInBareSpecifier.d.ts +1 -0
  26. package/lib/replaceVersionInBareSpecifier.js +15 -0
  27. package/lib/resolveDependencies.d.ts +248 -0
  28. package/lib/resolveDependencies.js +1182 -0
  29. package/lib/resolveDependencyTree.d.ts +122 -0
  30. package/lib/resolveDependencyTree.js +228 -0
  31. package/lib/resolvePeers.d.ts +59 -0
  32. package/lib/resolvePeers.js +702 -0
  33. package/lib/safeIsInnerLink.d.ts +6 -0
  34. package/lib/safeIsInnerLink.js +31 -0
  35. package/lib/toResolveImporter.d.ts +22 -0
  36. package/lib/toResolveImporter.js +117 -0
  37. package/lib/unwrapPackageName.d.ts +23 -0
  38. package/lib/unwrapPackageName.js +39 -0
  39. package/lib/updateLockfile.d.ts +10 -0
  40. package/lib/updateLockfile.js +121 -0
  41. package/lib/updateProjectManifest.d.ts +8 -0
  42. package/lib/updateProjectManifest.js +34 -0
  43. package/lib/validatePeerDependencies.d.ts +6 -0
  44. package/lib/validatePeerDependencies.js +15 -0
  45. package/lib/wantedDepIsLocallyAvailable.d.ts +6 -0
  46. package/lib/wantedDepIsLocallyAvailable.js +23 -0
  47. package/package.json +91 -0
package/lib/index.js ADDED
@@ -0,0 +1,335 @@
1
+ import path from 'node:path';
2
+ import { packageManifestLogger, } from '@pnpm/core-loggers';
3
+ import { iterateHashedGraphNodes } from '@pnpm/deps.graph-hasher';
4
+ import { isRuntimeDepPath } from '@pnpm/deps.path';
5
+ import { verifyPatches } from '@pnpm/patching.config';
6
+ import { safeReadPackageJsonFromDir } from '@pnpm/pkg-manifest.reader';
7
+ import { getAllDependenciesFromManifest, getSpecFromPackageManifest, } from '@pnpm/pkg-manifest.utils';
8
+ import { DEPENDENCIES_FIELDS, } from '@pnpm/types';
9
+ import { isSubdir } from 'is-subdir';
10
+ import { difference, zipWith } from 'ramda';
11
+ import { depPathToRef } from './depPathToRef.js';
12
+ import { getCatalogSnapshots } from './getCatalogSnapshots.js';
13
+ import { getWantedDependencies } from './getWantedDependencies.js';
14
+ import { createNodeIdForLinkedLocalPkg } from './resolveDependencies.js';
15
+ import { resolveDependencyTree, } from './resolveDependencyTree.js';
16
+ import { resolvePeers, } from './resolvePeers.js';
17
+ import { toResolveImporter } from './toResolveImporter.js';
18
+ import { updateLockfile } from './updateLockfile.js';
19
+ import { updateProjectManifest } from './updateProjectManifest.js';
20
+ export { getWantedDependencies, };
21
+ export async function resolveDependencies(importers, opts) {
22
+ const _toResolveImporter = toResolveImporter.bind(null, {
23
+ defaultUpdateDepth: opts.defaultUpdateDepth,
24
+ lockfileOnly: opts.dryRun,
25
+ preferredVersions: opts.preferredVersions,
26
+ virtualStoreDir: opts.virtualStoreDir,
27
+ globalVirtualStoreDir: opts.globalVirtualStoreDir,
28
+ workspacePackages: opts.workspacePackages,
29
+ noDependencySelectors: importers.every(({ wantedDependencies }) => wantedDependencies.length === 0),
30
+ });
31
+ const projectsToResolve = await Promise.all(importers.map(async (project) => _toResolveImporter(project)));
32
+ const { dependenciesTree, outdatedDependencies, resolvedImporters, resolvedPkgsById, wantedToBeSkippedPackageIds, appliedPatches, time, allPeerDepNames, } = await resolveDependencyTree(projectsToResolve, opts);
33
+ opts.storeController.clearResolutionCache();
34
+ // We only check whether patches were applied in cases when the whole lockfile was reanalyzed.
35
+ if (opts.patchedDependencies &&
36
+ (opts.forceFullResolution || !Object.keys(opts.wantedLockfile.packages ?? {})?.length) &&
37
+ Object.keys(opts.wantedLockfile.importers).length === importers.length) {
38
+ verifyPatches({
39
+ patchedDependencies: opts.patchedDependencies,
40
+ appliedPatches,
41
+ allowUnusedPatches: opts.allowUnusedPatches,
42
+ });
43
+ }
44
+ const projectsToLink = await Promise.all(projectsToResolve.map(async (project) => {
45
+ const resolvedImporter = resolvedImporters[project.id];
46
+ const topParents = project.manifest
47
+ ? await getTopParents(difference(Object.keys(getAllDependenciesFromManifest(project.manifest)), resolvedImporter.directDependencies.map(({ alias }) => alias) || []), project.modulesDir)
48
+ : [];
49
+ for (const linkedDependency of resolvedImporter.linkedDependencies) {
50
+ // The location of the external link may vary on different machines, so it is better not to include it in the lockfile.
51
+ // As a workaround, we symlink to the root of node_modules, which is a symlink to the actual location of the external link.
52
+ const target = !opts.excludeLinksFromLockfile || isSubdir(opts.lockfileDir, linkedDependency.resolution.directory)
53
+ ? linkedDependency.resolution.directory
54
+ : path.join(project.modulesDir, linkedDependency.alias);
55
+ const linkedDir = createNodeIdForLinkedLocalPkg(opts.lockfileDir, target);
56
+ topParents.push({
57
+ name: linkedDependency.alias,
58
+ version: linkedDependency.version,
59
+ linkedDir,
60
+ });
61
+ }
62
+ return {
63
+ binsDir: project.binsDir,
64
+ directNodeIdsByAlias: resolvedImporter.directNodeIdsByAlias,
65
+ id: project.id,
66
+ linkedDependencies: resolvedImporter.linkedDependencies,
67
+ manifest: project.manifest,
68
+ modulesDir: project.modulesDir,
69
+ rootDir: project.rootDir,
70
+ topParents,
71
+ };
72
+ }));
73
+ const { dependenciesGraph, dependenciesByProjectId, peerDependencyIssuesByProjects, } = await resolvePeers({
74
+ allPeerDepNames,
75
+ dependenciesTree,
76
+ dedupePeerDependents: opts.dedupePeerDependents,
77
+ dedupeInjectedDeps: opts.dedupeInjectedDeps,
78
+ lockfileDir: opts.lockfileDir,
79
+ projects: projectsToLink,
80
+ virtualStoreDir: opts.virtualStoreDir,
81
+ virtualStoreDirMaxLength: opts.virtualStoreDirMaxLength,
82
+ resolvePeersFromWorkspaceRoot: Boolean(opts.resolvePeersFromWorkspaceRoot),
83
+ resolvedImporters,
84
+ peersSuffixMaxLength: opts.peersSuffixMaxLength,
85
+ workspaceProjectIds: new Set([...opts.allProjectIds, ...Object.keys(opts.wantedLockfile.importers)]),
86
+ });
87
+ const linkedDependenciesByProjectId = {};
88
+ await Promise.all(projectsToResolve.map(async (project, index) => {
89
+ const resolvedImporter = resolvedImporters[project.id];
90
+ linkedDependenciesByProjectId[project.id] = resolvedImporter.linkedDependencies;
91
+ let updatedManifest;
92
+ let updatedOriginalManifest;
93
+ if (project.updatePackageManifest) {
94
+ [updatedManifest, updatedOriginalManifest] = await updateProjectManifest(project, {
95
+ directDependencies: resolvedImporter.directDependencies,
96
+ preserveWorkspaceProtocol: opts.preserveWorkspaceProtocol,
97
+ saveWorkspaceProtocol: opts.saveWorkspaceProtocol,
98
+ });
99
+ }
100
+ else {
101
+ updatedManifest = project.manifest;
102
+ updatedOriginalManifest = project.originalManifest;
103
+ packageManifestLogger.debug({
104
+ prefix: project.rootDir,
105
+ updated: project.manifest,
106
+ });
107
+ }
108
+ if (updatedManifest != null) {
109
+ if (opts.autoInstallPeers) {
110
+ if (updatedManifest.peerDependencies) {
111
+ const allDeps = getAllDependenciesFromManifest(updatedManifest);
112
+ for (const [peerName, peerRange] of Object.entries(updatedManifest.peerDependencies)) {
113
+ if (allDeps[peerName])
114
+ continue;
115
+ updatedManifest.dependencies ??= {};
116
+ updatedManifest.dependencies[peerName] = peerRange;
117
+ }
118
+ }
119
+ }
120
+ const projectSnapshot = opts.wantedLockfile.importers[project.id];
121
+ opts.wantedLockfile.importers[project.id] = addDirectDependenciesToLockfile(updatedManifest, projectSnapshot, resolvedImporter.linkedDependencies, resolvedImporter.directDependencies, opts.excludeLinksFromLockfile);
122
+ }
123
+ importers[index].manifest = updatedOriginalManifest ?? project.originalManifest ?? project.manifest;
124
+ for (const [alias, depPath] of dependenciesByProjectId[project.id].entries()) {
125
+ const projectSnapshot = opts.wantedLockfile.importers[project.id];
126
+ if (project.manifest.dependenciesMeta != null) {
127
+ projectSnapshot.dependenciesMeta = project.manifest.dependenciesMeta;
128
+ }
129
+ const depNode = dependenciesGraph[depPath];
130
+ const ref = depPathToRef(depPath, {
131
+ alias,
132
+ realName: depNode.name,
133
+ });
134
+ if (projectSnapshot.dependencies?.[alias]) {
135
+ projectSnapshot.dependencies[alias] = ref;
136
+ }
137
+ else if (projectSnapshot.devDependencies?.[alias]) {
138
+ projectSnapshot.devDependencies[alias] = ref;
139
+ }
140
+ else if (projectSnapshot.optionalDependencies?.[alias]) {
141
+ projectSnapshot.optionalDependencies[alias] = ref;
142
+ }
143
+ }
144
+ }));
145
+ let updatedCatalogs;
146
+ for (const project of projectsToResolve) {
147
+ if (!project.updatePackageManifest)
148
+ continue;
149
+ const resolvedImporter = resolvedImporters[project.id];
150
+ for (let i = 0; i < resolvedImporter.directDependencies.length; i++) {
151
+ const updateSpec = project.wantedDependencies[i]?.updateSpec ?? false;
152
+ if (!updateSpec)
153
+ continue;
154
+ const dep = resolvedImporter.directDependencies[i];
155
+ if (dep.catalogLookup == null)
156
+ continue;
157
+ // If normalizedBareSpecifier isn't defined, this catalog entry was resolved from cache.
158
+ // Avoid updating the updatedCatalogs map since it is likely unchanged.
159
+ if (dep.normalizedBareSpecifier == null)
160
+ continue;
161
+ updatedCatalogs ??= {};
162
+ updatedCatalogs[dep.catalogLookup.catalogName] ??= {};
163
+ updatedCatalogs[dep.catalogLookup.catalogName][dep.alias] = dep.normalizedBareSpecifier;
164
+ }
165
+ }
166
+ if (opts.dedupeDirectDeps) {
167
+ const rootDeps = dependenciesByProjectId['.'];
168
+ if (rootDeps) {
169
+ for (const [id, deps] of Object.entries(dependenciesByProjectId)) {
170
+ if (id === '.')
171
+ continue;
172
+ for (const [alias, depPath] of deps.entries()) {
173
+ if (depPath === rootDeps.get(alias)) {
174
+ deps.delete(alias);
175
+ }
176
+ }
177
+ }
178
+ }
179
+ }
180
+ const newLockfile = updateLockfile({
181
+ dependenciesGraph,
182
+ lockfile: opts.wantedLockfile,
183
+ prefix: opts.virtualStoreDir,
184
+ registries: opts.registries,
185
+ lockfileIncludeTarballUrl: opts.lockfileIncludeTarballUrl,
186
+ });
187
+ if (time) {
188
+ newLockfile.time = {
189
+ ...opts.wantedLockfile.time,
190
+ ...time,
191
+ };
192
+ }
193
+ newLockfile.catalogs = getCatalogSnapshots(Object.values(resolvedImporters).flatMap(({ directDependencies }) => directDependencies), updatedCatalogs);
194
+ // waiting till package requests are finished
195
+ async function waitTillAllFetchingsFinish() {
196
+ await Promise.all(Object.values(resolvedPkgsById).map(async ({ fetching }) => {
197
+ try {
198
+ await fetching?.();
199
+ }
200
+ catch { }
201
+ }));
202
+ }
203
+ return {
204
+ dependenciesByProjectId,
205
+ dependenciesGraph: extendGraph(dependenciesGraph, opts),
206
+ outdatedDependencies,
207
+ linkedDependenciesByProjectId,
208
+ updatedCatalogs,
209
+ newLockfile,
210
+ peerDependencyIssuesByProjects,
211
+ waitTillAllFetchingsFinish,
212
+ wantedToBeSkippedPackageIds,
213
+ };
214
+ }
215
+ function addDirectDependenciesToLockfile(newManifest, projectSnapshot, linkedPackages, directDependencies, excludeLinksFromLockfile) {
216
+ const newProjectSnapshot = {
217
+ dependencies: {},
218
+ devDependencies: {},
219
+ optionalDependencies: {},
220
+ specifiers: {},
221
+ };
222
+ if (newManifest.publishConfig?.directory) {
223
+ newProjectSnapshot.publishDirectory = newManifest.publishConfig.directory;
224
+ }
225
+ for (const linkedPkg of linkedPackages) {
226
+ newProjectSnapshot.specifiers[linkedPkg.alias] = getSpecFromPackageManifest(newManifest, linkedPkg.alias);
227
+ }
228
+ const directDependenciesByAlias = {};
229
+ for (const directDependency of directDependencies) {
230
+ directDependenciesByAlias[directDependency.alias] = directDependency;
231
+ }
232
+ const allDeps = Array.from(new Set(Object.keys(getAllDependenciesFromManifest(newManifest))));
233
+ for (const alias of allDeps) {
234
+ const dep = directDependenciesByAlias[alias];
235
+ const spec = dep && getSpecFromPackageManifest(newManifest, dep.alias);
236
+ if (dep &&
237
+ (!excludeLinksFromLockfile ||
238
+ !dep.isLinkedDependency ||
239
+ spec.startsWith('workspace:'))) {
240
+ const ref = depPathToRef(dep.pkgId, {
241
+ alias: dep.alias,
242
+ realName: dep.name,
243
+ });
244
+ if (dep.dev) {
245
+ newProjectSnapshot.devDependencies[dep.alias] = ref;
246
+ }
247
+ else if (dep.optional) {
248
+ newProjectSnapshot.optionalDependencies[dep.alias] = ref;
249
+ }
250
+ else {
251
+ newProjectSnapshot.dependencies[dep.alias] = ref;
252
+ }
253
+ newProjectSnapshot.specifiers[dep.alias] = spec;
254
+ }
255
+ else if (projectSnapshot.specifiers[alias]) {
256
+ newProjectSnapshot.specifiers[alias] = projectSnapshot.specifiers[alias];
257
+ if (projectSnapshot.dependencies?.[alias]) {
258
+ newProjectSnapshot.dependencies[alias] = projectSnapshot.dependencies[alias];
259
+ }
260
+ else if (projectSnapshot.optionalDependencies?.[alias]) {
261
+ newProjectSnapshot.optionalDependencies[alias] = projectSnapshot.optionalDependencies[alias];
262
+ }
263
+ else if (projectSnapshot.devDependencies?.[alias]) {
264
+ newProjectSnapshot.devDependencies[alias] = projectSnapshot.devDependencies[alias];
265
+ }
266
+ }
267
+ }
268
+ alignDependencyTypes(newManifest, newProjectSnapshot);
269
+ return newProjectSnapshot;
270
+ }
271
+ function alignDependencyTypes(manifest, projectSnapshot) {
272
+ const depTypesOfAliases = getAliasToDependencyTypeMap(manifest);
273
+ // Aligning the dependency types in pnpm-lock.yaml
274
+ for (const depType of DEPENDENCIES_FIELDS) {
275
+ if (projectSnapshot[depType] == null)
276
+ continue;
277
+ for (const [alias, ref] of Object.entries(projectSnapshot[depType] ?? {})) {
278
+ if (depType === depTypesOfAliases[alias] || !depTypesOfAliases[alias])
279
+ continue;
280
+ projectSnapshot[depTypesOfAliases[alias]][alias] = ref;
281
+ delete projectSnapshot[depType][alias];
282
+ }
283
+ }
284
+ }
285
+ function getAliasToDependencyTypeMap(manifest) {
286
+ const depTypesOfAliases = {};
287
+ for (const depType of DEPENDENCIES_FIELDS) {
288
+ if (manifest[depType] == null)
289
+ continue;
290
+ for (const alias of Object.keys(manifest[depType] ?? {})) {
291
+ if (!depTypesOfAliases[alias]) {
292
+ depTypesOfAliases[alias] = depType;
293
+ }
294
+ }
295
+ }
296
+ return depTypesOfAliases;
297
+ }
298
+ async function getTopParents(pkgAliases, modulesDir) {
299
+ const pkgs = await Promise.all(pkgAliases.map((alias) => path.join(modulesDir, alias)).map(safeReadPackageJsonFromDir));
300
+ return zipWith((manifest, alias) => {
301
+ if (!manifest)
302
+ return null;
303
+ return {
304
+ alias,
305
+ name: manifest.name,
306
+ version: manifest.version,
307
+ };
308
+ }, pkgs, pkgAliases)
309
+ .filter(Boolean);
310
+ }
311
+ function* iterateGraphPkgMetaEntries(graph, runtimeOnly) {
312
+ for (const depPath in graph) {
313
+ if (Object.hasOwn(graph, depPath)) {
314
+ if (runtimeOnly && !isRuntimeDepPath(depPath))
315
+ continue;
316
+ const { name, version, pkgIdWithPatchHash } = graph[depPath];
317
+ yield { depPath: depPath, name, version, pkgIdWithPatchHash };
318
+ }
319
+ }
320
+ }
321
+ function extendGraph(graph, opts) {
322
+ const pkgMetaIter = iterateGraphPkgMetaEntries(graph, !opts.enableGlobalVirtualStore);
323
+ // Only use allowBuild for engine-agnostic hash optimization when GVS is on
324
+ const allowBuild = opts.enableGlobalVirtualStore ? opts.allowBuild : undefined;
325
+ for (const { pkgMeta: { depPath }, hash } of iterateHashedGraphNodes(graph, pkgMetaIter, allowBuild)) {
326
+ const modules = path.join(opts.globalVirtualStoreDir, hash, 'node_modules');
327
+ const node = graph[depPath];
328
+ Object.assign(node, {
329
+ modules,
330
+ dir: path.join(modules, node.name),
331
+ });
332
+ }
333
+ return graph;
334
+ }
335
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ import type { MissingPeerIssuesByPeerName } from '@pnpm/types';
2
+ export interface MergePeersResult {
3
+ conflicts: string[];
4
+ intersections: Record<string, string>;
5
+ }
6
+ export declare function mergePeers(missingPeers: MissingPeerIssuesByPeerName): MergePeersResult;
7
+ export declare function safeIntersect(ranges: string[]): null | string;
@@ -0,0 +1,30 @@
1
+ import { intersect } from 'semver-range-intersect';
2
+ export function mergePeers(missingPeers) {
3
+ const conflicts = [];
4
+ const intersections = {};
5
+ for (const [peerName, ranges] of Object.entries(missingPeers)) {
6
+ if (ranges.every(({ optional }) => optional))
7
+ continue;
8
+ if (ranges.length === 1) {
9
+ intersections[peerName] = ranges[0].wantedRange;
10
+ continue;
11
+ }
12
+ const intersection = safeIntersect(ranges.map(({ wantedRange }) => wantedRange));
13
+ if (intersection === null) {
14
+ conflicts.push(peerName);
15
+ }
16
+ else {
17
+ intersections[peerName] = intersection;
18
+ }
19
+ }
20
+ return { conflicts, intersections };
21
+ }
22
+ export function safeIntersect(ranges) {
23
+ try {
24
+ return intersect(...ranges);
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ //# sourceMappingURL=mergePeers.js.map
@@ -0,0 +1,6 @@
1
+ type Brand<K, T> = K & {
2
+ __brand: T;
3
+ };
4
+ export type NodeId = Brand<string | number, 'nodeId'>;
5
+ export declare function nextNodeId(): NodeId;
6
+ export {};
@@ -0,0 +1,5 @@
1
+ let nodeIdCounter = 0;
2
+ export function nextNodeId() {
3
+ return ++nodeIdCounter;
4
+ }
5
+ //# sourceMappingURL=nextNodeId.js.map
@@ -0,0 +1,2 @@
1
+ import type { PkgResolutionId } from '@pnpm/types';
2
+ export declare function parentIdsContainSequence(pkgIds: PkgResolutionId[], pkgId1: PkgResolutionId, pkgId2: PkgResolutionId): boolean;
@@ -0,0 +1,9 @@
1
+ export function parentIdsContainSequence(pkgIds, pkgId1, pkgId2) {
2
+ const pkg1Index = pkgIds.indexOf(pkgId1);
3
+ if (pkg1Index === -1 || pkg1Index === pkgIds.length - 1) {
4
+ return false;
5
+ }
6
+ const pkg2Index = pkgIds.lastIndexOf(pkgId2);
7
+ return pkg1Index < pkg2Index && pkg2Index !== pkgIds.length - 1;
8
+ }
9
+ //# sourceMappingURL=parentIdsContainSequence.js.map
@@ -0,0 +1 @@
1
+ export declare function replaceVersionInBareSpecifier(bareSpecifier: string, version: string): string;
@@ -0,0 +1,15 @@
1
+ import semver from 'semver';
2
+ export function replaceVersionInBareSpecifier(bareSpecifier, version) {
3
+ if (semver.validRange(bareSpecifier)) {
4
+ return version;
5
+ }
6
+ if (!bareSpecifier.startsWith('npm:')) {
7
+ return bareSpecifier;
8
+ }
9
+ const versionDelimiter = bareSpecifier.lastIndexOf('@');
10
+ if (versionDelimiter === -1 || bareSpecifier.indexOf('/') > versionDelimiter) {
11
+ return `${bareSpecifier}@${version}`;
12
+ }
13
+ return `${bareSpecifier.substring(0, versionDelimiter + 1)}${version}`;
14
+ }
15
+ //# sourceMappingURL=replaceVersionInBareSpecifier.js.map
@@ -0,0 +1,248 @@
1
+ import { type CatalogResolver } from '@pnpm/catalogs.resolver';
2
+ import type { LockfileObject, PackageSnapshot, ResolvedDependencies } from '@pnpm/lockfile.types';
3
+ import { type PatchGroupRecord } from '@pnpm/patching.config';
4
+ import type { PatchInfo } from '@pnpm/patching.types';
5
+ import { type DirectoryResolution, type PkgResolutionId, type PreferredVersions, type Resolution, type WorkspacePackages } from '@pnpm/resolving.resolver-base';
6
+ import type { PackageResponse, PkgRequestFetchResult, StoreController } from '@pnpm/store.controller-types';
7
+ import type { AllowBuild, AllowedDeprecatedVersions, PackageManifest, PackageVersionPolicy, PinnedVersion, PkgIdWithPatchHash, ReadPackageHook, Registries, SupportedArchitectures, TrustPolicy } from '@pnpm/types';
8
+ import { type WantedDependency } from './getNonDevWantedDependencies.js';
9
+ import { type NodeId } from './nextNodeId.js';
10
+ import type { CatalogLookupMetadata } from './resolveDependencyTree.js';
11
+ export type { WantedDependency };
12
+ export declare function getPkgsInfoFromIds(ids: PkgResolutionId[], resolvedPkgsById: ResolvedPkgsById): Array<{
13
+ id: PkgResolutionId;
14
+ name: string;
15
+ version: string;
16
+ }>;
17
+ export interface ChildrenMap {
18
+ [alias: string]: NodeId;
19
+ }
20
+ export type DependenciesTreeNode<T> = {
21
+ children: (() => ChildrenMap) | ChildrenMap;
22
+ installable: boolean;
23
+ } & ({
24
+ resolvedPackage: T & {
25
+ name: string;
26
+ version: string;
27
+ };
28
+ depth: number;
29
+ } | {
30
+ resolvedPackage: {
31
+ name: string;
32
+ version: string;
33
+ };
34
+ depth: -1;
35
+ });
36
+ export type DependenciesTree<T> = Map<NodeId, DependenciesTreeNode<T>>;
37
+ export type ResolvedPkgsById = Record<PkgResolutionId, ResolvedPackage>;
38
+ export interface PkgAddressOrLinkBase {
39
+ alias: string;
40
+ catalogLookup?: CatalogLookupMetadata;
41
+ normalizedBareSpecifier?: string;
42
+ optional: boolean;
43
+ pkg: PackageManifest;
44
+ pkgId: PkgResolutionId;
45
+ }
46
+ export interface LinkedDependency extends PkgAddressOrLinkBase {
47
+ isLinkedDependency: true;
48
+ dev: boolean;
49
+ resolution: DirectoryResolution;
50
+ version: string;
51
+ name: string;
52
+ }
53
+ export interface PendingNode {
54
+ alias: string;
55
+ nodeId: NodeId;
56
+ resolvedPackage: ResolvedPackage;
57
+ depth: number;
58
+ installable: boolean;
59
+ parentIds: PkgResolutionId[];
60
+ }
61
+ export interface ChildrenByParentId {
62
+ [id: PkgResolutionId]: Array<{
63
+ alias: string;
64
+ id: PkgResolutionId;
65
+ }>;
66
+ }
67
+ export interface ResolutionContext {
68
+ allowBuild?: AllowBuild;
69
+ allPeerDepNames: Set<string>;
70
+ autoInstallPeers: boolean;
71
+ autoInstallPeersFromHighestMatch: boolean;
72
+ allowedDeprecatedVersions: AllowedDeprecatedVersions;
73
+ allPreferredVersions?: PreferredVersions;
74
+ appliedPatches: Set<string>;
75
+ updatedSet: Set<string>;
76
+ catalogResolver: CatalogResolver;
77
+ defaultTag: string;
78
+ dryRun: boolean;
79
+ forceFullResolution: boolean;
80
+ ignoreScripts?: boolean;
81
+ resolvedPkgsById: ResolvedPkgsById;
82
+ resolvePeersFromWorkspaceRoot?: boolean;
83
+ outdatedDependencies: Record<PkgResolutionId, string>;
84
+ childrenByParentId: ChildrenByParentId;
85
+ patchedDependencies?: PatchGroupRecord;
86
+ pendingNodes: PendingNode[];
87
+ wantedLockfile: LockfileObject;
88
+ currentLockfile: LockfileObject;
89
+ injectWorkspacePackages?: boolean;
90
+ linkWorkspacePackagesDepth: number;
91
+ lockfileDir: string;
92
+ storeController: StoreController;
93
+ skipped: Set<PkgResolutionId>;
94
+ dependenciesTree: DependenciesTree<ResolvedPackage>;
95
+ force: boolean;
96
+ preferWorkspacePackages?: boolean;
97
+ readPackageHook?: ReadPackageHook;
98
+ engineStrict: boolean;
99
+ nodeVersion?: string;
100
+ pnpmVersion: string;
101
+ registries: Registries;
102
+ resolutionMode?: 'highest' | 'time-based' | 'lowest-direct';
103
+ virtualStoreDir: string;
104
+ virtualStoreDirMaxLength: number;
105
+ workspacePackages?: WorkspacePackages;
106
+ missingPeersOfChildrenByPkgId: Record<PkgResolutionId, {
107
+ depth: number;
108
+ missingPeersOfChildren: MissingPeersOfChildren;
109
+ }>;
110
+ hoistPeers?: boolean;
111
+ maximumPublishedBy?: Date;
112
+ publishedByExclude?: PackageVersionPolicy;
113
+ trustPolicy?: TrustPolicy;
114
+ trustPolicyExclude?: PackageVersionPolicy;
115
+ trustPolicyIgnoreAfter?: number;
116
+ blockExoticSubdeps?: boolean;
117
+ }
118
+ export interface MissingPeerInfo {
119
+ range: string;
120
+ optional: boolean;
121
+ }
122
+ export type MissingPeers = Record<string, MissingPeerInfo>;
123
+ export type ResolvedPeers = Record<string, PkgAddress>;
124
+ interface MissingPeersOfChildren {
125
+ resolve: (missingPeers: MissingPeers) => void;
126
+ reject: (err: Error) => void;
127
+ get: () => Promise<MissingPeers>;
128
+ resolved?: boolean;
129
+ }
130
+ export interface PkgAddress extends PkgAddressOrLinkBase {
131
+ depIsLinked: boolean;
132
+ isNew: boolean;
133
+ isLinkedDependency?: false;
134
+ resolvedVia?: string;
135
+ nodeId: NodeId;
136
+ installable: boolean;
137
+ version?: string;
138
+ updated: boolean;
139
+ rootDir: string;
140
+ missingPeers: MissingPeers;
141
+ missingPeersOfChildren?: MissingPeersOfChildren;
142
+ publishedAt?: string;
143
+ saveCatalogName?: string;
144
+ }
145
+ export type PkgAddressOrLink = PkgAddress | LinkedDependency;
146
+ export interface PeerDependency {
147
+ version: string;
148
+ optional?: boolean;
149
+ }
150
+ export type PeerDependencies = Record<string, PeerDependency>;
151
+ export interface ResolvedPackage {
152
+ id: PkgResolutionId;
153
+ isLeaf: boolean;
154
+ resolution: Resolution;
155
+ prod: boolean;
156
+ dev: boolean;
157
+ optional: boolean;
158
+ fetching: () => Promise<PkgRequestFetchResult>;
159
+ filesIndexFile: string;
160
+ name: string;
161
+ version: string;
162
+ peerDependencies: PeerDependencies;
163
+ optionalDependencies: Set<string>;
164
+ hasBin: boolean;
165
+ hasBundledDependencies: boolean;
166
+ patch?: PatchInfo;
167
+ prepare: boolean;
168
+ pkgIdWithPatchHash: PkgIdWithPatchHash;
169
+ requiresBuild?: boolean;
170
+ additionalInfo: {
171
+ deprecated?: string;
172
+ bundleDependencies?: string[] | boolean;
173
+ bundledDependencies?: string[] | boolean;
174
+ engines?: {
175
+ node?: string;
176
+ npm?: string;
177
+ };
178
+ cpu?: string[];
179
+ os?: string[];
180
+ libc?: string[];
181
+ };
182
+ }
183
+ type ParentPkg = Pick<PkgAddress, 'nodeId' | 'installable' | 'rootDir' | 'optional' | 'pkgId' | 'resolvedVia'>;
184
+ export type ParentPkgAliases = Record<string, PkgAddress | true>;
185
+ export type UpdateMatchingFunction = (pkgName: string, version?: string) => boolean;
186
+ interface ResolvedDependenciesOptions {
187
+ currentDepth: number;
188
+ parentIds: PkgResolutionId[];
189
+ parentPkg: ParentPkg;
190
+ parentPkgAliases: ParentPkgAliases;
191
+ preferredDependencies?: ResolvedDependencies;
192
+ proceed: boolean;
193
+ publishedBy?: Date;
194
+ pickLowestVersion?: boolean;
195
+ resolvedDependencies?: ResolvedDependencies;
196
+ updateMatching?: UpdateMatchingFunction;
197
+ updateDepth: number;
198
+ prefix: string;
199
+ supportedArchitectures?: SupportedArchitectures;
200
+ updateToLatest?: boolean;
201
+ pinnedVersion?: PinnedVersion;
202
+ }
203
+ interface PeersResolutionResult {
204
+ missingPeers: MissingPeers;
205
+ resolvedPeers: ResolvedPeers;
206
+ }
207
+ interface ResolvedRootDependenciesResult {
208
+ pkgAddressesByImporters: PkgAddressOrLink[][];
209
+ time?: Record<string, string>;
210
+ }
211
+ export declare function resolveRootDependencies(ctx: ResolutionContext, importers: ImporterToResolve[]): Promise<ResolvedRootDependenciesResult>;
212
+ interface ResolvedDependenciesResult {
213
+ pkgAddresses: PkgAddressOrLink[];
214
+ resolvingPeers: Promise<PeersResolutionResult>;
215
+ }
216
+ export type ImporterToResolveOptions = Omit<ResolvedDependenciesOptions, 'parentPkgAliases' | 'publishedBy'>;
217
+ export interface ImporterToResolve {
218
+ updatePackageManifest: boolean;
219
+ preferredVersions: PreferredVersions;
220
+ parentPkgAliases: ParentPkgAliases;
221
+ wantedDependencies: Array<WantedDependency & {
222
+ updateDepth?: number;
223
+ }>;
224
+ options: ImporterToResolveOptions;
225
+ pinnedVersion?: PinnedVersion;
226
+ }
227
+ export interface ResolveDependenciesOfImporterDependencyOpts {
228
+ readonly ctx: ResolutionContext;
229
+ readonly importer: ImporterToResolve;
230
+ readonly pickLowestVersion: boolean;
231
+ }
232
+ export declare function resolveDependencies(ctx: ResolutionContext, preferredVersions: PreferredVersions, wantedDependencies: Array<WantedDependency & {
233
+ updateDepth?: number;
234
+ }>, options: ResolvedDependenciesOptions): Promise<ResolvedDependenciesResult>;
235
+ export declare function createNodeIdForLinkedLocalPkg(lockfileDir: string, pkgDir: string): NodeId;
236
+ type InfoFromLockfile = {
237
+ pkgId: PkgResolutionId;
238
+ dependencyLockfile?: PackageSnapshot;
239
+ name?: string;
240
+ version?: string;
241
+ resolution?: Resolution;
242
+ } & ({
243
+ dependencyLockfile: PackageSnapshot;
244
+ name: string;
245
+ version: string;
246
+ resolution: Resolution;
247
+ } | unknown);
248
+ export declare function getManifestFromResponse(pkgResponse: PackageResponse, wantedDependency: WantedDependency, currentPkg?: Partial<InfoFromLockfile>): PackageManifest;