@vltpkg/graph 0.0.0-9 → 1.0.0-rc.2

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 (177) hide show
  1. package/README.md +136 -1
  2. package/dist/esm/actual/load.d.ts +49 -3
  3. package/dist/esm/actual/load.d.ts.map +1 -1
  4. package/dist/esm/actual/load.js +130 -73
  5. package/dist/esm/actual/load.js.map +1 -1
  6. package/dist/esm/browser.d.ts +8 -4
  7. package/dist/esm/browser.d.ts.map +1 -1
  8. package/dist/esm/browser.js +6 -2
  9. package/dist/esm/browser.js.map +1 -1
  10. package/dist/esm/build.d.ts +29 -0
  11. package/dist/esm/build.d.ts.map +1 -0
  12. package/dist/esm/build.js +79 -0
  13. package/dist/esm/build.js.map +1 -0
  14. package/dist/esm/dependencies.d.ts +10 -3
  15. package/dist/esm/dependencies.d.ts.map +1 -1
  16. package/dist/esm/dependencies.js +63 -0
  17. package/dist/esm/dependencies.js.map +1 -1
  18. package/dist/esm/diff.d.ts +67 -0
  19. package/dist/esm/diff.d.ts.map +1 -1
  20. package/dist/esm/diff.js +25 -0
  21. package/dist/esm/diff.js.map +1 -1
  22. package/dist/esm/edge.d.ts +7 -2
  23. package/dist/esm/edge.d.ts.map +1 -1
  24. package/dist/esm/edge.js +8 -0
  25. package/dist/esm/edge.js.map +1 -1
  26. package/dist/esm/graph.d.ts +20 -10
  27. package/dist/esm/graph.d.ts.map +1 -1
  28. package/dist/esm/graph.js +124 -21
  29. package/dist/esm/graph.js.map +1 -1
  30. package/dist/esm/ideal/add-nodes.d.ts +17 -2
  31. package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
  32. package/dist/esm/ideal/add-nodes.js +9 -2
  33. package/dist/esm/ideal/add-nodes.js.map +1 -1
  34. package/dist/esm/ideal/append-nodes.d.ts +11 -1
  35. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  36. package/dist/esm/ideal/append-nodes.js +177 -31
  37. package/dist/esm/ideal/append-nodes.js.map +1 -1
  38. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  39. package/dist/esm/ideal/build-ideal-from-starting-graph.js +9 -5
  40. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  41. package/dist/esm/ideal/build.d.ts +9 -0
  42. package/dist/esm/ideal/build.d.ts.map +1 -1
  43. package/dist/esm/ideal/build.js +4 -1
  44. package/dist/esm/ideal/build.js.map +1 -1
  45. package/dist/esm/ideal/get-importer-specs.d.ts +3 -2
  46. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  47. package/dist/esm/ideal/get-importer-specs.js +7 -5
  48. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  49. package/dist/esm/index.d.ts +8 -4
  50. package/dist/esm/index.d.ts.map +1 -1
  51. package/dist/esm/index.js +4 -1
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/install.d.ts +8 -3
  54. package/dist/esm/install.d.ts.map +1 -1
  55. package/dist/esm/install.js +167 -20
  56. package/dist/esm/install.js.map +1 -1
  57. package/dist/esm/lockfile/load-edges.d.ts +8 -1
  58. package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
  59. package/dist/esm/lockfile/load-edges.js +79 -15
  60. package/dist/esm/lockfile/load-edges.js.map +1 -1
  61. package/dist/esm/lockfile/load-nodes.d.ts +3 -2
  62. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  63. package/dist/esm/lockfile/load-nodes.js +77 -12
  64. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  65. package/dist/esm/lockfile/load.d.ts +22 -5
  66. package/dist/esm/lockfile/load.d.ts.map +1 -1
  67. package/dist/esm/lockfile/load.js +55 -22
  68. package/dist/esm/lockfile/load.js.map +1 -1
  69. package/dist/esm/lockfile/save.d.ts +16 -3
  70. package/dist/esm/lockfile/save.d.ts.map +1 -1
  71. package/dist/esm/lockfile/save.js +61 -16
  72. package/dist/esm/lockfile/save.js.map +1 -1
  73. package/dist/esm/lockfile/types.d.ts +34 -4
  74. package/dist/esm/lockfile/types.d.ts.map +1 -1
  75. package/dist/esm/lockfile/types.js +31 -0
  76. package/dist/esm/lockfile/types.js.map +1 -1
  77. package/dist/esm/modifiers.d.ts +189 -0
  78. package/dist/esm/modifiers.d.ts.map +1 -0
  79. package/dist/esm/modifiers.js +330 -0
  80. package/dist/esm/modifiers.js.map +1 -0
  81. package/dist/esm/node.d.ts +77 -6
  82. package/dist/esm/node.d.ts.map +1 -1
  83. package/dist/esm/node.js +98 -5
  84. package/dist/esm/node.js.map +1 -1
  85. package/dist/esm/reify/add-edge.d.ts +1 -2
  86. package/dist/esm/reify/add-edge.d.ts.map +1 -1
  87. package/dist/esm/reify/add-edge.js +29 -18
  88. package/dist/esm/reify/add-edge.js.map +1 -1
  89. package/dist/esm/reify/add-edges.d.ts +1 -2
  90. package/dist/esm/reify/add-edges.d.ts.map +1 -1
  91. package/dist/esm/reify/add-edges.js +2 -3
  92. package/dist/esm/reify/add-edges.js.map +1 -1
  93. package/dist/esm/reify/add-nodes.d.ts.map +1 -1
  94. package/dist/esm/reify/add-nodes.js +4 -27
  95. package/dist/esm/reify/add-nodes.js.map +1 -1
  96. package/dist/esm/reify/bin-chmod.d.ts +11 -0
  97. package/dist/esm/reify/bin-chmod.d.ts.map +1 -0
  98. package/dist/esm/reify/bin-chmod.js +39 -0
  99. package/dist/esm/reify/bin-chmod.js.map +1 -0
  100. package/dist/esm/reify/build.d.ts +10 -1
  101. package/dist/esm/reify/build.d.ts.map +1 -1
  102. package/dist/esm/reify/build.js +36 -23
  103. package/dist/esm/reify/build.js.map +1 -1
  104. package/dist/esm/reify/calculate-save-value.d.ts +3 -0
  105. package/dist/esm/reify/calculate-save-value.d.ts.map +1 -0
  106. package/dist/esm/reify/calculate-save-value.js +45 -0
  107. package/dist/esm/reify/calculate-save-value.js.map +1 -0
  108. package/dist/esm/reify/check-needed-build.d.ts +25 -0
  109. package/dist/esm/reify/check-needed-build.d.ts.map +1 -0
  110. package/dist/esm/reify/check-needed-build.js +50 -0
  111. package/dist/esm/reify/check-needed-build.js.map +1 -0
  112. package/dist/esm/reify/delete-edge.d.ts.map +1 -1
  113. package/dist/esm/reify/delete-edge.js +3 -4
  114. package/dist/esm/reify/delete-edge.js.map +1 -1
  115. package/dist/esm/reify/extract-node.d.ts +24 -0
  116. package/dist/esm/reify/extract-node.d.ts.map +1 -0
  117. package/dist/esm/reify/extract-node.js +76 -0
  118. package/dist/esm/reify/extract-node.js.map +1 -0
  119. package/dist/esm/reify/index.d.ts +18 -1
  120. package/dist/esm/reify/index.d.ts.map +1 -1
  121. package/dist/esm/reify/index.js +84 -14
  122. package/dist/esm/reify/index.js.map +1 -1
  123. package/dist/esm/reify/internal-hoist.d.ts +9 -0
  124. package/dist/esm/reify/internal-hoist.d.ts.map +1 -0
  125. package/dist/esm/reify/internal-hoist.js +134 -0
  126. package/dist/esm/reify/internal-hoist.js.map +1 -0
  127. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  128. package/dist/esm/reify/update-importers-package-json.js +15 -9
  129. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  130. package/dist/esm/remove-optional-subgraph.js +1 -1
  131. package/dist/esm/remove-optional-subgraph.js.map +1 -1
  132. package/dist/esm/resolve-save-type.d.ts +1 -2
  133. package/dist/esm/resolve-save-type.d.ts.map +1 -1
  134. package/dist/esm/resolve-save-type.js.map +1 -1
  135. package/dist/esm/stringify-node.d.ts +1 -1
  136. package/dist/esm/stringify-node.d.ts.map +1 -1
  137. package/dist/esm/stringify-node.js.map +1 -1
  138. package/dist/esm/transfer-data/load.d.ts +44 -0
  139. package/dist/esm/transfer-data/load.d.ts.map +1 -0
  140. package/dist/esm/transfer-data/load.js +176 -0
  141. package/dist/esm/transfer-data/load.js.map +1 -0
  142. package/dist/esm/uninstall.d.ts +5 -4
  143. package/dist/esm/uninstall.d.ts.map +1 -1
  144. package/dist/esm/uninstall.js +51 -19
  145. package/dist/esm/uninstall.js.map +1 -1
  146. package/dist/esm/update.d.ts +13 -0
  147. package/dist/esm/update.d.ts.map +1 -0
  148. package/dist/esm/update.js +63 -0
  149. package/dist/esm/update.js.map +1 -0
  150. package/dist/esm/virtual-root.d.ts +16 -0
  151. package/dist/esm/virtual-root.d.ts.map +1 -0
  152. package/dist/esm/virtual-root.js +79 -0
  153. package/dist/esm/virtual-root.js.map +1 -0
  154. package/dist/esm/visualization/human-readable-output.d.ts +4 -5
  155. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
  156. package/dist/esm/visualization/human-readable-output.js +41 -18
  157. package/dist/esm/visualization/human-readable-output.js.map +1 -1
  158. package/dist/esm/visualization/json-output.d.ts +7 -3
  159. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  160. package/dist/esm/visualization/json-output.js +35 -12
  161. package/dist/esm/visualization/json-output.js.map +1 -1
  162. package/dist/esm/visualization/mermaid-output.d.ts +7 -1
  163. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  164. package/dist/esm/visualization/mermaid-output.js +64 -9
  165. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  166. package/dist/esm/visualization/object-like-output.d.ts +1 -1
  167. package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
  168. package/dist/esm/visualization/object-like-output.js.map +1 -1
  169. package/package.json +30 -24
  170. package/dist/esm/reify/bin-paths.d.ts +0 -4
  171. package/dist/esm/reify/bin-paths.d.ts.map +0 -1
  172. package/dist/esm/reify/bin-paths.js +0 -23
  173. package/dist/esm/reify/bin-paths.js.map +0 -1
  174. package/dist/esm/types.d.ts +0 -42
  175. package/dist/esm/types.d.ts.map +0 -1
  176. package/dist/esm/types.js +0 -2
  177. package/dist/esm/types.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  import type { PathScurry } from 'path-scurry';
2
2
  import type { DepID } from '@vltpkg/dep-id';
3
3
  import type { Spec, SpecOptions } from '@vltpkg/spec';
4
- import type { Integrity, Manifest, DependencyTypeShort } from '@vltpkg/types';
4
+ import type { Integrity, NormalizedManifest, DependencyTypeShort, GraphLike, NodeLike } from '@vltpkg/types';
5
5
  import { Edge } from './edge.ts';
6
- import type { GraphLike, NodeLike } from './types.ts';
6
+ import type { Graph } from './graph.ts';
7
7
  export type NodeOptions = SpecOptions & {
8
8
  projectRoot: string;
9
9
  graph: GraphLike;
@@ -34,6 +34,14 @@ export declare class Node implements NodeLike {
34
34
  isDev(): this is Node & {
35
35
  dev: true;
36
36
  };
37
+ /**
38
+ * True if there's a manifest-confused package name.
39
+ */
40
+ confused: boolean;
41
+ /**
42
+ * True if this node has been extracted to the file system.
43
+ */
44
+ extracted: boolean;
37
45
  /**
38
46
  * List of edges coming into this node.
39
47
  */
@@ -43,6 +51,11 @@ export declare class Node implements NodeLike {
43
51
  * that the connected node is a direct dependency of this node.
44
52
  */
45
53
  edgesOut: Map<string, Edge>;
54
+ /**
55
+ * A `mainImporter` node may have workspace connected to it,
56
+ * equivalent to its `edgesOut` linked deps.
57
+ */
58
+ workspaces: Map<string, Edge> | undefined;
46
59
  /**
47
60
  * A reference to the {@link DepID} this node represents in the graph.
48
61
  */
@@ -58,7 +71,7 @@ export declare class Node implements NodeLike {
58
71
  /**
59
72
  * A reference to the graph this node is a part of.
60
73
  */
61
- graph: GraphLike;
74
+ graph: Graph;
62
75
  /**
63
76
  * The manifest integrity value.
64
77
  */
@@ -66,7 +79,7 @@ export declare class Node implements NodeLike {
66
79
  /**
67
80
  * The manifest this node represents in the graph.
68
81
  */
69
- manifest?: Manifest;
82
+ manifest?: NormalizedManifest;
70
83
  /**
71
84
  * Project where this node resides
72
85
  */
@@ -77,6 +90,12 @@ export declare class Node implements NodeLike {
77
90
  * the same registry, if it's not the default.
78
91
  */
79
92
  registry?: string;
93
+ /**
94
+ * If this node has been modified as part of applying a {@link GraphModifier}
95
+ * then this field will contain the modifier query that was applied.
96
+ * Otherwise, it will be `undefined`.
97
+ */
98
+ modifier: string | undefined;
80
99
  get name(): string;
81
100
  /**
82
101
  * The version of the package represented by this node, this is usually
@@ -89,6 +108,32 @@ export declare class Node implements NodeLike {
89
108
  * An address {@link PackageInfoClient} may use to extract this package.
90
109
  */
91
110
  resolved?: string;
111
+ /**
112
+ * Platform requirements (engines, os, cpu) extracted from manifest.
113
+ * Stored separately for optional dependencies to enable platform checks
114
+ * when manifest is not loaded.
115
+ */
116
+ platform?: {
117
+ engines?: Record<string, string>;
118
+ os?: string[] | string;
119
+ cpu?: string[] | string;
120
+ };
121
+ /**
122
+ * Record of binary names to their paths in the package, if any.
123
+ */
124
+ bins?: Record<string, string>;
125
+ /**
126
+ * True if this node has been built as part of the reify step.
127
+ */
128
+ built: boolean;
129
+ /**
130
+ * Build state of this node - tracks whether it needs building, has been built, or failed.
131
+ * - 'none': No build state (default)
132
+ * - 'needed': Node needs to be built
133
+ * - 'built': Node has been successfully built
134
+ * - 'failed': Node build has failed
135
+ */
136
+ buildState: 'none' | 'needed' | 'built' | 'failed';
92
137
  /**
93
138
  * The file system location for this node.
94
139
  */
@@ -107,13 +152,15 @@ export declare class Node implements NodeLike {
107
152
  * directly inside the node's directory.
108
153
  */
109
154
  nodeModules(scurry: PathScurry): string;
110
- constructor(options: NodeOptions, id?: DepID, manifest?: Manifest, spec?: Spec, name?: string, version?: string);
155
+ constructor(options: NodeOptions, id?: DepID, manifest?: NormalizedManifest, spec?: Spec, name?: string, version?: string);
111
156
  /**
112
157
  * return true if this node is located in the vlt store
113
158
  * memoized the first time it's called, since the store location
114
159
  * doesn't change within the context of a single operation.
115
160
  */
116
161
  inVltStore(): boolean;
162
+ get options(): SpecOptions;
163
+ set options(_opts: SpecOptions);
117
164
  equals(other: Node): boolean;
118
165
  /**
119
166
  * Sets the node as an importer along with its location.
@@ -130,19 +177,43 @@ export declare class Node implements NodeLike {
130
177
  * Add an edge from this node connecting it to a direct dependency.
131
178
  */
132
179
  addEdgesTo(type: DependencyTypeShort, spec: Spec, node?: Node): Edge;
180
+ /**
181
+ * The raw manifest before any modifications.
182
+ * If not set, falls back to the current manifest.
183
+ */
184
+ get rawManifest(): NormalizedManifest | undefined;
185
+ /**
186
+ * Sets this node as having a manifest-confused manifest.
187
+ */
188
+ setConfusedManifest(fixed: NormalizedManifest, confused?: NormalizedManifest): void;
189
+ /**
190
+ * Sets this node as having a manifest-confused manifest.
191
+ */
192
+ maybeSetConfusedManifest(spec: Spec, confused?: NormalizedManifest): void;
133
193
  toJSON(): {
194
+ rawManifest?: import("@vltpkg/types").Override<import("@vltpkg/types").Manifest, import("@vltpkg/types").NormalizedFields> | undefined;
134
195
  id: DepID;
135
196
  name: string;
136
197
  version: string | undefined;
137
198
  location: string;
138
199
  importer: boolean;
139
- manifest: Manifest | undefined;
200
+ manifest: import("@vltpkg/types").Override<import("@vltpkg/types").Manifest, import("@vltpkg/types").NormalizedFields> | undefined;
140
201
  projectRoot: string;
141
202
  integrity: `sha512-${string}` | undefined;
142
203
  resolved: string | undefined;
143
204
  dev: boolean;
144
205
  optional: boolean;
206
+ confused: boolean;
207
+ modifier: string | undefined;
208
+ platform: {
209
+ engines?: Record<string, string>;
210
+ os?: string[] | string;
211
+ cpu?: string[] | string;
212
+ } | undefined;
213
+ buildState: "none" | "needed" | "built" | "failed";
145
214
  };
146
215
  toString(): string;
147
216
  }
217
+ export declare const isNode: (value: unknown) => value is Node;
218
+ export declare const asNode: (value: unknown) => Node;
148
219
  //# sourceMappingURL=node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,KAAK,EAAE,KAAK,EAAc,MAAM,gBAAgB,CAAA;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,mBAAmB,EACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAIrD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,qBAAa,IAAK,YAAW,QAAQ;;IACnC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,WAEvB;IAMD;;;;;;OAMG;IACH,IAAI,QAAQ,IAGW,OAAO,CAD7B;IACD,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAS7B;IAED,UAAU,IAAI,IAAI,IAAI,IAAI,GAAG;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE;IAK/C;;;;;OAKG;IACH,IAAI,GAAG,IAGM,OAAO,CADnB;IACD,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,EASnB;IAED,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG;QAAE,GAAG,EAAE,IAAI,CAAA;KAAE;IAIrC;;OAEG;IACH,OAAO,YAAkB;IAEzB;;;OAGG;IACH,QAAQ,oBAA0B;IAElC;;OAEG;IACH,EAAE,EAAE,KAAK,CAAA;IAET;;OAEG;IACH,QAAQ,UAAQ;IAEhB;;OAEG;IACH,YAAY,UAAQ;IAEpB;;OAEG;IACH,KAAK,EAAE,SAAS,CAAA;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IASjB,IAAI,IAAI,WAIP;IAED;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAQrB;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAM5B;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAI5C;;;;;;;OAOG;IACH,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;gBAQrC,OAAO,EAAE,WAAW,EACpB,EAAE,CAAC,EAAE,KAAK,EACV,QAAQ,CAAC,EAAE,QAAQ,EACnB,IAAI,CAAC,EAAE,IAAI,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM;IA2BlB;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAkBrB,MAAM,CAAC,KAAK,EAAE,IAAI;IAIlB;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM;IAKpC;;;;OAIG;IACH,WAAW;IAgBX,kBAAkB;IAclB;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI;IAO7D,MAAM;;;;;;;;;;;;;IAgBN,QAAQ;CAGT"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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"}
package/dist/esm/node.js CHANGED
@@ -1,5 +1,6 @@
1
- import { getId, hydrateTuple, splitDepID } from '@vltpkg/dep-id';
1
+ import { isPackageNameConfused, getId, hydrateTuple, splitDepID, } from '@vltpkg/dep-id';
2
2
  import { typeError } from '@vltpkg/error-cause';
3
+ import { expandNormalizedManifestSymbols } from '@vltpkg/types';
3
4
  import { Edge } from "./edge.js";
4
5
  import { stringifyNode } from "./stringify-node.js";
5
6
  export class Node {
@@ -8,6 +9,7 @@ export class Node {
8
9
  }
9
10
  #options;
10
11
  #location;
12
+ #rawManifest;
11
13
  #optional = false;
12
14
  /**
13
15
  * True if a node is only reachable via optional or peerOptional edges from
@@ -57,6 +59,14 @@ export class Node {
57
59
  isDev() {
58
60
  return this.#dev;
59
61
  }
62
+ /**
63
+ * True if there's a manifest-confused package name.
64
+ */
65
+ confused = false;
66
+ /**
67
+ * True if this node has been extracted to the file system.
68
+ */
69
+ extracted = false;
60
70
  /**
61
71
  * List of edges coming into this node.
62
72
  */
@@ -66,6 +76,11 @@ export class Node {
66
76
  * that the connected node is a direct dependency of this node.
67
77
  */
68
78
  edgesOut = new Map();
79
+ /**
80
+ * A `mainImporter` node may have workspace connected to it,
81
+ * equivalent to its `edgesOut` linked deps.
82
+ */
83
+ workspaces;
69
84
  /**
70
85
  * A reference to the {@link DepID} this node represents in the graph.
71
86
  */
@@ -100,6 +115,12 @@ export class Node {
100
115
  * the same registry, if it's not the default.
101
116
  */
102
117
  registry;
118
+ /**
119
+ * If this node has been modified as part of applying a {@link GraphModifier}
120
+ * then this field will contain the modifier query that was applied.
121
+ * Otherwise, it will be `undefined`.
122
+ */
123
+ modifier;
103
124
  /**
104
125
  * The name of the package represented by this node, this is usually
105
126
  * equivalent to `manifest.name` but in a few ways it may differ such as
@@ -124,6 +145,28 @@ export class Node {
124
145
  * An address {@link PackageInfoClient} may use to extract this package.
125
146
  */
126
147
  resolved;
148
+ /**
149
+ * Platform requirements (engines, os, cpu) extracted from manifest.
150
+ * Stored separately for optional dependencies to enable platform checks
151
+ * when manifest is not loaded.
152
+ */
153
+ platform;
154
+ /**
155
+ * Record of binary names to their paths in the package, if any.
156
+ */
157
+ bins;
158
+ /**
159
+ * True if this node has been built as part of the reify step.
160
+ */
161
+ built = false;
162
+ /**
163
+ * Build state of this node - tracks whether it needs building, has been built, or failed.
164
+ * - 'none': No build state (default)
165
+ * - 'needed': Node needs to be built
166
+ * - 'built': Node has been successfully built
167
+ * - 'failed': Node build has failed
168
+ */
169
+ buildState = 'none';
127
170
  /**
128
171
  * The file system location for this node.
129
172
  */
@@ -181,9 +224,6 @@ export class Node {
181
224
  this.manifest = manifest;
182
225
  this.#name = name || this.manifest?.name;
183
226
  this.version = version || this.manifest?.version;
184
- if (this.version?.startsWith('v')) {
185
- this.version = this.version.slice(1);
186
- }
187
227
  }
188
228
  /**
189
229
  * return true if this node is located in the vlt store
@@ -204,6 +244,11 @@ export class Node {
204
244
  this.manifest?.dist?.tarball || spec.conventionalRegistryTarball;
205
245
  this.integrity ??= this.manifest?.dist?.integrity;
206
246
  }
247
+ get options() {
248
+ return this.#options;
249
+ }
250
+ /* c8 ignore next */
251
+ set options(_opts) { }
207
252
  equals(other) {
208
253
  return this.id === other.id && this.location === other.location;
209
254
  }
@@ -253,6 +298,33 @@ export class Node {
253
298
  this.edgesOut.set(spec.name, edge);
254
299
  return edge;
255
300
  }
301
+ /**
302
+ * The raw manifest before any modifications.
303
+ * If not set, falls back to the current manifest.
304
+ */
305
+ get rawManifest() {
306
+ return this.#rawManifest ?? this.manifest;
307
+ }
308
+ /**
309
+ * Sets this node as having a manifest-confused manifest.
310
+ */
311
+ setConfusedManifest(fixed, confused) {
312
+ this.manifest = fixed;
313
+ this.#rawManifest = confused;
314
+ this.confused = true;
315
+ this.#name = this.manifest.name;
316
+ }
317
+ /**
318
+ * Sets this node as having a manifest-confused manifest.
319
+ */
320
+ maybeSetConfusedManifest(spec, confused) {
321
+ if (isPackageNameConfused(spec, this.manifest?.name)) {
322
+ this.setConfusedManifest({
323
+ ...this.manifest,
324
+ name: spec.name,
325
+ }, confused);
326
+ }
327
+ }
256
328
  toJSON() {
257
329
  return {
258
330
  id: this.id,
@@ -260,16 +332,37 @@ export class Node {
260
332
  version: this.version,
261
333
  location: this.location,
262
334
  importer: this.importer,
263
- manifest: this.manifest,
335
+ manifest: this.manifest &&
336
+ expandNormalizedManifestSymbols(this.manifest),
264
337
  projectRoot: this.projectRoot,
265
338
  integrity: this.integrity,
266
339
  resolved: this.resolved,
267
340
  dev: this.dev,
268
341
  optional: this.optional,
342
+ confused: this.confused,
343
+ modifier: this.modifier,
344
+ platform: this.platform,
345
+ buildState: this.buildState,
346
+ ...(this.confused ?
347
+ { rawManifest: this.#rawManifest }
348
+ : undefined),
269
349
  };
270
350
  }
271
351
  toString() {
272
352
  return stringifyNode(this);
273
353
  }
274
354
  }
355
+ export const isNode = (value) => {
356
+ return (typeof value === 'object' &&
357
+ value != null &&
358
+ 'id' in value &&
359
+ 'manifest' in value &&
360
+ value[Symbol.toStringTag] === '@vltpkg/graph.Node');
361
+ };
362
+ export const asNode = (value) => {
363
+ if (!isNode(value)) {
364
+ throw typeError('Expected a node', { found: value });
365
+ }
366
+ return value;
367
+ };
275
368
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PathScurry } from 'path-scurry'\nimport { getId, hydrateTuple, splitDepID } from '@vltpkg/dep-id'\nimport type { DepID, DepIDTuple } from '@vltpkg/dep-id'\nimport { typeError } from '@vltpkg/error-cause'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport type {\n Integrity,\n Manifest,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport { Edge } from './edge.ts'\nimport type { GraphLike, NodeLike } from './types.ts'\nimport { stringifyNode } from './stringify-node.ts'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\n\nexport type NodeOptions = SpecOptions & {\n projectRoot: string\n graph: GraphLike\n}\n\nexport class Node implements NodeLike {\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Node'\n }\n\n #options: SpecOptions\n #location?: string\n\n #optional = false\n /**\n * True if a node is only reachable via optional or peerOptional edges from\n * any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any optional-flagged non-optional dependencies.\n */\n get optional() {\n return this.#optional\n }\n set optional(optional: boolean) {\n const before = this.#optional\n this.#optional = optional\n if (before && !optional) {\n // unset for all deps, as well\n for (const { to, optional } of this.edgesOut.values()) {\n if (!optional && to?.optional) to.optional = false\n }\n }\n }\n\n isOptional(): this is Node & { optional: true } {\n return this.#optional\n }\n\n #dev = false\n /**\n * True if a node is only reachable via dev edges from any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any dev-flagged non-dev dependencies.\n */\n get dev() {\n return this.#dev\n }\n set dev(dev: boolean) {\n const before = this.#dev\n this.#dev = dev\n if (before && !dev) {\n // unset for all deps, as well\n for (const { to, dev } of this.edgesOut.values()) {\n if (!dev && to?.dev) to.dev = false\n }\n }\n }\n\n isDev(): this is Node & { dev: true } {\n return this.#dev\n }\n\n /**\n * List of edges coming into this node.\n */\n edgesIn = new Set<Edge>()\n\n /**\n * List of edges from this node into other nodes. This usually represents\n * that the connected node is a direct dependency of this node.\n */\n edgesOut = new Map<string, Edge>()\n\n /**\n * A reference to the {@link DepID} this node represents in the graph.\n */\n id: DepID\n\n /**\n * True if this node is an importer node.\n */\n importer = false\n\n /**\n * True if this node is the project root node.\n */\n mainImporter = false\n\n /**\n * A reference to the graph this node is a part of.\n */\n graph: GraphLike\n\n /**\n * The manifest integrity value.\n */\n integrity?: Integrity\n\n /**\n * The manifest this node represents in the graph.\n */\n manifest?: Manifest\n\n /**\n * Project where this node resides\n */\n projectRoot: string\n\n /**\n * For registry nodes, this is the registry we fetched them from.\n * Needed because their un-prefixed dependencies need to come from\n * the same registry, if it's not the default.\n */\n registry?: string\n\n /**\n * The name of the package represented by this node, this is usually\n * equivalent to `manifest.name` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package names instead.\n */\n #name?: string\n get name() {\n if (this.#name) return this.#name\n this.#name = this.id\n return this.#name\n }\n\n /**\n * The version of the package represented by this node, this is usually\n * equivalent to `manifest.version` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package versions instead.\n */\n version?: string\n\n /**\n * An address {@link PackageInfoClient} may use to extract this package.\n */\n resolved?: string\n\n /**\n * The file system location for this node.\n */\n get location(): string {\n if (this.#location) {\n return this.#location\n }\n this.#location = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n // if using the default location, it is in the store\n this.inVltStore = () => true\n return this.#location\n }\n\n set location(location: string) {\n this.#location = location\n // reset memoization, since it might be elsewhere now\n if (this.inVltStore !== Node.prototype.inVltStore) {\n this.inVltStore = Node.prototype.inVltStore\n }\n }\n\n /**\n * The resolved location of the node in the file system.\n */\n resolvedLocation(scurry: PathScurry): string {\n return scurry.cwd.resolve(this.location).fullpath()\n }\n\n /**\n * The location of the node_modules folder where this node's edgesOut\n * should be linked into. For nodes in the store, this is the parent\n * directory, since they're extracted into a node_modules folder\n * side by side with links to their deps. For nodes outside of the store\n * (ie, importers and arbitrary link deps) this is the node_modules folder\n * directly inside the node's directory.\n */\n nodeModules(scurry: PathScurry): string {\n const loc = this.resolvedLocation(scurry)\n return this.inVltStore() ?\n loc.substring(0, loc.length - this.name.length - 1)\n : scurry.resolve(loc, 'node_modules')\n }\n\n constructor(\n options: NodeOptions,\n id?: DepID,\n manifest?: Manifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) {\n this.#options = options\n this.projectRoot = options.projectRoot\n if (id) {\n this.id = id\n } else {\n if (!manifest || !spec) {\n throw typeError(\n 'A new Node needs either a manifest & spec or an id parameter',\n {\n manifest,\n },\n )\n }\n this.id = getId(spec, manifest)\n }\n this.graph = options.graph\n this.manifest = manifest\n this.#name = name || this.manifest?.name\n\n this.version = version || this.manifest?.version\n if (this.version?.startsWith('v')) {\n this.version = this.version.slice(1)\n }\n }\n\n /**\n * return true if this node is located in the vlt store\n * memoized the first time it's called, since the store location\n * doesn't change within the context of a single operation.\n */\n inVltStore(): boolean {\n // technically this just means it's in *a* vlt store, but we can safely\n // assume that a user won't construct a path like this by accident,\n // and there's only ever one store in any given project.\n const inStore = this.location.endsWith(\n `.vlt/${this.id}/node_modules/${this.name}`,\n )\n this.inVltStore = () => inStore\n return inStore\n }\n\n #registryNodeResolved(tuple: DepIDTuple) {\n const spec = hydrateTuple(tuple, this.#name, this.#options)\n this.resolved =\n this.manifest?.dist?.tarball || spec.conventionalRegistryTarball\n this.integrity ??= this.manifest?.dist?.integrity\n }\n\n equals(other: Node) {\n return this.id === other.id && this.location === other.location\n }\n\n /**\n * Sets the node as an importer along with its location.\n */\n setImporterLocation(location: string) {\n this.#location = location\n this.importer = true\n }\n\n /**\n * Sets the appropriate resolve / integrity value for this node.\n * Note that other places might also set these values, like for\n * example the lockfile that might have already have this info.\n */\n setResolved() {\n // file | remote | workspace type of ids all points to a URI that\n // can be used as the `resolved` value, so we split the dep id\n // for these cases.\n const tuple = splitDepID(this.id)\n const [type, resolved] = tuple\n switch (type) {\n case 'registry':\n this.#registryNodeResolved(tuple)\n break\n default:\n this.resolved = resolved\n break\n }\n }\n\n setDefaultLocation() {\n const def = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n\n // only relocate if the location is in node_modules already\n if (\n !this.importer &&\n (!this.#location ||\n (this.#location !== def &&\n /^(?:\\.\\/)?node_modules\\//.test(this.#location)))\n ) {\n this.#location = def\n }\n }\n\n /**\n * Add an edge from this node connecting it to a direct dependency.\n */\n addEdgesTo(type: DependencyTypeShort, spec: Spec, node?: Node) {\n const edge = new Edge(type, spec, this, node)\n node?.edgesIn.add(edge)\n this.edgesOut.set(spec.name, edge)\n return edge\n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n location: this.location,\n importer: this.importer,\n manifest: this.manifest,\n projectRoot: this.projectRoot,\n integrity: this.integrity,\n resolved: this.resolved,\n dev: this.dev,\n optional: this.optional,\n }\n }\n\n toString() {\n return stringifyNode(this)\n }\n}\n"]}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PathScurry } from 'path-scurry'\nimport {\n isPackageNameConfused,\n getId,\n hydrateTuple,\n splitDepID,\n} from '@vltpkg/dep-id'\nimport type { DepID, DepIDTuple } from '@vltpkg/dep-id'\nimport { typeError } from '@vltpkg/error-cause'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport { expandNormalizedManifestSymbols } from '@vltpkg/types'\nimport type {\n Integrity,\n NormalizedManifest,\n DependencyTypeShort,\n GraphLike,\n NodeLike,\n} from '@vltpkg/types'\nimport { Edge } from './edge.ts'\nimport type { Graph } from './graph.ts'\nimport { stringifyNode } from './stringify-node.ts'\nimport type { PackageInfoClient } from '@vltpkg/package-info'\nimport type { GraphModifier } from './modifiers.ts'\n\nexport type NodeOptions = SpecOptions & {\n projectRoot: string\n graph: GraphLike\n}\n\nexport class Node implements NodeLike {\n get [Symbol.toStringTag]() {\n return '@vltpkg/graph.Node'\n }\n\n #options: SpecOptions\n #location?: string\n #rawManifest?: NormalizedManifest\n\n #optional = false\n /**\n * True if a node is only reachable via optional or peerOptional edges from\n * any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any optional-flagged non-optional dependencies.\n */\n get optional() {\n return this.#optional\n }\n set optional(optional: boolean) {\n const before = this.#optional\n this.#optional = optional\n if (before && !optional) {\n // unset for all deps, as well\n for (const { to, optional } of this.edgesOut.values()) {\n if (!optional && to?.optional) to.optional = false\n }\n }\n }\n\n isOptional(): this is Node & { optional: true } {\n return this.#optional\n }\n\n #dev = false\n /**\n * True if a node is only reachable via dev edges from any importer.\n *\n * Setting this to false, if previously set to true, will also unset\n * the flag on any dev-flagged non-dev dependencies.\n */\n get dev() {\n return this.#dev\n }\n set dev(dev: boolean) {\n const before = this.#dev\n this.#dev = dev\n if (before && !dev) {\n // unset for all deps, as well\n for (const { to, dev } of this.edgesOut.values()) {\n if (!dev && to?.dev) to.dev = false\n }\n }\n }\n\n isDev(): this is Node & { dev: true } {\n return this.#dev\n }\n\n /**\n * True if there's a manifest-confused package name.\n */\n confused = false\n\n /**\n * True if this node has been extracted to the file system.\n */\n extracted = false\n\n /**\n * List of edges coming into this node.\n */\n edgesIn = new Set<Edge>()\n\n /**\n * List of edges from this node into other nodes. This usually represents\n * that the connected node is a direct dependency of this node.\n */\n edgesOut = new Map<string, Edge>()\n\n /**\n * A `mainImporter` node may have workspace connected to it,\n * equivalent to its `edgesOut` linked deps.\n */\n workspaces: Map<string, Edge> | undefined\n\n /**\n * A reference to the {@link DepID} this node represents in the graph.\n */\n id: DepID\n\n /**\n * True if this node is an importer node.\n */\n importer = false\n\n /**\n * True if this node is the project root node.\n */\n mainImporter = false\n\n /**\n * A reference to the graph this node is a part of.\n */\n graph: Graph\n\n /**\n * The manifest integrity value.\n */\n integrity?: Integrity\n\n /**\n * The manifest this node represents in the graph.\n */\n manifest?: NormalizedManifest\n\n /**\n * Project where this node resides\n */\n projectRoot: string\n\n /**\n * For registry nodes, this is the registry we fetched them from.\n * Needed because their un-prefixed dependencies need to come from\n * the same registry, if it's not the default.\n */\n registry?: string\n\n /**\n * If this node has been modified as part of applying a {@link GraphModifier}\n * then this field will contain the modifier query that was applied.\n * Otherwise, it will be `undefined`.\n */\n modifier: string | undefined\n\n /**\n * The name of the package represented by this node, this is usually\n * equivalent to `manifest.name` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package names instead.\n */\n #name?: string\n get name() {\n if (this.#name) return this.#name\n this.#name = this.id\n return this.#name\n }\n\n /**\n * The version of the package represented by this node, this is usually\n * equivalent to `manifest.version` but in a few ways it may differ such as\n * nodes loaded from a lockfile that lacks a loaded manifest.\n * This field should be used to retrieve package versions instead.\n */\n version?: string\n\n /**\n * An address {@link PackageInfoClient} may use to extract this package.\n */\n resolved?: string\n\n /**\n * Platform requirements (engines, os, cpu) extracted from manifest.\n * Stored separately for optional dependencies to enable platform checks\n * when manifest is not loaded.\n */\n platform?: {\n engines?: Record<string, string>\n os?: string[] | string\n cpu?: string[] | string\n }\n\n /**\n * Record of binary names to their paths in the package, if any.\n */\n bins?: Record<string, string>\n\n /**\n * True if this node has been built as part of the reify step.\n */\n built = false\n\n /**\n * Build state of this node - tracks whether it needs building, has been built, or failed.\n * - 'none': No build state (default)\n * - 'needed': Node needs to be built\n * - 'built': Node has been successfully built\n * - 'failed': Node build has failed\n */\n buildState: 'none' | 'needed' | 'built' | 'failed' = 'none'\n\n /**\n * The file system location for this node.\n */\n get location(): string {\n if (this.#location) {\n return this.#location\n }\n this.#location = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n // if using the default location, it is in the store\n this.inVltStore = () => true\n return this.#location\n }\n\n set location(location: string) {\n this.#location = location\n // reset memoization, since it might be elsewhere now\n if (this.inVltStore !== Node.prototype.inVltStore) {\n this.inVltStore = Node.prototype.inVltStore\n }\n }\n\n /**\n * The resolved location of the node in the file system.\n */\n resolvedLocation(scurry: PathScurry): string {\n return scurry.cwd.resolve(this.location).fullpath()\n }\n\n /**\n * The location of the node_modules folder where this node's edgesOut\n * should be linked into. For nodes in the store, this is the parent\n * directory, since they're extracted into a node_modules folder\n * side by side with links to their deps. For nodes outside of the store\n * (ie, importers and arbitrary link deps) this is the node_modules folder\n * directly inside the node's directory.\n */\n nodeModules(scurry: PathScurry): string {\n const loc = this.resolvedLocation(scurry)\n return this.inVltStore() ?\n loc.substring(0, loc.length - this.name.length - 1)\n : scurry.resolve(loc, 'node_modules')\n }\n\n constructor(\n options: NodeOptions,\n id?: DepID,\n manifest?: NormalizedManifest,\n spec?: Spec,\n name?: string,\n version?: string,\n ) {\n this.#options = options\n this.projectRoot = options.projectRoot\n if (id) {\n this.id = id\n } else {\n if (!manifest || !spec) {\n throw typeError(\n 'A new Node needs either a manifest & spec or an id parameter',\n {\n manifest,\n },\n )\n }\n this.id = getId(spec, manifest)\n }\n this.graph = options.graph as Graph\n this.manifest = manifest\n\n this.#name = name || this.manifest?.name\n this.version = version || this.manifest?.version\n }\n\n /**\n * return true if this node is located in the vlt store\n * memoized the first time it's called, since the store location\n * doesn't change within the context of a single operation.\n */\n inVltStore(): boolean {\n // technically this just means it's in *a* vlt store, but we can safely\n // assume that a user won't construct a path like this by accident,\n // and there's only ever one store in any given project.\n const inStore = this.location.endsWith(\n `.vlt/${this.id}/node_modules/${this.name}`,\n )\n this.inVltStore = () => inStore\n return inStore\n }\n\n #registryNodeResolved(tuple: DepIDTuple) {\n const spec = hydrateTuple(tuple, this.#name, this.#options)\n this.resolved =\n this.manifest?.dist?.tarball || spec.conventionalRegistryTarball\n this.integrity ??= this.manifest?.dist?.integrity\n }\n\n get options() {\n return this.#options\n }\n\n /* c8 ignore next */\n set options(_opts: SpecOptions) {}\n\n equals(other: Node) {\n return this.id === other.id && this.location === other.location\n }\n\n /**\n * Sets the node as an importer along with its location.\n */\n setImporterLocation(location: string) {\n this.#location = location\n this.importer = true\n }\n\n /**\n * Sets the appropriate resolve / integrity value for this node.\n * Note that other places might also set these values, like for\n * example the lockfile that might have already have this info.\n */\n setResolved() {\n // file | remote | workspace type of ids all points to a URI that\n // can be used as the `resolved` value, so we split the dep id\n // for these cases.\n const tuple = splitDepID(this.id)\n const [type, resolved] = tuple\n switch (type) {\n case 'registry':\n this.#registryNodeResolved(tuple)\n break\n default:\n this.resolved = resolved\n break\n }\n }\n\n setDefaultLocation() {\n const def = `./node_modules/.vlt/${this.id}/node_modules/${this.name}`\n\n // only relocate if the location is in node_modules already\n if (\n !this.importer &&\n (!this.#location ||\n (this.#location !== def &&\n /^(?:\\.\\/)?node_modules\\//.test(this.#location)))\n ) {\n this.#location = def\n }\n }\n\n /**\n * Add an edge from this node connecting it to a direct dependency.\n */\n addEdgesTo(type: DependencyTypeShort, spec: Spec, node?: Node) {\n const edge = new Edge(type, spec, this, node)\n node?.edgesIn.add(edge)\n this.edgesOut.set(spec.name, edge)\n return edge\n }\n\n /**\n * The raw manifest before any modifications.\n * If not set, falls back to the current manifest.\n */\n get rawManifest(): NormalizedManifest | undefined {\n return this.#rawManifest ?? this.manifest\n }\n\n /**\n * Sets this node as having a manifest-confused manifest.\n */\n setConfusedManifest(\n fixed: NormalizedManifest,\n confused?: NormalizedManifest,\n ) {\n this.manifest = fixed\n this.#rawManifest = confused\n this.confused = true\n this.#name = this.manifest.name\n }\n\n /**\n * Sets this node as having a manifest-confused manifest.\n */\n maybeSetConfusedManifest(\n spec: Spec,\n confused?: NormalizedManifest,\n ) {\n if (isPackageNameConfused(spec, this.manifest?.name)) {\n this.setConfusedManifest(\n {\n ...this.manifest,\n name: spec.name,\n },\n confused,\n )\n }\n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n version: this.version,\n location: this.location,\n importer: this.importer,\n manifest:\n this.manifest &&\n expandNormalizedManifestSymbols(this.manifest),\n projectRoot: this.projectRoot,\n integrity: this.integrity,\n resolved: this.resolved,\n dev: this.dev,\n optional: this.optional,\n confused: this.confused,\n modifier: this.modifier,\n platform: this.platform,\n buildState: this.buildState,\n ...(this.confused ?\n { rawManifest: this.#rawManifest }\n : undefined),\n }\n }\n\n toString() {\n return stringifyNode(this)\n }\n}\n\nexport const isNode = (value: unknown): value is Node => {\n return (\n typeof value === 'object' &&\n value != null &&\n 'id' in value &&\n 'manifest' in value &&\n (value as Node)[Symbol.toStringTag] === '@vltpkg/graph.Node'\n )\n}\n\nexport const asNode = (value: unknown): Node => {\n if (!isNode(value)) {\n throw typeError('Expected a node', { found: value })\n }\n return value\n}\n"]}
@@ -1,5 +1,4 @@
1
1
  import type { RollbackRemove } from '@vltpkg/rollback-remove';
2
- import type { Manifest } from '@vltpkg/types';
3
2
  import type { PathScurry } from 'path-scurry';
4
3
  import type { Edge } from '../edge.ts';
5
4
  /**
@@ -7,5 +6,5 @@ import type { Edge } from '../edge.ts';
7
6
  * this does NOT chmod the bins to 0o777, because they might not exist
8
7
  * until scripts are run, in the case of non-store deps like workspaces
9
8
  */
10
- export declare const addEdge: (edge: Edge, manifest: Manifest, scurry: PathScurry, remover: RollbackRemove) => Promise<void>;
9
+ export declare const addEdge: (edge: Edge, scurry: PathScurry, remover: RollbackRemove, bins?: Record<string, string>) => Promise<void>;
11
10
  //# sourceMappingURL=add-edge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-edge.d.ts","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAwBtC;;;;GAIG;AACH,eAAO,MAAM,OAAO,SACZ,IAAI,YACA,QAAQ,UACV,UAAU,WACT,cAAc,kBAoCxB,CAAA"}
1
+ {"version":3,"file":"add-edge.d.ts","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAG7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAoCtC;;;;GAIG;AACH,eAAO,MAAM,OAAO,SACZ,IAAI,UACF,UAAU,WACT,cAAc,SAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,kBAqC9B,CAAA"}
@@ -1,30 +1,40 @@
1
1
  import { cmdShimIfExists } from '@vltpkg/cmd-shim';
2
2
  import { mkdir, symlink } from 'node:fs/promises';
3
3
  import { dirname, relative } from 'node:path';
4
- import { binPaths } from "./bin-paths.js";
5
4
  const clobberSymlink = async (target, link, remover, type = 'file') => {
6
5
  await mkdir(dirname(link), { recursive: true });
7
6
  try {
8
7
  await symlink(target, link, type);
9
8
  }
10
- catch (e) {
11
- const er = e;
12
- if (er.code === 'EEXIST') {
13
- return remover.rm(link).then(() => symlink(target, link));
9
+ catch (er) {
10
+ /* c8 ignore start */
11
+ if (er.code !== 'EEXIST') {
12
+ throw er;
13
+ }
14
+ /* c8 ignore stop */
15
+ // if the symlink exists, remove it
16
+ await remover.rm(link);
17
+ try {
18
+ // then try to create it again
19
+ await symlink(target, link, type);
14
20
  /* c8 ignore start */
15
21
  }
16
- else {
17
- throw er;
22
+ catch (er) {
23
+ // if the symlink still exists, then multiple paths could be writing to it
24
+ // so now just ignore that error. See https://github.com/vltpkg/vltpkg/issues/797
25
+ if (er.code !== 'EEXIST') {
26
+ throw er;
27
+ }
18
28
  }
29
+ /* c8 ignore stop */
19
30
  }
20
- /* c8 ignore stop */
21
31
  };
22
32
  /**
23
33
  * reify an edge into a node_modules folder, with bins linked
24
34
  * this does NOT chmod the bins to 0o777, because they might not exist
25
35
  * until scripts are run, in the case of non-store deps like workspaces
26
36
  */
27
- export const addEdge = async (edge, manifest, scurry, remover) => {
37
+ export const addEdge = async (edge, scurry, remover, bins) => {
28
38
  if (!edge.to)
29
39
  return;
30
40
  const binRoot = scurry.resolve(edge.from.nodeModules(scurry), '.bin');
@@ -38,15 +48,16 @@ export const addEdge = async (edge, manifest, scurry, remover) => {
38
48
  await p;
39
49
  else
40
50
  promises.push(p);
41
- const bp = binPaths(manifest);
42
- for (const [key, val] of Object.entries(bp)) {
43
- const link = scurry.resolve(binRoot, key);
44
- const absTarget = scurry.resolve(path, val);
45
- const target = relative(binRoot, absTarget);
46
- // TODO: bash/cmd/ps1 shims on Windows
47
- promises.push(process.platform === 'win32' ?
48
- cmdShimIfExists(absTarget, link, remover)
49
- : clobberSymlink(target, link, remover));
51
+ if (bins) {
52
+ for (const [key, val] of Object.entries(bins)) {
53
+ const link = scurry.resolve(binRoot, key);
54
+ const absTarget = scurry.resolve(path, val);
55
+ const target = relative(binRoot, absTarget);
56
+ // TODO: bash/cmd/ps1 shims on Windows
57
+ promises.push(process.platform === 'win32' ?
58
+ cmdShimIfExists(absTarget, link, remover)
59
+ : clobberSymlink(target, link, remover));
60
+ }
50
61
  }
51
62
  if (promises.length)
52
63
  await Promise.all(promises);
@@ -1 +1 @@
1
- {"version":3,"file":"add-edge.js","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"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","sourcesContent":["import { cmdShimIfExists } from '@vltpkg/cmd-shim'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { Manifest } from '@vltpkg/types'\nimport { mkdir, symlink } from 'node:fs/promises'\nimport { dirname, relative } from 'node:path'\nimport type { PathScurry } from 'path-scurry'\nimport type { Edge } from '../edge.ts'\nimport { binPaths } from './bin-paths.ts'\n\nconst clobberSymlink = async (\n target: string,\n link: string,\n remover: RollbackRemove,\n type = 'file',\n) => {\n await mkdir(dirname(link), { recursive: true })\n try {\n await symlink(target, link, type)\n } catch (e) {\n const er = e as NodeJS.ErrnoException\n if (er.code === 'EEXIST') {\n return remover.rm(link).then(() => symlink(target, link))\n /* c8 ignore start */\n } else {\n throw er\n }\n }\n /* c8 ignore stop */\n}\n\n/**\n * reify an edge into a node_modules folder, with bins linked\n * this does NOT chmod the bins to 0o777, because they might not exist\n * until scripts are run, in the case of non-store deps like workspaces\n */\nexport const addEdge = async (\n edge: Edge,\n manifest: Manifest,\n scurry: PathScurry,\n remover: RollbackRemove,\n) => {\n if (!edge.to) return\n const binRoot = scurry.resolve(\n edge.from.nodeModules(scurry),\n '.bin',\n )\n const path = scurry.resolve(\n edge.from.nodeModules(scurry),\n edge.spec.name,\n )\n const promises: Promise<unknown>[] = []\n const target = relative(\n dirname(path),\n edge.to.resolvedLocation(scurry),\n )\n\n // can only parallelize this on posix, because the win32 shims\n // need to know that they will exist before being created.\n const p = clobberSymlink(target, path, remover, 'dir')\n if (process.platform === 'win32') await p\n else promises.push(p)\n\n const bp = binPaths(manifest)\n for (const [key, val] of Object.entries(bp)) {\n const link = scurry.resolve(binRoot, key)\n const absTarget = scurry.resolve(path, val)\n const target = relative(binRoot, absTarget)\n // TODO: bash/cmd/ps1 shims on Windows\n promises.push(\n process.platform === 'win32' ?\n cmdShimIfExists(absTarget, link, remover)\n : clobberSymlink(target, link, remover),\n )\n }\n if (promises.length) await Promise.all(promises)\n}\n"]}
1
+ {"version":3,"file":"add-edge.js","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"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","sourcesContent":["import { cmdShimIfExists } from '@vltpkg/cmd-shim'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport { mkdir, symlink } from 'node:fs/promises'\nimport { dirname, relative } from 'node:path'\nimport type { PathScurry } from 'path-scurry'\nimport type { Edge } from '../edge.ts'\n\nconst clobberSymlink = async (\n target: string,\n link: string,\n remover: RollbackRemove,\n type = 'file',\n) => {\n await mkdir(dirname(link), { recursive: true })\n try {\n await symlink(target, link, type)\n } catch (er) {\n /* c8 ignore start */\n if ((er as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw er\n }\n /* c8 ignore stop */\n\n // if the symlink exists, remove it\n await remover.rm(link)\n\n try {\n // then try to create it again\n await symlink(target, link, type)\n /* c8 ignore start */\n } catch (er) {\n // if the symlink still exists, then multiple paths could be writing to it\n // so now just ignore that error. See https://github.com/vltpkg/vltpkg/issues/797\n if ((er as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw er\n }\n }\n /* c8 ignore stop */\n }\n}\n\n/**\n * reify an edge into a node_modules folder, with bins linked\n * this does NOT chmod the bins to 0o777, because they might not exist\n * until scripts are run, in the case of non-store deps like workspaces\n */\nexport const addEdge = async (\n edge: Edge,\n scurry: PathScurry,\n remover: RollbackRemove,\n bins?: Record<string, string>,\n) => {\n if (!edge.to) return\n const binRoot = scurry.resolve(\n edge.from.nodeModules(scurry),\n '.bin',\n )\n const path = scurry.resolve(\n edge.from.nodeModules(scurry),\n edge.spec.name,\n )\n const promises: Promise<unknown>[] = []\n const target = relative(\n dirname(path),\n edge.to.resolvedLocation(scurry),\n )\n\n // can only parallelize this on posix, because the win32 shims\n // need to know that they will exist before being created.\n const p = clobberSymlink(target, path, remover, 'dir')\n if (process.platform === 'win32') await p\n else promises.push(p)\n\n if (bins) {\n for (const [key, val] of Object.entries(bins)) {\n const link = scurry.resolve(binRoot, key)\n const absTarget = scurry.resolve(path, val)\n const target = relative(binRoot, absTarget)\n // TODO: bash/cmd/ps1 shims on Windows\n promises.push(\n process.platform === 'win32' ?\n cmdShimIfExists(absTarget, link, remover)\n : clobberSymlink(target, link, remover),\n )\n }\n }\n if (promises.length) await Promise.all(promises)\n}\n"]}
@@ -1,6 +1,5 @@
1
- import type { PackageJson } from '@vltpkg/package-json';
2
1
  import type { RollbackRemove } from '@vltpkg/rollback-remove';
3
2
  import type { PathScurry } from 'path-scurry';
4
3
  import type { Diff } from '../diff.ts';
5
- export declare const addEdges: (diff: Diff, packageJson: PackageJson, scurry: PathScurry, remover: RollbackRemove) => Promise<unknown>[];
4
+ export declare const addEdges: (diff: Diff, scurry: PathScurry, remover: RollbackRemove) => Promise<unknown>[];
6
5
  //# sourceMappingURL=add-edges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-edges.d.ts","sourceRoot":"","sources":["../../../src/reify/add-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGtC,eAAO,MAAM,QAAQ,SACb,IAAI,eACG,WAAW,UAChB,UAAU,WACT,cAAc,KACtB,OAAO,CAAC,OAAO,CAAC,EAUlB,CAAA"}
1
+ {"version":3,"file":"add-edges.d.ts","sourceRoot":"","sources":["../../../src/reify/add-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGtC,eAAO,MAAM,QAAQ,SACb,IAAI,UACF,UAAU,WACT,cAAc,KACtB,OAAO,CAAC,OAAO,CAAC,EAQlB,CAAA"}
@@ -1,12 +1,11 @@
1
1
  import { addEdge } from "./add-edge.js";
2
- export const addEdges = (diff, packageJson, scurry, remover) => {
2
+ export const addEdges = (diff, scurry, remover) => {
3
3
  const actions = [];
4
4
  for (const edge of diff.edges.add) {
5
5
  const { to } = edge;
6
6
  if (!to)
7
7
  continue;
8
- const mani = to.manifest ?? packageJson.read(to.resolvedLocation(scurry));
9
- actions.push(addEdge(edge, mani, scurry, remover));
8
+ actions.push(addEdge(edge, scurry, remover, to.bins));
10
9
  }
11
10
  return actions;
12
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"add-edges.js","sourceRoot":"","sources":["../../../src/reify/add-edges.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAU,EACV,WAAwB,EACxB,MAAkB,EAClB,OAAuB,EACH,EAAE;IACtB,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,EAAE;YAAE,SAAQ;QACjB,MAAM,IAAI,GACR,EAAE,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import type { PackageJson } from '@vltpkg/package-json'\nimport type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { addEdge } from './add-edge.ts'\n\nexport const addEdges = (\n diff: Diff,\n packageJson: PackageJson,\n scurry: PathScurry,\n remover: RollbackRemove,\n): Promise<unknown>[] => {\n const actions: Promise<unknown>[] = []\n for (const edge of diff.edges.add) {\n const { to } = edge\n if (!to) continue\n const mani =\n to.manifest ?? packageJson.read(to.resolvedLocation(scurry))\n actions.push(addEdge(edge, mani, scurry, remover))\n }\n return actions\n}\n"]}
1
+ {"version":3,"file":"add-edges.js","sourceRoot":"","sources":["../../../src/reify/add-edges.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAU,EACV,MAAkB,EAClB,OAAuB,EACH,EAAE;IACtB,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;QACnB,IAAI,CAAC,EAAE;YAAE,SAAQ;QACjB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA","sourcesContent":["import type { RollbackRemove } from '@vltpkg/rollback-remove'\nimport type { PathScurry } from 'path-scurry'\nimport type { Diff } from '../diff.ts'\nimport { addEdge } from './add-edge.ts'\n\nexport const addEdges = (\n diff: Diff,\n scurry: PathScurry,\n remover: RollbackRemove,\n): Promise<unknown>[] => {\n const actions: Promise<unknown>[] = []\n for (const edge of diff.edges.add) {\n const { to } = edge\n if (!to) continue\n actions.push(addEdge(edge, scurry, remover, to.bins))\n }\n return actions\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"add-nodes.d.ts","sourceRoot":"","sources":["../../../src/reify/add-nodes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGtC,eAAO,MAAM,QAAQ,SACb,IAAI,UACF,UAAU,WACT,cAAc,WACd,WAAW,eACP,iBAAiB,KAC7B,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,EA6C1B,CAAA"}
1
+ {"version":3,"file":"add-nodes.d.ts","sourceRoot":"","sources":["../../../src/reify/add-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAGtC,eAAO,MAAM,QAAQ,SACb,IAAI,UACF,UAAU,WACT,cAAc,WACd,WAAW,eACP,iBAAiB,KAC7B,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,EAgB1B,CAAA"}