@dxos/app-graph 0.10.0 → 0.11.0
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/chunk-graph-builder.mjs +1901 -0
- package/dist/lib/chunk-graph-builder.mjs.map +1 -0
- package/dist/lib/index.mjs +281 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/scheduler.browser.mjs +2 -0
- package/dist/lib/scheduler.mjs +12 -0
- package/dist/lib/scheduler.mjs.map +1 -0
- package/dist/lib/testing.mjs +28 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/types/src/atoms.d.ts +1 -1
- package/dist/types/src/atoms.d.ts.map +1 -1
- package/dist/types/src/graph-builder.d.ts +128 -9
- package/dist/types/src/graph-builder.d.ts.map +1 -1
- package/dist/types/src/graph.d.ts +4 -1
- package/dist/types/src/graph.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/node-matcher.d.ts +1 -1
- package/dist/types/src/node-matcher.d.ts.map +1 -1
- package/dist/types/src/node.d.ts +14 -2
- package/dist/types/src/node.d.ts.map +1 -1
- package/dist/types/src/path-resolution.d.ts +69 -0
- package/dist/types/src/path-resolution.d.ts.map +1 -0
- package/dist/types/src/path-resolution.test.d.ts +2 -0
- package/dist/types/src/path-resolution.test.d.ts.map +1 -0
- package/dist/types/src/stories/EchoGraph.stories.d.ts.map +1 -1
- package/dist/types/src/testing/setup-graph-builder.d.ts +1 -1
- package/dist/types/src/testing/setup-graph-builder.d.ts.map +1 -1
- package/dist/types/src/util.test.d.ts +2 -0
- package/dist/types/src/util.test.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +22 -21
- package/src/atoms.ts +1 -1
- package/src/graph-builder.test.ts +21 -1
- package/src/graph-builder.ts +327 -58
- package/src/graph.test.ts +1 -1
- package/src/graph.ts +22 -16
- package/src/index.ts +1 -0
- package/src/node-matcher.test.ts +1 -1
- package/src/node-matcher.ts +1 -1
- package/src/node.ts +19 -2
- package/src/path-resolution.test.ts +520 -0
- package/src/path-resolution.ts +355 -0
- package/src/stories/EchoGraph.stories.tsx +97 -121
- package/src/testing/setup-graph-builder.ts +1 -1
- package/src/util.test.ts +85 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YMTZ7MPW.mjs +0 -1509
- package/dist/lib/neutral/chunk-YMTZ7MPW.mjs.map +0 -7
- package/dist/lib/neutral/index.mjs +0 -40
- package/dist/lib/neutral/index.mjs.map +0 -7
- package/dist/lib/neutral/meta.json +0 -1
- package/dist/lib/neutral/scheduler.mjs +0 -15
- package/dist/lib/neutral/scheduler.mjs.map +0 -7
- package/dist/lib/neutral/testing/index.mjs +0 -40
- package/dist/lib/neutral/testing/index.mjs.map +0 -7
package/src/util.test.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import { describe, test } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import * as Node from './node';
|
|
9
|
+
import { nodeArgsUnchanged, shallowEqual } from './util';
|
|
10
|
+
|
|
11
|
+
const node = (overrides: Partial<Node.NodeArg<unknown>> = {}): Node.NodeArg<unknown> => ({
|
|
12
|
+
id: 'node',
|
|
13
|
+
type: 'example',
|
|
14
|
+
data: null,
|
|
15
|
+
properties: { label: 'Node' },
|
|
16
|
+
...overrides,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('shallowEqual', () => {
|
|
20
|
+
test('same reference', ({ expect }) => {
|
|
21
|
+
const value = { a: 1 };
|
|
22
|
+
expect(shallowEqual(value, value)).to.be.true;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('same own keys with identical values', ({ expect }) => {
|
|
26
|
+
expect(shallowEqual({ a: 1, b: 'x' }, { a: 1, b: 'x' })).to.be.true;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('differing key counts', ({ expect }) => {
|
|
30
|
+
expect(shallowEqual({ a: 1 }, { a: 1, b: 2 })).to.be.false;
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test('nested values are compared by reference', ({ expect }) => {
|
|
34
|
+
expect(shallowEqual({ a: { b: 1 } }, { a: { b: 1 } })).to.be.false;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('non-objects', ({ expect }) => {
|
|
38
|
+
expect(shallowEqual(1, 1)).to.be.true;
|
|
39
|
+
expect(shallowEqual(1, 2)).to.be.false;
|
|
40
|
+
expect(shallowEqual(null, {})).to.be.false;
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe('nodeArgsUnchanged', () => {
|
|
45
|
+
test('structurally identical args', ({ expect }) => {
|
|
46
|
+
expect(nodeArgsUnchanged([node()], [node()])).to.be.true;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('differing length, id, type or properties', ({ expect }) => {
|
|
50
|
+
expect(nodeArgsUnchanged([node()], [])).to.be.false;
|
|
51
|
+
expect(nodeArgsUnchanged([node()], [node({ id: 'other' })])).to.be.false;
|
|
52
|
+
expect(nodeArgsUnchanged([node()], [node({ type: 'other' })])).to.be.false;
|
|
53
|
+
expect(nodeArgsUnchanged([node()], [node({ properties: { label: 'Other' } })])).to.be.false;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('inline children are compared recursively', ({ expect }) => {
|
|
57
|
+
const withChild = (label: string) => [node({ nodes: [node({ id: 'child', properties: { label } })] })];
|
|
58
|
+
expect(nodeArgsUnchanged(withChild('Child'), withChild('Child'))).to.be.true;
|
|
59
|
+
expect(nodeArgsUnchanged(withChild('Child'), withChild('Other'))).to.be.false;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('data is compared shallowly, so a re-created data object reads as changed', ({ expect }) => {
|
|
63
|
+
const shared = { value: 1 };
|
|
64
|
+
expect(nodeArgsUnchanged([node({ data: shared })], [node({ data: shared })])).to.be.true;
|
|
65
|
+
// Same contents, new identity one level down: `shallowEqual` compares own values by reference.
|
|
66
|
+
expect(nodeArgsUnchanged([node({ data: { nested: { value: 1 } } })], [node({ data: { nested: { value: 1 } } })])).to
|
|
67
|
+
.be.false;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// An action's `data` is its invoke closure, rebuilt inline on every connector run, so action-bearing
|
|
71
|
+
// output can never compare unchanged.
|
|
72
|
+
test('a re-created action closure reads as changed', ({ expect }) => {
|
|
73
|
+
const makeArgs = () => [
|
|
74
|
+
node({ actions: [Node.makeAction({ id: 'delete', data: () => Effect.void, properties: { label: 'Delete' } })] }),
|
|
75
|
+
];
|
|
76
|
+
expect(nodeArgsUnchanged(makeArgs(), makeArgs())).to.be.false;
|
|
77
|
+
|
|
78
|
+
// Holding the closure identity stable is what makes the same args compare unchanged.
|
|
79
|
+
const invoke = () => Effect.void;
|
|
80
|
+
const stable = () => [
|
|
81
|
+
node({ actions: [Node.makeAction({ id: 'delete', data: invoke, properties: { label: 'Delete' } })] }),
|
|
82
|
+
];
|
|
83
|
+
expect(nodeArgsUnchanged(stable(), stable())).to.be.true;
|
|
84
|
+
});
|
|
85
|
+
});
|