@graphty/graphty-element 2.5.2 → 2.6.1
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/dist/ai.js +3 -3
- package/dist/catalog.d.ts +16 -0
- package/dist/catalog.js +34 -32
- package/dist/chunks/{AiManager-CrbvKdEK.js → AiManager-4iQpsJW1.js} +4 -4
- package/dist/chunks/{DataSource-qU-nLhXN.js → DataSource-BL2UzPff.js} +2 -2
- package/dist/chunks/GraphSession-BhuHSXIo.js +12819 -0
- package/dist/chunks/{GraphtyLogger-DOTwCiMR.js → GraphtyLogger-B_O67a6c.js} +1 -1
- package/dist/chunks/{VoiceInputAdapter-D4NrRL_1.js → VoiceInputAdapter-Cc6mHXTI.js} +1 -1
- package/dist/chunks/{XRPivotCameraController-Uqa47vmo.js → XRPivotCameraController-BLa89LXn.js} +2 -2
- package/dist/chunks/{algorithms-D-ab-Auu.js → algorithms-BJ6DQMOe.js} +931 -781
- package/dist/chunks/{capability-check-Vw3IcqiE.js → capability-check-Am2zliFj.js} +1 -1
- package/dist/chunks/{detect-B4Qrw976.js → detect-fyuVnlCT.js} +1 -1
- package/dist/chunks/{format-detection-r2IfNFXO.js → format-detection-BHwrAVzW.js} +1 -1
- package/dist/chunks/{index-J9MgLio9.js → index-BkBLbvui.js} +2691 -2434
- package/dist/chunks/optionsFromZod-CKMYSwTz.js +3636 -0
- package/dist/chunks/{paletteRegistry-Kt-6CeoN.js → paletteRegistry-BCFSwJGK.js} +224 -189
- package/dist/chunks/parse-BMTqt4SS.js +3658 -0
- package/dist/chunks/{types-C_c53VgR.js → types-DFchv4Ny.js} +4 -1
- package/dist/custom-elements.json +1 -1
- package/dist/extend.d.ts +10 -8
- package/dist/extend.js +6 -6
- package/dist/graphty-catalog.json +75 -38
- package/dist/graphty.bundle.js +55368 -48970
- package/dist/graphty.js +19 -19
- package/dist/index.d.ts +1 -1
- package/dist/logging.js +2 -2
- package/dist/schema.d.ts +15 -1
- package/dist/schema.js +1 -1
- package/dist/session.d.ts +30 -7
- package/dist/session.js +40 -37
- package/dist/src/Graph.d.ts +35 -7
- package/dist/src/acceleration/types.d.ts +79 -43
- package/dist/src/algorithms/Algorithm.d.ts +52 -4
- package/dist/src/algorithms/BFSAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/BellmanFordAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/BetweennessCentralityAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/BipartiteMatchingAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/ClosenessCentralityAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/ConnectedComponentsAlgorithm.d.ts +4 -1
- package/dist/src/algorithms/DFSAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/DegreeAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/DijkstraAlgorithm.d.ts +6 -0
- package/dist/src/algorithms/EigenvectorCentralityAlgorithm.d.ts +2 -0
- package/dist/src/algorithms/FloydWarshallAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/GirvanNewmanAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/HITSAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/KCoreAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/KatzCentralityAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/KruskalAlgorithm.d.ts +4 -1
- package/dist/src/algorithms/LabelPropagationAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/LeidenAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/LinkPredictionAlgorithm.d.ts +4 -1
- package/dist/src/algorithms/LouvainAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/MaxFlowAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/MinCutAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/PageRankAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/PrimAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/StronglyConnectedComponentsAlgorithm.d.ts +3 -0
- package/dist/src/algorithms/input/ScopedInput.d.ts +185 -0
- package/dist/src/algorithms/input/derivedInputs.d.ts +199 -0
- package/dist/src/algorithms/input/maskBack.d.ts +37 -0
- package/dist/src/algorithms/metrics/MetricAlgorithm.d.ts +3 -3
- package/dist/src/algorithms/results/DeclaredAlgorithm.d.ts +4 -3
- package/dist/src/algorithms/results/types.d.ts +28 -6
- package/dist/src/algorithms/utils/communityUtils.d.ts +0 -48
- package/dist/src/algorithms/utils/graphUtils.d.ts +2 -68
- package/dist/src/algorithms/utils/snapshotGraph.d.ts +3 -1
- package/dist/src/catalog/algorithms.d.ts +3 -0
- package/dist/src/catalog/layouts.d.ts +2 -0
- package/dist/src/catalog/sets/canonical.d.ts +68 -0
- package/dist/src/catalog/sets/hash.d.ts +126 -0
- package/dist/src/catalog/sets/parse.d.ts +115 -0
- package/dist/src/catalog/types.d.ts +329 -8
- package/dist/src/data/GraphStore.d.ts +73 -1
- package/dist/src/data/edgeIdentity.d.ts +202 -1
- package/dist/src/data/ingest.d.ts +3 -1
- package/dist/src/data/report.d.ts +20 -0
- package/dist/src/graphty-element.d.ts +42 -6
- package/dist/src/layout/D3GraphLayoutEngine.d.ts +11 -0
- package/dist/src/layout/LayoutEngine.d.ts +56 -0
- package/dist/src/layout/NGraphLayoutEngine.d.ts +10 -0
- package/dist/src/layout/SimulationLayoutEngine.d.ts +11 -0
- package/dist/src/managers/AlgorithmManager.d.ts +8 -0
- package/dist/src/managers/DataManager.d.ts +11 -0
- package/dist/src/managers/LayoutManager.d.ts +126 -2
- package/dist/src/managers/StatsManager.d.ts +1 -0
- package/dist/src/session/GraphSession.d.ts +48 -0
- package/dist/src/session/attributes.d.ts +121 -1
- package/dist/src/session/cost/estimate.d.ts +20 -0
- package/dist/src/session/cost/index.d.ts +1 -1
- package/dist/src/session/planning.d.ts +32 -2
- package/dist/src/session/query.d.ts +7 -0
- package/dist/src/session/results/ResultsApi.d.ts +14 -1
- package/dist/src/session/runs/Run.d.ts +65 -4
- package/dist/src/session/runs/RunsApi.d.ts +58 -2
- package/dist/src/session/runs/runId.d.ts +55 -6
- package/dist/src/session/runs/types.d.ts +36 -8
- package/dist/src/session/scope/ElementMask.d.ts +14 -1
- package/dist/src/session/scope/ScopeApi.d.ts +160 -31
- package/dist/src/session/scope/index.d.ts +1 -1
- package/dist/src/session/selection/SelectionApi.d.ts +15 -10
- package/dist/src/session/selection/index.d.ts +1 -1
- package/dist/src/session/selection/targets.d.ts +6 -7
- package/dist/src/session/sets/SetsApi.d.ts +110 -0
- package/dist/src/session/sets/algebra.d.ts +124 -0
- package/dist/src/session/sets/cache.d.ts +197 -0
- package/dist/src/session/sets/captures.d.ts +83 -0
- package/dist/src/session/sets/dependencies.d.ts +167 -0
- package/dist/src/session/sets/layers.d.ts +101 -0
- package/dist/src/session/sets/notify.d.ts +122 -0
- package/dist/src/session/sets/offers.d.ts +103 -0
- package/dist/src/session/sets/path.d.ts +37 -0
- package/dist/src/session/sets/prepare.d.ts +209 -0
- package/dist/src/session/sets/resolve.d.ts +311 -0
- package/dist/src/session/sets/signature.d.ts +77 -0
- package/dist/src/session/sets/status.d.ts +98 -0
- package/dist/src/session/sets/store.d.ts +196 -0
- package/dist/src/session/sets/types.d.ts +386 -0
- package/dist/src/session/styles/Layer.d.ts +9 -2
- package/dist/src/session/styles/StylesApi.d.ts +5 -2
- package/dist/src/session/styles/explain.d.ts +5 -2
- package/dist/src/session/styles/predicate.d.ts +41 -2
- package/dist/src/session/styles/repaint.d.ts +19 -0
- package/dist/src/session/styles/selector.d.ts +16 -5
- package/dist/src/session/types.d.ts +18 -0
- package/dist/src/session/visibility/VisibilityApi.d.ts +47 -3
- package/dist/src/session/visibility/filter.d.ts +86 -51
- package/dist/src/session/visibility/index.d.ts +1 -1
- package/dist/src/testing/fakeAccelerator.d.ts +5 -0
- package/dist/src/utils/queue-migration.d.ts +17 -0
- package/package.json +15 -9
- package/dist/chunks/GraphSession-DuAhRgCd.js +0 -8622
- package/dist/chunks/optionsFromZod-B9RncoTX.js +0 -2578
- package/dist/chunks/scales-CJCRwi2J.js +0 -3220
- package/dist/src/algorithms/utils/index.d.ts +0 -6
|
@@ -187,6 +187,13 @@ export interface LayerCheckOptions {
|
|
|
187
187
|
readonly scales: ScaleRegistry;
|
|
188
188
|
/** Which paths this session answers. Absent means it cannot say, and none are reported. */
|
|
189
189
|
readonly paths?: PathDirectory;
|
|
190
|
+
/**
|
|
191
|
+
* A write door's check of a `{ match: "member" }` selector's scope: session edge ids to stable
|
|
192
|
+
* members, set ids checked as issued. Absent, the scope is taken as given.
|
|
193
|
+
* @param scope - The scope as given.
|
|
194
|
+
* @returns The scope the layer holds.
|
|
195
|
+
*/
|
|
196
|
+
readonly admitScope?: (scope: unknown) => unknown;
|
|
190
197
|
}
|
|
191
198
|
/**
|
|
192
199
|
* What a check produced: the verdict, and the layer itself when there is one.
|
|
@@ -312,12 +319,12 @@ export declare function isElementSource(source: LayerSource): boolean;
|
|
|
312
319
|
* it parses, resolves and refuses, and the session it was asked about is exactly as it was
|
|
313
320
|
* afterwards. Every problem is reported, not the first, because correcting one mistake per round
|
|
314
321
|
* trip is how a form gets abandoned.
|
|
315
|
-
* @param
|
|
322
|
+
* @param given - The layer as it was authored, imported or exported.
|
|
316
323
|
* @param options - The id to give it, what its selector compiles against, the scales it may name,
|
|
317
324
|
* and which paths this session answers.
|
|
318
325
|
* @returns The verdict, and the compiled layer when the verdict is that it is sound.
|
|
319
326
|
*/
|
|
320
|
-
export declare function checkLayerSpec(
|
|
327
|
+
export declare function checkLayerSpec(given: LayerSpec, options: LayerCheckOptions): LayerCheck;
|
|
321
328
|
/**
|
|
322
329
|
* The specification a layer came from, so an update can be expressed as a patch over it.
|
|
323
330
|
* @param layer - The layer.
|
|
@@ -65,7 +65,7 @@ import { type EngineVersions, type ResolvedScope, type Run, type RunOptions, typ
|
|
|
65
65
|
import type { PreparedBinding } from "./encoding";
|
|
66
66
|
import { type EncodingSource, type EncodingSpec } from "./EncodingSpec";
|
|
67
67
|
import { type ExplainTarget, type StyleExplanation, type UnboundLayer } from "./explain";
|
|
68
|
-
import { type CompiledLayer, type Layer, type LayerPosition, type LayerRepaint, type PathDirectory, type RepaintReason, type RepaintReport, type ValidationResult } from "./Layer";
|
|
68
|
+
import { type CompiledLayer, type Layer, type LayerCheckOptions, type LayerPosition, type LayerRepaint, type PathDirectory, type RepaintReason, type RepaintReport, type ValidationResult } from "./Layer";
|
|
69
69
|
import { type FieldWords, type LegendBlock } from "./legend";
|
|
70
70
|
import { type SelectorSource, type SelectorTarget } from "./predicate";
|
|
71
71
|
import { type ScaleRegistry } from "./scales";
|
|
@@ -96,7 +96,8 @@ export interface TemplateReport {
|
|
|
96
96
|
/** The layers that bound and now paint, bottom first. */
|
|
97
97
|
readonly applied: readonly LayerId[];
|
|
98
98
|
/**
|
|
99
|
-
* The layers that read nothing this session answers
|
|
99
|
+
* The layers that read nothing this session answers, and the layers naming a set this project
|
|
100
|
+
* does not hold (detached).
|
|
100
101
|
*
|
|
101
102
|
* They are IN the stack and disabled, never dropped: a layer naming a run that has not been
|
|
102
103
|
* started is a correct layer over a session that will answer it later, and the way to make it
|
|
@@ -399,6 +400,8 @@ export interface StylesSources {
|
|
|
399
400
|
* across a freeze that renumbers the index space.
|
|
400
401
|
*/
|
|
401
402
|
readonly elements: SelectorSource;
|
|
403
|
+
/** See {@link LayerCheckOptions.admitScope}. */
|
|
404
|
+
readonly admitScope?: LayerCheckOptions["admitScope"];
|
|
402
405
|
/**
|
|
403
406
|
* The element's own layers, seeded at the bottom of the stack in the order given.
|
|
404
407
|
*
|
|
@@ -156,8 +156,11 @@ export declare function explainStyle(target: ExplainTarget, sources: ExplainSour
|
|
|
156
156
|
* not been started yet is a correct layer over a session that will answer it later, and a layer
|
|
157
157
|
* imported with a style document may name a column the next dataset does have. What it must never
|
|
158
158
|
* be is invisible -- a confident empty screen reads exactly like a correct answer of zero.
|
|
159
|
-
*
|
|
160
|
-
*
|
|
159
|
+
* A `{match:"member"}` layer whose scope cannot be resolved -- a set this project does not hold --
|
|
160
|
+
* is reported as detached, whatever the directory says.
|
|
161
|
+
* @param sources - The stack and the path directory. With no directory only detached layers are
|
|
162
|
+
* reported.
|
|
163
|
+
* @returns One entry per layer that reads only paths nothing answers or is detached, bottom first.
|
|
161
164
|
*/
|
|
162
165
|
export declare function unboundLayers(sources: ExplainSources): readonly UnboundLayer[];
|
|
163
166
|
/**
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
*
|
|
38
38
|
* Nothing here reaches Babylon.js, Lit or the DOM.
|
|
39
39
|
*/
|
|
40
|
-
import
|
|
40
|
+
import { type U32 } from "@graphty/graph-format";
|
|
41
|
+
import type { EdgeId, NodeId, Path, Query, Scope } from "../../catalog/types";
|
|
41
42
|
/** Which kind of element a selector and its predicate speak about. */
|
|
42
43
|
export type SelectorTarget = "node" | "edge";
|
|
43
44
|
/**
|
|
@@ -128,6 +129,31 @@ export interface SelectorSource {
|
|
|
128
129
|
* @returns The cut, or undefined.
|
|
129
130
|
*/
|
|
130
131
|
readonly topCut?: (path: Path, target: SelectorTarget, n: number) => number | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* The live membership of one scope, which a `{match:"member"}` selector tests by index.
|
|
134
|
+
* Absent, a `{match:"member"}` selector is refused.
|
|
135
|
+
*
|
|
136
|
+
* Asked once, when the layer is compiled; what comes back is read per element and follows the
|
|
137
|
+
* scope as it changes, so the compiled layer never has to be compiled again.
|
|
138
|
+
* @param scope - The scope, already checked.
|
|
139
|
+
* @returns Its live membership.
|
|
140
|
+
*/
|
|
141
|
+
readonly scope?: (scope: Scope) => LiveScope;
|
|
142
|
+
}
|
|
143
|
+
/** The live membership of one scope, as a `{match:"member"}` selector reads it. */
|
|
144
|
+
export interface LiveScope {
|
|
145
|
+
/**
|
|
146
|
+
* The members of one half, as a bitmap over the snapshot the session holds now.
|
|
147
|
+
* @param target - Nodes or edges.
|
|
148
|
+
* @returns The bitmap, or null when the scope paints nothing (detached, or it cannot be
|
|
149
|
+
* evaluated).
|
|
150
|
+
*/
|
|
151
|
+
bits(target: SelectorTarget): U32 | null;
|
|
152
|
+
/**
|
|
153
|
+
* Why the scope paints nothing, when it cannot be resolved.
|
|
154
|
+
* @returns The reason in a sentence, or undefined when it resolves.
|
|
155
|
+
*/
|
|
156
|
+
problem(): string | undefined;
|
|
131
157
|
}
|
|
132
158
|
/**
|
|
133
159
|
* One target's half of a {@link SelectorSource}, resolved once so the predicate never chooses.
|
|
@@ -173,7 +199,7 @@ export type ElementPredicate = (index: number) => boolean;
|
|
|
173
199
|
/** A selector, reduced to the test a repaint runs and the columns that test reads. */
|
|
174
200
|
export interface CompiledSelector {
|
|
175
201
|
/** Which selector kind this was compiled from. */
|
|
176
|
-
readonly match: "everything" | "expression" | "has" | "ids" | "top";
|
|
202
|
+
readonly match: "everything" | "expression" | "has" | "ids" | "top" | "member";
|
|
177
203
|
/** Which kind of element it speaks about. */
|
|
178
204
|
readonly target: SelectorTarget;
|
|
179
205
|
/**
|
|
@@ -194,6 +220,11 @@ export interface CompiledSelector {
|
|
|
194
220
|
* for and leaves the reference check to whoever holds one.
|
|
195
221
|
*/
|
|
196
222
|
readonly paths: readonly Path[];
|
|
223
|
+
/**
|
|
224
|
+
* Why a `{match:"member"}` selector paints nothing, when its scope cannot be resolved (a
|
|
225
|
+
* removed set, a cycle). Absent for every other kind.
|
|
226
|
+
*/
|
|
227
|
+
readonly problem?: () => string | undefined;
|
|
197
228
|
}
|
|
198
229
|
/**
|
|
199
230
|
* Write a column key as a path an expression selector reads back as the same key.
|
|
@@ -256,6 +287,14 @@ export declare function idsPredicate(columns: ElementColumns, ids: ReadonlySet<E
|
|
|
256
287
|
* @returns The test.
|
|
257
288
|
*/
|
|
258
289
|
export declare function topPredicate(columns: ElementColumns, path: Path, cutOf: () => number | undefined): ElementPredicate;
|
|
290
|
+
/**
|
|
291
|
+
* The predicate for `{match:"member"}`: one bit test by index against the scope's live bitmap,
|
|
292
|
+
* read per element so the layer follows the scope without being compiled again.
|
|
293
|
+
* @param live - The scope's live membership.
|
|
294
|
+
* @param target - Which half the layer paints.
|
|
295
|
+
* @returns The test.
|
|
296
|
+
*/
|
|
297
|
+
export declare function scopePredicate(live: LiveScope, target: SelectorTarget): ElementPredicate;
|
|
259
298
|
/**
|
|
260
299
|
* Parse and compile `{match:"expression"}`.
|
|
261
300
|
*
|
|
@@ -299,6 +299,25 @@ export interface RepaintEngine extends ElementPaint {
|
|
|
299
299
|
* this: the record is what lets a removed run's layer take its paint back.
|
|
300
300
|
*/
|
|
301
301
|
renumbered(): void;
|
|
302
|
+
/**
|
|
303
|
+
* Repaint named elements from the whole stack, because what a layer matches moved without the
|
|
304
|
+
* layer changing: a `{match:"member"}` layer whose set was redefined repaints exactly the
|
|
305
|
+
* elements that entered or left it (design/sets 11).
|
|
306
|
+
*
|
|
307
|
+
* Indices at or past the element count are skipped, and repeats are painted once.
|
|
308
|
+
* @param stack - The stack to paint from, bottom first.
|
|
309
|
+
* @param dirty - The dense indices to repaint, per kind of element.
|
|
310
|
+
* @param context - The signal to stop on and the progress channel.
|
|
311
|
+
* @returns How much was painted.
|
|
312
|
+
*/
|
|
313
|
+
repaintElements(stack: readonly CompiledLayer[], dirty: ElementIndices, context: RepaintContext): Promise<RepaintReport>;
|
|
314
|
+
}
|
|
315
|
+
/** Dense indices per kind of element. */
|
|
316
|
+
export interface ElementIndices {
|
|
317
|
+
/** Node indices. */
|
|
318
|
+
readonly node: ArrayLike<number>;
|
|
319
|
+
/** Edge indices. */
|
|
320
|
+
readonly edge: ArrayLike<number>;
|
|
302
321
|
}
|
|
303
322
|
/**
|
|
304
323
|
* Build the repaint one session paints through.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @file What a style layer paints: the
|
|
3
|
-
*
|
|
2
|
+
* @file What a style layer paints: the selector kinds, and the one call that turns one into the
|
|
3
|
+
* closure a repaint runs.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* `{match:"has"}` is a column presence test, `{match:"ids"}` is a set membership test,
|
|
5
|
+
* THE SPLIT IS THE POINT. Only `{match:"expression"}` reaches an evaluator.
|
|
6
|
+
* `{match:"has"}` is a column presence test, `{match:"ids"}` is a set membership test,
|
|
7
|
+
* `{match:"member"}` is one bit test against a scope's live bitmap, and
|
|
7
8
|
* `{match:"everything"}` is no test at all. Measured on this machine, the presence test costs
|
|
8
9
|
* 7.3 ns per element against 1,322 ns for a `jmespath.search()` call, so the kind a layer is
|
|
9
10
|
* written in is a performance decision and not only an ergonomic one. That is why `encode()`
|
|
@@ -30,13 +31,15 @@
|
|
|
30
31
|
*
|
|
31
32
|
* Nothing here reaches Babylon.js, Lit or the DOM.
|
|
32
33
|
*/
|
|
33
|
-
import type { EdgeId, NodeId, Path, Query } from "../../catalog/types";
|
|
34
|
+
import type { EdgeId, NodeId, Path, Query, Scope } from "../../catalog/types";
|
|
34
35
|
import { type CompiledSelector, type SelectorSource, type SelectorTarget } from "./predicate";
|
|
35
36
|
/**
|
|
36
37
|
* Which elements a layer paints.
|
|
37
38
|
*
|
|
38
39
|
* Read the file's opening note before adding a kind: the union is small because each member is a
|
|
39
40
|
* different COST, not a different spelling of the same question.
|
|
41
|
+
*
|
|
42
|
+
* OPEN UNION: kinds may be added in a minor release; handle unknown kinds.
|
|
40
43
|
*/
|
|
41
44
|
export type Selector =
|
|
42
45
|
/** Every element the layer's target names. The only universal match, and it is written out. */
|
|
@@ -79,6 +82,14 @@ export type Selector =
|
|
|
79
82
|
readonly match: "top";
|
|
80
83
|
readonly path: Path;
|
|
81
84
|
readonly n: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* The members of a scope, usually a kept set. One bit test per element against the scope's
|
|
88
|
+
* live bitmap, which follows the set; a scope that cannot be resolved paints nothing.
|
|
89
|
+
*/
|
|
90
|
+
| {
|
|
91
|
+
readonly match: "member";
|
|
92
|
+
readonly of: Scope;
|
|
82
93
|
};
|
|
83
94
|
/**
|
|
84
95
|
* Turn a selector into the predicate a repaint runs.
|
|
@@ -26,6 +26,7 @@ import type { ResultsApi } from "./results";
|
|
|
26
26
|
import type { Caveats, EngineVersions, Run, RunChange, RunExecutor, RunOptions, RunQueue, RunsApi } from "./runs";
|
|
27
27
|
import type { ScopeApi } from "./scope/index";
|
|
28
28
|
import type { SelectionApi, SelectionDelta, SelectionOwner } from "./selection";
|
|
29
|
+
import type { SetChange, SetsApi } from "./sets/types";
|
|
29
30
|
import type { ElementPaint, SessionStylesApi, StyleChange, StylesApi } from "./styles";
|
|
30
31
|
import type { SessionVisibilityApi, VisibilityApi, VisibilityChange } from "./visibility";
|
|
31
32
|
/**
|
|
@@ -424,6 +425,14 @@ export interface SessionEventMap {
|
|
|
424
425
|
"capabilities:changed": {
|
|
425
426
|
readonly capabilities: AccelerationCapabilities;
|
|
426
427
|
};
|
|
428
|
+
/**
|
|
429
|
+
* A kept set was created, renamed, redefined or removed: one event per set a write touched,
|
|
430
|
+
* after the write committed. A write that was refused publishes nothing.
|
|
431
|
+
*
|
|
432
|
+
* Membership has no event: a set's members follow the data lazily, so a panel showing counts
|
|
433
|
+
* re-reads them on the events it already watches and on this one.
|
|
434
|
+
*/
|
|
435
|
+
"set:changed": SetChange;
|
|
427
436
|
}
|
|
428
437
|
/**
|
|
429
438
|
* A painting the element started for itself, and why it did not land.
|
|
@@ -460,6 +469,15 @@ export interface GraphSession {
|
|
|
460
469
|
* it without resolving it, and keeping one under a name.
|
|
461
470
|
*/
|
|
462
471
|
readonly scope: ScopeApi;
|
|
472
|
+
/**
|
|
473
|
+
* The kept sets: named collections of nodes and edges -- groups, kept selections, communities
|
|
474
|
+
* and paths -- that anything taking a scope can name as `{ set: id }`.
|
|
475
|
+
*
|
|
476
|
+
* A set is fixed (a member list), a rule (a query or rule tree that follows the data) or a
|
|
477
|
+
* path (an ordered walk). Reading and counting one goes through `scope.resolve({ set: id })`
|
|
478
|
+
* and `scope.count({ set: id })`; every change is published as `set:changed`.
|
|
479
|
+
*/
|
|
480
|
+
readonly sets: SetsApi;
|
|
463
481
|
/**
|
|
464
482
|
* What is selected: two sets, five set operations, one selection for the whole session.
|
|
465
483
|
*
|
|
@@ -44,7 +44,9 @@ import { type GraphSnapshot } from "@graphty/graph-format";
|
|
|
44
44
|
import type { EdgeId, NodeId, Path, Scope } from "../../catalog/types";
|
|
45
45
|
import { type EngineVersions, type ResolvedScope, type Run, type RunOptions, type RunQueue } from "../runs";
|
|
46
46
|
import { type ScopeVisibilitySource } from "../scope/index";
|
|
47
|
-
import { type
|
|
47
|
+
import { type DependencySources } from "../sets/dependencies";
|
|
48
|
+
import type { SetWatch } from "../sets/notify";
|
|
49
|
+
import { type FilterSources, type RuleTree, type TimeWindow } from "./filter";
|
|
48
50
|
/**
|
|
49
51
|
* How much of the graph is showing, which is what a status bar reads.
|
|
50
52
|
*
|
|
@@ -143,7 +145,7 @@ export interface VisibilityApi {
|
|
|
143
145
|
/** How much of the graph is showing. */
|
|
144
146
|
readonly summary: VisibilitySummary;
|
|
145
147
|
/** The filter in force, or null when no filter is hiding anything. */
|
|
146
|
-
readonly filter:
|
|
148
|
+
readonly filter: RuleTree | null;
|
|
147
149
|
/** The time window in force, or null when no window is hiding anything. */
|
|
148
150
|
readonly window: TimeWindow | null;
|
|
149
151
|
/**
|
|
@@ -165,7 +167,7 @@ export interface VisibilityApi {
|
|
|
165
167
|
* @returns The run, which resolves with the counts.
|
|
166
168
|
* @throws A `GraphtyError` when the filter is malformed or needs something this session lacks.
|
|
167
169
|
*/
|
|
168
|
-
set(filter:
|
|
170
|
+
set(filter: RuleTree | null, options?: RunOptions): Run<FilterResult>;
|
|
169
171
|
/**
|
|
170
172
|
* Apply a time window, or clear it with null.
|
|
171
173
|
*
|
|
@@ -240,6 +242,47 @@ export interface VisibilitySources extends FilterSources {
|
|
|
240
242
|
* @param change - The counts, the unresolved paths, and what produced the change.
|
|
241
243
|
*/
|
|
242
244
|
readonly onChange?: (change: VisibilityChange) => void;
|
|
245
|
+
/** Called on every version bump of either mask, which is what advances the session input tick. */
|
|
246
|
+
readonly onMaskVersion?: () => void;
|
|
247
|
+
/**
|
|
248
|
+
* Where the sets a `member` leaf names are looked up, so a filter that reads `"visible"` or
|
|
249
|
+
* `"search"` through them is refused, and a pass never reads the masks it is writing.
|
|
250
|
+
*/
|
|
251
|
+
readonly dependencies?: DependencySources;
|
|
252
|
+
/**
|
|
253
|
+
* A write door's check of a filter: session edge ids inside a `member` leaf's inline
|
|
254
|
+
* definition to stable members, and every set id it names checked as issued. Absent, the
|
|
255
|
+
* filter is taken as given.
|
|
256
|
+
* @param filter - The filter as given.
|
|
257
|
+
* @returns The filter to hold.
|
|
258
|
+
*/
|
|
259
|
+
readonly admit?: (filter: RuleTree) => RuleTree;
|
|
260
|
+
/**
|
|
261
|
+
* How the filter follows the sets its `scope` leaves name (design/sets 11). Absent, a filter
|
|
262
|
+
* is re-evaluated only when it is set again or the snapshot moves.
|
|
263
|
+
*/
|
|
264
|
+
readonly watch?: FilterWatchSources;
|
|
265
|
+
}
|
|
266
|
+
/** What the filter follows its sets through: the session's change notifier and cache. */
|
|
267
|
+
interface FilterWatchSources {
|
|
268
|
+
/**
|
|
269
|
+
* Watch through the session's notifier.
|
|
270
|
+
* @param watch - The watch; it resolves to whether the masks were re-evaluated.
|
|
271
|
+
* @returns Stops watching.
|
|
272
|
+
*/
|
|
273
|
+
subscribe(watch: SetWatch<boolean>): () => void;
|
|
274
|
+
/**
|
|
275
|
+
* A scope's input signature now.
|
|
276
|
+
* @param scope - The scope.
|
|
277
|
+
* @returns The signature, or null when its inputs cannot be enumerated.
|
|
278
|
+
*/
|
|
279
|
+
signature(scope: Scope): string | null;
|
|
280
|
+
/**
|
|
281
|
+
* Pin a scope's cache entry, so budget pressure never evicts what the filter shows.
|
|
282
|
+
* @param scope - The scope.
|
|
283
|
+
* @returns Releases the pin.
|
|
284
|
+
*/
|
|
285
|
+
pin(scope: Scope): () => void;
|
|
243
286
|
}
|
|
244
287
|
/**
|
|
245
288
|
* Build the visibility model one session holds.
|
|
@@ -252,3 +295,4 @@ export interface VisibilitySources extends FilterSources {
|
|
|
252
295
|
* @returns The visibility model, including the masks the scope resolver reads.
|
|
253
296
|
*/
|
|
254
297
|
export declare function createVisibilityApi(sources: VisibilitySources): SessionVisibilityApi;
|
|
298
|
+
export {};
|
|
@@ -37,56 +37,11 @@
|
|
|
37
37
|
*
|
|
38
38
|
* Nothing here reaches Babylon.js, Lit or the DOM.
|
|
39
39
|
*/
|
|
40
|
-
import { type GraphSnapshot } from "@graphty/graph-format";
|
|
41
|
-
import type { EdgeId, NodeId, Path, Query } from "../../catalog/types";
|
|
40
|
+
import { type GraphSnapshot, type U32 } from "@graphty/graph-format";
|
|
41
|
+
import type { EdgeId, NodeId, Path, Query, ResultItem, RuleTree, RunId, Scope } from "../../catalog/types";
|
|
42
42
|
import { type ComponentLabels, type ElementMask } from "../scope/index";
|
|
43
|
-
|
|
44
|
-
export type
|
|
45
|
-
/**
|
|
46
|
-
* What to keep.
|
|
47
|
-
*
|
|
48
|
-
* Ten kinds, of which eight speak about nodes, one (`edges`) speaks about edges, and three
|
|
49
|
-
* (`all`, `any`, `not`) combine the others. A group with no members constrains nothing: an empty
|
|
50
|
-
* list in a form means "nothing chosen", not "nothing allowed", and a filter builder that blanked
|
|
51
|
-
* the graph the moment its last chip was removed would be unusable.
|
|
52
|
-
*/
|
|
53
|
-
export type Filter = {
|
|
54
|
-
readonly kind: "expression";
|
|
55
|
-
readonly where: Query;
|
|
56
|
-
} | {
|
|
57
|
-
readonly kind: "range";
|
|
58
|
-
readonly attribute: Path;
|
|
59
|
-
readonly min?: number;
|
|
60
|
-
readonly max?: number;
|
|
61
|
-
} | {
|
|
62
|
-
readonly kind: "categories";
|
|
63
|
-
readonly attribute: Path;
|
|
64
|
-
readonly values: readonly string[];
|
|
65
|
-
} | {
|
|
66
|
-
readonly kind: "degree";
|
|
67
|
-
readonly min?: number;
|
|
68
|
-
readonly max?: number;
|
|
69
|
-
readonly direction?: FilterDirection;
|
|
70
|
-
} | {
|
|
71
|
-
readonly kind: "component";
|
|
72
|
-
readonly id: number;
|
|
73
|
-
} | {
|
|
74
|
-
readonly kind: "neighborhood";
|
|
75
|
-
readonly seeds: readonly NodeId[];
|
|
76
|
-
readonly depth: number;
|
|
77
|
-
} | {
|
|
78
|
-
readonly kind: "edges";
|
|
79
|
-
readonly where: Query;
|
|
80
|
-
} | {
|
|
81
|
-
readonly kind: "all";
|
|
82
|
-
readonly of: readonly Filter[];
|
|
83
|
-
} | {
|
|
84
|
-
readonly kind: "any";
|
|
85
|
-
readonly of: readonly Filter[];
|
|
86
|
-
} | {
|
|
87
|
-
readonly kind: "not";
|
|
88
|
-
readonly of: Filter;
|
|
89
|
-
};
|
|
43
|
+
import { type DependencySources } from "../sets/dependencies";
|
|
44
|
+
export type { RuleTree } from "../../catalog/types";
|
|
90
45
|
/** How wide a step a time window advances by, when something advances it. */
|
|
91
46
|
export type TimeStep = number | "hour" | "day" | "week" | "month" | "quarter" | "year";
|
|
92
47
|
/**
|
|
@@ -170,6 +125,66 @@ export interface FilterSources {
|
|
|
170
125
|
* @returns The unresolved paths.
|
|
171
126
|
*/
|
|
172
127
|
readonly unresolvedPathsOf?: (where: Query) => readonly Path[];
|
|
128
|
+
/**
|
|
129
|
+
* What a `member` leaf's set covers. Absent refuses a `member` leaf.
|
|
130
|
+
* @param scope - The referenced set.
|
|
131
|
+
* @returns Its node half, and its edge half when its reading speaks edges.
|
|
132
|
+
*/
|
|
133
|
+
readonly scope?: (scope: Scope) => ScopeLeaf;
|
|
134
|
+
/**
|
|
135
|
+
* A run's current result, as `item` and `threshold` leaves read it. Absent refuses both over
|
|
136
|
+
* `results.*`; a run it does not know leaves the leaf holding nothing.
|
|
137
|
+
* @param run - The run.
|
|
138
|
+
* @returns The result, or undefined when the run has none.
|
|
139
|
+
*/
|
|
140
|
+
readonly result?: (run: RunId) => FilterRunResult | undefined;
|
|
141
|
+
/**
|
|
142
|
+
* What a held item's execution held, captured when its run re-executed, as bitmaps over the
|
|
143
|
+
* snapshot (design/sets 5.2). Absent, or undefined for an item: nothing was captured, and a
|
|
144
|
+
* held execution that is no longer current holds nothing.
|
|
145
|
+
* @param item - The item, with its execution.
|
|
146
|
+
* @returns Its node bitmap when its field lives on nodes, its edge bitmap when on edges.
|
|
147
|
+
*/
|
|
148
|
+
readonly captured?: (item: ResultItem) => CapturedHalves | undefined;
|
|
149
|
+
}
|
|
150
|
+
/** A captured item's members over the snapshot: null for a half the item's field does not live on. */
|
|
151
|
+
export interface CapturedHalves {
|
|
152
|
+
readonly nodes: U32 | null;
|
|
153
|
+
readonly edges: U32 | null;
|
|
154
|
+
}
|
|
155
|
+
/** A run's current result, as the compiler reads it. */
|
|
156
|
+
export interface FilterRunResult {
|
|
157
|
+
/** The token of the execution these values belong to; compared for equality only. */
|
|
158
|
+
readonly execution: string | undefined;
|
|
159
|
+
/** Which fields the result publishes per node, per edge or for the graph. */
|
|
160
|
+
readonly fields: readonly {
|
|
161
|
+
readonly name: string;
|
|
162
|
+
readonly kind: "node" | "edge" | "graph";
|
|
163
|
+
}[];
|
|
164
|
+
/**
|
|
165
|
+
* One node's value for a field.
|
|
166
|
+
* @param index - The dense node index.
|
|
167
|
+
* @param field - The field.
|
|
168
|
+
* @returns The value, or undefined when the node carries none.
|
|
169
|
+
*/
|
|
170
|
+
nodeValue(index: number, field: string): unknown;
|
|
171
|
+
/**
|
|
172
|
+
* One edge's value for a field.
|
|
173
|
+
* @param index - The dense (logical) edge index.
|
|
174
|
+
* @param field - The field.
|
|
175
|
+
* @returns The value, or undefined when the edge carries none.
|
|
176
|
+
*/
|
|
177
|
+
edgeValue(index: number, field: string): unknown;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* What a `member` leaf speaks: the referenced set's nodes, and its edges only when the set is read
|
|
181
|
+
* `listed` or `clipped`. `edges: null` is silent, exactly as a node leaf is.
|
|
182
|
+
*/
|
|
183
|
+
export interface ScopeLeaf {
|
|
184
|
+
/** Node bitmap over the snapshot. */
|
|
185
|
+
readonly nodes: U32;
|
|
186
|
+
/** Edge bitmap over the snapshot, or null when the set is read `induced`. */
|
|
187
|
+
readonly edges: U32 | null;
|
|
173
188
|
}
|
|
174
189
|
/** Whether one element, named by its dense index, passes a test. */
|
|
175
190
|
export type ElementTest = (index: number) => boolean;
|
|
@@ -198,9 +213,29 @@ export interface CompiledVisibility {
|
|
|
198
213
|
* Check a filter and a window before anything starts working on them.
|
|
199
214
|
* @param filter - The filter, or null for none.
|
|
200
215
|
* @param window - The time window, or null for none.
|
|
216
|
+
* @param dependencies - Where the references a `member` leaf makes are looked up, so a filter that
|
|
217
|
+
* reaches `"visible"` or `"search"` through kept sets is refused (`details.reason: "cycle"`), and
|
|
218
|
+
* one whose item follows a partition group (`"follow-group"`).
|
|
201
219
|
* @throws A `GraphtyError` when either is malformed.
|
|
202
220
|
*/
|
|
203
|
-
export declare function assertVisibility(filter:
|
|
221
|
+
export declare function assertVisibility(filter: RuleTree | null, window: TimeWindow | null, dependencies?: DependencySources): void;
|
|
222
|
+
/** One filter's two halves, before they are folded together. */
|
|
223
|
+
export interface CompiledHalves {
|
|
224
|
+
/** The node test, or null when this filter says nothing about nodes. */
|
|
225
|
+
readonly node: ElementTest | null;
|
|
226
|
+
/** The edge test, or null when this filter says nothing about edges. */
|
|
227
|
+
readonly edge: ElementTest | null;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Compile a rule tree into its two halves, for a rule set: the same compiler the visibility
|
|
231
|
+
* filter runs, so a rule and a filter can never disagree. The tree is already validated.
|
|
232
|
+
* @param graph - The snapshot every test is written against.
|
|
233
|
+
* @param filter - The tree.
|
|
234
|
+
* @param sources - Where to read what the compiler cannot compute.
|
|
235
|
+
* @returns The node test and the edge test, either null when the tree is silent about it.
|
|
236
|
+
* @throws A `GraphtyError` when the tree needs a capability the sources lack.
|
|
237
|
+
*/
|
|
238
|
+
export declare function compileFilter(graph: GraphSnapshot, filter: RuleTree, sources: FilterSources): CompiledHalves;
|
|
204
239
|
/**
|
|
205
240
|
* Turn a filter and a time window into the two tests a pass runs.
|
|
206
241
|
*
|
|
@@ -219,7 +254,7 @@ export declare function assertVisibility(filter: Filter | null, window: TimeWind
|
|
|
219
254
|
* @returns The compiled tests, and the door to the unresolved paths once a pass has run.
|
|
220
255
|
* @throws A `GraphtyError` when either is malformed or needs a capability this session lacks.
|
|
221
256
|
*/
|
|
222
|
-
export declare function compileVisibility(graph: GraphSnapshot, filter:
|
|
257
|
+
export declare function compileVisibility(graph: GraphSnapshot, filter: RuleTree | null, window: TimeWindow | null, sources: FilterSources): CompiledVisibility;
|
|
223
258
|
/** Everything one pass of the compiled tests writes into. */
|
|
224
259
|
export interface VisibilityPass {
|
|
225
260
|
/** The snapshot the tests were compiled against. */
|
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
*
|
|
13
13
|
* Nothing in this module's import graph reaches Babylon.js, Lit or the DOM.
|
|
14
14
|
*/
|
|
15
|
-
export { assertVisibility, type CompiledVisibility, compileVisibility, type ElementTest, type
|
|
15
|
+
export { assertVisibility, type CompiledVisibility, compileVisibility, type ElementTest, type FilterSources, type FilterValueSource, type RuleTree, runPass, runPassInSlices, type TimeStep, type TimeWindow, type VisibilityPass, } from "./filter";
|
|
16
16
|
export { createVisibilityApi, type FilterResult, type SessionVisibilityApi, type VisibilityApi, type VisibilityChange, type VisibilitySources, type VisibilitySummary, } from "./VisibilityApi";
|
|
@@ -66,6 +66,11 @@ interface FakeAcceleratorCalls {
|
|
|
66
66
|
dispose: number;
|
|
67
67
|
/** The snapshots handed to `release()`, in call order. */
|
|
68
68
|
release: GraphSnapshot[];
|
|
69
|
+
/**
|
|
70
|
+
* The snapshots handed to an algorithm member, in call order: what a real accelerator would
|
|
71
|
+
* have uploaded and keeps resident until it is released. A release test compares the two.
|
|
72
|
+
*/
|
|
73
|
+
uploaded: GraphSnapshot[];
|
|
69
74
|
/** How many times a simulation was loaded. */
|
|
70
75
|
load: number;
|
|
71
76
|
/** How many batches were SUBMITTED; a coalesced `step()` does not count. */
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ScopeInput } from "../catalog/types";
|
|
1
2
|
import type { OperationCategory } from "../managers/OperationQueueManager";
|
|
2
3
|
export interface QueueableOptions {
|
|
3
4
|
/**
|
|
@@ -17,6 +18,22 @@ export interface QueueableOptions {
|
|
|
17
18
|
*/
|
|
18
19
|
respectProgress?: boolean;
|
|
19
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* What `setLayout` accepts as its third argument: the queue options, and what the layout runs over.
|
|
23
|
+
*/
|
|
24
|
+
export interface SetLayoutOptions extends QueueableOptions {
|
|
25
|
+
/**
|
|
26
|
+
* What the layout runs over. The scope's nodes move and every other node is held still; a node
|
|
27
|
+
* added after the layout starts is held too, because the members are the ones the scope had
|
|
28
|
+
* when the layout started.
|
|
29
|
+
*
|
|
30
|
+
* CARRIED: absent keeps the scope the last layout ran over, so changing one option never
|
|
31
|
+
* un-scopes a layout; `"graph"` clears it. Only a live simulation accepts one -- a layout
|
|
32
|
+
* whose catalogue entry reads `scoped: false` refuses it with `E_UNSUPPORTED` -- and a scope
|
|
33
|
+
* that is malformed or names a removed set is refused with `E_BAD_COMMAND`.
|
|
34
|
+
*/
|
|
35
|
+
scope?: ScopeInput;
|
|
36
|
+
}
|
|
20
37
|
/**
|
|
21
38
|
* Algorithm-specific options (source, target, startNode, etc.)
|
|
22
39
|
* These are passed through to the algorithm's configure method.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphty/graphty-element",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.1",
|
|
4
4
|
"description": "A Web Component library for 3D/2D graph visualization built with Lit and Babylon.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"customElements": "./dist/custom-elements.json",
|
|
@@ -115,26 +115,31 @@
|
|
|
115
115
|
"@types/lodash": "^4.17.19",
|
|
116
116
|
"@types/papaparse": "^5.5.0",
|
|
117
117
|
"@types/toposort": "^2.0.7",
|
|
118
|
+
"@vitest/browser-playwright": "4.1.11",
|
|
118
119
|
"ai": "^5.0.104",
|
|
119
120
|
"encrypt-storage": "^2.14.7",
|
|
121
|
+
"eslint": "^9.29.0",
|
|
120
122
|
"eslint-plugin-jsdoc": "^50.6.17",
|
|
121
123
|
"fast-check": "^4.2.0",
|
|
122
124
|
"iwer": "^2.1.1",
|
|
123
125
|
"lit": "^3.3.1",
|
|
124
126
|
"lodash": "^4.17.21",
|
|
125
127
|
"ngraph.random": "^1.2.0",
|
|
126
|
-
"pngjs": "^7.0.0",
|
|
127
128
|
"storybook": "^9.1.20",
|
|
129
|
+
"tsx": "^4.21.0",
|
|
128
130
|
"typedoc": "^0.28.15",
|
|
129
131
|
"typedoc-plugin-markdown": "^4.9.0",
|
|
130
132
|
"typedoc-vitepress-theme": "^1.1.2",
|
|
131
133
|
"typescript": "^5.9.3",
|
|
134
|
+
"typescript-eslint": "^8.34.1",
|
|
135
|
+
"vite": "^7.0.0",
|
|
132
136
|
"vite-plugin-cem": "^0.8.2",
|
|
133
137
|
"vite-plugin-eslint": "^1.8.1",
|
|
134
138
|
"vitepress": "^1.6.3",
|
|
135
|
-
"vitest": "
|
|
136
|
-
"@graphty/remote-logger": "^1.3.
|
|
137
|
-
"@graphty/
|
|
139
|
+
"vitest": "4.1.11",
|
|
140
|
+
"@graphty/remote-logger": "^1.3.10",
|
|
141
|
+
"@graphty/graph-samples": "^0.1.6",
|
|
142
|
+
"@graphty/webgpu-graph-algorithms": "^0.6.11"
|
|
138
143
|
},
|
|
139
144
|
"peerDependencies": {
|
|
140
145
|
"@ai-sdk/anthropic": "^2.0.50",
|
|
@@ -146,7 +151,7 @@
|
|
|
146
151
|
"ai": "^5.0.104",
|
|
147
152
|
"encrypt-storage": "^2.14.7",
|
|
148
153
|
"lit": "^3.0.0",
|
|
149
|
-
"@graphty/webgpu-graph-algorithms": "^0.6.
|
|
154
|
+
"@graphty/webgpu-graph-algorithms": "^0.6.11"
|
|
150
155
|
},
|
|
151
156
|
"peerDependenciesMeta": {
|
|
152
157
|
"@ai-sdk/anthropic": {
|
|
@@ -184,9 +189,9 @@
|
|
|
184
189
|
"papaparse": "^5.5.3",
|
|
185
190
|
"toposort": "^2.0.2",
|
|
186
191
|
"zod": "^3.25.28",
|
|
187
|
-
"@graphty/
|
|
188
|
-
"@graphty/
|
|
189
|
-
"@graphty/layout": "^1.10.
|
|
192
|
+
"@graphty/graph-format": "^1.1.1",
|
|
193
|
+
"@graphty/algorithms": "^2.1.1",
|
|
194
|
+
"@graphty/layout": "^1.10.4"
|
|
190
195
|
},
|
|
191
196
|
"overrides": {
|
|
192
197
|
"storybook": "$storybook"
|
|
@@ -245,6 +250,7 @@
|
|
|
245
250
|
"coverage:fast": "vitest run --project=default --coverage",
|
|
246
251
|
"coverage:preview": "npx serve coverage -p ${PORT:?start it through servherd, which sets PORT}",
|
|
247
252
|
"lint": "eslint && tsc --noEmit && npm run typecheck:strict-consumer",
|
|
253
|
+
"benchmark": "tsx benchmarks/run.ts",
|
|
248
254
|
"typecheck:strict-consumer": "tsc -p tsconfig.strict-consumer.json",
|
|
249
255
|
"lint:fix": "eslint --fix",
|
|
250
256
|
"lint:knip": "cd .. && ./tools/run-knip.sh --workspace graphty-element",
|