@kanzo-tech/graph 0.24.0 → 0.26.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 (71) hide show
  1. package/dist/core/categories.d.ts +1 -1
  2. package/dist/core/categories.d.ts.map +1 -1
  3. package/dist/core/categories.js.map +1 -1
  4. package/dist/core/channels.d.ts +12 -6
  5. package/dist/core/channels.d.ts.map +1 -1
  6. package/dist/core/channels.js +15 -12
  7. package/dist/core/channels.js.map +1 -1
  8. package/dist/core/client.d.ts +26 -0
  9. package/dist/core/client.d.ts.map +1 -0
  10. package/dist/core/client.js +62 -0
  11. package/dist/core/client.js.map +1 -0
  12. package/dist/core/error.d.ts +3 -3
  13. package/dist/core/error.d.ts.map +1 -1
  14. package/dist/core/error.js.map +1 -1
  15. package/dist/core/load.d.ts +30 -39
  16. package/dist/core/load.d.ts.map +1 -1
  17. package/dist/core/load.js +63 -117
  18. package/dist/core/load.js.map +1 -1
  19. package/dist/core/source.d.ts +90 -0
  20. package/dist/core/source.d.ts.map +1 -0
  21. package/dist/core/source.js +105 -0
  22. package/dist/core/source.js.map +1 -0
  23. package/dist/core/state.d.ts +19 -20
  24. package/dist/core/state.d.ts.map +1 -1
  25. package/dist/core/store.d.ts.map +1 -1
  26. package/dist/core/store.js +137 -157
  27. package/dist/core/store.js.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/parts/graph-canvas.d.ts.map +1 -1
  30. package/dist/parts/graph-canvas.js +49 -48
  31. package/dist/parts/graph-canvas.js.map +1 -1
  32. package/dist/parts/graph-counts.js +4 -4
  33. package/dist/parts/graph-counts.js.map +1 -1
  34. package/dist/parts/graph-inspector.d.ts +3 -3
  35. package/dist/parts/graph-inspector.d.ts.map +1 -1
  36. package/dist/parts/graph-inspector.js +45 -43
  37. package/dist/parts/graph-inspector.js.map +1 -1
  38. package/dist/parts/graph-search.d.ts +7 -7
  39. package/dist/parts/graph-search.d.ts.map +1 -1
  40. package/dist/parts/graph-search.js +60 -69
  41. package/dist/parts/graph-search.js.map +1 -1
  42. package/dist/parts/graph-toolbar.js +1 -1
  43. package/dist/parts/graph-toolbar.js.map +1 -1
  44. package/dist/react/use-graph.js +31 -31
  45. package/dist/react/use-graph.js.map +1 -1
  46. package/dist/render/graph-sim.d.ts +1 -1
  47. package/dist/render/graph-sim.d.ts.map +1 -1
  48. package/dist/render/graph-sim.js.map +1 -1
  49. package/dist/render/motion.d.ts +33 -0
  50. package/dist/render/motion.d.ts.map +1 -0
  51. package/dist/render/motion.js +19 -0
  52. package/dist/render/motion.js.map +1 -0
  53. package/dist/render/placement.d.ts +2 -4
  54. package/dist/render/placement.d.ts.map +1 -1
  55. package/dist/render/placement.js +12 -16
  56. package/dist/render/placement.js.map +1 -1
  57. package/dist/render/renderer.d.ts +6 -5
  58. package/dist/render/renderer.d.ts.map +1 -1
  59. package/dist/render/renderer.js +124 -113
  60. package/dist/render/renderer.js.map +1 -1
  61. package/dist/section.js +1 -1
  62. package/dist/section.js.map +1 -1
  63. package/package.json +8 -10
  64. package/dist/core/detail.d.ts +0 -26
  65. package/dist/core/detail.d.ts.map +0 -1
  66. package/dist/core/detail.js +0 -63
  67. package/dist/core/detail.js.map +0 -1
  68. package/dist/core/filter.d.ts +0 -23
  69. package/dist/core/filter.d.ts.map +0 -1
  70. package/dist/core/filter.js +0 -95
  71. package/dist/core/filter.js.map +0 -1
@@ -1,32 +1,39 @@
1
- import { GraphError as Y } from "./error.js";
2
- import { domainOf as Z } from "./categories.js";
3
- import { bindingOf as Q } from "./channels.js";
4
- import { graphClient as x, publish as ee, filterFor as ne } from "./filter.js";
5
- import { drawnTables as te, loadEncoding as re, loadGraph as oe, maskOf as R, readKept as le } from "./load.js";
6
- const ie = (u, r) => JSON.stringify(u, (m, f) => typeof f == "bigint" ? `${f}n` : f) === JSON.stringify(r, (m, f) => typeof f == "bigint" ? `${f}n` : f), se = (u) => typeof (u == null ? void 0 : u.then) == "function";
7
- function ue(u, r, m) {
8
- const f = r.domain.map(() => 0), s = new Uint8Array(u.size);
9
- let y = 0;
10
- for (let l = 0; l < u.size; l++) {
11
- if (m && !m[l] || Number.isNaN(u.positions[l * 2])) continue;
12
- s[l] = 1, y++;
13
- const c = r.ranks[l];
14
- f[c] = (f[c] ?? 0) + 1;
1
+ import { domainOf as L } from "./categories.js";
2
+ import { bindingOf as $ } from "./channels.js";
3
+ import { GraphClient as M, publish as R } from "./client.js";
4
+ import { GraphError as V } from "./error.js";
5
+ import { loadGeometry as W, loadEncoding as X } from "./load.js";
6
+ import { readStructure as Y } from "./source.js";
7
+ function Z(d, o, f) {
8
+ const a = o.domain.map(() => 0), y = new Uint8Array(d.size);
9
+ let l = 0;
10
+ for (let r = 0; r < d.size; r++) {
11
+ if (f && !f[r] || Number.isNaN(d.positions[r * 2])) continue;
12
+ y[r] = 1, l++;
13
+ const p = o.ranks[r];
14
+ a[p] = (a[p] ?? 0) + 1;
15
15
  }
16
- let h = 0;
17
- const { links: k } = u;
18
- for (let l = 0; l < k.length; l += 2)
19
- s[k[l]] && s[k[l + 1]] && h++;
20
- return { vertices: y, edges: h, domain: r.domain, tally: f };
16
+ let u = 0;
17
+ const { links: i } = d;
18
+ for (let r = 0; r < i.length; r += 2)
19
+ y[i[r]] && y[i[r + 1]] && u++;
20
+ return { vertices: l, edges: u, domain: o.domain, tally: a };
21
21
  }
22
- function ye(u) {
23
- let r = u;
24
- const m = /* @__PURE__ */ new Set(), f = x();
25
- let s = null, y = null, h = !1, k = !1, l = [], c = Q(u), F, d = null, i = null, a = null, b = null, N = null, v = null, G = [], w = null, z = !1, U = !0, L = null;
26
- const T = (e) => {
27
- U ? L = { error: e } : r.onFailure(e);
22
+ function H(d, o) {
23
+ const f = new Uint8Array(d);
24
+ for (const a of o) a < d && (f[a] = 1);
25
+ return f;
26
+ }
27
+ function re(d) {
28
+ let o = d;
29
+ const f = /* @__PURE__ */ new Set();
30
+ let a = !1, y = !1, l = $(d), u = null, i = null, r = null, p = null, h = null, O = [];
31
+ const k = { structure: 0, geometry: 0, encoding: 0 }, b = { structure: !1, geometry: !1, encoding: !1 };
32
+ let m = null, B = null, z = !1, C = !0, N = null;
33
+ const G = (e) => {
34
+ C ? N = { error: e } : o.onFailure(e);
28
35
  };
29
- let p = {
36
+ let c = {
30
37
  status: "none",
31
38
  total: void 0,
32
39
  drawn: null,
@@ -38,197 +45,170 @@ function ye(u) {
38
45
  tool: null,
39
46
  motion: "settled",
40
47
  progress: 1,
41
- options: r,
42
- corpus: null,
43
- binding: c,
48
+ options: o,
49
+ structure: null,
50
+ binding: l,
44
51
  geometry: null,
45
52
  encoding: null,
46
53
  mask: null
47
- }, _ = { key: [], value: [] };
48
- function j() {
49
- const e = [l, c.byTable, c.category, r.categories];
50
- return e.some((n, t) => n !== _.key[t]) && (_ = { key: e, value: Z(l, c, r.categories) }), _.value;
54
+ }, T = { key: [], value: [] };
55
+ function E() {
56
+ const e = (u == null ? void 0 : u.vertices) ?? [], n = [e, l.byTable, l.category, o.categories];
57
+ return n.some((t, s) => t !== T.key[s]) && (T = { key: n, value: L(e, l, o.categories) }), T.value;
51
58
  }
52
- let A = { key: [], value: null };
53
- function V() {
54
- const e = [a, b, v];
55
- return e.some((n, t) => n !== A.key[t]) && (A = { key: e, value: a && b ? ue(a, b, v) : null }), A.value;
59
+ let F = { key: [], value: null };
60
+ function I() {
61
+ const e = [i, r, h];
62
+ return e.some((n, t) => n !== F.key[t]) && (F = { key: e, value: i && r ? Z(i, r, h) : null }), F.value;
56
63
  }
57
- function W() {
58
- if (h || k) return "failed";
59
- if (y) return "opening";
60
- if (!s) return "none";
61
- const n = a !== null && [a, b, v].every((t, o) => t === G[o]);
62
- return d || i || !n ? "loading" : "idle";
64
+ function J() {
65
+ if (a || y) return "failed";
66
+ if (o.from === null || o.coordinator === null) return "none";
67
+ const n = i !== null && [i, r, h].every((t, s) => t === O[s]);
68
+ return b.structure || b.geometry || b.encoding || !n ? "loading" : "idle";
63
69
  }
64
70
  function g(e = {}) {
65
- p = {
66
- ...p,
67
- total: s ? l.reduce((n, t) => n + t.record_count, 0) : void 0,
68
- drawn: V(),
69
- domain: j(),
70
- options: r,
71
- corpus: s,
72
- binding: c,
73
- geometry: a,
74
- encoding: b,
75
- mask: v,
71
+ c = {
72
+ ...c,
73
+ total: u == null ? void 0 : u.size,
74
+ drawn: I(),
75
+ domain: E(),
76
+ options: o,
77
+ structure: u,
78
+ binding: l,
79
+ geometry: i,
80
+ encoding: r,
81
+ mask: h,
76
82
  ...e
77
- }, p = { ...p, status: W() }, q();
83
+ }, c = { ...c, status: J() }, P();
78
84
  }
79
- function B(e) {
80
- p = { ...p, ...e }, q();
85
+ function v(e) {
86
+ c = { ...c, ...e }, P();
81
87
  }
82
- function q() {
83
- for (const e of m) e();
88
+ function P() {
89
+ for (const e of f) e();
84
90
  }
85
- function C(e, n, t, o, S) {
86
- var E;
87
- (E = e()) == null || E.abort();
88
- const O = new AbortController();
89
- n(O), o(O.signal).then(
90
- (K) => {
91
- e() === O && (n(null), S(K), g());
91
+ function S(e, n, t) {
92
+ const s = ++k[e];
93
+ b[e] = !0, n().then(
94
+ (w) => {
95
+ k[e] === s && (b[e] = !1, t(w), g());
92
96
  },
93
- (K) => {
94
- e() !== O || O.signal.aborted || (n(null), h || (h = t), T(K), g());
97
+ (w) => {
98
+ k[e] === s && (b[e] = !1, a = !0, G(w), g());
95
99
  }
96
100
  );
97
101
  }
98
- const H = [() => d, (e) => d = e, !0], X = [() => i, (e) => i = e, !1];
99
- function J() {
100
- const e = s;
101
- if (!e) return;
102
- const n = j(), t = a;
103
- if (t)
104
- return C(...H, (o) => re(e, t, c, n, o), (o) => {
105
- b = o;
106
- });
107
- C(...H, (o) => oe(e, c, n, o), (o) => {
108
- a = o.geometry, b = o.encoding, v = a && N ? R(a, N) : null;
102
+ function U() {
103
+ const { coordinator: e, from: n } = o;
104
+ e === null || n === null || S("structure", () => Y(e, n), (t) => {
105
+ if (t.size === 0) {
106
+ a = !0, G(new V("graph/nothing-to-draw", `the corpus attached as ${n} has no vertex`));
107
+ return;
108
+ }
109
+ u = t, j(), m == null || m.requestQuery();
109
110
  });
110
111
  }
111
- function P() {
112
- i == null || i.abort(), i = null;
113
- const e = s;
114
- if (!e || l.length === 0) return;
115
- if (F === void 0) {
116
- N = null, v = null;
117
- return;
118
- }
119
- const n = F;
120
- C(...X, (t) => le(e, l, n, t), (t) => {
121
- N = t, v = a ? R(a, t) : null;
112
+ function j() {
113
+ const { coordinator: e } = o, n = u;
114
+ e === null || n === null || S("geometry", () => W(e, n, l), (t) => {
115
+ i = t, h = p ? H(t.size, p) : null, q();
122
116
  });
123
117
  }
124
- function $() {
125
- d == null || d.abort(), i == null || i.abort(), d = i = null, h = !1, a = b = v = N = null, G = [], l = [];
126
- const e = { selection: null, focus: null, hovered: null, pinned: [] };
127
- if (!s) return g(e);
128
- try {
129
- if (l = te(s), l.length === 0) throw new Y("graph/nothing-to-draw", "the corpus has no vertex type with a position to draw");
130
- } catch (n) {
131
- return h = !0, T(n), g(e);
132
- }
133
- J(), P(), g(e);
118
+ function q() {
119
+ const { coordinator: e } = o, n = i;
120
+ if (e === null || n === null) return;
121
+ const t = E();
122
+ S("encoding", () => X(e, n, l, t), (s) => {
123
+ r = s;
124
+ });
134
125
  }
135
- function I(e) {
136
- if (s = null, y = se(e) ? e : null, !y)
137
- return s = e, $();
138
- const n = y;
139
- $(), n.then(
126
+ function K() {
127
+ for (const e of Object.keys(k))
128
+ k[e]++, b[e] = !1;
129
+ a = !1, u = i = r = null, p = h = null, O = [], g({ selection: null, focus: null, hovered: null, pinned: [] }), U();
130
+ }
131
+ function A() {
132
+ D();
133
+ const { coordinator: e, filterBy: n } = o;
134
+ e !== null && (m = new M(
135
+ n,
136
+ () => u,
140
137
  (t) => {
141
- y === n && (y = null, s = t, $());
138
+ p = t, h = t && i ? H(i.size, t) : null, g();
142
139
  },
143
- (t) => {
144
- y === n && (y = null, h = !0, T(t), g());
145
- }
146
- );
140
+ (t) => G(t)
141
+ ), e.connect(m), B = e);
147
142
  }
148
143
  function D() {
149
- w == null || w(), w = null;
150
- const e = r.filterBy, n = () => {
151
- let t;
152
- try {
153
- t = e ? ne(e, f) : void 0;
154
- } catch (o) {
155
- T(o);
156
- return;
157
- }
158
- ie(t, F) || (F = t, P(), g());
159
- };
160
- e && (e.addEventListener("value", n), w = () => e.removeEventListener("value", n)), n();
144
+ m && B && B.disconnect(m), m = null, B = null;
161
145
  }
162
- const M = {
146
+ const Q = {
163
147
  /**
164
- * The first subscriber starts listening to the crossfilter and the last one stops it and lets the
165
- * graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode
166
- * mounting everything twice.
148
+ * The first subscriber connects the client to the coordinator, and the last one disconnects it
149
+ * and lets the graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what
150
+ * survives StrictMode mounting everything twice.
167
151
  */
168
152
  subscribe(e) {
169
- if (m.add(e), !z && (z = !0, D(), s && !h && l.length > 0 && (!d && (!a || !b) && J(), !i && F !== void 0 && !N && P()), L !== null)) {
170
- const { error: n } = L;
171
- L = null, r.onFailure(n);
153
+ if (f.add(e), !z && (z = !0, A(), N !== null)) {
154
+ const { error: n } = N;
155
+ N = null, o.onFailure(n);
172
156
  }
173
157
  return () => {
174
- m.delete(e), m.size === 0 && M.destroy();
158
+ f.delete(e), f.size === 0 && Q.destroy();
175
159
  };
176
160
  },
177
- getSnapshot: () => p,
178
- getOptions: () => r,
161
+ getSnapshot: () => c,
162
+ getOptions: () => o,
179
163
  setOptions(e) {
180
- const n = r;
181
- r = e;
182
- const t = Q(e), o = t.category !== c.category || t.byTable !== c.byTable || t.size !== c.size || e.categories !== n.categories;
183
- if (c = t, e.corpus !== n.corpus) {
184
- I(e.corpus), z && e.filterBy !== n.filterBy && D();
185
- return;
186
- }
187
- z && e.filterBy !== n.filterBy && D(), o && J(), g();
164
+ const n = o;
165
+ o = e;
166
+ const t = l;
167
+ if (l = $(e), e.from !== n.from || e.coordinator !== n.coordinator)
168
+ return z && e.coordinator !== n.coordinator && A(), K();
169
+ z && e.filterBy !== n.filterBy && A(), l.x !== t.x || l.y !== t.y ? j() : (l.category !== t.category || l.byTable !== t.byTable || l.size !== t.size || l.cluster !== t.cluster || e.categories !== n.categories) && q(), g();
188
170
  },
189
171
  destroy() {
190
- z = !1, w == null || w(), w = null, d == null || d.abort(), i == null || i.abort(), d = i = null, m.clear();
172
+ z = !1, D(), f.clear();
191
173
  },
192
174
  select(e, n = "node", t = "") {
193
- var O, E;
194
- const o = e && e.length > 0 ? { vertices: [...e], source: n, label: t } : null;
195
- B({ selection: o }), (O = r.onSelect) == null || O.call(r, o);
196
- const S = (E = l[0]) == null ? void 0 : E.key;
197
- r.filterBy && S && ee(r.filterBy, f, S, o ? o.vertices : null);
175
+ var w;
176
+ const s = e && e.length > 0 ? { vertices: [...e], source: n, label: t } : null;
177
+ v({ selection: s }), (w = o.onSelect) == null || w.call(o, s), o.filterBy && m && R(o.filterBy, m, s ? s.vertices : null);
198
178
  },
199
179
  focus(e) {
200
180
  var n;
201
- e !== p.focus && (B({ focus: e }), (n = r.onFocus) == null || n.call(r, e));
181
+ e !== c.focus && (v({ focus: e }), (n = o.onFocus) == null || n.call(o, e));
202
182
  },
203
183
  hover(e) {
204
- e !== p.hovered && B({ hovered: e });
184
+ e !== c.hovered && v({ hovered: e });
205
185
  },
206
186
  pin(e) {
207
- B({ pinned: [...e] });
187
+ v({ pinned: [...e] });
208
188
  },
209
189
  setTool(e) {
210
- e !== p.tool && B({ tool: e });
190
+ e !== c.tool && v({ tool: e });
211
191
  },
212
192
  report(e) {
213
- e !== p.motion && B({ motion: e });
193
+ e !== c.motion && v({ motion: e });
214
194
  },
215
195
  reportProgress(e) {
216
- e !== p.progress && B({ progress: e });
196
+ e !== c.progress && v({ progress: e });
217
197
  },
218
198
  renderable() {
219
- k && (k = !1, g());
199
+ y && (y = !1, g());
220
200
  },
221
201
  unrenderable(e) {
222
- k = !0, T(e), g();
202
+ y = !0, G(e), g();
223
203
  },
224
204
  reportDrawn(e) {
225
205
  const n = [e.geometry, e.encoding, e.mask];
226
- n.every((t, o) => t === G[o]) || (G = n, g());
206
+ n.every((t, s) => t === O[s]) || (O = n, g());
227
207
  }
228
208
  };
229
- return I(u.corpus), U = !1, M;
209
+ return U(), g(), C = !1, Q;
230
210
  }
231
211
  export {
232
- ye as createGraph
212
+ re as createGraph
233
213
  };
234
214
  //# sourceMappingURL=store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import { GraphError } from \"./error\";\nimport type { MosaicClient } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf } from \"./channels\";\nimport type { Corpus, Filter, VertexTable } from \"@fossil-lang/corpus\";\nimport { filterFor, graphClient, publish } from \"./filter\";\nimport { drawnTables, loadEncoding, loadGraph, maskOf, readKept, type Encoding, type Geometry, type Kept } from \"./load\";\nimport type { Drawn, GraphOptions, GraphSnapshot, GraphStatus, GraphStore } from \"./state\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore } from \"./state\";\n\nconst sameFilter = (a: Filter | undefined, b: Filter | undefined) =>\n JSON.stringify(a, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v)) ===\n JSON.stringify(b, (_, v: unknown) => (typeof v === \"bigint\" ? `${v}n` : v));\n\nconst isPromise = (value: unknown): value is PromiseLike<Corpus> =>\n typeof (value as PromiseLike<Corpus> | null)?.then === \"function\";\n\nfunction drawnOf(geometry: Geometry, encoding: Encoding, mask: Uint8Array | null): Drawn {\n const tally = encoding.domain.map(() => 0);\n const shown = new Uint8Array(geometry.size);\n let vertices = 0;\n for (let id = 0; id < geometry.size; id++) {\n if ((mask && !mask[id]) || Number.isNaN(geometry.positions[id * 2])) continue;\n shown[id] = 1;\n vertices++;\n const rank = encoding.ranks[id] as number;\n tally[rank] = (tally[rank] ?? 0) + 1;\n }\n let edges = 0;\n const { links } = geometry;\n for (let i = 0; i < links.length; i += 2) {\n if (shown[links[i] as number] && shown[links[i + 1] as number]) edges++;\n }\n return { vertices, edges, domain: encoding.domain, tally };\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n const self: MosaicClient = graphClient();\n\n let corpus: Corpus | null = null;\n let opening: PromiseLike<Corpus> | null = null;\n let failed = false;\n let unrenderable = false;\n let tables: readonly VertexTable[] = [];\n let binding = bindingOf(initial);\n let filter: Filter | undefined;\n let loading: AbortController | null = null;\n let filtering: AbortController | null = null;\n let geometry: Geometry | null = null;\n let encoding: Encoding | null = null;\n let kept: Kept | null = null;\n let mask: Uint8Array | null = null;\n let uploaded: readonly unknown[] = [];\n let unlisten: (() => void) | null = null;\n let active = false;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase.\n let building = true;\n let held: { error: unknown } | null = null;\n const fail = (error: unknown) => {\n if (building) held = { error };\n else options.onFailure(error);\n };\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n total: undefined,\n drawn: null,\n domain: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n options,\n corpus: null,\n binding,\n geometry: null,\n encoding: null,\n mask: null,\n };\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const key = [tables, binding.byTable, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(tables, binding, options.categories) };\n return domain.value;\n }\n\n let drawn: { key: unknown[]; value: Drawn | null } = { key: [], value: null };\n function drawnNow(): Drawn | null {\n const key = [geometry, encoding, mask];\n if (key.some((part, i) => part !== drawn.key[i])) {\n drawn = { key, value: geometry && encoding ? drawnOf(geometry, encoding, mask) : null };\n }\n return drawn.value;\n }\n\n function statusOf(): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (opening) return \"opening\";\n if (!corpus) return \"none\";\n const current = [geometry, encoding, mask];\n const shown = geometry !== null && current.every((part, i) => part === uploaded[i]);\n return loading || filtering || !shown ? \"loading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n snapshot = {\n ...snapshot,\n total: corpus ? tables.reduce((sum, table) => sum + table.record_count, 0) : undefined,\n drawn: drawnNow(),\n domain: domainNow(),\n options,\n corpus,\n binding,\n geometry,\n encoding,\n mask,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf() };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — derives nothing. */\n function patch(fields: Partial<GraphSnapshot>): void {\n snapshot = { ...snapshot, ...fields };\n emit();\n }\n\n function emit(): void {\n for (const listener of listeners) listener();\n }\n\n /**\n * One read in flight per kind, and a newer ask aborts the older one's statements. A load that\n * fails leaves nothing to draw; a filter that fails leaves the last picture.\n */\n function run<T>(\n current: () => AbortController | null,\n set: (aborter: AbortController | null) => void,\n fatal: boolean,\n read: (signal: AbortSignal) => Promise<T>,\n done: (value: T) => void,\n ): void {\n current()?.abort();\n const aborter = new AbortController();\n set(aborter);\n read(aborter.signal).then(\n (value) => {\n if (current() !== aborter) return;\n set(null);\n done(value);\n notify();\n },\n (error: unknown) => {\n // An aborted read is one this store cancelled, not a failure of the corpus.\n if (current() !== aborter || aborter.signal.aborted) return;\n set(null);\n failed ||= fatal;\n fail(error);\n notify();\n },\n );\n }\n\n const asLoad = [() => loading, (a: AbortController | null) => (loading = a), true] as const;\n const asFilter = [() => filtering, (a: AbortController | null) => (filtering = a), false] as const;\n\n function load(): void {\n const open = corpus;\n if (!open) return;\n const seed = domainNow();\n const given = geometry;\n if (given) {\n return run(...asLoad, (signal) => loadEncoding(open, given, binding, seed, signal), (next) => {\n encoding = next;\n });\n }\n run(...asLoad, (signal) => loadGraph(open, binding, seed, signal), (next) => {\n geometry = next.geometry;\n encoding = next.encoding;\n mask = geometry && kept ? maskOf(geometry, kept) : null;\n });\n }\n\n function refilter(): void {\n filtering?.abort();\n filtering = null;\n const open = corpus;\n if (!open || tables.length === 0) return;\n if (filter === undefined) {\n kept = null;\n mask = null;\n return;\n }\n const given = filter;\n run(...asFilter, (signal) => readKept(open, tables, given, signal), (next) => {\n kept = next;\n mask = geometry ? maskOf(geometry, next) : null;\n });\n }\n\n function reopen(): void {\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n failed = false;\n geometry = encoding = mask = kept = null;\n uploaded = [];\n tables = [];\n const cleared = { selection: null, focus: null, hovered: null, pinned: [] };\n if (!corpus) return notify(cleared);\n try {\n tables = drawnTables(corpus);\n if (tables.length === 0) throw new GraphError(\"graph/nothing-to-draw\", \"the corpus has no vertex type with a position to draw\");\n } catch (error) {\n failed = true;\n fail(error);\n return notify(cleared);\n }\n load();\n refilter();\n notify(cleared);\n }\n\n /** A promise is adopted when it settles, and only if it is still the corpus the host means. */\n function adopt(given: GraphOptions[\"corpus\"]): void {\n corpus = null;\n opening = isPromise(given) ? given : null;\n if (!opening) {\n corpus = given as Corpus | null;\n return reopen();\n }\n const promised = opening;\n reopen();\n promised.then(\n (opened) => {\n if (opening !== promised) return;\n opening = null;\n corpus = opened;\n reopen();\n },\n (error: unknown) => {\n if (opening !== promised) return;\n opening = null;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function listen(): void {\n unlisten?.();\n unlisten = null;\n const crossfilter = options.filterBy;\n const changed = () => {\n let next: Filter | undefined;\n try {\n next = crossfilter ? filterFor(crossfilter, self) : undefined;\n } catch (error) {\n fail(error);\n return;\n }\n if (sameFilter(next, filter)) return;\n filter = next;\n refilter();\n notify();\n };\n if (crossfilter) {\n crossfilter.addEventListener(\"value\", changed);\n unlisten = () => crossfilter.removeEventListener(\"value\", changed);\n }\n changed();\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber starts listening to the crossfilter and the last one stops it and lets the\n * graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what survives StrictMode\n * mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n listen();\n // StrictMode unsubscribes and subscribes again: what the unsubscribe cancelled starts over.\n if (corpus && !failed && tables.length > 0) {\n if (!loading && (!geometry || !encoding)) load();\n if (!filtering && filter !== undefined && !kept) refilter();\n }\n if (held !== null) {\n const { error } = held;\n held = null;\n options.onFailure(error);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const nextBinding = bindingOf(next);\n const rebound =\n nextBinding.category !== binding.category ||\n nextBinding.byTable !== binding.byTable ||\n nextBinding.size !== binding.size ||\n next.categories !== previous.categories;\n binding = nextBinding;\n if (next.corpus !== previous.corpus) {\n adopt(next.corpus);\n if (active && next.filterBy !== previous.filterBy) listen();\n return;\n }\n if (active && next.filterBy !== previous.filterBy) listen();\n if (rebound) load();\n notify();\n },\n destroy() {\n active = false;\n unlisten?.();\n unlisten = null;\n loading?.abort();\n filtering?.abort();\n loading = filtering = null;\n listeners.clear();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n patch({ selection });\n options.onSelect?.(selection);\n const key = tables[0]?.key;\n if (options.filterBy && key) publish(options.filterBy, self, key, selection ? selection.vertices : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n patch({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) patch({ hovered: vertex });\n },\n pin(vertices) {\n patch({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) patch({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) patch({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) patch({ progress: value });\n },\n renderable() {\n if (!unrenderable) return;\n unrenderable = false;\n notify();\n },\n unrenderable(error) {\n unrenderable = true;\n fail(error);\n notify();\n },\n reportDrawn(drawnSnapshot) {\n const next = [drawnSnapshot.geometry, drawnSnapshot.encoding, drawnSnapshot.mask];\n if (next.every((part, i) => part === uploaded[i])) return;\n uploaded = next;\n notify();\n },\n };\n\n adopt(initial.corpus);\n building = false;\n return store;\n}\n"],"names":["sameFilter","a","b","_","v","isPromise","value","drawnOf","geometry","encoding","mask","tally","shown","vertices","id","rank","edges","links","i","createGraph","initial","options","listeners","self","graphClient","corpus","opening","failed","unrenderable","tables","binding","bindingOf","filter","loading","filtering","kept","uploaded","unlisten","active","building","held","fail","error","snapshot","domain","domainNow","key","part","domainOf","drawn","drawnNow","statusOf","notify","fields","sum","table","emit","patch","listener","run","current","set","fatal","read","done","_a","aborter","asLoad","asFilter","load","open","seed","given","signal","loadEncoding","next","loadGraph","maskOf","refilter","readKept","reopen","cleared","drawnTables","GraphError","adopt","promised","opened","listen","crossfilter","changed","filterFor","store","previous","nextBinding","rebound","source","label","selection","_b","publish","vertex","tool","motion","drawnSnapshot"],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sources":["../../src/core/store.ts"],"sourcesContent":["import type { Coordinator } from \"@kanzo-tech/mosaic\";\nimport { domainOf } from \"./categories\";\nimport { bindingOf } from \"./channels\";\nimport { GraphClient, publish } from \"./client\";\nimport { GraphError } from \"./error\";\nimport { loadEncoding, loadGeometry, type Encoding, type Geometry } from \"./load\";\nimport { readStructure, type Structure } from \"./source\";\nimport type { Drawn, GraphOptions, GraphSnapshot, GraphStatus, GraphStore } from \"./state\";\n\nexport type { Drawn, GraphOptions, GraphSnapshot, GraphState, GraphStatus, GraphStore } from \"./state\";\n\nfunction drawnOf(geometry: Geometry, encoding: Encoding, mask: Uint8Array | null): Drawn {\n const tally = encoding.domain.map(() => 0);\n const shown = new Uint8Array(geometry.size);\n let vertices = 0;\n for (let id = 0; id < geometry.size; id++) {\n if ((mask && !mask[id]) || Number.isNaN(geometry.positions[id * 2])) continue;\n shown[id] = 1;\n vertices++;\n const rank = encoding.ranks[id] as number;\n tally[rank] = (tally[rank] ?? 0) + 1;\n }\n let edges = 0;\n const { links } = geometry;\n for (let i = 0; i < links.length; i += 2) {\n if (shown[links[i] as number] && shown[links[i + 1] as number]) edges++;\n }\n return { vertices, edges, domain: encoding.domain, tally };\n}\n\n/** `1` where a vertex is among `ids`. */\nfunction maskOf(size: number, ids: Float64Array): Uint8Array {\n const mask = new Uint8Array(size);\n for (const id of ids) if (id < size) mask[id] = 1;\n return mask;\n}\n\nexport function createGraph(initial: GraphOptions): GraphStore {\n let options = initial;\n const listeners = new Set<() => void>();\n\n let failed = false;\n let unrenderable = false;\n let binding = bindingOf(initial);\n let structure: Structure | null = null;\n let geometry: Geometry | null = null;\n let encoding: Encoding | null = null;\n let kept: Float64Array | null = null;\n let mask: Uint8Array | null = null;\n let uploaded: readonly unknown[] = [];\n /** One read per kind in flight; a newer one makes an older one's answer stale. */\n const reading = { structure: 0, geometry: 0, encoding: 0 };\n const pending = { structure: false, geometry: false, encoding: false };\n let client: GraphClient | null = null;\n let connected: Coordinator | null = null;\n let active = false;\n\n // A failure found while the store is being built is found while React is still rendering —\n // `useGraph` builds it in `useState` — and a host's `onFailure` is usually a `setState`. It is held\n // and reported to the first subscriber, which arrives in the commit phase.\n let building = true;\n let held: { error: unknown } | null = null;\n const fail = (error: unknown) => {\n if (building) held = { error };\n else options.onFailure(error);\n };\n\n let snapshot: GraphSnapshot = {\n status: \"none\",\n total: undefined,\n drawn: null,\n domain: [],\n selection: null,\n focus: null,\n hovered: null,\n pinned: [],\n tool: null,\n motion: \"settled\",\n progress: 1,\n options,\n structure: null,\n binding,\n geometry: null,\n encoding: null,\n mask: null,\n };\n\n let domain: { key: unknown[]; value: readonly unknown[] } = { key: [], value: [] };\n function domainNow(): readonly unknown[] {\n const tables = structure?.vertices ?? [];\n const key = [tables, binding.byTable, binding.category, options.categories];\n if (key.some((part, i) => part !== domain.key[i])) domain = { key, value: domainOf(tables, binding, options.categories) };\n return domain.value;\n }\n\n let drawn: { key: unknown[]; value: Drawn | null } = { key: [], value: null };\n function drawnNow(): Drawn | null {\n const key = [geometry, encoding, mask];\n if (key.some((part, i) => part !== drawn.key[i])) {\n drawn = { key, value: geometry && encoding ? drawnOf(geometry, encoding, mask) : null };\n }\n return drawn.value;\n }\n\n function statusOf(): GraphStatus {\n if (failed || unrenderable) return \"failed\";\n if (options.from === null || options.coordinator === null) return \"none\";\n const current = [geometry, encoding, mask];\n const shown = geometry !== null && current.every((part, i) => part === uploaded[i]);\n return pending.structure || pending.geometry || pending.encoding || !shown ? \"loading\" : \"idle\";\n }\n\n function notify(fields: Partial<GraphSnapshot> = {}): void {\n snapshot = {\n ...snapshot,\n total: structure?.size,\n drawn: drawnNow(),\n domain: domainNow(),\n options,\n structure,\n binding,\n geometry,\n encoding,\n mask,\n ...fields,\n };\n snapshot = { ...snapshot, status: statusOf() };\n emit();\n }\n\n /** A change of state only — hover, focus, selection, tool, motion — derives nothing. */\n function patch(fields: Partial<GraphSnapshot>): void {\n snapshot = { ...snapshot, ...fields };\n emit();\n }\n\n function emit(): void {\n for (const listener of listeners) listener();\n }\n\n /**\n * Read `kind`, and keep the answer only if no newer read of the same kind started meanwhile. The\n * coordinator cannot be told to stop a statement, so a stale answer is dropped rather than aborted.\n */\n function read<T>(kind: keyof typeof reading, ask: () => Promise<T>, done: (value: T) => void): void {\n const ticket = ++reading[kind];\n pending[kind] = true;\n ask().then(\n (value) => {\n if (reading[kind] !== ticket) return;\n pending[kind] = false;\n done(value);\n notify();\n },\n (error: unknown) => {\n if (reading[kind] !== ticket) return;\n pending[kind] = false;\n failed = true;\n fail(error);\n notify();\n },\n );\n }\n\n function loadStructure(): void {\n const { coordinator, from } = options;\n if (coordinator === null || from === null) return;\n read(\"structure\", () => readStructure(coordinator, from), (next) => {\n if (next.size === 0) {\n failed = true;\n fail(new GraphError(\"graph/nothing-to-draw\", `the corpus attached as ${from} has no vertex`));\n return;\n }\n structure = next;\n loadPositions();\n client?.requestQuery();\n });\n }\n\n function loadPositions(): void {\n const { coordinator } = options;\n const given = structure;\n if (coordinator === null || given === null) return;\n read(\"geometry\", () => loadGeometry(coordinator, given, binding), (next) => {\n geometry = next;\n mask = kept ? maskOf(next.size, kept) : null;\n loadChannels();\n });\n }\n\n function loadChannels(): void {\n const { coordinator } = options;\n const given = geometry;\n if (coordinator === null || given === null) return;\n const seed = domainNow();\n read(\"encoding\", () => loadEncoding(coordinator, given, binding, seed), (next) => {\n encoding = next;\n });\n }\n\n function reset(): void {\n for (const kind of Object.keys(reading) as (keyof typeof reading)[]) {\n reading[kind]++;\n pending[kind] = false;\n }\n failed = false;\n structure = geometry = encoding = null;\n kept = mask = null;\n uploaded = [];\n notify({ selection: null, focus: null, hovered: null, pinned: [] });\n loadStructure();\n }\n\n /** The graph's Mosaic client, connected to the coordinator while anything is subscribed. */\n function connect(): void {\n disconnect();\n const { coordinator, filterBy } = options;\n if (coordinator === null) return;\n client = new GraphClient(\n filterBy,\n () => structure,\n (ids) => {\n kept = ids;\n mask = ids && geometry ? maskOf(geometry.size, ids) : null;\n notify();\n },\n (error) => fail(error),\n );\n coordinator.connect(client);\n connected = coordinator;\n }\n\n function disconnect(): void {\n if (client && connected) connected.disconnect(client);\n client = null;\n connected = null;\n }\n\n const store: GraphStore = {\n /**\n * The first subscriber connects the client to the coordinator, and the last one disconnects it\n * and lets the graph go — `QueryObserver`'s `onSubscribe`/`onUnsubscribe`, which is what\n * survives StrictMode mounting everything twice.\n */\n subscribe(listener) {\n listeners.add(listener);\n if (!active) {\n active = true;\n connect();\n if (held !== null) {\n const { error } = held;\n held = null;\n options.onFailure(error);\n }\n }\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) store.destroy();\n };\n },\n getSnapshot: () => snapshot,\n getOptions: () => options,\n setOptions(next) {\n const previous = options;\n options = next;\n const before = binding;\n binding = bindingOf(next);\n if (next.from !== previous.from || next.coordinator !== previous.coordinator) {\n if (active && next.coordinator !== previous.coordinator) connect();\n return reset();\n }\n if (active && next.filterBy !== previous.filterBy) connect();\n if (binding.x !== before.x || binding.y !== before.y) loadPositions();\n else if (\n binding.category !== before.category ||\n binding.byTable !== before.byTable ||\n binding.size !== before.size ||\n binding.cluster !== before.cluster ||\n next.categories !== previous.categories\n ) {\n loadChannels();\n }\n notify();\n },\n destroy() {\n active = false;\n disconnect();\n listeners.clear();\n },\n select(vertices, source = \"node\", label = \"\") {\n const selection = vertices && vertices.length > 0 ? { vertices: [...vertices], source, label } : null;\n patch({ selection });\n options.onSelect?.(selection);\n if (options.filterBy && client) publish(options.filterBy, client, selection ? selection.vertices : null);\n },\n focus(vertex) {\n if (vertex === snapshot.focus) return;\n patch({ focus: vertex });\n options.onFocus?.(vertex);\n },\n hover(vertex) {\n if (vertex !== snapshot.hovered) patch({ hovered: vertex });\n },\n pin(vertices) {\n patch({ pinned: [...vertices] });\n },\n setTool(tool) {\n if (tool !== snapshot.tool) patch({ tool });\n },\n report(motion) {\n if (motion !== snapshot.motion) patch({ motion });\n },\n reportProgress(value) {\n if (value !== snapshot.progress) patch({ progress: value });\n },\n renderable() {\n if (!unrenderable) return;\n unrenderable = false;\n notify();\n },\n unrenderable(error) {\n unrenderable = true;\n fail(error);\n notify();\n },\n reportDrawn(drawnSnapshot) {\n const next = [drawnSnapshot.geometry, drawnSnapshot.encoding, drawnSnapshot.mask];\n if (next.every((part, i) => part === uploaded[i])) return;\n uploaded = next;\n notify();\n },\n };\n\n loadStructure();\n notify();\n building = false;\n return store;\n}\n"],"names":["drawnOf","geometry","encoding","mask","tally","shown","vertices","id","rank","edges","links","i","maskOf","size","ids","createGraph","initial","options","listeners","failed","unrenderable","binding","bindingOf","structure","kept","uploaded","reading","pending","client","connected","active","building","held","fail","error","snapshot","domain","domainNow","tables","key","part","domainOf","drawn","drawnNow","statusOf","notify","fields","emit","patch","listener","read","kind","ask","done","ticket","value","loadStructure","coordinator","from","readStructure","next","GraphError","loadPositions","given","loadGeometry","loadChannels","seed","loadEncoding","reset","connect","disconnect","filterBy","GraphClient","store","previous","before","source","label","selection","_a","publish","vertex","tool","motion","drawnSnapshot"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -38,6 +38,6 @@ export { scaleOf } from './render/graph-model';
38
38
  export type { Channels } from './core/channels';
39
39
  export type { GraphCommands, Motion, Selection, SelectionSource, Tool, VertexId } from './core/types';
40
40
  export type { Drawn, GraphState, GraphStatus } from './core/state';
41
- export type { VertexDetail } from './core/detail';
41
+ export type { VertexDetail } from './core/source';
42
42
  export { GraphError } from './core/error';
43
43
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-canvas.d.ts","sourceRoot":"","sources":["../../src/parts/graph-canvas.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAe1F,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IACnE,oFAAoF;IACpF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAkDD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,+BAgJnF"}
1
+ {"version":3,"file":"graph-canvas.d.ts","sourceRoot":"","sources":["../../src/parts/graph-canvas.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAe1F,MAAM,WAAW,gBAAiB,SAAQ,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC;IACnE,oFAAoF;IACpF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAmDD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,+BAgJnF"}