@vltpkg/graph 0.0.0-0.1730724342581 → 0.0.0-11

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 (164) hide show
  1. package/README.md +13 -12
  2. package/dist/esm/actual/load.d.ts +6 -6
  3. package/dist/esm/actual/load.d.ts.map +1 -1
  4. package/dist/esm/actual/load.js +8 -4
  5. package/dist/esm/actual/load.js.map +1 -1
  6. package/dist/esm/browser.d.ts +8 -6
  7. package/dist/esm/browser.d.ts.map +1 -1
  8. package/dist/esm/browser.js +8 -6
  9. package/dist/esm/browser.js.map +1 -1
  10. package/dist/esm/dependencies.d.ts +19 -29
  11. package/dist/esm/dependencies.d.ts.map +1 -1
  12. package/dist/esm/dependencies.js +4 -31
  13. package/dist/esm/dependencies.js.map +1 -1
  14. package/dist/esm/diff.d.ts +4 -4
  15. package/dist/esm/diff.d.ts.map +1 -1
  16. package/dist/esm/diff.js.map +1 -1
  17. package/dist/esm/edge.d.ts +5 -5
  18. package/dist/esm/edge.d.ts.map +1 -1
  19. package/dist/esm/edge.js +1 -1
  20. package/dist/esm/edge.js.map +1 -1
  21. package/dist/esm/graph.d.ts +12 -12
  22. package/dist/esm/graph.d.ts.map +1 -1
  23. package/dist/esm/graph.js +8 -6
  24. package/dist/esm/graph.js.map +1 -1
  25. package/dist/esm/ideal/add-nodes.d.ts +4 -4
  26. package/dist/esm/ideal/add-nodes.d.ts.map +1 -1
  27. package/dist/esm/ideal/add-nodes.js +8 -4
  28. package/dist/esm/ideal/add-nodes.js.map +1 -1
  29. package/dist/esm/ideal/append-nodes.d.ts +8 -8
  30. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  31. package/dist/esm/ideal/append-nodes.js +37 -15
  32. package/dist/esm/ideal/append-nodes.js.map +1 -1
  33. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +3 -3
  34. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  35. package/dist/esm/ideal/build-ideal-from-starting-graph.js +28 -5
  36. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  37. package/dist/esm/ideal/build.d.ts +4 -4
  38. package/dist/esm/ideal/build.d.ts.map +1 -1
  39. package/dist/esm/ideal/build.js +8 -4
  40. package/dist/esm/ideal/build.js.map +1 -1
  41. package/dist/esm/ideal/get-importer-specs.d.ts +2 -2
  42. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  43. package/dist/esm/ideal/get-importer-specs.js +39 -11
  44. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  45. package/dist/esm/ideal/remove-nodes.d.ts +1 -1
  46. package/dist/esm/ideal/remove-nodes.d.ts.map +1 -1
  47. package/dist/esm/ideal/remove-nodes.js.map +1 -1
  48. package/dist/esm/ideal/remove-satisfied-specs.d.ts +1 -1
  49. package/dist/esm/ideal/remove-satisfied-specs.d.ts.map +1 -1
  50. package/dist/esm/ideal/remove-satisfied-specs.js.map +1 -1
  51. package/dist/esm/ideal/types.d.ts +3 -3
  52. package/dist/esm/ideal/types.d.ts.map +1 -1
  53. package/dist/esm/ideal/types.js.map +1 -1
  54. package/dist/esm/index.d.ts +25 -22
  55. package/dist/esm/index.d.ts.map +1 -1
  56. package/dist/esm/index.js +20 -17
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/esm/install.d.ts +11 -0
  59. package/dist/esm/install.d.ts.map +1 -0
  60. package/dist/esm/install.js +26 -0
  61. package/dist/esm/install.js.map +1 -0
  62. package/dist/esm/lockfile/load-edges.d.ts +3 -3
  63. package/dist/esm/lockfile/load-edges.d.ts.map +1 -1
  64. package/dist/esm/lockfile/load-edges.js +2 -1
  65. package/dist/esm/lockfile/load-edges.js.map +1 -1
  66. package/dist/esm/lockfile/load-nodes.d.ts +2 -2
  67. package/dist/esm/lockfile/load-nodes.d.ts.map +1 -1
  68. package/dist/esm/lockfile/load-nodes.js +7 -2
  69. package/dist/esm/lockfile/load-nodes.js.map +1 -1
  70. package/dist/esm/lockfile/load.d.ts +5 -5
  71. package/dist/esm/lockfile/load.d.ts.map +1 -1
  72. package/dist/esm/lockfile/load.js +6 -4
  73. package/dist/esm/lockfile/load.js.map +1 -1
  74. package/dist/esm/lockfile/save.d.ts +5 -5
  75. package/dist/esm/lockfile/save.d.ts.map +1 -1
  76. package/dist/esm/lockfile/save.js +6 -3
  77. package/dist/esm/lockfile/save.js.map +1 -1
  78. package/dist/esm/lockfile/types.d.ts +5 -5
  79. package/dist/esm/lockfile/types.d.ts.map +1 -1
  80. package/dist/esm/lockfile/types.js.map +1 -1
  81. package/dist/esm/node.d.ts +34 -15
  82. package/dist/esm/node.d.ts.map +1 -1
  83. package/dist/esm/node.js +57 -17
  84. package/dist/esm/node.js.map +1 -1
  85. package/dist/esm/reify/add-edge.d.ts +4 -4
  86. package/dist/esm/reify/add-edge.d.ts.map +1 -1
  87. package/dist/esm/reify/add-edge.js +22 -11
  88. package/dist/esm/reify/add-edge.js.map +1 -1
  89. package/dist/esm/reify/add-edges.d.ts +4 -4
  90. package/dist/esm/reify/add-edges.d.ts.map +1 -1
  91. package/dist/esm/reify/add-edges.js +2 -2
  92. package/dist/esm/reify/add-edges.js.map +1 -1
  93. package/dist/esm/reify/add-nodes.d.ts +5 -5
  94. package/dist/esm/reify/add-nodes.d.ts.map +1 -1
  95. package/dist/esm/reify/add-nodes.js +10 -7
  96. package/dist/esm/reify/add-nodes.js.map +1 -1
  97. package/dist/esm/reify/bin-paths.d.ts +1 -1
  98. package/dist/esm/reify/bin-paths.d.ts.map +1 -1
  99. package/dist/esm/reify/bin-paths.js.map +1 -1
  100. package/dist/esm/reify/build.d.ts +3 -3
  101. package/dist/esm/reify/build.d.ts.map +1 -1
  102. package/dist/esm/reify/build.js +9 -9
  103. package/dist/esm/reify/build.js.map +1 -1
  104. package/dist/esm/reify/delete-edge.d.ts +3 -3
  105. package/dist/esm/reify/delete-edge.d.ts.map +1 -1
  106. package/dist/esm/reify/delete-edge.js +3 -3
  107. package/dist/esm/reify/delete-edge.js.map +1 -1
  108. package/dist/esm/reify/delete-edges.d.ts +3 -3
  109. package/dist/esm/reify/delete-edges.d.ts.map +1 -1
  110. package/dist/esm/reify/delete-edges.js +1 -1
  111. package/dist/esm/reify/delete-edges.js.map +1 -1
  112. package/dist/esm/reify/delete-nodes.d.ts +3 -3
  113. package/dist/esm/reify/delete-nodes.d.ts.map +1 -1
  114. package/dist/esm/reify/delete-nodes.js +4 -0
  115. package/dist/esm/reify/delete-nodes.js.map +1 -1
  116. package/dist/esm/reify/index.d.ts +6 -5
  117. package/dist/esm/reify/index.d.ts.map +1 -1
  118. package/dist/esm/reify/index.js +25 -19
  119. package/dist/esm/reify/index.js.map +1 -1
  120. package/dist/esm/reify/optional-fail.d.ts +2 -2
  121. package/dist/esm/reify/optional-fail.d.ts.map +1 -1
  122. package/dist/esm/reify/optional-fail.js +1 -1
  123. package/dist/esm/reify/optional-fail.js.map +1 -1
  124. package/dist/esm/reify/rollback.d.ts +2 -2
  125. package/dist/esm/reify/rollback.d.ts.map +1 -1
  126. package/dist/esm/reify/rollback.js +1 -1
  127. package/dist/esm/reify/rollback.js.map +1 -1
  128. package/dist/esm/reify/update-importers-package-json.d.ts +3 -3
  129. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  130. package/dist/esm/reify/update-importers-package-json.js +25 -6
  131. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  132. package/dist/esm/remove-optional-subgraph.d.ts +2 -2
  133. package/dist/esm/remove-optional-subgraph.d.ts.map +1 -1
  134. package/dist/esm/remove-optional-subgraph.js.map +1 -1
  135. package/dist/esm/resolve-save-type.d.ts +7 -0
  136. package/dist/esm/resolve-save-type.d.ts.map +1 -0
  137. package/dist/esm/resolve-save-type.js +5 -0
  138. package/dist/esm/resolve-save-type.js.map +1 -0
  139. package/dist/esm/stringify-node.d.ts +1 -1
  140. package/dist/esm/stringify-node.d.ts.map +1 -1
  141. package/dist/esm/stringify-node.js.map +1 -1
  142. package/dist/esm/types.d.ts +13 -4
  143. package/dist/esm/types.d.ts.map +1 -1
  144. package/dist/esm/types.js.map +1 -1
  145. package/dist/esm/uninstall.d.ts +11 -0
  146. package/dist/esm/uninstall.d.ts.map +1 -0
  147. package/dist/esm/uninstall.js +26 -0
  148. package/dist/esm/uninstall.js.map +1 -0
  149. package/dist/esm/visualization/human-readable-output.d.ts +7 -7
  150. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
  151. package/dist/esm/visualization/human-readable-output.js +35 -21
  152. package/dist/esm/visualization/human-readable-output.js.map +1 -1
  153. package/dist/esm/visualization/json-output.d.ts +4 -4
  154. package/dist/esm/visualization/json-output.d.ts.map +1 -1
  155. package/dist/esm/visualization/json-output.js +1 -1
  156. package/dist/esm/visualization/json-output.js.map +1 -1
  157. package/dist/esm/visualization/mermaid-output.d.ts +3 -3
  158. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  159. package/dist/esm/visualization/mermaid-output.js +2 -2
  160. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  161. package/dist/esm/visualization/object-like-output.d.ts +1 -1
  162. package/dist/esm/visualization/object-like-output.d.ts.map +1 -1
  163. package/dist/esm/visualization/object-like-output.js.map +1 -1
  164. package/package.json +34 -28
@@ -1,6 +1,6 @@
1
- import { type SpecOptions } from '@vltpkg/spec';
2
- import { type Graph } from '../graph.js';
3
- import { type LockfileData } from './types.js';
1
+ import type { SpecOptions } from '@vltpkg/spec';
2
+ import type { Graph } from '../graph.ts';
3
+ import type { LockfileData } from './types.ts';
4
4
  export type SaveOptions = SpecOptions & {
5
5
  /**
6
6
  * The graph to be stored in the lockfile.
@@ -13,6 +13,6 @@ export type SaveOptions = SpecOptions & {
13
13
  };
14
14
  export declare const lockfileData: ({ graph, "git-hosts": gitHosts, "git-host-archives": gitHostArchives, registry, registries, saveManifests, "scope-registries": scopeRegistries, }: SaveOptions) => LockfileData;
15
15
  export declare const saveData: (data: LockfileData, fileName: string, saveManifests?: boolean) => void;
16
- export declare const save: (options: SaveOptions) => void;
17
- export declare const saveHidden: (options: SaveOptions) => void;
16
+ export declare const save: (options: Omit<SaveOptions, "saveManifests">) => void;
17
+ export declare const saveHidden: (options: Omit<SaveOptions, "saveManifests">) => void;
18
18
  //# sourceMappingURL=save.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAA;AAExC,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAgGD,eAAO,MAAM,YAAY,sJAQtB,WAAW,KAAG,YAwChB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,kCAMjB,CAAA;AAED,eAAO,MAAM,IAAI,YAAa,WAAW,SAKxC,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,WAAW,SAS9C,CAAA"}
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAI/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGxC,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAA;IACZ;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAoGD,eAAO,MAAM,YAAY,sJAQtB,WAAW,KAAG,YAwChB,CAAA;AAeD,eAAO,MAAM,QAAQ,SACb,YAAY,YACR,MAAM,8BAEf,IAIF,CAAA;AAED,eAAO,MAAM,IAAI,YACN,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IAKF,CAAA;AAED,eAAO,MAAM,UAAU,YACZ,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,KAC1C,IASF,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { defaultRegistry, defaultRegistries, defaultGitHosts, defaultGitHostArchives, defaultScopeRegistries, } from '@vltpkg/spec';
2
2
  import { mkdirSync, writeFileSync } from 'node:fs';
3
3
  import { dirname, resolve } from 'node:path';
4
- import { getFlagNumFromNode, } from './types.js';
4
+ import { getFlagNumFromNode } from "./types.js";
5
5
  const formatNodes = (nodes, saveManifests, registry) => {
6
6
  // we do not store importers in the lockfile, though we do store
7
7
  // their edges. when we load, we always read workspaces/main fresh.
@@ -33,6 +33,9 @@ const formatNodes = (nodes, saveManifests, registry) => {
33
33
  }
34
34
  if (saveManifests) {
35
35
  lockfileNode[5] = node.manifest;
36
+ if (node.confused) {
37
+ lockfileNode[6] = node.rawManifest;
38
+ }
36
39
  }
37
40
  res[node.id] = lockfileNode;
38
41
  }
@@ -116,13 +119,13 @@ export const save = (options) => {
116
119
  const { graph } = options;
117
120
  const data = lockfileData({ ...options, saveManifests: false });
118
121
  const fileName = resolve(graph.projectRoot, 'vlt-lock.json');
119
- return saveData(data, fileName, false);
122
+ saveData(data, fileName, false);
120
123
  };
121
124
  export const saveHidden = (options) => {
122
125
  const { graph } = options;
123
126
  const data = lockfileData({ ...options, saveManifests: true });
124
127
  const fileName = resolve(graph.projectRoot, 'node_modules/.vlt-lock.json');
125
128
  mkdirSync(dirname(fileName), { recursive: true });
126
- return saveData(data, fileName, true);
129
+ saveData(data, fileName, true);
127
130
  };
128
131
  //# sourceMappingURL=save.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,GAEvB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAI5C,OAAO,EACL,kBAAkB,GAMnB,MAAM,YAAY,CAAA;AAanB,MAAM,WAAW,GAAG,CAClB,KAAqB,EACrB,aAAuB,EACvB,QAAiB,EACjB,EAAE;IACF,gEAAgE;IAChE,mEAAmE;IACnE,MAAM,GAAG,GAAW,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7D,2DAA2D;IAC3D,MAAM,YAAY,GAAW,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC7C,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAC/B,CAAA;IAED,MAAM,GAAG,GAAgC,EAAE,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3D,2DAA2D;QAC3D,MAAM,QAAQ,GACZ,CACE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,qBAAqB;gBACnB,IAAI,CAAC,EAAE;gBACP,gBAAgB;gBAChB,IAAI,CAAC,IAAI,CACZ,CACF,CAAC,CAAC;YACD,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA;QAEjB,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,YAAY,GAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAErD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;QAClC,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC5B,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAA;QAC5B,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;QACjC,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,YAAY,CAAA;IAC7B,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAiB,EAAE,CACtD,MAAM,CAAC,WAAW,CAChB,CAAC,GAAG,KAAK,CAAC;KACP,IAAI,CACH,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;AACP,4DAA4D;AAC5D,oDAAoD;AACpD,mBAAmB;AACnB,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;IACxC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;IAClC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAEjD;KACA,GAAG,CAAC,CAAC,IAAI,EAAwC,EAAE,CAAC;IACnD,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;IACnC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,SAAS,EAAE;CACxE,CAAC,CACL,CAAA;AAEH,MAAM,oBAAoB,GAAG,CAC3B,UAAmB,EACmB,EAAE,CACxC,CAAC,CAAC,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAA;AAElD,MAAM,kBAAkB,GAAG,CACzB,YAAoC,EACpC,KAA6B,EAC7B,EAAE;IACF,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC;YACtD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,KAAK,EACL,WAAW,EAAE,QAAQ,EACrB,mBAAmB,EAAE,eAAe,EACpC,QAAQ,EACR,UAAU,EACV,aAAa,EACb,kBAAkB,EAAE,eAAe,GACvB,EAAgB,EAAE;IAC9B,MAAM,aAAa,GACjB,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9B,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,oBAAoB,GACxB,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC;QACrC,kBAAkB,CAAC,sBAAsB,EAAE,eAAe,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,eAAe,GACnB,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;QAChC,kBAAkB,CAAC,iBAAiB,EAAE,UAAU,CAAC;QACnD,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,oBAAoB,GACxB,oBAAoB,CAAC,eAAe,CAAC,CAAC,CAAC;QACrC,kBAAkB,CAAC,sBAAsB,EAAE,eAAe,CAAC;QAC7D,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,QAAQ,GAAG,CAAC,KAAyC,EAAE,EAAE,CAC7D,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;IACpC,OAAO;QACL,OAAO,EAAE;YACP,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAClC,EAAE,kBAAkB,EAAE,oBAAoB,EAAE;gBAC9C,CAAC,CAAC,SAAS,CAAC;YACZ,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,eAAe,CAAC,CAAC;gBAC1D,EAAE,QAAQ,EAAE;gBACd,CAAC,CAAC,SAAS,CAAC;YACZ,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;gBACxB,EAAE,UAAU,EAAE,eAAe,EAAE;gBACjC,CAAC,CAAC,SAAS,CAAC;YACZ,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;gBAC3B,EAAE,WAAW,EAAE,aAAa,EAAE;gBAChC,CAAC,CAAC,SAAS,CAAC;YACZ,GAAG,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAClC,EAAE,mBAAmB,EAAE,oBAAoB,EAAE;gBAC/C,CAAC,CAAC,SAAS,CAAC;SACb;QACD,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,QAAQ,CAAC;QACjE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC;KAChC,CAAA;AACH,CAAC,CAAA;AAED,kDAAkD;AAClD,MAAM,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE;IACzC,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,CAAA;IAC7B,MAAM,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CACN,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAC3D,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AACjC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,IAAkB,EAClB,QAAgB,EAChB,aAAa,GAAG,KAAK,EACrB,EAAE;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACxD,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAE,EAAE;IAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IACzB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAA;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;IAC5D,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;AACxC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAoB,EAAE,EAAE;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IACzB,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,MAAM,QAAQ,GAAG,OAAO,CACtB,KAAK,CAAC,WAAW,EACjB,6BAA6B,CAC9B,CAAA;IACD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,OAAO,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { type DepID } from '@vltpkg/dep-id'\nimport {\n defaultRegistry,\n defaultRegistries,\n defaultGitHosts,\n defaultGitHostArchives,\n defaultScopeRegistries,\n type SpecOptions,\n} from '@vltpkg/spec'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { type Edge } from '../edge.js'\nimport { type Graph } from '../graph.js'\nimport { type Node } from '../node.js'\nimport {\n getFlagNumFromNode,\n type LockfileData,\n type LockfileEdgeKey,\n type LockfileEdges,\n type LockfileEdgeValue,\n type LockfileNode,\n} from './types.js'\n\nexport type SaveOptions = SpecOptions & {\n /**\n * The graph to be stored in the lockfile.\n */\n graph: Graph\n /**\n * Should it save manifest data in the lockfile?\n */\n saveManifests?: boolean\n}\n\nconst formatNodes = (\n nodes: Iterable<Node>,\n saveManifests?: boolean,\n registry?: string,\n) => {\n // we do not store importers in the lockfile, though we do store\n // their edges. when we load, we always read workspaces/main fresh.\n const arr: Node[] = [...nodes].filter(node => !node.importer)\n // nodes are sorted in order to have a deterministic result\n const orderedNodes: Node[] = arr.sort((a, b) =>\n a.id.localeCompare(b.id, 'en'),\n )\n\n const res: Record<DepID, LockfileNode> = {}\n for (const node of orderedNodes) {\n const customRegistry =\n node.resolved && registry && !node.resolved.startsWith(registry)\n const resolved = customRegistry ? node.resolved : undefined\n // if it's in a location other than the default, stash that\n const location =\n (\n node.id.startsWith('file') ||\n node.location.endsWith(\n '/node_modules/.vlt/' +\n node.id +\n '/node_modules/' +\n node.name,\n )\n ) ?\n undefined\n : node.location\n\n const flags = getFlagNumFromNode(node)\n const lockfileNode: LockfileNode = [flags, node.name]\n\n if (node.integrity) {\n lockfileNode[2] = node.integrity\n }\n\n if (resolved) {\n lockfileNode[3] = resolved\n }\n\n if (location) {\n lockfileNode[4] = location\n }\n\n if (saveManifests) {\n lockfileNode[5] = node.manifest\n }\n\n res[node.id] = lockfileNode\n }\n return res\n}\n\nconst formatEdges = (edges: Set<Edge>): LockfileEdges =>\n Object.fromEntries(\n [...edges]\n .sort(\n (a, b) =>\n /* c8 ignore start - nondeterminstic and annoying to test */\n // sort importers to the top, then alphabetically by\n // id, type, target\n Number(b.from.importer) - Number(a.from.importer) ||\n a.from.id.localeCompare(b.from.id, 'en') ||\n a.type.localeCompare(b.type, 'en') ||\n (a.to?.id ?? '').localeCompare(b.to?.id ?? ''),\n /* c8 ignore stop */\n )\n .map((edge): [LockfileEdgeKey, LockfileEdgeValue] => [\n `${edge.from.id} ${edge.spec.name}`,\n `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,\n ]),\n )\n\nconst isRecordStringString = (\n registries: unknown,\n): registries is Record<string, string> =>\n !(!registries || typeof registries === 'string')\n\nconst removeDefaultItems = (\n defaultItems: Record<string, string>,\n items: Record<string, string>,\n) => {\n const res: Record<string, string> = {}\n for (const [key, value] of Object.entries(items)) {\n if (!defaultItems[key] || defaultItems[key] !== value) {\n res[key] = value\n }\n }\n return res\n}\n\nexport const lockfileData = ({\n graph,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n registry,\n registries,\n saveManifests,\n 'scope-registries': scopeRegistries,\n}: SaveOptions): LockfileData => {\n const cleanGitHosts =\n isRecordStringString(gitHosts) ?\n removeDefaultItems(defaultGitHosts, gitHosts)\n : undefined\n const cleanGitHostArchives =\n isRecordStringString(gitHostArchives) ?\n removeDefaultItems(defaultGitHostArchives, gitHostArchives)\n : undefined\n const cleanRegistries =\n isRecordStringString(registries) ?\n removeDefaultItems(defaultRegistries, registries)\n : undefined\n const cleanScopeRegistries =\n isRecordStringString(scopeRegistries) ?\n removeDefaultItems(defaultScopeRegistries, scopeRegistries)\n : undefined\n const hasItems = (clean: Record<string, string> | undefined) =>\n clean && Object.keys(clean).length\n return {\n options: {\n ...(hasItems(cleanScopeRegistries) ?\n { 'scope-registries': cleanScopeRegistries }\n : undefined),\n ...(registry !== undefined && registry !== defaultRegistry ?\n { registry }\n : undefined),\n ...(hasItems(registries) ?\n { registries: cleanRegistries }\n : undefined),\n ...(hasItems(cleanGitHosts) ?\n { 'git-hosts': cleanGitHosts }\n : undefined),\n ...(hasItems(cleanGitHostArchives) ?\n { 'git-host-archives': cleanGitHostArchives }\n : undefined),\n },\n nodes: formatNodes(graph.nodes.values(), saveManifests, registry),\n edges: formatEdges(graph.edges),\n }\n}\n\n// renders each node / edge as a single line entry\nconst extraFormat = (jsonString: string) => {\n const str = `${jsonString}\\n`\n const [init, ...parts] = str.split(' \"nodes\": {')\n const res = [init]\n for (const part of parts) {\n res.push(\n part.replaceAll('\\n ', '').replaceAll('\\n ]', ']'),\n )\n }\n return res.join(' \"nodes\": {')\n}\n\nexport const saveData = (\n data: LockfileData,\n fileName: string,\n saveManifests = false,\n) => {\n const json = JSON.stringify(data, null, 2)\n const content = saveManifests ? json : extraFormat(json)\n writeFileSync(fileName, content)\n}\n\nexport const save = (options: SaveOptions) => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: false })\n const fileName = resolve(graph.projectRoot, 'vlt-lock.json')\n return saveData(data, fileName, false)\n}\n\nexport const saveHidden = (options: SaveOptions) => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: true })\n const fileName = resolve(\n graph.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n mkdirSync(dirname(fileName), { recursive: true })\n return saveData(data, fileName, true)\n}\n"]}
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/lockfile/save.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport {\n defaultRegistry,\n defaultRegistries,\n defaultGitHosts,\n defaultGitHostArchives,\n defaultScopeRegistries,\n} from '@vltpkg/spec'\nimport type { SpecOptions } from '@vltpkg/spec'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport type { Edge } from '../edge.ts'\nimport type { Graph } from '../graph.ts'\nimport type { Node } from '../node.ts'\nimport { getFlagNumFromNode } from './types.ts'\nimport type {\n LockfileData,\n LockfileEdgeKey,\n LockfileEdges,\n LockfileEdgeValue,\n LockfileNode,\n} from './types.ts'\n\nexport type SaveOptions = SpecOptions & {\n /**\n * The graph to be stored in the lockfile.\n */\n graph: Graph\n /**\n * Should it save manifest data in the lockfile?\n */\n saveManifests?: boolean\n}\n\nconst formatNodes = (\n nodes: Iterable<Node>,\n saveManifests?: boolean,\n registry?: string,\n) => {\n // we do not store importers in the lockfile, though we do store\n // their edges. when we load, we always read workspaces/main fresh.\n const arr: Node[] = [...nodes].filter(node => !node.importer)\n // nodes are sorted in order to have a deterministic result\n const orderedNodes: Node[] = arr.sort((a, b) =>\n a.id.localeCompare(b.id, 'en'),\n )\n\n const res: Record<DepID, LockfileNode> = {}\n for (const node of orderedNodes) {\n const customRegistry =\n node.resolved && registry && !node.resolved.startsWith(registry)\n const resolved = customRegistry ? node.resolved : undefined\n // if it's in a location other than the default, stash that\n const location =\n (\n node.id.startsWith('file') ||\n node.location.endsWith(\n '/node_modules/.vlt/' +\n node.id +\n '/node_modules/' +\n node.name,\n )\n ) ?\n undefined\n : node.location\n\n const flags = getFlagNumFromNode(node)\n const lockfileNode: LockfileNode = [flags, node.name]\n\n if (node.integrity) {\n lockfileNode[2] = node.integrity\n }\n\n if (resolved) {\n lockfileNode[3] = resolved\n }\n\n if (location) {\n lockfileNode[4] = location\n }\n\n if (saveManifests) {\n lockfileNode[5] = node.manifest\n\n if (node.confused) {\n lockfileNode[6] = node.rawManifest\n }\n }\n\n res[node.id] = lockfileNode\n }\n return res\n}\n\nconst formatEdges = (edges: Set<Edge>): LockfileEdges =>\n Object.fromEntries(\n [...edges]\n .sort(\n (a, b) =>\n /* c8 ignore start - nondeterminstic and annoying to test */\n // sort importers to the top, then alphabetically by\n // id, type, target\n Number(b.from.importer) - Number(a.from.importer) ||\n a.from.id.localeCompare(b.from.id, 'en') ||\n a.type.localeCompare(b.type, 'en') ||\n (a.to?.id ?? '').localeCompare(b.to?.id ?? ''),\n /* c8 ignore stop */\n )\n .map((edge): [LockfileEdgeKey, LockfileEdgeValue] => [\n `${edge.from.id} ${edge.spec.name}`,\n `${edge.type} ${edge.spec.bareSpec || '*'} ${edge.to?.id ?? 'MISSING'}`,\n ]),\n )\n\nconst isRecordStringString = (\n registries: unknown,\n): registries is Record<string, string> =>\n !(!registries || typeof registries === 'string')\n\nconst removeDefaultItems = (\n defaultItems: Record<string, string>,\n items: Record<string, string>,\n) => {\n const res: Record<string, string> = {}\n for (const [key, value] of Object.entries(items)) {\n if (!defaultItems[key] || defaultItems[key] !== value) {\n res[key] = value\n }\n }\n return res\n}\n\nexport const lockfileData = ({\n graph,\n 'git-hosts': gitHosts,\n 'git-host-archives': gitHostArchives,\n registry,\n registries,\n saveManifests,\n 'scope-registries': scopeRegistries,\n}: SaveOptions): LockfileData => {\n const cleanGitHosts =\n isRecordStringString(gitHosts) ?\n removeDefaultItems(defaultGitHosts, gitHosts)\n : undefined\n const cleanGitHostArchives =\n isRecordStringString(gitHostArchives) ?\n removeDefaultItems(defaultGitHostArchives, gitHostArchives)\n : undefined\n const cleanRegistries =\n isRecordStringString(registries) ?\n removeDefaultItems(defaultRegistries, registries)\n : undefined\n const cleanScopeRegistries =\n isRecordStringString(scopeRegistries) ?\n removeDefaultItems(defaultScopeRegistries, scopeRegistries)\n : undefined\n const hasItems = (clean: Record<string, string> | undefined) =>\n clean && Object.keys(clean).length\n return {\n options: {\n ...(hasItems(cleanScopeRegistries) ?\n { 'scope-registries': cleanScopeRegistries }\n : undefined),\n ...(registry !== undefined && registry !== defaultRegistry ?\n { registry }\n : undefined),\n ...(hasItems(registries) ?\n { registries: cleanRegistries }\n : undefined),\n ...(hasItems(cleanGitHosts) ?\n { 'git-hosts': cleanGitHosts }\n : undefined),\n ...(hasItems(cleanGitHostArchives) ?\n { 'git-host-archives': cleanGitHostArchives }\n : undefined),\n },\n nodes: formatNodes(graph.nodes.values(), saveManifests, registry),\n edges: formatEdges(graph.edges),\n }\n}\n\n// renders each node / edge as a single line entry\nconst extraFormat = (jsonString: string) => {\n const str = `${jsonString}\\n`\n const [init, ...parts] = str.split(' \"nodes\": {')\n const res = [init]\n for (const part of parts) {\n res.push(\n part.replaceAll('\\n ', '').replaceAll('\\n ]', ']'),\n )\n }\n return res.join(' \"nodes\": {')\n}\n\nexport const saveData = (\n data: LockfileData,\n fileName: string,\n saveManifests = false,\n): void => {\n const json = JSON.stringify(data, null, 2)\n const content = saveManifests ? json : extraFormat(json)\n writeFileSync(fileName, content)\n}\n\nexport const save = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: false })\n const fileName = resolve(graph.projectRoot, 'vlt-lock.json')\n saveData(data, fileName, false)\n}\n\nexport const saveHidden = (\n options: Omit<SaveOptions, 'saveManifests'>,\n): void => {\n const { graph } = options\n const data = lockfileData({ ...options, saveManifests: true })\n const fileName = resolve(\n graph.projectRoot,\n 'node_modules/.vlt-lock.json',\n )\n mkdirSync(dirname(fileName), { recursive: true })\n saveData(data, fileName, true)\n}\n"]}
@@ -1,7 +1,6 @@
1
- import { type DepID } from '@vltpkg/dep-id';
2
- import { type Spec, type SpecOptions } from '@vltpkg/spec';
3
- import { type Integrity, type Manifest } from '@vltpkg/types';
4
- import { type DependencyTypeShort } from '../dependencies.js';
1
+ import type { DepID } from '@vltpkg/dep-id';
2
+ import type { Spec, SpecOptions } from '@vltpkg/spec';
3
+ import type { Integrity, Manifest, DependencyTypeShort } from '@vltpkg/types';
5
4
  /**
6
5
  * This is the main type definition for the contents of the
7
6
  * `vlt-lock.json` file.
@@ -39,7 +38,8 @@ export type LockfileNode = [
39
38
  integrity?: Integrity | null,
40
39
  resolved?: string | null,
41
40
  location?: string | null,
42
- manifest?: Manifest | null
41
+ manifest?: Manifest | null,
42
+ rawManifest?: Manifest | null
43
43
  ];
44
44
  /**
45
45
  * Lockfile edges are stored as a record object where the key
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,kBAIuB,CAAA;AAExB,eAAO,MAAM,sBAAsB,UAAW,iBAAiB;;;CAG7D,CAAA;AAEF,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,2BAA2B,IAAI,CAAA;AAE5C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,iBAAiB;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IACpB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;CAC3B,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC1C,CAAA;AAED,4BAA4B;AAC5B,MAAM,MAAM,eAAe,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAA;AAElD,8BAA8B;AAC9B,MAAM,MAAM,iBAAiB,GAC3B,GAAG,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,mBAAmB,EACpB,MAAM,eAAe,CAAA;AAGtB;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,WAAW,CAAA;IACpB,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,aAAa,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd,kBAIuB,CAAA;AAExB,eAAO,MAAM,sBAAsB,UAAW,iBAAiB;;;CAG7D,CAAA;AAEF,eAAO,MAAM,oBAAoB,IAAI,CAAA;AACrC,eAAO,MAAM,wBAAwB,IAAI,CAAA;AACzC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,2BAA2B,IAAI,CAAA;AAE5C;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,iBAAiB;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IACpB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;IAC1B,WAAW,CAAC,EAAE,QAAQ,GAAG,IAAI;CAC9B,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,GAAG,EAAE,eAAe,GAAG,iBAAiB,CAAA;CAC1C,CAAA;AAED,4BAA4B;AAC5B,MAAM,MAAM,eAAe,GAAG,GAAG,KAAK,IAAI,MAAM,EAAE,CAAA;AAElD,8BAA8B;AAC9B,MAAM,MAAM,iBAAiB,GAC3B,GAAG,mBAAmB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,GAAG,SAAS,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAmBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAGlC,EAAE,EAAE,CACH,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB;QAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB;YAChC,CAAC,CAAC,oBAAoB,CAAA;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,wBAAwB,CAAC;CAC/C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAA","sourcesContent":["import { type DepID } from '@vltpkg/dep-id'\nimport { type Spec, type SpecOptions } from '@vltpkg/spec'\nimport { type Integrity, type Manifest } from '@vltpkg/types'\nimport { type DependencyTypeShort } from '../dependencies.js'\nimport { type Graph } from '../graph.js'\n\n/**\n * This is the main type definition for the contents of the\n * `vlt-lock.json` file.\n *\n * The nodes and edges information from the lockfile are used to reconstruct\n * a {@link Graph} representing a previous install.\n */\nexport type LockfileData = {\n options: SpecOptions\n nodes: Record<DepID, LockfileNode>\n edges: LockfileEdges\n}\n\nexport const getFlagNumFromNode = (node: {\n optional?: boolean\n dev?: boolean\n}) =>\n node.optional && node.dev ? LockfileNodeFlagDevOptional\n : node.optional ? LockfileNodeFlagOptional\n : node.dev ? LockfileNodeFlagDev\n : LockfileNodeFlagNone\n\nexport const getBooleanFlagsFromNum = (flags: LockfileNodeFlags) => ({\n dev: !!(flags & LockfileNodeFlagDev),\n optional: !!(flags & LockfileNodeFlagOptional),\n})\n\nexport const LockfileNodeFlagNone = 0\nexport const LockfileNodeFlagOptional = 1\nexport const LockfileNodeFlagDev = 2\nexport const LockfileNodeFlagDevOptional = 3\n\n/**\n * Bit flags indicating whether a node is optional and/or dev.\n */\nexport type LockfileNodeFlags = 0 | 1 | 2 | 3\n\n/**\n * Lockfile representation of a node from the install graph.\n */\nexport type LockfileNode = [\n flags: LockfileNodeFlags,\n name?: string | null,\n integrity?: Integrity | null,\n resolved?: string | null,\n location?: string | null,\n manifest?: Manifest | null,\n]\n\n/**\n * Lockfile edges are stored as a record object where the key\n * is `${from.id} ${spec.name}` and the value is\n * `${type} ${spec.bareSpec} ${to.id | 'MISSING'}`\n *\n * Storing them in a record like this means that we are guaranteed to\n * never end up with duplicates, and a standard `JSON.stringify()`\n * will nicely print them out one line per edge.\n */\nexport type LockfileEdges = {\n [key: LockfileEdgeKey]: LockfileEdgeValue\n}\n\n/** `${from} ${dep name}` */\nexport type LockfileEdgeKey = `${DepID} ${string}`\n\n/** `${type} ${spec} ${to}` */\nexport type LockfileEdgeValue =\n `${DependencyTypeShort} ${Spec['bareSpec']} ${DepID | 'MISSING'}`\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lockfile/types.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAGlC,EAAE,EAAE,CACH,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;IACvD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,wBAAwB;QAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,mBAAmB;YAChC,CAAC,CAAC,oBAAoB,CAAA;AAExB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,wBAAwB,CAAC;CAC/C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAA;AACrC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAA;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAA","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport type { Spec, SpecOptions } from '@vltpkg/spec'\nimport type {\n Integrity,\n Manifest,\n DependencyTypeShort,\n} from '@vltpkg/types'\nimport type { Graph } from '../graph.ts'\n\n/**\n * This is the main type definition for the contents of the\n * `vlt-lock.json` file.\n *\n * The nodes and edges information from the lockfile are used to reconstruct\n * a {@link Graph} representing a previous install.\n */\nexport type LockfileData = {\n options: SpecOptions\n nodes: Record<DepID, LockfileNode>\n edges: LockfileEdges\n}\n\nexport const getFlagNumFromNode = (node: {\n optional?: boolean\n dev?: boolean\n}) =>\n node.optional && node.dev ? LockfileNodeFlagDevOptional\n : node.optional ? LockfileNodeFlagOptional\n : node.dev ? LockfileNodeFlagDev\n : LockfileNodeFlagNone\n\nexport const getBooleanFlagsFromNum = (flags: LockfileNodeFlags) => ({\n dev: !!(flags & LockfileNodeFlagDev),\n optional: !!(flags & LockfileNodeFlagOptional),\n})\n\nexport const LockfileNodeFlagNone = 0\nexport const LockfileNodeFlagOptional = 1\nexport const LockfileNodeFlagDev = 2\nexport const LockfileNodeFlagDevOptional = 3\n\n/**\n * Bit flags indicating whether a node is optional and/or dev.\n */\nexport type LockfileNodeFlags = 0 | 1 | 2 | 3\n\n/**\n * Lockfile representation of a node from the install graph.\n */\nexport type LockfileNode = [\n flags: LockfileNodeFlags,\n name?: string | null,\n integrity?: Integrity | null,\n resolved?: string | null,\n location?: string | null,\n manifest?: Manifest | null,\n rawManifest?: Manifest | null,\n]\n\n/**\n * Lockfile edges are stored as a record object where the key\n * is `${from.id} ${spec.name}` and the value is\n * `${type} ${spec.bareSpec} ${to.id | 'MISSING'}`\n *\n * Storing them in a record like this means that we are guaranteed to\n * never end up with duplicates, and a standard `JSON.stringify()`\n * will nicely print them out one line per edge.\n */\nexport type LockfileEdges = {\n [key: LockfileEdgeKey]: LockfileEdgeValue\n}\n\n/** `${from} ${dep name}` */\nexport type LockfileEdgeKey = `${DepID} ${string}`\n\n/** `${type} ${spec} ${to}` */\nexport type LockfileEdgeValue =\n `${DependencyTypeShort} ${Spec['bareSpec']} ${DepID | 'MISSING'}`\n"]}
@@ -1,9 +1,9 @@
1
- import { type DepID } from '@vltpkg/dep-id';
2
- import { type Spec, type SpecOptions } from '@vltpkg/spec';
3
- import { type Integrity, type Manifest } from '@vltpkg/types';
4
- import { type DependencyTypeShort } from './dependencies.js';
5
- import { Edge } from './edge.js';
6
- import { type GraphLike, type NodeLike } from './types.js';
1
+ import type { PathScurry } from 'path-scurry';
2
+ import type { DepID } from '@vltpkg/dep-id';
3
+ import type { Spec, SpecOptions } from '@vltpkg/spec';
4
+ import type { Integrity, Manifest, DependencyTypeShort } from '@vltpkg/types';
5
+ import { Edge } from './edge.ts';
6
+ import type { GraphLike, NodeLike } from './types.ts';
7
7
  export type NodeOptions = SpecOptions & {
8
8
  projectRoot: string;
9
9
  graph: GraphLike;
@@ -34,6 +34,10 @@ 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;
37
41
  /**
38
42
  * List of edges coming into this node.
39
43
  */
@@ -78,15 +82,6 @@ export declare class Node implements NodeLike {
78
82
  */
79
83
  registry?: string;
80
84
  get name(): string;
81
- /**
82
- * The location of the node_modules folder where this node's edgesOut
83
- * should be linked into. For nodes in the store, this is the parent
84
- * directory, since they're extracted into a node_modules folder
85
- * side by side with links to their deps. For nodes outside of the store
86
- * (ie, importers and arbitrary link deps) this is the node_modules folder
87
- * directly inside the node's directory.
88
- */
89
- get nodeModules(): string;
90
85
  /**
91
86
  * The version of the package represented by this node, this is usually
92
87
  * equivalent to `manifest.version` but in a few ways it may differ such as
@@ -103,6 +98,19 @@ export declare class Node implements NodeLike {
103
98
  */
104
99
  get location(): string;
105
100
  set location(location: string);
101
+ /**
102
+ * The resolved location of the node in the file system.
103
+ */
104
+ resolvedLocation(scurry: PathScurry): string;
105
+ /**
106
+ * The location of the node_modules folder where this node's edgesOut
107
+ * should be linked into. For nodes in the store, this is the parent
108
+ * directory, since they're extracted into a node_modules folder
109
+ * side by side with links to their deps. For nodes outside of the store
110
+ * (ie, importers and arbitrary link deps) this is the node_modules folder
111
+ * directly inside the node's directory.
112
+ */
113
+ nodeModules(scurry: PathScurry): string;
106
114
  constructor(options: NodeOptions, id?: DepID, manifest?: Manifest, spec?: Spec, name?: string, version?: string);
107
115
  /**
108
116
  * return true if this node is located in the vlt store
@@ -126,7 +134,17 @@ export declare class Node implements NodeLike {
126
134
  * Add an edge from this node connecting it to a direct dependency.
127
135
  */
128
136
  addEdgesTo(type: DependencyTypeShort, spec: Spec, node?: Node): Edge;
137
+ /**
138
+ * The raw manifest before any modifications.
139
+ * If not set, falls back to the current manifest.
140
+ */
141
+ get rawManifest(): Manifest | undefined;
142
+ /**
143
+ * Sets this node as having a manifest-confused manifest.
144
+ */
145
+ setConfusedManifest(fixed: Manifest, confused?: Manifest): void;
129
146
  toJSON(): {
147
+ rawManifest?: Manifest | undefined;
130
148
  id: DepID;
131
149
  name: string;
132
150
  version: string | undefined;
@@ -138,6 +156,7 @@ export declare class Node implements NodeLike {
138
156
  resolved: string | undefined;
139
157
  dev: boolean;
140
158
  optional: boolean;
159
+ confused: boolean;
141
160
  };
142
161
  toString(): string;
143
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EAKX,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7D,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAI1D,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;;;;;;;OAOG;IACH,IAAI,WAAW,WAKd;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;gBAGC,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;IAuBlB;;;;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":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAO7C,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;IAOD;;;;;;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,QAAQ,UAAQ;IAEhB;;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;IAqClB;;;;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;;;OAGG;IACH,IAAI,WAAW,IAAI,QAAQ,GAAG,SAAS,CAEtC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,QAAQ;IAOxD,MAAM;;;;;;;;;;;;;;;IAoBN,QAAQ;CAGT"}
package/dist/esm/node.js CHANGED
@@ -1,13 +1,14 @@
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 { Edge } from './edge.js';
4
- import { stringifyNode } from './stringify-node.js';
3
+ import { Edge } from "./edge.js";
4
+ import { stringifyNode } from "./stringify-node.js";
5
5
  export class Node {
6
6
  get [Symbol.toStringTag]() {
7
7
  return '@vltpkg/graph.Node';
8
8
  }
9
9
  #options;
10
10
  #location;
11
+ #rawManifest;
11
12
  #optional = false;
12
13
  /**
13
14
  * True if a node is only reachable via optional or peerOptional edges from
@@ -57,6 +58,10 @@ export class Node {
57
58
  isDev() {
58
59
  return this.#dev;
59
60
  }
61
+ /**
62
+ * True if there's a manifest-confused package name.
63
+ */
64
+ confused = false;
60
65
  /**
61
66
  * List of edges coming into this node.
62
67
  */
@@ -113,20 +118,6 @@ export class Node {
113
118
  this.#name = this.id;
114
119
  return this.#name;
115
120
  }
116
- /**
117
- * The location of the node_modules folder where this node's edgesOut
118
- * should be linked into. For nodes in the store, this is the parent
119
- * directory, since they're extracted into a node_modules folder
120
- * side by side with links to their deps. For nodes outside of the store
121
- * (ie, importers and arbitrary link deps) this is the node_modules folder
122
- * directly inside the node's directory.
123
- */
124
- get nodeModules() {
125
- const loc = this.location;
126
- return this.inVltStore() ?
127
- loc.substring(0, loc.length - this.name.length - 1)
128
- : loc + '/node_modules';
129
- }
130
121
  /**
131
122
  * The version of the package represented by this node, this is usually
132
123
  * equivalent to `manifest.version` but in a few ways it may differ such as
@@ -157,6 +148,26 @@ export class Node {
157
148
  this.inVltStore = Node.prototype.inVltStore;
158
149
  }
159
150
  }
151
+ /**
152
+ * The resolved location of the node in the file system.
153
+ */
154
+ resolvedLocation(scurry) {
155
+ return scurry.cwd.resolve(this.location).fullpath();
156
+ }
157
+ /**
158
+ * The location of the node_modules folder where this node's edgesOut
159
+ * should be linked into. For nodes in the store, this is the parent
160
+ * directory, since they're extracted into a node_modules folder
161
+ * side by side with links to their deps. For nodes outside of the store
162
+ * (ie, importers and arbitrary link deps) this is the node_modules folder
163
+ * directly inside the node's directory.
164
+ */
165
+ nodeModules(scurry) {
166
+ const loc = this.resolvedLocation(scurry);
167
+ return this.inVltStore() ?
168
+ loc.substring(0, loc.length - this.name.length - 1)
169
+ : scurry.resolve(loc, 'node_modules');
170
+ }
160
171
  constructor(options, id, manifest, spec, name, version) {
161
172
  this.#options = options;
162
173
  this.projectRoot = options.projectRoot;
@@ -173,8 +184,17 @@ export class Node {
173
184
  }
174
185
  this.graph = options.graph;
175
186
  this.manifest = manifest;
187
+ if (isPackageNameConfused(spec, this.manifest?.name)) {
188
+ this.setConfusedManifest({
189
+ ...manifest,
190
+ name: spec?.name,
191
+ }, manifest);
192
+ }
176
193
  this.#name = name || this.manifest?.name;
177
194
  this.version = version || this.manifest?.version;
195
+ if (this.version?.startsWith('v')) {
196
+ this.version = this.version.slice(1);
197
+ }
178
198
  }
179
199
  /**
180
200
  * return true if this node is located in the vlt store
@@ -244,6 +264,22 @@ export class Node {
244
264
  this.edgesOut.set(spec.name, edge);
245
265
  return edge;
246
266
  }
267
+ /**
268
+ * The raw manifest before any modifications.
269
+ * If not set, falls back to the current manifest.
270
+ */
271
+ get rawManifest() {
272
+ return this.#rawManifest ?? this.manifest;
273
+ }
274
+ /**
275
+ * Sets this node as having a manifest-confused manifest.
276
+ */
277
+ setConfusedManifest(fixed, confused) {
278
+ this.manifest = fixed;
279
+ this.#rawManifest = confused;
280
+ this.confused = true;
281
+ this.#name = this.manifest.name;
282
+ }
247
283
  toJSON() {
248
284
  return {
249
285
  id: this.id,
@@ -257,6 +293,10 @@ export class Node {
257
293
  resolved: this.resolved,
258
294
  dev: this.dev,
259
295
  optional: this.optional,
296
+ confused: this.confused,
297
+ ...(this.confused ?
298
+ { rawManifest: this.#rawManifest }
299
+ : undefined),
260
300
  };
261
301
  }
262
302
  toString() {
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type DepID,\n type DepIDTuple,\n getId,\n hydrateTuple,\n splitDepID,\n} from '@vltpkg/dep-id'\nimport { typeError } from '@vltpkg/error-cause'\nimport { type Spec, type SpecOptions } from '@vltpkg/spec'\nimport { type Integrity, type Manifest } from '@vltpkg/types'\nimport { type DependencyTypeShort } from './dependencies.js'\nimport { Edge } from './edge.js'\nimport { type GraphLike, type NodeLike } from './types.js'\nimport { stringifyNode } from './stringify-node.js'\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 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 get nodeModules() {\n const loc = this.location\n return this.inVltStore() ?\n loc.substring(0, loc.length - this.name.length - 1)\n : loc + '/node_modules'\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 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 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 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":"AACA,OAAO,EACL,qBAAqB,EACrB,KAAK,EACL,YAAY,EACZ,UAAU,GACX,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAO/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAQnD,MAAM,OAAO,IAAI;IACf,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,oBAAoB,CAAA;IAC7B,CAAC;IAED,QAAQ,CAAa;IACrB,SAAS,CAAS;IAClB,YAAY,CAAW;IAEvB,SAAS,GAAG,KAAK,CAAA;IACjB;;;;;;OAMG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IACD,IAAI,QAAQ,CAAC,QAAiB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,8BAA8B;YAC9B,KAAK,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtD,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ;oBAAE,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAA;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,GAAG,KAAK,CAAA;IACZ;;;;;OAKG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IACD,IAAI,GAAG,CAAC,GAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,8BAA8B;YAC9B,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACjD,IAAI,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG;oBAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,QAAQ,GAAG,KAAK,CAAA;IAEhB;;OAEG;IACH,OAAO,GAAG,IAAI,GAAG,EAAQ,CAAA;IAEzB;;;OAGG;IACH,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAA;IAElC;;OAEG;IACH,EAAE,CAAO;IAET;;OAEG;IACH,QAAQ,GAAG,KAAK,CAAA;IAEhB;;OAEG;IACH,YAAY,GAAG,KAAK,CAAA;IAEpB;;OAEG;IACH,KAAK,CAAW;IAEhB;;OAEG;IACH,SAAS,CAAY;IAErB;;OAEG;IACH,QAAQ,CAAW;IAEnB;;OAEG;IACH,WAAW,CAAQ;IAEnB;;;;OAIG;IACH,QAAQ,CAAS;IAEjB;;;;;OAKG;IACH,KAAK,CAAS;IACd,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAA;QACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAA;QACpB,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAS;IAEhB;;OAEG;IACH,QAAQ,CAAS;IAEjB;;OAEG;IACH,IAAI,QAAQ;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAA;QACvB,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,uBAAuB,IAAI,CAAC,EAAE,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAA;QAC3E,oDAAoD;QACpD,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,IAAI,QAAQ,CAAC,QAAgB;QAC3B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,qDAAqD;QACrD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAA;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAkB;QACjC,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;IACrD,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,MAAkB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACtB,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;IACzC,CAAC;IAED,YACE,OAAoB,EACpB,EAAU,EACV,QAAmB,EACnB,IAAW,EACX,IAAa,EACb,OAAgB;QAEhB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;QACd,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,MAAM,SAAS,CACb,8DAA8D,EAC9D;oBACE,QAAQ;iBACT,CACF,CAAA;YACH,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,IAAI,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,mBAAmB,CACtB;gBACE,GAAG,QAAQ;gBACX,IAAI,EAAE,IAAI,EAAE,IAAI;aACjB,EACD,QAAQ,CACT,CAAA;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAA;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAA;QAChD,IAAI,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,uEAAuE;QACvE,mEAAmE;QACnE,wDAAwD;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpC,QAAQ,IAAI,CAAC,EAAE,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAC5C,CAAA;QACD,IAAI,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,CAAA;QAC/B,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,qBAAqB,CAAC,KAAiB;QACrC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3D,IAAI,CAAC,QAAQ;YACX,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,2BAA2B,CAAA;QAClE,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAA;IACnD,CAAC;IAED,MAAM,CAAC,KAAW;QAChB,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,QAAgB;QAClC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,iEAAiE;QACjE,8DAA8D;QAC9D,mBAAmB;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;QAC9B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,UAAU;gBACb,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAA;gBACjC,MAAK;YACP;gBACE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;gBACxB,MAAK;QACT,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,MAAM,GAAG,GAAG,uBAAuB,IAAI,CAAC,EAAE,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAA;QAEtE,2DAA2D;QAC3D,IACE,CAAC,IAAI,CAAC,QAAQ;YACd,CAAC,CAAC,IAAI,CAAC,SAAS;gBACd,CAAC,IAAI,CAAC,SAAS,KAAK,GAAG;oBACrB,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EACrD,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAyB,EAAE,IAAU,EAAE,IAAW;QAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAClC,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAA;IAC3C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAe,EAAE,QAAmB;QACtD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;QACrB,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAA;IACjC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjB,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE;gBACpC,CAAC,CAAC,SAAS,CAAC;SACb,CAAA;IACH,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;CACF","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 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 #rawManifest?: Manifest\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 * 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\n if (isPackageNameConfused(spec, this.manifest?.name)) {\n this.setConfusedManifest(\n {\n ...manifest,\n name: spec?.name,\n },\n manifest,\n )\n }\n\n this.#name = name || this.manifest?.name\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 /**\n * The raw manifest before any modifications.\n * If not set, falls back to the current manifest.\n */\n get rawManifest(): Manifest | undefined {\n return this.#rawManifest ?? this.manifest\n }\n\n /**\n * Sets this node as having a manifest-confused manifest.\n */\n setConfusedManifest(fixed: Manifest, confused?: Manifest) {\n this.manifest = fixed\n this.#rawManifest = confused\n this.confused = true\n this.#name = this.manifest.name\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 confused: this.confused,\n ...(this.confused ?\n { rawManifest: this.#rawManifest }\n : undefined),\n }\n }\n\n toString() {\n return stringifyNode(this)\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { type RollbackRemove } from '@vltpkg/rollback-remove';
2
- import { type Manifest } from '@vltpkg/types';
3
- import { type PathScurry } from 'path-scurry';
4
- import { type Edge } from '../edge.js';
1
+ import type { RollbackRemove } from '@vltpkg/rollback-remove';
2
+ import type { Manifest } from '@vltpkg/types';
3
+ import type { PathScurry } from 'path-scurry';
4
+ import type { Edge } from '../edge.ts';
5
5
  /**
6
6
  * reify an edge into a node_modules folder, with bins linked
7
7
  * this does NOT chmod the bins to 0o777, because they might not exist
@@ -1 +1 @@
1
- {"version":3,"file":"add-edge.d.ts","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAG7C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAwBtC;;;;GAIG;AACH,eAAO,MAAM,OAAO,SACZ,IAAI,YACA,QAAQ,UACV,UAAU,WACT,cAAc,kBAmBxB,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;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,6 +1,7 @@
1
- import { mkdir, symlink } from 'fs/promises';
2
- import { dirname, relative } from 'path';
3
- import { binPaths } from './bin-paths.js';
1
+ import { cmdShimIfExists } from '@vltpkg/cmd-shim';
2
+ import { mkdir, symlink } from 'node:fs/promises';
3
+ import { dirname, relative } from 'node:path';
4
+ import { binPaths } from "./bin-paths.js";
4
5
  const clobberSymlink = async (target, link, remover, type = 'file') => {
5
6
  await mkdir(dirname(link), { recursive: true });
6
7
  try {
@@ -26,18 +27,28 @@ const clobberSymlink = async (target, link, remover, type = 'file') => {
26
27
  export const addEdge = async (edge, manifest, scurry, remover) => {
27
28
  if (!edge.to)
28
29
  return;
29
- const binRoot = scurry.resolve(edge.from.nodeModules, '.bin');
30
- const path = scurry.resolve(edge.from.nodeModules, edge.spec.name);
30
+ const binRoot = scurry.resolve(edge.from.nodeModules(scurry), '.bin');
31
+ const path = scurry.resolve(edge.from.nodeModules(scurry), edge.spec.name);
31
32
  const promises = [];
32
- const target = relative(dirname(path), scurry.resolve(edge.to.location));
33
- promises.push(clobberSymlink(target, path, remover, 'dir'));
33
+ const target = relative(dirname(path), edge.to.resolvedLocation(scurry));
34
+ // can only parallelize this on posix, because the win32 shims
35
+ // need to know that they will exist before being created.
36
+ const p = clobberSymlink(target, path, remover, 'dir');
37
+ if (process.platform === 'win32')
38
+ await p;
39
+ else
40
+ promises.push(p);
34
41
  const bp = binPaths(manifest);
35
42
  for (const [key, val] of Object.entries(bp)) {
36
43
  const link = scurry.resolve(binRoot, key);
37
- const target = relative(binRoot, scurry.resolve(path, val));
38
- // TODO: bash/cmd/pwsh shims on Windows
39
- promises.push(clobberSymlink(target, link, remover));
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));
40
50
  }
41
- await Promise.all(promises);
51
+ if (promises.length)
52
+ await Promise.all(promises);
42
53
  };
43
54
  //# sourceMappingURL=add-edge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-edge.js","sourceRoot":"","sources":["../../../src/reify/add-edge.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGxC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC,MAAM,cAAc,GAAG,KAAK,EAC1B,MAAc,EACd,IAAY,EACZ,OAAuB,EACvB,IAAI,GAAG,MAAM,EACb,EAAE;IACF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,EAAE,GAAG,CAA0B,CAAA;QACrC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YACzD,qBAAqB;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,CAAA;QACV,CAAC;IACH,CAAC;IACD,oBAAoB;AACtB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,IAAU,EACV,QAAkB,EAClB,MAAkB,EAClB,OAAuB,EACvB,EAAE;IACF,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAM;IACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAClE,MAAM,QAAQ,GAAuB,EAAE,CAAA;IACvC,MAAM,MAAM,GAAG,QAAQ,CACrB,OAAO,CAAC,IAAI,CAAC,EACb,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CACjC,CAAA;IACD,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QAC3D,uCAAuC;QACvC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACtD,CAAC;IACD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC7B,CAAC,CAAA","sourcesContent":["import { type RollbackRemove } from '@vltpkg/rollback-remove'\nimport { type Manifest } from '@vltpkg/types'\nimport { mkdir, symlink } from 'fs/promises'\nimport { dirname, relative } from 'path'\nimport { type PathScurry } from 'path-scurry'\nimport { type Edge } from '../edge.js'\nimport { binPaths } from './bin-paths.js'\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(edge.from.nodeModules, '.bin')\n const path = scurry.resolve(edge.from.nodeModules, edge.spec.name)\n const promises: Promise<unknown>[] = []\n const target = relative(\n dirname(path),\n scurry.resolve(edge.to.location),\n )\n promises.push(clobberSymlink(target, path, remover, 'dir'))\n const bp = binPaths(manifest)\n for (const [key, val] of Object.entries(bp)) {\n const link = scurry.resolve(binRoot, key)\n const target = relative(binRoot, scurry.resolve(path, val))\n // TODO: bash/cmd/pwsh shims on Windows\n promises.push(clobberSymlink(target, link, remover))\n }\n 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 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,6 +1,6 @@
1
- import { type PackageJson } from '@vltpkg/package-json';
2
- import { type RollbackRemove } from '@vltpkg/rollback-remove';
3
- import { type PathScurry } from 'path-scurry';
4
- import { type Diff } from '../diff.js';
1
+ import type { PackageJson } from '@vltpkg/package-json';
2
+ import type { RollbackRemove } from '@vltpkg/rollback-remove';
3
+ import type { PathScurry } from 'path-scurry';
4
+ import type { Diff } from '../diff.ts';
5
5
  export declare const addEdges: (diff: Diff, packageJson: PackageJson, scurry: PathScurry, remover: RollbackRemove) => Promise<unknown>[];
6
6
  //# 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,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAA;AAGtC,eAAO,MAAM,QAAQ,SACb,IAAI,eACG,WAAW,UAChB,UAAU,WACT,cAAc,KACtB,OAAO,CAAC,OAAO,CAAC,EASlB,CAAA"}
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,11 +1,11 @@
1
- import { addEdge } from './add-edge.js';
1
+ import { addEdge } from "./add-edge.js";
2
2
  export const addEdges = (diff, packageJson, 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.location);
8
+ const mani = to.manifest ?? packageJson.read(to.resolvedLocation(scurry));
9
9
  actions.push(addEdge(edge, mani, scurry, remover));
10
10
  }
11
11
  return actions;
@@ -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,GAAG,EAAE,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAA;QACzD,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.js'\nimport { addEdge } from './add-edge.js'\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 = to.manifest ?? packageJson.read(to.location)\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":"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"]}