@pihanga2/shadcn 0.2.22 → 0.2.25
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.
- package/README.md +22 -1
- package/cards/chart/chart.types.d.ts +21 -3
- package/cards/jsonViewer/jsonViewer.component.js +1 -2
- package/cards/jsonViewer/jsonViewer.component.js.map +1 -1
- package/cards/slider/slider.component.js +47 -37
- package/cards/slider/slider.component.js.map +1 -1
- package/cards/slider/slider.types.d.ts +15 -7
- package/cards/slider/slider.types.js.map +1 -1
- package/cards/swimlane/index.d.ts +2 -0
- package/cards/swimlane/index.js +14 -0
- package/cards/swimlane/index.js.map +1 -0
- package/cards/swimlane/swimlane.component.d.ts +4 -0
- package/cards/swimlane/swimlane.component.js +570 -0
- package/cards/swimlane/swimlane.component.js.map +1 -0
- package/cards/swimlane/swimlane.css +1 -0
- package/cards/swimlane/swimlane.demo.d.ts +12 -0
- package/cards/swimlane/swimlane.model.d.ts +61 -0
- package/cards/swimlane/swimlane.model.js +235 -0
- package/cards/swimlane/swimlane.model.js.map +1 -0
- package/cards/swimlane/swimlane.model.test.d.ts +1 -0
- package/cards/swimlane/swimlane.types.d.ts +389 -0
- package/cards/swimlane/swimlane.types.js +7 -0
- package/cards/swimlane/swimlane.types.js.map +1 -0
- package/cards.schema.json +7053 -0
- package/components/ui/drawer.js +24 -24
- package/package.json +8 -2
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SwimlaneEvent, SwimlaneModel } from './swimlane.types';
|
|
2
|
+
/**
|
|
3
|
+
* A checkout flow through a small microservice deployment, stopped while
|
|
4
|
+
* several replies and one announced callback are still outstanding.
|
|
5
|
+
*/
|
|
6
|
+
export declare function demoEvents(t0: number, opts?: {
|
|
7
|
+
complete?: boolean;
|
|
8
|
+
}): SwimlaneEvent[];
|
|
9
|
+
export declare function buildDemoModel(opts?: {
|
|
10
|
+
complete?: boolean;
|
|
11
|
+
t0?: number;
|
|
12
|
+
}): SwimlaneModel;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PiRegister, ReduxState } from '@pihanga2/core';
|
|
2
|
+
import { default as React } from 'react';
|
|
3
|
+
import { SwimlaneEvent, SwimlaneGhostRow, SwimlaneLanesSnapshot, SwimlaneModel, SwimlanePending, SwimlaneRow, SwimlaneRunState, SwimlaneTarget } from './swimlane.types';
|
|
4
|
+
export type SwimlaneSeedLane = {
|
|
5
|
+
lane: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
/** Initial run state. Default `"created"`, same as an ordinary `lane` event. */
|
|
8
|
+
state?: SwimlaneRunState;
|
|
9
|
+
meta?: unknown;
|
|
10
|
+
/** See `SwimlaneLaneEvent.activityClassName`. */
|
|
11
|
+
activityClassName?: string;
|
|
12
|
+
/** See `SwimlaneLaneEvent.activityStyle`. */
|
|
13
|
+
activityStyle?: React.CSSProperties;
|
|
14
|
+
};
|
|
15
|
+
export declare function createSwimlaneModel(opts?: {
|
|
16
|
+
maxRows?: number;
|
|
17
|
+
lanes?: SwimlaneSeedLane[];
|
|
18
|
+
}): SwimlaneModel;
|
|
19
|
+
/**
|
|
20
|
+
* Apply a batch of stream events to the model (mutating it).
|
|
21
|
+
* Safe to call on an Immer draft or on a plain object.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ingestSwimlaneEvents(m: SwimlaneModel, events: SwimlaneEvent[], now?: number): void;
|
|
24
|
+
/** Remove all rows but keep lanes, open activities and outstanding messages. */
|
|
25
|
+
export declare function clearSwimlaneRows(m: SwimlaneModel): void;
|
|
26
|
+
/**
|
|
27
|
+
* Project outstanding messages below the "now" line (pure).
|
|
28
|
+
* Expected replies are replayed onto the current snapshot so that open
|
|
29
|
+
* activities visibly run down to the ghost reply that will close them.
|
|
30
|
+
* Newest first ≈ innermost call replies first.
|
|
31
|
+
*/
|
|
32
|
+
export declare function projectPending(current: SwimlaneLanesSnapshot, pending: SwimlanePending[]): SwimlaneGhostRow[];
|
|
33
|
+
/**
|
|
34
|
+
* Direct children of call `id`: calls made while it was being handled.
|
|
35
|
+
* Their call/reply transitions (and outstanding replies) are the transitions
|
|
36
|
+
* the process "creates and receives".
|
|
37
|
+
*/
|
|
38
|
+
export declare function relatedCallIds(m: Pick<SwimlaneModel, "spans">, id: string): string[];
|
|
39
|
+
/** Does a row (or ghost row) involve the call chain `id`? */
|
|
40
|
+
export declare function rowTouches(r: {
|
|
41
|
+
pre: SwimlaneLanesSnapshot;
|
|
42
|
+
post: SwimlaneLanesSnapshot;
|
|
43
|
+
}, eventId: string | undefined, id: string): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Identifies the "step" a row belongs to: rows that share an explicit
|
|
46
|
+
* `step` value, or the row itself when it has none (a step of one event).
|
|
47
|
+
*/
|
|
48
|
+
export declare function stepKeyOf(r: Pick<SwimlaneRow, "id" | "event">): string;
|
|
49
|
+
/** Every row belonging to the same step as `t` (see `stepKeyOf`), in `model.rows` order. */
|
|
50
|
+
export declare function stepRows(m: SwimlaneModel, stepId: string): SwimlaneRow[];
|
|
51
|
+
export declare function formatTs(t: number): string;
|
|
52
|
+
/** Human-readable description of a hover target (used by the tooltip). */
|
|
53
|
+
export declare function describeSwimlaneTarget(m: SwimlaneModel, t: SwimlaneTarget, now?: number, fmtTs?: (ts: number) => string): string;
|
|
54
|
+
/**
|
|
55
|
+
* Wire the data actions for one model:
|
|
56
|
+
*
|
|
57
|
+
* register((r) => registerSwimlaneModel<AppState>(r, "main", (s) => s.swimlane));
|
|
58
|
+
* // …later, from a stream adapter:
|
|
59
|
+
* dispatchSwimlaneEvents(dispatch, {modelId: "main", events});
|
|
60
|
+
*/
|
|
61
|
+
export declare function registerSwimlaneModel<S extends ReduxState>(r: PiRegister, modelId: string, select: (state: S) => SwimlaneModel): void;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { onSwimlaneEventsReceived as e, onSwimlaneRowsCleared as t } from "./swimlane.types.js";
|
|
2
|
+
//#region src/cards/swimlane/swimlane.model.ts
|
|
3
|
+
function n(e = {}) {
|
|
4
|
+
let t = [], n = {}, r = {}, i = {}, a = {}, o = {};
|
|
5
|
+
for (let s of e.lanes ?? []) o[s.lane] || (t.push(s.lane), o[s.lane] = {
|
|
6
|
+
state: s.state ?? "created",
|
|
7
|
+
acts: []
|
|
8
|
+
}, s.label && (n[s.lane] = s.label), "meta" in s && (r[s.lane] = s.meta), s.activityClassName && (i[s.lane] = s.activityClassName), s.activityStyle && (a[s.lane] = s.activityStyle));
|
|
9
|
+
return {
|
|
10
|
+
laneOrder: t,
|
|
11
|
+
laneLabels: n,
|
|
12
|
+
laneMeta: r,
|
|
13
|
+
laneActivityClassName: i,
|
|
14
|
+
laneActivityStyle: a,
|
|
15
|
+
current: o,
|
|
16
|
+
rows: [],
|
|
17
|
+
pending: [],
|
|
18
|
+
spans: {},
|
|
19
|
+
seq: 0,
|
|
20
|
+
maxRows: e.maxRows ?? 2e3
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function r(e) {
|
|
24
|
+
let t = {};
|
|
25
|
+
for (let n of Object.keys(e)) t[n] = {
|
|
26
|
+
state: e[n].state,
|
|
27
|
+
acts: [...e[n].acts]
|
|
28
|
+
};
|
|
29
|
+
return t;
|
|
30
|
+
}
|
|
31
|
+
function i(e, t) {
|
|
32
|
+
return t.rowId != null && !e.rows.some((e) => e.id === t.rowId) ? t.rowId : ++e.seq;
|
|
33
|
+
}
|
|
34
|
+
function a(e, t) {
|
|
35
|
+
switch (t.type) {
|
|
36
|
+
case "state": return [t.lane];
|
|
37
|
+
case "call": return t.from === t.to ? [t.from] : [t.from, t.to];
|
|
38
|
+
case "expect": return t.from === t.to ? [t.from] : [t.from, t.to];
|
|
39
|
+
case "reply":
|
|
40
|
+
case "done": {
|
|
41
|
+
let n = e.spans[t.id];
|
|
42
|
+
return n ? [n.to, n.from] : [];
|
|
43
|
+
}
|
|
44
|
+
default: return [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function o(e, t, n = Date.now()) {
|
|
48
|
+
for (let r of t) {
|
|
49
|
+
let t = r.ts ?? n;
|
|
50
|
+
for (let n of a(e, r)) e.current[n] || s(e, {
|
|
51
|
+
type: "lane",
|
|
52
|
+
lane: n
|
|
53
|
+
}, t);
|
|
54
|
+
s(e, r, t);
|
|
55
|
+
}
|
|
56
|
+
c(e);
|
|
57
|
+
}
|
|
58
|
+
function s(e, t, n) {
|
|
59
|
+
let a = e.current;
|
|
60
|
+
if (t.type === "expect") {
|
|
61
|
+
e.pending.push({
|
|
62
|
+
id: t.id,
|
|
63
|
+
type: "expect",
|
|
64
|
+
from: t.from,
|
|
65
|
+
to: t.to,
|
|
66
|
+
label: t.label,
|
|
67
|
+
since: n,
|
|
68
|
+
timeoutMs: t.timeoutMs,
|
|
69
|
+
meta: t.meta
|
|
70
|
+
});
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
let o = r(a), s;
|
|
74
|
+
switch (t.type) {
|
|
75
|
+
case "lane": {
|
|
76
|
+
t.label && (e.laneLabels[t.lane] = t.label), "meta" in t && (e.laneMeta[t.lane] = t.meta), t.activityClassName && (e.laneActivityClassName[t.lane] = t.activityClassName), t.activityStyle && (e.laneActivityStyle[t.lane] = t.activityStyle);
|
|
77
|
+
let n = !a[t.lane];
|
|
78
|
+
if (n && (a[t.lane] = {
|
|
79
|
+
state: "created",
|
|
80
|
+
acts: []
|
|
81
|
+
}, e.laneOrder.push(t.lane)), !n || t.announce === !1) return;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case "state":
|
|
85
|
+
a[t.lane].state = t.state;
|
|
86
|
+
break;
|
|
87
|
+
case "call": {
|
|
88
|
+
let r = a[t.from]?.acts ?? [], i = t.parentId ?? r[r.length - 1];
|
|
89
|
+
e.spans[t.id] = {
|
|
90
|
+
id: t.id,
|
|
91
|
+
kind: t.kind,
|
|
92
|
+
from: t.from,
|
|
93
|
+
to: t.to,
|
|
94
|
+
label: t.label,
|
|
95
|
+
start: n,
|
|
96
|
+
end: t.kind === "event" ? n : void 0,
|
|
97
|
+
status: t.kind === "event" ? "done" : "open",
|
|
98
|
+
meta: t.meta
|
|
99
|
+
}, i && i !== t.id && (e.spans[t.id].parent = i), t.kind !== "event" && a[t.to].acts.push(t.id);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "reply":
|
|
103
|
+
case "done": {
|
|
104
|
+
let r = e.spans[t.id];
|
|
105
|
+
if (!r) return;
|
|
106
|
+
r.end = n, r.status = t.type === "done" ? "done" : t.ok ? "ok" : "error", t.type === "reply" && (r.result = t.label);
|
|
107
|
+
let i = a[r.to];
|
|
108
|
+
if (i) {
|
|
109
|
+
let e = i.acts.indexOf(t.id);
|
|
110
|
+
e >= 0 && i.acts.splice(e, 1);
|
|
111
|
+
}
|
|
112
|
+
s = {
|
|
113
|
+
from: r.from,
|
|
114
|
+
to: r.to,
|
|
115
|
+
label: r.label
|
|
116
|
+
};
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
let c, l = t.type === "reply" ? t.id : t.fulfils;
|
|
121
|
+
if (l) {
|
|
122
|
+
let t = e.pending.findIndex((e) => e.id === l);
|
|
123
|
+
t >= 0 && (e.pending.splice(t, 1), c = l);
|
|
124
|
+
}
|
|
125
|
+
t.type === "call" && t.kind === "sync" && e.pending.push({
|
|
126
|
+
id: t.id,
|
|
127
|
+
type: "reply",
|
|
128
|
+
from: t.to,
|
|
129
|
+
to: t.from,
|
|
130
|
+
label: `reply: ${t.label}`,
|
|
131
|
+
since: n,
|
|
132
|
+
timeoutMs: t.timeoutMs,
|
|
133
|
+
meta: t.meta
|
|
134
|
+
});
|
|
135
|
+
let u = {
|
|
136
|
+
id: i(e, t),
|
|
137
|
+
event: {
|
|
138
|
+
...t,
|
|
139
|
+
ts: n
|
|
140
|
+
},
|
|
141
|
+
pre: o,
|
|
142
|
+
post: r(a)
|
|
143
|
+
};
|
|
144
|
+
c && (u.fulfilled = c), s && (u.route = s), e.rows.push(u);
|
|
145
|
+
}
|
|
146
|
+
function c(e) {
|
|
147
|
+
let t = Math.max(50, Math.floor(e.maxRows / 10));
|
|
148
|
+
if (e.rows.length <= e.maxRows + t) return;
|
|
149
|
+
e.rows.splice(0, e.rows.length - e.maxRows);
|
|
150
|
+
let n = /* @__PURE__ */ new Set();
|
|
151
|
+
for (let t of e.rows) "id" in t.event && n.add(t.event.id);
|
|
152
|
+
for (let t of Object.values(e.current)) t.acts.forEach((e) => n.add(e));
|
|
153
|
+
e.pending.forEach((e) => n.add(e.id));
|
|
154
|
+
for (let t of Object.keys(e.spans)) n.has(t) || delete e.spans[t];
|
|
155
|
+
}
|
|
156
|
+
function l(e) {
|
|
157
|
+
e.rows.splice(0, e.rows.length);
|
|
158
|
+
}
|
|
159
|
+
function u(e, t) {
|
|
160
|
+
let n = e, r = [];
|
|
161
|
+
for (let e = t.length - 1; e >= 0; e--) {
|
|
162
|
+
let i = t[e], a = n, o = n[i.from];
|
|
163
|
+
i.type === "reply" && o?.acts.includes(i.id) && (n = {
|
|
164
|
+
...n,
|
|
165
|
+
[i.from]: {
|
|
166
|
+
...o,
|
|
167
|
+
acts: o.acts.filter((e) => e !== i.id)
|
|
168
|
+
}
|
|
169
|
+
}), r.push({
|
|
170
|
+
id: `g-${i.id}`,
|
|
171
|
+
pending: i,
|
|
172
|
+
pre: a,
|
|
173
|
+
post: n
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return r;
|
|
177
|
+
}
|
|
178
|
+
function d(e, t) {
|
|
179
|
+
let n = [];
|
|
180
|
+
for (let r of Object.values(e.spans)) r.parent === t && n.push(r.id);
|
|
181
|
+
return n.sort((t, n) => e.spans[t].start - e.spans[n].start);
|
|
182
|
+
}
|
|
183
|
+
function f(e, t, n) {
|
|
184
|
+
if (t === n) return !0;
|
|
185
|
+
for (let t of Object.values(e.pre)) if (t.acts.includes(n)) return !0;
|
|
186
|
+
for (let t of Object.values(e.post)) if (t.acts.includes(n)) return !0;
|
|
187
|
+
return !1;
|
|
188
|
+
}
|
|
189
|
+
function p(e) {
|
|
190
|
+
return e.event.step == null ? `row:${e.id}` : `step:${e.event.step}`;
|
|
191
|
+
}
|
|
192
|
+
function m(e, t) {
|
|
193
|
+
return e.rows.filter((e) => p(e) === t);
|
|
194
|
+
}
|
|
195
|
+
function h(e) {
|
|
196
|
+
let t = new Date(e), n = (e, t = 2) => String(e).padStart(t, "0");
|
|
197
|
+
return `${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}.${n(t.getMilliseconds(), 3)}`;
|
|
198
|
+
}
|
|
199
|
+
function g(e, t, n = Date.now(), r = h) {
|
|
200
|
+
if (t.kind === "state") {
|
|
201
|
+
let n = e.rows.find((e) => String(e.id) === String(t.rowId));
|
|
202
|
+
return !n || n.event.type !== "state" ? t.id : `${t.lane} → ${n.event.state} at ${r(n.event.ts)}`;
|
|
203
|
+
}
|
|
204
|
+
if (t.kind === "step") {
|
|
205
|
+
let n = m(e, t.id);
|
|
206
|
+
if (n.length === 0) return t.id;
|
|
207
|
+
let i = n.map((e) => e.event.type).join(", ");
|
|
208
|
+
return `step at ${r(n[0].event.ts)} · ${n.length} event${n.length === 1 ? "" : "s"} (${i})`;
|
|
209
|
+
}
|
|
210
|
+
if (t.kind === "lane") {
|
|
211
|
+
let n = e.current[t.id];
|
|
212
|
+
return `${e.laneLabels[t.id] ?? t.id}${n ? ` · ${n.state}` : ""}`;
|
|
213
|
+
}
|
|
214
|
+
if (t.kind === "pending") {
|
|
215
|
+
let r = e.pending.find((e) => e.id === t.id);
|
|
216
|
+
if (!r) return "already fulfilled";
|
|
217
|
+
let i = n - r.since, a = r.type === "reply" ? "reply" : "message", o = r.timeoutMs ? ` / timeout ${r.timeoutMs} ms${i > r.timeoutMs ? " · OVERDUE" : ""}` : "";
|
|
218
|
+
return `expected ${a} ${r.from} → ${r.to}: "${r.label}" · waiting ${i} ms${o}`;
|
|
219
|
+
}
|
|
220
|
+
let i = e.spans[t.id];
|
|
221
|
+
if (!i) return t.id;
|
|
222
|
+
let a = i.end == null ? `running ${n - i.start} ms` : `${i.end - i.start} ms`, o = i.result ? ` (${i.result})` : "";
|
|
223
|
+
return t.kind === "activity" ? `${i.to} handling "${i.label}" from ${i.from} · started ${r(i.start)} · ${a}${o}` : `${i.kind.toUpperCase()} ${i.from} → ${i.to}: "${i.label}" · ${i.status}${o} · ${a}`;
|
|
224
|
+
}
|
|
225
|
+
function _(n, r, i) {
|
|
226
|
+
e(n, (e, t) => {
|
|
227
|
+
t.modelId === r && o(i(e), t.events);
|
|
228
|
+
}), t(n, (e, t) => {
|
|
229
|
+
t.modelId === r && l(i(e));
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//#endregion
|
|
233
|
+
export { l as clearSwimlaneRows, n as createSwimlaneModel, g as describeSwimlaneTarget, h as formatTs, o as ingestSwimlaneEvents, u as projectPending, _ as registerSwimlaneModel, d as relatedCallIds, f as rowTouches, p as stepKeyOf, m as stepRows };
|
|
234
|
+
|
|
235
|
+
//# sourceMappingURL=swimlane.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swimlane.model.js","names":[],"sources":["../../../src/cards/swimlane/swimlane.model.ts"],"sourcesContent":["/**\n * Swimlane model helpers — pure TypeScript, no React.\n *\n * The model is plain JSON that lives in the app's Redux state.\n * `ingestSwimlaneEvents` MUTATES the model it is given, which is exactly what\n * a Pihanga (Immer) reducer wants:\n *\n * onSwimlaneEventsReceived<AppState>(r, (state, {events}) => {\n * ingestSwimlaneEvents(state.swimlane, events);\n * });\n *\n * or simply `registerSwimlaneModel(r, \"main\", (s) => s.swimlane)`.\n *\n * Every row stores its own plain copies of the lane snapshots, so no object is\n * ever referenced from two places in the state tree (Immer-safe, serialisable).\n */\nimport type {PiRegister, ReduxState} from \"@pihanga2/core\";\nimport type React from \"react\";\n\nimport {\n DEF_MAX_ROWS,\n onSwimlaneEventsReceived,\n onSwimlaneRowsCleared,\n type SwimlaneEvent,\n type SwimlaneGhostRow,\n type SwimlaneLanesSnapshot,\n type SwimlaneModel,\n type SwimlanePending,\n type SwimlaneRow,\n type SwimlaneRowEvent,\n type SwimlaneRowId,\n type SwimlaneRunState,\n type SwimlaneTarget,\n} from \"./swimlane.types\";\n\nexport type SwimlaneSeedLane = {\n lane: string;\n label?: string;\n /** Initial run state. Default `\"created\"`, same as an ordinary `lane` event. */\n state?: SwimlaneRunState;\n meta?: unknown;\n /** See `SwimlaneLaneEvent.activityClassName`. */\n activityClassName?: string;\n /** See `SwimlaneLaneEvent.activityStyle`. */\n activityStyle?: React.CSSProperties;\n};\n\nexport function createSwimlaneModel(\n opts: {maxRows?: number; lanes?: SwimlaneSeedLane[]} = {},\n): SwimlaneModel {\n const laneOrder: string[] = [];\n const laneLabels: Record<string, string> = {};\n const laneMeta: Record<string, unknown> = {};\n const laneActivityClassName: Record<string, string> = {};\n const laneActivityStyle: Record<string, React.CSSProperties> = {};\n const current: SwimlaneLanesSnapshot = {};\n for (const l of opts.lanes ?? []) {\n if (current[l.lane]) continue; // ignore duplicates, first wins\n laneOrder.push(l.lane);\n current[l.lane] = {state: l.state ?? \"created\", acts: []};\n if (l.label) laneLabels[l.lane] = l.label;\n if (\"meta\" in l) laneMeta[l.lane] = l.meta;\n if (l.activityClassName) laneActivityClassName[l.lane] = l.activityClassName;\n if (l.activityStyle) laneActivityStyle[l.lane] = l.activityStyle;\n }\n return {\n laneOrder,\n laneLabels,\n laneMeta,\n laneActivityClassName,\n laneActivityStyle,\n current,\n rows: [],\n pending: [],\n spans: {},\n seq: 0,\n maxRows: opts.maxRows ?? DEF_MAX_ROWS,\n };\n}\n\nfunction copySnapshot(s: SwimlaneLanesSnapshot): SwimlaneLanesSnapshot {\n const out: SwimlaneLanesSnapshot = {};\n for (const k of Object.keys(s)) {\n out[k] = {state: s[k].state, acts: [...s[k].acts]};\n }\n return out;\n}\n\n/**\n * The id to assign a new row for `ev`: its own `rowId` when set and not\n * already in use by an existing row, the model's internal counter\n * otherwise. See `SwimlaneEventBase.rowId`.\n */\nfunction rowId(m: SwimlaneModel, ev: SwimlaneEvent): SwimlaneRowId {\n if (ev.rowId != null && !m.rows.some((r) => r.id === ev.rowId)) return ev.rowId;\n return ++m.seq;\n}\n\n/** Lanes an event refers to (used to add lanes implicitly). */\nfunction referencedLanes(m: SwimlaneModel, ev: SwimlaneEvent): string[] {\n switch (ev.type) {\n case \"state\":\n return [ev.lane];\n case \"call\":\n return ev.from === ev.to ? [ev.from] : [ev.from, ev.to];\n case \"expect\":\n return ev.from === ev.to ? [ev.from] : [ev.from, ev.to];\n case \"reply\":\n case \"done\": {\n const s = m.spans[ev.id];\n return s ? [s.to, s.from] : [];\n }\n default:\n return [];\n }\n}\n\n/**\n * Apply a batch of stream events to the model (mutating it).\n * Safe to call on an Immer draft or on a plain object.\n */\nexport function ingestSwimlaneEvents(\n m: SwimlaneModel,\n events: SwimlaneEvent[],\n now: number = Date.now(),\n): void {\n for (const raw of events) {\n const ts = raw.ts ?? now;\n // lanes referenced before they were announced get an implicit lane row\n for (const lane of referencedLanes(m, raw)) {\n if (!m.current[lane]) applyOne(m, {type: \"lane\", lane}, ts);\n }\n applyOne(m, raw, ts);\n }\n trim(m);\n}\n\nfunction applyOne(m: SwimlaneModel, ev: SwimlaneEvent, ts: number): void {\n const cur = m.current;\n\n if (ev.type === \"expect\") {\n m.pending.push({\n id: ev.id,\n type: \"expect\",\n from: ev.from,\n to: ev.to,\n label: ev.label,\n since: ts,\n timeoutMs: ev.timeoutMs,\n meta: ev.meta,\n });\n return;\n }\n\n const pre = copySnapshot(cur);\n let route: SwimlaneRow[\"route\"];\n\n switch (ev.type) {\n case \"lane\": {\n if (ev.label) m.laneLabels[ev.lane] = ev.label;\n if (\"meta\" in ev) m.laneMeta[ev.lane] = ev.meta;\n if (ev.activityClassName) m.laneActivityClassName[ev.lane] = ev.activityClassName;\n if (ev.activityStyle) m.laneActivityStyle[ev.lane] = ev.activityStyle;\n const isNew = !cur[ev.lane];\n if (isNew) {\n cur[ev.lane] = {state: \"created\", acts: []};\n m.laneOrder.push(ev.lane);\n }\n // no row for: an already-known lane (label/meta/style-only update), or\n // a brand-new lane whose announcement opted out via `announce: false`\n if (!isNew || ev.announce === false) return;\n break;\n }\n case \"state\":\n cur[ev.lane].state = ev.state;\n break;\n case \"call\": {\n // causality: explicit parentId, else the innermost open activity of the caller\n const callerActs = cur[ev.from]?.acts ?? [];\n const parent = ev.parentId ?? callerActs[callerActs.length - 1];\n m.spans[ev.id] = {\n id: ev.id,\n kind: ev.kind,\n from: ev.from,\n to: ev.to,\n label: ev.label,\n start: ts,\n end: ev.kind === \"event\" ? ts : undefined,\n status: ev.kind === \"event\" ? \"done\" : \"open\",\n meta: ev.meta,\n };\n if (parent && parent !== ev.id) m.spans[ev.id].parent = parent;\n if (ev.kind !== \"event\") cur[ev.to].acts.push(ev.id);\n break;\n }\n case \"reply\":\n case \"done\": {\n const s = m.spans[ev.id];\n if (!s) return; // unknown call → nothing sensible to draw\n s.end = ts;\n s.status = ev.type === \"done\" ? \"done\" : ev.ok ? \"ok\" : \"error\";\n if (ev.type === \"reply\") s.result = ev.label;\n const lane = cur[s.to];\n if (lane) {\n const i = lane.acts.indexOf(ev.id);\n if (i >= 0) lane.acts.splice(i, 1);\n }\n route = {from: s.from, to: s.to, label: s.label};\n break;\n }\n }\n\n // does this real event replace an outstanding one?\n let fulfilled: string | undefined;\n const pid = ev.type === \"reply\" ? ev.id : ev.fulfils;\n if (pid) {\n const i = m.pending.findIndex((p) => p.id === pid);\n if (i >= 0) {\n m.pending.splice(i, 1);\n fulfilled = pid;\n }\n }\n // a sync call means we KNOW a reply will come back\n if (ev.type === \"call\" && ev.kind === \"sync\") {\n m.pending.push({\n id: ev.id,\n type: \"reply\",\n from: ev.to,\n to: ev.from,\n label: `reply: ${ev.label}`,\n since: ts,\n timeoutMs: ev.timeoutMs,\n meta: ev.meta,\n });\n }\n\n const row: SwimlaneRow = {\n id: rowId(m, ev),\n event: {...ev, ts} as SwimlaneRowEvent,\n pre,\n post: copySnapshot(cur),\n };\n if (fulfilled) row.fulfilled = fulfilled;\n if (route) row.route = route;\n m.rows.push(row);\n}\n\n/** Ring buffer with amortised span garbage collection. */\nfunction trim(m: SwimlaneModel): void {\n const slack = Math.max(50, Math.floor(m.maxRows / 10));\n if (m.rows.length <= m.maxRows + slack) return;\n m.rows.splice(0, m.rows.length - m.maxRows);\n const keep = new Set<string>();\n for (const r of m.rows) {\n if (\"id\" in r.event) keep.add(r.event.id);\n }\n for (const l of Object.values(m.current)) l.acts.forEach((a) => keep.add(a));\n m.pending.forEach((p) => keep.add(p.id));\n for (const id of Object.keys(m.spans)) {\n if (!keep.has(id)) delete m.spans[id];\n }\n}\n\n/** Remove all rows but keep lanes, open activities and outstanding messages. */\nexport function clearSwimlaneRows(m: SwimlaneModel): void {\n m.rows.splice(0, m.rows.length);\n}\n\n/**\n * Project outstanding messages below the \"now\" line (pure).\n * Expected replies are replayed onto the current snapshot so that open\n * activities visibly run down to the ghost reply that will close them.\n * Newest first ≈ innermost call replies first.\n */\nexport function projectPending(\n current: SwimlaneLanesSnapshot,\n pending: SwimlanePending[],\n): SwimlaneGhostRow[] {\n let snap = current;\n const out: SwimlaneGhostRow[] = [];\n for (let i = pending.length - 1; i >= 0; i--) {\n const p = pending[i];\n const pre = snap;\n const lane = snap[p.from];\n if (p.type === \"reply\" && lane?.acts.includes(p.id)) {\n snap = {...snap, [p.from]: {...lane, acts: lane.acts.filter((a) => a !== p.id)}};\n }\n out.push({id: `g-${p.id}`, pending: p, pre, post: snap});\n }\n return out;\n}\n\n/**\n * Direct children of call `id`: calls made while it was being handled.\n * Their call/reply transitions (and outstanding replies) are the transitions\n * the process \"creates and receives\".\n */\nexport function relatedCallIds(m: Pick<SwimlaneModel, \"spans\">, id: string): string[] {\n const out: string[] = [];\n for (const s of Object.values(m.spans)) if (s.parent === id) out.push(s.id);\n return out.sort((a, b) => m.spans[a].start - m.spans[b].start);\n}\n\n/** Does a row (or ghost row) involve the call chain `id`? */\nexport function rowTouches(\n r: {pre: SwimlaneLanesSnapshot; post: SwimlaneLanesSnapshot},\n eventId: string | undefined,\n id: string,\n): boolean {\n if (eventId === id) return true;\n for (const l of Object.values(r.pre)) if (l.acts.includes(id)) return true;\n for (const l of Object.values(r.post)) if (l.acts.includes(id)) return true;\n return false;\n}\n\n/**\n * Identifies the \"step\" a row belongs to: rows that share an explicit\n * `step` value, or the row itself when it has none (a step of one event).\n */\nexport function stepKeyOf(r: Pick<SwimlaneRow, \"id\" | \"event\">): string {\n return r.event.step != null ? `step:${r.event.step}` : `row:${r.id}`;\n}\n\n/** Every row belonging to the same step as `t` (see `stepKeyOf`), in `model.rows` order. */\nexport function stepRows(m: SwimlaneModel, stepId: string): SwimlaneRow[] {\n return m.rows.filter((r) => stepKeyOf(r) === stepId);\n}\n\nexport function formatTs(t: number): string {\n const d = new Date(t);\n const p = (n: number, w = 2) => String(n).padStart(w, \"0\");\n return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${p(d.getMilliseconds(), 3)}`;\n}\n\n/** Human-readable description of a hover target (used by the tooltip). */\nexport function describeSwimlaneTarget(\n m: SwimlaneModel,\n t: SwimlaneTarget,\n now: number = Date.now(),\n fmtTs: (ts: number) => string = formatTs,\n): string {\n if (t.kind === \"state\") {\n // `rowId` may come from a DOM dataset (always a string) or be set\n // programmatically as a number, so compare stringified.\n const r = m.rows.find((x) => String(x.id) === String(t.rowId));\n if (!r || r.event.type !== \"state\") return t.id;\n return `${t.lane} → ${r.event.state} at ${fmtTs(r.event.ts)}`;\n }\n if (t.kind === \"step\") {\n const rows = stepRows(m, t.id);\n if (rows.length === 0) return t.id;\n const kinds = rows.map((r) => r.event.type).join(\", \");\n return `step at ${fmtTs(rows[0].event.ts)} · ${rows.length} event${rows.length === 1 ? \"\" : \"s\"} (${kinds})`;\n }\n if (t.kind === \"lane\") {\n const s = m.current[t.id];\n return `${m.laneLabels[t.id] ?? t.id}${s ? ` · ${s.state}` : \"\"}`;\n }\n if (t.kind === \"pending\") {\n const p = m.pending.find((x) => x.id === t.id);\n if (!p) return \"already fulfilled\";\n const w = now - p.since;\n const what = p.type === \"reply\" ? \"reply\" : \"message\";\n const to = p.timeoutMs\n ? ` / timeout ${p.timeoutMs} ms${w > p.timeoutMs ? \" · OVERDUE\" : \"\"}`\n : \"\";\n return `expected ${what} ${p.from} → ${p.to}: \"${p.label}\" · waiting ${w} ms${to}`;\n }\n const s = m.spans[t.id];\n if (!s) return t.id;\n const dur = s.end != null ? `${s.end - s.start} ms` : `running ${now - s.start} ms`;\n const res = s.result ? ` (${s.result})` : \"\";\n if (t.kind === \"activity\") {\n return `${s.to} handling \"${s.label}\" from ${s.from} · started ${fmtTs(s.start)} · ${dur}${res}`;\n }\n return `${s.kind.toUpperCase()} ${s.from} → ${s.to}: \"${s.label}\" · ${s.status}${res} · ${dur}`;\n}\n\n/**\n * Wire the data actions for one model:\n *\n * register((r) => registerSwimlaneModel<AppState>(r, \"main\", (s) => s.swimlane));\n * // …later, from a stream adapter:\n * dispatchSwimlaneEvents(dispatch, {modelId: \"main\", events});\n */\nexport function registerSwimlaneModel<S extends ReduxState>(\n r: PiRegister,\n modelId: string,\n select: (state: S) => SwimlaneModel,\n): void {\n onSwimlaneEventsReceived<S>(r, (state, a) => {\n if (a.modelId === modelId) ingestSwimlaneEvents(select(state), a.events);\n });\n onSwimlaneRowsCleared<S>(r, (state, a) => {\n if (a.modelId === modelId) clearSwimlaneRows(select(state));\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|