@pnpm/deps.graph-builder 1100.0.25 → 1100.1.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # @pnpm/deps.graph-builder
2
2
 
3
+ ## 1100.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Fixed an installed optional dependency being left without one of its own required dependencies. When a package reached through `optionalDependencies` is installable on the current system but one of its regular `dependencies` is not, a lockfile-based install skipped that dependency and installed the parent anyway, so importing the parent failed with `MODULE_NOT_FOUND`. The dependency is now installed, and an install-check warning reports the incompatibility. A dependency is still only skipped when every path to it is optional, or when the package that pulls it in was itself skipped [#13286](https://github.com/pnpm/pnpm/issues/13286).
8
+
9
+ ### Patch Changes
10
+
11
+ - Installing a local `file:` directory dependency with the global virtual store enabled no longer fails with `TypeError: Cannot read properties of undefined (reading 'split')` [#13335](https://github.com/pnpm/pnpm/issues/13335).
12
+
13
+ Local directory dependencies — `file:` directories and injected workspace packages — now get a global-virtual-store slot of their own per project. They used to share one slot across every project that depended on a directory of the same name, so a project could end up linked to another project's copy of the dependency.
14
+
15
+ - Updated dependencies:
16
+ - @pnpm/config.package-is-installable@1100.1.0
17
+ - @pnpm/core-loggers@1100.3.0
18
+ - @pnpm/deps.graph-hasher@1100.2.13
19
+ - @pnpm/deps.path@1100.0.12
20
+ - @pnpm/fs.symlink-dependency@1100.0.15
21
+ - @pnpm/hooks.types@1100.2.4
22
+ - @pnpm/installing.modules-yaml@1100.0.13
23
+ - @pnpm/lockfile.fs@1100.1.15
24
+ - @pnpm/lockfile.utils@1100.1.6
25
+ - @pnpm/patching.config@1100.0.13
26
+ - @pnpm/store.controller-types@1100.1.11
27
+ - @pnpm/types@1101.7.0
28
+
29
+ ## 1100.0.26
30
+
31
+ ### Patch Changes
32
+
33
+ - Republished every package: the tarballs published by the v11.13.1 through v11.16.0 releases were missing most of their compiled files due to a packing bug [#13164](https://github.com/pnpm/pnpm/issues/13164).
34
+
35
+ - Updated dependencies:
36
+ - @pnpm/config.package-is-installable@1100.0.16
37
+ - @pnpm/constants@1100.0.1
38
+ - @pnpm/core-loggers@1100.2.5
39
+ - @pnpm/deps.graph-hasher@1100.2.12
40
+ - @pnpm/deps.path@1100.0.11
41
+ - @pnpm/fs.symlink-dependency@1100.0.14
42
+ - @pnpm/hooks.types@1100.2.3
43
+ - @pnpm/installing.modules-yaml@1100.0.12
44
+ - @pnpm/lockfile.fs@1100.1.14
45
+ - @pnpm/lockfile.utils@1100.1.5
46
+ - @pnpm/patching.config@1100.0.12
47
+ - @pnpm/patching.types@1100.0.1
48
+ - @pnpm/store.controller-types@1100.1.10
49
+ - @pnpm/types@1101.6.0
50
+
3
51
  ## 1100.0.25
4
52
 
5
53
  ### Patch Changes
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './lockfileToDepGraph.js';
@@ -0,0 +1,17 @@
1
+ import { type PkgMetaAndSnapshot } from '@pnpm/deps.graph-hasher';
2
+ import type { LockfileObject } from '@pnpm/lockfile.fs';
3
+ import type { AllowBuild, SupportedArchitectures } from '@pnpm/types';
4
+ interface PkgSnapshotWithLocation {
5
+ pkgMeta: PkgMetaAndSnapshot;
6
+ dirInVirtualStore: string;
7
+ }
8
+ export declare function iteratePkgsForVirtualStore(lockfile: LockfileObject, opts: {
9
+ allowBuild?: AllowBuild;
10
+ enableGlobalVirtualStore?: boolean;
11
+ lockfileDir: string;
12
+ virtualStoreDirMaxLength: number;
13
+ virtualStoreDir: string;
14
+ globalVirtualStoreDir: string;
15
+ supportedArchitectures?: SupportedArchitectures;
16
+ }): IterableIterator<PkgSnapshotWithLocation>;
17
+ export {};
@@ -0,0 +1,67 @@
1
+ import path from 'node:path';
2
+ import { calcGraphNodeHash, findRuntimeNodeVersion, iterateHashedGraphNodes, iteratePkgMeta, lockfileToDepGraph, } from '@pnpm/deps.graph-hasher';
3
+ import * as dp from '@pnpm/deps.path';
4
+ import { nameVerFromPkgSnapshot, } from '@pnpm/lockfile.utils';
5
+ export function* iteratePkgsForVirtualStore(lockfile, opts) {
6
+ // Resolve the project's pinned runtime Node version once per
7
+ // invocation — the result drives every snapshot's GVS hash (or
8
+ // the side-effects-cache key prefix in the non-GVS runtime
9
+ // branch). `undefined` when no `engines.runtime` / `devEngines.runtime`
10
+ // pin reached the lockfile, in which case the hasher falls through
11
+ // to the host-detected Node.
12
+ const nodeVersion = findRuntimeNodeVersion(Object.keys(lockfile.packages ?? {}));
13
+ if (opts.enableGlobalVirtualStore) {
14
+ for (const { hash, pkgMeta } of hashDependencyPaths(lockfile, {
15
+ allowBuild: opts.allowBuild,
16
+ supportedArchitectures: opts.supportedArchitectures,
17
+ nodeVersion,
18
+ lockfileDir: opts.lockfileDir,
19
+ })) {
20
+ yield {
21
+ dirInVirtualStore: path.join(opts.globalVirtualStoreDir, hash),
22
+ pkgMeta,
23
+ };
24
+ }
25
+ }
26
+ else if (lockfile.packages) {
27
+ let graphNodeHashOpts;
28
+ for (const depPath in lockfile.packages) {
29
+ if (!Object.hasOwn(lockfile.packages, depPath)) {
30
+ continue;
31
+ }
32
+ const pkgSnapshot = lockfile.packages[depPath];
33
+ const { name, version } = nameVerFromPkgSnapshot(depPath, pkgSnapshot);
34
+ const pkgMeta = {
35
+ depPath: depPath,
36
+ pkgIdWithPatchHash: dp.getPkgIdWithPatchHash(depPath),
37
+ name,
38
+ version,
39
+ pkgSnapshot,
40
+ };
41
+ let dirInVirtualStore;
42
+ if (dp.isRuntimeDepPath(depPath)) {
43
+ graphNodeHashOpts ??= {
44
+ cache: {},
45
+ graph: lockfileToDepGraph(lockfile, opts.supportedArchitectures),
46
+ supportedArchitectures: opts.supportedArchitectures,
47
+ nodeVersion,
48
+ lockfileDir: opts.lockfileDir,
49
+ };
50
+ const hash = calcGraphNodeHash(graphNodeHashOpts, pkgMeta);
51
+ dirInVirtualStore = path.join(opts.globalVirtualStoreDir, hash);
52
+ }
53
+ else {
54
+ dirInVirtualStore = path.join(opts.virtualStoreDir, dp.depPathToFilename(depPath, opts.virtualStoreDirMaxLength));
55
+ }
56
+ yield {
57
+ dirInVirtualStore,
58
+ pkgMeta,
59
+ };
60
+ }
61
+ }
62
+ }
63
+ function hashDependencyPaths(lockfile, opts) {
64
+ const graph = lockfileToDepGraph(lockfile, opts.supportedArchitectures);
65
+ return iterateHashedGraphNodes(graph, iteratePkgMeta(lockfile, graph), opts);
66
+ }
67
+ //# sourceMappingURL=iteratePkgsForVirtualStore.js.map
@@ -0,0 +1,93 @@
1
+ import type { IncludedDependencies } from '@pnpm/installing.modules-yaml';
2
+ import type { LockfileObject, LockfileResolution } from '@pnpm/lockfile.fs';
3
+ import { type PatchGroupRecord } from '@pnpm/patching.config';
4
+ import type { PatchInfo } from '@pnpm/patching.types';
5
+ import type { PkgRequestFetchResult, StoreController } from '@pnpm/store.controller-types';
6
+ import type { AllowBuild, DepPath, PkgIdWithPatchHash, ProjectId, Registries, SupportedArchitectures } from '@pnpm/types';
7
+ export interface DependenciesGraphNode {
8
+ alias?: string;
9
+ hasBundledDependencies: boolean;
10
+ modules: string;
11
+ name: string;
12
+ version: string;
13
+ fetching?: () => Promise<PkgRequestFetchResult>;
14
+ forceImportPackage?: boolean;
15
+ dir: string;
16
+ children: Record<string, string>;
17
+ optionalDependencies: Set<string>;
18
+ optional: boolean;
19
+ depPath: DepPath;
20
+ pkgIdWithPatchHash: PkgIdWithPatchHash;
21
+ isBuilt?: boolean;
22
+ requiresBuild?: boolean;
23
+ hasBin: boolean;
24
+ filesIndexFile?: string;
25
+ patch?: PatchInfo;
26
+ resolution: LockfileResolution;
27
+ }
28
+ export interface DependenciesGraph {
29
+ [depPath: string]: DependenciesGraphNode;
30
+ }
31
+ export interface LockfileToDepGraphOptions {
32
+ allowBuild?: AllowBuild;
33
+ autoInstallPeers: boolean;
34
+ enableGlobalVirtualStore?: boolean;
35
+ engineStrict: boolean;
36
+ force: boolean;
37
+ importerIds: ProjectId[];
38
+ include: IncludedDependencies;
39
+ includeUnchangedDeps?: boolean;
40
+ ignoreScripts: boolean;
41
+ /**
42
+ * When true, skip fetching local dependencies (file: protocol pointing to directories).
43
+ * This is useful for `pnpm fetch` which only downloads packages from the registry
44
+ * and doesn't need local packages that won't be available (e.g., in Docker builds).
45
+ */
46
+ ignoreLocalPackages?: boolean;
47
+ lockfileDir: string;
48
+ nodeVersion: string;
49
+ pnpmVersion: string;
50
+ patchedDependencies?: PatchGroupRecord;
51
+ registries: Registries;
52
+ /**
53
+ * The dep paths a non-optional edge reaches, as classified by
54
+ * `filterLockfileByImportersAndEngine`. Installability is evaluated as
55
+ * optional for everything outside this set.
56
+ */
57
+ requiredDepPaths: Set<DepPath>;
58
+ sideEffectsCacheRead: boolean;
59
+ skipped: Set<DepPath>;
60
+ storeController: StoreController;
61
+ storeDir: string;
62
+ globalVirtualStoreDir: string;
63
+ virtualStoreDir: string;
64
+ supportedArchitectures?: SupportedArchitectures;
65
+ virtualStoreDirMaxLength: number;
66
+ }
67
+ export interface DirectDependenciesByImporterId {
68
+ [importerId: string]: {
69
+ [alias: string]: string;
70
+ };
71
+ }
72
+ export interface DepHierarchy {
73
+ [depPath: string]: Record<string, DepHierarchy>;
74
+ }
75
+ export interface LockfileToDepGraphResult {
76
+ directDependenciesByImporterId: DirectDependenciesByImporterId;
77
+ graph: DependenciesGraph;
78
+ hierarchy?: DepHierarchy;
79
+ hoistedLocations?: Record<string, string[]>;
80
+ symlinkedDirectDependenciesByImporterId?: DirectDependenciesByImporterId;
81
+ prevGraph?: DependenciesGraph;
82
+ injectionTargetsByDepPath: Map<string, string[]>;
83
+ }
84
+ /**
85
+ * Generate a dependency graph from lockfiles.
86
+ *
87
+ * If a current lockfile is provided, this function only includes new or changed
88
+ * packages in the graph. In other words, the graph returned will be a set
89
+ * subtraction of the packages in the wanted lockfile minus the current
90
+ * lockfile. This behavior can be configured with the `includeUnchangedDeps`
91
+ * option.
92
+ */
93
+ export declare function lockfileToDepGraph(lockfile: LockfileObject, currentLockfile: LockfileObject | null, opts: LockfileToDepGraphOptions): Promise<LockfileToDepGraphResult>;
@@ -0,0 +1,232 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { packageIsInstallable } from '@pnpm/config.package-is-installable';
4
+ import { WANTED_LOCKFILE } from '@pnpm/constants';
5
+ import { progressLogger, } from '@pnpm/core-loggers';
6
+ import * as dp from '@pnpm/deps.path';
7
+ import { safeJoinModulesDir } from '@pnpm/fs.symlink-dependency';
8
+ import { packageIdFromSnapshot, pkgSnapshotToResolution, } from '@pnpm/lockfile.utils';
9
+ import { logger } from '@pnpm/logger';
10
+ import { getPatchInfo } from '@pnpm/patching.config';
11
+ import { pathExists } from 'path-exists';
12
+ import { equals, isEmpty } from 'ramda';
13
+ import { iteratePkgsForVirtualStore } from './iteratePkgsForVirtualStore.js';
14
+ const brokenModulesLogger = logger('_broken_node_modules');
15
+ /**
16
+ * Generate a dependency graph from lockfiles.
17
+ *
18
+ * If a current lockfile is provided, this function only includes new or changed
19
+ * packages in the graph. In other words, the graph returned will be a set
20
+ * subtraction of the packages in the wanted lockfile minus the current
21
+ * lockfile. This behavior can be configured with the `includeUnchangedDeps`
22
+ * option.
23
+ */
24
+ export async function lockfileToDepGraph(lockfile, currentLockfile, opts) {
25
+ const { graph, locationByDepPath, injectionTargetsByDepPath, } = await buildGraphFromPackages(lockfile, currentLockfile, opts);
26
+ const _getChildrenPaths = getChildrenPaths.bind(null, {
27
+ force: opts.force,
28
+ graph,
29
+ lockfileDir: opts.lockfileDir,
30
+ registries: opts.registries,
31
+ sideEffectsCacheRead: opts.sideEffectsCacheRead,
32
+ skipped: opts.skipped,
33
+ storeController: opts.storeController,
34
+ storeDir: opts.storeDir,
35
+ virtualStoreDir: opts.virtualStoreDir,
36
+ virtualStoreDirMaxLength: opts.virtualStoreDirMaxLength,
37
+ locationByDepPath,
38
+ });
39
+ for (const node of Object.values(graph)) {
40
+ const pkgSnapshot = lockfile.packages[node.depPath];
41
+ const allDeps = {
42
+ ...pkgSnapshot.dependencies,
43
+ ...(opts.include.optionalDependencies ? pkgSnapshot.optionalDependencies : {}),
44
+ };
45
+ const peerDeps = pkgSnapshot.peerDependencies ? new Set(Object.keys(pkgSnapshot.peerDependencies)) : null;
46
+ node.children = _getChildrenPaths(allDeps, peerDeps, '.');
47
+ }
48
+ const directDependenciesByImporterId = {};
49
+ for (const importerId of opts.importerIds) {
50
+ const projectSnapshot = lockfile.importers[importerId];
51
+ const rootDeps = {
52
+ ...(opts.include.devDependencies ? projectSnapshot.devDependencies : {}),
53
+ ...(opts.include.dependencies ? projectSnapshot.dependencies : {}),
54
+ ...(opts.include.optionalDependencies ? projectSnapshot.optionalDependencies : {}),
55
+ };
56
+ directDependenciesByImporterId[importerId] = _getChildrenPaths(rootDeps, null, importerId);
57
+ }
58
+ return { graph, directDependenciesByImporterId, injectionTargetsByDepPath };
59
+ }
60
+ async function buildGraphFromPackages(lockfile, currentLockfile, opts) {
61
+ const currentPackages = currentLockfile?.packages ?? {};
62
+ const graph = {};
63
+ const locationByDepPath = {};
64
+ // Only populated for directory deps (injected workspace packages)
65
+ const injectionTargetsByDepPath = new Map();
66
+ const _getPatchInfo = getPatchInfo.bind(null, opts.patchedDependencies);
67
+ const promises = [];
68
+ const pkgSnapshotsWithLocations = iteratePkgsForVirtualStore(lockfile, opts);
69
+ for (const { dirInVirtualStore, pkgMeta } of pkgSnapshotsWithLocations) {
70
+ promises.push((async () => {
71
+ const { pkgIdWithPatchHash, name: pkgName, version: pkgVersion, depPath, pkgSnapshot } = pkgMeta;
72
+ if (opts.skipped.has(depPath))
73
+ return;
74
+ const pkg = {
75
+ name: pkgName,
76
+ version: pkgVersion,
77
+ engines: pkgSnapshot.engines,
78
+ cpu: pkgSnapshot.cpu,
79
+ os: pkgSnapshot.os,
80
+ libc: pkgSnapshot.libc,
81
+ };
82
+ const packageId = packageIdFromSnapshot(depPath, pkgSnapshot);
83
+ if (!opts.force && packageIsInstallable(packageId, pkg, {
84
+ // An incompatibility inside an `optionalDependencies` subtree is
85
+ // reported, not fatal — see `filterLockfileByImportersAndEngine`,
86
+ // which classifies these dep paths.
87
+ engineStrict: opts.engineStrict && pkgSnapshot.optional !== true,
88
+ lockfileDir: opts.lockfileDir,
89
+ nodeVersion: opts.nodeVersion,
90
+ optional: !opts.requiredDepPaths.has(depPath),
91
+ supportedArchitectures: opts.supportedArchitectures,
92
+ }) === false) {
93
+ opts.skipped.add(depPath);
94
+ return;
95
+ }
96
+ const isDirectoryDep = 'directory' in pkgSnapshot.resolution && pkgSnapshot.resolution.directory != null;
97
+ if (isDirectoryDep && opts.ignoreLocalPackages) {
98
+ logger.info({
99
+ message: `Skipping local dependency ${pkgName}@${pkgVersion} (file: protocol)`,
100
+ prefix: opts.lockfileDir,
101
+ });
102
+ return;
103
+ }
104
+ const depIsPresent = !isDirectoryDep &&
105
+ currentPackages[depPath] &&
106
+ equals(currentPackages[depPath].dependencies, pkgSnapshot.dependencies);
107
+ const depIntegrityIsUnchanged = isIntegrityEqual(pkgSnapshot.resolution, currentPackages[depPath]?.resolution);
108
+ const modules = path.join(dirInVirtualStore, 'node_modules');
109
+ // `pkgName` is reconstructed from the (attacker-controllable) lockfile
110
+ // depPath key via `dp.parse`, which does no validation. Contain it here so
111
+ // a traversal name (e.g. `../../../tmp/x`) can't make the package import
112
+ // escape the virtual store. Mirrors the guard on the hoisted linker.
113
+ const dir = safeJoinModulesDir(modules, pkgName);
114
+ locationByDepPath[depPath] = dir;
115
+ // Track directory deps for injected workspace packages
116
+ if (isDirectoryDep) {
117
+ injectionTargetsByDepPath.set(depPath, [dir]);
118
+ }
119
+ // In GVS mode, packages that are allowed to build may have a .pnpm-needs-build
120
+ // marker indicating a previous build failed or was interrupted. When the
121
+ // marker is present, skip the fast path to force a re-fetch/re-import/re-build.
122
+ const mightNeedBuild = opts.enableGlobalVirtualStore &&
123
+ opts.allowBuild?.(depPath) === true;
124
+ let dirExists;
125
+ if (depIsPresent &&
126
+ depIntegrityIsUnchanged &&
127
+ isEmpty(currentPackages[depPath].optionalDependencies ?? {}) &&
128
+ isEmpty(pkgSnapshot.optionalDependencies ?? {}) &&
129
+ !opts.includeUnchangedDeps) {
130
+ dirExists = await pathExists(dir);
131
+ if (dirExists) {
132
+ if (!(mightNeedBuild && fs.existsSync(path.join(dir, '.pnpm-needs-build'))))
133
+ return;
134
+ }
135
+ else {
136
+ brokenModulesLogger.debug({ missing: dir });
137
+ }
138
+ }
139
+ let fetchResponse;
140
+ if (depIsPresent && depIntegrityIsUnchanged && equals(currentPackages[depPath].optionalDependencies, pkgSnapshot.optionalDependencies)) {
141
+ if (dirExists ?? await pathExists(dir)) {
142
+ if (!(mightNeedBuild && fs.existsSync(path.join(dir, '.pnpm-needs-build')))) {
143
+ fetchResponse = {};
144
+ }
145
+ }
146
+ else {
147
+ brokenModulesLogger.debug({ missing: dir });
148
+ }
149
+ }
150
+ if (!fetchResponse && opts.enableGlobalVirtualStore && !isDirectoryDep
151
+ && !opts.force) {
152
+ if (dirExists ?? await pathExists(dir)) {
153
+ if (!(mightNeedBuild && fs.existsSync(path.join(dir, '.pnpm-needs-build')))) {
154
+ fetchResponse = {};
155
+ }
156
+ }
157
+ }
158
+ if (!fetchResponse) {
159
+ const resolution = pkgSnapshotToResolution(depPath, pkgSnapshot, opts.registries);
160
+ progressLogger.debug({ packageId, requester: opts.lockfileDir, status: 'resolved' });
161
+ try {
162
+ fetchResponse = await opts.storeController.fetchPackage({
163
+ allowBuild: opts.allowBuild,
164
+ force: false,
165
+ lockfileDir: opts.lockfileDir,
166
+ ignoreScripts: opts.ignoreScripts,
167
+ pkg: { name: pkgName, version: pkgVersion, id: packageId, resolution },
168
+ supportedArchitectures: opts.supportedArchitectures,
169
+ });
170
+ }
171
+ catch (err) {
172
+ if (pkgSnapshot.optional)
173
+ return;
174
+ throw err;
175
+ }
176
+ }
177
+ graph[dir] = {
178
+ children: {},
179
+ pkgIdWithPatchHash,
180
+ resolution: pkgSnapshot.resolution,
181
+ depPath,
182
+ dir,
183
+ fetching: fetchResponse.fetching,
184
+ filesIndexFile: fetchResponse.filesIndexFile,
185
+ forceImportPackage: !depIntegrityIsUnchanged,
186
+ hasBin: pkgSnapshot.hasBin === true,
187
+ hasBundledDependencies: pkgSnapshot.bundledDependencies != null,
188
+ modules,
189
+ name: pkgName,
190
+ version: pkgVersion,
191
+ optional: !!pkgSnapshot.optional,
192
+ optionalDependencies: new Set(Object.keys(pkgSnapshot.optionalDependencies ?? {})),
193
+ patch: _getPatchInfo(pkgName, pkgVersion),
194
+ };
195
+ })());
196
+ }
197
+ await Promise.all(promises);
198
+ return { graph, locationByDepPath, injectionTargetsByDepPath };
199
+ }
200
+ function getChildrenPaths(ctx, allDeps, peerDeps, importerId) {
201
+ const children = {};
202
+ for (const [alias, ref] of Object.entries(allDeps)) {
203
+ const childDepPath = dp.refToRelative(ref, alias);
204
+ if (childDepPath === null) {
205
+ children[alias] = path.resolve(ctx.lockfileDir, importerId, ref.slice(5));
206
+ continue;
207
+ }
208
+ const childRelDepPath = dp.refToRelative(ref, alias);
209
+ if (ctx.locationByDepPath[childRelDepPath]) {
210
+ children[alias] = ctx.locationByDepPath[childRelDepPath];
211
+ }
212
+ else if (ctx.graph[childRelDepPath]) {
213
+ children[alias] = ctx.graph[childRelDepPath].dir;
214
+ }
215
+ else if (ref.startsWith('file:')) {
216
+ children[alias] = path.resolve(ctx.lockfileDir, ref.slice(5));
217
+ }
218
+ else if (!ctx.skipped.has(childRelDepPath) && ((peerDeps == null) || !peerDeps.has(alias))) {
219
+ throw new Error(`${childRelDepPath} not found in ${WANTED_LOCKFILE}`);
220
+ }
221
+ }
222
+ return children;
223
+ }
224
+ function isIntegrityEqual(resolutionA, resolutionB) {
225
+ // The LockfileResolution type is a union, but it doesn't have a "tag"
226
+ // field to perform a discriminant match on. Using a type assertion is
227
+ // required to get the integrity field.
228
+ const integrityA = resolutionA?.integrity;
229
+ const integrityB = resolutionB?.integrity;
230
+ return integrityA === integrityB;
231
+ }
232
+ //# sourceMappingURL=lockfileToDepGraph.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnpm/deps.graph-builder",
3
- "version": "1100.0.25",
3
+ "version": "1100.1.0",
4
4
  "description": "A package for building a dependency graph from a lockfile",
5
5
  "keywords": [
6
6
  "pnpm",
@@ -27,20 +27,20 @@
27
27
  "!*.map"
28
28
  ],
29
29
  "dependencies": {
30
- "@pnpm/config.package-is-installable": "1100.0.15",
31
- "@pnpm/constants": "1100.0.0",
32
- "@pnpm/core-loggers": "1100.2.4",
33
- "@pnpm/deps.graph-hasher": "1100.2.11",
34
- "@pnpm/deps.path": "1100.0.10",
35
- "@pnpm/fs.symlink-dependency": "1100.0.13",
36
- "@pnpm/hooks.types": "1100.2.2",
37
- "@pnpm/installing.modules-yaml": "1100.0.11",
38
- "@pnpm/lockfile.fs": "1100.1.13",
39
- "@pnpm/lockfile.utils": "1100.1.4",
40
- "@pnpm/patching.config": "1100.0.11",
41
- "@pnpm/patching.types": "1100.0.0",
42
- "@pnpm/store.controller-types": "1100.1.9",
43
- "@pnpm/types": "1101.5.0",
30
+ "@pnpm/config.package-is-installable": "1100.1.0",
31
+ "@pnpm/constants": "1100.0.1",
32
+ "@pnpm/core-loggers": "1100.3.0",
33
+ "@pnpm/deps.graph-hasher": "1100.2.13",
34
+ "@pnpm/deps.path": "1100.0.12",
35
+ "@pnpm/fs.symlink-dependency": "1100.0.15",
36
+ "@pnpm/hooks.types": "1100.2.4",
37
+ "@pnpm/installing.modules-yaml": "1100.0.13",
38
+ "@pnpm/lockfile.fs": "1100.1.15",
39
+ "@pnpm/lockfile.utils": "1100.1.6",
40
+ "@pnpm/patching.config": "1100.0.13",
41
+ "@pnpm/patching.types": "1100.0.1",
42
+ "@pnpm/store.controller-types": "1100.1.11",
43
+ "@pnpm/types": "1101.7.0",
44
44
  "path-exists": "^5.0.0",
45
45
  "ramda": "npm:@pnpm/ramda@0.28.1"
46
46
  },
@@ -49,9 +49,9 @@
49
49
  },
50
50
  "devDependencies": {
51
51
  "@jest/globals": "30.4.1",
52
- "@pnpm/deps.graph-builder": "1100.0.25",
52
+ "@pnpm/deps.graph-builder": "1100.1.0",
53
53
  "@pnpm/logger": "1100.0.0",
54
- "@types/ramda": "0.31.1"
54
+ "@types/ramda": "0.32.0"
55
55
  },
56
56
  "engines": {
57
57
  "node": ">=22.13"