@vltpkg/graph 0.0.0-15 → 0.0.0-16

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 (77) hide show
  1. package/dist/esm/actual/load.d.ts +26 -2
  2. package/dist/esm/actual/load.d.ts.map +1 -1
  3. package/dist/esm/actual/load.js +97 -69
  4. package/dist/esm/actual/load.js.map +1 -1
  5. package/dist/esm/dependencies.d.ts +10 -2
  6. package/dist/esm/dependencies.d.ts.map +1 -1
  7. package/dist/esm/dependencies.js +63 -0
  8. package/dist/esm/dependencies.js.map +1 -1
  9. package/dist/esm/graph.d.ts +5 -1
  10. package/dist/esm/graph.d.ts.map +1 -1
  11. package/dist/esm/graph.js +30 -4
  12. package/dist/esm/graph.js.map +1 -1
  13. package/dist/esm/ideal/add-nodes.d.ts +3 -0
  14. package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
  15. package/dist/esm/ideal/add-nodes.js.map +1 -1
  16. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  17. package/dist/esm/ideal/append-nodes.js +2 -2
  18. package/dist/esm/ideal/append-nodes.js.map +1 -1
  19. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +0 -2
  20. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  21. package/dist/esm/ideal/build-ideal-from-starting-graph.js +0 -3
  22. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  23. package/dist/esm/ideal/build.d.ts +0 -5
  24. package/dist/esm/ideal/build.d.ts.map +1 -1
  25. package/dist/esm/ideal/build.js +2 -0
  26. package/dist/esm/ideal/build.js.map +1 -1
  27. package/dist/esm/ideal/get-importer-specs.d.ts +1 -6
  28. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  29. package/dist/esm/ideal/get-importer-specs.js +1 -9
  30. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  31. package/dist/esm/install.d.ts.map +1 -1
  32. package/dist/esm/install.js +2 -0
  33. package/dist/esm/install.js.map +1 -1
  34. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  35. package/dist/esm/lockfile/load-nodes.js +10 -3
  36. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  37. package/dist/esm/lockfile/load.d.ts +12 -3
  38. package/dist/esm/lockfile/load.d.ts.map +1 -1
  39. package/dist/esm/lockfile/load.js +14 -4
  40. package/dist/esm/lockfile/load.js.map +1 -1
  41. package/dist/esm/lockfile/save.d.ts +6 -1
  42. package/dist/esm/lockfile/save.d.ts.map +1 -1
  43. package/dist/esm/lockfile/save.js +7 -1
  44. package/dist/esm/lockfile/save.js.map +1 -1
  45. package/dist/esm/lockfile/types.d.ts +3 -1
  46. package/dist/esm/lockfile/types.d.ts.map +1 -1
  47. package/dist/esm/lockfile/types.js.map +1 -1
  48. package/dist/esm/modifiers.d.ts +7 -17
  49. package/dist/esm/modifiers.d.ts.map +1 -1
  50. package/dist/esm/modifiers.js +16 -28
  51. package/dist/esm/modifiers.js.map +1 -1
  52. package/dist/esm/node.d.ts +4 -0
  53. package/dist/esm/node.d.ts.map +1 -1
  54. package/dist/esm/node.js +11 -6
  55. package/dist/esm/node.js.map +1 -1
  56. package/dist/esm/reify/index.d.ts +2 -0
  57. package/dist/esm/reify/index.d.ts.map +1 -1
  58. package/dist/esm/reify/index.js +5 -0
  59. package/dist/esm/reify/index.js.map +1 -1
  60. package/dist/esm/reify/update-importers-package-json.js +1 -1
  61. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  62. package/dist/esm/types.d.ts +3 -0
  63. package/dist/esm/types.d.ts.map +1 -1
  64. package/dist/esm/types.js.map +1 -1
  65. package/dist/esm/visualization/json-output.d.ts +4 -0
  66. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  67. package/dist/esm/visualization/json-output.js +2 -0
  68. package/dist/esm/visualization/json-output.js.map +1 -1
  69. package/dist/esm/visualization/mermaid-output.d.ts +6 -0
  70. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  71. package/dist/esm/visualization/mermaid-output.js +64 -9
  72. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  73. package/package.json +19 -19
  74. package/dist/esm/ideal/check-nodes.d.ts +0 -33
  75. package/dist/esm/ideal/check-nodes.d.ts.map +0 -1
  76. package/dist/esm/ideal/check-nodes.js +0 -42
  77. package/dist/esm/ideal/check-nodes.js.map +0 -1
@@ -1,11 +1,12 @@
1
+ import { Spec } from '@vltpkg/spec';
2
+ import { Graph } from '../graph.ts';
1
3
  import type { DepID } from '@vltpkg/dep-id';
2
4
  import type { PackageJson } from '@vltpkg/package-json';
3
- import { Spec } from '@vltpkg/spec';
4
5
  import type { SpecOptions } from '@vltpkg/spec';
5
6
  import type { Manifest } from '@vltpkg/types';
6
7
  import type { Monorepo } from '@vltpkg/workspaces';
7
8
  import type { Path, PathScurry } from 'path-scurry';
8
- import { Graph } from '../graph.ts';
9
+ import type { GraphModifier } from '../modifiers.ts';
9
10
  export type LoadOptions = SpecOptions & {
10
11
  /**
11
12
  * The project root dirname.
@@ -15,6 +16,10 @@ export type LoadOptions = SpecOptions & {
15
16
  * The project root manifest.
16
17
  */
17
18
  mainManifest?: Manifest;
19
+ /**
20
+ * The graph modifiers helper object.
21
+ */
22
+ modifiers?: GraphModifier;
18
23
  /**
19
24
  * A {@link Monorepo} object, for managing workspaces
20
25
  */
@@ -41,12 +46,31 @@ export type LoadOptions = SpecOptions & {
41
46
  * hidden lockfile at `node_modules/.vlt-lock.json`
42
47
  */
43
48
  skipHiddenLockfile?: boolean;
49
+ /**
50
+ * Load only importers into the graph if the modifiers have changed.
51
+ */
52
+ skipLoadingNodesOnModifiersChange?: boolean;
44
53
  };
45
54
  export type ReadEntry = {
46
55
  alias: string;
47
56
  name: string;
48
57
  realpath: Path;
49
58
  };
59
+ /**
60
+ * The configuration object type as it is saved in the `.vlt/vlt.json`
61
+ */
62
+ export type StoreConfigObject = {
63
+ modifiers: Record<string, string> | undefined;
64
+ };
65
+ /**
66
+ * Checks if a given object is a {@link StoreConfigObject}.
67
+ */
68
+ export declare const isStoreConfigObject: (obj: unknown) => obj is StoreConfigObject;
69
+ /**
70
+ * Returns a {@link StoreConfigObject} from a given object.
71
+ * Throws a TypeError if the object can't be converted.
72
+ */
73
+ export declare const asStoreConfigObject: (obj: unknown) => StoreConfigObject;
50
74
  /**
51
75
  * Returns a {@link DepID} for a given spec and path, if the spec is
52
76
  * path-based or a registry spec, otherwise returns `undefined`.
@@ -1 +1 @@
1
- {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAKnC,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,WAAW,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,IAAI,CAAA;CACf,CAAA;AAUD;;;GAGG;AACH,eAAO,MAAM,cAAc,SACnB,IAAI,QACJ,IAAI,KACT,KAAK,GAAG,SAGQ,CAAA;AA2QnB;;;;GAIG;AACH,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAwD3C,CAAA"}
1
+ {"version":3,"file":"load.d.ts","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAQnC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,KAAK,EACV,aAAa,EAEd,MAAM,iBAAiB,CAAA;AAGxB,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,WAAW,CAAA;IACxB;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;OAEG;IACH,iCAAiC,CAAC,EAAE,OAAO,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,IAAI,CAAA;CACf,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAC9C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,QACzB,OAAO,KACX,GAAG,IAAI,iBAGe,CAAA;AAEzB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,QACzB,OAAO,KACX,iBAKF,CAAA;AAUD;;;GAGG;AACH,eAAO,MAAM,cAAc,SACnB,IAAI,QACJ,IAAI,KACT,KAAK,GAAG,SAGQ,CAAA;AAwRnB;;;;GAIG;AACH,eAAO,MAAM,IAAI,YAAa,WAAW,KAAG,KAwF3C,CAAA"}
@@ -1,10 +1,27 @@
1
- import { asDepID, hydrate, joinDepIDTuple, splitDepID, } from '@vltpkg/dep-id';
1
+ import { asDepID, hydrate, joinDepIDTuple } from '@vltpkg/dep-id';
2
2
  import { Spec } from '@vltpkg/spec';
3
- import { longDependencyTypes } from '@vltpkg/types';
4
- import { shorten } from "../dependencies.js";
3
+ import { graphStep } from '@vltpkg/output';
4
+ import { isObject } from '@vltpkg/types';
5
+ import { shorten, getRawDependencies, getDependencies, } from "../dependencies.js";
5
6
  import { Graph } from "../graph.js";
6
7
  import { loadHidden } from "../lockfile/load.js";
7
- import { graphStep } from '@vltpkg/output';
8
+ import { readFileSync } from 'node:fs';
9
+ /**
10
+ * Checks if a given object is a {@link StoreConfigObject}.
11
+ */
12
+ export const isStoreConfigObject = (obj) => isObject(obj) &&
13
+ Object.prototype.hasOwnProperty.call(obj, 'modifiers') &&
14
+ isObject(obj.modifiers);
15
+ /**
16
+ * Returns a {@link StoreConfigObject} from a given object.
17
+ * Throws a TypeError if the object can't be converted.
18
+ */
19
+ export const asStoreConfigObject = (obj) => {
20
+ if (!isStoreConfigObject(obj)) {
21
+ throw new TypeError(`Expected a store config object, got ${obj}`);
22
+ }
23
+ return obj;
24
+ };
8
25
  // path-based refer to the types of dependencies that are directly linked to
9
26
  // their real location in the file system and thus will not have an entry
10
27
  // in the `node_modules/.vlt` store
@@ -33,47 +50,25 @@ const findNodeModules = ({ parent, name, isCWD, }) => parent?.name === 'node_mod
33
50
  * Retrieves the scoped-normalized package name from its {@link Path}.
34
51
  */
35
52
  const findName = ({ parent, name }) => parent?.name.startsWith('@') ? `${parent.name}/${name}` : name;
36
- const isStringArray = (a) => Array.isArray(a) && !a.some(b => typeof b !== 'string');
37
- /*
38
- * Retrieves a map of all dependencies, of all types, that can be iterated
39
- * on and consulted when parsing the directory contents of the current node.
53
+ /**
54
+ * Helper function that gets a modified {@link Spec} when finding a modifier
55
+ * that applies to a given dependency. Otherwise returns the original spec
56
+ * value and no queryModifier.
40
57
  */
41
- const getDeps = (node) => {
42
- const dependencies = new Map();
43
- const bundleDeps = node.manifest?.bundleDependencies ?? [];
44
- // if it's an importer, bundleDeps are just normal. if it's a dep,
45
- // then they're ignored entirely.
46
- const bundled = (!node.importer &&
47
- !node.id.startsWith('git') &&
48
- isStringArray(bundleDeps)) ?
49
- new Set(bundleDeps)
50
- : new Set();
51
- for (const depType of longDependencyTypes) {
52
- const obj = node.manifest?.[depType];
53
- // only care about devDeps for importers and git or symlink deps
54
- // technically this will also include devDeps for tarball file: specs,
55
- // but that is likely rare enough to not worry about too much.
56
- if (depType === 'devDependencies' &&
57
- !node.importer &&
58
- !node.id.startsWith('git') &&
59
- !node.id.startsWith('file')) {
60
- continue;
61
- }
62
- if (obj) {
63
- for (const [name, bareSpec] of Object.entries(obj)) {
64
- // if it's a bundled dependency, we just ignore it entirely.
65
- if (bundled.has(name))
66
- continue;
67
- dependencies.set(name, {
68
- name,
69
- type: depType,
70
- bareSpec,
71
- registry: node.registry,
72
- });
73
- }
74
- }
58
+ const maybeApplyModifierToSpec = (spec, depName, modifierRefs) => {
59
+ const activeModifier = modifierRefs?.get(depName);
60
+ const queryModifier = activeModifier?.modifier.query;
61
+ const completeModifier = activeModifier &&
62
+ activeModifier.interactiveBreadcrumb.current ===
63
+ activeModifier.modifier.breadcrumb.last;
64
+ if (queryModifier &&
65
+ completeModifier &&
66
+ 'spec' in activeModifier.modifier) {
67
+ const modifiedSpec = activeModifier.modifier.spec;
68
+ modifiedSpec.overridden = true;
69
+ return { spec: modifiedSpec, queryModifier };
75
70
  }
76
- return dependencies;
71
+ return { spec, queryModifier };
77
72
  };
78
73
  /**
79
74
  * Reads the current directory defined at `currDir` and looks for folder
@@ -122,10 +117,14 @@ const readDir = (scurry, currDir, fromNodeName) => {
122
117
  * as dependencies of `fromNode`, building the instantiated `graph`.
123
118
  */
124
119
  const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, currDir) => {
125
- const { loadManifests } = options;
126
- const dependencies = getDeps(fromNode);
120
+ const { loadManifests, modifiers } = options;
121
+ const dependencies = getRawDependencies(fromNode);
127
122
  const seenDeps = new Set();
128
123
  const readItems = readDir(scurry, currDir, fromNode.name);
124
+ // Get modifier references for this node's dependencies
125
+ const modifierRefs = modifiers?.tryDependencies(fromNode, [
126
+ ...getDependencies(fromNode, options).values(),
127
+ ]);
129
128
  for (const { alias, name, realpath } of readItems) {
130
129
  let node;
131
130
  // tracks what dependencies have been seen
@@ -136,10 +135,13 @@ const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, curr
136
135
  if (!loadManifests) {
137
136
  const depId = findDepID(realpath);
138
137
  if (depId) {
139
- const h = hydrate(depId, alias, {
138
+ let h = hydrate(depId, alias, {
140
139
  ...options,
141
140
  registry: fromNode.registry,
142
141
  });
142
+ // Check for active modifiers and replace spec even when not loading manifests
143
+ const { spec: modifiedSpec, queryModifier } = maybeApplyModifierToSpec(h, alias, modifierRefs);
144
+ h = modifiedSpec;
143
145
  // graphs build with no manifest have no notion of
144
146
  // dependency types and or spec definitions since those
145
147
  // would have to be parsed from a manifest
@@ -150,7 +152,12 @@ const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, curr
150
152
  ...(h.registrySpec ?
151
153
  { version: h.registrySpec } // adds version if available
152
154
  : null),
153
- }, depId);
155
+ }, depId, queryModifier);
156
+ // Update active entry after placing package
157
+ const activeModifier = modifierRefs?.get(alias);
158
+ if (activeModifier && node) {
159
+ modifiers?.updateActiveEntry(node, activeModifier);
160
+ }
154
161
  }
155
162
  }
156
163
  // retrieve references to the current folder name found in `fromNode`
@@ -168,21 +175,20 @@ const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, curr
168
175
  const type = deps?.type || 'dependencies';
169
176
  const bareSpec = deps?.bareSpec || '*';
170
177
  const depType = shorten(type, alias, fromNode.manifest);
171
- const spec = Spec.parse(alias, bareSpec, {
178
+ let spec = Spec.parse(alias, bareSpec, {
172
179
  ...options,
173
180
  registry: fromNode.registry,
174
181
  });
182
+ // Check for active modifiers and replace spec if a modifier is complete
183
+ const { spec: modifiedSpec, queryModifier } = maybeApplyModifierToSpec(spec, alias, modifierRefs);
184
+ spec = modifiedSpec;
175
185
  const maybeId = getPathBasedId(spec, realpath);
176
- // retrieves the extra information from the depID if one is available
177
- let extra;
178
- if (maybeId) {
179
- const [type, , maybeExtra, lastExtra] = splitDepID(maybeId);
180
- extra =
181
- type === 'registry' || type === 'git' ?
182
- lastExtra
183
- : maybeExtra;
186
+ node = graph.placePackage(fromNode, depType, spec, mani, maybeId, queryModifier);
187
+ // Update active entry after placing package
188
+ const activeModifier = modifierRefs?.get(alias);
189
+ if (activeModifier && node) {
190
+ modifiers?.updateActiveEntry(node, activeModifier);
184
191
  }
185
- node = graph.placePackage(fromNode, depType, spec, mani, maybeId, extra);
186
192
  }
187
193
  if (node) {
188
194
  // If a found dependency is not declared in any of the original
@@ -213,11 +219,14 @@ const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, curr
213
219
  for (const { name, type, bareSpec } of dependencies.values()) {
214
220
  if (!seenDeps.has(name)) {
215
221
  const depType = shorten(type, name, fromNode.manifest);
216
- const spec = Spec.parse(name, bareSpec, {
222
+ let spec = Spec.parse(name, bareSpec, {
217
223
  ...options,
218
224
  registry: fromNode.registry,
219
225
  });
220
- graph.placePackage(fromNode, depType, spec);
226
+ // Check for active modifiers and replace spec for missing dependencies
227
+ const { spec: modifiedSpec, queryModifier } = maybeApplyModifierToSpec(spec, name, modifierRefs);
228
+ spec = modifiedSpec;
229
+ graph.placePackage(fromNode, depType, spec, undefined, undefined, queryModifier);
221
230
  }
222
231
  }
223
232
  };
@@ -229,7 +238,7 @@ const parseDir = (options, scurry, packageJson, depsFound, graph, fromNode, curr
229
238
  export const load = (options) => {
230
239
  const done = graphStep('actual');
231
240
  // TODO: once hidden lockfile is more reliable, default to false here
232
- const { skipHiddenLockfile = true, projectRoot, packageJson, scurry, monorepo, } = options;
241
+ const { modifiers, monorepo, projectRoot, packageJson, scurry, skipHiddenLockfile = true, skipLoadingNodesOnModifiersChange = false, } = options;
233
242
  const mainManifest = options.mainManifest ?? packageJson.read(projectRoot);
234
243
  if (!skipHiddenLockfile) {
235
244
  try {
@@ -246,16 +255,35 @@ export const load = (options) => {
246
255
  catch { }
247
256
  }
248
257
  const graph = new Graph({ ...options, mainManifest });
249
- const depsFound = new Map();
250
- // starts the list of initial folders to parse using the importer nodes
251
- for (const importer of graph.importers) {
252
- depsFound.set(importer, scurry.cwd.resolve(`${importer.location}/node_modules`));
258
+ // retrieve the configuration object from the store
259
+ let storeConfig = { modifiers: undefined };
260
+ try {
261
+ storeConfig = asStoreConfigObject(JSON.parse(readFileSync(scurry.resolve('node_modules/.vlt/vlt.json'), 'utf8')));
253
262
  }
254
- // breadth-first traversal of the file system tree reading deps found
255
- // starting from the node_modules folder of every importer in order to
256
- // find the actual installed dependencies at each location
257
- for (const [node, path] of depsFound.entries()) {
258
- parseDir(options, scurry, packageJson, depsFound, graph, node, path);
263
+ catch { }
264
+ const storeModifiers = JSON.stringify(storeConfig.modifiers ?? {});
265
+ const optionsModifiers = JSON.stringify(modifiers?.config);
266
+ const modifiersChanged = storeModifiers !== optionsModifiers;
267
+ const shouldLoadDependencies = !(skipLoadingNodesOnModifiersChange && modifiersChanged);
268
+ // will only skip loading dependencies if the
269
+ // skipLoadingNodesOnModifiersChange option is set to true
270
+ // and the current modifiers have not changed when compared
271
+ // to the modifiers stored in the `node_modules/.vlt/vlt.json` store config
272
+ if (shouldLoadDependencies) {
273
+ const depsFound = new Map();
274
+ // starts the list of initial folders to parse using the importer nodes
275
+ for (const importer of graph.importers) {
276
+ modifiers?.tryImporter(importer);
277
+ depsFound.set(importer, scurry.cwd.resolve(`${importer.location}/node_modules`));
278
+ }
279
+ // breadth-first traversal of the file system tree reading deps found
280
+ // starting from the node_modules folder of every importer in order to
281
+ // find the actual installed dependencies at each location
282
+ for (const [node, path] of depsFound.entries()) {
283
+ parseDir(options, scurry, packageJson, depsFound, graph, node, path);
284
+ }
285
+ // Clean up any pending modifier entries that were never completed
286
+ modifiers?.rollbackActiveEntries();
259
287
  }
260
288
  done();
261
289
  return graph;
@@ -1 +1 @@
1
- {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n asDepID,\n hydrate,\n joinDepIDTuple,\n splitDepID,\n} from '@vltpkg/dep-id'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport { Spec } from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type { Manifest } from '@vltpkg/types'\nimport type { Monorepo } from '@vltpkg/workspaces'\nimport type { Path, PathScurry } from 'path-scurry'\nimport { shorten } from '../dependencies.ts'\nimport type { RawDependency } from '../dependencies.ts'\nimport { Graph } from '../graph.ts'\nimport { loadHidden } from '../lockfile/load.ts'\nimport type { Node } from '../node.ts'\nimport { graphStep } from '@vltpkg/output'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest?: Manifest\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry: PathScurry\n /**\n * If set to `false`, `actual.load` will not load any `package.json`\n * files while traversing the file system.\n *\n * The resulting {@link Graph} from loading with `loadManifests=false`\n * has no information on dependency types or the specs defined and\n * no information on missing and extraneous dependencies.\n */\n loadManifests?: boolean\n /**\n * If set to `true`, then do not shortcut the process by reading the\n * hidden lockfile at `node_modules/.vlt-lock.json`\n */\n skipHiddenLockfile?: boolean\n}\n\nexport type ReadEntry = {\n alias: string\n name: string\n realpath: Path\n}\n\n// path-based refer to the types of dependencies that are directly linked to\n// their real location in the file system and thus will not have an entry\n// in the `node_modules/.vlt` store\nconst pathBasedType = new Set(['file', 'workspace'])\nconst isPathBasedType = (\n type: string,\n): type is 'file' | 'workspace' => pathBasedType.has(type)\n\n/**\n * Returns a {@link DepID} for a given spec and path, if the spec is\n * path-based or a registry spec, otherwise returns `undefined`.\n */\nexport const getPathBasedId = (\n spec: Spec,\n path: Path,\n): DepID | undefined =>\n isPathBasedType(spec.type) ?\n joinDepIDTuple([spec.type, path.relativePosix()])\n : findDepID(path)\n\n/**\n * Retrieve the {@link DepID} for a given package from its location.\n */\nconst findDepID = ({ parent, name }: Path): DepID | undefined =>\n parent?.name === '.vlt' ? asDepID(name)\n : parent?.isCWD === false ? findDepID(parent)\n : undefined\n\n/**\n * Retrieves the closest `node_modules` parent {@link Path} found.\n */\nconst findNodeModules = ({\n parent,\n name,\n isCWD,\n}: Path): Path | undefined =>\n parent?.name === 'node_modules' ? parent\n : parent && name !== '.vlt' && !isCWD ? findNodeModules(parent)\n : undefined\n\n/**\n * Retrieves the scoped-normalized package name from its {@link Path}.\n */\nconst findName = ({ parent, name }: Path): string =>\n parent?.name.startsWith('@') ? `${parent.name}/${name}` : name\n\nconst isStringArray = (a: unknown): a is string[] =>\n Array.isArray(a) && !a.some(b => typeof b !== 'string')\n\n/*\n * Retrieves a map of all dependencies, of all types, that can be iterated\n * on and consulted when parsing the directory contents of the current node.\n */\nconst getDeps = (node: Node) => {\n const dependencies = new Map<string, RawDependency>()\n const bundleDeps: unknown = node.manifest?.bundleDependencies ?? []\n // if it's an importer, bundleDeps are just normal. if it's a dep,\n // then they're ignored entirely.\n const bundled =\n (\n !node.importer &&\n !node.id.startsWith('git') &&\n isStringArray(bundleDeps)\n ) ?\n new Set(bundleDeps)\n : new Set<string>()\n for (const depType of longDependencyTypes) {\n const obj: Record<string, string> | undefined =\n node.manifest?.[depType]\n // only care about devDeps for importers and git or symlink deps\n // technically this will also include devDeps for tarball file: specs,\n // but that is likely rare enough to not worry about too much.\n if (\n depType === 'devDependencies' &&\n !node.importer &&\n !node.id.startsWith('git') &&\n !node.id.startsWith('file')\n ) {\n continue\n }\n if (obj) {\n for (const [name, bareSpec] of Object.entries(obj)) {\n // if it's a bundled dependency, we just ignore it entirely.\n if (bundled.has(name)) continue\n dependencies.set(name, {\n name,\n type: depType,\n bareSpec,\n registry: node.registry,\n })\n }\n }\n }\n return dependencies\n}\n\n/**\n * Reads the current directory defined at `currDir` and looks for folder\n * names and their realpath resolution, normalizing scoped package names\n * and removing any invalid symlinks from the list of items that should\n * be parsed through in order to build the graph.\n */\nconst readDir = (\n scurry: PathScurry,\n currDir: Path,\n fromNodeName?: string,\n) => {\n const res = new Set<ReadEntry>()\n for (const entry of scurry.readdirSync(currDir)) {\n // ignore any hidden files / folders\n if (entry.name.startsWith('.')) continue\n\n // scope folder found, it will need to be read and iterated over\n // in order to find any scoped packages inside\n if (entry.name.startsWith('@')) {\n const scopedItems = readDir(scurry, entry, fromNodeName)\n for (const scopedItem of scopedItems) {\n res.add(scopedItem)\n }\n continue\n }\n\n // skip anything that isn't a symlink, it's not an edge\n if (!entry.isSymbolicLink()) continue\n\n // we'll need to learn what is the real path for this entry in order\n // to retrieve the `location` and `id` properties for the node, if a\n // realpath is not found just move on to the next element\n const realpath = entry.realpathSync()\n if (!realpath) {\n continue\n }\n\n // infer both the alias and proper package names, including scopes\n const alias = findName(entry)\n const name = findName(realpath)\n res.add({\n alias,\n name,\n realpath,\n })\n }\n return res\n}\n\n/**\n * Parses the files located at `currDir` and place packages found inside\n * as dependencies of `fromNode`, building the instantiated `graph`.\n */\nconst parseDir = (\n options: LoadOptions,\n scurry: PathScurry,\n packageJson: PackageJson,\n depsFound: Map<Node, Path>,\n graph: Graph,\n fromNode: Node,\n currDir: Path,\n) => {\n const { loadManifests } = options\n const dependencies = getDeps(fromNode)\n const seenDeps = new Set<string>()\n const readItems: Set<ReadEntry> = readDir(\n scurry,\n currDir,\n fromNode.name,\n )\n\n for (const { alias, name, realpath } of readItems) {\n let node\n\n // tracks what dependencies have been seen\n // so that we can mark missing dependencies\n seenDeps.add(alias)\n\n // places the package in the graph reading\n // its manifest only if necessary\n if (!loadManifests) {\n const depId = findDepID(realpath)\n\n if (depId) {\n const h = hydrate(depId, alias, {\n ...options,\n registry: fromNode.registry,\n })\n\n // graphs build with no manifest have no notion of\n // dependency types and or spec definitions since those\n // would have to be parsed from a manifest\n node = graph.placePackage(\n fromNode,\n 'prod', // defaults to prod deps\n h, // uses spec from hydrated id\n {\n name,\n ...(h.registrySpec ?\n { version: h.registrySpec } // adds version if available\n : null),\n },\n depId,\n )\n }\n }\n\n // retrieve references to the current folder name found in `fromNode`\n // manifest listed dependencies, removing it from the map will leave\n // a list of missing dependencies at the end of the iteration\n const deps = dependencies.get(alias)\n\n // in case this graph is skipping manifests, this next block might\n // still need to execute, thus actually loading a manifest file, for\n // edge-cases such as loading a linked node that is not going to have\n // DepID info available in its realpath or extraneous nodes\n if (!node) {\n const mani = packageJson.read(realpath.fullpath())\n // declares fallback default values for both depType and bareSpec\n // in order to support loadManifests=false fallback for link nodes\n const type = deps?.type || 'dependencies'\n const bareSpec = deps?.bareSpec || '*'\n\n const depType = shorten(type, alias, fromNode.manifest)\n const spec = Spec.parse(alias, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n const maybeId = getPathBasedId(spec, realpath)\n // retrieves the extra information from the depID if one is available\n let extra\n if (maybeId) {\n const [type, , maybeExtra, lastExtra] = splitDepID(maybeId)\n extra =\n type === 'registry' || type === 'git' ?\n lastExtra\n : maybeExtra\n }\n node = graph.placePackage(\n fromNode,\n depType,\n spec,\n mani,\n maybeId,\n extra,\n )\n }\n\n if (node) {\n // If a found dependency is not declared in any of the original\n // node dependencies, then add an edge to the graph pointing to it\n // and mark it as extraneous.\n //\n // This only makes sense if full manifests are being loaded\n // so that we have reference to dependencies info.\n if (loadManifests && !deps) {\n const [edge] = node.edgesIn\n if (edge) {\n graph.extraneousDependencies.add(edge)\n }\n }\n\n // for a succesfully created node, add its location\n // property and queue up to read its dependencies\n node.location = `./${realpath.relativePosix()}`\n const node_modules = findNodeModules(realpath)\n\n // queue items up to continue parsing dirs in case a node was succesfully\n // placed in the graph and its node_modules folder was correctly found\n if (node_modules) {\n depsFound.set(node, node_modules)\n }\n }\n }\n\n // any remaining dependencies that have not been found\n // when reading the directory should be marked as missing\n for (const { name, type, bareSpec } of dependencies.values()) {\n if (!seenDeps.has(name)) {\n const depType = shorten(type, name, fromNode.manifest)\n const spec = Spec.parse(name, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n graph.placePackage(fromNode, depType, spec)\n }\n }\n}\n\n/**\n * Read the file system looking for `node_modules` folders and\n * returns a new {@link Graph} that represents the relationship\n * between the dependencies found.\n */\nexport const load = (options: LoadOptions): Graph => {\n const done = graphStep('actual')\n // TODO: once hidden lockfile is more reliable, default to false here\n const {\n skipHiddenLockfile = true,\n projectRoot,\n packageJson,\n scurry,\n monorepo,\n } = options\n const mainManifest =\n options.mainManifest ?? packageJson.read(projectRoot)\n\n if (!skipHiddenLockfile) {\n try {\n const graph = loadHidden({\n projectRoot,\n mainManifest,\n packageJson,\n monorepo,\n scurry,\n })\n // TODO: check mtime of lockfile vs .vlt folder\n return graph\n } catch {}\n }\n\n const graph = new Graph({ ...options, mainManifest })\n const depsFound = new Map<Node, Path>()\n\n // starts the list of initial folders to parse using the importer nodes\n for (const importer of graph.importers) {\n depsFound.set(\n importer,\n scurry.cwd.resolve(`${importer.location}/node_modules`),\n )\n }\n\n // breadth-first traversal of the file system tree reading deps found\n // starting from the node_modules folder of every importer in order to\n // find the actual installed dependencies at each location\n for (const [node, path] of depsFound.entries()) {\n parseDir(\n options,\n scurry,\n packageJson,\n depsFound,\n graph,\n node,\n path,\n )\n }\n\n done()\n\n return graph\n}\n"]}
1
+ {"version":3,"file":"load.js","sourceRoot":"","sources":["../../../src/actual/load.ts"],"names":[],"mappings":"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","sourcesContent":["import { asDepID, hydrate, joinDepIDTuple } from '@vltpkg/dep-id'\nimport { Spec } from '@vltpkg/spec'\nimport { graphStep } from '@vltpkg/output'\nimport { isObject } from '@vltpkg/types'\nimport {\n shorten,\n getRawDependencies,\n getDependencies,\n} from '../dependencies.ts'\nimport { Graph } from '../graph.ts'\nimport { loadHidden } from '../lockfile/load.ts'\nimport type { DepID } from '@vltpkg/dep-id'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type { Manifest } from '@vltpkg/types'\nimport type { Monorepo } from '@vltpkg/workspaces'\nimport type { Path, PathScurry } from 'path-scurry'\nimport type { Node } from '../node.ts'\nimport type {\n GraphModifier,\n ModifierActiveEntry,\n} from '../modifiers.ts'\nimport { readFileSync } from 'node:fs'\n\nexport type LoadOptions = SpecOptions & {\n /**\n * The project root dirname.\n */\n projectRoot: string\n /**\n * The project root manifest.\n */\n mainManifest?: Manifest\n /**\n * The graph modifiers helper object.\n */\n modifiers?: GraphModifier\n /**\n * A {@link Monorepo} object, for managing workspaces\n */\n monorepo?: Monorepo\n /**\n * A {@link PackageJson} object, for sharing manifest caches\n */\n packageJson: PackageJson\n /**\n * A {@link PathScurry} object, for use in globs\n */\n scurry: PathScurry\n /**\n * If set to `false`, `actual.load` will not load any `package.json`\n * files while traversing the file system.\n *\n * The resulting {@link Graph} from loading with `loadManifests=false`\n * has no information on dependency types or the specs defined and\n * no information on missing and extraneous dependencies.\n */\n loadManifests?: boolean\n /**\n * If set to `true`, then do not shortcut the process by reading the\n * hidden lockfile at `node_modules/.vlt-lock.json`\n */\n skipHiddenLockfile?: boolean\n /**\n * Load only importers into the graph if the modifiers have changed.\n */\n skipLoadingNodesOnModifiersChange?: boolean\n}\n\nexport type ReadEntry = {\n alias: string\n name: string\n realpath: Path\n}\n\n/**\n * The configuration object type as it is saved in the `.vlt/vlt.json`\n */\nexport type StoreConfigObject = {\n modifiers: Record<string, string> | undefined\n}\n\n/**\n * Checks if a given object is a {@link StoreConfigObject}.\n */\nexport const isStoreConfigObject = (\n obj: unknown,\n): obj is StoreConfigObject =>\n isObject(obj) &&\n Object.prototype.hasOwnProperty.call(obj, 'modifiers') &&\n isObject(obj.modifiers)\n\n/**\n * Returns a {@link StoreConfigObject} from a given object.\n * Throws a TypeError if the object can't be converted.\n */\nexport const asStoreConfigObject = (\n obj: unknown,\n): StoreConfigObject => {\n if (!isStoreConfigObject(obj)) {\n throw new TypeError(`Expected a store config object, got ${obj}`)\n }\n return obj\n}\n\n// path-based refer to the types of dependencies that are directly linked to\n// their real location in the file system and thus will not have an entry\n// in the `node_modules/.vlt` store\nconst pathBasedType = new Set(['file', 'workspace'])\nconst isPathBasedType = (\n type: string,\n): type is 'file' | 'workspace' => pathBasedType.has(type)\n\n/**\n * Returns a {@link DepID} for a given spec and path, if the spec is\n * path-based or a registry spec, otherwise returns `undefined`.\n */\nexport const getPathBasedId = (\n spec: Spec,\n path: Path,\n): DepID | undefined =>\n isPathBasedType(spec.type) ?\n joinDepIDTuple([spec.type, path.relativePosix()])\n : findDepID(path)\n\n/**\n * Retrieve the {@link DepID} for a given package from its location.\n */\nconst findDepID = ({ parent, name }: Path): DepID | undefined =>\n parent?.name === '.vlt' ? asDepID(name)\n : parent?.isCWD === false ? findDepID(parent)\n : undefined\n\n/**\n * Retrieves the closest `node_modules` parent {@link Path} found.\n */\nconst findNodeModules = ({\n parent,\n name,\n isCWD,\n}: Path): Path | undefined =>\n parent?.name === 'node_modules' ? parent\n : parent && name !== '.vlt' && !isCWD ? findNodeModules(parent)\n : undefined\n\n/**\n * Retrieves the scoped-normalized package name from its {@link Path}.\n */\nconst findName = ({ parent, name }: Path): string =>\n parent?.name.startsWith('@') ? `${parent.name}/${name}` : name\n\n/**\n * Helper function that gets a modified {@link Spec} when finding a modifier\n * that applies to a given dependency. Otherwise returns the original spec\n * value and no queryModifier.\n */\nconst maybeApplyModifierToSpec = (\n spec: Spec,\n depName: string,\n modifierRefs?: Map<string, ModifierActiveEntry>,\n): { spec: Spec; queryModifier?: string } => {\n const activeModifier = modifierRefs?.get(depName)\n const queryModifier = activeModifier?.modifier.query\n const completeModifier =\n activeModifier &&\n activeModifier.interactiveBreadcrumb.current ===\n activeModifier.modifier.breadcrumb.last\n\n if (\n queryModifier &&\n completeModifier &&\n 'spec' in activeModifier.modifier\n ) {\n const modifiedSpec = activeModifier.modifier.spec\n modifiedSpec.overridden = true\n return { spec: modifiedSpec, queryModifier }\n }\n\n return { spec, queryModifier }\n}\n\n/**\n * Reads the current directory defined at `currDir` and looks for folder\n * names and their realpath resolution, normalizing scoped package names\n * and removing any invalid symlinks from the list of items that should\n * be parsed through in order to build the graph.\n */\nconst readDir = (\n scurry: PathScurry,\n currDir: Path,\n fromNodeName?: string,\n) => {\n const res = new Set<ReadEntry>()\n for (const entry of scurry.readdirSync(currDir)) {\n // ignore any hidden files / folders\n if (entry.name.startsWith('.')) continue\n\n // scope folder found, it will need to be read and iterated over\n // in order to find any scoped packages inside\n if (entry.name.startsWith('@')) {\n const scopedItems = readDir(scurry, entry, fromNodeName)\n for (const scopedItem of scopedItems) {\n res.add(scopedItem)\n }\n continue\n }\n\n // skip anything that isn't a symlink, it's not an edge\n if (!entry.isSymbolicLink()) continue\n\n // we'll need to learn what is the real path for this entry in order\n // to retrieve the `location` and `id` properties for the node, if a\n // realpath is not found just move on to the next element\n const realpath = entry.realpathSync()\n if (!realpath) {\n continue\n }\n\n // infer both the alias and proper package names, including scopes\n const alias = findName(entry)\n const name = findName(realpath)\n res.add({\n alias,\n name,\n realpath,\n })\n }\n return res\n}\n\n/**\n * Parses the files located at `currDir` and place packages found inside\n * as dependencies of `fromNode`, building the instantiated `graph`.\n */\nconst parseDir = (\n options: LoadOptions,\n scurry: PathScurry,\n packageJson: PackageJson,\n depsFound: Map<Node, Path>,\n graph: Graph,\n fromNode: Node,\n currDir: Path,\n) => {\n const { loadManifests, modifiers } = options\n const dependencies = getRawDependencies(fromNode)\n const seenDeps = new Set<string>()\n const readItems: Set<ReadEntry> = readDir(\n scurry,\n currDir,\n fromNode.name,\n )\n\n // Get modifier references for this node's dependencies\n const modifierRefs = modifiers?.tryDependencies(fromNode, [\n ...getDependencies(fromNode, options).values(),\n ])\n\n for (const { alias, name, realpath } of readItems) {\n let node\n\n // tracks what dependencies have been seen\n // so that we can mark missing dependencies\n seenDeps.add(alias)\n\n // places the package in the graph reading\n // its manifest only if necessary\n if (!loadManifests) {\n const depId = findDepID(realpath)\n\n if (depId) {\n let h = hydrate(depId, alias, {\n ...options,\n registry: fromNode.registry,\n })\n\n // Check for active modifiers and replace spec even when not loading manifests\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(h, alias, modifierRefs)\n h = modifiedSpec\n\n // graphs build with no manifest have no notion of\n // dependency types and or spec definitions since those\n // would have to be parsed from a manifest\n node = graph.placePackage(\n fromNode,\n 'prod', // defaults to prod deps\n h, // uses spec from hydrated id\n {\n name,\n ...(h.registrySpec ?\n { version: h.registrySpec } // adds version if available\n : null),\n },\n depId,\n queryModifier,\n )\n\n // Update active entry after placing package\n const activeModifier = modifierRefs?.get(alias)\n if (activeModifier && node) {\n modifiers?.updateActiveEntry(node, activeModifier)\n }\n }\n }\n\n // retrieve references to the current folder name found in `fromNode`\n // manifest listed dependencies, removing it from the map will leave\n // a list of missing dependencies at the end of the iteration\n const deps = dependencies.get(alias)\n\n // in case this graph is skipping manifests, this next block might\n // still need to execute, thus actually loading a manifest file, for\n // edge-cases such as loading a linked node that is not going to have\n // DepID info available in its realpath or extraneous nodes\n if (!node) {\n const mani = packageJson.read(realpath.fullpath())\n // declares fallback default values for both depType and bareSpec\n // in order to support loadManifests=false fallback for link nodes\n const type = deps?.type || 'dependencies'\n const bareSpec = deps?.bareSpec || '*'\n\n const depType = shorten(type, alias, fromNode.manifest)\n let spec = Spec.parse(alias, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n\n // Check for active modifiers and replace spec if a modifier is complete\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(spec, alias, modifierRefs)\n spec = modifiedSpec\n\n const maybeId = getPathBasedId(spec, realpath)\n node = graph.placePackage(\n fromNode,\n depType,\n spec,\n mani,\n maybeId,\n queryModifier,\n )\n\n // Update active entry after placing package\n const activeModifier = modifierRefs?.get(alias)\n if (activeModifier && node) {\n modifiers?.updateActiveEntry(node, activeModifier)\n }\n }\n\n if (node) {\n // If a found dependency is not declared in any of the original\n // node dependencies, then add an edge to the graph pointing to it\n // and mark it as extraneous.\n //\n // This only makes sense if full manifests are being loaded\n // so that we have reference to dependencies info.\n if (loadManifests && !deps) {\n const [edge] = node.edgesIn\n if (edge) {\n graph.extraneousDependencies.add(edge)\n }\n }\n\n // for a succesfully created node, add its location\n // property and queue up to read its dependencies\n node.location = `./${realpath.relativePosix()}`\n const node_modules = findNodeModules(realpath)\n\n // queue items up to continue parsing dirs in case a node was succesfully\n // placed in the graph and its node_modules folder was correctly found\n if (node_modules) {\n depsFound.set(node, node_modules)\n }\n }\n }\n\n // any remaining dependencies that have not been found\n // when reading the directory should be marked as missing\n for (const { name, type, bareSpec } of dependencies.values()) {\n if (!seenDeps.has(name)) {\n const depType = shorten(type, name, fromNode.manifest)\n let spec = Spec.parse(name, bareSpec, {\n ...options,\n registry: fromNode.registry,\n })\n\n // Check for active modifiers and replace spec for missing dependencies\n const { spec: modifiedSpec, queryModifier } =\n maybeApplyModifierToSpec(spec, name, modifierRefs)\n spec = modifiedSpec\n\n graph.placePackage(\n fromNode,\n depType,\n spec,\n undefined,\n undefined,\n queryModifier,\n )\n }\n }\n}\n\n/**\n * Read the file system looking for `node_modules` folders and\n * returns a new {@link Graph} that represents the relationship\n * between the dependencies found.\n */\nexport const load = (options: LoadOptions): Graph => {\n const done = graphStep('actual')\n // TODO: once hidden lockfile is more reliable, default to false here\n const {\n modifiers,\n monorepo,\n projectRoot,\n packageJson,\n scurry,\n skipHiddenLockfile = true,\n skipLoadingNodesOnModifiersChange = false,\n } = options\n const mainManifest =\n options.mainManifest ?? packageJson.read(projectRoot)\n\n if (!skipHiddenLockfile) {\n try {\n const graph = loadHidden({\n projectRoot,\n mainManifest,\n packageJson,\n monorepo,\n scurry,\n })\n // TODO: check mtime of lockfile vs .vlt folder\n return graph\n } catch {}\n }\n\n const graph = new Graph({ ...options, mainManifest })\n\n // retrieve the configuration object from the store\n let storeConfig: StoreConfigObject = { modifiers: undefined }\n try {\n storeConfig = asStoreConfigObject(\n JSON.parse(\n readFileSync(\n scurry.resolve('node_modules/.vlt/vlt.json'),\n 'utf8',\n ),\n ),\n )\n } catch {}\n const storeModifiers = JSON.stringify(storeConfig.modifiers ?? {})\n const optionsModifiers = JSON.stringify(modifiers?.config)\n const modifiersChanged = storeModifiers !== optionsModifiers\n const shouldLoadDependencies = !(\n skipLoadingNodesOnModifiersChange && modifiersChanged\n )\n\n // will only skip loading dependencies if the\n // skipLoadingNodesOnModifiersChange option is set to true\n // and the current modifiers have not changed when compared\n // to the modifiers stored in the `node_modules/.vlt/vlt.json` store config\n if (shouldLoadDependencies) {\n const depsFound = new Map<Node, Path>()\n\n // starts the list of initial folders to parse using the importer nodes\n for (const importer of graph.importers) {\n modifiers?.tryImporter(importer)\n depsFound.set(\n importer,\n scurry.cwd.resolve(`${importer.location}/node_modules`),\n )\n }\n\n // breadth-first traversal of the file system tree reading deps found\n // starting from the node_modules folder of every importer in order to\n // find the actual installed dependencies at each location\n for (const [node, path] of depsFound.entries()) {\n parseDir(\n options,\n scurry,\n packageJson,\n depsFound,\n graph,\n node,\n path,\n )\n }\n\n // Clean up any pending modifier entries that were never completed\n modifiers?.rollbackActiveEntries()\n }\n\n done()\n\n return graph\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  import type { DepID } from '@vltpkg/dep-id';
2
- import type { Spec } from '@vltpkg/spec';
2
+ import { Spec } from '@vltpkg/spec/browser';
3
+ import type { SpecOptions } from '@vltpkg/spec';
3
4
  import type { DependencySaveType, DependencyTypeLong, DependencyTypeShort, Manifest } from '@vltpkg/types';
5
+ import type { NodeLike } from './types.ts';
4
6
  export declare const isDependencyTypeShort: (obj: unknown) => obj is DependencyTypeShort;
5
7
  export declare const isDependencySaveType: (obj: unknown) => obj is DependencyTypeShort;
6
8
  export declare const asDependencyTypeShort: (obj: unknown) => DependencyTypeShort;
@@ -55,5 +57,11 @@ export declare const asDependency: (obj: unknown) => Dependency;
55
57
  /**
56
58
  * Get the {@link DependencyTypeShort} from a {@link DependencyTypeLong}.
57
59
  */
58
- export declare const shorten: (typeLong: DependencyTypeLong, name?: string, manifest?: Manifest) => DependencyTypeShort;
60
+ export declare const shorten: (typeLong: DependencyTypeLong, name?: string, manifest?: Manifest | null) => DependencyTypeShort;
61
+ export declare const getRawDependencies: (node: NodeLike) => Map<string, RawDependency>;
62
+ /**
63
+ * Retrieves a map of all dependencies, of all types, that can be inferred
64
+ * from a given node manifest, including missing dependencies.
65
+ */
66
+ export declare const getDependencies: (node: NodeLike, options: SpecOptions) => Map<string, Dependency>;
59
67
  //# sourceMappingURL=dependencies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACT,MAAM,eAAe,CAAA;AAOtB,eAAO,MAAM,qBAAqB,QAC3B,OAAO,KACX,GAAG,IAAI,mBAC4C,CAAA;AAEtD,eAAO,MAAM,oBAAoB,QAC1B,OAAO,KACX,GAAG,IAAI,mBAEU,CAAA;AAEpB,eAAO,MAAM,qBAAqB,QAC3B,OAAO,KACX,mBAQF,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,kBAAkB,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,kBAAkB,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,GAAG,CAC3C,KAAK,EACL,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CACxB,GAAG;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,8BAA8B,GAAG,GAAG,CAC9C,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,CACZ,GAAG;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,CAAA;AAMrC,eAAO,MAAM,YAAY,MAAO,OAAO,KAAG,CAAC,IAAI,UAKjB,CAAA;AAE9B,eAAO,MAAM,YAAY,QAAS,OAAO,KAAG,UAK3C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,aACR,kBAAkB,SACrB,MAAM,aACF,QAAQ,KAClB,mBAkBF,CAAA"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,QAAQ,EACT,MAAM,eAAe,CAAA;AAMtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1C,eAAO,MAAM,qBAAqB,QAC3B,OAAO,KACX,GAAG,IAAI,mBAC4C,CAAA;AAEtD,eAAO,MAAM,oBAAoB,QAC1B,OAAO,KACX,GAAG,IAAI,mBAEU,CAAA;AAEpB,eAAO,MAAM,qBAAqB,QAC3B,OAAO,KACX,mBAQF,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,kBAAkB,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;OAEG;IACH,IAAI,EAAE,IAAI,CAAA;IACV;;;OAGG;IACH,IAAI,EAAE,kBAAkB,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,GAAG,CAC3C,KAAK,EACL,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CACxB,GAAG;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,MAAM,8BAA8B,GAAG,GAAG,CAC9C,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,CACZ,GAAG;IAAE,oBAAoB,EAAE,OAAO,CAAA;CAAE,CAAA;AAMrC,eAAO,MAAM,YAAY,MAAO,OAAO,KAAG,CAAC,IAAI,UAKjB,CAAA;AAE9B,eAAO,MAAM,YAAY,QAAS,OAAO,KAAG,UAK3C,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,aACR,kBAAkB,SACrB,MAAM,aACF,QAAQ,GAAG,IAAI,KACzB,mBAkBF,CAAA;AASD,eAAO,MAAM,kBAAkB,SAAU,QAAQ,+BAyChD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,SACpB,QAAQ,WACL,WAAW,KACnB,GAAG,CAAC,MAAM,EAAE,UAAU,CAexB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { error } from '@vltpkg/error-cause';
2
+ import { Spec } from '@vltpkg/spec/browser';
2
3
  import { dependencyTypes, longDependencyTypes, shortDependencyTypes, } from '@vltpkg/types';
3
4
  export const isDependencyTypeShort = (obj) => shortDependencyTypes.has(obj);
4
5
  export const isDependencySaveType = (obj) => shortDependencyTypes.has(obj) ||
@@ -46,4 +47,66 @@ export const shorten = (typeLong, name, manifest) => {
46
47
  }
47
48
  return 'peer';
48
49
  };
50
+ const isStringArray = (a) => Array.isArray(a) && !a.some(b => typeof b !== 'string');
51
+ /*
52
+ * Retrieves a map of all dependencies, of all types, that can be iterated
53
+ * on and consulted when parsing the directory contents of a given node.
54
+ */
55
+ export const getRawDependencies = (node) => {
56
+ const dependencies = new Map();
57
+ const bundleDeps = node.manifest?.bundleDependencies ?? [];
58
+ // if it's an importer, bundleDeps are just normal. if it's a dep,
59
+ // then they're ignored entirely.
60
+ const bundled = (!node.importer &&
61
+ !node.id.startsWith('git') &&
62
+ isStringArray(bundleDeps)) ?
63
+ new Set(bundleDeps)
64
+ : new Set();
65
+ for (const depType of longDependencyTypes) {
66
+ const obj = node.manifest?.[depType];
67
+ // only care about devDeps for importers and git or symlink deps
68
+ // technically this will also include devDeps for tarball file: specs,
69
+ // but that is likely rare enough to not worry about too much.
70
+ if (depType === 'devDependencies' &&
71
+ !node.importer &&
72
+ !node.id.startsWith('git') &&
73
+ !node.id.startsWith('file')) {
74
+ continue;
75
+ }
76
+ if (obj) {
77
+ for (const [name, bareSpec] of Object.entries(obj)) {
78
+ // if it's a bundled dependency, we just ignore it entirely.
79
+ if (bundled.has(name))
80
+ continue;
81
+ dependencies.set(name, {
82
+ name,
83
+ type: depType,
84
+ bareSpec,
85
+ registry: node.registry,
86
+ });
87
+ }
88
+ }
89
+ }
90
+ return dependencies;
91
+ };
92
+ /**
93
+ * Retrieves a map of all dependencies, of all types, that can be inferred
94
+ * from a given node manifest, including missing dependencies.
95
+ */
96
+ export const getDependencies = (node, options) => {
97
+ const res = new Map();
98
+ const dependencies = getRawDependencies(node);
99
+ for (const { name, type, bareSpec } of dependencies.values()) {
100
+ const depType = shorten(type, name, node.manifest);
101
+ const spec = Spec.parse(name, bareSpec, {
102
+ ...options,
103
+ registry: node.registry,
104
+ });
105
+ res.set(name, {
106
+ spec,
107
+ type: depType,
108
+ });
109
+ }
110
+ return res;
111
+ };
49
112
  //# sourceMappingURL=dependencies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/dependencies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAQ3C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,eAAe,CAAA;AAEtB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,GAAY,EACgB,EAAE,CAC9B,oBAAoB,CAAC,GAAG,CAAC,GAA0B,CAAC,CAAA;AAEtD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAY,EACgB,EAAE,CAC9B,oBAAoB,CAAC,GAAG,CAAC,GAA0B,CAAC;IACpD,GAAG,KAAK,UAAU,CAAA;AAEpB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,GAAY,EACS,EAAE;IACvB,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,CAAC,yBAAyB,EAAE;YACrC,KAAK,EAAE,GAAG;YACV,YAAY,EAAE,CAAC,GAAG,oBAAoB,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAsDD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAgC,EAAE,CACzD,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAA;AAE9B,8DAA8D;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAU,EAAmB,EAAE;AAC1D,8DAA8D;AAC9D,KAAK,CAAC,CAAC,CAAC;IACR,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACb,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;IACb,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAY,EAAc,EAAE;IACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IACnD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,QAA4B,EAC5B,IAAa,EACb,QAAmB,EACE,EAAE;IACvB,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,8BAA8B,EAAE;YAC1C,KAAK,EAAE,QAAQ;YACf,YAAY,EAAE,CAAC,GAAG,mBAAmB,CAAC;SACvC,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IACE,IAAI;QACJ,QAAQ,EAAE,oBAAoB,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,IAAI,EACzD,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { Spec } from '@vltpkg/spec'\nimport type {\n DependencySaveType,\n DependencyTypeLong,\n DependencyTypeShort,\n Manifest,\n} from '@vltpkg/types'\nimport {\n dependencyTypes,\n longDependencyTypes,\n shortDependencyTypes,\n} from '@vltpkg/types'\n\nexport const isDependencyTypeShort = (\n obj: unknown,\n): obj is DependencyTypeShort =>\n shortDependencyTypes.has(obj as DependencyTypeShort)\n\nexport const isDependencySaveType = (\n obj: unknown,\n): obj is DependencyTypeShort =>\n shortDependencyTypes.has(obj as DependencyTypeShort) ||\n obj === 'implicit'\n\nexport const asDependencyTypeShort = (\n obj: unknown,\n): DependencyTypeShort => {\n if (!isDependencyTypeShort(obj)) {\n throw error('Invalid dependency type', {\n found: obj,\n validOptions: [...shortDependencyTypes],\n })\n }\n return obj\n}\n\n/**\n * Dependency entries info as defined in a package.json file.\n */\nexport type RawDependency = {\n name: string\n bareSpec: string\n type: DependencyTypeLong\n registry?: string\n}\n\n/**\n * Parsed dependency entries info.\n */\nexport type Dependency = {\n /**\n * The parsed {@link Spec} object describing the dependency requirements.\n */\n spec: Spec\n /**\n * The {@link DependencySaveType}, describing the way this dependency should\n * be saved back to the manifest.\n */\n type: DependencySaveType\n}\n\n/**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type AddImportersDependenciesMap = Map<\n DepID,\n Map<string, Dependency>\n> & { modifiedDependencies: boolean }\n\n/**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type RemoveImportersDependenciesMap = Map<\n DepID,\n Set<string>\n> & { modifiedDependencies: boolean }\n\nconst isObj = (o: unknown): o is Record<string, unknown> =>\n !!o && typeof o === 'object'\n\n// TODO: it would be nice to have a @vltpkg/spec.isSpec method\nexport const isDependency = (o: unknown): o is Dependency =>\n // TODO: it would be nice to have a @vltpkg/spec.isSpec method\n isObj(o) &&\n isObj(o.spec) &&\n !!o.spec.type &&\n isDependencySaveType(o.type)\n\nexport const asDependency = (obj: unknown): Dependency => {\n if (!isDependency(obj)) {\n throw error('Invalid dependency', { found: obj })\n }\n return obj\n}\n\n/**\n * Get the {@link DependencyTypeShort} from a {@link DependencyTypeLong}.\n */\nexport const shorten = (\n typeLong: DependencyTypeLong,\n name?: string,\n manifest?: Manifest,\n): DependencyTypeShort => {\n const shortName = dependencyTypes.get(typeLong)\n if (!shortName) {\n throw error('Invalid dependency type name', {\n found: typeLong,\n validOptions: [...longDependencyTypes],\n })\n }\n if (shortName !== 'peer') {\n return shortName\n }\n if (\n name &&\n manifest?.peerDependenciesMeta?.[name]?.optional === true\n ) {\n return 'peerOptional'\n }\n return 'peer'\n}\n"]}
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../src/dependencies.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport { Spec } from '@vltpkg/spec/browser'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport type {\n DependencySaveType,\n DependencyTypeLong,\n DependencyTypeShort,\n Manifest,\n} from '@vltpkg/types'\nimport {\n dependencyTypes,\n longDependencyTypes,\n shortDependencyTypes,\n} from '@vltpkg/types'\nimport type { NodeLike } from './types.ts'\n\nexport const isDependencyTypeShort = (\n obj: unknown,\n): obj is DependencyTypeShort =>\n shortDependencyTypes.has(obj as DependencyTypeShort)\n\nexport const isDependencySaveType = (\n obj: unknown,\n): obj is DependencyTypeShort =>\n shortDependencyTypes.has(obj as DependencyTypeShort) ||\n obj === 'implicit'\n\nexport const asDependencyTypeShort = (\n obj: unknown,\n): DependencyTypeShort => {\n if (!isDependencyTypeShort(obj)) {\n throw error('Invalid dependency type', {\n found: obj,\n validOptions: [...shortDependencyTypes],\n })\n }\n return obj\n}\n\n/**\n * Dependency entries info as defined in a package.json file.\n */\nexport type RawDependency = {\n name: string\n bareSpec: string\n type: DependencyTypeLong\n registry?: string\n}\n\n/**\n * Parsed dependency entries info.\n */\nexport type Dependency = {\n /**\n * The parsed {@link Spec} object describing the dependency requirements.\n */\n spec: Spec\n /**\n * The {@link DependencySaveType}, describing the way this dependency should\n * be saved back to the manifest.\n */\n type: DependencySaveType\n}\n\n/**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type AddImportersDependenciesMap = Map<\n DepID,\n Map<string, Dependency>\n> & { modifiedDependencies: boolean }\n\n/**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n *\n * The `modifiedDependencies` property can be used to indicate that there\n * are added dependencies to any of the importer nodes.\n */\nexport type RemoveImportersDependenciesMap = Map<\n DepID,\n Set<string>\n> & { modifiedDependencies: boolean }\n\nconst isObj = (o: unknown): o is Record<string, unknown> =>\n !!o && typeof o === 'object'\n\n// TODO: it would be nice to have a @vltpkg/spec.isSpec method\nexport const isDependency = (o: unknown): o is Dependency =>\n // TODO: it would be nice to have a @vltpkg/spec.isSpec method\n isObj(o) &&\n isObj(o.spec) &&\n !!o.spec.type &&\n isDependencySaveType(o.type)\n\nexport const asDependency = (obj: unknown): Dependency => {\n if (!isDependency(obj)) {\n throw error('Invalid dependency', { found: obj })\n }\n return obj\n}\n\n/**\n * Get the {@link DependencyTypeShort} from a {@link DependencyTypeLong}.\n */\nexport const shorten = (\n typeLong: DependencyTypeLong,\n name?: string,\n manifest?: Manifest | null,\n): DependencyTypeShort => {\n const shortName = dependencyTypes.get(typeLong)\n if (!shortName) {\n throw error('Invalid dependency type name', {\n found: typeLong,\n validOptions: [...longDependencyTypes],\n })\n }\n if (shortName !== 'peer') {\n return shortName\n }\n if (\n name &&\n manifest?.peerDependenciesMeta?.[name]?.optional === true\n ) {\n return 'peerOptional'\n }\n return 'peer'\n}\n\nconst isStringArray = (a: unknown): a is string[] =>\n Array.isArray(a) && !a.some(b => typeof b !== 'string')\n\n/*\n * Retrieves a map of all dependencies, of all types, that can be iterated\n * on and consulted when parsing the directory contents of a given node.\n */\nexport const getRawDependencies = (node: NodeLike) => {\n const dependencies = new Map<string, RawDependency>()\n const bundleDeps: unknown = node.manifest?.bundleDependencies ?? []\n // if it's an importer, bundleDeps are just normal. if it's a dep,\n // then they're ignored entirely.\n const bundled =\n (\n !node.importer &&\n !node.id.startsWith('git') &&\n isStringArray(bundleDeps)\n ) ?\n new Set(bundleDeps)\n : new Set<string>()\n for (const depType of longDependencyTypes) {\n const obj: Record<string, string> | undefined =\n node.manifest?.[depType]\n // only care about devDeps for importers and git or symlink deps\n // technically this will also include devDeps for tarball file: specs,\n // but that is likely rare enough to not worry about too much.\n if (\n depType === 'devDependencies' &&\n !node.importer &&\n !node.id.startsWith('git') &&\n !node.id.startsWith('file')\n ) {\n continue\n }\n if (obj) {\n for (const [name, bareSpec] of Object.entries(obj)) {\n // if it's a bundled dependency, we just ignore it entirely.\n if (bundled.has(name)) continue\n dependencies.set(name, {\n name,\n type: depType,\n bareSpec,\n registry: node.registry,\n })\n }\n }\n }\n return dependencies\n}\n\n/**\n * Retrieves a map of all dependencies, of all types, that can be inferred\n * from a given node manifest, including missing dependencies.\n */\nexport const getDependencies = (\n node: NodeLike,\n options: SpecOptions,\n): Map<string, Dependency> => {\n const res = new Map<string, Dependency>()\n const dependencies = getRawDependencies(node)\n for (const { name, type, bareSpec } of dependencies.values()) {\n const depType = shorten(type, name, node.manifest)\n const spec = Spec.parse(name, bareSpec, {\n ...options,\n registry: node.registry,\n })\n res.set(name, {\n spec,\n type: depType,\n })\n }\n return res\n}\n"]}
@@ -94,7 +94,7 @@ export declare class Graph implements GraphLike {
94
94
  /**
95
95
  * Find an existing node to satisfy a dependency
96
96
  */
97
- findResolution(spec: Spec, fromNode: Node): Node | undefined;
97
+ findResolution(spec: Spec, fromNode: Node, queryModifier?: string): Node | undefined;
98
98
  /**
99
99
  * Create a new node in the graph.
100
100
  */
@@ -116,6 +116,10 @@ export declare class Graph implements GraphLike {
116
116
  * if it is valid to do so.
117
117
  */
118
118
  removeNode(node: Node, replacement?: Node): void;
119
+ /**
120
+ * Removes the resolved node of a given edge.
121
+ */
122
+ removeEdgeResolution(edge: Edge, queryModifier?: string): void;
119
123
  toJSON(): import("./index.ts").LockfileData;
120
124
  [kCustomInspect](_: number, options: InspectOptions): string;
121
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAG3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrD,QAAA,MAAM,cAAc,eAA2C,CAAA;AAM/D,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAKpD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACvC;;OAEG;IACH,YAAY,EAAE,QAAQ,CAAA;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,KAAM,YAAW,SAAS;;IACrC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAEvB;IAMD;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAEnB;;OAEG;IACH,SAAS,EAAE,iBAAiB,CAAA;IAE5B;;OAEG;IACH,KAAK,YAAkB;IAEvB;;OAEG;IACH,KAAK,mBAAyB;IAE9B;;OAEG;IACH,WAAW,yBAA+B;IAE1C;;OAEG;IACH,WAAW,oBAA0B;IAErC;;OAEG;IACH,kBAAkB,yBAA+B;IAEjD;;OAEG;IACH,SAAS,YAAkB;IAE3B;;OAEG;IACH,YAAY,EAAE,IAAI,CAAA;IAElB;;OAEG;IACH,sBAAsB,YAAkB;IAExC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;gBAEP,OAAO,EAAE,YAAY;IA+CjC;;;;;;;;OAQG;IACH,EAAE;IAwBF;;;;OAIG;IACH,OAAO,CACL,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EACd,EAAE,CAAC,EAAE,QAAQ;IA0Cf;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI;IA4BzC;;OAEG;IACH,OAAO,CACL,EAAE,CAAC,EAAE,KAAK,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM;IA+BlB;;;;;;;OAOG;IACH,YAAY,CACV,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,KAAK,EACV,KAAK,CAAC,EAAE,MAAM;IAmDhB;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI;IAiCzC,MAAM;IAQN,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;CAIpD"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAG3C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGrD,QAAA,MAAM,cAAc,eAA2C,CAAA;AAM/D,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AAoBpD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACvC;;OAEG;IACH,YAAY,EAAE,QAAQ,CAAA;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAA;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,KAAM,YAAW,SAAS;;IACrC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAEvB;IAMD;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAEnB;;OAEG;IACH,SAAS,EAAE,iBAAiB,CAAA;IAE5B;;OAEG;IACH,KAAK,YAAkB;IAEvB;;OAEG;IACH,KAAK,mBAAyB;IAE9B;;OAEG;IACH,WAAW,yBAA+B;IAE1C;;OAEG;IACH,WAAW,oBAA0B;IAErC;;OAEG;IACH,kBAAkB,yBAA+B;IAEjD;;OAEG;IACH,SAAS,YAAkB;IAE3B;;OAEG;IACH,YAAY,EAAE,IAAI,CAAA;IAElB;;OAEG;IACH,sBAAsB,YAAkB;IAExC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;gBAEP,OAAO,EAAE,YAAY;IA+CjC;;;;;;;;OAQG;IACH,EAAE;IAwBF;;;;OAIG;IACH,OAAO,CACL,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EACd,EAAE,CAAC,EAAE,QAAQ;IA0Cf;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,SAAK;IA6B7D;;OAEG;IACH,OAAO,CACL,EAAE,CAAC,EAAE,KAAK,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM;IA+BlB;;;;;;;OAOG;IACH,YAAY,CACV,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,EAAE,CAAC,EAAE,KAAK,EACV,KAAK,CAAC,EAAE,MAAM;IAqDhB;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI;IAiCzC;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,SAAK;IAmBnD,MAAM;IAQN,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;CAIpD"}