@cristianormazabal/triton-core 0.1.17 → 0.1.19

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 (34) hide show
  1. package/dist/diagrams/mermaid/architecture/gridPlacer.d.ts +36 -0
  2. package/dist/diagrams/mermaid/architecture/gridPlacer.d.ts.map +1 -0
  3. package/dist/diagrams/mermaid/architecture/gridPlacer.js +153 -0
  4. package/dist/diagrams/mermaid/architecture/gridPlacer.js.map +1 -0
  5. package/dist/diagrams/{triton → mermaid}/architecture/index.d.ts +1 -1
  6. package/dist/diagrams/mermaid/architecture/index.d.ts.map +1 -0
  7. package/dist/diagrams/{triton → mermaid}/architecture/index.js +2 -2
  8. package/dist/diagrams/mermaid/architecture/index.js.map +1 -0
  9. package/dist/diagrams/mermaid/architecture/ir.d.ts +55 -0
  10. package/dist/diagrams/mermaid/architecture/ir.d.ts.map +1 -0
  11. package/dist/diagrams/mermaid/architecture/ir.js.map +1 -0
  12. package/dist/diagrams/mermaid/architecture/layout.d.ts +27 -0
  13. package/dist/diagrams/mermaid/architecture/layout.d.ts.map +1 -0
  14. package/dist/diagrams/mermaid/architecture/layout.js +352 -0
  15. package/dist/diagrams/mermaid/architecture/layout.js.map +1 -0
  16. package/dist/diagrams/triton/ds/hashmap/hashmap.d.ts +9 -9
  17. package/dist/diagrams/triton/ds/hashmap/hashmap.d.ts.map +1 -1
  18. package/dist/diagrams/triton/ds/hashmap/hashmap.js +126 -28
  19. package/dist/diagrams/triton/ds/hashmap/hashmap.js.map +1 -1
  20. package/dist/frontend/index.js +1 -1
  21. package/dist/frontend/index.js.map +1 -1
  22. package/dist/index.js +933 -170
  23. package/dist/index.js.map +4 -4
  24. package/package.json +1 -1
  25. package/dist/diagrams/triton/architecture/index.d.ts.map +0 -1
  26. package/dist/diagrams/triton/architecture/index.js.map +0 -1
  27. package/dist/diagrams/triton/architecture/ir.d.ts +0 -29
  28. package/dist/diagrams/triton/architecture/ir.d.ts.map +0 -1
  29. package/dist/diagrams/triton/architecture/ir.js.map +0 -1
  30. package/dist/diagrams/triton/architecture/layout.d.ts +0 -11
  31. package/dist/diagrams/triton/architecture/layout.d.ts.map +0 -1
  32. package/dist/diagrams/triton/architecture/layout.js +0 -124
  33. package/dist/diagrams/triton/architecture/layout.js.map +0 -1
  34. /package/dist/diagrams/{triton → mermaid}/architecture/ir.js +0 -0
@@ -0,0 +1,352 @@
1
+ /**
2
+ * @file diagrams/architecture/layout.ts — Cloud architecture diagram.
3
+ *
4
+ * Phase C implementation — replaces Sugiyama layered layout with a
5
+ * direction-constrained BFS grid placer that honours L/R/T/B side semantics.
6
+ * All other rendering features from Phase B remain unchanged.
7
+ *
8
+ * Features:
9
+ * 1. Directional grid placement — BFS from directional edge constraints
10
+ * 2. Junctions — small 4-way split nodes; edges enter/leave on any side.
11
+ * 3. Arrowheads — driven by arrowLeft / arrowRight; axis-aligned markers.
12
+ * 4. {group} edges — port sits on the enclosing group boundary, not the service box.
13
+ * 5. Align — row/column constraints applied as post-grid position nudges.
14
+ * 6. Nested groups — parent groups visually contain child groups.
15
+ * 7. Iconify icons — prefix:name tokens resolved through LayoutOptions.icons;
16
+ * unresolvable tokens fall back to the built-in glyph.
17
+ *
18
+ * Deviations / limitations (disclosed):
19
+ * - Align constraints are applied as a post-BFS median-snap. Edge directions
20
+ * take precedence; align is a fixup for disconnected nodes or user overrides.
21
+ * - Iconify resolution requires the host to supply LayoutOptions.icons.
22
+ */
23
+ import { pen } from '../../../scene/build.js';
24
+ import { applyOverlays } from '../../../overlay/apply.js';
25
+ import { categoricalHue } from '../../../palette/categorical.js';
26
+ import { directionalGridPlacer } from './gridPlacer.js';
27
+ import { orthogonalRouter } from '../../../routing/router.js';
28
+ import { rhu, rhuInt } from '../../../util/round.js';
29
+ import { parseIconRef, resolveIcon } from '../../../icons/resolver.js';
30
+ // ─── Marker IDs ──────────────────────────────────────────────────────────────
31
+ const ARROW_END_ID = 'arch-arrow-end'; // → points in path direction
32
+ const ARROW_START_ID = 'arch-arrow-start'; // ← points against path direction
33
+ // ─── Geometry helpers ─────────────────────────────────────────────────────────
34
+ function port(r, side) {
35
+ switch (side.toUpperCase()) {
36
+ case 'L': return { x: r.x, y: r.y + r.height / 2 };
37
+ case 'R': return { x: r.x + r.width, y: r.y + r.height / 2 };
38
+ case 'T': return { x: r.x + r.width / 2, y: r.y };
39
+ default: return { x: r.x + r.width / 2, y: r.y + r.height };
40
+ }
41
+ }
42
+ function sideToDir(side) {
43
+ switch (side.toUpperCase()) {
44
+ case 'L': return 'W';
45
+ case 'R': return 'E';
46
+ case 'T': return 'N';
47
+ default: return 'S';
48
+ }
49
+ }
50
+ // ─── Group sort (parent before child for back-to-front rendering) ─────────────
51
+ function groupsByDepth(groups) {
52
+ const result = [];
53
+ const added = new Set();
54
+ function add(g) {
55
+ if (added.has(g.id))
56
+ return;
57
+ if (g.parent) {
58
+ const par = groups.find(pg => pg.id === g.parent);
59
+ if (par)
60
+ add(par);
61
+ }
62
+ result.push(g);
63
+ added.add(g.id);
64
+ }
65
+ for (const g of groups)
66
+ add(g);
67
+ return result;
68
+ }
69
+ // ─── Layout entry point ───────────────────────────────────────────────────────
70
+ export function layoutArchitecture(ir, theme, options) {
71
+ const { palette, typography, spacing } = theme;
72
+ const p = pen(theme);
73
+ const margin = spacing.diagramMargin;
74
+ const font = typography.baseFontSize;
75
+ const iconPacks = options?.icons;
76
+ // ── Sizes ─────────────────────────────────────────────────────────────────
77
+ const svcW = 130, svcH = 56;
78
+ const jctW = 16, jctH = 16; // junctions are small crosshair nodes
79
+ // ── Node sizes (services vs junctions) ───────────────────────────────────
80
+ const nodeSizes = new Map();
81
+ for (const s of ir.services)
82
+ nodeSizes.set(s.id, { width: svcW, height: svcH });
83
+ for (const j of ir.junctions)
84
+ nodeSizes.set(j.id, { width: jctW, height: jctH });
85
+ // ── Directional grid placement ────────────────────────────────────────────
86
+ const colGap = 90, rowGap = 44;
87
+ const gridCells = directionalGridPlacer([...ir.services, ...ir.junctions], ir.edges);
88
+ // Convert grid cells → pixel coords; mutable for align post-processing.
89
+ const positions = new Map();
90
+ for (const [id, cell] of gridCells) {
91
+ positions.set(id, {
92
+ x: cell.col * (svcW + colGap) + margin,
93
+ y: cell.row * (svcH + rowGap) + margin,
94
+ });
95
+ }
96
+ // ── Apply align constraints (approximated as median-snap) ─────────────────
97
+ for (const align of ir.aligns) {
98
+ const coords = align.members
99
+ .map(id => positions.get(id))
100
+ .filter((pos) => !!pos);
101
+ if (coords.length < 2)
102
+ continue;
103
+ if (align.axis === 'row') {
104
+ // Pin all members to the median y of the group.
105
+ const ys = coords.map(c => c.y).sort((a, b) => a - b);
106
+ const medY = ys[Math.floor(ys.length / 2)];
107
+ for (const id of align.members) {
108
+ const pos = positions.get(id);
109
+ if (pos)
110
+ pos.y = medY;
111
+ }
112
+ }
113
+ else {
114
+ // column — pin to median x.
115
+ const xs = coords.map(c => c.x).sort((a, b) => a - b);
116
+ const medX = xs[Math.floor(xs.length / 2)];
117
+ for (const id of align.members) {
118
+ const pos = positions.get(id);
119
+ if (pos)
120
+ pos.x = medX;
121
+ }
122
+ }
123
+ }
124
+ // ── rectOf: adjusted position + node size + yOffset ─────────────────────
125
+ const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;
126
+ const yOff = titleH;
127
+ const rectOf = (id) => {
128
+ const pos = positions.get(id);
129
+ const sz = nodeSizes.get(id);
130
+ if (!pos || !sz)
131
+ return undefined;
132
+ return { x: pos.x, y: pos.y + yOff, width: sz.width, height: sz.height };
133
+ };
134
+ // ── Compute group rects (memoised, recursive for nested groups) ───────────
135
+ const groupRectCache = new Map();
136
+ const computeGroupRect = (gId) => {
137
+ if (groupRectCache.has(gId))
138
+ return groupRectCache.get(gId);
139
+ const pad = 20;
140
+ const memberRects = [
141
+ ...ir.services.filter(s => s.group === gId).map(s => rectOf(s.id)).filter((r) => !!r),
142
+ ...ir.junctions.filter(j => j.group === gId).map(j => rectOf(j.id)).filter((r) => !!r),
143
+ ...ir.groups.filter(g => g.parent === gId).map(g => computeGroupRect(g.id)).filter((r) => !!r),
144
+ ];
145
+ if (memberRects.length === 0)
146
+ return undefined;
147
+ const minX = Math.min(...memberRects.map(r => r.x)) - pad;
148
+ const minY = Math.min(...memberRects.map(r => r.y)) - pad - 14;
149
+ const maxX = Math.max(...memberRects.map(r => r.x + r.width)) + pad;
150
+ const maxY = Math.max(...memberRects.map(r => r.y + r.height)) + pad;
151
+ const rect = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
152
+ groupRectCache.set(gId, rect);
153
+ return rect;
154
+ };
155
+ // Prime the cache for all groups.
156
+ for (const g of ir.groups)
157
+ computeGroupRect(g.id);
158
+ // ── Build element list ────────────────────────────────────────────────────
159
+ const elements = [];
160
+ // Title
161
+ if (ir.metadata.title) {
162
+ elements.push(p.text(String(ir.metadata.title), margin, margin + typography.titleFontSize, typography.titleFontSize, palette.text, { weight: 'bold' }));
163
+ }
164
+ // ── Group boxes (outermost first so children render on top) ──────────────
165
+ const orderedGroups = groupsByDepth(ir.groups);
166
+ orderedGroups.forEach((g, gi) => {
167
+ const r = computeGroupRect(g.id);
168
+ if (!r)
169
+ return;
170
+ const hue = categoricalHue(gi);
171
+ elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) }, hue + '14', hue, 1.4, { rx: 10 }));
172
+ elements.push(p.text(g.label, rhu(r.x + 12), rhu(r.y + 16), typography.smallFontSize, hue, { weight: 'bold' }));
173
+ });
174
+ // ── Flat box list for orthogonalRouter obstacle detection ────────────────
175
+ const allBoxes = [];
176
+ for (const [id, pos] of positions) {
177
+ const sz = nodeSizes.get(id);
178
+ if (sz)
179
+ allBoxes.push({ id, x: pos.x, y: pos.y, width: sz.width, height: sz.height });
180
+ }
181
+ for (const e of ir.edges) {
182
+ // Resolve from-port — use group boundary when fromGroup=true.
183
+ let fromRect = rectOf(e.from);
184
+ if (!fromRect)
185
+ continue;
186
+ if (e.fromGroup) {
187
+ const svc = ir.services.find(s => s.id === e.from);
188
+ if (svc?.group) {
189
+ const gr = computeGroupRect(svc.group);
190
+ if (gr)
191
+ fromRect = gr;
192
+ }
193
+ }
194
+ // Resolve to-port — use group boundary when toGroup=true.
195
+ let toRect = rectOf(e.to);
196
+ if (!toRect)
197
+ continue;
198
+ if (e.toGroup) {
199
+ const svc = ir.services.find(s => s.id === e.to);
200
+ if (svc?.group) {
201
+ const gr = computeGroupRect(svc.group);
202
+ if (gr)
203
+ toRect = gr;
204
+ }
205
+ }
206
+ const pa = port(fromRect, e.fromSide);
207
+ const pb = port(toRect, e.toSide);
208
+ const fromDir = sideToDir(e.fromSide);
209
+ const toDir = sideToDir(e.toSide);
210
+ const obstacles = allBoxes
211
+ .filter(bx => bx.id !== e.from && bx.id !== e.to)
212
+ .map(bx => ({ x: bx.x, y: bx.y + yOff, width: bx.width, height: bx.height }));
213
+ const route = orthogonalRouter.route({
214
+ from: pa, to: pb, style: 'orthogonal',
215
+ obstacles, padding: 10,
216
+ fromDir, toDir,
217
+ });
218
+ // Drive arrowhead markers from arrowLeft / arrowRight.
219
+ const pathOpts = {};
220
+ if (e.arrowRight)
221
+ pathOpts.markerEnd = ARROW_END_ID;
222
+ if (e.arrowLeft)
223
+ pathOpts.markerStart = ARROW_START_ID;
224
+ elements.push(p.path(route.path, palette.primary, 1.6, pathOpts));
225
+ }
226
+ // ── Service nodes ─────────────────────────────────────────────────────────
227
+ const warnedIcons = new Set();
228
+ ir.services.forEach((s, i) => {
229
+ const r = rectOf(s.id);
230
+ if (!r)
231
+ return;
232
+ const hue = categoricalHue(i);
233
+ elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) }, palette.surface, palette.border, 1.4, { rx: 8 }));
234
+ elements.push(p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: 8 }, hue, hue, 0, { rx: 4 }));
235
+ // Icon: try iconify resolution first, fall back to built-in glyph.
236
+ const iconElems = resolveIconElems(p, s.icon, r.x + r.width / 2, r.y + 24, hue, palette, iconPacks, warnedIcons);
237
+ elements.push(...iconElems);
238
+ elements.push(p.text(s.label, rhuInt(r.x + r.width / 2), rhu(r.y + r.height - 9), font, palette.text, { weight: 'bold', anchor: 'middle' }));
239
+ });
240
+ // ── Junction nodes (4-way crosshair dot) ─────────────────────────────────
241
+ ir.junctions.forEach(j => {
242
+ const r = rectOf(j.id);
243
+ if (!r)
244
+ return;
245
+ const cx = rhu(r.x + r.width / 2);
246
+ const cy = rhu(r.y + r.height / 2);
247
+ const R = 4; // outer crosshair half-length
248
+ // Central filled circle
249
+ elements.push(p.circle({ x: cx, y: cy }, R, palette.primary, palette.primary, 0));
250
+ // Four short lines extending to the sides (visual affordance for 4-way)
251
+ elements.push(p.path(`M ${rhu(cx - R)} ${cy} L ${rhu(cx + R)} ${cy} M ${cx} ${rhu(cy - R)} L ${cx} ${rhu(cy + R)}`, palette.primary, 1.6));
252
+ });
253
+ // ── Compute canvas bounds ─────────────────────────────────────────────────
254
+ const allNodeRects = [
255
+ ...ir.services.map(s => rectOf(s.id)).filter((r) => !!r),
256
+ ...ir.junctions.map(j => rectOf(j.id)).filter((r) => !!r),
257
+ ];
258
+ // Also include group rects so nested group labels aren't clipped.
259
+ const allGroupRects = [...groupRectCache.values()];
260
+ const allRects = [...allNodeRects, ...allGroupRects];
261
+ if (allRects.length === 0) {
262
+ // Empty diagram — minimal canvas.
263
+ const scene = applyOverlays({ viewBox: { x: 0, y: 0, width: 200, height: 100 }, background: palette.background, elements, defs: [] }, ir.overlays, theme);
264
+ return { scene, anchors: {} };
265
+ }
266
+ const totalW = rhuInt(Math.max(...allRects.map(r => r.x + r.width)) + margin + 26);
267
+ const totalH = rhuInt(Math.max(...allRects.map(r => r.y + r.height)) + margin + 26);
268
+ // Expand viewBox upward/leftward to accommodate group boxes that extend above/left of origin.
269
+ const vbX = rhuInt(Math.min(0, ...allRects.map(r => r.x)) - margin);
270
+ const vbY = rhuInt(Math.min(0, ...allRects.map(r => r.y)) - margin);
271
+ const defs = [
272
+ `<marker id="${ARROW_END_ID}" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">` +
273
+ `<polygon points="0 0, 10 4, 0 8" fill="${palette.primary}" /></marker>`,
274
+ `<marker id="${ARROW_START_ID}" markerWidth="10" markerHeight="8" refX="1" refY="4" orient="auto-start-reverse">` +
275
+ `<polygon points="0 0, 10 4, 0 8" fill="${palette.primary}" /></marker>`,
276
+ ];
277
+ const scene = applyOverlays({
278
+ viewBox: { x: vbX, y: vbY, width: totalW - vbX, height: totalH - vbY },
279
+ background: palette.background,
280
+ elements,
281
+ defs,
282
+ }, ir.overlays, theme);
283
+ return { scene, anchors: {} };
284
+ }
285
+ // ─── Icon resolution (Feature 6) ──────────────────────────────────────────────
286
+ /**
287
+ * Attempt to resolve an icon token as a prefixed iconify reference (prefix:name).
288
+ * Falls back to the built-in line-art glyph when:
289
+ * - the token has no colon (it's a simple glyph hint like "server"),
290
+ * - no icon pack map was provided,
291
+ * - parseIconRef or resolveIcon fails.
292
+ * Emits console.warn once per unresolvable prefixed token.
293
+ */
294
+ function resolveIconElems(p, icon, cx, cy, hue, palette, iconPacks, warnedIcons) {
295
+ // Only attempt iconify resolution when there is a colon separator.
296
+ if (icon.includes(':') && iconPacks) {
297
+ const ref = parseIconRef(icon);
298
+ if (ref.ok) {
299
+ const resolved = resolveIcon(ref.value, iconPacks);
300
+ if (resolved.ok) {
301
+ // Center the icon in a 24×24 box at (cx, cy).
302
+ const size = 24;
303
+ return [p.icon(resolved.value, rhu(cx - size / 2), rhu(cy - size / 2), size, { color: hue })];
304
+ }
305
+ }
306
+ // Resolution failed — warn once.
307
+ if (!warnedIcons.has(icon)) {
308
+ warnedIcons.add(icon);
309
+ console.warn(`[architecture] icon "${icon}" could not be resolved — falling back to glyph.`);
310
+ }
311
+ }
312
+ else if (icon.includes(':') && !iconPacks) {
313
+ // Prefixed token but no packs loaded — warn once.
314
+ if (!warnedIcons.has(icon)) {
315
+ warnedIcons.add(icon);
316
+ console.warn(`[architecture] icon "${icon}" is an iconify token but no icon packs were loaded.`);
317
+ }
318
+ }
319
+ // Built-in line-art glyph fallback.
320
+ return iconGlyph(p, icon, cx, cy, hue, palette);
321
+ }
322
+ // ─── Built-in line-art glyphs ─────────────────────────────────────────────────
323
+ /** A small line glyph for a service icon name (server/database/cloud/internet/disk). */
324
+ function iconGlyph(p, icon, cx, cy, hue, palette) {
325
+ const name = icon.toLowerCase();
326
+ const out = [];
327
+ const stroke = hue;
328
+ if (name.includes('server') || name.includes('compute')) {
329
+ for (let i = 0; i < 3; i++)
330
+ out.push(p.rect({ x: rhu(cx - 10), y: rhu(cy - 9 + i * 7), width: 20, height: 5 }, palette.surface, stroke, 1.3, { rx: 1 }));
331
+ }
332
+ else if (name.includes('database') || name.includes('db') || name.includes('datastore') || name.includes('storage') || name.includes('disk')) {
333
+ out.push(p.rect({ x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 }, palette.surface, stroke, 1.3, { rx: 5 }));
334
+ out.push(p.path(`M ${rhu(cx - 9)} ${rhu(cy - 3)} Q ${rhu(cx)} ${rhu(cy + 1)}, ${rhu(cx + 9)} ${rhu(cy - 3)}`, stroke, 1.3));
335
+ }
336
+ else if (name.includes('cloud')) {
337
+ out.push(p.circle({ x: rhu(cx - 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));
338
+ out.push(p.circle({ x: rhu(cx + 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));
339
+ out.push(p.circle({ x: rhu(cx), y: rhu(cy - 3) }, 7, palette.surface, stroke, 1.3));
340
+ out.push(p.rect({ x: rhu(cx - 10), y: rhu(cy + 2), width: 20, height: 6 }, palette.surface, palette.surface, 0));
341
+ }
342
+ else if (name.includes('internet') || name.includes('globe') || name.includes('web') || name.includes('client')) {
343
+ out.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 9, palette.surface, stroke, 1.3));
344
+ out.push(p.path(`M ${rhu(cx)} ${rhu(cy - 9)} L ${rhu(cx)} ${rhu(cy + 9)} M ${rhu(cx - 9)} ${rhu(cy)} L ${rhu(cx + 9)} ${rhu(cy)}`, stroke, 1));
345
+ out.push(p.path(`M ${rhu(cx - 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy - 11)}, ${rhu(cx + 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy + 11)}, ${rhu(cx - 9)} ${rhu(cy)}`, stroke, 1));
346
+ }
347
+ else {
348
+ out.push(p.rect({ x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 }, palette.surface, stroke, 1.3, { rx: 4 }));
349
+ }
350
+ return out;
351
+ }
352
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../../../src/diagrams/mermaid/architecture/layout.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,17 @@
1
1
  /**
2
2
  * @file diagrams/ds/hashmap/hashmap.ts — Hash map with separate chaining.
3
3
  *
4
- * A vertical strip of buckets indexed 0..n-1. Each non-empty bucket points
5
- * right to a chain of key→value entries (a singly linked list), reusing the
6
- * slot/pointer kernel idiom from the linked-list struct. Empty buckets show
7
- * just their index.
4
+ * A vertical strip of buckets. Each non-empty bucket points right to a chain
5
+ * of key→value entries (a singly linked list), reusing the slot/pointer
6
+ * kernel idiom from the linked-list struct. Buckets can be numbered or labeled
7
+ * with arbitrary strings, and empty buckets show their configured label.
8
8
  *
9
9
  * Value-driven mini-syntax:
10
10
  * hashmap
11
11
  * title users
12
- * buckets 5
13
- * bucket 0: alice->1, bob->2 // two chained entries
14
- * bucket 2: carol->3
15
- * bucket 4: dave->4
12
+ * buckets name, email, phone
13
+ * bucket name: alice->1, bob->2 // two chained entries
14
+ * bucket phone: carol->3
16
15
  *
17
16
  * Entry separators: `,` between entries; `->`, `=>`, `:` or `=` between
18
17
  * key and value.
@@ -23,12 +22,13 @@ export interface HashEntry {
23
22
  value: string;
24
23
  }
25
24
  export interface HashChain {
26
- index: number;
25
+ index: number | string;
27
26
  entries: HashEntry[];
28
27
  }
29
28
  export interface HashmapDoc {
30
29
  title?: string;
31
30
  buckets: number;
31
+ bucketLabels: string[];
32
32
  chains: HashChain[];
33
33
  }
34
34
  export declare function layoutHashmap(doc: HashmapDoc, theme: ResolvedTheme): LayoutResult;
@@ -1 +1 @@
1
- {"version":3,"file":"hashmap.d.ts","sourceRoot":"","sources":["../../../../../../../src/diagrams/triton/ds/hashmap/hashmap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,aAAa,EAAE,aAAa,EAAE,YAAY,EAC3C,MAAM,gCAAgC,CAAC;AAMxC,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAC1D,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAC;CAAE;AAEnE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AA+BD,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,YAAY,CAgEjF;AAED,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAUtG,CAAC"}
1
+ {"version":3,"file":"hashmap.d.ts","sourceRoot":"","sources":["../../../../../../../src/diagrams/triton/ds/hashmap/hashmap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EACV,aAAa,EAAE,aAAa,EAAE,YAAY,EAC3C,MAAM,gCAAgC,CAAC;AAMxC,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAC1D,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,EAAE,CAAC;CAAE;AAE5E,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAqID,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,YAAY,CAkEjF;AAED,eAAO,MAAM,OAAO,EAAE,aAAa,CAAC,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAUtG,CAAC"}