@galaxy-tool-util/schema 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/index.d.ts +9 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +8 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/schema/parsed-tool.d.ts +346 -1
  6. package/dist/schema/parsed-tool.d.ts.map +1 -1
  7. package/dist/schema/parsed-tool.js +73 -2
  8. package/dist/schema/parsed-tool.js.map +1 -1
  9. package/dist/workflow/cytoscape-layout.d.ts +23 -0
  10. package/dist/workflow/cytoscape-layout.d.ts.map +1 -0
  11. package/dist/workflow/cytoscape-layout.js +115 -0
  12. package/dist/workflow/cytoscape-layout.js.map +1 -0
  13. package/dist/workflow/cytoscape-models.d.ts +67 -0
  14. package/dist/workflow/cytoscape-models.d.ts.map +1 -0
  15. package/dist/workflow/cytoscape-models.js +10 -0
  16. package/dist/workflow/cytoscape-models.js.map +1 -0
  17. package/dist/workflow/cytoscape.d.ts +29 -0
  18. package/dist/workflow/cytoscape.d.ts.map +1 -0
  19. package/dist/workflow/cytoscape.js +172 -0
  20. package/dist/workflow/cytoscape.js.map +1 -0
  21. package/dist/workflow/edge-annotation.d.ts +24 -0
  22. package/dist/workflow/edge-annotation.d.ts.map +1 -0
  23. package/dist/workflow/edge-annotation.js +16 -0
  24. package/dist/workflow/edge-annotation.js.map +1 -0
  25. package/dist/workflow/index.d.ts +4 -0
  26. package/dist/workflow/index.d.ts.map +1 -1
  27. package/dist/workflow/index.js +4 -0
  28. package/dist/workflow/index.js.map +1 -1
  29. package/dist/workflow/mermaid.d.ts +6 -0
  30. package/dist/workflow/mermaid.d.ts.map +1 -1
  31. package/dist/workflow/mermaid.js +37 -4
  32. package/dist/workflow/mermaid.js.map +1 -1
  33. package/dist/workflow/report-models.d.ts +9 -0
  34. package/dist/workflow/report-models.d.ts.map +1 -1
  35. package/dist/workflow/report-models.js.map +1 -1
  36. package/package.json +1 -1
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Cross-language topological layout for Cytoscape elements.
3
+ *
4
+ * Spec: docs/architecture/cytoscape-layout.md. Any change here is a breaking
5
+ * visual diff and must land in lockstep with the gxformat2 port.
6
+ */
7
+ export const COL_STRIDE = 220;
8
+ export const ROW_STRIDE = 100;
9
+ export const LAYOUT_NAMES = [
10
+ "preset",
11
+ "topological",
12
+ "dagre",
13
+ "breadthfirst",
14
+ "grid",
15
+ "cose",
16
+ "random",
17
+ ];
18
+ export function isLayoutName(value) {
19
+ return LAYOUT_NAMES.includes(value);
20
+ }
21
+ /**
22
+ * Layouts that bake coordinates into `data.position`. All other layouts are
23
+ * hint-only and rely on the runtime renderer.
24
+ */
25
+ export function bakesCoordinates(layout) {
26
+ return layout === "preset" || layout === "topological";
27
+ }
28
+ /**
29
+ * Compute positions per the topological layering spec. Returns a map keyed by
30
+ * node `data.id` so callers can overwrite `node.position` in declaration order.
31
+ */
32
+ export function topologicalPositions(elements) {
33
+ const nodeIds = elements.nodes.map((n) => n.data.id);
34
+ const indexById = new Map();
35
+ nodeIds.forEach((id, i) => indexById.set(id, i));
36
+ const incoming = new Map();
37
+ for (const id of nodeIds)
38
+ incoming.set(id, []);
39
+ for (const edge of elements.edges) {
40
+ const { source, target } = edge.data;
41
+ if (!indexById.has(source) || !indexById.has(target))
42
+ continue;
43
+ incoming.get(target).push(source);
44
+ }
45
+ const inDegree = new Map();
46
+ for (const [id, srcs] of incoming)
47
+ inDegree.set(id, srcs.length);
48
+ // Kahn topo sort with declaration-index tie break. We avoid a heap to keep
49
+ // the algorithm trivially portable; node counts are tiny (workflows
50
+ // typically <100 steps).
51
+ const column = new Map();
52
+ const ready = nodeIds.filter((id) => inDegree.get(id) === 0);
53
+ const queue = [...ready];
54
+ // sort once by declaration index — entries already in declaration order, but
55
+ // keep the sort explicit so the contract stays obvious.
56
+ queue.sort((a, b) => indexById.get(a) - indexById.get(b));
57
+ const visited = new Set();
58
+ const dependents = new Map();
59
+ for (const id of nodeIds)
60
+ dependents.set(id, []);
61
+ for (const [target, sources] of incoming) {
62
+ for (const s of sources)
63
+ dependents.get(s).push(target);
64
+ }
65
+ while (queue.length > 0) {
66
+ // pop lowest declaration index
67
+ let bestIdx = 0;
68
+ for (let i = 1; i < queue.length; i++) {
69
+ if (indexById.get(queue[i]) < indexById.get(queue[bestIdx]))
70
+ bestIdx = i;
71
+ }
72
+ const id = queue.splice(bestIdx, 1)[0];
73
+ visited.add(id);
74
+ const sources = incoming.get(id);
75
+ if (sources.length === 0) {
76
+ column.set(id, 0);
77
+ }
78
+ else {
79
+ let max = 0;
80
+ for (const s of sources) {
81
+ const c = column.get(s);
82
+ if (c !== undefined && c + 1 > max)
83
+ max = c + 1;
84
+ }
85
+ column.set(id, max);
86
+ }
87
+ for (const dep of dependents.get(id)) {
88
+ const remaining = inDegree.get(dep) - 1;
89
+ inDegree.set(dep, remaining);
90
+ if (remaining === 0)
91
+ queue.push(dep);
92
+ }
93
+ }
94
+ // Cycle fallback: any node not visited gets column = declaration index.
95
+ for (const id of nodeIds) {
96
+ if (!visited.has(id))
97
+ column.set(id, indexById.get(id));
98
+ }
99
+ // Row assignment: per column, declaration order.
100
+ const rowsByColumn = new Map();
101
+ for (const id of nodeIds) {
102
+ const c = column.get(id);
103
+ if (!rowsByColumn.has(c))
104
+ rowsByColumn.set(c, []);
105
+ rowsByColumn.get(c).push(id);
106
+ }
107
+ const positions = new Map();
108
+ for (const [c, ids] of rowsByColumn) {
109
+ ids.forEach((id, row) => {
110
+ positions.set(id, { x: c * COL_STRIDE, y: row * ROW_STRIDE });
111
+ });
112
+ }
113
+ return positions;
114
+ }
115
+ //# sourceMappingURL=cytoscape-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cytoscape-layout.js","sourceRoot":"","sources":["../../src/workflow/cytoscape-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Output-only TS interfaces for Cytoscape.js workflow visualization elements.
3
+ *
4
+ * Port of gxformat2/cytoscape/models.py. Field names stay snake_case so the
5
+ * emitted JSON is byte-identical to the Python builder.
6
+ */
7
+ export interface CytoscapePosition {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ export interface CytoscapeNodeData {
12
+ id: string;
13
+ label: string;
14
+ doc: string | null;
15
+ tool_id: string | null;
16
+ step_type: string;
17
+ repo_link: string | null;
18
+ }
19
+ export interface CytoscapeEdgeData {
20
+ id: string;
21
+ source: string;
22
+ target: string;
23
+ input: string;
24
+ output: string | null;
25
+ /**
26
+ * Map-over depth applied at this connection, when annotated. Optional so the
27
+ * default emit shape stays byte-identical with the Python builder.
28
+ */
29
+ map_depth?: number;
30
+ /** True when the connection reduces a list-like source into a multi-data scalar input. */
31
+ reduction?: boolean;
32
+ /** Textual mapping (e.g. "list", "list:paired"); mirrors `ConnectionResult.mapping`. */
33
+ mapping?: string | null;
34
+ }
35
+ export interface CytoscapeNode {
36
+ group: "nodes";
37
+ data: CytoscapeNodeData;
38
+ classes: string[];
39
+ /**
40
+ * Present for `preset` and `topological` layouts; omitted for hint-only
41
+ * layouts (`dagre`, `breadthfirst`, `grid`, `cose`, `random`) so the runtime
42
+ * renderer is responsible for placement.
43
+ */
44
+ position?: CytoscapePosition;
45
+ }
46
+ export interface CytoscapeEdge {
47
+ group: "edges";
48
+ data: CytoscapeEdgeData;
49
+ /** Optional class hints (e.g. "mapover_2", "reduction") used by the HTML viewer's stylesheet. */
50
+ classes?: string[];
51
+ }
52
+ export interface CytoscapeLayoutHint {
53
+ name: string;
54
+ }
55
+ export interface CytoscapeElements {
56
+ nodes: CytoscapeNode[];
57
+ edges: CytoscapeEdge[];
58
+ /**
59
+ * Present only when the builder was invoked with a non-`preset` layout.
60
+ * Carried out-of-band so `elementsToList` keeps Python parity for the flat
61
+ * list shape.
62
+ */
63
+ layout?: CytoscapeLayoutHint;
64
+ }
65
+ export type CytoscapeListItem = CytoscapeNode | CytoscapeEdge;
66
+ export declare function elementsToList(els: CytoscapeElements): CytoscapeListItem[];
67
+ //# sourceMappingURL=cytoscape-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cytoscape-models.d.ts","sourceRoot":"","sources":["../../src/workflow/cytoscape-models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;IACxB,iGAAiG;IACjG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE9D,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,CAE1E"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Output-only TS interfaces for Cytoscape.js workflow visualization elements.
3
+ *
4
+ * Port of gxformat2/cytoscape/models.py. Field names stay snake_case so the
5
+ * emitted JSON is byte-identical to the Python builder.
6
+ */
7
+ export function elementsToList(els) {
8
+ return [...els.nodes, ...els.edges];
9
+ }
10
+ //# sourceMappingURL=cytoscape-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cytoscape-models.js","sourceRoot":"","sources":["../../src/workflow/cytoscape-models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqEH,MAAM,UAAU,cAAc,CAAC,GAAsB;IACnD,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Build Cytoscape.js elements from a Galaxy workflow.
3
+ *
4
+ * Port of gxformat2/cytoscape/_builder.py. Snake_case field names + edge id
5
+ * format are preserved byte-for-byte to interop with the Python emitter and
6
+ * the standalone HTML template.
7
+ */
8
+ import type { CytoscapeElements } from "./cytoscape-models.js";
9
+ import type { LayoutName } from "./cytoscape-layout.js";
10
+ import type { EdgeAnnotation } from "./edge-annotation.js";
11
+ import type { NormalizedFormat2Workflow } from "./normalized/format2.js";
12
+ export interface CytoscapeOptions {
13
+ /**
14
+ * Optional `EdgeAnnotation` map keyed by `edgeAnnotationKey(...)`. When
15
+ * present, edges gain `data.map_depth`, `data.reduction`, `data.mapping`
16
+ * and class hints (`mapover_<n>`, `reduction`).
17
+ */
18
+ edgeAnnotations?: Map<string, EdgeAnnotation>;
19
+ /**
20
+ * Layout strategy. `preset` (default) keeps today's coordinate-from-NF2
21
+ * behavior with a `(10*i, 10*i)` fallback. `topological` overwrites
22
+ * coordinates per `cytoscape-layout.ts`. Hint-only layouts (`dagre`,
23
+ * `breadthfirst`, `grid`, `cose`, `random`) drop coordinates and emit a
24
+ * top-level `elements.layout = { name }` hint for the runtime renderer.
25
+ */
26
+ layout?: LayoutName;
27
+ }
28
+ export declare function cytoscapeElements(workflow: unknown | NormalizedFormat2Workflow, opts?: CytoscapeOptions): CytoscapeElements;
29
+ //# sourceMappingURL=cytoscape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cytoscape.d.ts","sourceRoot":"","sources":["../../src/workflow/cytoscape.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAGV,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAKjC,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,GAAG,yBAAyB,EAC7C,IAAI,GAAE,gBAAqB,GAC1B,iBAAiB,CAiDnB"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Build Cytoscape.js elements from a Galaxy workflow.
3
+ *
4
+ * Port of gxformat2/cytoscape/_builder.py. Snake_case field names + edge id
5
+ * format are preserved byte-for-byte to interop with the Python emitter and
6
+ * the standalone HTML template.
7
+ */
8
+ import { bakesCoordinates, topologicalPositions } from "./cytoscape-layout.js";
9
+ import { edgeAnnotationKey } from "./edge-annotation.js";
10
+ import { ensureFormat2 } from "./normalized/ensure.js";
11
+ import { isUnlabeledStep, resolveSourceReference } from "./normalized/labels.js";
12
+ const MAIN_TS_PREFIX = "toolshed.g2.bx.psu.edu/repos/";
13
+ export function cytoscapeElements(workflow, opts = {}) {
14
+ const wf = typeof workflow === "object" &&
15
+ workflow !== null &&
16
+ workflow.class === "GalaxyWorkflow" &&
17
+ Array.isArray(workflow.inputs) &&
18
+ "unique_tools" in workflow
19
+ ? workflow
20
+ : ensureFormat2(workflow);
21
+ const layout = opts.layout ?? "preset";
22
+ const nodes = [];
23
+ const edges = [];
24
+ wf.inputs.forEach((inp, i) => {
25
+ nodes.push(_inputNode(inp, i));
26
+ });
27
+ const inputsOffset = wf.inputs.length;
28
+ const knownLabels = new Set();
29
+ for (const inp of wf.inputs)
30
+ knownLabels.add(inp.id);
31
+ for (const step of wf.steps)
32
+ knownLabels.add(step.label || step.id);
33
+ wf.steps.forEach((step, i) => {
34
+ nodes.push(_stepNode(step, i + inputsOffset));
35
+ edges.push(..._stepEdges(step, knownLabels, opts.edgeAnnotations));
36
+ });
37
+ const elements = { nodes, edges };
38
+ if (layout === "preset") {
39
+ return elements;
40
+ }
41
+ if (bakesCoordinates(layout)) {
42
+ // Currently only `topological` reaches here; computed off the
43
+ // already-built elements per docs/architecture/cytoscape-layout.md.
44
+ const positions = topologicalPositions(elements);
45
+ for (const node of nodes) {
46
+ const p = positions.get(node.data.id);
47
+ if (p)
48
+ node.position = p;
49
+ }
50
+ }
51
+ else {
52
+ // Hint-only layout: positions are the renderer's job.
53
+ for (const node of nodes)
54
+ delete node.position;
55
+ }
56
+ elements.layout = { name: layout };
57
+ return elements;
58
+ }
59
+ function _fallbackPosition(orderIndex) {
60
+ return { x: 10 * orderIndex, y: 10 * orderIndex };
61
+ }
62
+ function _toPosition(raw, orderIndex) {
63
+ if (raw == null)
64
+ return _fallbackPosition(orderIndex);
65
+ const left = raw.left;
66
+ const top = raw.top;
67
+ const x = typeof left === "number" ? Math.trunc(left) : Number.parseInt(String(left ?? 0), 10);
68
+ const y = typeof top === "number" ? Math.trunc(top) : Number.parseInt(String(top ?? 0), 10);
69
+ return {
70
+ x: Number.isFinite(x) ? x : 0,
71
+ y: Number.isFinite(y) ? y : 0,
72
+ };
73
+ }
74
+ function _inputTypeStr(type) {
75
+ if (type == null)
76
+ return "input";
77
+ if (typeof type === "string")
78
+ return type;
79
+ return type.length > 0 ? `${type[0]}[]` : "input";
80
+ }
81
+ function _inputNode(inp, orderIndex) {
82
+ const inputId = inp.id || String(orderIndex);
83
+ const typeStr = _inputTypeStr(inp.type);
84
+ return {
85
+ group: "nodes",
86
+ data: {
87
+ id: inputId,
88
+ label: inputId,
89
+ doc: typeof inp.doc === "string" ? inp.doc : null,
90
+ tool_id: null,
91
+ step_type: typeStr,
92
+ repo_link: null,
93
+ },
94
+ classes: [`type_${typeStr}`, "input"],
95
+ position: _toPosition(inp.position, orderIndex),
96
+ };
97
+ }
98
+ function _stepNode(step, orderIndex) {
99
+ const stepId = step.label || step.id;
100
+ // The TS normalizer doesn't infer step.type the way gxformat2 does, so fall
101
+ // back to a `run`-derived hint for subworkflows (matches mermaid emitter).
102
+ const stepType = step.type || (step.run != null ? "subworkflow" : "tool");
103
+ let strippedToolId = step.tool_id ?? null;
104
+ if (strippedToolId && strippedToolId.startsWith(MAIN_TS_PREFIX)) {
105
+ strippedToolId = strippedToolId.slice(MAIN_TS_PREFIX.length);
106
+ }
107
+ const displayId = step.id && !isUnlabeledStep(step.id) ? step.id : null;
108
+ const label = step.label || displayId || (strippedToolId ? `tool:${strippedToolId}` : String(orderIndex));
109
+ let repoLink = null;
110
+ const repo = step.tool_shed_repository;
111
+ if (repo) {
112
+ const toolShed = repo.tool_shed;
113
+ const owner = repo.owner;
114
+ const name = repo.name;
115
+ const changesetRevision = repo.changeset_revision;
116
+ repoLink = `https://${toolShed}/view/${owner}/${name}/${changesetRevision}`;
117
+ }
118
+ return {
119
+ group: "nodes",
120
+ data: {
121
+ id: stepId,
122
+ label,
123
+ doc: typeof step.doc === "string" ? step.doc : null,
124
+ tool_id: step.tool_id ?? null,
125
+ step_type: stepType,
126
+ repo_link: repoLink,
127
+ },
128
+ classes: [`type_${stepType}`, "runnable"],
129
+ position: _toPosition(step.position, orderIndex),
130
+ };
131
+ }
132
+ function _stepEdges(step, knownLabels, edgeAnnotations) {
133
+ const stepId = step.label || step.id;
134
+ const edges = [];
135
+ for (const stepInput of step.in) {
136
+ if (stepInput.source == null)
137
+ continue;
138
+ const inputId = stepInput.id || "unknown";
139
+ const sources = Array.isArray(stepInput.source) ? stepInput.source : [stepInput.source];
140
+ for (const source of sources) {
141
+ const [sourceLabel, outputName] = resolveSourceReference(source, knownLabels);
142
+ const output = outputName === "output" ? null : outputName;
143
+ const edgeId = `${stepId}__${inputId}__from__${sourceLabel}`;
144
+ const edge = {
145
+ group: "edges",
146
+ data: {
147
+ id: edgeId,
148
+ source: sourceLabel,
149
+ target: stepId,
150
+ input: inputId,
151
+ output,
152
+ },
153
+ };
154
+ const annotation = edgeAnnotations?.get(edgeAnnotationKey(sourceLabel, outputName, stepId, inputId));
155
+ if (annotation) {
156
+ edge.data.map_depth = annotation.mapDepth;
157
+ edge.data.reduction = annotation.reduction;
158
+ edge.data.mapping = annotation.mapping ?? null;
159
+ const classes = [];
160
+ if (annotation.mapDepth > 0)
161
+ classes.push(`mapover_${annotation.mapDepth}`);
162
+ if (annotation.reduction)
163
+ classes.push("reduction");
164
+ if (classes.length > 0)
165
+ edge.classes = classes;
166
+ }
167
+ edges.push(edge);
168
+ }
169
+ }
170
+ return edges;
171
+ }
172
+ //# sourceMappingURL=cytoscape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cytoscape.js","sourceRoot":"","sources":["../../src/workflow/cytoscape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Edge-annotation contract consumed by workflow visualizers (mermaid,
3
+ * cytoscape) when encoding map-over depth and reductions on edges.
4
+ *
5
+ * This is a structural duplicate of the type re-exported from
6
+ * `@galaxy-tool-util/connection-validation`. Schema cannot import the
7
+ * validator (dep chain points the other way), so it defines the contract
8
+ * locally; pass-through is via structural typing.
9
+ *
10
+ * Lookup keys use step *labels* (falling back to native stepId when a
11
+ * label is absent), matching what format2-driven emitters key off.
12
+ */
13
+ export interface EdgeAnnotation {
14
+ sourceStep: string;
15
+ sourceOutput: string;
16
+ targetStep: string;
17
+ targetInput: string;
18
+ mapDepth: number;
19
+ reduction: boolean;
20
+ mapping?: string | null;
21
+ status?: "ok" | "invalid" | "skip";
22
+ }
23
+ export declare function edgeAnnotationKey(sourceStep: string, sourceOutput: string, targetStep: string, targetInput: string): string;
24
+ //# sourceMappingURL=edge-annotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-annotation.d.ts","sourceRoot":"","sources":["../../src/workflow/edge-annotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC;CACpC;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Edge-annotation contract consumed by workflow visualizers (mermaid,
3
+ * cytoscape) when encoding map-over depth and reductions on edges.
4
+ *
5
+ * This is a structural duplicate of the type re-exported from
6
+ * `@galaxy-tool-util/connection-validation`. Schema cannot import the
7
+ * validator (dep chain points the other way), so it defines the contract
8
+ * locally; pass-through is via structural typing.
9
+ *
10
+ * Lookup keys use step *labels* (falling back to native stepId when a
11
+ * label is absent), matching what format2-driven emitters key off.
12
+ */
13
+ export function edgeAnnotationKey(sourceStep, sourceOutput, targetStep, targetInput) {
14
+ return `${sourceStep}|${sourceOutput}->${targetStep}|${targetInput}`;
15
+ }
16
+ //# sourceMappingURL=edge-annotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-annotation.js","sourceRoot":"","sources":["../../src/workflow/edge-annotation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,YAAoB,EACpB,UAAkB,EAClB,WAAmB;IAEnB,OAAO,GAAG,UAAU,IAAI,YAAY,KAAK,UAAU,IAAI,WAAW,EAAE,CAAC;AACvE,CAAC"}
@@ -16,6 +16,10 @@ export { findParamAtPath, type ParamNavigationResult } from "./param-navigation.
16
16
  export { roundtripValidate, type RoundtripResult, type RoundtripStrictOptions, type StepRoundtripResult, type BenignArtifactKind, type RoundtripFailureClass, } from "./roundtrip.js";
17
17
  export { cleanWorkflow, type CleanWorkflowOptions, type CleanWorkflowResult } from "./clean.js";
18
18
  export { workflowToMermaid, type MermaidOptions } from "./mermaid.js";
19
+ export { edgeAnnotationKey, type EdgeAnnotation } from "./edge-annotation.js";
20
+ export { cytoscapeElements, type CytoscapeOptions } from "./cytoscape.js";
21
+ export { elementsToList, type CytoscapeEdge, type CytoscapeEdgeData, type CytoscapeElements, type CytoscapeLayoutHint, type CytoscapeListItem, type CytoscapeNode, type CytoscapeNodeData, type CytoscapePosition, } from "./cytoscape-models.js";
22
+ export { COL_STRIDE, ROW_STRIDE, LAYOUT_NAMES, bakesCoordinates, isLayoutName, topologicalPositions, type LayoutName, } from "./cytoscape-layout.js";
19
23
  export { detectFormat, type WorkflowFormat } from "./detect-format.js";
20
24
  export { withClass, validateFormat2, validateFormat2Strict, validateNative, validateNativeStrict, validatorForFixture, } from "./validators.js";
21
25
  export { validateEncodingNative, validateEncodingFormat2, checkStrictEncoding, checkStrictStructure, } from "./strict-checks.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,10 @@ export { findParamAtPath } from "./param-navigation.js";
19
19
  export { roundtripValidate, } from "./roundtrip.js";
20
20
  export { cleanWorkflow } from "./clean.js";
21
21
  export { workflowToMermaid } from "./mermaid.js";
22
+ export { edgeAnnotationKey } from "./edge-annotation.js";
23
+ export { cytoscapeElements } from "./cytoscape.js";
24
+ export { elementsToList, } from "./cytoscape-models.js";
25
+ export { COL_STRIDE, ROW_STRIDE, LAYOUT_NAMES, bakesCoordinates, isLayoutName, topologicalPositions, } from "./cytoscape-layout.js";
22
26
  export { detectFormat } from "./detect-format.js";
23
27
  export { withClass, validateFormat2, validateFormat2Strict, validateNative, validateNativeStrict, validatorForFixture, } from "./validators.js";
24
28
  export { validateEncodingNative, validateEncodingFormat2, checkStrictEncoding, checkStrictStructure, } from "./strict-checks.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,15 @@
3
3
  *
4
4
  * Port of gxformat2/mermaid/_builder.py.
5
5
  */
6
+ import type { EdgeAnnotation } from "./edge-annotation.js";
6
7
  import type { NormalizedFormat2Workflow } from "./normalized/format2.js";
7
8
  export interface MermaidOptions {
8
9
  comments?: boolean;
10
+ /**
11
+ * Optional map of `EdgeAnnotation` keyed by `edgeAnnotationKey(...)`. When
12
+ * provided, edges with map-over depth or reductions are styled distinctly.
13
+ */
14
+ edgeAnnotations?: Map<string, EdgeAnnotation>;
9
15
  }
10
16
  export declare function workflowToMermaid(workflow: unknown | NormalizedFormat2Workflow, opts?: MermaidOptions): string;
11
17
  //# sourceMappingURL=mermaid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/workflow/mermaid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAyBzE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+CD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,GAAG,yBAAyB,EAC7C,IAAI,GAAE,cAAmB,GACxB,MAAM,CA8FR"}
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../src/workflow/mermaid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAyBzE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/C;AA+CD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,GAAG,yBAAyB,EAC7C,IAAI,GAAE,cAAmB,GACxB,MAAM,CA8GR"}
@@ -3,8 +3,9 @@
3
3
  *
4
4
  * Port of gxformat2/mermaid/_builder.py.
5
5
  */
6
+ import { edgeAnnotationKey } from "./edge-annotation.js";
6
7
  import { ensureFormat2 } from "./normalized/ensure.js";
7
- import { resolveSourceReference } from "./normalized/labels.js";
8
+ import { isUnlabeledStep, resolveSourceReference } from "./normalized/labels.js";
8
9
  const SHAPE_INPUT = [">", "]"];
9
10
  const SHAPE_PARAM = ["{{", "}}"];
10
11
  const SHAPE_TOOL = ["[", "]"];
@@ -94,7 +95,8 @@ export function workflowToMermaid(workflow, opts = {}) {
94
95
  if (toolId && toolId.startsWith(MAIN_TS_PREFIX)) {
95
96
  toolId = toolId.slice(MAIN_TS_PREFIX.length);
96
97
  }
97
- const rawLabel = step.label || step.id || (toolId ? `tool:${toolId}` : String(i));
98
+ const displayId = step.id && !isUnlabeledStep(step.id) ? step.id : null;
99
+ const rawLabel = step.label || displayId || (toolId ? `tool:${toolId}` : String(i));
98
100
  const label = sanitizeLabel(rawLabel);
99
101
  // The TS normalizer does not infer step.type the way gxformat2 does, so
100
102
  // fall back to `run` shape: anything non-null implies a subworkflow.
@@ -134,14 +136,18 @@ export function workflowToMermaid(workflow, opts = {}) {
134
136
  // Build the set of known labels for source resolution: input ids + step labels/ids.
135
137
  const knownLabels = new Set([...inputIds.keys(), ...stepIds.keys()]);
136
138
  const seenEdges = new Set();
139
+ const linkStyles = [];
140
+ let edgeIndex = 0;
137
141
  wf.steps.forEach((step, i) => {
138
142
  const nodeId = `step_${i}`;
143
+ const targetLabel = step.label || step.id;
139
144
  for (const stepInput of step.in) {
140
145
  if (stepInput.source == null)
141
146
  continue;
147
+ const inputId = stepInput.id || "";
142
148
  const sources = Array.isArray(stepInput.source) ? stepInput.source : [stepInput.source];
143
149
  for (const source of sources) {
144
- const [sourceLabel] = resolveSourceReference(source, knownLabels);
150
+ const [sourceLabel, outputName] = resolveSourceReference(source, knownLabels);
145
151
  const sourceId = inputIds.get(sourceLabel) ?? stepIds.get(sourceLabel);
146
152
  if (!sourceId)
147
153
  continue;
@@ -149,10 +155,37 @@ export function workflowToMermaid(workflow, opts = {}) {
149
155
  if (seenEdges.has(edgeKey))
150
156
  continue;
151
157
  seenEdges.add(edgeKey);
152
- lines.push(` ${sourceId} --> ${nodeId}`);
158
+ const annotation = opts.edgeAnnotations?.get(edgeAnnotationKey(sourceLabel, outputName, targetLabel, inputId));
159
+ const { line, linkStyle } = _renderEdge(sourceId, nodeId, annotation, edgeIndex);
160
+ lines.push(` ${line}`);
161
+ if (linkStyle)
162
+ linkStyles.push(linkStyle);
163
+ edgeIndex++;
153
164
  }
154
165
  }
155
166
  });
167
+ for (const ls of linkStyles) {
168
+ lines.push(` ${ls}`);
169
+ }
156
170
  return lines.join("\n");
157
171
  }
172
+ function _renderEdge(sourceId, targetId, annotation, edgeIndex) {
173
+ if (!annotation || (annotation.mapDepth === 0 && !annotation.reduction)) {
174
+ return { line: `${sourceId} --> ${targetId}`, linkStyle: null };
175
+ }
176
+ if (annotation.reduction) {
177
+ const label = annotation.mapping ? sanitizeLabel(`reduce ${annotation.mapping}`) : "reduce";
178
+ return {
179
+ line: `${sourceId} -. "${label}" .-> ${targetId}`,
180
+ linkStyle: `linkStyle ${edgeIndex} stroke:#a55,stroke-dasharray:6 4`,
181
+ };
182
+ }
183
+ const labelText = annotation.mapping ?? "map";
184
+ const label = sanitizeLabel(labelText);
185
+ const width = 2 + annotation.mapDepth;
186
+ return {
187
+ line: `${sourceId} ==>|"${label}"| ${targetId}`,
188
+ linkStyle: `linkStyle ${edgeIndex} stroke:#5a8,stroke-width:${width}px`,
189
+ };
190
+ }
158
191
  //# sourceMappingURL=mermaid.js.map