@dxos/app-graph 0.7.5-main.9d2a38b → 0.7.5-main.e94eead

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.
@@ -1 +1 @@
1
- {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/graph.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,KAAK,IAAI,EAAgB,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAmC,MAAM,QAAQ,CAAC;AAMlH,eAAO,MAAM,QAAQ,SAAU,IAAI,KAAG,KAIrC,CAAC;AAEF,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,eAAO,MAAM,SAAS,4BAA4B,CAAC;AACnD,eAAO,MAAM,WAAW,8BAA8B,CAAC;AACvD,eAAO,MAAM,iBAAiB,mCAAmC,CAAC;AAElE,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IACvF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAKF,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;OAIG;IACH,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;IAExD;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IAEZ;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxC,cAAc,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC1C,YAAY,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;CACvC,CAAC;AAEF;;GAEG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAmE;IACpG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAgC;IAE/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAqC;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;gBAYhD,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,GAAE,WAAgB;IAoC3F,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAAM;IAK9E;;OAEG;IACH,IAAI,IAAI;;;;;;OAEP;IAED;;OAEG;IACH,MAAM,CAAC,EAAE,EAAY,EAAE,SAAc,EAAE,GAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IA2BjF,MAAM;IAwBN;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,IAAI,GAAG,SAAS;IASxD;;;;;;;OAOG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9D;;OAEG;IACH,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAM;;;;;;;IAMhH;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAqB,EAAE,GAAE;QAAE,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAO;IAIzE;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO;;;;;;;IAOzD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,GAAE,QAAqB,EAAE,IAAI,CAAC,EAAE,MAAM;IASvE,OAAO,CAAC,IAAI;IAIZ;;;;;;OAMG;IACH,QAAQ,CACN,EAAE,OAAO,EAAE,IAAgB,EAAE,QAAqB,EAAE,SAAS,EAAE,EAAE,qBAAqB,EACtF,IAAI,GAAE,MAAM,EAAO,GAClB,IAAI;IAgBP;;;;;;OAMG;IACH,iBAAiB,CACf,EAAE,OAAO,EAAE,IAAgB,EAAE,QAAqB,EAAE,SAAS,EAAE,EAAE,qBAAqB,EACtF,WAAW,GAAE,MAAM,EAAO;IAiB5B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAe,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE,GAAG,SAAS;IAuB/F;;OAEG;IACG,WAAW,CACf,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAC3C,EAAE,OAAe,EAAE,QAAc,EAAE,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO;IA6BnF,OAAO,CAAC,QAAQ;IAgEhB,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,QAAQ;IA6BhB,OAAO,CAAC,WAAW;IAiCnB;;;;;;;;;OASG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;IAa9D,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,SAAS;CAyBlB"}
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/graph.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  import '@dxos-theme';
2
- import React from 'react';
3
2
  declare const _default: {
4
3
  title: string;
5
- render: () => React.JSX.Element;
6
- decorators: import("@storybook/react/*").Decorator[];
4
+ render: () => import("react/jsx-runtime").JSX.Element;
5
+ decorators: import("@storybook/react").Decorator[];
7
6
  };
8
7
  export default _default;
9
8
  export declare const Default: {};
@@ -1 +1 @@
1
- {"version":3,"file":"EchoGraph.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/EchoGraph.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;AAGrB,OAAO,KAA8B,MAAM,OAAO,CAAC;;;;;;AAoPnD,wBAaE;AAEF,eAAO,MAAM,OAAO,IAAK,CAAC"}
1
+ {"version":3,"file":"EchoGraph.stories.d.ts","sourceRoot":"","sources":["../../../../src/stories/EchoGraph.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,aAAa,CAAC;;;;;;AAuPrB,wBAaE;AAEF,eAAO,MAAM,OAAO,IAAK,CAAC"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@dxos/app-graph",
3
- "version": "0.7.5-main.9d2a38b",
3
+ "version": "0.7.5-main.e94eead",
4
4
  "description": "Constructs knowledge graphs for the purpose of building applications on top of",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
7
  "license": "MIT",
8
8
  "author": "DXOS.org",
9
9
  "sideEffects": true,
10
+ "type": "module",
10
11
  "exports": {
11
12
  ".": {
12
13
  "types": "./dist/types/src/index.d.ts",
@@ -25,14 +26,14 @@
25
26
  "dependencies": {
26
27
  "@preact/signals-core": "^1.6.0",
27
28
  "main-thread-scheduling": "^14.1.1",
28
- "@dxos/debug": "0.7.5-main.9d2a38b",
29
- "@dxos/echo-schema": "0.7.5-main.9d2a38b",
30
- "@dxos/async": "0.7.5-main.9d2a38b",
31
- "@dxos/echo-signals": "0.7.5-main.9d2a38b",
32
- "@dxos/live-object": "0.7.5-main.9d2a38b",
33
- "@dxos/invariant": "0.7.5-main.9d2a38b",
34
- "@dxos/log": "0.7.5-main.9d2a38b",
35
- "@dxos/util": "0.7.5-main.9d2a38b"
29
+ "@dxos/async": "0.7.5-main.e94eead",
30
+ "@dxos/debug": "0.7.5-main.e94eead",
31
+ "@dxos/invariant": "0.7.5-main.e94eead",
32
+ "@dxos/echo-signals": "0.7.5-main.e94eead",
33
+ "@dxos/echo-schema": "0.7.5-main.e94eead",
34
+ "@dxos/live-object": "0.7.5-main.e94eead",
35
+ "@dxos/log": "0.7.5-main.e94eead",
36
+ "@dxos/util": "0.7.5-main.e94eead"
36
37
  },
37
38
  "devDependencies": {
38
39
  "@phosphor-icons/react": "^2.1.5",
@@ -41,18 +42,18 @@
41
42
  "react": "~18.2.0",
42
43
  "react-dom": "~18.2.0",
43
44
  "vite": "5.4.7",
44
- "@dxos/random": "0.7.5-main.9d2a38b",
45
- "@dxos/react-ui-theme": "0.7.5-main.9d2a38b",
46
- "@dxos/react-ui": "0.7.5-main.9d2a38b",
47
- "@dxos/react-client": "0.7.5-main.9d2a38b",
48
- "@dxos/storybook-utils": "0.7.5-main.9d2a38b"
45
+ "@dxos/random": "0.7.5-main.e94eead",
46
+ "@dxos/react-client": "0.7.5-main.e94eead",
47
+ "@dxos/react-ui": "0.7.5-main.e94eead",
48
+ "@dxos/react-ui-theme": "0.7.5-main.e94eead",
49
+ "@dxos/storybook-utils": "0.7.5-main.e94eead"
49
50
  },
50
51
  "peerDependencies": {
51
52
  "@phosphor-icons/react": "^2.1.5",
52
53
  "react": "~18.2.0",
53
54
  "react-dom": "~18.2.0",
54
- "@dxos/react-ui": "0.7.5-main.9d2a38b",
55
- "@dxos/react-ui-theme": "0.7.5-main.9d2a38b"
55
+ "@dxos/react-ui": "0.7.5-main.e94eead",
56
+ "@dxos/react-ui-theme": "0.7.5-main.e94eead"
56
57
  },
57
58
  "publishConfig": {
58
59
  "access": "public"
@@ -5,6 +5,8 @@
5
5
  import { batch, signal } from '@preact/signals-core';
6
6
  import { describe, expect, test } from 'vitest';
7
7
 
8
+ import { updateCounter } from '@dxos/echo-schema/testing';
9
+
8
10
  import { ACTION_TYPE, ROOT_ID, ROOT_TYPE } from './graph';
9
11
  import { GraphBuilder, createExtension, memoize } from './graph-builder';
10
12
  import { type Node } from './node';
@@ -175,6 +177,40 @@ describe('GraphBuilder', () => {
175
177
  expect(node.properties.label).to.equal('updated');
176
178
  });
177
179
 
180
+ test('updates with new extensions', async () => {
181
+ const name = signal('default');
182
+ const builder = new GraphBuilder();
183
+ builder.addExtension(
184
+ createExtension({
185
+ id: 'connector',
186
+ connector: () => [{ id: EXAMPLE_ID, type: EXAMPLE_TYPE, data: name, properties: { label: name.value } }],
187
+ }),
188
+ );
189
+ const graph = builder.graph;
190
+ await graph.expand(graph.root);
191
+
192
+ let nodes: Node[] = [];
193
+ using updates = updateCounter(() => {
194
+ nodes = graph.nodes(graph.root);
195
+ });
196
+
197
+ expect(updates.count).to.equal(0);
198
+ expect(nodes).has.length(1);
199
+ expect(nodes[0].id).to.equal(EXAMPLE_ID);
200
+
201
+ builder.addExtension(
202
+ createExtension({
203
+ id: 'connector-2',
204
+ connector: () => [{ id: exampleId(2), type: EXAMPLE_TYPE, data: 0 }],
205
+ }),
206
+ );
207
+
208
+ expect(updates.count).to.equal(1);
209
+ expect(nodes).has.length(2);
210
+ expect(nodes[0].id).to.equal(EXAMPLE_ID);
211
+ expect(nodes[1].id).to.equal(exampleId(2));
212
+ });
213
+
178
214
  test('removes', async () => {
179
215
  const nodes = signal([
180
216
  { id: exampleId(1), type: EXAMPLE_TYPE, data: 1 },
@@ -2,13 +2,13 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { effect, type Signal, signal } from '@preact/signals-core';
5
+ import { effect, type Signal, signal, untracked } from '@preact/signals-core';
6
6
 
7
7
  import { Trigger, type UnsubscribeCallback } from '@dxos/async';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { create } from '@dxos/live-object';
10
10
  import { log } from '@dxos/log';
11
- import { byDisposition, type Disposition, isNode, type MaybePromise, nonNullable } from '@dxos/util';
11
+ import { byPosition, type Position, isNode, type MaybePromise, isNonNullable } from '@dxos/util';
12
12
 
13
13
  import { ACTION_GROUP_TYPE, ACTION_TYPE, Graph, ROOT_ID, type GraphParams } from './graph';
14
14
  import { type ActionData, actionGroupSymbol, type Node, type NodeArg, type Relation } from './node';
@@ -63,7 +63,7 @@ export type CreateExtensionOptions<T = any> = {
63
63
  id: string;
64
64
  relation?: Relation;
65
65
  type?: string;
66
- disposition?: Disposition;
66
+ position?: Position;
67
67
  filter?: (node: Node) => node is Node<T>;
68
68
  resolver?: ResolverExtension;
69
69
  connector?: ConnectorExtension<GuardedNodeType<CreateExtensionOptions<T>['filter']>>;
@@ -75,16 +75,16 @@ export type CreateExtensionOptions<T = any> = {
75
75
  * Create a graph builder extension.
76
76
  */
77
77
  export const createExtension = <T = any>(extension: CreateExtensionOptions<T>): BuilderExtension[] => {
78
- const { id, disposition = 'static', resolver, connector, actions, actionGroups, ...rest } = extension;
78
+ const { id, position = 'static', resolver, connector, actions, actionGroups, ...rest } = extension;
79
79
  const getId = (key: string) => `${id}/${key}`;
80
80
  return [
81
- resolver ? { id: getId('resolver'), disposition, resolver } : undefined,
82
- connector ? { ...rest, id: getId('connector'), disposition, connector } : undefined,
81
+ resolver ? { id: getId('resolver'), position, resolver } : undefined,
82
+ connector ? { ...rest, id: getId('connector'), position, connector } : undefined,
83
83
  actionGroups
84
84
  ? ({
85
85
  ...rest,
86
86
  id: getId('actionGroups'),
87
- disposition,
87
+ position,
88
88
  type: ACTION_GROUP_TYPE,
89
89
  relation: 'outbound',
90
90
  connector: ({ node }) =>
@@ -95,13 +95,13 @@ export const createExtension = <T = any>(extension: CreateExtensionOptions<T>):
95
95
  ? ({
96
96
  ...rest,
97
97
  id: getId('actions'),
98
- disposition,
98
+ position,
99
99
  type: ACTION_TYPE,
100
100
  relation: 'outbound',
101
101
  connector: ({ node }) => actions({ node })?.map((arg) => ({ ...arg, type: ACTION_TYPE })),
102
102
  } satisfies BuilderExtension)
103
103
  : undefined,
104
- ].filter(nonNullable);
104
+ ].filter(isNonNullable);
105
105
  };
106
106
 
107
107
  export type GraphBuilderTraverseOptions = {
@@ -174,7 +174,7 @@ export const toSignal = <T>(
174
174
 
175
175
  export type BuilderExtension = Readonly<{
176
176
  id: string;
177
- disposition: Disposition;
177
+ position: Position;
178
178
  resolver?: ResolverExtension;
179
179
  connector?: ConnectorExtension;
180
180
  // Only for connector.
@@ -185,6 +185,14 @@ export type BuilderExtension = Readonly<{
185
185
 
186
186
  type ExtensionArg = BuilderExtension | BuilderExtension[] | ExtensionArg[];
187
187
 
188
+ export const flattenExtensions = (extension: ExtensionArg, acc: BuilderExtension[] = []): BuilderExtension[] => {
189
+ if (Array.isArray(extension)) {
190
+ return [...acc, ...extension.flatMap((ext) => flattenExtensions(ext, acc))];
191
+ } else {
192
+ return [...acc, extension];
193
+ }
194
+ };
195
+
188
196
  /**
189
197
  * The builder provides an extensible way to compose the construction of the graph.
190
198
  */
@@ -244,17 +252,24 @@ export class GraphBuilder {
244
252
  return this._graph;
245
253
  }
246
254
 
255
+ /**
256
+ * @reactive
257
+ */
258
+ get extensions() {
259
+ return Object.values(this._extensions);
260
+ }
261
+
247
262
  /**
248
263
  * Register a node builder which will be called in order to construct the graph.
249
264
  */
250
265
  addExtension(extension: ExtensionArg): GraphBuilder {
251
- if (Array.isArray(extension)) {
252
- extension.forEach((ext) => this.addExtension(ext));
253
- return this;
254
- }
255
-
256
- this._dispatcher.state[extension.id] = [];
257
- this._extensions[extension.id] = extension;
266
+ const extensions = flattenExtensions(extension);
267
+ untracked(() => {
268
+ extensions.forEach((extension) => {
269
+ this._dispatcher.state[extension.id] = [];
270
+ this._extensions[extension.id] = extension;
271
+ });
272
+ });
258
273
  return this;
259
274
  }
260
275
 
@@ -262,7 +277,9 @@ export class GraphBuilder {
262
277
  * Remove a node builder from the graph builder.
263
278
  */
264
279
  removeExtension(id: string): GraphBuilder {
265
- delete this._extensions[id];
280
+ untracked(() => {
281
+ delete this._extensions[id];
282
+ });
266
283
  return this;
267
284
  }
268
285
 
@@ -326,7 +343,7 @@ export class GraphBuilder {
326
343
  this._resolverSubscriptions.set(
327
344
  nodeId,
328
345
  effect(() => {
329
- const extensions = Object.values(this._extensions).toSorted(byDisposition);
346
+ const extensions = Object.values(this._extensions).toSorted(byPosition);
330
347
  for (const { id, resolver } of extensions) {
331
348
  if (!resolver) {
332
349
  continue;
@@ -384,7 +401,7 @@ export class GraphBuilder {
384
401
 
385
402
  // TODO(wittjosiah): Consider allowing extensions to collaborate on the same node by merging their results.
386
403
  const nodes: NodeArg<any>[] = [];
387
- const extensions = Object.values(this._extensions).toSorted(byDisposition);
404
+ const extensions = Object.values(this._extensions).toSorted(byPosition);
388
405
  for (const { id, connector, filter, type, relation = 'outbound' } of extensions) {
389
406
  if (
390
407
  !connector ||
package/src/graph.ts CHANGED
@@ -8,7 +8,7 @@ import { asyncTimeout, Trigger } from '@dxos/async';
8
8
  import { invariant } from '@dxos/invariant';
9
9
  import { type ReactiveObject, create } from '@dxos/live-object';
10
10
  import { log } from '@dxos/log';
11
- import { type MakeOptional, nonNullable, pick } from '@dxos/util';
11
+ import { type MakeOptional, isNonNullable, pick } from '@dxos/util';
12
12
 
13
13
  import { type Node, type NodeArg, type NodeFilter, type Relation, actionGroupSymbol, isActionLike } from './node';
14
14
 
@@ -162,7 +162,7 @@ export class Graph {
162
162
  const nextSeen = [...seen, node.id];
163
163
  return nextSeen.includes(n.id) ? undefined : toJSON(n, nextSeen);
164
164
  })
165
- .filter(nonNullable);
165
+ .filter(isNonNullable);
166
166
  }
167
167
  return obj;
168
168
  };
@@ -599,7 +599,7 @@ export class Graph {
599
599
  } else {
600
600
  return edges[relation]
601
601
  .map((id) => this._nodes[id])
602
- .filter(nonNullable)
602
+ .filter(isNonNullable)
603
603
  .filter((n) => !type || n.type === type);
604
604
  }
605
605
  }