@dxos/graph 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6
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/lib/browser/index.mjs +13 -13
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +13 -13
- package/dist/lib/node-esm/index.mjs.map +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/Graph.d.ts.map +1 -1
- package/dist/types/src/GraphModel.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/src/Graph.ts +2 -0
- package/src/GraphModel.ts +2 -0
|
@@ -142,7 +142,7 @@ var KEY_REGEX = /\w+/;
|
|
|
142
142
|
var createEdgeId = ({ source, target, relation }) => {
|
|
143
143
|
invariant2(source.match(KEY_REGEX), `invalid source: ${source}`, {
|
|
144
144
|
F: __dxlog_file2,
|
|
145
|
-
L:
|
|
145
|
+
L: 54,
|
|
146
146
|
S: void 0,
|
|
147
147
|
A: [
|
|
148
148
|
"source.match(KEY_REGEX)",
|
|
@@ -151,7 +151,7 @@ var createEdgeId = ({ source, target, relation }) => {
|
|
|
151
151
|
});
|
|
152
152
|
invariant2(target.match(KEY_REGEX), `invalid target: ${target}`, {
|
|
153
153
|
F: __dxlog_file2,
|
|
154
|
-
L:
|
|
154
|
+
L: 55,
|
|
155
155
|
S: void 0,
|
|
156
156
|
A: [
|
|
157
157
|
"target.match(KEY_REGEX)",
|
|
@@ -168,7 +168,7 @@ var parseEdgeId = (id) => {
|
|
|
168
168
|
const [source, relation, target] = id.split("_");
|
|
169
169
|
invariant2(source.length && target.length, void 0, {
|
|
170
170
|
F: __dxlog_file2,
|
|
171
|
-
L:
|
|
171
|
+
L: 61,
|
|
172
172
|
S: void 0,
|
|
173
173
|
A: [
|
|
174
174
|
"source.length && target.length",
|
|
@@ -320,7 +320,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
320
320
|
addNode(node) {
|
|
321
321
|
invariant3(node.id, "ID is required", {
|
|
322
322
|
F: __dxlog_file3,
|
|
323
|
-
L:
|
|
323
|
+
L: 184,
|
|
324
324
|
S: this,
|
|
325
325
|
A: [
|
|
326
326
|
"node.id",
|
|
@@ -329,7 +329,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
329
329
|
});
|
|
330
330
|
invariant3(!this.findNode(node.id), `node already exists: ${node.id}`, {
|
|
331
331
|
F: __dxlog_file3,
|
|
332
|
-
L:
|
|
332
|
+
L: 185,
|
|
333
333
|
S: this,
|
|
334
334
|
A: [
|
|
335
335
|
"!this.findNode(node.id)",
|
|
@@ -347,7 +347,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
347
347
|
addEdge(edge) {
|
|
348
348
|
invariant3(edge.source, void 0, {
|
|
349
349
|
F: __dxlog_file3,
|
|
350
|
-
L:
|
|
350
|
+
L: 197,
|
|
351
351
|
S: this,
|
|
352
352
|
A: [
|
|
353
353
|
"edge.source",
|
|
@@ -356,7 +356,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
356
356
|
});
|
|
357
357
|
invariant3(edge.target, void 0, {
|
|
358
358
|
F: __dxlog_file3,
|
|
359
|
-
L:
|
|
359
|
+
L: 198,
|
|
360
360
|
S: this,
|
|
361
361
|
A: [
|
|
362
362
|
"edge.target",
|
|
@@ -371,7 +371,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
371
371
|
}
|
|
372
372
|
invariant3(!this.findNode(edge.id), void 0, {
|
|
373
373
|
F: __dxlog_file3,
|
|
374
|
-
L:
|
|
374
|
+
L: 203,
|
|
375
375
|
S: this,
|
|
376
376
|
A: [
|
|
377
377
|
"!this.findNode(edge.id!)",
|
|
@@ -506,7 +506,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
506
506
|
addNode(node) {
|
|
507
507
|
invariant3(node.id, "ID is required", {
|
|
508
508
|
F: __dxlog_file3,
|
|
509
|
-
L:
|
|
509
|
+
L: 376,
|
|
510
510
|
S: this,
|
|
511
511
|
A: [
|
|
512
512
|
"node.id",
|
|
@@ -515,7 +515,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
515
515
|
});
|
|
516
516
|
invariant3(!this.findNode(node.id), `node already exists: ${node.id}`, {
|
|
517
517
|
F: __dxlog_file3,
|
|
518
|
-
L:
|
|
518
|
+
L: 377,
|
|
519
519
|
S: this,
|
|
520
520
|
A: [
|
|
521
521
|
"!this.findNode(node.id)",
|
|
@@ -535,7 +535,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
535
535
|
addEdge(edge) {
|
|
536
536
|
invariant3(edge.source, void 0, {
|
|
537
537
|
F: __dxlog_file3,
|
|
538
|
-
L:
|
|
538
|
+
L: 387,
|
|
539
539
|
S: this,
|
|
540
540
|
A: [
|
|
541
541
|
"edge.source",
|
|
@@ -544,7 +544,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
544
544
|
});
|
|
545
545
|
invariant3(edge.target, void 0, {
|
|
546
546
|
F: __dxlog_file3,
|
|
547
|
-
L:
|
|
547
|
+
L: 388,
|
|
548
548
|
S: this,
|
|
549
549
|
A: [
|
|
550
550
|
"edge.target",
|
|
@@ -559,7 +559,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
559
559
|
}
|
|
560
560
|
invariant3(!this.findNode(edge.id), void 0, {
|
|
561
561
|
F: __dxlog_file3,
|
|
562
|
-
L:
|
|
562
|
+
L: 392,
|
|
563
563
|
S: this,
|
|
564
564
|
A: [
|
|
565
565
|
"!this.findNode(edge.id!)",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/selection.ts", "../../../src/Graph.ts", "../../../src/GraphModel.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _registry: Registry.Registry;\n private readonly _selected: Atom.Writable<Set<string>>;\n\n constructor(private readonly _singleSelect: boolean = false) {\n this._registry = Registry.make();\n this._selected = Atom.make<Set<string>>(new Set<string>());\n }\n\n /**\n * Returns the selected IDs atom for subscription.\n */\n get selected(): Atom.Atom<Set<string>> {\n return this._selected;\n }\n\n /**\n * Gets the current selected IDs as a Set.\n */\n getSelected(): Set<string> {\n return this._registry.get(this._selected);\n }\n\n /**\n * Gets the current selected IDs as an array.\n */\n getSelectedIds(): string[] {\n return Array.from(this._registry.get(this._selected).values());\n }\n\n /**\n * Subscribe to selection changes.\n */\n subscribe(cb: (selected: Set<string>) => void): () => void {\n // Prime the atom by reading before subscribing.\n this._registry.get(this._selected);\n\n return this._registry.subscribe(this._selected, () => {\n cb(this._registry.get(this._selected));\n });\n }\n\n toJSON(): { selected: string[] } {\n return {\n selected: this.getSelectedIds(),\n };\n }\n\n /**\n * Gets the current selection size.\n */\n getSize(): number {\n return this._registry.get(this._selected).size;\n }\n\n contains(id: string): boolean {\n return this._registry.get(this._selected).has(id);\n }\n\n clear(): void {\n this._registry.set(this._selected, new Set());\n }\n\n add(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(\n this._selected,\n new Set<string>(this._singleSelect ? [id] : [...Array.from(current.values()), id]),\n );\n }\n\n remove(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set<string>(Array.from(current.values()).filter((_id) => _id !== id)));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set([...(subtract ? Array.from(current.values()) : []), ...ids]));\n }\n\n toggleSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n const set = new Set<string>(subtract ? Array.from(current.values()) : undefined);\n ids.forEach((id) => {\n if (current.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._registry.set(this._selected, set);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\nexport const Node = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseNode extends Schema.Schema.Type<typeof Node> {}\n\nexport declare namespace Node {\n export type Any = Specialize<BaseNode, { data?: any }>;\n export type Node<Data = any> = Specialize<BaseNode, { data: Data }>;\n}\n\n//\n// Edge\n//\n\nexport const Edge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n source: Schema.String,\n target: Schema.String,\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseEdge extends Schema.Schema.Type<typeof Edge> {}\n\nexport declare namespace Edge {\n export type Any = Specialize<BaseEdge, { data?: any }>;\n export type Edge<Data = any> = Specialize<BaseEdge, { data: Data }>;\n}\n\nconst KEY_REGEX = /\\w+/;\n\n// NOTE: The `relation` is different from the `type`.\ntype EdgeMeta = { source: string; target: string; relation?: string };\n\nexport const createEdgeId = ({ source, target, relation }: EdgeMeta) => {\n invariant(source.match(KEY_REGEX), `invalid source: ${source}`);\n invariant(target.match(KEY_REGEX), `invalid target: ${target}`);\n return [source, relation, target].join('_');\n};\n\nexport const parseEdgeId = (id: string): EdgeMeta => {\n const [source, relation, target] = id.split('_');\n invariant(source.length && target.length);\n return { source, relation: relation.length ? relation : undefined, target };\n};\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(Node)),\n edges: Schema.mutable(Schema.Array(Edge)),\n});\n\nexport interface Any extends Schema.Schema.Type<typeof Graph> {}\n\nexport type Graph<Node extends Node.Any, Edge extends Edge.Any> = Specialize<\n Any,\n {\n nodes: Node[];\n edges: Edge[];\n }\n>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport * as Graph from './Graph';\n\n/**\n * Optional function to wrap mutations (e.g., for ECHO objects that require Obj.change).\n */\nexport type GraphChangeFunction = (fn: () => void) => void;\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> {\n protected readonly _graph: Graph.Graph<Node, Edge>;\n /**\n * Optional function to wrap mutations.\n * When set, all graph mutations are wrapped in this function.\n */\n protected readonly _change?: GraphChangeFunction;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n * @param graph - The graph data.\n * @param change - Optional function to wrap mutations (e.g., Obj.change for ECHO objects).\n */\n constructor(graph?: Graph.Graph<Node, Edge>, change?: GraphChangeFunction) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\n this._change = change;\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n toJSON() {\n return {\n nodes: this.nodes.length,\n edges: this.edges.length,\n };\n }\n\n get graph(): Graph.Graph<Node, Edge> {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes;\n }\n\n get edges(): Edge[] {\n return this._graph.edges;\n }\n\n //\n // Nodes\n //\n\n findNode(id: string): Node | undefined {\n return this.nodes.find((node) => node.id === id);\n }\n\n getNode(id: string): Node {\n return this.findNode(id) ?? failedInvariant();\n }\n\n filterNodes({ type }: Partial<Graph.Node.Any> = {}): Node[] {\n return this.nodes.filter((node) => !type || type === node.type);\n }\n\n //\n // Edges\n //\n\n findEdge(id: string): Edge | undefined {\n return this.edges.find((edge) => edge.id === id);\n }\n\n getEdge(id: string): Edge {\n return this.findEdge(id) ?? failedInvariant();\n }\n\n filterEdges({ type, source, target }: Partial<Graph.Edge.Any> = {}): Edge[] {\n return this.edges.filter(\n (edge) =>\n (!type || type === edge.type) && (!source || source === edge.source) && (!target || target === edge.target),\n );\n }\n\n //\n // Traverse\n //\n\n traverse(root: Node): Node[] {\n return this._traverse(root);\n }\n\n private _traverse(root: Node, visited: Set<string> = new Set()): Node[] {\n if (visited.has(root.id)) {\n return [];\n }\n\n visited.add(root.id);\n const targets = this.filterEdges({ source: root.id })\n .map((edge) => this.getNode(edge.target))\n .filter(isTruthy);\n\n return [root, ...targets.flatMap((target) => this._traverse(target, visited))];\n }\n}\n\n/**\n * Mutable Graph wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractBuilder<Node, Edge, Model> = AbstractBuilder<Node, Edge, Model>,\n> extends ReadonlyGraphModel<Node, Edge> {\n /**\n * Allows chaining.\n */\n abstract get builder(): Builder;\n\n /**\n * Shallow copy of provided graph.\n */\n abstract copy(graph?: Partial<Graph.Graph<Node, Edge>>): Model;\n\n /**\n * Execute a mutation on the graph.\n * If a change function is set, wraps the mutation in it.\n */\n protected _mutate(fn: (graph: Graph.Graph<Node, Edge>) => void): void {\n if (this._change != null) {\n this._change(() => fn(this._graph));\n } else {\n fn(this._graph);\n }\n }\n\n clear(): this {\n this._mutate((graph) => {\n graph.nodes.length = 0;\n graph.edges.length = 0;\n });\n return this;\n }\n\n addGraph(graph: Model): this {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n return this;\n }\n\n addGraphs(graphs: Model[]): this {\n graphs.forEach((graph) => {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n });\n return this;\n }\n\n addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n this._mutate((graph) => {\n graph.nodes.push(node);\n });\n return node;\n }\n\n addNodes(nodes: Node[]): Node[] {\n return nodes.map((node) => this.addNode(node));\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n // TODO(burdon): Generate random id.\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._mutate((graph) => {\n graph.edges.push(edge as Edge);\n });\n return edge as Edge;\n }\n\n addEdges(edges: Edge[]): Edge[] {\n return edges.map((edge) => this.addEdge(edge));\n }\n\n removeNode(id: string): Model {\n let removedEdges: Edge[] = [];\n let removedNodes: Node[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n removedNodes = removeBy<Node>(graph.nodes as Node[], (node) => node.id === id);\n });\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n removeNodes(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeNode(id));\n return this.copy().addGraphs(graphs);\n }\n\n removeEdge(id: string): Model {\n let removedEdges: Edge[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.id === id);\n });\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n removeEdges(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeEdge(id));\n return this.copy().addGraphs(graphs);\n }\n}\n\n/**\n * Chainable builder wrapper\n */\nexport abstract class AbstractBuilder<\n Node extends Graph.Node.Any,\n Edge extends Graph.Edge.Any,\n Model extends GraphModel<Node, Edge>,\n> {\n constructor(protected readonly _model: Model) {}\n\n get model(): Model {\n return this._model;\n }\n\n call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n\n getNode(id: string): Node {\n return this.model.getNode(id);\n }\n\n addNode(node: Node): this {\n this._model.addNode(node);\n return this;\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): this {\n this._model.addEdge(edge);\n return this;\n }\n\n addNodes(nodes: Node[]): this {\n this._model.addNodes(nodes);\n return this;\n }\n\n addEdges(edges: Edge[]): this {\n this._model.addEdges(edges);\n return this;\n }\n}\n\n/**\n * Basic model.\n */\nexport class GraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, Builder<Node, Edge>> {\n override get builder() {\n return new Builder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>(graph as Graph.Graph<Node, Edge>);\n }\n}\n\nexport type Subscription = <Node extends Graph.Node.Any = Graph.Node.Any, Edge extends Graph.Edge.Any = Graph.Edge.Any>(\n model: ReactiveGraphModel<Node, Edge>,\n graph: Graph.Graph<Node, Edge>,\n) => void;\n\n/**\n * Basic reactive model using Effect Atoms.\n */\n// NOTE: Unlike Preact Signals' `live()` which uses proxies for transparent reactivity,\n// Effect Atom requires explicit `registry.set()` calls. All mutation methods must be\n// overridden to update the atom immutably rather than mutating `_graph` directly.\nexport class ReactiveGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends GraphModel<Node, Edge> {\n private readonly _graphAtom: Atom.Writable<Graph.Graph<Node, Edge>>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n graph?: Partial<Graph.Graph<Node, Edge>>,\n ) {\n const initialGraph: Graph.Graph<Node, Edge> = {\n nodes: (graph?.nodes ?? []) as Node[],\n edges: (graph?.edges ?? []) as Edge[],\n };\n super(initialGraph);\n this._graphAtom = Atom.make<Graph.Graph<Node, Edge>>(initialGraph);\n }\n\n get registry(): Registry.Registry {\n return this._registry;\n }\n\n /**\n * Get the graph atom for reactive subscriptions.\n */\n get graphAtom(): Atom.Writable<Graph.Graph<Node, Edge>> {\n return this._graphAtom;\n }\n\n override get graph(): Graph.Graph<Node, Edge> {\n return this._registry.get(this._graphAtom);\n }\n\n override get nodes(): Node[] {\n return this.graph.nodes;\n }\n\n override get edges(): Edge[] {\n return this.graph.edges;\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(this._registry, graph);\n }\n\n override clear(): this {\n this._registry.set(this._graphAtom, {\n nodes: [],\n edges: [],\n });\n return this;\n }\n\n /**\n * Set the entire graph at once, triggering a single notification.\n */\n setGraph(graph: Graph.Graph<Node, Edge>): this {\n this._registry.set(this._graphAtom, graph);\n return this;\n }\n\n override addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n nodes: [...current.nodes, node],\n });\n return node;\n }\n\n override addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n edges: [...current.edges, edge as Edge],\n });\n return edge as Edge;\n }\n\n override removeNode(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.source === id || edge.target === id);\n const removedNodes = current.nodes.filter((node) => node.id === id);\n\n this._registry.set(this._graphAtom, {\n nodes: current.nodes.filter((node) => node.id !== id),\n edges: current.edges.filter((edge) => edge.source !== id && edge.target !== id),\n });\n\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n override removeEdge(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.id === id);\n\n this._registry.set(this._graphAtom, {\n ...current,\n edges: current.edges.filter((edge) => edge.id !== id),\n });\n\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n /**\n * Subscribe to graph changes.\n */\n subscribe(cb: Subscription, fire = false): () => void {\n if (fire) {\n cb(this, this.graph);\n }\n\n // Prime the atom by reading before subscribing to avoid double-fire on first mutation.\n this._registry.get(this._graphAtom);\n\n return this._registry.subscribe(this._graphAtom, () => {\n cb(this, this.graph);\n });\n }\n}\n\n/**\n * Basic builder.\n */\nexport class Builder<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAIA,SAASA,MAAMC,gBAAgB;AAE/B,SAASC,iBAAiB;;AAKnB,IAAMC,iBAAN,MAAMA;;EACMC;EACAC;EAEjB,YAA6BC,gBAAyB,OAAO;SAAhCA,gBAAAA;AAC3B,SAAKF,YAAYH,SAASM,KAAI;AAC9B,SAAKF,YAAYL,KAAKO,KAAkB,oBAAIC,IAAAA,CAAAA;EAC9C;;;;EAKA,IAAIC,WAAmC;AACrC,WAAO,KAAKJ;EACd;;;;EAKAK,cAA2B;AACzB,WAAO,KAAKN,UAAUO,IAAI,KAAKN,SAAS;EAC1C;;;;EAKAO,iBAA2B;AACzB,WAAOC,MAAMC,KAAK,KAAKV,UAAUO,IAAI,KAAKN,SAAS,EAAEU,OAAM,CAAA;EAC7D;;;;EAKAC,UAAUC,IAAiD;AAEzD,SAAKb,UAAUO,IAAI,KAAKN,SAAS;AAEjC,WAAO,KAAKD,UAAUY,UAAU,KAAKX,WAAW,MAAA;AAC9CY,SAAG,KAAKb,UAAUO,IAAI,KAAKN,SAAS,CAAA;IACtC,CAAA;EACF;EAEAa,SAAiC;AAC/B,WAAO;MACLT,UAAU,KAAKG,eAAc;IAC/B;EACF;;;;EAKAO,UAAkB;AAChB,WAAO,KAAKf,UAAUO,IAAI,KAAKN,SAAS,EAAEe;EAC5C;EAEAC,SAASC,IAAqB;AAC5B,WAAO,KAAKlB,UAAUO,IAAI,KAAKN,SAAS,EAAEkB,IAAID,EAAAA;EAChD;EAEAE,QAAc;AACZ,SAAKpB,UAAUqB,IAAI,KAAKpB,WAAW,oBAAIG,IAAAA,CAAAA;EACzC;EAEAkB,IAAIJ,IAAkB;AACpBpB,cAAUoB,IAAAA,QAAAA;;;;;;;;;AACV,UAAMK,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IACb,KAAKpB,WACL,IAAIG,IAAY,KAAKF,gBAAgB;MAACgB;QAAM;SAAIT,MAAMC,KAAKa,QAAQZ,OAAM,CAAA;MAAKO;KAAG,CAAA;EAErF;EAEAM,OAAON,IAAkB;AACvBpB,cAAUoB,IAAAA,QAAAA;;;;;;;;;AACV,UAAMK,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IAAI,KAAKpB,WAAW,IAAIG,IAAYK,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,EAAIc,OAAO,CAACC,QAAQA,QAAQR,EAAAA,CAAAA,CAAAA;EAC1G;;EAIAS,YAAYC,KAAeC,WAAW,OAAa;AACjD,UAAMN,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IAAI,KAAKpB,WAAW,oBAAIG,IAAI;SAAKyB,WAAWpB,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,IAAM,CAAA;SAAQiB;KAAI,CAAA;EACxG;EAEAE,eAAeF,KAAeC,WAAW,OAAa;AACpD,UAAMN,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,UAAMoB,MAAM,IAAIjB,IAAYyB,WAAWpB,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,IAAMoB,MAAAA;AACtEH,QAAII,QAAQ,CAACd,OAAAA;AACX,UAAIK,QAAQJ,IAAID,EAAAA,GAAK;AACnBG,YAAIY,OAAOf,EAAAA;MACb,OAAO;AACLG,YAAIC,IAAIJ,EAAAA;MACV;IACF,CAAA;AAEA,SAAKlB,UAAUqB,IAAI,KAAKpB,WAAWoB,GAAAA;EACrC;AACF;;;AC7GA;;;;;;;;
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _registry: Registry.Registry;\n private readonly _selected: Atom.Writable<Set<string>>;\n\n constructor(private readonly _singleSelect: boolean = false) {\n this._registry = Registry.make();\n this._selected = Atom.make<Set<string>>(new Set<string>());\n }\n\n /**\n * Returns the selected IDs atom for subscription.\n */\n get selected(): Atom.Atom<Set<string>> {\n return this._selected;\n }\n\n /**\n * Gets the current selected IDs as a Set.\n */\n getSelected(): Set<string> {\n return this._registry.get(this._selected);\n }\n\n /**\n * Gets the current selected IDs as an array.\n */\n getSelectedIds(): string[] {\n return Array.from(this._registry.get(this._selected).values());\n }\n\n /**\n * Subscribe to selection changes.\n */\n subscribe(cb: (selected: Set<string>) => void): () => void {\n // Prime the atom by reading before subscribing.\n this._registry.get(this._selected);\n\n return this._registry.subscribe(this._selected, () => {\n cb(this._registry.get(this._selected));\n });\n }\n\n toJSON(): { selected: string[] } {\n return {\n selected: this.getSelectedIds(),\n };\n }\n\n /**\n * Gets the current selection size.\n */\n getSize(): number {\n return this._registry.get(this._selected).size;\n }\n\n contains(id: string): boolean {\n return this._registry.get(this._selected).has(id);\n }\n\n clear(): void {\n this._registry.set(this._selected, new Set());\n }\n\n add(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(\n this._selected,\n new Set<string>(this._singleSelect ? [id] : [...Array.from(current.values()), id]),\n );\n }\n\n remove(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set<string>(Array.from(current.values()).filter((_id) => _id !== id)));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set([...(subtract ? Array.from(current.values()) : []), ...ids]));\n }\n\n toggleSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n const set = new Set<string>(subtract ? Array.from(current.values()) : undefined);\n ids.forEach((id) => {\n if (current.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._registry.set(this._selected, set);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\nexport const Node = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseNode extends Schema.Schema.Type<typeof Node> {}\n\nexport declare namespace Node {\n export type Any = Specialize<BaseNode, { data?: any }>;\n export type Node<Data = any> = Specialize<BaseNode, { data: Data }>;\n}\n\n//\n// Edge\n//\n\nexport const Edge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n source: Schema.String,\n target: Schema.String,\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseEdge extends Schema.Schema.Type<typeof Edge> {}\n\nexport declare namespace Edge {\n export type Any = Specialize<BaseEdge, { data?: any }>;\n export type Edge<Data = any> = Specialize<BaseEdge, { data: Data }>;\n}\n\nconst KEY_REGEX = /\\w+/;\n\n// NOTE: The `relation` is different from the `type`.\ntype EdgeMeta = { source: string; target: string; relation?: string };\n\nexport const createEdgeId = ({ source, target, relation }: EdgeMeta) => {\n invariant(source.match(KEY_REGEX), `invalid source: ${source}`);\n invariant(target.match(KEY_REGEX), `invalid target: ${target}`);\n return [source, relation, target].join('_');\n};\n\nexport const parseEdgeId = (id: string): EdgeMeta => {\n const [source, relation, target] = id.split('_');\n invariant(source.length && target.length);\n return { source, relation: relation.length ? relation : undefined, target };\n};\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(Node)),\n edges: Schema.mutable(Schema.Array(Edge)),\n});\n\nexport interface Any extends Schema.Schema.Type<typeof Graph> {}\n\nexport type Graph<Node extends Node.Any, Edge extends Edge.Any> = Specialize<\n Any,\n {\n nodes: Node[];\n edges: Edge[];\n }\n>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport * as Graph from './Graph';\n\n/**\n * Optional function to wrap mutations (e.g., for ECHO objects that require Obj.change).\n */\nexport type GraphChangeFunction = (fn: () => void) => void;\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> {\n protected readonly _graph: Graph.Graph<Node, Edge>;\n /**\n * Optional function to wrap mutations.\n * When set, all graph mutations are wrapped in this function.\n */\n protected readonly _change?: GraphChangeFunction;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n * @param graph - The graph data.\n * @param change - Optional function to wrap mutations (e.g., Obj.change for ECHO objects).\n */\n constructor(graph?: Graph.Graph<Node, Edge>, change?: GraphChangeFunction) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\n this._change = change;\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n toJSON() {\n return {\n nodes: this.nodes.length,\n edges: this.edges.length,\n };\n }\n\n get graph(): Graph.Graph<Node, Edge> {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes;\n }\n\n get edges(): Edge[] {\n return this._graph.edges;\n }\n\n //\n // Nodes\n //\n\n findNode(id: string): Node | undefined {\n return this.nodes.find((node) => node.id === id);\n }\n\n getNode(id: string): Node {\n return this.findNode(id) ?? failedInvariant();\n }\n\n filterNodes({ type }: Partial<Graph.Node.Any> = {}): Node[] {\n return this.nodes.filter((node) => !type || type === node.type);\n }\n\n //\n // Edges\n //\n\n findEdge(id: string): Edge | undefined {\n return this.edges.find((edge) => edge.id === id);\n }\n\n getEdge(id: string): Edge {\n return this.findEdge(id) ?? failedInvariant();\n }\n\n filterEdges({ type, source, target }: Partial<Graph.Edge.Any> = {}): Edge[] {\n return this.edges.filter(\n (edge) =>\n (!type || type === edge.type) && (!source || source === edge.source) && (!target || target === edge.target),\n );\n }\n\n //\n // Traverse\n //\n\n traverse(root: Node): Node[] {\n return this._traverse(root);\n }\n\n private _traverse(root: Node, visited: Set<string> = new Set()): Node[] {\n if (visited.has(root.id)) {\n return [];\n }\n\n visited.add(root.id);\n const targets = this.filterEdges({ source: root.id })\n .map((edge) => this.getNode(edge.target))\n .filter(isTruthy);\n\n return [root, ...targets.flatMap((target) => this._traverse(target, visited))];\n }\n}\n\n/**\n * Mutable Graph wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractBuilder<Node, Edge, Model> = AbstractBuilder<Node, Edge, Model>,\n> extends ReadonlyGraphModel<Node, Edge> {\n /**\n * Allows chaining.\n */\n abstract get builder(): Builder;\n\n /**\n * Shallow copy of provided graph.\n */\n abstract copy(graph?: Partial<Graph.Graph<Node, Edge>>): Model;\n\n /**\n * Execute a mutation on the graph.\n * If a change function is set, wraps the mutation in it.\n */\n protected _mutate(fn: (graph: Graph.Graph<Node, Edge>) => void): void {\n if (this._change != null) {\n this._change(() => fn(this._graph));\n } else {\n fn(this._graph);\n }\n }\n\n clear(): this {\n this._mutate((graph) => {\n graph.nodes.length = 0;\n graph.edges.length = 0;\n });\n return this;\n }\n\n addGraph(graph: Model): this {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n return this;\n }\n\n addGraphs(graphs: Model[]): this {\n graphs.forEach((graph) => {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n });\n return this;\n }\n\n addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n this._mutate((graph) => {\n graph.nodes.push(node);\n });\n return node;\n }\n\n addNodes(nodes: Node[]): Node[] {\n return nodes.map((node) => this.addNode(node));\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n // TODO(burdon): Generate random id.\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._mutate((graph) => {\n graph.edges.push(edge as Edge);\n });\n return edge as Edge;\n }\n\n addEdges(edges: Edge[]): Edge[] {\n return edges.map((edge) => this.addEdge(edge));\n }\n\n removeNode(id: string): Model {\n let removedEdges: Edge[] = [];\n let removedNodes: Node[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n removedNodes = removeBy<Node>(graph.nodes as Node[], (node) => node.id === id);\n });\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n removeNodes(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeNode(id));\n return this.copy().addGraphs(graphs);\n }\n\n removeEdge(id: string): Model {\n let removedEdges: Edge[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.id === id);\n });\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n removeEdges(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeEdge(id));\n return this.copy().addGraphs(graphs);\n }\n}\n\n/**\n * Chainable builder wrapper\n */\nexport abstract class AbstractBuilder<\n Node extends Graph.Node.Any,\n Edge extends Graph.Edge.Any,\n Model extends GraphModel<Node, Edge>,\n> {\n constructor(protected readonly _model: Model) {}\n\n get model(): Model {\n return this._model;\n }\n\n call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n\n getNode(id: string): Node {\n return this.model.getNode(id);\n }\n\n addNode(node: Node): this {\n this._model.addNode(node);\n return this;\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): this {\n this._model.addEdge(edge);\n return this;\n }\n\n addNodes(nodes: Node[]): this {\n this._model.addNodes(nodes);\n return this;\n }\n\n addEdges(edges: Edge[]): this {\n this._model.addEdges(edges);\n return this;\n }\n}\n\n/**\n * Basic model.\n */\nexport class GraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, Builder<Node, Edge>> {\n override get builder() {\n return new Builder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>(graph as Graph.Graph<Node, Edge>);\n }\n}\n\nexport type Subscription = <Node extends Graph.Node.Any = Graph.Node.Any, Edge extends Graph.Edge.Any = Graph.Edge.Any>(\n model: ReactiveGraphModel<Node, Edge>,\n graph: Graph.Graph<Node, Edge>,\n) => void;\n\n/**\n * Basic reactive model using Effect Atoms.\n */\n// NOTE: Unlike Preact Signals' `live()` which uses proxies for transparent reactivity,\n// Effect Atom requires explicit `registry.set()` calls. All mutation methods must be\n// overridden to update the atom immutably rather than mutating `_graph` directly.\nexport class ReactiveGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends GraphModel<Node, Edge> {\n private readonly _graphAtom: Atom.Writable<Graph.Graph<Node, Edge>>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n graph?: Partial<Graph.Graph<Node, Edge>>,\n ) {\n const initialGraph: Graph.Graph<Node, Edge> = {\n nodes: (graph?.nodes ?? []) as Node[],\n edges: (graph?.edges ?? []) as Edge[],\n };\n super(initialGraph);\n this._graphAtom = Atom.make<Graph.Graph<Node, Edge>>(initialGraph);\n }\n\n get registry(): Registry.Registry {\n return this._registry;\n }\n\n /**\n * Get the graph atom for reactive subscriptions.\n */\n get graphAtom(): Atom.Writable<Graph.Graph<Node, Edge>> {\n return this._graphAtom;\n }\n\n override get graph(): Graph.Graph<Node, Edge> {\n return this._registry.get(this._graphAtom);\n }\n\n override get nodes(): Node[] {\n return this.graph.nodes;\n }\n\n override get edges(): Edge[] {\n return this.graph.edges;\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(this._registry, graph);\n }\n\n override clear(): this {\n this._registry.set(this._graphAtom, {\n nodes: [],\n edges: [],\n });\n return this;\n }\n\n /**\n * Set the entire graph at once, triggering a single notification.\n */\n setGraph(graph: Graph.Graph<Node, Edge>): this {\n this._registry.set(this._graphAtom, graph);\n return this;\n }\n\n override addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n nodes: [...current.nodes, node],\n });\n return node;\n }\n\n override addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n edges: [...current.edges, edge as Edge],\n });\n return edge as Edge;\n }\n\n override removeNode(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.source === id || edge.target === id);\n const removedNodes = current.nodes.filter((node) => node.id === id);\n\n this._registry.set(this._graphAtom, {\n nodes: current.nodes.filter((node) => node.id !== id),\n edges: current.edges.filter((edge) => edge.source !== id && edge.target !== id),\n });\n\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n override removeEdge(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.id === id);\n\n this._registry.set(this._graphAtom, {\n ...current,\n edges: current.edges.filter((edge) => edge.id !== id),\n });\n\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n /**\n * Subscribe to graph changes.\n */\n subscribe(cb: Subscription, fire = false): () => void {\n if (fire) {\n cb(this, this.graph);\n }\n\n // Prime the atom by reading before subscribing to avoid double-fire on first mutation.\n this._registry.get(this._graphAtom);\n\n return this._registry.subscribe(this._graphAtom, () => {\n cb(this, this.graph);\n });\n }\n}\n\n/**\n * Basic builder.\n */\nexport class Builder<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Atom", "Registry", "invariant", "SelectionModel", "_registry", "_selected", "_singleSelect", "make", "Set", "selected", "getSelected", "get", "getSelectedIds", "Array", "from", "values", "subscribe", "cb", "toJSON", "getSize", "size", "contains", "id", "has", "clear", "set", "add", "current", "remove", "filter", "_id", "setSelected", "ids", "subtract", "toggleSelected", "undefined", "forEach", "delete", "Schema", "invariant", "Node", "Struct", "id", "String", "type", "optional", "data", "Any", "Edge", "source", "target", "KEY_REGEX", "createEdgeId", "relation", "match", "join", "parseEdgeId", "split", "length", "undefined", "Graph", "nodes", "mutable", "Array", "edges", "Atom", "inspectCustom", "failedInvariant", "invariant", "isTruthy", "removeBy", "ReadonlyGraphModel", "_graph", "_change", "graph", "change", "nodes", "edges", "inspectCustom", "toJSON", "length", "findNode", "id", "find", "node", "getNode", "failedInvariant", "filterNodes", "type", "filter", "findEdge", "edge", "getEdge", "filterEdges", "source", "target", "traverse", "root", "_traverse", "visited", "Set", "has", "add", "targets", "map", "isTruthy", "flatMap", "AbstractGraphModel", "_mutate", "fn", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removedEdges", "removedNodes", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "Builder", "ReactiveGraphModel", "_graphAtom", "_registry", "initialGraph", "Atom", "make", "registry", "graphAtom", "get", "set", "setGraph", "current", "subscribe", "fire"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/selection.ts":{"bytes":10724,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/Graph.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/selection.ts":{"bytes":10724,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/Graph.ts":{"bytes":6772,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/GraphModel.ts":{"bytes":40371,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/Graph.ts","kind":"import-statement","original":"./Graph"}],"format":"esm"},"src/index.ts":{"bytes":751,"imports":[{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/Graph.ts","kind":"import-statement","original":"./Graph"},{"path":"src/GraphModel.ts","kind":"import-statement","original":"./GraphModel"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":28662},"dist/lib/browser/index.mjs":{"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["Graph","GraphModel","SelectionModel"],"entryPoint":"src/index.ts","inputs":{"src/selection.ts":{"bytesInOutput":2694},"src/index.ts":{"bytesInOutput":0},"src/Graph.ts":{"bytesInOutput":1727},"src/GraphModel.ts":{"bytesInOutput":9864}},"bytes":14638}}}
|
|
@@ -143,7 +143,7 @@ var KEY_REGEX = /\w+/;
|
|
|
143
143
|
var createEdgeId = ({ source, target, relation }) => {
|
|
144
144
|
invariant2(source.match(KEY_REGEX), `invalid source: ${source}`, {
|
|
145
145
|
F: __dxlog_file2,
|
|
146
|
-
L:
|
|
146
|
+
L: 54,
|
|
147
147
|
S: void 0,
|
|
148
148
|
A: [
|
|
149
149
|
"source.match(KEY_REGEX)",
|
|
@@ -152,7 +152,7 @@ var createEdgeId = ({ source, target, relation }) => {
|
|
|
152
152
|
});
|
|
153
153
|
invariant2(target.match(KEY_REGEX), `invalid target: ${target}`, {
|
|
154
154
|
F: __dxlog_file2,
|
|
155
|
-
L:
|
|
155
|
+
L: 55,
|
|
156
156
|
S: void 0,
|
|
157
157
|
A: [
|
|
158
158
|
"target.match(KEY_REGEX)",
|
|
@@ -169,7 +169,7 @@ var parseEdgeId = (id) => {
|
|
|
169
169
|
const [source, relation, target] = id.split("_");
|
|
170
170
|
invariant2(source.length && target.length, void 0, {
|
|
171
171
|
F: __dxlog_file2,
|
|
172
|
-
L:
|
|
172
|
+
L: 61,
|
|
173
173
|
S: void 0,
|
|
174
174
|
A: [
|
|
175
175
|
"source.length && target.length",
|
|
@@ -321,7 +321,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
321
321
|
addNode(node) {
|
|
322
322
|
invariant3(node.id, "ID is required", {
|
|
323
323
|
F: __dxlog_file3,
|
|
324
|
-
L:
|
|
324
|
+
L: 184,
|
|
325
325
|
S: this,
|
|
326
326
|
A: [
|
|
327
327
|
"node.id",
|
|
@@ -330,7 +330,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
330
330
|
});
|
|
331
331
|
invariant3(!this.findNode(node.id), `node already exists: ${node.id}`, {
|
|
332
332
|
F: __dxlog_file3,
|
|
333
|
-
L:
|
|
333
|
+
L: 185,
|
|
334
334
|
S: this,
|
|
335
335
|
A: [
|
|
336
336
|
"!this.findNode(node.id)",
|
|
@@ -348,7 +348,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
348
348
|
addEdge(edge) {
|
|
349
349
|
invariant3(edge.source, void 0, {
|
|
350
350
|
F: __dxlog_file3,
|
|
351
|
-
L:
|
|
351
|
+
L: 197,
|
|
352
352
|
S: this,
|
|
353
353
|
A: [
|
|
354
354
|
"edge.source",
|
|
@@ -357,7 +357,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
357
357
|
});
|
|
358
358
|
invariant3(edge.target, void 0, {
|
|
359
359
|
F: __dxlog_file3,
|
|
360
|
-
L:
|
|
360
|
+
L: 198,
|
|
361
361
|
S: this,
|
|
362
362
|
A: [
|
|
363
363
|
"edge.target",
|
|
@@ -372,7 +372,7 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
|
|
|
372
372
|
}
|
|
373
373
|
invariant3(!this.findNode(edge.id), void 0, {
|
|
374
374
|
F: __dxlog_file3,
|
|
375
|
-
L:
|
|
375
|
+
L: 203,
|
|
376
376
|
S: this,
|
|
377
377
|
A: [
|
|
378
378
|
"!this.findNode(edge.id!)",
|
|
@@ -507,7 +507,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
507
507
|
addNode(node) {
|
|
508
508
|
invariant3(node.id, "ID is required", {
|
|
509
509
|
F: __dxlog_file3,
|
|
510
|
-
L:
|
|
510
|
+
L: 376,
|
|
511
511
|
S: this,
|
|
512
512
|
A: [
|
|
513
513
|
"node.id",
|
|
@@ -516,7 +516,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
516
516
|
});
|
|
517
517
|
invariant3(!this.findNode(node.id), `node already exists: ${node.id}`, {
|
|
518
518
|
F: __dxlog_file3,
|
|
519
|
-
L:
|
|
519
|
+
L: 377,
|
|
520
520
|
S: this,
|
|
521
521
|
A: [
|
|
522
522
|
"!this.findNode(node.id)",
|
|
@@ -536,7 +536,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
536
536
|
addEdge(edge) {
|
|
537
537
|
invariant3(edge.source, void 0, {
|
|
538
538
|
F: __dxlog_file3,
|
|
539
|
-
L:
|
|
539
|
+
L: 387,
|
|
540
540
|
S: this,
|
|
541
541
|
A: [
|
|
542
542
|
"edge.source",
|
|
@@ -545,7 +545,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
545
545
|
});
|
|
546
546
|
invariant3(edge.target, void 0, {
|
|
547
547
|
F: __dxlog_file3,
|
|
548
|
-
L:
|
|
548
|
+
L: 388,
|
|
549
549
|
S: this,
|
|
550
550
|
A: [
|
|
551
551
|
"edge.target",
|
|
@@ -560,7 +560,7 @@ var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
|
|
|
560
560
|
}
|
|
561
561
|
invariant3(!this.findNode(edge.id), void 0, {
|
|
562
562
|
F: __dxlog_file3,
|
|
563
|
-
L:
|
|
563
|
+
L: 392,
|
|
564
564
|
S: this,
|
|
565
565
|
A: [
|
|
566
566
|
"!this.findNode(edge.id!)",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/selection.ts", "../../../src/Graph.ts", "../../../src/GraphModel.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _registry: Registry.Registry;\n private readonly _selected: Atom.Writable<Set<string>>;\n\n constructor(private readonly _singleSelect: boolean = false) {\n this._registry = Registry.make();\n this._selected = Atom.make<Set<string>>(new Set<string>());\n }\n\n /**\n * Returns the selected IDs atom for subscription.\n */\n get selected(): Atom.Atom<Set<string>> {\n return this._selected;\n }\n\n /**\n * Gets the current selected IDs as a Set.\n */\n getSelected(): Set<string> {\n return this._registry.get(this._selected);\n }\n\n /**\n * Gets the current selected IDs as an array.\n */\n getSelectedIds(): string[] {\n return Array.from(this._registry.get(this._selected).values());\n }\n\n /**\n * Subscribe to selection changes.\n */\n subscribe(cb: (selected: Set<string>) => void): () => void {\n // Prime the atom by reading before subscribing.\n this._registry.get(this._selected);\n\n return this._registry.subscribe(this._selected, () => {\n cb(this._registry.get(this._selected));\n });\n }\n\n toJSON(): { selected: string[] } {\n return {\n selected: this.getSelectedIds(),\n };\n }\n\n /**\n * Gets the current selection size.\n */\n getSize(): number {\n return this._registry.get(this._selected).size;\n }\n\n contains(id: string): boolean {\n return this._registry.get(this._selected).has(id);\n }\n\n clear(): void {\n this._registry.set(this._selected, new Set());\n }\n\n add(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(\n this._selected,\n new Set<string>(this._singleSelect ? [id] : [...Array.from(current.values()), id]),\n );\n }\n\n remove(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set<string>(Array.from(current.values()).filter((_id) => _id !== id)));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set([...(subtract ? Array.from(current.values()) : []), ...ids]));\n }\n\n toggleSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n const set = new Set<string>(subtract ? Array.from(current.values()) : undefined);\n ids.forEach((id) => {\n if (current.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._registry.set(this._selected, set);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\nexport const Node = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseNode extends Schema.Schema.Type<typeof Node> {}\n\nexport declare namespace Node {\n export type Any = Specialize<BaseNode, { data?: any }>;\n export type Node<Data = any> = Specialize<BaseNode, { data: Data }>;\n}\n\n//\n// Edge\n//\n\nexport const Edge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n source: Schema.String,\n target: Schema.String,\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseEdge extends Schema.Schema.Type<typeof Edge> {}\n\nexport declare namespace Edge {\n export type Any = Specialize<BaseEdge, { data?: any }>;\n export type Edge<Data = any> = Specialize<BaseEdge, { data: Data }>;\n}\n\nconst KEY_REGEX = /\\w+/;\n\n// NOTE: The `relation` is different from the `type`.\ntype EdgeMeta = { source: string; target: string; relation?: string };\n\nexport const createEdgeId = ({ source, target, relation }: EdgeMeta) => {\n invariant(source.match(KEY_REGEX), `invalid source: ${source}`);\n invariant(target.match(KEY_REGEX), `invalid target: ${target}`);\n return [source, relation, target].join('_');\n};\n\nexport const parseEdgeId = (id: string): EdgeMeta => {\n const [source, relation, target] = id.split('_');\n invariant(source.length && target.length);\n return { source, relation: relation.length ? relation : undefined, target };\n};\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(Node)),\n edges: Schema.mutable(Schema.Array(Edge)),\n});\n\nexport interface Any extends Schema.Schema.Type<typeof Graph> {}\n\nexport type Graph<Node extends Node.Any, Edge extends Edge.Any> = Specialize<\n Any,\n {\n nodes: Node[];\n edges: Edge[];\n }\n>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport * as Graph from './Graph';\n\n/**\n * Optional function to wrap mutations (e.g., for ECHO objects that require Obj.change).\n */\nexport type GraphChangeFunction = (fn: () => void) => void;\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> {\n protected readonly _graph: Graph.Graph<Node, Edge>;\n /**\n * Optional function to wrap mutations.\n * When set, all graph mutations are wrapped in this function.\n */\n protected readonly _change?: GraphChangeFunction;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n * @param graph - The graph data.\n * @param change - Optional function to wrap mutations (e.g., Obj.change for ECHO objects).\n */\n constructor(graph?: Graph.Graph<Node, Edge>, change?: GraphChangeFunction) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\n this._change = change;\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n toJSON() {\n return {\n nodes: this.nodes.length,\n edges: this.edges.length,\n };\n }\n\n get graph(): Graph.Graph<Node, Edge> {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes;\n }\n\n get edges(): Edge[] {\n return this._graph.edges;\n }\n\n //\n // Nodes\n //\n\n findNode(id: string): Node | undefined {\n return this.nodes.find((node) => node.id === id);\n }\n\n getNode(id: string): Node {\n return this.findNode(id) ?? failedInvariant();\n }\n\n filterNodes({ type }: Partial<Graph.Node.Any> = {}): Node[] {\n return this.nodes.filter((node) => !type || type === node.type);\n }\n\n //\n // Edges\n //\n\n findEdge(id: string): Edge | undefined {\n return this.edges.find((edge) => edge.id === id);\n }\n\n getEdge(id: string): Edge {\n return this.findEdge(id) ?? failedInvariant();\n }\n\n filterEdges({ type, source, target }: Partial<Graph.Edge.Any> = {}): Edge[] {\n return this.edges.filter(\n (edge) =>\n (!type || type === edge.type) && (!source || source === edge.source) && (!target || target === edge.target),\n );\n }\n\n //\n // Traverse\n //\n\n traverse(root: Node): Node[] {\n return this._traverse(root);\n }\n\n private _traverse(root: Node, visited: Set<string> = new Set()): Node[] {\n if (visited.has(root.id)) {\n return [];\n }\n\n visited.add(root.id);\n const targets = this.filterEdges({ source: root.id })\n .map((edge) => this.getNode(edge.target))\n .filter(isTruthy);\n\n return [root, ...targets.flatMap((target) => this._traverse(target, visited))];\n }\n}\n\n/**\n * Mutable Graph wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractBuilder<Node, Edge, Model> = AbstractBuilder<Node, Edge, Model>,\n> extends ReadonlyGraphModel<Node, Edge> {\n /**\n * Allows chaining.\n */\n abstract get builder(): Builder;\n\n /**\n * Shallow copy of provided graph.\n */\n abstract copy(graph?: Partial<Graph.Graph<Node, Edge>>): Model;\n\n /**\n * Execute a mutation on the graph.\n * If a change function is set, wraps the mutation in it.\n */\n protected _mutate(fn: (graph: Graph.Graph<Node, Edge>) => void): void {\n if (this._change != null) {\n this._change(() => fn(this._graph));\n } else {\n fn(this._graph);\n }\n }\n\n clear(): this {\n this._mutate((graph) => {\n graph.nodes.length = 0;\n graph.edges.length = 0;\n });\n return this;\n }\n\n addGraph(graph: Model): this {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n return this;\n }\n\n addGraphs(graphs: Model[]): this {\n graphs.forEach((graph) => {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n });\n return this;\n }\n\n addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n this._mutate((graph) => {\n graph.nodes.push(node);\n });\n return node;\n }\n\n addNodes(nodes: Node[]): Node[] {\n return nodes.map((node) => this.addNode(node));\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n // TODO(burdon): Generate random id.\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._mutate((graph) => {\n graph.edges.push(edge as Edge);\n });\n return edge as Edge;\n }\n\n addEdges(edges: Edge[]): Edge[] {\n return edges.map((edge) => this.addEdge(edge));\n }\n\n removeNode(id: string): Model {\n let removedEdges: Edge[] = [];\n let removedNodes: Node[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n removedNodes = removeBy<Node>(graph.nodes as Node[], (node) => node.id === id);\n });\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n removeNodes(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeNode(id));\n return this.copy().addGraphs(graphs);\n }\n\n removeEdge(id: string): Model {\n let removedEdges: Edge[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.id === id);\n });\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n removeEdges(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeEdge(id));\n return this.copy().addGraphs(graphs);\n }\n}\n\n/**\n * Chainable builder wrapper\n */\nexport abstract class AbstractBuilder<\n Node extends Graph.Node.Any,\n Edge extends Graph.Edge.Any,\n Model extends GraphModel<Node, Edge>,\n> {\n constructor(protected readonly _model: Model) {}\n\n get model(): Model {\n return this._model;\n }\n\n call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n\n getNode(id: string): Node {\n return this.model.getNode(id);\n }\n\n addNode(node: Node): this {\n this._model.addNode(node);\n return this;\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): this {\n this._model.addEdge(edge);\n return this;\n }\n\n addNodes(nodes: Node[]): this {\n this._model.addNodes(nodes);\n return this;\n }\n\n addEdges(edges: Edge[]): this {\n this._model.addEdges(edges);\n return this;\n }\n}\n\n/**\n * Basic model.\n */\nexport class GraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, Builder<Node, Edge>> {\n override get builder() {\n return new Builder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>(graph as Graph.Graph<Node, Edge>);\n }\n}\n\nexport type Subscription = <Node extends Graph.Node.Any = Graph.Node.Any, Edge extends Graph.Edge.Any = Graph.Edge.Any>(\n model: ReactiveGraphModel<Node, Edge>,\n graph: Graph.Graph<Node, Edge>,\n) => void;\n\n/**\n * Basic reactive model using Effect Atoms.\n */\n// NOTE: Unlike Preact Signals' `live()` which uses proxies for transparent reactivity,\n// Effect Atom requires explicit `registry.set()` calls. All mutation methods must be\n// overridden to update the atom immutably rather than mutating `_graph` directly.\nexport class ReactiveGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends GraphModel<Node, Edge> {\n private readonly _graphAtom: Atom.Writable<Graph.Graph<Node, Edge>>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n graph?: Partial<Graph.Graph<Node, Edge>>,\n ) {\n const initialGraph: Graph.Graph<Node, Edge> = {\n nodes: (graph?.nodes ?? []) as Node[],\n edges: (graph?.edges ?? []) as Edge[],\n };\n super(initialGraph);\n this._graphAtom = Atom.make<Graph.Graph<Node, Edge>>(initialGraph);\n }\n\n get registry(): Registry.Registry {\n return this._registry;\n }\n\n /**\n * Get the graph atom for reactive subscriptions.\n */\n get graphAtom(): Atom.Writable<Graph.Graph<Node, Edge>> {\n return this._graphAtom;\n }\n\n override get graph(): Graph.Graph<Node, Edge> {\n return this._registry.get(this._graphAtom);\n }\n\n override get nodes(): Node[] {\n return this.graph.nodes;\n }\n\n override get edges(): Edge[] {\n return this.graph.edges;\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(this._registry, graph);\n }\n\n override clear(): this {\n this._registry.set(this._graphAtom, {\n nodes: [],\n edges: [],\n });\n return this;\n }\n\n /**\n * Set the entire graph at once, triggering a single notification.\n */\n setGraph(graph: Graph.Graph<Node, Edge>): this {\n this._registry.set(this._graphAtom, graph);\n return this;\n }\n\n override addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n nodes: [...current.nodes, node],\n });\n return node;\n }\n\n override addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n edges: [...current.edges, edge as Edge],\n });\n return edge as Edge;\n }\n\n override removeNode(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.source === id || edge.target === id);\n const removedNodes = current.nodes.filter((node) => node.id === id);\n\n this._registry.set(this._graphAtom, {\n nodes: current.nodes.filter((node) => node.id !== id),\n edges: current.edges.filter((edge) => edge.source !== id && edge.target !== id),\n });\n\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n override removeEdge(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.id === id);\n\n this._registry.set(this._graphAtom, {\n ...current,\n edges: current.edges.filter((edge) => edge.id !== id),\n });\n\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n /**\n * Subscribe to graph changes.\n */\n subscribe(cb: Subscription, fire = false): () => void {\n if (fire) {\n cb(this, this.graph);\n }\n\n // Prime the atom by reading before subscribing to avoid double-fire on first mutation.\n this._registry.get(this._graphAtom);\n\n return this._registry.subscribe(this._graphAtom, () => {\n cb(this, this.graph);\n });\n }\n}\n\n/**\n * Basic builder.\n */\nexport class Builder<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAIA,SAASA,MAAMC,gBAAgB;AAE/B,SAASC,iBAAiB;;AAKnB,IAAMC,iBAAN,MAAMA;;EACMC;EACAC;EAEjB,YAA6BC,gBAAyB,OAAO;SAAhCA,gBAAAA;AAC3B,SAAKF,YAAYH,SAASM,KAAI;AAC9B,SAAKF,YAAYL,KAAKO,KAAkB,oBAAIC,IAAAA,CAAAA;EAC9C;;;;EAKA,IAAIC,WAAmC;AACrC,WAAO,KAAKJ;EACd;;;;EAKAK,cAA2B;AACzB,WAAO,KAAKN,UAAUO,IAAI,KAAKN,SAAS;EAC1C;;;;EAKAO,iBAA2B;AACzB,WAAOC,MAAMC,KAAK,KAAKV,UAAUO,IAAI,KAAKN,SAAS,EAAEU,OAAM,CAAA;EAC7D;;;;EAKAC,UAAUC,IAAiD;AAEzD,SAAKb,UAAUO,IAAI,KAAKN,SAAS;AAEjC,WAAO,KAAKD,UAAUY,UAAU,KAAKX,WAAW,MAAA;AAC9CY,SAAG,KAAKb,UAAUO,IAAI,KAAKN,SAAS,CAAA;IACtC,CAAA;EACF;EAEAa,SAAiC;AAC/B,WAAO;MACLT,UAAU,KAAKG,eAAc;IAC/B;EACF;;;;EAKAO,UAAkB;AAChB,WAAO,KAAKf,UAAUO,IAAI,KAAKN,SAAS,EAAEe;EAC5C;EAEAC,SAASC,IAAqB;AAC5B,WAAO,KAAKlB,UAAUO,IAAI,KAAKN,SAAS,EAAEkB,IAAID,EAAAA;EAChD;EAEAE,QAAc;AACZ,SAAKpB,UAAUqB,IAAI,KAAKpB,WAAW,oBAAIG,IAAAA,CAAAA;EACzC;EAEAkB,IAAIJ,IAAkB;AACpBpB,cAAUoB,IAAAA,QAAAA;;;;;;;;;AACV,UAAMK,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IACb,KAAKpB,WACL,IAAIG,IAAY,KAAKF,gBAAgB;MAACgB;QAAM;SAAIT,MAAMC,KAAKa,QAAQZ,OAAM,CAAA;MAAKO;KAAG,CAAA;EAErF;EAEAM,OAAON,IAAkB;AACvBpB,cAAUoB,IAAAA,QAAAA;;;;;;;;;AACV,UAAMK,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IAAI,KAAKpB,WAAW,IAAIG,IAAYK,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,EAAIc,OAAO,CAACC,QAAQA,QAAQR,EAAAA,CAAAA,CAAAA;EAC1G;;EAIAS,YAAYC,KAAeC,WAAW,OAAa;AACjD,UAAMN,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,SAAKD,UAAUqB,IAAI,KAAKpB,WAAW,oBAAIG,IAAI;SAAKyB,WAAWpB,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,IAAM,CAAA;SAAQiB;KAAI,CAAA;EACxG;EAEAE,eAAeF,KAAeC,WAAW,OAAa;AACpD,UAAMN,UAAU,KAAKvB,UAAUO,IAAI,KAAKN,SAAS;AACjD,UAAMoB,MAAM,IAAIjB,IAAYyB,WAAWpB,MAAMC,KAAKa,QAAQZ,OAAM,CAAA,IAAMoB,MAAAA;AACtEH,QAAII,QAAQ,CAACd,OAAAA;AACX,UAAIK,QAAQJ,IAAID,EAAAA,GAAK;AACnBG,YAAIY,OAAOf,EAAAA;MACb,OAAO;AACLG,YAAIC,IAAIJ,EAAAA;MACV;IACF,CAAA;AAEA,SAAKlB,UAAUqB,IAAI,KAAKpB,WAAWoB,GAAAA;EACrC;AACF;;;AC7GA;;;;;;;;
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, Registry } from '@effect-atom/atom-react';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _registry: Registry.Registry;\n private readonly _selected: Atom.Writable<Set<string>>;\n\n constructor(private readonly _singleSelect: boolean = false) {\n this._registry = Registry.make();\n this._selected = Atom.make<Set<string>>(new Set<string>());\n }\n\n /**\n * Returns the selected IDs atom for subscription.\n */\n get selected(): Atom.Atom<Set<string>> {\n return this._selected;\n }\n\n /**\n * Gets the current selected IDs as a Set.\n */\n getSelected(): Set<string> {\n return this._registry.get(this._selected);\n }\n\n /**\n * Gets the current selected IDs as an array.\n */\n getSelectedIds(): string[] {\n return Array.from(this._registry.get(this._selected).values());\n }\n\n /**\n * Subscribe to selection changes.\n */\n subscribe(cb: (selected: Set<string>) => void): () => void {\n // Prime the atom by reading before subscribing.\n this._registry.get(this._selected);\n\n return this._registry.subscribe(this._selected, () => {\n cb(this._registry.get(this._selected));\n });\n }\n\n toJSON(): { selected: string[] } {\n return {\n selected: this.getSelectedIds(),\n };\n }\n\n /**\n * Gets the current selection size.\n */\n getSize(): number {\n return this._registry.get(this._selected).size;\n }\n\n contains(id: string): boolean {\n return this._registry.get(this._selected).has(id);\n }\n\n clear(): void {\n this._registry.set(this._selected, new Set());\n }\n\n add(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(\n this._selected,\n new Set<string>(this._singleSelect ? [id] : [...Array.from(current.values()), id]),\n );\n }\n\n remove(id: string): void {\n invariant(id);\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set<string>(Array.from(current.values()).filter((_id) => _id !== id)));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n this._registry.set(this._selected, new Set([...(subtract ? Array.from(current.values()) : []), ...ids]));\n }\n\n toggleSelected(ids: string[], subtract = false): void {\n const current = this._registry.get(this._selected);\n const set = new Set<string>(subtract ? Array.from(current.values()) : undefined);\n ids.forEach((id) => {\n if (current.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._registry.set(this._selected, set);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { invariant } from '@dxos/invariant';\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\nexport const Node = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseNode extends Schema.Schema.Type<typeof Node> {}\n\nexport declare namespace Node {\n export type Any = Specialize<BaseNode, { data?: any }>;\n export type Node<Data = any> = Specialize<BaseNode, { data: Data }>;\n}\n\n//\n// Edge\n//\n\nexport const Edge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n source: Schema.String,\n target: Schema.String,\n data: Schema.optional(Schema.Any),\n});\n\ninterface BaseEdge extends Schema.Schema.Type<typeof Edge> {}\n\nexport declare namespace Edge {\n export type Any = Specialize<BaseEdge, { data?: any }>;\n export type Edge<Data = any> = Specialize<BaseEdge, { data: Data }>;\n}\n\nconst KEY_REGEX = /\\w+/;\n\n// NOTE: The `relation` is different from the `type`.\ntype EdgeMeta = { source: string; target: string; relation?: string };\n\nexport const createEdgeId = ({ source, target, relation }: EdgeMeta) => {\n invariant(source.match(KEY_REGEX), `invalid source: ${source}`);\n invariant(target.match(KEY_REGEX), `invalid target: ${target}`);\n return [source, relation, target].join('_');\n};\n\nexport const parseEdgeId = (id: string): EdgeMeta => {\n const [source, relation, target] = id.split('_');\n invariant(source.length && target.length);\n return { source, relation: relation.length ? relation : undefined, target };\n};\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(Node)),\n edges: Schema.mutable(Schema.Array(Edge)),\n});\n\nexport interface Any extends Schema.Schema.Type<typeof Graph> {}\n\nexport type Graph<Node extends Node.Any, Edge extends Edge.Any> = Specialize<\n Any,\n {\n nodes: Node[];\n edges: Edge[];\n }\n>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport * as Graph from './Graph';\n\n/**\n * Optional function to wrap mutations (e.g., for ECHO objects that require Obj.change).\n */\nexport type GraphChangeFunction = (fn: () => void) => void;\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> {\n protected readonly _graph: Graph.Graph<Node, Edge>;\n /**\n * Optional function to wrap mutations.\n * When set, all graph mutations are wrapped in this function.\n */\n protected readonly _change?: GraphChangeFunction;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n * @param graph - The graph data.\n * @param change - Optional function to wrap mutations (e.g., Obj.change for ECHO objects).\n */\n constructor(graph?: Graph.Graph<Node, Edge>, change?: GraphChangeFunction) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\n this._change = change;\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n toJSON() {\n return {\n nodes: this.nodes.length,\n edges: this.edges.length,\n };\n }\n\n get graph(): Graph.Graph<Node, Edge> {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes;\n }\n\n get edges(): Edge[] {\n return this._graph.edges;\n }\n\n //\n // Nodes\n //\n\n findNode(id: string): Node | undefined {\n return this.nodes.find((node) => node.id === id);\n }\n\n getNode(id: string): Node {\n return this.findNode(id) ?? failedInvariant();\n }\n\n filterNodes({ type }: Partial<Graph.Node.Any> = {}): Node[] {\n return this.nodes.filter((node) => !type || type === node.type);\n }\n\n //\n // Edges\n //\n\n findEdge(id: string): Edge | undefined {\n return this.edges.find((edge) => edge.id === id);\n }\n\n getEdge(id: string): Edge {\n return this.findEdge(id) ?? failedInvariant();\n }\n\n filterEdges({ type, source, target }: Partial<Graph.Edge.Any> = {}): Edge[] {\n return this.edges.filter(\n (edge) =>\n (!type || type === edge.type) && (!source || source === edge.source) && (!target || target === edge.target),\n );\n }\n\n //\n // Traverse\n //\n\n traverse(root: Node): Node[] {\n return this._traverse(root);\n }\n\n private _traverse(root: Node, visited: Set<string> = new Set()): Node[] {\n if (visited.has(root.id)) {\n return [];\n }\n\n visited.add(root.id);\n const targets = this.filterEdges({ source: root.id })\n .map((edge) => this.getNode(edge.target))\n .filter(isTruthy);\n\n return [root, ...targets.flatMap((target) => this._traverse(target, visited))];\n }\n}\n\n/**\n * Mutable Graph wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractBuilder<Node, Edge, Model> = AbstractBuilder<Node, Edge, Model>,\n> extends ReadonlyGraphModel<Node, Edge> {\n /**\n * Allows chaining.\n */\n abstract get builder(): Builder;\n\n /**\n * Shallow copy of provided graph.\n */\n abstract copy(graph?: Partial<Graph.Graph<Node, Edge>>): Model;\n\n /**\n * Execute a mutation on the graph.\n * If a change function is set, wraps the mutation in it.\n */\n protected _mutate(fn: (graph: Graph.Graph<Node, Edge>) => void): void {\n if (this._change != null) {\n this._change(() => fn(this._graph));\n } else {\n fn(this._graph);\n }\n }\n\n clear(): this {\n this._mutate((graph) => {\n graph.nodes.length = 0;\n graph.edges.length = 0;\n });\n return this;\n }\n\n addGraph(graph: Model): this {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n return this;\n }\n\n addGraphs(graphs: Model[]): this {\n graphs.forEach((graph) => {\n this.addNodes(graph.nodes);\n this.addEdges(graph.edges);\n });\n return this;\n }\n\n addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n this._mutate((graph) => {\n graph.nodes.push(node);\n });\n return node;\n }\n\n addNodes(nodes: Node[]): Node[] {\n return nodes.map((node) => this.addNode(node));\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n // TODO(burdon): Generate random id.\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._mutate((graph) => {\n graph.edges.push(edge as Edge);\n });\n return edge as Edge;\n }\n\n addEdges(edges: Edge[]): Edge[] {\n return edges.map((edge) => this.addEdge(edge));\n }\n\n removeNode(id: string): Model {\n let removedEdges: Edge[] = [];\n let removedNodes: Node[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n removedNodes = removeBy<Node>(graph.nodes as Node[], (node) => node.id === id);\n });\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n removeNodes(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeNode(id));\n return this.copy().addGraphs(graphs);\n }\n\n removeEdge(id: string): Model {\n let removedEdges: Edge[] = [];\n this._mutate((graph) => {\n removedEdges = removeBy<Edge>(graph.edges as Edge[], (edge) => edge.id === id);\n });\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n removeEdges(ids: string[]): Model {\n const graphs = ids.map((id) => this.removeEdge(id));\n return this.copy().addGraphs(graphs);\n }\n}\n\n/**\n * Chainable builder wrapper\n */\nexport abstract class AbstractBuilder<\n Node extends Graph.Node.Any,\n Edge extends Graph.Edge.Any,\n Model extends GraphModel<Node, Edge>,\n> {\n constructor(protected readonly _model: Model) {}\n\n get model(): Model {\n return this._model;\n }\n\n call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n\n getNode(id: string): Node {\n return this.model.getNode(id);\n }\n\n addNode(node: Node): this {\n this._model.addNode(node);\n return this;\n }\n\n addEdge(edge: MakeOptional<Edge, 'id'>): this {\n this._model.addEdge(edge);\n return this;\n }\n\n addNodes(nodes: Node[]): this {\n this._model.addNodes(nodes);\n return this;\n }\n\n addEdges(edges: Edge[]): this {\n this._model.addEdges(edges);\n return this;\n }\n}\n\n/**\n * Basic model.\n */\nexport class GraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, Builder<Node, Edge>> {\n override get builder() {\n return new Builder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>(graph as Graph.Graph<Node, Edge>);\n }\n}\n\nexport type Subscription = <Node extends Graph.Node.Any = Graph.Node.Any, Edge extends Graph.Edge.Any = Graph.Edge.Any>(\n model: ReactiveGraphModel<Node, Edge>,\n graph: Graph.Graph<Node, Edge>,\n) => void;\n\n/**\n * Basic reactive model using Effect Atoms.\n */\n// NOTE: Unlike Preact Signals' `live()` which uses proxies for transparent reactivity,\n// Effect Atom requires explicit `registry.set()` calls. All mutation methods must be\n// overridden to update the atom immutably rather than mutating `_graph` directly.\nexport class ReactiveGraphModel<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends GraphModel<Node, Edge> {\n private readonly _graphAtom: Atom.Writable<Graph.Graph<Node, Edge>>;\n\n constructor(\n private readonly _registry: Registry.Registry,\n graph?: Partial<Graph.Graph<Node, Edge>>,\n ) {\n const initialGraph: Graph.Graph<Node, Edge> = {\n nodes: (graph?.nodes ?? []) as Node[],\n edges: (graph?.edges ?? []) as Edge[],\n };\n super(initialGraph);\n this._graphAtom = Atom.make<Graph.Graph<Node, Edge>>(initialGraph);\n }\n\n get registry(): Registry.Registry {\n return this._registry;\n }\n\n /**\n * Get the graph atom for reactive subscriptions.\n */\n get graphAtom(): Atom.Writable<Graph.Graph<Node, Edge>> {\n return this._graphAtom;\n }\n\n override get graph(): Graph.Graph<Node, Edge> {\n return this._registry.get(this._graphAtom);\n }\n\n override get nodes(): Node[] {\n return this.graph.nodes;\n }\n\n override get edges(): Edge[] {\n return this.graph.edges;\n }\n\n override copy(graph?: Partial<Graph.Graph<Node, Edge>>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(this._registry, graph);\n }\n\n override clear(): this {\n this._registry.set(this._graphAtom, {\n nodes: [],\n edges: [],\n });\n return this;\n }\n\n /**\n * Set the entire graph at once, triggering a single notification.\n */\n setGraph(graph: Graph.Graph<Node, Edge>): this {\n this._registry.set(this._graphAtom, graph);\n return this;\n }\n\n override addNode(node: Node): Node {\n invariant(node.id, 'ID is required');\n invariant(!this.findNode(node.id), `node already exists: ${node.id}`);\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n nodes: [...current.nodes, node],\n });\n return node;\n }\n\n override addEdge(edge: MakeOptional<Edge, 'id'>): Edge {\n invariant(edge.source);\n invariant(edge.target);\n if (!edge.id) {\n edge = { id: Graph.createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n const current = this._registry.get(this._graphAtom);\n this._registry.set(this._graphAtom, {\n ...current,\n edges: [...current.edges, edge as Edge],\n });\n return edge as Edge;\n }\n\n override removeNode(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.source === id || edge.target === id);\n const removedNodes = current.nodes.filter((node) => node.id === id);\n\n this._registry.set(this._graphAtom, {\n nodes: current.nodes.filter((node) => node.id !== id),\n edges: current.edges.filter((edge) => edge.source !== id && edge.target !== id),\n });\n\n return this.copy({ nodes: removedNodes, edges: removedEdges });\n }\n\n override removeEdge(id: string): ReactiveGraphModel<Node, Edge> {\n const current = this._registry.get(this._graphAtom);\n const removedEdges = current.edges.filter((edge) => edge.id === id);\n\n this._registry.set(this._graphAtom, {\n ...current,\n edges: current.edges.filter((edge) => edge.id !== id),\n });\n\n return this.copy({ nodes: [], edges: removedEdges });\n }\n\n /**\n * Subscribe to graph changes.\n */\n subscribe(cb: Subscription, fire = false): () => void {\n if (fire) {\n cb(this, this.graph);\n }\n\n // Prime the atom by reading before subscribing to avoid double-fire on first mutation.\n this._registry.get(this._graphAtom);\n\n return this._registry.subscribe(this._graphAtom, () => {\n cb(this, this.graph);\n });\n }\n}\n\n/**\n * Basic builder.\n */\nexport class Builder<\n Node extends Graph.Node.Any = Graph.Node.Any,\n Edge extends Graph.Edge.Any = Graph.Edge.Any,\n> extends AbstractBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Atom", "Registry", "invariant", "SelectionModel", "_registry", "_selected", "_singleSelect", "make", "Set", "selected", "getSelected", "get", "getSelectedIds", "Array", "from", "values", "subscribe", "cb", "toJSON", "getSize", "size", "contains", "id", "has", "clear", "set", "add", "current", "remove", "filter", "_id", "setSelected", "ids", "subtract", "toggleSelected", "undefined", "forEach", "delete", "Schema", "invariant", "Node", "Struct", "id", "String", "type", "optional", "data", "Any", "Edge", "source", "target", "KEY_REGEX", "createEdgeId", "relation", "match", "join", "parseEdgeId", "split", "length", "undefined", "Graph", "nodes", "mutable", "Array", "edges", "Atom", "inspectCustom", "failedInvariant", "invariant", "isTruthy", "removeBy", "ReadonlyGraphModel", "_graph", "_change", "graph", "change", "nodes", "edges", "inspectCustom", "toJSON", "length", "findNode", "id", "find", "node", "getNode", "failedInvariant", "filterNodes", "type", "filter", "findEdge", "edge", "getEdge", "filterEdges", "source", "target", "traverse", "root", "_traverse", "visited", "Set", "has", "add", "targets", "map", "isTruthy", "flatMap", "AbstractGraphModel", "_mutate", "fn", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removedEdges", "removedNodes", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "Builder", "ReactiveGraphModel", "_graphAtom", "_registry", "initialGraph", "Atom", "make", "registry", "graphAtom", "get", "set", "setGraph", "current", "subscribe", "fire"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/selection.ts":{"bytes":10724,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/Graph.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/selection.ts":{"bytes":10724,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/Graph.ts":{"bytes":6772,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/GraphModel.ts":{"bytes":40371,"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/Graph.ts","kind":"import-statement","original":"./Graph"}],"format":"esm"},"src/index.ts":{"bytes":751,"imports":[{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/Graph.ts","kind":"import-statement","original":"./Graph"},{"path":"src/GraphModel.ts","kind":"import-statement","original":"./GraphModel"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":28663},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@effect-atom/atom-react","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["Graph","GraphModel","SelectionModel"],"entryPoint":"src/index.ts","inputs":{"src/selection.ts":{"bytesInOutput":2694},"src/index.ts":{"bytesInOutput":0},"src/Graph.ts":{"bytesInOutput":1727},"src/GraphModel.ts":{"bytesInOutput":9864}},"bytes":14730}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../../../src/Graph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../../../src/Graph.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,eAAO,MAAM,IAAI;;;;EAIf,CAAC;AAEH,UAAU,QAAS,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;CAAG;AAE7D,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACvD,KAAY,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CACrE;AAMD,eAAO,MAAM,IAAI;;;;;;EAMf,CAAC;AAEH,UAAU,QAAS,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC;CAAG;AAE7D,MAAM,CAAC,OAAO,WAAW,IAAI,CAAC;IAC5B,KAAY,GAAG,GAAG,UAAU,CAAC,QAAQ,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACvD,KAAY,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,UAAU,CAAC,QAAQ,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;CACrE;AAKD,KAAK,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,eAAO,MAAM,YAAY,GAAI,8BAA8B,QAAQ,WAIlE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,QAIxC,CAAC;AAMF,eAAO,MAAM,KAAK;;;;;;;;;;;;;;EAIhB,CAAC;AAEH,MAAM,WAAW,GAAI,SAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC;CAAG;AAEhE,MAAM,MAAM,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,SAAS,IAAI,CAAC,GAAG,IAAI,UAAU,CAC1E,GAAG,EACH;IACE,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf,CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphModel.d.ts","sourceRoot":"","sources":["../../../src/GraphModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GraphModel.d.ts","sourceRoot":"","sources":["../../../src/GraphModel.ts"],"names":[],"mappings":"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"}
|