@vltpkg/graph 1.0.0-rc.7 → 1.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/esm/fixup-added-names.d.ts +16 -0
  2. package/dist/esm/fixup-added-names.d.ts.map +1 -0
  3. package/dist/esm/fixup-added-names.js +31 -0
  4. package/dist/esm/fixup-added-names.js.map +1 -0
  5. package/dist/esm/graph.d.ts.map +1 -1
  6. package/dist/esm/graph.js +13 -1
  7. package/dist/esm/graph.js.map +1 -1
  8. package/dist/esm/ideal/append-nodes.d.ts +2 -1
  9. package/dist/esm/ideal/append-nodes.d.ts.map +1 -1
  10. package/dist/esm/ideal/append-nodes.js +42 -20
  11. package/dist/esm/ideal/append-nodes.js.map +1 -1
  12. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts +4 -1
  13. package/dist/esm/ideal/build-ideal-from-starting-graph.d.ts.map +1 -1
  14. package/dist/esm/ideal/build-ideal-from-starting-graph.js +21 -17
  15. package/dist/esm/ideal/build-ideal-from-starting-graph.js.map +1 -1
  16. package/dist/esm/ideal/build.d.ts.map +1 -1
  17. package/dist/esm/ideal/build.js +29 -0
  18. package/dist/esm/ideal/build.js.map +1 -1
  19. package/dist/esm/ideal/get-importer-specs.d.ts +9 -2
  20. package/dist/esm/ideal/get-importer-specs.d.ts.map +1 -1
  21. package/dist/esm/ideal/get-importer-specs.js +80 -5
  22. package/dist/esm/ideal/get-importer-specs.js.map +1 -1
  23. package/dist/esm/ideal/refresh-ideal-graph.d.ts +12 -2
  24. package/dist/esm/ideal/refresh-ideal-graph.d.ts.map +1 -1
  25. package/dist/esm/ideal/refresh-ideal-graph.js +2 -2
  26. package/dist/esm/ideal/refresh-ideal-graph.js.map +1 -1
  27. package/dist/esm/ideal/types.d.ts +13 -0
  28. package/dist/esm/ideal/types.d.ts.map +1 -1
  29. package/dist/esm/ideal/types.js.map +1 -1
  30. package/dist/esm/index.d.ts +1 -0
  31. package/dist/esm/index.d.ts.map +1 -1
  32. package/dist/esm/index.js +1 -0
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/reify/update-importers-package-json.d.ts +1 -1
  35. package/dist/esm/reify/update-importers-package-json.d.ts.map +1 -1
  36. package/dist/esm/reify/update-importers-package-json.js +19 -16
  37. package/dist/esm/reify/update-importers-package-json.js.map +1 -1
  38. package/dist/esm/stringify-node.d.ts.map +1 -1
  39. package/dist/esm/stringify-node.js +10 -1
  40. package/dist/esm/stringify-node.js.map +1 -1
  41. package/dist/esm/visualization/human-readable-output.d.ts.map +1 -1
  42. package/dist/esm/visualization/human-readable-output.js +7 -2
  43. package/dist/esm/visualization/human-readable-output.js.map +1 -1
  44. package/dist/esm/visualization/mermaid-output.d.ts.map +1 -1
  45. package/dist/esm/visualization/mermaid-output.js +20 -3
  46. package/dist/esm/visualization/mermaid-output.js.map +1 -1
  47. package/package.json +21 -21
@@ -10,20 +10,20 @@ const depTypesMap = new Map([
10
10
  ['peerOptional', 'peerDependencies'],
11
11
  ['optional', 'optionalDependencies'],
12
12
  ]);
13
- const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
14
- const importer = graph.nodes.get(importerId);
15
- if (!importer) {
16
- throw error('Failed to retrieve importer node', {
17
- found: importerId,
13
+ const addOrRemoveDeps = (nodeId, graph, addOrRemove) => {
14
+ const node = graph.nodes.get(nodeId);
15
+ if (!node) {
16
+ throw error('Failed to retrieve node', {
17
+ found: nodeId,
18
18
  });
19
19
  }
20
- const manifest = importer.manifest;
20
+ const manifest = node.manifest;
21
21
  if (!manifest) {
22
22
  throw error('Could not find manifest data for node', {
23
- found: importerId,
23
+ found: nodeId,
24
24
  });
25
25
  }
26
- const deps = addOrRemove?.get(importerId);
26
+ const deps = addOrRemove?.get(nodeId);
27
27
  /* c8 ignore start -- impossible but TS doesn't know that */
28
28
  if (!deps) {
29
29
  throw error('Failed to retrieve added deps info', {
@@ -49,7 +49,7 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
49
49
  else {
50
50
  const [name, dep] = deleteNameOrAddItem;
51
51
  // peerOptional also needs to add peerDependenciesMeta entry
52
- const depTypeShort = resolveSaveType(importer, name, dep.type);
52
+ const depTypeShort = resolveSaveType(node, name, dep.type);
53
53
  const depType = depTypesMap.get(depTypeShort);
54
54
  if (!depType) {
55
55
  throw error('Failed to retrieve dependency type', {
@@ -57,11 +57,11 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
57
57
  found: dep.type,
58
58
  });
59
59
  }
60
- const node = importer.edgesOut.get(name)?.to;
61
- if (!node) {
60
+ const n = node.edgesOut.get(name)?.to;
61
+ if (!n) {
62
62
  throw error('Dependency node could not be found');
63
63
  }
64
- const [nodeType] = splitDepID(node.id);
64
+ const [nodeType] = splitDepID(n.id);
65
65
  for (const dtype of longDependencyTypes) {
66
66
  if (dtype === depType || !manifest[dtype])
67
67
  continue;
@@ -86,7 +86,7 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
86
86
  // If the manifest does not contain anything, then update it.
87
87
  // Only for registry dependencies
88
88
  const existing = dependencies[name];
89
- const saveValue = calculateSaveValue(nodeType, dep.spec, existing, node.version);
89
+ const saveValue = calculateSaveValue(nodeType, dep.spec, existing, n.version);
90
90
  dependencies[name] = saveValue;
91
91
  manifestChanged = manifestChanged || saveValue !== existing;
92
92
  }
@@ -94,7 +94,7 @@ const addOrRemoveDeps = (importerId, graph, addOrRemove) => {
94
94
  return manifestChanged ? manifest : undefined;
95
95
  };
96
96
  /**
97
- * Updates the importers of a provided {@link Graph} accordingly to the
97
+ * Updates nodes of a provided {@link Graph} accordingly to the
98
98
  * provided add or remove arguments.
99
99
  */
100
100
  export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
@@ -102,8 +102,11 @@ export const updatePackageJson = ({ add, graph, packageJson, remove, }) => {
102
102
  const operations = new Set([add, remove]);
103
103
  for (const operation of operations) {
104
104
  if (operation) {
105
- for (const importerId of operation.keys()) {
106
- const manifest = addOrRemoveDeps(importerId, graph, operation);
105
+ // These node ids are from either importer nodes or dependencies
106
+ // that are nested folders from which the user can also add new
107
+ // dependencies to
108
+ for (const nodeId of operation.keys()) {
109
+ const manifest = addOrRemoveDeps(nodeId, graph, operation);
107
110
  if (manifest) {
108
111
  manifestsToUpdate.add(manifest);
109
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update-importers-package-json.js","sourceRoot":"","sources":["../../../src/reify/update-importers-package-json.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { splitDepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type {\n DependencyTypeLong,\n DependencyTypeShort,\n NormalizedManifest,\n} from '@vltpkg/types'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport type { Graph } from '../graph.ts'\nimport { resolveSaveType } from '../resolve-save-type.ts'\nimport { calculateSaveValue } from './calculate-save-value.ts'\n\nconst depTypesMap = new Map<DependencyTypeShort, DependencyTypeLong>([\n ['prod', 'dependencies'],\n ['dev', 'devDependencies'],\n ['peer', 'peerDependencies'],\n ['peerOptional', 'peerDependencies'],\n ['optional', 'optionalDependencies'],\n])\n\nexport type UpdatePackageJsonOptions = {\n /**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n */\n add?: AddImportersDependenciesMap\n /**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n */\n remove?: RemoveImportersDependenciesMap\n /**\n * The {@link Graph} instance that contain the importer nodes to which\n * the manifest data (and it's corresponding `package.json` file) are\n * going to be updated.\n */\n graph: Graph\n /**\n * An instance of {@link PackageJson} to use when writing updated manifest\n * data to `package.json` files. It's necessary that this is the same\n * instance used to load these `package.json` files previously.\n */\n packageJson: PackageJson\n}\n\nconst addOrRemoveDeps = (\n importerId: DepID,\n graph: Graph,\n addOrRemove?:\n | AddImportersDependenciesMap\n | RemoveImportersDependenciesMap,\n): NormalizedManifest | undefined => {\n const importer = graph.nodes.get(importerId)\n if (!importer) {\n throw error('Failed to retrieve importer node', {\n found: importerId,\n })\n }\n const manifest = importer.manifest\n if (!manifest) {\n throw error('Could not find manifest data for node', {\n found: importerId,\n })\n }\n const deps = addOrRemove?.get(importerId)\n /* c8 ignore start -- impossible but TS doesn't know that */\n if (!deps) {\n throw error('Failed to retrieve added deps info', {\n manifest,\n })\n }\n let manifestChanged = false\n /* c8 ignore stop */\n for (const deleteNameOrAddItem of deps) {\n if (typeof deleteNameOrAddItem === 'string') {\n const name = deleteNameOrAddItem\n for (const depType of longDependencyTypes) {\n if (manifest[depType]?.[name]) {\n delete manifest[depType][name]\n manifestChanged = true\n }\n }\n if (manifest.peerDependenciesMeta?.[name]) {\n delete manifest.peerDependenciesMeta[name]\n manifestChanged = true\n }\n } else {\n const [name, dep] = deleteNameOrAddItem\n // peerOptional also needs to add peerDependenciesMeta entry\n const depTypeShort = resolveSaveType(importer, name, dep.type)\n const depType = depTypesMap.get(depTypeShort)\n if (!depType) {\n throw error('Failed to retrieve dependency type', {\n validOptions: [...depTypesMap.keys()],\n found: dep.type,\n })\n }\n const node = importer.edgesOut.get(name)?.to\n if (!node) {\n throw error('Dependency node could not be found')\n }\n const [nodeType] = splitDepID(node.id)\n\n for (const dtype of longDependencyTypes) {\n if (dtype === depType || !manifest[dtype]) continue\n delete manifest[dtype][name]\n }\n if (depTypeShort === 'peerOptional') {\n manifest.peerDependenciesMeta ??= {}\n manifest.peerDependenciesMeta[name] = { optional: true }\n } else if (manifest.peerDependenciesMeta?.[name]) {\n delete manifest.peerDependenciesMeta[name]\n }\n\n const dependencies =\n manifest[depType] ?? (manifest[depType] = {})\n // check to see if we need to save a different version\n // - If you install a single specific version, that is deliberate,\n // we save that exact version, no matter what.\n // - If the requested spec matches the manifest, make no change\n // If the requested spec had no bareSpec, and the manifest has\n // a dependency entry, make no change.\n // If the requested spec has a bareSpec that did NOT match the manifest,\n // then update it.\n // If the manifest does not contain anything, then update it.\n // Only for registry dependencies\n const existing = dependencies[name]\n const saveValue = calculateSaveValue(\n nodeType,\n dep.spec,\n existing,\n node.version,\n )\n dependencies[name] = saveValue\n manifestChanged = manifestChanged || saveValue !== existing\n }\n }\n return manifestChanged ? manifest : undefined\n}\n\n/**\n * Updates the importers of a provided {@link Graph} accordingly to the\n * provided add or remove arguments.\n */\nexport const updatePackageJson = ({\n add,\n graph,\n packageJson,\n remove,\n}: UpdatePackageJsonOptions) => {\n const manifestsToUpdate = new Set<NormalizedManifest>()\n const operations = new Set([add, remove])\n\n for (const operation of operations) {\n if (operation) {\n for (const importerId of operation.keys()) {\n const manifest = addOrRemoveDeps(importerId, graph, operation)\n if (manifest) {\n manifestsToUpdate.add(manifest)\n }\n }\n }\n }\n\n const commit = () => {\n for (const manifest of manifestsToUpdate) {\n packageJson.save(manifest)\n }\n }\n\n return commit\n}\n"]}
1
+ {"version":3,"file":"update-importers-package-json.js","sourceRoot":"","sources":["../../../src/reify/update-importers-package-json.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { splitDepID } from '@vltpkg/dep-id'\nimport { error } from '@vltpkg/error-cause'\nimport type { PackageJson } from '@vltpkg/package-json'\nimport type {\n DependencyTypeLong,\n DependencyTypeShort,\n NormalizedManifest,\n} from '@vltpkg/types'\nimport { longDependencyTypes } from '@vltpkg/types'\nimport type {\n AddImportersDependenciesMap,\n Dependency,\n RemoveImportersDependenciesMap,\n} from '../dependencies.ts'\nimport type { Graph } from '../graph.ts'\nimport { resolveSaveType } from '../resolve-save-type.ts'\nimport { calculateSaveValue } from './calculate-save-value.ts'\n\nconst depTypesMap = new Map<DependencyTypeShort, DependencyTypeLong>([\n ['prod', 'dependencies'],\n ['dev', 'devDependencies'],\n ['peer', 'peerDependencies'],\n ['peerOptional', 'peerDependencies'],\n ['optional', 'optionalDependencies'],\n])\n\nexport type UpdatePackageJsonOptions = {\n /**\n * A `Map` in which keys are {@link DepID} linking to another `Map` in which\n * keys are the dependency names and values are {@link Dependency}. This\n * structure represents dependencies that need to be added to the importer\n * represented by {@link DepID}.\n */\n add?: AddImportersDependenciesMap\n /**\n * A `Map` object representing nodes to be removed from the ideal graph.\n * Each {@link DepID} key represents an importer node and the `Set` of\n * dependency names to be removed from its dependency list.\n */\n remove?: RemoveImportersDependenciesMap\n /**\n * The {@link Graph} instance that contain the importer nodes to which\n * the manifest data (and it's corresponding `package.json` file) are\n * going to be updated.\n */\n graph: Graph\n /**\n * An instance of {@link PackageJson} to use when writing updated manifest\n * data to `package.json` files. It's necessary that this is the same\n * instance used to load these `package.json` files previously.\n */\n packageJson: PackageJson\n}\n\nconst addOrRemoveDeps = (\n nodeId: DepID,\n graph: Graph,\n addOrRemove?:\n | AddImportersDependenciesMap\n | RemoveImportersDependenciesMap,\n): NormalizedManifest | undefined => {\n const node = graph.nodes.get(nodeId)\n if (!node) {\n throw error('Failed to retrieve node', {\n found: nodeId,\n })\n }\n const manifest = node.manifest\n if (!manifest) {\n throw error('Could not find manifest data for node', {\n found: nodeId,\n })\n }\n const deps = addOrRemove?.get(nodeId)\n /* c8 ignore start -- impossible but TS doesn't know that */\n if (!deps) {\n throw error('Failed to retrieve added deps info', {\n manifest,\n })\n }\n let manifestChanged = false\n /* c8 ignore stop */\n for (const deleteNameOrAddItem of deps) {\n if (typeof deleteNameOrAddItem === 'string') {\n const name = deleteNameOrAddItem\n for (const depType of longDependencyTypes) {\n if (manifest[depType]?.[name]) {\n delete manifest[depType][name]\n manifestChanged = true\n }\n }\n if (manifest.peerDependenciesMeta?.[name]) {\n delete manifest.peerDependenciesMeta[name]\n manifestChanged = true\n }\n } else {\n const [name, dep] = deleteNameOrAddItem\n // peerOptional also needs to add peerDependenciesMeta entry\n const depTypeShort = resolveSaveType(node, name, dep.type)\n const depType = depTypesMap.get(depTypeShort)\n if (!depType) {\n throw error('Failed to retrieve dependency type', {\n validOptions: [...depTypesMap.keys()],\n found: dep.type,\n })\n }\n const n = node.edgesOut.get(name)?.to\n if (!n) {\n throw error('Dependency node could not be found')\n }\n const [nodeType] = splitDepID(n.id)\n\n for (const dtype of longDependencyTypes) {\n if (dtype === depType || !manifest[dtype]) continue\n delete manifest[dtype][name]\n }\n if (depTypeShort === 'peerOptional') {\n manifest.peerDependenciesMeta ??= {}\n manifest.peerDependenciesMeta[name] = { optional: true }\n } else if (manifest.peerDependenciesMeta?.[name]) {\n delete manifest.peerDependenciesMeta[name]\n }\n\n const dependencies =\n manifest[depType] ?? (manifest[depType] = {})\n // check to see if we need to save a different version\n // - If you install a single specific version, that is deliberate,\n // we save that exact version, no matter what.\n // - If the requested spec matches the manifest, make no change\n // If the requested spec had no bareSpec, and the manifest has\n // a dependency entry, make no change.\n // If the requested spec has a bareSpec that did NOT match the manifest,\n // then update it.\n // If the manifest does not contain anything, then update it.\n // Only for registry dependencies\n const existing = dependencies[name]\n const saveValue = calculateSaveValue(\n nodeType,\n dep.spec,\n existing,\n n.version,\n )\n dependencies[name] = saveValue\n manifestChanged = manifestChanged || saveValue !== existing\n }\n }\n return manifestChanged ? manifest : undefined\n}\n\n/**\n * Updates nodes of a provided {@link Graph} accordingly to the\n * provided add or remove arguments.\n */\nexport const updatePackageJson = ({\n add,\n graph,\n packageJson,\n remove,\n}: UpdatePackageJsonOptions) => {\n const manifestsToUpdate = new Set<NormalizedManifest>()\n const operations = new Set([add, remove])\n\n for (const operation of operations) {\n if (operation) {\n // These node ids are from either importer nodes or dependencies\n // that are nested folders from which the user can also add new\n // dependencies to\n for (const nodeId of operation.keys()) {\n const manifest = addOrRemoveDeps(nodeId, graph, operation)\n if (manifest) {\n manifestsToUpdate.add(manifest)\n }\n }\n }\n }\n\n const commit = () => {\n for (const manifest of manifestsToUpdate) {\n packageJson.save(manifest)\n }\n }\n\n return commit\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-node.d.ts","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,eAAO,MAAM,aAAa,UAAW,QAAQ,WAmB5C,CAAA"}
1
+ {"version":3,"file":"stringify-node.d.ts","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,eAAO,MAAM,aAAa,UAAW,QAAQ,WA0B5C,CAAA"}
@@ -1,11 +1,20 @@
1
1
  import { splitDepID } from '@vltpkg/dep-id/browser';
2
+ import { defaultRegistryName } from '@vltpkg/spec/browser';
2
3
  export const stringifyNode = (node) => {
3
4
  if (!node)
4
5
  return '';
5
6
  const version = node.version ? `@${node.version}` : '';
6
7
  const [type, ref, nameVersion] = splitDepID(node.id);
7
8
  if (type === 'registry') {
8
- const prefix = ref ? `${ref}:` : 'npm:';
9
+ let prefix = `${defaultRegistryName}:`;
10
+ if (ref) {
11
+ if (/^https?:\/\//.test(ref)) {
12
+ prefix = `registry:${ref}#`;
13
+ }
14
+ else {
15
+ prefix = `${ref}:`;
16
+ }
17
+ }
9
18
  return `${prefix}${nameVersion}`;
10
19
  }
11
20
  else if (type === 'workspace') {
@@ -1 +1 @@
1
- {"version":3,"file":"stringify-node.js","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,EAAE;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEpD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,OAAO,GAAG,MAAM,GAAG,WAAW,EAAE,CAAA;IAClC,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,aAAa,IAAI,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,yEAAyE;QACzE,MAAM,WAAW,GACf,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,WAAW,EAAE,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport type { NodeLike } from '@vltpkg/types'\n\nexport const stringifyNode = (node?: NodeLike) => {\n if (!node) return ''\n const version = node.version ? `@${node.version}` : ''\n const [type, ref, nameVersion] = splitDepID(node.id)\n\n if (type === 'registry') {\n const prefix = ref ? `${ref}:` : 'npm:'\n return `${prefix}${nameVersion}`\n } else if (type === 'workspace') {\n return `workspace:${node.name}`\n } else if (type === 'file' && node.mainImporter) {\n return `root:${node.name}`\n } else {\n // node.name getter will return the id if the package has no name\n // property so here we check for that in order to return `type(ref)` only\n const nameVersion =\n node.name !== node.id ? `:${node.name}${version}` : ''\n return `${type}(${ref})${nameVersion}`\n }\n}\n"]}
1
+ {"version":3,"file":"stringify-node.js","sourceRoot":"","sources":["../../src/stringify-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAG1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,EAAE;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAA;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACtD,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEpD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,MAAM,GAAG,GAAG,mBAAmB,GAAG,CAAA;QACtC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,GAAG,YAAY,GAAG,GAAG,CAAA;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,GAAG,GAAG,CAAA;YACpB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,MAAM,GAAG,WAAW,EAAE,CAAA;IAClC,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,aAAa,IAAI,CAAC,IAAI,EAAE,CAAA;IACjC,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,iEAAiE;QACjE,yEAAyE;QACzE,MAAM,WAAW,GACf,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACxD,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,WAAW,EAAE,CAAA;IACxC,CAAC;AACH,CAAC,CAAA","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id/browser'\nimport { defaultRegistryName } from '@vltpkg/spec/browser'\nimport type { NodeLike } from '@vltpkg/types'\n\nexport const stringifyNode = (node?: NodeLike) => {\n if (!node) return ''\n const version = node.version ? `@${node.version}` : ''\n const [type, ref, nameVersion] = splitDepID(node.id)\n\n if (type === 'registry') {\n let prefix = `${defaultRegistryName}:`\n if (ref) {\n if (/^https?:\\/\\//.test(ref)) {\n prefix = `registry:${ref}#`\n } else {\n prefix = `${ref}:`\n }\n }\n return `${prefix}${nameVersion}`\n } else if (type === 'workspace') {\n return `workspace:${node.name}`\n } else if (type === 'file' && node.mainImporter) {\n return `root:${node.name}`\n } else {\n // node.name getter will return the id if the package has no name\n // property so here we check for that in order to return `type(ref)` only\n const nameVersion =\n node.name !== node.id ? `:${node.name}${version}` : ''\n return `${type}(${ref})${nameVersion}`\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"human-readable-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAkBvD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAA;AAEzD,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;AAoExD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,UAwHjC"}
1
+ {"version":3,"file":"human-readable-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAkBvD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAA;AAEzD,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;AAoExD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,EACjC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,UA4HjC"}
@@ -1,3 +1,4 @@
1
+ import { defaultRegistryName } from '@vltpkg/spec';
1
2
  import { splitDepID } from '@vltpkg/dep-id';
2
3
  import { styleText as utilStyleText } from 'node:util';
3
4
  const styleText = (format, s) => utilStyleText(format, s, { validateStream: false });
@@ -119,7 +120,9 @@ export function humanReadableOutput(options, { colors }) {
119
120
  // prefixes the node name with the registry name
120
121
  // if a custom registry name is found
121
122
  const depIdTuple = nextItem.node?.id && splitDepID(nextItem.node.id);
122
- const hasCustomReg = depIdTuple?.[0] === 'registry' && depIdTuple[1];
123
+ const hasCustomReg = depIdTuple?.[0] === 'registry' &&
124
+ depIdTuple[1] &&
125
+ depIdTuple[1] !== defaultRegistryName;
123
126
  const nodeName = hasCustomReg ?
124
127
  `${depIdTuple[1]}:${nextItem.node?.name}`
125
128
  : nextItem.node?.name;
@@ -127,7 +130,9 @@ export function humanReadableOutput(options, { colors }) {
127
130
  `${nodeName}@${nextItem.node.version}`
128
131
  : nodeName;
129
132
  const nextChar = isLast ? 'last-child' : 'middle-child';
130
- const aliasedPackage = nextItem.node?.name && nextItem.edge?.name !== nodeName;
133
+ const aliasedPackage = hasCustomReg ||
134
+ (nextItem.node?.name &&
135
+ nextItem.edge?.name !== nextItem.node.name);
131
136
  nextItem.name =
132
137
  nextItem.node?.confused ?
133
138
  `${nextItem.edge?.name} ${red('(confused)')}`
@@ -1 +1 @@
1
- {"version":3,"file":"human-readable-output.js","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { splitDepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\nimport { styleText as utilStyleText } from 'node:util'\n\nconst styleText = (\n format: Parameters<typeof utilStyleText>[0],\n s: string,\n) => utilStyleText(format, s, { validateStream: false })\n\nconst chars = new Map(\n Object.entries({\n connection: '─',\n down: '│',\n 'last-child': '└',\n 'middle-child': '├',\n t: '┬',\n }),\n)\n\nexport type TreeItem = {\n name?: string | null\n edge: EdgeLike | undefined\n node: NodeLike | undefined\n prefix: string\n padding: string\n hasSibling: boolean\n seen: boolean\n include: boolean\n parent: TreeItem | undefined\n}\n\nexport type HumanReadableOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n highlightSelection?: boolean\n}\n\nexport type EdgeMap = Map<NodeLike | undefined, TreeItem>\n\nexport type TreeMap = Map<EdgeLike | undefined, EdgeMap>\n\nconst isSelected = (\n options: HumanReadableOutputGraph,\n edge?: EdgeLike,\n node?: NodeLike,\n) =>\n (!node || options.nodes.includes(node)) &&\n (!edge || options.edges.includes(edge))\n\n/**\n * Returns a map of tree items to be printed.\n */\nconst getTreeItems = (\n initialItems: Set<TreeItem>,\n options: HumanReadableOutputGraph,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems: TreeMap = new Map()\n const traverse = new Set<TreeItem>(initialItems)\n for (const item of traverse) {\n if (item.node) {\n if (seenNodes.has(item.node)) {\n item.seen = true\n continue\n }\n seenNodes.add(item.node)\n const edges = [...item.node.edgesOut.values()]\n const workspaces =\n item.node.workspaces ? [...item.node.workspaces.values()] : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n\n // keeps track of seen edge names to avoid duplicating printed\n // items when a workspace is also a regular dependency of the root\n const seenEdgeName = new Set<string>()\n for (const edge of allEdges) {\n if (seenEdgeName.has(edge.name)) {\n continue\n }\n seenEdgeName.add(edge.name)\n const toItems: EdgeMap =\n treeItems.get(edge) ?? (new Map() as EdgeMap)\n const nextItem: TreeItem = {\n edge,\n node: edge.to,\n hasSibling: false,\n padding: '',\n prefix: '',\n seen: false,\n include: isSelected(options, edge, edge.to),\n parent: item,\n }\n toItems.set(edge.to, nextItem)\n treeItems.set(edge, toItems)\n traverse.add(nextItem)\n }\n }\n }\n for (const item of [...traverse].reverse()) {\n if (item.include && item.parent) {\n item.parent.include = true\n }\n }\n return treeItems\n}\n\n/**\n * Returns a human-readable output of the graph.\n */\nexport function humanReadableOutput(\n options: HumanReadableOutputGraph,\n { colors }: { colors?: boolean },\n) {\n const { importers } = options\n const createStyleText =\n (style: Parameters<typeof styleText>[0]) => (s: string) =>\n colors ? styleText(style, s) : s\n const dim = createStyleText('dim')\n const red = createStyleText('red')\n const reset = createStyleText('reset')\n const yellow = createStyleText('yellow')\n const initialItems = new Set<TreeItem>()\n for (const importer of importers) {\n initialItems.add({\n name: importer.name,\n edge: undefined,\n node: importer,\n prefix: '',\n padding: '',\n hasSibling: false,\n seen: false,\n include: isSelected(options, undefined, importer),\n parent: undefined,\n })\n }\n const treeItems = getTreeItems(initialItems, options)\n\n let res = ''\n const traverse = (item: TreeItem) => {\n let header = ''\n let content = ''\n\n const name = item.name\n const decoratedName =\n (\n options.highlightSelection &&\n isSelected(options, item.edge, item.node) &&\n name\n ) ?\n yellow(name)\n : name\n if (!item.node && item.include) {\n const missing =\n item.edge?.type.endsWith('ptional') ?\n dim('(missing optional)')\n : red('(missing)')\n return `${item.padding}${item.prefix}${decoratedName} ${missing}\\n`\n }\n\n header += `${item.padding}${item.prefix}${decoratedName}\\n`\n\n // seen items need not to be printed or traversed\n if (!item.seen) {\n const edges = item.node ? [...item.node.edgesOut.values()] : []\n const workspaces =\n item.node?.workspaces ?\n [...item.node.workspaces.values()]\n : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n const nextItems = allEdges.map(i => treeItems.get(i)?.get(i.to))\n const includedItems = nextItems.filter(i => i?.include)\n\n for (const nextItem of nextItems) {\n /* c8 ignore next -- impossible but TS doesn't know that */\n if (!nextItem) continue\n\n const parent = item\n const isLast =\n includedItems.indexOf(nextItem) === includedItems.length - 1\n\n // prefixes the node name with the registry name\n // if a custom registry name is found\n const depIdTuple =\n nextItem.node?.id && splitDepID(nextItem.node.id)\n const hasCustomReg =\n depIdTuple?.[0] === 'registry' && depIdTuple[1]\n const nodeName =\n hasCustomReg ?\n `${depIdTuple[1]}:${nextItem.node?.name}`\n : nextItem.node?.name\n\n const toName =\n nextItem.node?.version ?\n `${nodeName}@${nextItem.node.version}`\n : nodeName\n const nextChar = isLast ? 'last-child' : 'middle-child'\n\n const aliasedPackage =\n nextItem.node?.name && nextItem.edge?.name !== nodeName\n nextItem.name =\n nextItem.node?.confused ?\n `${nextItem.edge?.name} ${red('(confused)')}`\n : nextItem.edge?.spec.overridden ?\n /* c8 ignore next */\n `${nextItem.edge.name}@${nextItem.node?.version || nextItem.edge.spec.bareSpec}${aliasedPackage ? ` (${toName})` : ''} ${yellow('(overridden)')}`\n : aliasedPackage ? `${nextItem.edge?.name} (${toName})`\n : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`\n nextItem.padding =\n parent.prefix.length ?\n `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `\n : ''\n nextItem.prefix = `${chars.get(nextChar)}${chars.get('connection')}${chars.get('connection')} `\n nextItem.hasSibling = !isLast\n\n content += traverse(nextItem)\n }\n }\n\n const regularConnection = `${chars.get('connection')} `\n const parentConnection = `${chars.get('t')} `\n return item.include ?\n `${content ? header.replace(regularConnection, parentConnection) : header}${content}`\n : ''\n }\n\n for (const item of initialItems) {\n res += traverse(item)\n }\n return reset(res)\n}\n"]}
1
+ {"version":3,"file":"human-readable-output.js","sourceRoot":"","sources":["../../../src/visualization/human-readable-output.ts"],"names":[],"mappings":"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","sourcesContent":["import { defaultRegistryName } from '@vltpkg/spec'\nimport { splitDepID } from '@vltpkg/dep-id'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\nimport { styleText as utilStyleText } from 'node:util'\n\nconst styleText = (\n format: Parameters<typeof utilStyleText>[0],\n s: string,\n) => utilStyleText(format, s, { validateStream: false })\n\nconst chars = new Map(\n Object.entries({\n connection: '─',\n down: '│',\n 'last-child': '└',\n 'middle-child': '├',\n t: '┬',\n }),\n)\n\nexport type TreeItem = {\n name?: string | null\n edge: EdgeLike | undefined\n node: NodeLike | undefined\n prefix: string\n padding: string\n hasSibling: boolean\n seen: boolean\n include: boolean\n parent: TreeItem | undefined\n}\n\nexport type HumanReadableOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n highlightSelection?: boolean\n}\n\nexport type EdgeMap = Map<NodeLike | undefined, TreeItem>\n\nexport type TreeMap = Map<EdgeLike | undefined, EdgeMap>\n\nconst isSelected = (\n options: HumanReadableOutputGraph,\n edge?: EdgeLike,\n node?: NodeLike,\n) =>\n (!node || options.nodes.includes(node)) &&\n (!edge || options.edges.includes(edge))\n\n/**\n * Returns a map of tree items to be printed.\n */\nconst getTreeItems = (\n initialItems: Set<TreeItem>,\n options: HumanReadableOutputGraph,\n) => {\n const seenNodes = new Set<NodeLike>()\n const treeItems: TreeMap = new Map()\n const traverse = new Set<TreeItem>(initialItems)\n for (const item of traverse) {\n if (item.node) {\n if (seenNodes.has(item.node)) {\n item.seen = true\n continue\n }\n seenNodes.add(item.node)\n const edges = [...item.node.edgesOut.values()]\n const workspaces =\n item.node.workspaces ? [...item.node.workspaces.values()] : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n\n // keeps track of seen edge names to avoid duplicating printed\n // items when a workspace is also a regular dependency of the root\n const seenEdgeName = new Set<string>()\n for (const edge of allEdges) {\n if (seenEdgeName.has(edge.name)) {\n continue\n }\n seenEdgeName.add(edge.name)\n const toItems: EdgeMap =\n treeItems.get(edge) ?? (new Map() as EdgeMap)\n const nextItem: TreeItem = {\n edge,\n node: edge.to,\n hasSibling: false,\n padding: '',\n prefix: '',\n seen: false,\n include: isSelected(options, edge, edge.to),\n parent: item,\n }\n toItems.set(edge.to, nextItem)\n treeItems.set(edge, toItems)\n traverse.add(nextItem)\n }\n }\n }\n for (const item of [...traverse].reverse()) {\n if (item.include && item.parent) {\n item.parent.include = true\n }\n }\n return treeItems\n}\n\n/**\n * Returns a human-readable output of the graph.\n */\nexport function humanReadableOutput(\n options: HumanReadableOutputGraph,\n { colors }: { colors?: boolean },\n) {\n const { importers } = options\n const createStyleText =\n (style: Parameters<typeof styleText>[0]) => (s: string) =>\n colors ? styleText(style, s) : s\n const dim = createStyleText('dim')\n const red = createStyleText('red')\n const reset = createStyleText('reset')\n const yellow = createStyleText('yellow')\n const initialItems = new Set<TreeItem>()\n for (const importer of importers) {\n initialItems.add({\n name: importer.name,\n edge: undefined,\n node: importer,\n prefix: '',\n padding: '',\n hasSibling: false,\n seen: false,\n include: isSelected(options, undefined, importer),\n parent: undefined,\n })\n }\n const treeItems = getTreeItems(initialItems, options)\n\n let res = ''\n const traverse = (item: TreeItem) => {\n let header = ''\n let content = ''\n\n const name = item.name\n const decoratedName =\n (\n options.highlightSelection &&\n isSelected(options, item.edge, item.node) &&\n name\n ) ?\n yellow(name)\n : name\n if (!item.node && item.include) {\n const missing =\n item.edge?.type.endsWith('ptional') ?\n dim('(missing optional)')\n : red('(missing)')\n return `${item.padding}${item.prefix}${decoratedName} ${missing}\\n`\n }\n\n header += `${item.padding}${item.prefix}${decoratedName}\\n`\n\n // seen items need not to be printed or traversed\n if (!item.seen) {\n const edges = item.node ? [...item.node.edgesOut.values()] : []\n const workspaces =\n item.node?.workspaces ?\n [...item.node.workspaces.values()]\n : []\n const allEdges = [...edges, ...workspaces].sort((a, b) =>\n a.name.localeCompare(b.name, 'en'),\n )\n const nextItems = allEdges.map(i => treeItems.get(i)?.get(i.to))\n const includedItems = nextItems.filter(i => i?.include)\n\n for (const nextItem of nextItems) {\n /* c8 ignore next -- impossible but TS doesn't know that */\n if (!nextItem) continue\n\n const parent = item\n const isLast =\n includedItems.indexOf(nextItem) === includedItems.length - 1\n\n // prefixes the node name with the registry name\n // if a custom registry name is found\n const depIdTuple =\n nextItem.node?.id && splitDepID(nextItem.node.id)\n const hasCustomReg =\n depIdTuple?.[0] === 'registry' &&\n depIdTuple[1] &&\n depIdTuple[1] !== defaultRegistryName\n const nodeName =\n hasCustomReg ?\n `${depIdTuple[1]}:${nextItem.node?.name}`\n : nextItem.node?.name\n\n const toName =\n nextItem.node?.version ?\n `${nodeName}@${nextItem.node.version}`\n : nodeName\n const nextChar = isLast ? 'last-child' : 'middle-child'\n\n const aliasedPackage =\n hasCustomReg ||\n (nextItem.node?.name &&\n nextItem.edge?.name !== nextItem.node.name)\n nextItem.name =\n nextItem.node?.confused ?\n `${nextItem.edge?.name} ${red('(confused)')}`\n : nextItem.edge?.spec.overridden ?\n /* c8 ignore next */\n `${nextItem.edge.name}@${nextItem.node?.version || nextItem.edge.spec.bareSpec}${aliasedPackage ? ` (${toName})` : ''} ${yellow('(overridden)')}`\n : aliasedPackage ? `${nextItem.edge?.name} (${toName})`\n : `${nextItem.edge?.name}@${nextItem.node?.version || nextItem.edge?.spec.bareSpec}`\n nextItem.padding =\n parent.prefix.length ?\n `${parent.padding}${parent.hasSibling ? chars.get('down') : ' '} `\n : ''\n nextItem.prefix = `${chars.get(nextChar)}${chars.get('connection')}${chars.get('connection')} `\n nextItem.hasSibling = !isLast\n\n content += traverse(nextItem)\n }\n }\n\n const regularConnection = `${chars.get('connection')} `\n const parentConnection = `${chars.get('t')} `\n return item.include ?\n `${content ? header.replace(regularConnection, parentConnection) : header}${content}`\n : ''\n }\n\n for (const item of initialItems) {\n res += traverse(item)\n }\n return reset(res)\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BrD;AA0HD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,UA0DpB"}
1
+ {"version":3,"file":"mermaid-output.d.ts","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB,CAAA;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BrD;AAgID;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,UAwEpB"}
@@ -74,12 +74,18 @@ function parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, node, i
74
74
  // For importers, render the node label first as a standalone line before processing edges,
75
75
  // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.
76
76
  const nodeLabel = isImporter ? nodeRef(node, labeledNodes, depIdMapping) : '';
77
- const edges = [...node.edgesOut.values()]
77
+ // Include both regular edges and workspace edges (if any)
78
+ const allEdges = [
79
+ ...node.edgesOut.values(),
80
+ ...(node.workspaces?.values() ?? []),
81
+ ];
82
+ const edges = allEdges
78
83
  .map(e => parseEdge(seenNodes, labeledNodes, includedItems, depIdMapping, e))
79
84
  .filter(Boolean)
80
85
  .join('\n');
81
86
  // Only render node standalone for importers, others are rendered as part of edges
82
87
  if (isImporter) {
88
+ /* c8 ignore next */
83
89
  return `${nodeLabel}${edges.length ? '\n' : ''}${edges}`;
84
90
  }
85
91
  return edges;
@@ -113,7 +119,10 @@ export function mermaidOutput({ edges, importers, nodes, }) {
113
119
  continue;
114
120
  seen.add(item.self);
115
121
  if (item.self instanceof Edge) {
116
- if (edges.includes(item.self)) {
122
+ // Workspace edges are stored in mainImporter.workspaces and not in graph.edges,
123
+ // so we need to check for workspace spec type to always include them
124
+ if (edges.includes(item.self) ||
125
+ item.self.spec.type === 'workspace') {
117
126
  includedItems.set(item.self, true);
118
127
  }
119
128
  if (item.self.to) {
@@ -127,6 +136,12 @@ export function mermaidOutput({ edges, importers, nodes, }) {
127
136
  for (const edge of item.self.edgesOut.values()) {
128
137
  traverse.add({ self: edge, parent: item.self });
129
138
  }
139
+ // Also traverse workspace edges (only mainImporter has these)
140
+ if (item.self.workspaces) {
141
+ for (const edge of item.self.workspaces.values()) {
142
+ traverse.add({ self: edge, parent: item.self });
143
+ }
144
+ }
130
145
  }
131
146
  }
132
147
  for (const item of [...traverse].reverse()) {
@@ -138,9 +153,11 @@ export function mermaidOutput({ edges, importers, nodes, }) {
138
153
  const depIdMapping = createDepIdMapping(importers);
139
154
  // Track nodes that have had their label printed (shared across all importers)
140
155
  const labeledNodes = new Set();
156
+ // Track nodes that have been processed (shared across all importers to avoid duplicates)
157
+ const seenNodes = new Set();
141
158
  return ('flowchart TD\n' +
142
159
  [...importers]
143
- .map(i => parseNode(new Set(), labeledNodes, includedItems, depIdMapping, i, true))
160
+ .map(i => parseNode(seenNodes, labeledNodes, includedItems, depIdMapping, i, true))
144
161
  .filter(Boolean)
145
162
  .join('\n'));
146
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\n/**\n * Generates a short identifier for a given index following the pattern:\n * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.\n * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51\n */\nexport function generateShortId(index: number): string {\n const base = 52\n\n // Helper function to convert a digit (0-51) to character\n const digitToChar = (digit: number): string => {\n if (digit < 26) {\n // a-z (0-25)\n return String.fromCharCode(97 + digit)\n } else {\n // A-Z (26-51)\n return String.fromCharCode(65 + (digit - 26))\n }\n }\n\n // Bijective base-52 conversion\n let result = ''\n let num = index + 1 // Convert to 1-based for bijective base\n\n while (num > 0) {\n num-- // Adjust for 0-based indexing in each position\n const remainder = num % base\n result = digitToChar(remainder) + result\n num = Math.floor(num / base)\n }\n\n return result\n}\n\n/**\n * Creates a mapping from DepID to short identifier\n */\nfunction createDepIdMapping(\n importers: Set<NodeLike>,\n): Map<DepID, string> {\n const mapping = new Map<DepID, string>()\n const uniqueDepIds = new Set<DepID>()\n\n // Collect all unique DepIDs from nodes & importers\n const [importer] = importers\n if (importer) {\n for (const node of importer.graph.nodes.values()) {\n uniqueDepIds.add(node.id)\n }\n }\n\n // Create mapping for each unique DepID\n let index = 0\n for (const depId of uniqueDepIds) {\n mapping.set(depId, generateShortId(index++))\n }\n\n return mapping\n}\n\n/**\n * Returns a node reference: on the first occurrence of a node, returns the full label;\n * on subsequent occurrences, returns just the shortId.\n *\n * Note: Mutates the `labeledNodes` set as a side effect to track which nodes have already\n * been labeled. This tracking is shared across multiple importers to prevent duplicate\n * labels in the output.\n */\nconst nodeRef = (\n node: NodeLike,\n labeledNodes: Set<DepID>,\n depIdMapping: Map<DepID, string>,\n): string => {\n const shortId =\n depIdMapping.get(\n node.id,\n ) /* c8 ignore next - should not be possible */ ?? ''\n if (labeledNodes.has(node.id)) {\n return shortId\n }\n labeledNodes.add(node.id)\n return `${shortId}(\"${String(node).replaceAll('@', '#64;')}\")`\n}\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n node: NodeLike,\n isImporter = false,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n // For importers, render the node label first as a standalone line before processing edges,\n // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.\n const nodeLabel =\n isImporter ? nodeRef(node, labeledNodes, depIdMapping) : ''\n const edges: string = [...node.edgesOut.values()]\n .map(e =>\n parseEdge(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n e,\n ),\n )\n .filter(Boolean)\n .join('\\n')\n // Only render node standalone for importers, others are rendered as part of edges\n if (isImporter) {\n return `${nodeLabel}${edges.length ? '\\n' : ''}${edges}`\n }\n return edges\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`\n const edgeResult =\n nodeRef(edge.from, labeledNodes, depIdMapping) +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})`\n }\n\n // Label the target node first so that if it's referenced again later in the graph,\n // it will use the short identifier instead of repeating the full label.\n const toRef = nodeRef(edge.to, labeledNodes, depIdMapping)\n const childEdges = parseNode(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n edge.to,\n )\n return edgeResult + toRef + (childEdges ? '\\n' + childEdges : '')\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n if (edges.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n // Create DepID to short identifier mapping\n const depIdMapping = createDepIdMapping(importers)\n\n // Track nodes that have had their label printed (shared across all importers)\n const labeledNodes = new Set<DepID>()\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i =>\n parseNode(\n new Set<DepID>(),\n labeledNodes,\n includedItems,\n depIdMapping,\n i,\n true, // isImporter\n ),\n )\n .filter(Boolean)\n .join('\\n')\n )\n}\n"]}
1
+ {"version":3,"file":"mermaid-output.js","sourceRoot":"","sources":["../../../src/visualization/mermaid-output.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DepID } from '@vltpkg/dep-id'\nimport { Edge } from '../edge.ts'\nimport { Node } from '../node.ts'\nimport type { EdgeLike, NodeLike } from '@vltpkg/types'\n\nexport type MermaidOutputGraph = {\n edges: EdgeLike[]\n importers: Set<NodeLike>\n nodes: NodeLike[]\n}\n\ntype TraverseItem = {\n self: EdgeLike | NodeLike\n parent: EdgeLike | NodeLike | undefined\n}\n\nlet missingCount = 0\n\n/**\n * Generates a short identifier for a given index following the pattern:\n * 0 -> a, 1 -> b, ..., 25 -> z, 26 -> A, ..., 51 -> Z, 52 -> aa, 53 -> ab, etc.\n * This implements a bijective base-52 numbering system where a-z = 0-25, A-Z = 26-51\n */\nexport function generateShortId(index: number): string {\n const base = 52\n\n // Helper function to convert a digit (0-51) to character\n const digitToChar = (digit: number): string => {\n if (digit < 26) {\n // a-z (0-25)\n return String.fromCharCode(97 + digit)\n } else {\n // A-Z (26-51)\n return String.fromCharCode(65 + (digit - 26))\n }\n }\n\n // Bijective base-52 conversion\n let result = ''\n let num = index + 1 // Convert to 1-based for bijective base\n\n while (num > 0) {\n num-- // Adjust for 0-based indexing in each position\n const remainder = num % base\n result = digitToChar(remainder) + result\n num = Math.floor(num / base)\n }\n\n return result\n}\n\n/**\n * Creates a mapping from DepID to short identifier\n */\nfunction createDepIdMapping(\n importers: Set<NodeLike>,\n): Map<DepID, string> {\n const mapping = new Map<DepID, string>()\n const uniqueDepIds = new Set<DepID>()\n\n // Collect all unique DepIDs from nodes & importers\n const [importer] = importers\n if (importer) {\n for (const node of importer.graph.nodes.values()) {\n uniqueDepIds.add(node.id)\n }\n }\n\n // Create mapping for each unique DepID\n let index = 0\n for (const depId of uniqueDepIds) {\n mapping.set(depId, generateShortId(index++))\n }\n\n return mapping\n}\n\n/**\n * Returns a node reference: on the first occurrence of a node, returns the full label;\n * on subsequent occurrences, returns just the shortId.\n *\n * Note: Mutates the `labeledNodes` set as a side effect to track which nodes have already\n * been labeled. This tracking is shared across multiple importers to prevent duplicate\n * labels in the output.\n */\nconst nodeRef = (\n node: NodeLike,\n labeledNodes: Set<DepID>,\n depIdMapping: Map<DepID, string>,\n): string => {\n const shortId =\n depIdMapping.get(\n node.id,\n ) /* c8 ignore next - should not be possible */ ?? ''\n if (labeledNodes.has(node.id)) {\n return shortId\n }\n labeledNodes.add(node.id)\n return `${shortId}(\"${String(node).replaceAll('@', '#64;')}\")`\n}\n\nfunction parseNode(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n node: NodeLike,\n isImporter = false,\n) {\n if (seenNodes.has(node.id) || !includedItems.get(node)) {\n return ''\n }\n seenNodes.add(node.id)\n // For importers, render the node label first as a standalone line before processing edges,\n // since they appear at the top of the graph. Non-importer nodes are labeled inline as part of edge definitions.\n const nodeLabel =\n isImporter ? nodeRef(node, labeledNodes, depIdMapping) : ''\n // Include both regular edges and workspace edges (if any)\n const allEdges = [\n ...node.edgesOut.values(),\n ...(node.workspaces?.values() ?? []),\n ]\n const edges: string = allEdges\n .map(e =>\n parseEdge(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n e,\n ),\n )\n .filter(Boolean)\n .join('\\n')\n // Only render node standalone for importers, others are rendered as part of edges\n if (isImporter) {\n /* c8 ignore next */\n return `${nodeLabel}${edges.length ? '\\n' : ''}${edges}`\n }\n return edges\n}\n\nfunction parseEdge(\n seenNodes: Set<DepID>,\n labeledNodes: Set<DepID>,\n includedItems: Map<EdgeLike | NodeLike, boolean>,\n depIdMapping: Map<DepID, string>,\n edge: EdgeLike,\n) {\n if (!includedItems.get(edge)) {\n return ''\n }\n\n const edgeType = edge.type === 'prod' ? '' : ` (${edge.type})`\n const edgeResult =\n nodeRef(edge.from, labeledNodes, depIdMapping) +\n ` -->|\"${String(edge.spec).replaceAll('@', '#64;')}${edgeType}\"| `\n\n const missingLabel =\n edge.type.endsWith('ptional') ? 'Missing Optional' : 'Missing'\n if (!edge.to) {\n return edgeResult + `missing-${missingCount++}(${missingLabel})`\n }\n\n // Label the target node first so that if it's referenced again later in the graph,\n // it will use the short identifier instead of repeating the full label.\n const toRef = nodeRef(edge.to, labeledNodes, depIdMapping)\n const childEdges = parseNode(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n edge.to,\n )\n return edgeResult + toRef + (childEdges ? '\\n' + childEdges : '')\n}\n\n/**\n * Returns a mermaid string representation of the graph.\n */\nexport function mermaidOutput({\n edges,\n importers,\n nodes,\n}: MermaidOutputGraph) {\n const seen = new Set<EdgeLike | NodeLike>()\n const includedItems = new Map<EdgeLike | NodeLike, boolean>()\n const traverse = new Set<TraverseItem>(\n [...importers].map(i => ({ self: i, parent: undefined })),\n )\n\n for (const item of traverse) {\n if (seen.has(item.self)) continue\n seen.add(item.self)\n\n if (item.self instanceof Edge) {\n // Workspace edges are stored in mainImporter.workspaces and not in graph.edges,\n // so we need to check for workspace spec type to always include them\n if (\n edges.includes(item.self) ||\n item.self.spec.type === 'workspace'\n ) {\n includedItems.set(item.self, true)\n }\n if (item.self.to) {\n traverse.add({ self: item.self.to, parent: item.self })\n }\n }\n\n if (item.self instanceof Node) {\n if (nodes.includes(item.self)) {\n includedItems.set(item.self, true)\n }\n for (const edge of item.self.edgesOut.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n // Also traverse workspace edges (only mainImporter has these)\n if (item.self.workspaces) {\n for (const edge of item.self.workspaces.values()) {\n traverse.add({ self: edge, parent: item.self })\n }\n }\n }\n }\n\n for (const item of [...traverse].reverse()) {\n if (includedItems.has(item.self) && item.parent) {\n includedItems.set(item.parent, true)\n }\n }\n\n // Create DepID to short identifier mapping\n const depIdMapping = createDepIdMapping(importers)\n\n // Track nodes that have had their label printed (shared across all importers)\n const labeledNodes = new Set<DepID>()\n\n // Track nodes that have been processed (shared across all importers to avoid duplicates)\n const seenNodes = new Set<DepID>()\n\n return (\n 'flowchart TD\\n' +\n [...importers]\n .map(i =>\n parseNode(\n seenNodes,\n labeledNodes,\n includedItems,\n depIdMapping,\n i,\n true, // isImporter\n ),\n )\n .filter(Boolean)\n .join('\\n')\n )\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vltpkg/graph",
3
3
  "description": "A library that helps understanding & expressing what happens on an install",
4
- "version": "1.0.0-rc.7",
4
+ "version": "1.0.0-rc.9",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/vltpkg/vltpkg.git",
@@ -24,25 +24,25 @@
24
24
  "graph-run": "^1.1.0",
25
25
  "path-scurry": "^2.0.0",
26
26
  "promise-call-limit": "^3.0.2",
27
- "@vltpkg/dep-id": "1.0.0-rc.7",
28
- "@vltpkg/cmd-shim": "1.0.0-rc.7",
29
- "@vltpkg/error-cause": "1.0.0-rc.7",
30
- "@vltpkg/fast-split": "1.0.0-rc.7",
31
- "@vltpkg/init": "1.0.0-rc.7",
32
- "@vltpkg/output": "1.0.0-rc.7",
33
- "@vltpkg/package-info": "1.0.0-rc.7",
34
- "@vltpkg/dss-breadcrumb": "1.0.0-rc.7",
35
- "@vltpkg/package-json": "1.0.0-rc.7",
36
- "@vltpkg/pick-manifest": "1.0.0-rc.7",
37
- "@vltpkg/query": "1.0.0-rc.7",
38
- "@vltpkg/rollback-remove": "1.0.0-rc.7",
39
- "@vltpkg/run": "1.0.0-rc.7",
40
- "@vltpkg/security-archive": "1.0.0-rc.7",
41
- "@vltpkg/spec": "1.0.0-rc.7",
42
- "@vltpkg/types": "1.0.0-rc.7",
43
- "@vltpkg/vlt-json": "1.0.0-rc.7",
44
- "@vltpkg/satisfies": "1.0.0-rc.7",
45
- "@vltpkg/workspaces": "1.0.0-rc.7"
27
+ "@vltpkg/cmd-shim": "1.0.0-rc.9",
28
+ "@vltpkg/dss-breadcrumb": "1.0.0-rc.9",
29
+ "@vltpkg/dep-id": "1.0.0-rc.9",
30
+ "@vltpkg/error-cause": "1.0.0-rc.9",
31
+ "@vltpkg/fast-split": "1.0.0-rc.9",
32
+ "@vltpkg/init": "1.0.0-rc.9",
33
+ "@vltpkg/package-info": "1.0.0-rc.9",
34
+ "@vltpkg/package-json": "1.0.0-rc.9",
35
+ "@vltpkg/output": "1.0.0-rc.9",
36
+ "@vltpkg/pick-manifest": "1.0.0-rc.9",
37
+ "@vltpkg/query": "1.0.0-rc.9",
38
+ "@vltpkg/satisfies": "1.0.0-rc.9",
39
+ "@vltpkg/rollback-remove": "1.0.0-rc.9",
40
+ "@vltpkg/security-archive": "1.0.0-rc.9",
41
+ "@vltpkg/spec": "1.0.0-rc.9",
42
+ "@vltpkg/run": "1.0.0-rc.9",
43
+ "@vltpkg/types": "1.0.0-rc.9",
44
+ "@vltpkg/vlt-json": "1.0.0-rc.9",
45
+ "@vltpkg/workspaces": "1.0.0-rc.9"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@eslint/js": "^9.34.0",
@@ -55,7 +55,7 @@
55
55
  "typedoc": "~0.27.9",
56
56
  "typescript": "5.7.3",
57
57
  "typescript-eslint": "^8.40.0",
58
- "@vltpkg/vlt-json": "1.0.0-rc.7"
58
+ "@vltpkg/vlt-json": "1.0.0-rc.9"
59
59
  },
60
60
  "license": "BSD-2-Clause-Patent",
61
61
  "engines": {