@dxos/app-graph 0.8.4-main.dedc0f3 → 0.8.4-main.e8ec1fe
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +216 -233
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +216 -233
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/src/graph-builder.d.ts +16 -16
- package/dist/types/src/graph-builder.d.ts.map +1 -1
- package/dist/types/src/graph.d.ts +19 -19
- package/dist/types/src/graph.d.ts.map +1 -1
- package/dist/types/src/stories/EchoGraph.stories.d.ts +0 -1
- package/dist/types/src/stories/EchoGraph.stories.d.ts.map +1 -1
- package/dist/types/src/testing.d.ts +3 -3
- package/dist/types/src/testing.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +31 -32
- package/src/graph-builder.test.ts +34 -33
- package/src/graph-builder.ts +50 -45
- package/src/graph.test.ts +3 -3
- package/src/graph.ts +115 -73
- package/src/signals-integration.test.ts +29 -28
- package/src/stories/EchoGraph.stories.tsx +28 -22
- package/src/stories/Tree.tsx +1 -1
- package/src/testing.ts +4 -4
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type Registry, RegistryContext, Rx, useRxValue } from '@effect-rx/rx-react';
|
|
5
|
+
import { Atom, type Registry, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
|
|
8
6
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
9
|
-
import
|
|
7
|
+
import * as Function from 'effect/Function';
|
|
8
|
+
import * as Option from 'effect/Option';
|
|
10
9
|
import React, { type PropsWithChildren, useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
11
10
|
|
|
12
11
|
import {
|
|
@@ -25,15 +24,15 @@ import { faker } from '@dxos/random';
|
|
|
25
24
|
import { type Client, useClient } from '@dxos/react-client';
|
|
26
25
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
27
26
|
import { Icon, IconButton, Input, Select } from '@dxos/react-ui';
|
|
27
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
28
28
|
import { Path, Tree } from '@dxos/react-ui-list';
|
|
29
29
|
import { getSize, mx } from '@dxos/react-ui-theme';
|
|
30
|
-
import { withTheme } from '@dxos/storybook-utils';
|
|
31
30
|
import { byPosition, isNonNullable, safeParseInt } from '@dxos/util';
|
|
32
31
|
|
|
33
32
|
import { type ExpandableGraph, ROOT_ID } from '../graph';
|
|
34
|
-
import { GraphBuilder,
|
|
33
|
+
import { GraphBuilder, atomFromObservable, createExtension } from '../graph-builder';
|
|
35
34
|
import { type Node } from '../node';
|
|
36
|
-
import {
|
|
35
|
+
import { atomFromQuery } from '../testing';
|
|
37
36
|
|
|
38
37
|
import { JsonTree } from './Tree';
|
|
39
38
|
|
|
@@ -61,18 +60,20 @@ const createGraph = (client: Client, registry: Registry.Registry): ExpandableGra
|
|
|
61
60
|
const spaceBuilderExtension = createExtension({
|
|
62
61
|
id: 'space',
|
|
63
62
|
connector: (node) =>
|
|
64
|
-
|
|
65
|
-
pipe(
|
|
63
|
+
Atom.make((get) =>
|
|
64
|
+
Function.pipe(
|
|
66
65
|
get(node),
|
|
67
66
|
Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
|
|
68
67
|
Option.map(() => {
|
|
69
|
-
const spaces = get(
|
|
68
|
+
const spaces = get(atomFromObservable(client.spaces)) ?? [];
|
|
70
69
|
return spaces
|
|
71
|
-
.filter((space) => get(
|
|
70
|
+
.filter((space) => get(atomFromObservable(space.state)) === SpaceState.SPACE_READY)
|
|
72
71
|
.map((space) => ({
|
|
73
72
|
id: space.id,
|
|
74
73
|
type: 'dxos.org/type/Space',
|
|
75
|
-
properties: {
|
|
74
|
+
properties: {
|
|
75
|
+
label: get(atomFromObservable(space.properties.name)),
|
|
76
|
+
},
|
|
76
77
|
data: space,
|
|
77
78
|
}));
|
|
78
79
|
}),
|
|
@@ -85,15 +86,15 @@ const createGraph = (client: Client, registry: Registry.Registry): ExpandableGra
|
|
|
85
86
|
id: 'object',
|
|
86
87
|
connector: (node) => {
|
|
87
88
|
let query: QueryResult<Live<Expando>> | undefined;
|
|
88
|
-
return
|
|
89
|
-
pipe(
|
|
89
|
+
return Atom.make((get) =>
|
|
90
|
+
Function.pipe(
|
|
90
91
|
get(node),
|
|
91
92
|
Option.flatMap((node) => (isSpace(node.data) ? Option.some(node.data) : Option.none())),
|
|
92
93
|
Option.map((space) => {
|
|
93
94
|
if (!query) {
|
|
94
95
|
query = space.db.query(Query.type(Expando, { type: 'test' }));
|
|
95
96
|
}
|
|
96
|
-
const objects = get(
|
|
97
|
+
const objects = get(atomFromQuery(query));
|
|
97
98
|
return objects.map((object) => ({
|
|
98
99
|
id: object.id,
|
|
99
100
|
type: 'dxos.org/type/test',
|
|
@@ -160,7 +161,12 @@ const runAction = async (client: Client, action: Action) => {
|
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
case Action.ADD_OBJECT:
|
|
163
|
-
getRandomSpace(client)?.db.add(
|
|
164
|
+
getRandomSpace(client)?.db.add(
|
|
165
|
+
Obj.make(Type.Expando, {
|
|
166
|
+
type: 'test',
|
|
167
|
+
name: faker.commerce.productName(),
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
164
170
|
break;
|
|
165
171
|
|
|
166
172
|
case Action.REMOVE_OBJECT: {
|
|
@@ -215,7 +221,7 @@ const Controls = ({ children }: PropsWithChildren) => {
|
|
|
215
221
|
<Input.TextInput
|
|
216
222
|
autoComplete='off'
|
|
217
223
|
size={5}
|
|
218
|
-
classNames='
|
|
224
|
+
classNames='is-[100px] text-right pie-[22px]'
|
|
219
225
|
placeholder='Interval'
|
|
220
226
|
value={actionInterval}
|
|
221
227
|
onChange={({ target: { value } }) => setActionInterval(value)}
|
|
@@ -250,16 +256,16 @@ const Controls = ({ children }: PropsWithChildren) => {
|
|
|
250
256
|
const meta = {
|
|
251
257
|
title: 'sdk/app-graph/EchoGraph',
|
|
252
258
|
decorators: [
|
|
259
|
+
withTheme,
|
|
253
260
|
withClientProvider({
|
|
254
261
|
createIdentity: true,
|
|
255
|
-
|
|
262
|
+
onCreateIdentity: async ({ client }) => {
|
|
256
263
|
await client.spaces.create();
|
|
257
264
|
await client.spaces.create();
|
|
258
265
|
},
|
|
259
266
|
}),
|
|
260
|
-
withTheme,
|
|
261
267
|
],
|
|
262
|
-
} satisfies Meta
|
|
268
|
+
} satisfies Meta;
|
|
263
269
|
|
|
264
270
|
export default meta;
|
|
265
271
|
|
|
@@ -270,7 +276,7 @@ export const JsonView: Story = {
|
|
|
270
276
|
const client = useClient();
|
|
271
277
|
const registry = useContext(RegistryContext);
|
|
272
278
|
const graph = useMemo(() => createGraph(client, registry), [client, registry]);
|
|
273
|
-
const data =
|
|
279
|
+
const data = useAtomValue(graph.json());
|
|
274
280
|
|
|
275
281
|
return (
|
|
276
282
|
<>
|
|
@@ -290,7 +296,7 @@ export const TreeView: Story = {
|
|
|
290
296
|
|
|
291
297
|
const useItems = useCallback(
|
|
292
298
|
(node?: Node, options?: { disposition?: string; sort?: boolean }) => {
|
|
293
|
-
const connections =
|
|
299
|
+
const connections = useAtomValue(graph.connections(node?.id ?? ROOT_ID));
|
|
294
300
|
return options?.sort ? connections.toSorted((a, b) => byPosition(a.properties, b.properties)) : connections;
|
|
295
301
|
},
|
|
296
302
|
[graph],
|
package/src/stories/Tree.tsx
CHANGED
|
@@ -72,7 +72,7 @@ const Scalar: FC<{ value: any }> = ({ value }) => {
|
|
|
72
72
|
|
|
73
73
|
const Box: FC<HTMLAttributes<HTMLDivElement>> = ({ children, className, ...props }) => {
|
|
74
74
|
return (
|
|
75
|
-
<div className={mx('flex
|
|
75
|
+
<div className={mx('flex pli-2 border border-l-0 font-mono truncate', className)} {...props}>
|
|
76
76
|
{children}
|
|
77
77
|
</div>
|
|
78
78
|
);
|
package/src/testing.ts
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Atom } from '@effect-atom/atom-react';
|
|
6
6
|
|
|
7
|
+
import { type AnyEchoObject } from '@dxos/echo/internal';
|
|
7
8
|
import { type QueryResult } from '@dxos/echo-db';
|
|
8
|
-
import { type AnyEchoObject } from '@dxos/echo-schema';
|
|
9
9
|
|
|
10
|
-
export const
|
|
11
|
-
return
|
|
10
|
+
export const atomFromQuery = <T extends AnyEchoObject>(query: QueryResult<T>): Atom.Atom<T[]> => {
|
|
11
|
+
return Atom.make((get) => {
|
|
12
12
|
const unsubscribe = query.subscribe((result) => {
|
|
13
13
|
get.setSelf(result.objects);
|
|
14
14
|
});
|