@dxos/graph 0.8.4-main.c1de068 → 0.8.4-main.c4373fc

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.
@@ -3,7 +3,7 @@ import { effect } from "@preact/signals-core";
3
3
  import { inspectCustom } from "@dxos/debug";
4
4
  import { failedInvariant, invariant as invariant2 } from "@dxos/invariant";
5
5
  import { live } from "@dxos/live-object";
6
- import { isNotFalsy, removeBy } from "@dxos/util";
6
+ import { isTruthy, removeBy } from "@dxos/util";
7
7
 
8
8
  // src/util.ts
9
9
  import { invariant } from "@dxos/invariant";
@@ -53,18 +53,23 @@ var parseEdgeId = (id) => {
53
53
  };
54
54
 
55
55
  // src/model.ts
56
+ function _define_property(obj, key, value) {
57
+ if (key in obj) {
58
+ Object.defineProperty(obj, key, {
59
+ value,
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true
63
+ });
64
+ } else {
65
+ obj[key] = value;
66
+ }
67
+ return obj;
68
+ }
56
69
  var __dxlog_file2 = "/__w/dxos/dxos/packages/common/graph/src/model.ts";
70
+ var _inspectCustom = inspectCustom;
57
71
  var ReadonlyGraphModel = class {
58
- /**
59
- * NOTE: Pass in simple Graph or Live.
60
- */
61
- constructor(graph) {
62
- this._graph = graph ?? {
63
- nodes: [],
64
- edges: []
65
- };
66
- }
67
- [inspectCustom]() {
72
+ [_inspectCustom]() {
68
73
  return this.toJSON();
69
74
  }
70
75
  /**
@@ -122,12 +127,22 @@ var ReadonlyGraphModel = class {
122
127
  visited.add(root.id);
123
128
  const targets = this.filterEdges({
124
129
  source: root.id
125
- }).map((edge) => this.getNode(edge.target)).filter(isNotFalsy);
130
+ }).map((edge) => this.getNode(edge.target)).filter(isTruthy);
126
131
  return [
127
132
  root,
128
133
  ...targets.flatMap((target) => this._traverse(target, visited))
129
134
  ];
130
135
  }
136
+ /**
137
+ * NOTE: Pass in simple Graph or Live.
138
+ */
139
+ constructor(graph) {
140
+ _define_property(this, "_graph", void 0);
141
+ this._graph = graph ?? {
142
+ nodes: [],
143
+ edges: []
144
+ };
145
+ }
131
146
  };
132
147
  var AbstractGraphModel = class extends ReadonlyGraphModel {
133
148
  clear() {
@@ -237,9 +252,6 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
237
252
  }
238
253
  };
239
254
  var AbstractGraphBuilder = class {
240
- constructor(_model) {
241
- this._model = _model;
242
- }
243
255
  get model() {
244
256
  return this._model;
245
257
  }
@@ -266,6 +278,10 @@ var AbstractGraphBuilder = class {
266
278
  this._model.addEdges(edges);
267
279
  return this;
268
280
  }
281
+ constructor(_model) {
282
+ _define_property(this, "_model", void 0);
283
+ this._model = _model;
284
+ }
269
285
  };
270
286
  var GraphModel = class _GraphModel extends AbstractGraphModel {
271
287
  get builder() {
@@ -287,18 +303,18 @@ var subscribe = (model, cb, fire = false) => {
287
303
  });
288
304
  };
289
305
  var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
290
- constructor(graph) {
291
- super(live({
292
- nodes: graph?.nodes ?? [],
293
- edges: graph?.edges ?? []
294
- }));
295
- }
296
306
  copy(graph) {
297
307
  return new _ReactiveGraphModel(graph);
298
308
  }
299
309
  subscribe(cb, fire = false) {
300
310
  return subscribe(this, cb, fire);
301
311
  }
312
+ constructor(graph) {
313
+ super(live({
314
+ nodes: graph?.nodes ?? [],
315
+ edges: graph?.edges ?? []
316
+ }));
317
+ }
302
318
  };
303
319
  var GraphBuilder = class extends AbstractGraphBuilder {
304
320
  call(cb) {
@@ -310,13 +326,21 @@ var GraphBuilder = class extends AbstractGraphBuilder {
310
326
  // src/selection.ts
311
327
  import { computed, signal } from "@preact/signals-core";
312
328
  import { invariant as invariant3 } from "@dxos/invariant";
329
+ function _define_property2(obj, key, value) {
330
+ if (key in obj) {
331
+ Object.defineProperty(obj, key, {
332
+ value,
333
+ enumerable: true,
334
+ configurable: true,
335
+ writable: true
336
+ });
337
+ } else {
338
+ obj[key] = value;
339
+ }
340
+ return obj;
341
+ }
313
342
  var __dxlog_file3 = "/__w/dxos/dxos/packages/common/graph/src/selection.ts";
314
343
  var SelectionModel = class {
315
- constructor(_singleSelect = false) {
316
- this._singleSelect = _singleSelect;
317
- this._selected = signal(/* @__PURE__ */ new Set());
318
- this._selectedIds = computed(() => Array.from(this._selected.value.values()));
319
- }
320
344
  toJSON() {
321
345
  return {
322
346
  selected: Array.from(this._selected.value.values())
@@ -381,10 +405,18 @@ var SelectionModel = class {
381
405
  });
382
406
  this._selected.value = set;
383
407
  }
408
+ constructor(_singleSelect = false) {
409
+ _define_property2(this, "_singleSelect", void 0);
410
+ _define_property2(this, "_selected", void 0);
411
+ _define_property2(this, "_selectedIds", void 0);
412
+ this._singleSelect = _singleSelect;
413
+ this._selected = signal(/* @__PURE__ */ new Set());
414
+ this._selectedIds = computed(() => Array.from(this._selected.value.values()));
415
+ }
384
416
  };
385
417
 
386
418
  // src/types.ts
387
- import { Schema } from "effect";
419
+ import * as Schema from "effect/Schema";
388
420
  var BaseGraphNode = Schema.Struct({
389
421
  id: Schema.String,
390
422
  type: Schema.optional(Schema.String),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/model.ts", "../../../src/util.ts", "../../../src/selection.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { effect } from '@preact/signals-core';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type Live, live } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> {\n protected readonly _graph: Graph;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n */\n constructor(graph?: Graph) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\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 {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes as Node[];\n }\n\n get edges(): Edge[] {\n return this._graph.edges as Edge[];\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<GraphNode.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<GraphEdge> = {}): 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(isNotFalsy);\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractGraphBuilder<Node, Edge, Model> = AbstractGraphBuilder<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>): Model;\n\n clear(): this {\n this._graph.nodes.length = 0;\n this._graph.edges.length = 0;\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._graph.nodes.push(node);\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: createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._graph.edges.push(edge as Edge);\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n const nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n return this.copy({ nodes, edges });\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.id === id);\n return this.copy({ nodes: [], edges });\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 AbstractGraphBuilder<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, GraphBuilder<Node, Edge>> {\n override get builder() {\n return new GraphBuilder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\n\nexport type GraphModelSubscription = (model: GraphModel, graph: Live<Graph>) => void;\n\n/**\n * Subscription.\n * NOTE: Requires `registerSignalsRuntime` to be called.\n */\nexport const subscribe = (model: GraphModel, cb: GraphModelSubscription, fire = false) => {\n if (fire) {\n cb(model, model.graph);\n }\n\n return effect(() => {\n cb(model, model.graph); // TODO(burdon): This won't work unless model.graph is reactive.\n });\n};\n\n/**\n * Basic reactive model.\n */\nexport class ReactiveGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends GraphModel<Node, Edge> {\n constructor(graph?: Partial<Graph>) {\n super(\n live({\n nodes: graph?.nodes ?? [],\n edges: graph?.edges ?? [],\n }),\n );\n }\n\n override copy(graph?: Partial<Graph>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(graph);\n }\n\n subscribe(cb: GraphModelSubscription, fire = false): () => void {\n return subscribe(this, cb, fire);\n }\n}\n\n/**\n * Basic builder.\n */\nexport class GraphBuilder<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\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// Copyright 2024 DXOS.org\n//\n\nimport { computed, signal, type ReadonlySignal, type Signal } from '@preact/signals-core';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _selected: Signal<Set<string>> = signal(new Set<string>());\n private readonly _selectedIds = computed(() => Array.from(this._selected.value.values()));\n\n constructor(private readonly _singleSelect: boolean = false) {}\n\n toJSON(): { selected: string[] } {\n return {\n selected: Array.from(this._selected.value.values()),\n };\n }\n\n get size(): number {\n return this._selected.value.size;\n }\n\n get selected(): ReadonlySignal<string[]> {\n return this._selectedIds;\n }\n\n contains(id: string): boolean {\n return this._selected.value.has(id);\n }\n\n clear(): void {\n this._selected.value = new Set();\n }\n\n add(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(\n this._singleSelect ? [id] : [...Array.from(this._selected.value.values()), id],\n );\n }\n\n remove(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(Array.from(this._selected.value.values()).filter((_id) => _id !== id));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], shift = false): void {\n this._selected.value = new Set([...(shift ? Array.from(this._selected.value.values()) : []), ...ids]);\n }\n\n toggleSelected(ids: string[], shift = false): void {\n const set = new Set<string>(shift ? Array.from(this._selected.value.values()) : undefined);\n ids.forEach((id) => {\n if (this._selected.value.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._selected.value = set;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\n// TODO(burdon): Make type extensible (i.e., not dependent on `data` property)?\nexport const BaseGraphNode = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\ntype GraphNode<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphNode,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphNode {\n export type Any = GraphNode<any, true>;\n export type Optional<Data = any> = GraphNode<Data, true>;\n export type Required<Data = any> = GraphNode<Data, false>;\n}\n\n//\n// Edge\n//\n\nexport const BaseGraphEdge = 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\n/** Raw base type. */\nexport type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;\n\n/** Typed edge data. */\nexport type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphEdge,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphEdge {\n export type Any = GraphEdge<any, true>;\n export type Optional<Data = any> = GraphEdge<Data, true>;\n export type Required<Data = any> = GraphEdge<Data, false>;\n}\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(BaseGraphNode)),\n edges: Schema.mutable(Schema.Array(BaseGraphEdge)),\n});\n\nexport type Graph = Schema.Schema.Type<typeof Graph>;\n"],
5
- "mappings": ";AAIA,SAASA,cAAc;AAEvB,SAASC,qBAAqB;AAC9B,SAASC,iBAAiBC,aAAAA,kBAAiB;AAC3C,SAAoBC,YAAY;AAChC,SAA4BC,YAAYC,gBAAgB;;;ACLxD,SAASC,iBAAiB;;AAE1B,IAAMC,YAAY;AAKX,IAAMC,eAAe,CAAC,EAAEC,QAAQC,QAAQC,SAAQ,MAAY;AACjEL,YAAUG,OAAOG,MAAML,SAAAA,GAAY,mBAAmBE,MAAAA,IAAQ;;;;;;;;;AAC9DH,YAAUI,OAAOE,MAAML,SAAAA,GAAY,mBAAmBG,MAAAA,IAAQ;;;;;;;;;AAC9D,SAAO;IAACD;IAAQE;IAAUD;IAAQG,KAAK,GAAA;AACzC;AAEO,IAAMC,cAAc,CAACC,OAAAA;AAC1B,QAAM,CAACN,QAAQE,UAAUD,MAAAA,IAAUK,GAAGC,MAAM,GAAA;AAC5CV,YAAUG,OAAOQ,UAAUP,OAAOO,QAAM,QAAA;;;;;;;;;AACxC,SAAO;IAAER;IAAQE,UAAUA,SAASM,SAASN,WAAWO;IAAWR;EAAO;AAC5E;;;;ADJO,IAAMS,qBAAN,MAAMA;;;;EASX,YAAYC,OAAe;AACzB,SAAKC,SAASD,SAAS;MACrBE,OAAO,CAAA;MACPC,OAAO,CAAA;IACT;EACF;EAEA,CAACC,aAAAA,IAAiB;AAChB,WAAO,KAAKC,OAAM;EACpB;;;;EAKAA,SAAS;AACP,WAAO;MACLH,OAAO,KAAKA,MAAMI;MAClBH,OAAO,KAAKA,MAAMG;IACpB;EACF;EAEA,IAAIN,QAAe;AACjB,WAAO,KAAKC;EACd;EAEA,IAAIC,QAAgB;AAClB,WAAO,KAAKD,OAAOC;EACrB;EAEA,IAAIC,QAAgB;AAClB,WAAO,KAAKF,OAAOE;EACrB;;;;EAMAI,SAASC,IAA8B;AACrC,WAAO,KAAKN,MAAMO,KAAK,CAACC,SAASA,KAAKF,OAAOA,EAAAA;EAC/C;EAEAG,QAAQH,IAAkB;AACxB,WAAO,KAAKD,SAASC,EAAAA,KAAOI,gBAAAA;EAC9B;EAEAC,YAAY,EAAEC,KAAI,IAA6B,CAAC,GAAW;AACzD,WAAO,KAAKZ,MAAMa,OAAO,CAACL,SAAS,CAACI,QAAQA,SAASJ,KAAKI,IAAI;EAChE;;;;EAMAE,SAASR,IAA8B;AACrC,WAAO,KAAKL,MAAMM,KAAK,CAACQ,SAASA,KAAKT,OAAOA,EAAAA;EAC/C;EAEAU,QAAQV,IAAkB;AACxB,WAAO,KAAKQ,SAASR,EAAAA,KAAOI,gBAAAA;EAC9B;EAEAO,YAAY,EAAEL,MAAMM,QAAQC,OAAM,IAAyB,CAAC,GAAW;AACrE,WAAO,KAAKlB,MAAMY,OAChB,CAACE,UACE,CAACH,QAAQA,SAASG,KAAKH,UAAU,CAACM,UAAUA,WAAWH,KAAKG,YAAY,CAACC,UAAUA,WAAWJ,KAAKI,OAAK;EAE/G;;;;EAMAC,SAASC,MAAoB;AAC3B,WAAO,KAAKC,UAAUD,IAAAA;EACxB;EAEQC,UAAUD,MAAYE,UAAuB,oBAAIC,IAAAA,GAAe;AACtE,QAAID,QAAQE,IAAIJ,KAAKf,EAAE,GAAG;AACxB,aAAO,CAAA;IACT;AAEAiB,YAAQG,IAAIL,KAAKf,EAAE;AACnB,UAAMqB,UAAU,KAAKV,YAAY;MAAEC,QAAQG,KAAKf;IAAG,CAAA,EAChDsB,IAAI,CAACb,SAAS,KAAKN,QAAQM,KAAKI,MAAM,CAAA,EACtCN,OAAOgB,UAAAA;AAEV,WAAO;MAACR;SAASM,QAAQG,QAAQ,CAACX,WAAW,KAAKG,UAAUH,QAAQI,OAAAA,CAAAA;;EACtE;AACF;AAKO,IAAeQ,qBAAf,cAKGlC,mBAAAA;EAWRmC,QAAc;AACZ,SAAKjC,OAAOC,MAAMI,SAAS;AAC3B,SAAKL,OAAOE,MAAMG,SAAS;AAC3B,WAAO;EACT;EAEA6B,SAASnC,OAAoB;AAC3B,SAAKoC,SAASpC,MAAME,KAAK;AACzB,SAAKmC,SAASrC,MAAMG,KAAK;AACzB,WAAO;EACT;EAEAmC,UAAUC,QAAuB;AAC/BA,WAAOC,QAAQ,CAACxC,UAAAA;AACd,WAAKoC,SAASpC,MAAME,KAAK;AACzB,WAAKmC,SAASrC,MAAMG,KAAK;IAC3B,CAAA;AACA,WAAO;EACT;EAEAsC,QAAQ/B,MAAkB;AACxBgC,IAAAA,WAAUhC,KAAKF,IAAI,kBAAA;;;;;;;;;AACnBkC,IAAAA,WAAU,CAAC,KAAKnC,SAASG,KAAKF,EAAE,GAAG,wBAAwBE,KAAKF,EAAE,IAAE;;;;;;;;;AACpE,SAAKP,OAAOC,MAAMyC,KAAKjC,IAAAA;AACvB,WAAOA;EACT;EAEA0B,SAASlC,OAAuB;AAC9B,WAAOA,MAAM4B,IAAI,CAACpB,SAAS,KAAK+B,QAAQ/B,IAAAA,CAAAA;EAC1C;EAEAkC,QAAQ3B,MAAsC;AAC5CyB,IAAAA,WAAUzB,KAAKG,QAAM,QAAA;;;;;;;;;AACrBsB,IAAAA,WAAUzB,KAAKI,QAAM,QAAA;;;;;;;;;AACrB,QAAI,CAACJ,KAAKT,IAAI;AAEZS,aAAO;QAAET,IAAIqC,aAAa5B,IAAAA;QAAO,GAAGA;MAAK;IAC3C;AACAyB,IAAAA,WAAU,CAAC,KAAKnC,SAASU,KAAKT,EAAE,GAAA,QAAA;;;;;;;;;AAChC,SAAKP,OAAOE,MAAMwC,KAAK1B,IAAAA;AACvB,WAAOA;EACT;EAEAoB,SAASlC,OAAuB;AAC9B,WAAOA,MAAM2B,IAAI,CAACb,SAAS,KAAK2B,QAAQ3B,IAAAA,CAAAA;EAC1C;EAEA6B,WAAWtC,IAAmB;AAC5B,UAAML,QAAQ4C,SAAe,KAAK9C,OAAOE,OAAiB,CAACc,SAASA,KAAKG,WAAWZ,MAAMS,KAAKI,WAAWb,EAAAA;AAC1G,UAAMN,QAAQ6C,SAAe,KAAK9C,OAAOC,OAAiB,CAACQ,SAASA,KAAKF,OAAOA,EAAAA;AAChF,WAAO,KAAKwC,KAAK;MAAE9C;MAAOC;IAAM,CAAA;EAClC;EAEA8C,YAAYC,KAAsB;AAChC,UAAMX,SAASW,IAAIpB,IAAI,CAACtB,OAAO,KAAKsC,WAAWtC,EAAAA,CAAAA;AAC/C,WAAO,KAAKwC,KAAI,EAAGV,UAAUC,MAAAA;EAC/B;EAEAY,WAAW3C,IAAmB;AAC5B,UAAML,QAAQ4C,SAAe,KAAK9C,OAAOE,OAAiB,CAACc,SAASA,KAAKT,OAAOA,EAAAA;AAChF,WAAO,KAAKwC,KAAK;MAAE9C,OAAO,CAAA;MAAIC;IAAM,CAAA;EACtC;EAEAiD,YAAYF,KAAsB;AAChC,UAAMX,SAASW,IAAIpB,IAAI,CAACtB,OAAO,KAAK2C,WAAW3C,EAAAA,CAAAA;AAC/C,WAAO,KAAKwC,KAAI,EAAGV,UAAUC,MAAAA;EAC/B;AACF;AAKO,IAAec,uBAAf,MAAeA;EAKpB,YAA+BC,QAAe;SAAfA,SAAAA;EAAgB;EAE/C,IAAIC,QAAe;AACjB,WAAO,KAAKD;EACd;EAEAE,KAAKC,IAAmC;AACtCA,OAAG,IAAI;AACP,WAAO;EACT;EAEA9C,QAAQH,IAAkB;AACxB,WAAO,KAAK+C,MAAM5C,QAAQH,EAAAA;EAC5B;EAEAiC,QAAQ/B,MAAkB;AACxB,SAAK4C,OAAOb,QAAQ/B,IAAAA;AACpB,WAAO;EACT;EAEAkC,QAAQ3B,MAAsC;AAC5C,SAAKqC,OAAOV,QAAQ3B,IAAAA;AACpB,WAAO;EACT;EAEAmB,SAASlC,OAAqB;AAC5B,SAAKoD,OAAOlB,SAASlC,KAAAA;AACrB,WAAO;EACT;EAEAmC,SAASlC,OAAqB;AAC5B,SAAKmD,OAAOjB,SAASlC,KAAAA;AACrB,WAAO;EACT;AACF;AAKO,IAAMuD,aAAN,MAAMA,oBAGHzB,mBAAAA;EACR,IAAa0B,UAAU;AACrB,WAAO,IAAIC,aAAyB,IAAI;EAC1C;EAESZ,KAAKhD,OAAgD;AAC5D,WAAO,IAAI0D,YAAuB;MAAExD,OAAOF,OAAOE,SAAS,CAAA;MAAIC,OAAOH,OAAOG,SAAS,CAAA;IAAG,CAAA;EAC3F;AACF;AAQO,IAAM0D,YAAY,CAACN,OAAmBE,IAA4BK,OAAO,UAAK;AACnF,MAAIA,MAAM;AACRL,OAAGF,OAAOA,MAAMvD,KAAK;EACvB;AAEA,SAAO+D,OAAO,MAAA;AACZN,OAAGF,OAAOA,MAAMvD,KAAK;EACvB,CAAA;AACF;AAKO,IAAMgE,qBAAN,MAAMA,4BAGHN,WAAAA;EACR,YAAY1D,OAAwB;AAClC,UACEiE,KAAK;MACH/D,OAAOF,OAAOE,SAAS,CAAA;MACvBC,OAAOH,OAAOG,SAAS,CAAA;IACzB,CAAA,CAAA;EAEJ;EAES6C,KAAKhD,OAAwD;AACpE,WAAO,IAAIgE,oBAA+BhE,KAAAA;EAC5C;EAEA6D,UAAUJ,IAA4BK,OAAO,OAAmB;AAC9D,WAAOD,UAAU,MAAMJ,IAAIK,IAAAA;EAC7B;AACF;AAKO,IAAMF,eAAN,cAGGP,qBAAAA;EACCG,KAAKC,IAAmC;AAC/CA,OAAG,IAAI;AACP,WAAO;EACT;AACF;;;AExTA,SAASS,UAAUC,cAAgD;AAEnE,SAASC,aAAAA,kBAAiB;;AAKnB,IAAMC,iBAAN,MAAMA;EAIX,YAA6BC,gBAAyB,OAAO;SAAhCA,gBAAAA;SAHZC,YAAiCJ,OAAO,oBAAIK,IAAAA,CAAAA;SAC5CC,eAAeP,SAAS,MAAMQ,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA,CAAA;EAEvB;EAE9DC,SAAiC;AAC/B,WAAO;MACLC,UAAUL,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA;IAClD;EACF;EAEA,IAAIG,OAAe;AACjB,WAAO,KAAKT,UAAUK,MAAMI;EAC9B;EAEA,IAAID,WAAqC;AACvC,WAAO,KAAKN;EACd;EAEAQ,SAASC,IAAqB;AAC5B,WAAO,KAAKX,UAAUK,MAAMO,IAAID,EAAAA;EAClC;EAEAE,QAAc;AACZ,SAAKb,UAAUK,QAAQ,oBAAIJ,IAAAA;EAC7B;EAEAa,IAAIH,IAAkB;AACpBd,IAAAA,WAAUc,IAAAA,QAAAA;;;;;;;;;AACV,SAAKX,UAAUK,QAAQ,IAAIJ,IACzB,KAAKF,gBAAgB;MAACY;QAAM;SAAIR,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA;MAAKK;KAAG;EAElF;EAEAI,OAAOJ,IAAkB;AACvBd,IAAAA,WAAUc,IAAAA,QAAAA;;;;;;;;;AACV,SAAKX,UAAUK,QAAQ,IAAIJ,IAAYE,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA,EAAIU,OAAO,CAACC,QAAQA,QAAQN,EAAAA,CAAAA;EAC3G;;EAIAO,YAAYC,KAAeC,QAAQ,OAAa;AAC9C,SAAKpB,UAAUK,QAAQ,oBAAIJ,IAAI;SAAKmB,QAAQjB,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA,IAAM,CAAA;SAAQa;KAAI;EACtG;EAEAE,eAAeF,KAAeC,QAAQ,OAAa;AACjD,UAAME,MAAM,IAAIrB,IAAYmB,QAAQjB,MAAMC,KAAK,KAAKJ,UAAUK,MAAMC,OAAM,CAAA,IAAMiB,MAAAA;AAChFJ,QAAIK,QAAQ,CAACb,OAAAA;AACX,UAAI,KAAKX,UAAUK,MAAMO,IAAID,EAAAA,GAAK;AAChCW,YAAIG,OAAOd,EAAAA;MACb,OAAO;AACLW,YAAIR,IAAIH,EAAAA;MACV;IACF,CAAA;AAEA,SAAKX,UAAUK,QAAQiB;EACzB;AACF;;;ACjEA,SAASI,cAAc;AAShB,IAAMC,gBAAgBC,OAAOC,OAAO;EACzCC,IAAIF,OAAOG;EACXC,MAAMJ,OAAOK,SAASL,OAAOG,MAAM;EACnCG,MAAMN,OAAOK,SAASL,OAAOO,GAAG;AAClC,CAAA;AAqBO,IAAMC,gBAAgBR,OAAOC,OAAO;EACzCC,IAAIF,OAAOG;EACXC,MAAMJ,OAAOK,SAASL,OAAOG,MAAM;EACnCM,QAAQT,OAAOG;EACfO,QAAQV,OAAOG;EACfG,MAAMN,OAAOK,SAASL,OAAOO,GAAG;AAClC,CAAA;AAqBO,IAAMI,QAAQX,OAAOC,OAAO;EACjCC,IAAIF,OAAOK,SAASL,OAAOG,MAAM;EACjCS,OAAOZ,OAAOa,QAAQb,OAAOc,MAAMf,aAAAA,CAAAA;EACnCgB,OAAOf,OAAOa,QAAQb,OAAOc,MAAMN,aAAAA,CAAAA;AACrC,CAAA;",
6
- "names": ["effect", "inspectCustom", "failedInvariant", "invariant", "live", "isNotFalsy", "removeBy", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "graph", "_graph", "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", "isNotFalsy", "flatMap", "AbstractGraphModel", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "subscribe", "fire", "effect", "ReactiveGraphModel", "live", "computed", "signal", "invariant", "SelectionModel", "_singleSelect", "_selected", "Set", "_selectedIds", "Array", "from", "value", "values", "toJSON", "selected", "size", "contains", "id", "has", "clear", "add", "remove", "filter", "_id", "setSelected", "ids", "shift", "toggleSelected", "set", "undefined", "forEach", "delete", "Schema", "BaseGraphNode", "Schema", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "Graph", "nodes", "mutable", "Array", "edges"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { effect } from '@preact/signals-core';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type Live, live } from '@dxos/live-object';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> {\n protected readonly _graph: Graph;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n */\n constructor(graph?: Graph) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\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 {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes as Node[];\n }\n\n get edges(): Edge[] {\n return this._graph.edges as Edge[];\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<GraphNode.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<GraphEdge> = {}): 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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractGraphBuilder<Node, Edge, Model> = AbstractGraphBuilder<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>): Model;\n\n clear(): this {\n this._graph.nodes.length = 0;\n this._graph.edges.length = 0;\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._graph.nodes.push(node);\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: createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._graph.edges.push(edge as Edge);\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n const nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n return this.copy({ nodes, edges });\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.id === id);\n return this.copy({ nodes: [], edges });\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 AbstractGraphBuilder<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, GraphBuilder<Node, Edge>> {\n override get builder() {\n return new GraphBuilder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\n\nexport type GraphModelSubscription = (model: GraphModel, graph: Live<Graph>) => void;\n\n/**\n * Subscription.\n * NOTE: Requires `registerSignalsRuntime` to be called.\n */\nexport const subscribe = (model: GraphModel, cb: GraphModelSubscription, fire = false) => {\n if (fire) {\n cb(model, model.graph);\n }\n\n return effect(() => {\n cb(model, model.graph); // TODO(burdon): This won't work unless model.graph is reactive.\n });\n};\n\n/**\n * Basic reactive model.\n */\nexport class ReactiveGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends GraphModel<Node, Edge> {\n constructor(graph?: Partial<Graph>) {\n super(\n live({\n nodes: graph?.nodes ?? [],\n edges: graph?.edges ?? [],\n }),\n );\n }\n\n override copy(graph?: Partial<Graph>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(graph);\n }\n\n subscribe(cb: GraphModelSubscription, fire = false): () => void {\n return subscribe(this, cb, fire);\n }\n}\n\n/**\n * Basic builder.\n */\nexport class GraphBuilder<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\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// Copyright 2024 DXOS.org\n//\n\nimport { type ReadonlySignal, type Signal, computed, signal } from '@preact/signals-core';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _selected: Signal<Set<string>> = signal(new Set<string>());\n private readonly _selectedIds = computed(() => Array.from(this._selected.value.values()));\n\n constructor(private readonly _singleSelect: boolean = false) {}\n\n toJSON(): { selected: string[] } {\n return {\n selected: Array.from(this._selected.value.values()),\n };\n }\n\n get size(): number {\n return this._selected.value.size;\n }\n\n get selected(): ReadonlySignal<string[]> {\n return this._selectedIds;\n }\n\n contains(id: string): boolean {\n return this._selected.value.has(id);\n }\n\n clear(): void {\n this._selected.value = new Set();\n }\n\n add(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(\n this._singleSelect ? [id] : [...Array.from(this._selected.value.values()), id],\n );\n }\n\n remove(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(Array.from(this._selected.value.values()).filter((_id) => _id !== id));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], shift = false): void {\n this._selected.value = new Set([...(shift ? Array.from(this._selected.value.values()) : []), ...ids]);\n }\n\n toggleSelected(ids: string[], shift = false): void {\n const set = new Set<string>(shift ? Array.from(this._selected.value.values()) : undefined);\n ids.forEach((id) => {\n if (this._selected.value.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._selected.value = set;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\n// TODO(burdon): Make type extensible (i.e., not dependent on `data` property)?\nexport const BaseGraphNode = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\ntype GraphNode<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphNode,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphNode {\n export type Any = GraphNode<any, true>;\n export type Optional<Data = any> = GraphNode<Data, true>;\n export type Required<Data = any> = GraphNode<Data, false>;\n}\n\n//\n// Edge\n//\n\nexport const BaseGraphEdge = 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\n/** Raw base type. */\nexport type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;\n\n/** Typed edge data. */\nexport type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphEdge,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphEdge {\n export type Any = GraphEdge<any, true>;\n export type Optional<Data = any> = GraphEdge<Data, true>;\n export type Required<Data = any> = GraphEdge<Data, false>;\n}\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(BaseGraphNode)),\n edges: Schema.mutable(Schema.Array(BaseGraphEdge)),\n});\n\nexport type Graph = Schema.Schema.Type<typeof Graph>;\n"],
5
+ "mappings": "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",
6
+ "names": ["effect", "inspectCustom", "failedInvariant", "invariant", "live", "isTruthy", "removeBy", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "inspectCustom", "ReadonlyGraphModel", "toJSON", "nodes", "length", "edges", "graph", "_graph", "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", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "model", "_model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "subscribe", "fire", "effect", "ReactiveGraphModel", "live", "computed", "signal", "invariant", "SelectionModel", "toJSON", "selected", "Array", "from", "_selected", "value", "values", "size", "_selectedIds", "contains", "id", "has", "clear", "Set", "add", "_singleSelect", "remove", "filter", "_id", "setSelected", "ids", "shift", "toggleSelected", "set", "undefined", "forEach", "delete", "_define_property", "Schema", "BaseGraphNode", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "Graph", "nodes", "mutable", "Array", "edges"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"src/util.ts":{"bytes":3257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/model.ts":{"bytes":25663,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/selection.ts":{"bytes":7392,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/types.ts":{"bytes":4606,"imports":[{"path":"effect","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":691,"imports":[{"path":"src/model.ts","kind":"import-statement","original":"./model"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":20774},"dist/lib/browser/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReactiveGraphModel","ReadonlyGraphModel","SelectionModel","createEdgeId","parseEdgeId","subscribe"],"entryPoint":"src/index.ts","inputs":{"src/model.ts":{"bytesInOutput":5692},"src/util.ts":{"bytesInOutput":1014},"src/index.ts":{"bytesInOutput":0},"src/selection.ts":{"bytesInOutput":1862},"src/types.ts":{"bytesInOutput":534}},"bytes":9460}}}
1
+ {"inputs":{"src/util.ts":{"bytes":3257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/model.ts":{"bytes":26127,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/selection.ts":{"bytes":7853,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/types.ts":{"bytes":4622,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":691,"imports":[{"path":"src/model.ts","kind":"import-statement","original":"./model"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":20822},"dist/lib/browser/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReactiveGraphModel","ReadonlyGraphModel","SelectionModel","createEdgeId","parseEdgeId","subscribe"],"entryPoint":"src/index.ts","inputs":{"src/model.ts":{"bytesInOutput":6065},"src/util.ts":{"bytesInOutput":1014},"src/index.ts":{"bytesInOutput":0},"src/selection.ts":{"bytesInOutput":2268},"src/types.ts":{"bytesInOutput":542}},"bytes":10247}}}
@@ -5,7 +5,7 @@ import { effect } from "@preact/signals-core";
5
5
  import { inspectCustom } from "@dxos/debug";
6
6
  import { failedInvariant, invariant as invariant2 } from "@dxos/invariant";
7
7
  import { live } from "@dxos/live-object";
8
- import { isNotFalsy, removeBy } from "@dxos/util";
8
+ import { isTruthy, removeBy } from "@dxos/util";
9
9
 
10
10
  // src/util.ts
11
11
  import { invariant } from "@dxos/invariant";
@@ -55,18 +55,23 @@ var parseEdgeId = (id) => {
55
55
  };
56
56
 
57
57
  // src/model.ts
58
+ function _define_property(obj, key, value) {
59
+ if (key in obj) {
60
+ Object.defineProperty(obj, key, {
61
+ value,
62
+ enumerable: true,
63
+ configurable: true,
64
+ writable: true
65
+ });
66
+ } else {
67
+ obj[key] = value;
68
+ }
69
+ return obj;
70
+ }
58
71
  var __dxlog_file2 = "/__w/dxos/dxos/packages/common/graph/src/model.ts";
72
+ var _inspectCustom = inspectCustom;
59
73
  var ReadonlyGraphModel = class {
60
- /**
61
- * NOTE: Pass in simple Graph or Live.
62
- */
63
- constructor(graph) {
64
- this._graph = graph ?? {
65
- nodes: [],
66
- edges: []
67
- };
68
- }
69
- [inspectCustom]() {
74
+ [_inspectCustom]() {
70
75
  return this.toJSON();
71
76
  }
72
77
  /**
@@ -124,12 +129,22 @@ var ReadonlyGraphModel = class {
124
129
  visited.add(root.id);
125
130
  const targets = this.filterEdges({
126
131
  source: root.id
127
- }).map((edge) => this.getNode(edge.target)).filter(isNotFalsy);
132
+ }).map((edge) => this.getNode(edge.target)).filter(isTruthy);
128
133
  return [
129
134
  root,
130
135
  ...targets.flatMap((target) => this._traverse(target, visited))
131
136
  ];
132
137
  }
138
+ /**
139
+ * NOTE: Pass in simple Graph or Live.
140
+ */
141
+ constructor(graph) {
142
+ _define_property(this, "_graph", void 0);
143
+ this._graph = graph ?? {
144
+ nodes: [],
145
+ edges: []
146
+ };
147
+ }
133
148
  };
134
149
  var AbstractGraphModel = class extends ReadonlyGraphModel {
135
150
  clear() {
@@ -239,9 +254,6 @@ var AbstractGraphModel = class extends ReadonlyGraphModel {
239
254
  }
240
255
  };
241
256
  var AbstractGraphBuilder = class {
242
- constructor(_model) {
243
- this._model = _model;
244
- }
245
257
  get model() {
246
258
  return this._model;
247
259
  }
@@ -268,6 +280,10 @@ var AbstractGraphBuilder = class {
268
280
  this._model.addEdges(edges);
269
281
  return this;
270
282
  }
283
+ constructor(_model) {
284
+ _define_property(this, "_model", void 0);
285
+ this._model = _model;
286
+ }
271
287
  };
272
288
  var GraphModel = class _GraphModel extends AbstractGraphModel {
273
289
  get builder() {
@@ -289,18 +305,18 @@ var subscribe = (model, cb, fire = false) => {
289
305
  });
290
306
  };
291
307
  var ReactiveGraphModel = class _ReactiveGraphModel extends GraphModel {
292
- constructor(graph) {
293
- super(live({
294
- nodes: graph?.nodes ?? [],
295
- edges: graph?.edges ?? []
296
- }));
297
- }
298
308
  copy(graph) {
299
309
  return new _ReactiveGraphModel(graph);
300
310
  }
301
311
  subscribe(cb, fire = false) {
302
312
  return subscribe(this, cb, fire);
303
313
  }
314
+ constructor(graph) {
315
+ super(live({
316
+ nodes: graph?.nodes ?? [],
317
+ edges: graph?.edges ?? []
318
+ }));
319
+ }
304
320
  };
305
321
  var GraphBuilder = class extends AbstractGraphBuilder {
306
322
  call(cb) {
@@ -312,13 +328,21 @@ var GraphBuilder = class extends AbstractGraphBuilder {
312
328
  // src/selection.ts
313
329
  import { computed, signal } from "@preact/signals-core";
314
330
  import { invariant as invariant3 } from "@dxos/invariant";
331
+ function _define_property2(obj, key, value) {
332
+ if (key in obj) {
333
+ Object.defineProperty(obj, key, {
334
+ value,
335
+ enumerable: true,
336
+ configurable: true,
337
+ writable: true
338
+ });
339
+ } else {
340
+ obj[key] = value;
341
+ }
342
+ return obj;
343
+ }
315
344
  var __dxlog_file3 = "/__w/dxos/dxos/packages/common/graph/src/selection.ts";
316
345
  var SelectionModel = class {
317
- constructor(_singleSelect = false) {
318
- this._singleSelect = _singleSelect;
319
- this._selected = signal(/* @__PURE__ */ new Set());
320
- this._selectedIds = computed(() => Array.from(this._selected.value.values()));
321
- }
322
346
  toJSON() {
323
347
  return {
324
348
  selected: Array.from(this._selected.value.values())
@@ -383,10 +407,18 @@ var SelectionModel = class {
383
407
  });
384
408
  this._selected.value = set;
385
409
  }
410
+ constructor(_singleSelect = false) {
411
+ _define_property2(this, "_singleSelect", void 0);
412
+ _define_property2(this, "_selected", void 0);
413
+ _define_property2(this, "_selectedIds", void 0);
414
+ this._singleSelect = _singleSelect;
415
+ this._selected = signal(/* @__PURE__ */ new Set());
416
+ this._selectedIds = computed(() => Array.from(this._selected.value.values()));
417
+ }
386
418
  };
387
419
 
388
420
  // src/types.ts
389
- import { Schema } from "effect";
421
+ import * as Schema from "effect/Schema";
390
422
  var BaseGraphNode = Schema.Struct({
391
423
  id: Schema.String,
392
424
  type: Schema.optional(Schema.String),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/model.ts", "../../../src/util.ts", "../../../src/selection.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { effect } from '@preact/signals-core';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type Live, live } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> {\n protected readonly _graph: Graph;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n */\n constructor(graph?: Graph) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\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 {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes as Node[];\n }\n\n get edges(): Edge[] {\n return this._graph.edges as Edge[];\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<GraphNode.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<GraphEdge> = {}): 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(isNotFalsy);\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractGraphBuilder<Node, Edge, Model> = AbstractGraphBuilder<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>): Model;\n\n clear(): this {\n this._graph.nodes.length = 0;\n this._graph.edges.length = 0;\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._graph.nodes.push(node);\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: createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._graph.edges.push(edge as Edge);\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n const nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n return this.copy({ nodes, edges });\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.id === id);\n return this.copy({ nodes: [], edges });\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 AbstractGraphBuilder<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, GraphBuilder<Node, Edge>> {\n override get builder() {\n return new GraphBuilder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\n\nexport type GraphModelSubscription = (model: GraphModel, graph: Live<Graph>) => void;\n\n/**\n * Subscription.\n * NOTE: Requires `registerSignalsRuntime` to be called.\n */\nexport const subscribe = (model: GraphModel, cb: GraphModelSubscription, fire = false) => {\n if (fire) {\n cb(model, model.graph);\n }\n\n return effect(() => {\n cb(model, model.graph); // TODO(burdon): This won't work unless model.graph is reactive.\n });\n};\n\n/**\n * Basic reactive model.\n */\nexport class ReactiveGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends GraphModel<Node, Edge> {\n constructor(graph?: Partial<Graph>) {\n super(\n live({\n nodes: graph?.nodes ?? [],\n edges: graph?.edges ?? [],\n }),\n );\n }\n\n override copy(graph?: Partial<Graph>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(graph);\n }\n\n subscribe(cb: GraphModelSubscription, fire = false): () => void {\n return subscribe(this, cb, fire);\n }\n}\n\n/**\n * Basic builder.\n */\nexport class GraphBuilder<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\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// Copyright 2024 DXOS.org\n//\n\nimport { computed, signal, type ReadonlySignal, type Signal } from '@preact/signals-core';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _selected: Signal<Set<string>> = signal(new Set<string>());\n private readonly _selectedIds = computed(() => Array.from(this._selected.value.values()));\n\n constructor(private readonly _singleSelect: boolean = false) {}\n\n toJSON(): { selected: string[] } {\n return {\n selected: Array.from(this._selected.value.values()),\n };\n }\n\n get size(): number {\n return this._selected.value.size;\n }\n\n get selected(): ReadonlySignal<string[]> {\n return this._selectedIds;\n }\n\n contains(id: string): boolean {\n return this._selected.value.has(id);\n }\n\n clear(): void {\n this._selected.value = new Set();\n }\n\n add(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(\n this._singleSelect ? [id] : [...Array.from(this._selected.value.values()), id],\n );\n }\n\n remove(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(Array.from(this._selected.value.values()).filter((_id) => _id !== id));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], shift = false): void {\n this._selected.value = new Set([...(shift ? Array.from(this._selected.value.values()) : []), ...ids]);\n }\n\n toggleSelected(ids: string[], shift = false): void {\n const set = new Set<string>(shift ? Array.from(this._selected.value.values()) : undefined);\n ids.forEach((id) => {\n if (this._selected.value.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._selected.value = set;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema } from 'effect';\n\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\n// TODO(burdon): Make type extensible (i.e., not dependent on `data` property)?\nexport const BaseGraphNode = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\ntype GraphNode<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphNode,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphNode {\n export type Any = GraphNode<any, true>;\n export type Optional<Data = any> = GraphNode<Data, true>;\n export type Required<Data = any> = GraphNode<Data, false>;\n}\n\n//\n// Edge\n//\n\nexport const BaseGraphEdge = 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\n/** Raw base type. */\nexport type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;\n\n/** Typed edge data. */\nexport type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphEdge,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphEdge {\n export type Any = GraphEdge<any, true>;\n export type Optional<Data = any> = GraphEdge<Data, true>;\n export type Required<Data = any> = GraphEdge<Data, false>;\n}\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(BaseGraphNode)),\n edges: Schema.mutable(Schema.Array(BaseGraphEdge)),\n});\n\nexport type Graph = Schema.Schema.Type<typeof Graph>;\n"],
5
- "mappings": "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",
6
- "names": ["effect", "inspectCustom", "failedInvariant", "invariant", "live", "isNotFalsy", "removeBy", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "graph", "_graph", "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", "isNotFalsy", "flatMap", "AbstractGraphModel", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "subscribe", "fire", "effect", "ReactiveGraphModel", "live", "computed", "signal", "invariant", "SelectionModel", "_singleSelect", "_selected", "Set", "_selectedIds", "Array", "from", "value", "values", "toJSON", "selected", "size", "contains", "id", "has", "clear", "add", "remove", "filter", "_id", "setSelected", "ids", "shift", "toggleSelected", "set", "undefined", "forEach", "delete", "Schema", "BaseGraphNode", "Schema", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "Graph", "nodes", "mutable", "Array", "edges"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { effect } from '@preact/signals-core';\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { type Live, live } from '@dxos/live-object';\nimport { type MakeOptional, isTruthy, removeBy } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Readonly Graph wrapper.\n */\nexport class ReadonlyGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> {\n protected readonly _graph: Graph;\n\n /**\n * NOTE: Pass in simple Graph or Live.\n */\n constructor(graph?: Graph) {\n this._graph = graph ?? {\n nodes: [],\n edges: [],\n };\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 {\n return this._graph;\n }\n\n get nodes(): Node[] {\n return this._graph.nodes as Node[];\n }\n\n get edges(): Edge[] {\n return this._graph.edges as Edge[];\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<GraphNode.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<GraphEdge> = {}): 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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder> = any,\n Builder extends AbstractGraphBuilder<Node, Edge, Model> = AbstractGraphBuilder<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>): Model;\n\n clear(): this {\n this._graph.nodes.length = 0;\n this._graph.edges.length = 0;\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._graph.nodes.push(node);\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: createEdgeId(edge), ...edge };\n }\n invariant(!this.findNode(edge.id!));\n this._graph.edges.push(edge as Edge);\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === id);\n const nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n return this.copy({ nodes, edges });\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 const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.id === id);\n return this.copy({ nodes: [], edges });\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 AbstractGraphBuilder<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\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 BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphModel<Node, Edge, GraphModel<Node, Edge>, GraphBuilder<Node, Edge>> {\n override get builder() {\n return new GraphBuilder<Node, Edge>(this);\n }\n\n override copy(graph?: Partial<Graph>): GraphModel<Node, Edge> {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\n\nexport type GraphModelSubscription = (model: GraphModel, graph: Live<Graph>) => void;\n\n/**\n * Subscription.\n * NOTE: Requires `registerSignalsRuntime` to be called.\n */\nexport const subscribe = (model: GraphModel, cb: GraphModelSubscription, fire = false) => {\n if (fire) {\n cb(model, model.graph);\n }\n\n return effect(() => {\n cb(model, model.graph); // TODO(burdon): This won't work unless model.graph is reactive.\n });\n};\n\n/**\n * Basic reactive model.\n */\nexport class ReactiveGraphModel<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends GraphModel<Node, Edge> {\n constructor(graph?: Partial<Graph>) {\n super(\n live({\n nodes: graph?.nodes ?? [],\n edges: graph?.edges ?? [],\n }),\n );\n }\n\n override copy(graph?: Partial<Graph>): ReactiveGraphModel<Node, Edge> {\n return new ReactiveGraphModel<Node, Edge>(graph);\n }\n\n subscribe(cb: GraphModelSubscription, fire = false): () => void {\n return subscribe(this, cb, fire);\n }\n}\n\n/**\n * Basic builder.\n */\nexport class GraphBuilder<\n Node extends BaseGraphNode = BaseGraphNode,\n Edge extends BaseGraphEdge = BaseGraphEdge,\n> extends AbstractGraphBuilder<Node, Edge, GraphModel<Node, Edge>> {\n override call(cb: (builder: this) => void): this {\n cb(this);\n return this;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { invariant } from '@dxos/invariant';\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// Copyright 2024 DXOS.org\n//\n\nimport { type ReadonlySignal, type Signal, computed, signal } from '@preact/signals-core';\n\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Reactive selection model.\n */\nexport class SelectionModel {\n private readonly _selected: Signal<Set<string>> = signal(new Set<string>());\n private readonly _selectedIds = computed(() => Array.from(this._selected.value.values()));\n\n constructor(private readonly _singleSelect: boolean = false) {}\n\n toJSON(): { selected: string[] } {\n return {\n selected: Array.from(this._selected.value.values()),\n };\n }\n\n get size(): number {\n return this._selected.value.size;\n }\n\n get selected(): ReadonlySignal<string[]> {\n return this._selectedIds;\n }\n\n contains(id: string): boolean {\n return this._selected.value.has(id);\n }\n\n clear(): void {\n this._selected.value = new Set();\n }\n\n add(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(\n this._singleSelect ? [id] : [...Array.from(this._selected.value.values()), id],\n );\n }\n\n remove(id: string): void {\n invariant(id);\n this._selected.value = new Set<string>(Array.from(this._selected.value.values()).filter((_id) => _id !== id));\n }\n\n // TODO(burdon): Handle single select.\n\n setSelected(ids: string[], shift = false): void {\n this._selected.value = new Set([...(shift ? Array.from(this._selected.value.values()) : []), ...ids]);\n }\n\n toggleSelected(ids: string[], shift = false): void {\n const set = new Set<string>(shift ? Array.from(this._selected.value.values()) : undefined);\n ids.forEach((id) => {\n if (this._selected.value.has(id)) {\n set.delete(id);\n } else {\n set.add(id);\n }\n });\n\n this._selected.value = set;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { type Specialize } from '@dxos/util';\n\n//\n// Node\n//\n\n// TODO(burdon): Make type extensible (i.e., not dependent on `data` property)?\nexport const BaseGraphNode = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\ntype GraphNode<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphNode,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphNode {\n export type Any = GraphNode<any, true>;\n export type Optional<Data = any> = GraphNode<Data, true>;\n export type Required<Data = any> = GraphNode<Data, false>;\n}\n\n//\n// Edge\n//\n\nexport const BaseGraphEdge = 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\n/** Raw base type. */\nexport type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;\n\n/** Typed edge data. */\nexport type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<\n BaseGraphEdge,\n Optional extends true ? { data?: Data } : { data: Data }\n>;\n\nexport declare namespace GraphEdge {\n export type Any = GraphEdge<any, true>;\n export type Optional<Data = any> = GraphEdge<Data, true>;\n export type Required<Data = any> = GraphEdge<Data, false>;\n}\n\n//\n// Graph\n//\n\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(BaseGraphNode)),\n edges: Schema.mutable(Schema.Array(BaseGraphEdge)),\n});\n\nexport type Graph = Schema.Schema.Type<typeof Graph>;\n"],
5
+ "mappings": "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",
6
+ "names": ["effect", "inspectCustom", "failedInvariant", "invariant", "live", "isTruthy", "removeBy", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "inspectCustom", "ReadonlyGraphModel", "toJSON", "nodes", "length", "edges", "graph", "_graph", "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", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "invariant", "push", "addEdge", "createEdgeId", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "model", "_model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "subscribe", "fire", "effect", "ReactiveGraphModel", "live", "computed", "signal", "invariant", "SelectionModel", "toJSON", "selected", "Array", "from", "_selected", "value", "values", "size", "_selectedIds", "contains", "id", "has", "clear", "Set", "add", "_singleSelect", "remove", "filter", "_id", "setSelected", "ids", "shift", "toggleSelected", "set", "undefined", "forEach", "delete", "_define_property", "Schema", "BaseGraphNode", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "Graph", "nodes", "mutable", "Array", "edges"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"src/util.ts":{"bytes":3257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/model.ts":{"bytes":25663,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/selection.ts":{"bytes":7392,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/types.ts":{"bytes":4606,"imports":[{"path":"effect","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":691,"imports":[{"path":"src/model.ts","kind":"import-statement","original":"./model"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":20776},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReactiveGraphModel","ReadonlyGraphModel","SelectionModel","createEdgeId","parseEdgeId","subscribe"],"entryPoint":"src/index.ts","inputs":{"src/model.ts":{"bytesInOutput":5692},"src/util.ts":{"bytesInOutput":1014},"src/index.ts":{"bytesInOutput":0},"src/selection.ts":{"bytesInOutput":1862},"src/types.ts":{"bytesInOutput":534}},"bytes":9553}}}
1
+ {"inputs":{"src/util.ts":{"bytes":3257,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/model.ts":{"bytes":26127,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"src/selection.ts":{"bytes":7853,"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"src/types.ts":{"bytes":4622,"imports":[{"path":"effect/Schema","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":691,"imports":[{"path":"src/model.ts","kind":"import-statement","original":"./model"},{"path":"src/selection.ts","kind":"import-statement","original":"./selection"},{"path":"src/types.ts","kind":"import-statement","original":"./types"},{"path":"src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":20824},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@preact/signals-core","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"effect/Schema","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReactiveGraphModel","ReadonlyGraphModel","SelectionModel","createEdgeId","parseEdgeId","subscribe"],"entryPoint":"src/index.ts","inputs":{"src/model.ts":{"bytesInOutput":6065},"src/util.ts":{"bytesInOutput":1014},"src/index.ts":{"bytesInOutput":0},"src/selection.ts":{"bytesInOutput":2268},"src/types.ts":{"bytesInOutput":542}},"bytes":10340}}}
@@ -84,10 +84,7 @@ export type GraphModelSubscription = (model: GraphModel, graph: Live<Graph>) =>
84
84
  * Subscription.
85
85
  * NOTE: Requires `registerSignalsRuntime` to be called.
86
86
  */
87
- export declare const subscribe: (model: GraphModel, cb: GraphModelSubscription, fire?: boolean) => {
88
- (): void;
89
- [Symbol.dispose](): void;
90
- };
87
+ export declare const subscribe: (model: GraphModel, cb: GraphModelSubscription, fire?: boolean) => () => void;
91
88
  /**
92
89
  * Basic reactive model.
93
90
  */