@dxos/graph 0.8.2-main.5885341 → 0.8.2-main.600d381

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.
@@ -296,27 +296,27 @@ var GraphBuilder = class extends AbstractGraphBuilder {
296
296
  };
297
297
 
298
298
  // packages/common/graph/src/types.ts
299
- import { S } from "@dxos/echo-schema";
300
- var BaseGraphNode = S.Struct({
301
- id: S.String,
302
- type: S.optional(S.String),
303
- data: S.optional(S.Any)
299
+ import { Schema } from "effect";
300
+ var BaseGraphNode = Schema.Struct({
301
+ id: Schema.String,
302
+ type: Schema.optional(Schema.String),
303
+ data: Schema.optional(Schema.Any)
304
304
  });
305
- var BaseGraphEdge = S.Struct({
306
- id: S.String,
307
- type: S.optional(S.String),
308
- data: S.optional(S.Any),
309
- source: S.String,
310
- target: S.String
305
+ var BaseGraphEdge = Schema.Struct({
306
+ id: Schema.String,
307
+ type: Schema.optional(Schema.String),
308
+ data: Schema.optional(Schema.Any),
309
+ source: Schema.String,
310
+ target: Schema.String
311
311
  });
312
- var ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, {
313
- key: S.String,
314
- value: S.Any
312
+ var ExtendableBaseGraphNode = Schema.extend(BaseGraphNode, Schema.Struct({}, {
313
+ key: Schema.String,
314
+ value: Schema.Any
315
315
  }));
316
- var Graph = S.Struct({
317
- id: S.optional(S.String),
318
- nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),
319
- edges: S.mutable(S.Array(BaseGraphEdge))
316
+ var Graph = Schema.Struct({
317
+ id: Schema.optional(Schema.String),
318
+ nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),
319
+ edges: Schema.mutable(Schema.Array(BaseGraphEdge))
320
320
  });
321
321
 
322
322
  // packages/common/graph/src/create.ts
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/create.ts", "../../../src/model.ts", "../../../src/util.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ReactiveEchoObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: ReactiveEchoObject<any>[]): GraphModel<GraphNode<ReactiveEchoObject<any>>> => {\n const graph = new GraphModel<GraphNode<ReactiveEchoObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { S } from '@dxos/echo-schema';\nimport { type Specialize } from '@dxos/util';\n\nexport const BaseGraphNode = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = S.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n source: S.String,\n target: S.String,\n});\n\n/** Raw base type. */\nexport type BaseGraphEdge = S.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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, { key: S.String, value: S.Any }));\n\n/**\n * Generic graph.\n */\nexport const Graph = S.Struct({\n id: S.optional(S.String),\n nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),\n edges: S.mutable(S.Array(BaseGraphEdge)),\n});\n\nexport type Graph = S.Schema.Type<typeof Graph>;\n"],
5
- "mappings": "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",
6
- "names": ["FormatEnum", "getSchema", "live", "log", "getSchemaProperties", "inspectCustom", "failedInvariant", "invariant", "getSnapshot", "isNotFalsy", "removeBy", "stripUndefined", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "id", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "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", "length", "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", "S", "BaseGraphNode", "S", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "nodes", "mutable", "Array", "edges", "createGraph", "objects", "graph", "GraphModel", "live", "Graph", "nodes", "edges", "forEach", "object", "addNode", "id", "type", "typename", "data", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "source", "target", "name", "addEdge", "createEdgeId", "relation", "String"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type AnyLiveObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: AnyLiveObject<any>[]): GraphModel<GraphNode<AnyLiveObject<any>>> => {\n const graph = new GraphModel<GraphNode<AnyLiveObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { Schema } from 'effect';\n\nimport { type Specialize } from '@dxos/util';\n\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. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n source: Schema.String,\n target: Schema.String,\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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = Schema.extend(\n BaseGraphNode,\n Schema.Struct({}, { key: Schema.String, value: Schema.Any }),\n);\n\n/**\n * Generic graph.\n */\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),\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": ["FormatEnum", "getSchema", "live", "log", "getSchemaProperties", "inspectCustom", "failedInvariant", "invariant", "getSnapshot", "isNotFalsy", "removeBy", "stripUndefined", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "id", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "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", "length", "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", "Schema", "BaseGraphNode", "Schema", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "nodes", "mutable", "Array", "edges", "createGraph", "objects", "graph", "GraphModel", "live", "Graph", "nodes", "edges", "forEach", "object", "addNode", "id", "type", "typename", "data", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "source", "target", "name", "addEdge", "createEdgeId", "relation", "String"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4441,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6311,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18824},"packages/common/graph/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":551},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":8818}}}
1
+ {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4760,"imports":[{"path":"effect","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6283,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18963},"packages/common/graph/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"effect","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":670},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":8937}}}
@@ -40,7 +40,7 @@ var import_invariant = require("@dxos/invariant");
40
40
  var import_live_object2 = require("@dxos/live-object");
41
41
  var import_util = require("@dxos/util");
42
42
  var import_invariant2 = require("@dxos/invariant");
43
- var import_echo_schema2 = require("@dxos/echo-schema");
43
+ var import_effect = require("effect");
44
44
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/graph/src/util.ts";
45
45
  var KEY_REGEX = /\w+/;
46
46
  var createEdgeId = ({ source, target, relation }) => {
@@ -321,26 +321,26 @@ var GraphBuilder = class extends AbstractGraphBuilder {
321
321
  return this;
322
322
  }
323
323
  };
324
- var BaseGraphNode = import_echo_schema2.S.Struct({
325
- id: import_echo_schema2.S.String,
326
- type: import_echo_schema2.S.optional(import_echo_schema2.S.String),
327
- data: import_echo_schema2.S.optional(import_echo_schema2.S.Any)
324
+ var BaseGraphNode = import_effect.Schema.Struct({
325
+ id: import_effect.Schema.String,
326
+ type: import_effect.Schema.optional(import_effect.Schema.String),
327
+ data: import_effect.Schema.optional(import_effect.Schema.Any)
328
328
  });
329
- var BaseGraphEdge = import_echo_schema2.S.Struct({
330
- id: import_echo_schema2.S.String,
331
- type: import_echo_schema2.S.optional(import_echo_schema2.S.String),
332
- data: import_echo_schema2.S.optional(import_echo_schema2.S.Any),
333
- source: import_echo_schema2.S.String,
334
- target: import_echo_schema2.S.String
329
+ var BaseGraphEdge = import_effect.Schema.Struct({
330
+ id: import_effect.Schema.String,
331
+ type: import_effect.Schema.optional(import_effect.Schema.String),
332
+ data: import_effect.Schema.optional(import_effect.Schema.Any),
333
+ source: import_effect.Schema.String,
334
+ target: import_effect.Schema.String
335
335
  });
336
- var ExtendableBaseGraphNode = import_echo_schema2.S.extend(BaseGraphNode, import_echo_schema2.S.Struct({}, {
337
- key: import_echo_schema2.S.String,
338
- value: import_echo_schema2.S.Any
336
+ var ExtendableBaseGraphNode = import_effect.Schema.extend(BaseGraphNode, import_effect.Schema.Struct({}, {
337
+ key: import_effect.Schema.String,
338
+ value: import_effect.Schema.Any
339
339
  }));
340
- var Graph = import_echo_schema2.S.Struct({
341
- id: import_echo_schema2.S.optional(import_echo_schema2.S.String),
342
- nodes: import_echo_schema2.S.mutable(import_echo_schema2.S.Array(ExtendableBaseGraphNode)),
343
- edges: import_echo_schema2.S.mutable(import_echo_schema2.S.Array(BaseGraphEdge))
340
+ var Graph = import_effect.Schema.Struct({
341
+ id: import_effect.Schema.optional(import_effect.Schema.String),
342
+ nodes: import_effect.Schema.mutable(import_effect.Schema.Array(ExtendableBaseGraphNode)),
343
+ edges: import_effect.Schema.mutable(import_effect.Schema.Array(BaseGraphEdge))
344
344
  });
345
345
  var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/graph/src/create.ts";
346
346
  var createGraph = (objects) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/create.ts", "../../../src/model.ts", "../../../src/util.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ReactiveEchoObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: ReactiveEchoObject<any>[]): GraphModel<GraphNode<ReactiveEchoObject<any>>> => {\n const graph = new GraphModel<GraphNode<ReactiveEchoObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { S } from '@dxos/echo-schema';\nimport { type Specialize } from '@dxos/util';\n\nexport const BaseGraphNode = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = S.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n source: S.String,\n target: S.String,\n});\n\n/** Raw base type. */\nexport type BaseGraphEdge = S.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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, { key: S.String, value: S.Any }));\n\n/**\n * Generic graph.\n */\nexport const Graph = S.Struct({\n id: S.optional(S.String),\n nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),\n edges: S.mutable(S.Array(BaseGraphEdge)),\n});\n\nexport type Graph = S.Schema.Type<typeof Graph>;\n"],
5
- "mappings": "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",
6
- "names": ["import_live_object", "import_invariant", "import_echo_schema", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "invariant", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "find", "node", "getNode", "failedInvariant", "filterNodes", "type", "filter", "findEdge", "edge", "getEdge", "filterEdges", "traverse", "root", "_traverse", "visited", "Set", "has", "add", "targets", "map", "isNotFalsy", "flatMap", "AbstractGraphModel", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "push", "addEdge", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "BaseGraphNode", "S", "Struct", "String", "optional", "data", "Any", "BaseGraphEdge", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "mutable", "Array", "createGraph", "objects", "live", "object", "typename", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "name"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type AnyLiveObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: AnyLiveObject<any>[]): GraphModel<GraphNode<AnyLiveObject<any>>> => {\n const graph = new GraphModel<GraphNode<AnyLiveObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { Schema } from 'effect';\n\nimport { type Specialize } from '@dxos/util';\n\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. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n source: Schema.String,\n target: Schema.String,\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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = Schema.extend(\n BaseGraphNode,\n Schema.Struct({}, { key: Schema.String, value: Schema.Any }),\n);\n\n/**\n * Generic graph.\n */\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),\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": ["import_live_object", "import_invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "invariant", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "find", "node", "getNode", "failedInvariant", "filterNodes", "type", "filter", "findEdge", "edge", "getEdge", "filterEdges", "traverse", "root", "_traverse", "visited", "Set", "has", "add", "targets", "map", "isNotFalsy", "flatMap", "AbstractGraphModel", "clear", "addGraph", "addNodes", "addEdges", "addGraphs", "graphs", "forEach", "addNode", "push", "addEdge", "removeNode", "removeBy", "copy", "removeNodes", "ids", "removeEdge", "removeEdges", "AbstractGraphBuilder", "_model", "model", "call", "cb", "GraphModel", "builder", "GraphBuilder", "BaseGraphNode", "Schema", "Struct", "String", "optional", "data", "Any", "BaseGraphEdge", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "mutable", "Array", "createGraph", "objects", "live", "object", "typename", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "name"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4441,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6311,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18824},"packages/common/graph/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":551},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":8818}}}
1
+ {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4760,"imports":[{"path":"effect","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6283,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18963},"packages/common/graph/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"effect","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":670},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":8937}}}
@@ -298,27 +298,27 @@ var GraphBuilder = class extends AbstractGraphBuilder {
298
298
  };
299
299
 
300
300
  // packages/common/graph/src/types.ts
301
- import { S } from "@dxos/echo-schema";
302
- var BaseGraphNode = S.Struct({
303
- id: S.String,
304
- type: S.optional(S.String),
305
- data: S.optional(S.Any)
301
+ import { Schema } from "effect";
302
+ var BaseGraphNode = Schema.Struct({
303
+ id: Schema.String,
304
+ type: Schema.optional(Schema.String),
305
+ data: Schema.optional(Schema.Any)
306
306
  });
307
- var BaseGraphEdge = S.Struct({
308
- id: S.String,
309
- type: S.optional(S.String),
310
- data: S.optional(S.Any),
311
- source: S.String,
312
- target: S.String
307
+ var BaseGraphEdge = Schema.Struct({
308
+ id: Schema.String,
309
+ type: Schema.optional(Schema.String),
310
+ data: Schema.optional(Schema.Any),
311
+ source: Schema.String,
312
+ target: Schema.String
313
313
  });
314
- var ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, {
315
- key: S.String,
316
- value: S.Any
314
+ var ExtendableBaseGraphNode = Schema.extend(BaseGraphNode, Schema.Struct({}, {
315
+ key: Schema.String,
316
+ value: Schema.Any
317
317
  }));
318
- var Graph = S.Struct({
319
- id: S.optional(S.String),
320
- nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),
321
- edges: S.mutable(S.Array(BaseGraphEdge))
318
+ var Graph = Schema.Struct({
319
+ id: Schema.optional(Schema.String),
320
+ nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),
321
+ edges: Schema.mutable(Schema.Array(BaseGraphEdge))
322
322
  });
323
323
 
324
324
  // packages/common/graph/src/create.ts
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/create.ts", "../../../src/model.ts", "../../../src/util.ts", "../../../src/types.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ReactiveEchoObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: ReactiveEchoObject<any>[]): GraphModel<GraphNode<ReactiveEchoObject<any>>> => {\n const graph = new GraphModel<GraphNode<ReactiveEchoObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { S } from '@dxos/echo-schema';\nimport { type Specialize } from '@dxos/util';\n\nexport const BaseGraphNode = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n});\n\n/** Raw base type. */\nexport type BaseGraphNode = S.Schema.Type<typeof BaseGraphNode>;\n\n/** Typed node data. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = S.Struct({\n id: S.String,\n type: S.optional(S.String),\n data: S.optional(S.Any),\n source: S.String,\n target: S.String,\n});\n\n/** Raw base type. */\nexport type BaseGraphEdge = S.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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, { key: S.String, value: S.Any }));\n\n/**\n * Generic graph.\n */\nexport const Graph = S.Struct({\n id: S.optional(S.String),\n nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),\n edges: S.mutable(S.Array(BaseGraphEdge)),\n});\n\nexport type Graph = S.Schema.Type<typeof Graph>;\n"],
5
- "mappings": "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",
6
- "names": ["FormatEnum", "getSchema", "live", "log", "getSchemaProperties", "inspectCustom", "failedInvariant", "invariant", "getSnapshot", "isNotFalsy", "removeBy", "stripUndefined", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "id", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "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", "length", "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", "S", "BaseGraphNode", "S", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "nodes", "mutable", "Array", "edges", "createGraph", "objects", "graph", "GraphModel", "live", "Graph", "nodes", "edges", "forEach", "object", "addNode", "id", "type", "typename", "data", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "source", "target", "name", "addEdge", "createEdgeId", "relation", "String"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type AnyLiveObject } from '@dxos/echo-db';\nimport { FormatEnum, getSchema } from '@dxos/echo-schema';\nimport { live } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { getSchemaProperties } from '@dxos/schema';\n\nimport { GraphModel } from './model';\nimport { Graph, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Creates a new reactive graph from a set of ECHO objects.\n * References are mapped onto graph edges.\n */\nexport const createGraph = (objects: AnyLiveObject<any>[]): GraphModel<GraphNode<AnyLiveObject<any>>> => {\n const graph = new GraphModel<GraphNode<AnyLiveObject<any>>>(live(Graph, { nodes: [], edges: [] }));\n\n // Map objects.\n objects.forEach((object) => {\n graph.addNode({ id: object.id, type: object.typename, data: object });\n });\n\n // Find references.\n objects.forEach((object) => {\n const schema = getSchema(object);\n if (!schema) {\n log.info('no schema for object', { id: object.id.slice(0, 8) });\n return;\n }\n\n // Parse schema to follow referenced objects.\n for (const prop of getSchemaProperties(schema.ast, object)) {\n if (prop.format === FormatEnum.Ref) {\n const source = object;\n const target = object[prop.name]?.target;\n if (target) {\n graph.addEdge({\n id: createEdgeId({ source: source.id, target: target.id, relation: String(prop.name) }),\n source: source.id,\n target: target.id,\n });\n }\n }\n }\n });\n\n return graph;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { inspectCustom } from '@dxos/debug';\nimport { failedInvariant, invariant } from '@dxos/invariant';\nimport { getSnapshot } from '@dxos/live-object';\nimport { type MakeOptional, isNotFalsy, removeBy, stripUndefined } from '@dxos/util';\n\nimport { type BaseGraphEdge, type BaseGraphNode, type Graph, type GraphEdge, type GraphNode } from './types';\nimport { createEdgeId } from './util';\n\n/**\n * Wrapper class contains reactive nodes and edges.\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 ?? { nodes: [], edges: [] };\n }\n\n [inspectCustom]() {\n return this.toJSON();\n }\n\n /**\n * Return stable sorted JSON representation of graph.\n */\n // TODO(burdon): Create separate toJson method with computed signal.\n toJSON() {\n const { id, nodes, edges } = getSnapshot(this._graph);\n nodes.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n edges.sort(({ id: a }, { id: b }) => a.localeCompare(b));\n return stripUndefined({ id, nodes, edges });\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> = {}): 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 * Typed wrapper.\n */\nexport abstract class AbstractGraphModel<\n Node extends BaseGraphNode,\n Edge extends BaseGraphEdge,\n Model extends AbstractGraphModel<Node, Edge, Model, Builder>,\n Builder extends 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 nodes = removeBy<Node>(this._graph.nodes as Node[], (node) => node.id === id);\n const edges = removeBy<Edge>(this._graph.edges as Edge[], (edge) => edge.source === id || edge.target === 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 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\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>) {\n return new GraphModel<Node, Edge>({ nodes: graph?.nodes ?? [], edges: graph?.edges ?? [] });\n }\n}\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) {\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 { Schema } from 'effect';\n\nimport { type Specialize } from '@dxos/util';\n\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. */\nexport type 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 Optional<T = any> = GraphNode<T, true>;\n}\n\nexport const BaseGraphEdge = Schema.Struct({\n id: Schema.String,\n type: Schema.optional(Schema.String),\n data: Schema.optional(Schema.Any),\n source: Schema.String,\n target: Schema.String,\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 Optional<T = any> = GraphEdge<T, true>;\n}\n\n/**\n * Allows any additional properties on graph nodes.\n */\nconst ExtendableBaseGraphNode = Schema.extend(\n BaseGraphNode,\n Schema.Struct({}, { key: Schema.String, value: Schema.Any }),\n);\n\n/**\n * Generic graph.\n */\nexport const Graph = Schema.Struct({\n id: Schema.optional(Schema.String),\n nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),\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": ["FormatEnum", "getSchema", "live", "log", "getSchemaProperties", "inspectCustom", "failedInvariant", "invariant", "getSnapshot", "isNotFalsy", "removeBy", "stripUndefined", "invariant", "KEY_REGEX", "createEdgeId", "source", "target", "relation", "match", "join", "parseEdgeId", "id", "split", "length", "undefined", "ReadonlyGraphModel", "constructor", "graph", "_graph", "nodes", "edges", "inspectCustom", "toJSON", "id", "getSnapshot", "sort", "a", "b", "localeCompare", "stripUndefined", "findNode", "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", "length", "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", "Schema", "BaseGraphNode", "Schema", "Struct", "id", "String", "type", "optional", "data", "Any", "BaseGraphEdge", "source", "target", "ExtendableBaseGraphNode", "extend", "key", "value", "Graph", "nodes", "mutable", "Array", "edges", "createGraph", "objects", "graph", "GraphModel", "live", "Graph", "nodes", "edges", "forEach", "object", "addNode", "id", "type", "typename", "data", "schema", "getSchema", "log", "info", "slice", "prop", "getSchemaProperties", "ast", "format", "FormatEnum", "Ref", "source", "target", "name", "addEdge", "createEdgeId", "relation", "String"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4441,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6311,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18826},"packages/common/graph/dist/lib/node-esm/index.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"@dxos/echo-schema","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":551},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":8911}}}
1
+ {"inputs":{"packages/common/graph/src/util.ts":{"bytes":3370,"imports":[{"path":"@dxos/invariant","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/model.ts":{"bytes":23766,"imports":[{"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":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/types.ts":{"bytes":4760,"imports":[{"path":"effect","kind":"import-statement","external":true}],"format":"esm"},"packages/common/graph/src/create.ts":{"bytes":6283,"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","kind":"import-statement","external":true},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"},"packages/common/graph/src/index.ts":{"bytes":733,"imports":[{"path":"packages/common/graph/src/create.ts","kind":"import-statement","original":"./create"},{"path":"packages/common/graph/src/model.ts","kind":"import-statement","original":"./model"},{"path":"packages/common/graph/src/types.ts","kind":"import-statement","original":"./types"},{"path":"packages/common/graph/src/util.ts","kind":"import-statement","original":"./util"}],"format":"esm"}},"outputs":{"packages/common/graph/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18965},"packages/common/graph/dist/lib/node-esm/index.mjs":{"imports":[{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/live-object","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/schema","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":"effect","kind":"import-statement","external":true}],"exports":["AbstractGraphBuilder","AbstractGraphModel","BaseGraphEdge","BaseGraphNode","Graph","GraphBuilder","GraphModel","ReadonlyGraphModel","createEdgeId","createGraph","parseEdgeId"],"entryPoint":"packages/common/graph/src/index.ts","inputs":{"packages/common/graph/src/create.ts":{"bytesInOutput":1334},"packages/common/graph/src/model.ts":{"bytesInOutput":5439},"packages/common/graph/src/util.ts":{"bytesInOutput":1027},"packages/common/graph/src/types.ts":{"bytesInOutput":670},"packages/common/graph/src/index.ts":{"bytesInOutput":0}},"bytes":9030}}}
@@ -1,9 +1,9 @@
1
- import { type ReactiveEchoObject } from '@dxos/echo-db';
1
+ import { type AnyLiveObject } from '@dxos/echo-db';
2
2
  import { GraphModel } from './model';
3
3
  import { type GraphNode } from './types';
4
4
  /**
5
5
  * Creates a new reactive graph from a set of ECHO objects.
6
6
  * References are mapped onto graph edges.
7
7
  */
8
- export declare const createGraph: (objects: ReactiveEchoObject<any>[]) => GraphModel<GraphNode<ReactiveEchoObject<any>>>;
8
+ export declare const createGraph: (objects: AnyLiveObject<any>[]) => GraphModel<GraphNode<AnyLiveObject<any>>>;
9
9
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/create.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMxD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD;;;GAGG;AACH,eAAO,MAAM,WAAW,YAAa,kBAAkB,CAAC,GAAG,CAAC,EAAE,KAAG,UAAU,CAAC,SAAS,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAiC7G,CAAC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/create.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAMnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,KAAG,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAiCnG,CAAC"}
@@ -1,12 +1,12 @@
1
- import { S } from '@dxos/echo-schema';
1
+ import { Schema } from 'effect';
2
2
  import { type Specialize } from '@dxos/util';
3
- export declare const BaseGraphNode: S.Struct<{
4
- id: typeof S.String;
5
- type: S.optional<typeof S.String>;
6
- data: S.optional<typeof S.Any>;
3
+ export declare const BaseGraphNode: Schema.Struct<{
4
+ id: typeof Schema.String;
5
+ type: Schema.optional<typeof Schema.String>;
6
+ data: Schema.optional<typeof Schema.Any>;
7
7
  }>;
8
8
  /** Raw base type. */
9
- export type BaseGraphNode = S.Schema.Type<typeof BaseGraphNode>;
9
+ export type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;
10
10
  /** Typed node data. */
11
11
  export type GraphNode<Data = any, Optional extends boolean = false> = Specialize<BaseGraphNode, Optional extends true ? {
12
12
  data?: Data;
@@ -16,15 +16,15 @@ export type GraphNode<Data = any, Optional extends boolean = false> = Specialize
16
16
  export declare namespace GraphNode {
17
17
  type Optional<T = any> = GraphNode<T, true>;
18
18
  }
19
- export declare const BaseGraphEdge: S.Struct<{
20
- id: typeof S.String;
21
- type: S.optional<typeof S.String>;
22
- data: S.optional<typeof S.Any>;
23
- source: typeof S.String;
24
- target: typeof S.String;
19
+ export declare const BaseGraphEdge: Schema.Struct<{
20
+ id: typeof Schema.String;
21
+ type: Schema.optional<typeof Schema.String>;
22
+ data: Schema.optional<typeof Schema.Any>;
23
+ source: typeof Schema.String;
24
+ target: typeof Schema.String;
25
25
  }>;
26
26
  /** Raw base type. */
27
- export type BaseGraphEdge = S.Schema.Type<typeof BaseGraphEdge>;
27
+ export type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;
28
28
  /** Typed edge data. */
29
29
  export type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<BaseGraphEdge, Optional extends true ? {
30
30
  data?: Data;
@@ -37,23 +37,23 @@ export declare namespace GraphEdge {
37
37
  /**
38
38
  * Generic graph.
39
39
  */
40
- export declare const Graph: S.Struct<{
41
- id: S.optional<typeof S.String>;
42
- nodes: S.mutable<S.Array$<S.extend<S.Struct<{
43
- id: typeof S.String;
44
- type: S.optional<typeof S.String>;
45
- data: S.optional<typeof S.Any>;
46
- }>, S.TypeLiteral<{}, readonly [{
47
- readonly key: typeof S.String;
48
- readonly value: typeof S.Any;
40
+ export declare const Graph: Schema.Struct<{
41
+ id: Schema.optional<typeof Schema.String>;
42
+ nodes: Schema.mutable<Schema.Array$<Schema.extend<Schema.Struct<{
43
+ id: typeof Schema.String;
44
+ type: Schema.optional<typeof Schema.String>;
45
+ data: Schema.optional<typeof Schema.Any>;
46
+ }>, Schema.TypeLiteral<{}, readonly [{
47
+ readonly key: typeof Schema.String;
48
+ readonly value: typeof Schema.Any;
49
49
  }]>>>>;
50
- edges: S.mutable<S.Array$<S.Struct<{
51
- id: typeof S.String;
52
- type: S.optional<typeof S.String>;
53
- data: S.optional<typeof S.Any>;
54
- source: typeof S.String;
55
- target: typeof S.String;
50
+ edges: Schema.mutable<Schema.Array$<Schema.Struct<{
51
+ id: typeof Schema.String;
52
+ type: Schema.optional<typeof Schema.String>;
53
+ data: Schema.optional<typeof Schema.Any>;
54
+ source: typeof Schema.String;
55
+ target: typeof Schema.String;
56
56
  }>>>;
57
57
  }>;
58
- export type Graph = S.Schema.Type<typeof Graph>;
58
+ export type Graph = Schema.Schema.Type<typeof Graph>;
59
59
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,aAAa;;;;EAIxB,CAAC;AAEH,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;AAEhE,uBAAuB;AACvB,MAAM,MAAM,SAAS,CAAC,IAAI,GAAG,GAAG,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IAAI,UAAU,CAC9E,aAAa,EACb,QAAQ,SAAS,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CACzD,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,aAAa;;;;;;EAMxB,CAAC;AAEH,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;AAEhE,uBAAuB;AACvB,MAAM,MAAM,SAAS,CAAC,IAAI,GAAG,GAAG,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IAAI,UAAU,CAC9E,aAAa,EACb,QAAQ,SAAS,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CACzD,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;CACpD;AAOD;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;EAIhB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,aAAa;;;;EAIxB,CAAC;AAEH,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;AAErE,uBAAuB;AACvB,MAAM,MAAM,SAAS,CAAC,IAAI,GAAG,GAAG,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IAAI,UAAU,CAC9E,aAAa,EACb,QAAQ,SAAS,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CACzD,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;CACpD;AAED,eAAO,MAAM,aAAa;;;;;;EAMxB,CAAC;AAEH,qBAAqB;AACrB,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,CAAC;AAErE,uBAAuB;AACvB,MAAM,MAAM,SAAS,CAAC,IAAI,GAAG,GAAG,EAAE,QAAQ,SAAS,OAAO,GAAG,KAAK,IAAI,UAAU,CAC9E,aAAa,EACb,QAAQ,SAAS,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CACzD,CAAC;AAEF,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;CACpD;AAUD;;GAEG;AACH,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;EAIhB,CAAC;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"AASA,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,iCAAkC,QAAQ,WAIlE,CAAC;AAEF,eAAO,MAAM,WAAW,OAAQ,MAAM,KAAG,QAIxC,CAAC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.ts"],"names":[],"mappings":"AASA,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"}
@@ -1 +1 @@
1
- {"version":"5.7.3"}
1
+ {"version":"5.8.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/graph",
3
- "version": "0.8.2-main.5885341",
3
+ "version": "0.8.2-main.600d381",
4
4
  "description": "Low-level graph API",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -32,24 +32,28 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@preact/signals-core": "^1.6.0",
35
+ "effect": "3.14.21",
35
36
  "lodash.defaultsdeep": "^4.6.1",
36
- "@dxos/echo-db": "0.8.2-main.5885341",
37
- "@dxos/async": "0.8.2-main.5885341",
38
- "@dxos/debug": "0.8.2-main.5885341",
39
- "@dxos/echo-schema": "0.8.2-main.5885341",
40
- "@dxos/invariant": "0.8.2-main.5885341",
41
- "@dxos/live-object": "0.8.2-main.5885341",
42
- "@dxos/schema": "0.8.2-main.5885341",
43
- "@dxos/util": "0.8.2-main.5885341",
44
- "@dxos/log": "0.8.2-main.5885341"
37
+ "@dxos/async": "0.8.2-main.600d381",
38
+ "@dxos/debug": "0.8.2-main.600d381",
39
+ "@dxos/echo-db": "0.8.2-main.600d381",
40
+ "@dxos/echo-schema": "0.8.2-main.600d381",
41
+ "@dxos/invariant": "0.8.2-main.600d381",
42
+ "@dxos/live-object": "0.8.2-main.600d381",
43
+ "@dxos/util": "0.8.2-main.600d381",
44
+ "@dxos/schema": "0.8.2-main.600d381",
45
+ "@dxos/log": "0.8.2-main.600d381"
45
46
  },
46
47
  "devDependencies": {
47
48
  "@antv/graphlib": "^2.0.4",
48
49
  "@antv/layout": "^1.2.13",
49
50
  "@types/lodash.defaultsdeep": "^4.6.6",
50
- "@dxos/echo-db": "0.8.2-main.5885341",
51
- "@dxos/echo-schema": "0.8.2-main.5885341",
52
- "@dxos/random": "0.8.2-main.5885341"
51
+ "@dxos/echo-schema": "0.8.2-main.600d381",
52
+ "@dxos/echo-db": "0.8.2-main.600d381",
53
+ "@dxos/random": "0.8.2-main.600d381"
54
+ },
55
+ "peerDependencies": {
56
+ "effect": "^3.13.3"
53
57
  },
54
58
  "publishConfig": {
55
59
  "access": "public"
package/src/create.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { type ReactiveEchoObject } from '@dxos/echo-db';
5
+ import { type AnyLiveObject } from '@dxos/echo-db';
6
6
  import { FormatEnum, getSchema } from '@dxos/echo-schema';
7
7
  import { live } from '@dxos/live-object';
8
8
  import { log } from '@dxos/log';
@@ -16,8 +16,8 @@ import { createEdgeId } from './util';
16
16
  * Creates a new reactive graph from a set of ECHO objects.
17
17
  * References are mapped onto graph edges.
18
18
  */
19
- export const createGraph = (objects: ReactiveEchoObject<any>[]): GraphModel<GraphNode<ReactiveEchoObject<any>>> => {
20
- const graph = new GraphModel<GraphNode<ReactiveEchoObject<any>>>(live(Graph, { nodes: [], edges: [] }));
19
+ export const createGraph = (objects: AnyLiveObject<any>[]): GraphModel<GraphNode<AnyLiveObject<any>>> => {
20
+ const graph = new GraphModel<GraphNode<AnyLiveObject<any>>>(live(Graph, { nodes: [], edges: [] }));
21
21
 
22
22
  // Map objects.
23
23
  objects.forEach((object) => {
package/src/model.test.ts CHANGED
@@ -2,21 +2,20 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import { Schema } from 'effect';
5
6
  import { describe, test } from 'vitest';
6
7
 
7
- import { S } from '@dxos/echo-schema';
8
-
9
8
  import { GraphModel } from './model';
10
9
  import { BaseGraphNode, type GraphNode } from './types';
11
10
 
12
- const TestNode = S.extend(
11
+ const TestNode = Schema.extend(
13
12
  BaseGraphNode,
14
- S.Struct({
15
- value: S.String,
13
+ Schema.Struct({
14
+ value: Schema.String,
16
15
  }),
17
16
  );
18
17
 
19
- type TestNode = S.Schema.Type<typeof TestNode>;
18
+ type TestNode = Schema.Schema.Type<typeof TestNode>;
20
19
 
21
20
  type TestData = { value: string };
22
21
 
package/src/types.ts CHANGED
@@ -2,17 +2,18 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { S } from '@dxos/echo-schema';
5
+ import { Schema } from 'effect';
6
+
6
7
  import { type Specialize } from '@dxos/util';
7
8
 
8
- export const BaseGraphNode = S.Struct({
9
- id: S.String,
10
- type: S.optional(S.String),
11
- data: S.optional(S.Any),
9
+ export const BaseGraphNode = Schema.Struct({
10
+ id: Schema.String,
11
+ type: Schema.optional(Schema.String),
12
+ data: Schema.optional(Schema.Any),
12
13
  });
13
14
 
14
15
  /** Raw base type. */
15
- export type BaseGraphNode = S.Schema.Type<typeof BaseGraphNode>;
16
+ export type BaseGraphNode = Schema.Schema.Type<typeof BaseGraphNode>;
16
17
 
17
18
  /** Typed node data. */
18
19
  export type GraphNode<Data = any, Optional extends boolean = false> = Specialize<
@@ -24,16 +25,16 @@ export declare namespace GraphNode {
24
25
  export type Optional<T = any> = GraphNode<T, true>;
25
26
  }
26
27
 
27
- export const BaseGraphEdge = S.Struct({
28
- id: S.String,
29
- type: S.optional(S.String),
30
- data: S.optional(S.Any),
31
- source: S.String,
32
- target: S.String,
28
+ export const BaseGraphEdge = Schema.Struct({
29
+ id: Schema.String,
30
+ type: Schema.optional(Schema.String),
31
+ data: Schema.optional(Schema.Any),
32
+ source: Schema.String,
33
+ target: Schema.String,
33
34
  });
34
35
 
35
36
  /** Raw base type. */
36
- export type BaseGraphEdge = S.Schema.Type<typeof BaseGraphEdge>;
37
+ export type BaseGraphEdge = Schema.Schema.Type<typeof BaseGraphEdge>;
37
38
 
38
39
  /** Typed edge data. */
39
40
  export type GraphEdge<Data = any, Optional extends boolean = false> = Specialize<
@@ -48,15 +49,18 @@ export declare namespace GraphEdge {
48
49
  /**
49
50
  * Allows any additional properties on graph nodes.
50
51
  */
51
- const ExtendableBaseGraphNode = S.extend(BaseGraphNode, S.Struct({}, { key: S.String, value: S.Any }));
52
+ const ExtendableBaseGraphNode = Schema.extend(
53
+ BaseGraphNode,
54
+ Schema.Struct({}, { key: Schema.String, value: Schema.Any }),
55
+ );
52
56
 
53
57
  /**
54
58
  * Generic graph.
55
59
  */
56
- export const Graph = S.Struct({
57
- id: S.optional(S.String),
58
- nodes: S.mutable(S.Array(ExtendableBaseGraphNode)),
59
- edges: S.mutable(S.Array(BaseGraphEdge)),
60
+ export const Graph = Schema.Struct({
61
+ id: Schema.optional(Schema.String),
62
+ nodes: Schema.mutable(Schema.Array(ExtendableBaseGraphNode)),
63
+ edges: Schema.mutable(Schema.Array(BaseGraphEdge)),
60
64
  });
61
65
 
62
- export type Graph = S.Schema.Type<typeof Graph>;
66
+ export type Graph = Schema.Schema.Type<typeof Graph>;