@a2ui/web_core 0.8.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/README.md +13 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/src/v0_8/data/guards.d.ts +24 -0
- package/dist/src/v0_8/data/guards.d.ts.map +1 -0
- package/dist/src/v0_8/data/guards.js +153 -0
- package/dist/src/v0_8/data/guards.js.map +1 -0
- package/dist/src/v0_8/data/model-processor.d.ts +79 -0
- package/dist/src/v0_8/data/model-processor.d.ts.map +1 -0
- package/dist/src/v0_8/data/model-processor.js +627 -0
- package/dist/src/v0_8/data/model-processor.js.map +1 -0
- package/dist/src/v0_8/events/base.d.ts +24 -0
- package/dist/src/v0_8/events/base.d.ts.map +1 -0
- package/dist/src/v0_8/events/base.js +17 -0
- package/dist/src/v0_8/events/base.js.map +1 -0
- package/dist/src/v0_8/events/index.d.ts +18 -0
- package/dist/src/v0_8/events/index.d.ts.map +1 -0
- package/dist/src/v0_8/events/index.js +18 -0
- package/dist/src/v0_8/events/index.js.map +1 -0
- package/dist/src/v0_8/events/validation-event.d.ts +46 -0
- package/dist/src/v0_8/events/validation-event.d.ts.map +1 -0
- package/dist/src/v0_8/events/validation-event.js +33 -0
- package/dist/src/v0_8/events/validation-event.js.map +1 -0
- package/dist/src/v0_8/index.d.ts +743 -0
- package/dist/src/v0_8/index.d.ts.map +1 -0
- package/dist/src/v0_8/index.js +12 -0
- package/dist/src/v0_8/index.js.map +1 -0
- package/dist/src/v0_8/schemas/a2ui_client_capabilities_schema.json +23 -0
- package/dist/src/v0_8/schemas/catalog_description_schema.json +34 -0
- package/dist/src/v0_8/schemas/client_to_server.json +53 -0
- package/dist/src/v0_8/schemas/server_to_client.json +148 -0
- package/dist/src/v0_8/schemas/server_to_client_with_standard_catalog.json +823 -0
- package/dist/src/v0_8/schemas/standard_catalog_definition.json +772 -0
- package/dist/src/v0_8/styles/behavior.d.ts +2 -0
- package/dist/src/v0_8/styles/behavior.d.ts.map +1 -0
- package/dist/src/v0_8/styles/behavior.js +54 -0
- package/dist/src/v0_8/styles/behavior.js.map +1 -0
- package/dist/src/v0_8/styles/border.d.ts +2 -0
- package/dist/src/v0_8/styles/border.d.ts.map +1 -0
- package/dist/src/v0_8/styles/border.js +41 -0
- package/dist/src/v0_8/styles/border.js.map +1 -0
- package/dist/src/v0_8/styles/colors.d.ts +2 -0
- package/dist/src/v0_8/styles/colors.d.ts.map +1 -0
- package/dist/src/v0_8/styles/colors.js +80 -0
- package/dist/src/v0_8/styles/colors.js.map +1 -0
- package/dist/src/v0_8/styles/icons.d.ts +11 -0
- package/dist/src/v0_8/styles/icons.d.ts.map +1 -0
- package/dist/src/v0_8/styles/icons.js +60 -0
- package/dist/src/v0_8/styles/icons.js.map +1 -0
- package/dist/src/v0_8/styles/index.d.ts +3 -0
- package/dist/src/v0_8/styles/index.d.ts.map +1 -0
- package/dist/src/v0_8/styles/index.js +35 -0
- package/dist/src/v0_8/styles/index.js.map +1 -0
- package/dist/src/v0_8/styles/layout.d.ts +2 -0
- package/dist/src/v0_8/styles/layout.d.ts.map +1 -0
- package/dist/src/v0_8/styles/layout.js +232 -0
- package/dist/src/v0_8/styles/layout.js.map +1 -0
- package/dist/src/v0_8/styles/opacity.d.ts +2 -0
- package/dist/src/v0_8/styles/opacity.d.ts.map +1 -0
- package/dist/src/v0_8/styles/opacity.js +24 -0
- package/dist/src/v0_8/styles/opacity.js.map +1 -0
- package/dist/src/v0_8/styles/shared.d.ts +2 -0
- package/dist/src/v0_8/styles/shared.d.ts.map +1 -0
- package/dist/src/v0_8/styles/shared.js +17 -0
- package/dist/src/v0_8/styles/shared.js.map +1 -0
- package/dist/src/v0_8/styles/type.d.ts +2 -0
- package/dist/src/v0_8/styles/type.d.ts.map +1 -0
- package/dist/src/v0_8/styles/type.js +156 -0
- package/dist/src/v0_8/styles/type.js.map +1 -0
- package/dist/src/v0_8/styles/utils.d.ts +6 -0
- package/dist/src/v0_8/styles/utils.d.ts.map +1 -0
- package/dist/src/v0_8/styles/utils.js +81 -0
- package/dist/src/v0_8/styles/utils.js.map +1 -0
- package/dist/src/v0_8/types/client-event.d.ts +66 -0
- package/dist/src/v0_8/types/client-event.d.ts.map +1 -0
- package/dist/src/v0_8/types/client-event.js +17 -0
- package/dist/src/v0_8/types/client-event.js.map +1 -0
- package/dist/src/v0_8/types/colors.d.ts +25 -0
- package/dist/src/v0_8/types/colors.d.ts.map +1 -0
- package/dist/src/v0_8/types/colors.js +19 -0
- package/dist/src/v0_8/types/colors.js.map +1 -0
- package/dist/src/v0_8/types/components.d.ts +176 -0
- package/dist/src/v0_8/types/components.d.ts.map +1 -0
- package/dist/src/v0_8/types/components.js +17 -0
- package/dist/src/v0_8/types/components.js.map +1 -0
- package/dist/src/v0_8/types/primitives.d.ts +43 -0
- package/dist/src/v0_8/types/primitives.d.ts.map +1 -0
- package/dist/src/v0_8/types/primitives.js +17 -0
- package/dist/src/v0_8/types/primitives.js.map +1 -0
- package/dist/src/v0_8/types/types.d.ts +411 -0
- package/dist/src/v0_8/types/types.d.ts.map +1 -0
- package/dist/src/v0_8/types/types.js +17 -0
- package/dist/src/v0_8/types/types.js.map +1 -0
- package/dist/src/v0_9/catalog/types.d.ts +27 -0
- package/dist/src/v0_9/catalog/types.d.ts.map +1 -0
- package/dist/src/v0_9/catalog/types.js +11 -0
- package/dist/src/v0_9/catalog/types.js.map +1 -0
- package/dist/src/v0_9/common/events.d.ts +24 -0
- package/dist/src/v0_9/common/events.d.ts.map +1 -0
- package/dist/src/v0_9/common/events.js +29 -0
- package/dist/src/v0_9/common/events.js.map +1 -0
- package/dist/src/v0_9/index.d.ts +11 -0
- package/dist/src/v0_9/index.d.ts.map +1 -0
- package/dist/src/v0_9/index.js +11 -0
- package/dist/src/v0_9/index.js.map +1 -0
- package/dist/src/v0_9/processing/message-processor.d.ts +34 -0
- package/dist/src/v0_9/processing/message-processor.d.ts.map +1 -0
- package/dist/src/v0_9/processing/message-processor.js +128 -0
- package/dist/src/v0_9/processing/message-processor.js.map +1 -0
- package/dist/src/v0_9/processing/message-processor.test.d.ts +2 -0
- package/dist/src/v0_9/processing/message-processor.test.d.ts.map +1 -0
- package/dist/src/v0_9/processing/message-processor.test.js +112 -0
- package/dist/src/v0_9/processing/message-processor.test.js.map +1 -0
- package/dist/src/v0_9/rendering/component-context.d.ts +17 -0
- package/dist/src/v0_9/rendering/component-context.d.ts.map +1 -0
- package/dist/src/v0_9/rendering/component-context.js +21 -0
- package/dist/src/v0_9/rendering/component-context.js.map +1 -0
- package/dist/src/v0_9/rendering/data-context.d.ts +37 -0
- package/dist/src/v0_9/rendering/data-context.d.ts.map +1 -0
- package/dist/src/v0_9/rendering/data-context.js +97 -0
- package/dist/src/v0_9/rendering/data-context.js.map +1 -0
- package/dist/src/v0_9/rendering/data-context.test.d.ts +2 -0
- package/dist/src/v0_9/rendering/data-context.test.d.ts.map +1 -0
- package/dist/src/v0_9/rendering/data-context.test.js +71 -0
- package/dist/src/v0_9/rendering/data-context.test.js.map +1 -0
- package/dist/src/v0_9/schema/common-types.d.ts +608 -0
- package/dist/src/v0_9/schema/common-types.d.ts.map +1 -0
- package/dist/src/v0_9/schema/common-types.js +92 -0
- package/dist/src/v0_9/schema/common-types.js.map +1 -0
- package/dist/src/v0_9/schema/index.d.ts +3 -0
- package/dist/src/v0_9/schema/index.d.ts.map +1 -0
- package/dist/src/v0_9/schema/index.js +3 -0
- package/dist/src/v0_9/schema/index.js.map +1 -0
- package/dist/src/v0_9/schema/server-to-client.d.ts +84 -0
- package/dist/src/v0_9/schema/server-to-client.d.ts.map +1 -0
- package/dist/src/v0_9/schema/server-to-client.js +21 -0
- package/dist/src/v0_9/schema/server-to-client.js.map +1 -0
- package/dist/src/v0_9/state/component-model.d.ts +16 -0
- package/dist/src/v0_9/state/component-model.d.ts.map +1 -0
- package/dist/src/v0_9/state/component-model.js +24 -0
- package/dist/src/v0_9/state/component-model.js.map +1 -0
- package/dist/src/v0_9/state/component-model.test.d.ts +2 -0
- package/dist/src/v0_9/state/component-model.test.d.ts.map +1 -0
- package/dist/src/v0_9/state/component-model.test.js +39 -0
- package/dist/src/v0_9/state/component-model.test.js.map +1 -0
- package/dist/src/v0_9/state/data-model.d.ts +47 -0
- package/dist/src/v0_9/state/data-model.d.ts.map +1 -0
- package/dist/src/v0_9/state/data-model.js +191 -0
- package/dist/src/v0_9/state/data-model.js.map +1 -0
- package/dist/src/v0_9/state/data-model.test.d.ts +2 -0
- package/dist/src/v0_9/state/data-model.test.d.ts.map +1 -0
- package/dist/src/v0_9/state/data-model.test.js +204 -0
- package/dist/src/v0_9/state/data-model.test.js.map +1 -0
- package/dist/src/v0_9/state/surface-components-model.d.ts +19 -0
- package/dist/src/v0_9/state/surface-components-model.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-components-model.js +42 -0
- package/dist/src/v0_9/state/surface-components-model.js.map +1 -0
- package/dist/src/v0_9/state/surface-components-model.test.d.ts +2 -0
- package/dist/src/v0_9/state/surface-components-model.test.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-components-model.test.js +49 -0
- package/dist/src/v0_9/state/surface-components-model.test.js.map +1 -0
- package/dist/src/v0_9/state/surface-group-model.d.ts +25 -0
- package/dist/src/v0_9/state/surface-group-model.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-group-model.js +56 -0
- package/dist/src/v0_9/state/surface-group-model.js.map +1 -0
- package/dist/src/v0_9/state/surface-group-model.test.d.ts +2 -0
- package/dist/src/v0_9/state/surface-group-model.test.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-group-model.test.js +67 -0
- package/dist/src/v0_9/state/surface-group-model.test.js.map +1 -0
- package/dist/src/v0_9/state/surface-model.d.ts +23 -0
- package/dist/src/v0_9/state/surface-model.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-model.js +28 -0
- package/dist/src/v0_9/state/surface-model.js.map +1 -0
- package/dist/src/v0_9/state/surface-model.test.d.ts +2 -0
- package/dist/src/v0_9/state/surface-model.test.d.ts.map +1 -0
- package/dist/src/v0_9/state/surface-model.test.js +39 -0
- package/dist/src/v0_9/state/surface-model.test.js.map +1 -0
- package/dist/src/v0_9/test/test-utils.d.ts +8 -0
- package/dist/src/v0_9/test/test-utils.d.ts.map +1 -0
- package/dist/src/v0_9/test/test-utils.js +18 -0
- package/dist/src/v0_9/test/test-utils.js.map +1 -0
- package/package.json +94 -0
- package/src/v0_8/data/guards.ts +236 -0
- package/src/v0_8/data/model-processor.ts +855 -0
- package/src/v0_8/events/base.ts +24 -0
- package/src/v0_8/events/index.ts +18 -0
- package/src/v0_8/events/validation-event.ts +66 -0
- package/src/v0_8/index.ts +12 -0
- package/src/v0_8/schemas/server_to_client_with_standard_catalog.json +823 -0
- package/src/v0_8/styles/behavior.ts +55 -0
- package/src/v0_8/styles/border.ts +42 -0
- package/src/v0_8/styles/colors.ts +100 -0
- package/src/v0_8/styles/icons.ts +60 -0
- package/src/v0_8/styles/index.ts +37 -0
- package/src/v0_8/styles/layout.ts +235 -0
- package/src/v0_8/styles/opacity.ts +24 -0
- package/src/v0_8/styles/shared.ts +17 -0
- package/src/v0_8/styles/type.ts +156 -0
- package/src/v0_8/styles/utils.ts +104 -0
- package/src/v0_8/types/client-event.ts +80 -0
- package/src/v0_8/types/colors.ts +66 -0
- package/src/v0_8/types/components.ts +213 -0
- package/src/v0_8/types/primitives.ts +60 -0
- package/src/v0_8/types/types.ts +557 -0
- package/src/v0_9/catalog/types.ts +38 -0
- package/src/v0_9/common/events.ts +44 -0
- package/src/v0_9/index.ts +12 -0
- package/src/v0_9/processing/message-processor.test.ts +133 -0
- package/src/v0_9/processing/message-processor.ts +150 -0
- package/src/v0_9/rendering/component-context.ts +36 -0
- package/src/v0_9/rendering/data-context.test.ts +85 -0
- package/src/v0_9/rendering/data-context.ts +110 -0
- package/src/v0_9/schema/common-types.ts +125 -0
- package/src/v0_9/schema/index.ts +2 -0
- package/src/v0_9/schema/server-to-client.ts +23 -0
- package/src/v0_9/state/component-model.test.ts +50 -0
- package/src/v0_9/state/component-model.ts +32 -0
- package/src/v0_9/state/data-model.test.ts +257 -0
- package/src/v0_9/state/data-model.ts +239 -0
- package/src/v0_9/state/surface-components-model.test.ts +59 -0
- package/src/v0_9/state/surface-components-model.ts +48 -0
- package/src/v0_9/state/surface-group-model.test.ts +82 -0
- package/src/v0_9/state/surface-group-model.ts +66 -0
- package/src/v0_9/state/surface-model.test.ts +44 -0
- package/src/v0_9/state/surface-model.ts +39 -0
- package/src/v0_9/test/test-utils.ts +22 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
3
|
+
import { DataModel } from './data-model.js';
|
|
4
|
+
describe('DataModel', () => {
|
|
5
|
+
let model;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
model = new DataModel({
|
|
8
|
+
user: {
|
|
9
|
+
name: 'Alice',
|
|
10
|
+
settings: {
|
|
11
|
+
theme: 'dark'
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
items: ['a', 'b', 'c']
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
// --- Basic Retrieval ---
|
|
18
|
+
it('retrieves root data', () => {
|
|
19
|
+
assert.deepStrictEqual(model.get('/'), { user: { name: 'Alice', settings: { theme: 'dark' } }, items: ['a', 'b', 'c'] });
|
|
20
|
+
});
|
|
21
|
+
it('retrieves nested path', () => {
|
|
22
|
+
assert.strictEqual(model.get('/user/name'), 'Alice');
|
|
23
|
+
assert.strictEqual(model.get('/user/settings/theme'), 'dark');
|
|
24
|
+
});
|
|
25
|
+
it('retrieves array items', () => {
|
|
26
|
+
assert.strictEqual(model.get('/items/0'), 'a');
|
|
27
|
+
assert.strictEqual(model.get('/items/1'), 'b');
|
|
28
|
+
});
|
|
29
|
+
it('returns undefined for non-existent paths', () => {
|
|
30
|
+
assert.strictEqual(model.get('/user/age'), undefined);
|
|
31
|
+
assert.strictEqual(model.get('/unknown/path'), undefined);
|
|
32
|
+
});
|
|
33
|
+
// --- Updates ---
|
|
34
|
+
it('sets value at existing path', () => {
|
|
35
|
+
model.set('/user/name', 'Bob');
|
|
36
|
+
assert.strictEqual(model.get('/user/name'), 'Bob');
|
|
37
|
+
});
|
|
38
|
+
it('sets value at new path', () => {
|
|
39
|
+
model.set('/user/age', 30);
|
|
40
|
+
assert.strictEqual(model.get('/user/age'), 30);
|
|
41
|
+
});
|
|
42
|
+
it('creates intermediate objects', () => {
|
|
43
|
+
model.set('/a/b/c', 'foo');
|
|
44
|
+
assert.strictEqual(model.get('/a/b/c'), 'foo');
|
|
45
|
+
assert.notStrictEqual(model.get('/a/b'), undefined);
|
|
46
|
+
});
|
|
47
|
+
it('removes keys when value is undefined', () => {
|
|
48
|
+
model.set('/user/name', undefined);
|
|
49
|
+
assert.strictEqual(model.get('/user/name'), undefined);
|
|
50
|
+
assert.strictEqual(Object.keys(model.get('/user')).includes('name'), false);
|
|
51
|
+
});
|
|
52
|
+
it('replaces root object on root update', () => {
|
|
53
|
+
model.set('/', { newRoot: true });
|
|
54
|
+
assert.deepStrictEqual(model.get('/'), { newRoot: true });
|
|
55
|
+
});
|
|
56
|
+
// --- Array / List Handling (Flutter Parity) ---
|
|
57
|
+
it('List: set and get', () => {
|
|
58
|
+
model.set('/list/0', 'hello');
|
|
59
|
+
assert.strictEqual(model.get('/list/0'), 'hello');
|
|
60
|
+
assert.ok(Array.isArray(model.get('/list')));
|
|
61
|
+
});
|
|
62
|
+
it('List: append and get', () => {
|
|
63
|
+
model.set('/list/0', 'hello');
|
|
64
|
+
model.set('/list/1', 'world');
|
|
65
|
+
assert.strictEqual(model.get('/list/0'), 'hello');
|
|
66
|
+
assert.strictEqual(model.get('/list/1'), 'world');
|
|
67
|
+
assert.strictEqual(model.get('/list').length, 2);
|
|
68
|
+
});
|
|
69
|
+
it('List: update existing index', () => {
|
|
70
|
+
model.set('/items/1', 'updated');
|
|
71
|
+
assert.strictEqual(model.get('/items/1'), 'updated');
|
|
72
|
+
});
|
|
73
|
+
it('Nested structures are created automatically', () => {
|
|
74
|
+
// Should create nested map and list: { a: { b: [ { c: 123 } ] } }
|
|
75
|
+
model.set('/a/b/0/c', 123);
|
|
76
|
+
assert.strictEqual(model.get('/a/b/0/c'), 123);
|
|
77
|
+
assert.ok(Array.isArray(model.get('/a/b')));
|
|
78
|
+
assert.ok(!Array.isArray(model.get('/a/b/0')));
|
|
79
|
+
// Should create nested maps
|
|
80
|
+
model.set('/x/y/z', 'hello');
|
|
81
|
+
assert.strictEqual(model.get('/x/y/z'), 'hello');
|
|
82
|
+
// Should create nested lists
|
|
83
|
+
model.set('/nestedList/0/0', 'inner');
|
|
84
|
+
assert.strictEqual(model.get('/nestedList/0/0'), 'inner');
|
|
85
|
+
assert.ok(Array.isArray(model.get('/nestedList')));
|
|
86
|
+
assert.ok(Array.isArray(model.get('/nestedList/0')));
|
|
87
|
+
});
|
|
88
|
+
// --- Subscriptions ---
|
|
89
|
+
it('returns a subscription object', () => {
|
|
90
|
+
model.set('/a', 1);
|
|
91
|
+
const sub = model.subscribe('/a', (val) => updatedValue = val);
|
|
92
|
+
assert.strictEqual(sub.value, 1);
|
|
93
|
+
let updatedValue;
|
|
94
|
+
model.set('/a', 2);
|
|
95
|
+
assert.strictEqual(sub.value, 2);
|
|
96
|
+
assert.strictEqual(updatedValue, 2);
|
|
97
|
+
sub.unsubscribe();
|
|
98
|
+
// Verify listener removed
|
|
99
|
+
model.set('/a', 3);
|
|
100
|
+
assert.strictEqual(updatedValue, 2);
|
|
101
|
+
});
|
|
102
|
+
it('notifies subscribers on exact match', () => {
|
|
103
|
+
let called = false;
|
|
104
|
+
const sub = model.subscribe('/user/name', (val) => {
|
|
105
|
+
assert.strictEqual(val, 'Charlie');
|
|
106
|
+
called = true;
|
|
107
|
+
});
|
|
108
|
+
model.set('/user/name', 'Charlie');
|
|
109
|
+
assert.strictEqual(called, true, 'Callback was never called');
|
|
110
|
+
});
|
|
111
|
+
it('notifies ancestor subscribers (Container Semantics)', () => {
|
|
112
|
+
let called = false;
|
|
113
|
+
const sub = model.subscribe('/user', (val) => {
|
|
114
|
+
assert.strictEqual(val.name, 'Dave');
|
|
115
|
+
called = true;
|
|
116
|
+
});
|
|
117
|
+
model.set('/user/name', 'Dave');
|
|
118
|
+
assert.strictEqual(called, true, 'Callback was never called');
|
|
119
|
+
});
|
|
120
|
+
it('notifies descendant subscribers', () => {
|
|
121
|
+
let called = false;
|
|
122
|
+
const sub = model.subscribe('/user/settings/theme', (val) => {
|
|
123
|
+
assert.strictEqual(val, 'light');
|
|
124
|
+
called = true;
|
|
125
|
+
});
|
|
126
|
+
// We update the parent object
|
|
127
|
+
model.set('/user/settings', { theme: 'light' });
|
|
128
|
+
assert.strictEqual(called, true, 'Callback was never called');
|
|
129
|
+
});
|
|
130
|
+
it('notifies root subscriber', () => {
|
|
131
|
+
let called = false;
|
|
132
|
+
const sub = model.subscribe('/', (val) => {
|
|
133
|
+
assert.strictEqual(val.newProp, 'test');
|
|
134
|
+
called = true;
|
|
135
|
+
});
|
|
136
|
+
model.set('/newProp', 'test');
|
|
137
|
+
assert.strictEqual(called, true, 'Callback was never called');
|
|
138
|
+
});
|
|
139
|
+
it('notifies parent when child updates', () => {
|
|
140
|
+
model.set('/parent', { child: 'initial' });
|
|
141
|
+
let parentValue;
|
|
142
|
+
const sub = model.subscribe('/parent', (val) => parentValue = val);
|
|
143
|
+
model.set('/parent/child', 'updated');
|
|
144
|
+
assert.deepStrictEqual(parentValue, { child: 'updated' });
|
|
145
|
+
});
|
|
146
|
+
it('stops notifying after dispose', () => {
|
|
147
|
+
let count = 0;
|
|
148
|
+
const sub = model.subscribe('/', () => count++);
|
|
149
|
+
model.dispose();
|
|
150
|
+
model.set('/foo', 'bar');
|
|
151
|
+
assert.strictEqual(count, 0);
|
|
152
|
+
});
|
|
153
|
+
it('supports multiple subscribers to the same path', () => {
|
|
154
|
+
let callCount1 = 0;
|
|
155
|
+
let callCount2 = 0;
|
|
156
|
+
const sub1 = model.subscribe('/user/name', () => callCount1++);
|
|
157
|
+
const sub2 = model.subscribe('/user/name', () => callCount2++);
|
|
158
|
+
model.set('/user/name', 'Eve');
|
|
159
|
+
assert.strictEqual(callCount1, 1);
|
|
160
|
+
assert.strictEqual(callCount2, 1);
|
|
161
|
+
assert.strictEqual(sub1.value, 'Eve');
|
|
162
|
+
assert.strictEqual(sub2.value, 'Eve');
|
|
163
|
+
});
|
|
164
|
+
it('allows unsubscribing individual listeners', () => {
|
|
165
|
+
let callCount1 = 0;
|
|
166
|
+
let callCount2 = 0;
|
|
167
|
+
const sub1 = model.subscribe('/user/name', () => callCount1++);
|
|
168
|
+
const sub2 = model.subscribe('/user/name', () => callCount2++);
|
|
169
|
+
sub1.unsubscribe();
|
|
170
|
+
model.set('/user/name', 'Frank');
|
|
171
|
+
assert.strictEqual(callCount1, 0); // sub1 was unsubscribed
|
|
172
|
+
assert.strictEqual(callCount2, 1); // sub2 still active
|
|
173
|
+
assert.strictEqual(sub2.value, 'Frank');
|
|
174
|
+
});
|
|
175
|
+
it('handles subscription to non-existent path', () => {
|
|
176
|
+
let val;
|
|
177
|
+
const sub = model.subscribe('/non/existent', (v) => val = v);
|
|
178
|
+
assert.strictEqual(sub.value, undefined);
|
|
179
|
+
model.set('/non/existent', 'exists now');
|
|
180
|
+
assert.strictEqual(sub.value, 'exists now');
|
|
181
|
+
assert.strictEqual(val, 'exists now');
|
|
182
|
+
});
|
|
183
|
+
it('handles updates to undefined', () => {
|
|
184
|
+
model.set('/foo', 'bar');
|
|
185
|
+
let val = 'initial';
|
|
186
|
+
const sub = model.subscribe('/foo', (v) => val = v);
|
|
187
|
+
model.set('/foo', undefined);
|
|
188
|
+
assert.strictEqual(sub.value, undefined);
|
|
189
|
+
assert.strictEqual(val, undefined);
|
|
190
|
+
});
|
|
191
|
+
it('throws when trying to set nested property through a primitive', () => {
|
|
192
|
+
model.set('/user/name', 'not an object');
|
|
193
|
+
assert.strictEqual(model.get('/user/name'), 'not an object');
|
|
194
|
+
assert.throws(() => {
|
|
195
|
+
model.set('/user/name/first', 'Alice');
|
|
196
|
+
}, /Cannot set path/);
|
|
197
|
+
});
|
|
198
|
+
it('throws when using non-numeric segment on an array', () => {
|
|
199
|
+
assert.throws(() => {
|
|
200
|
+
model.set('/items/foo', 'bar');
|
|
201
|
+
}, /Cannot use non-numeric segment/);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
//# sourceMappingURL=data-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-model.test.js","sourceRoot":"","sources":["../../../../src/v0_9/state/data-model.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAQ,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,KAAgB,CAAC;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,GAAG,IAAI,SAAS,CAAC;YACpB,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE;oBACR,KAAK,EAAE,MAAM;iBACd;aACF;YACD,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAE1B,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3H,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAElB,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,iDAAiD;IAEjD,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,kEAAkE;QAClE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE/C,4BAA4B;QAC5B,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAEjD,6BAA6B;QAC7B,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,wBAAwB;IAExB,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAS,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,YAAgC,CAAC;QAGrC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAEpC,GAAG,CAAC,WAAW,EAAE,CAAC;QAClB,0BAA0B;QAC1B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;YAChD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACnC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,GAAQ,EAAE,EAAE;YAChD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1D,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACjC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,GAAQ,EAAE,EAAE;YAC5C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,2BAA2B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3C,IAAI,WAAgB,CAAC;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC;QAEnE,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;QAEhD,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/D,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QAE/B,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QAE/D,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEjC,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;QAC3D,MAAM,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,oBAAoB;QACvD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,IAAI,GAAQ,CAAC;QACb,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAEzC,KAAK,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzB,IAAI,GAAG,GAAQ,SAAS,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAEpD,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,eAAe,CAAC,CAAC;QAE7D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjB,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YACjB,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC,EAAE,gCAAgC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ComponentModel } from './component-model.js';
|
|
2
|
+
import { EventSource } from '../common/events.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages the collection of components for a specific surface.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SurfaceComponentsModel {
|
|
7
|
+
private components;
|
|
8
|
+
private readonly _onCreated;
|
|
9
|
+
private readonly _onDeleted;
|
|
10
|
+
/** Fires when a new component is added to the model. */
|
|
11
|
+
readonly onCreated: EventSource<ComponentModel>;
|
|
12
|
+
/** Fires when a component is removed, providing the ID of the deleted component. */
|
|
13
|
+
readonly onDeleted: EventSource<string>;
|
|
14
|
+
get(id: string): ComponentModel | undefined;
|
|
15
|
+
addComponent(component: ComponentModel): void;
|
|
16
|
+
removeComponent(id: string): void;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=surface-components-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-components-model.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-components-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAgB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,UAAU,CAA0C;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IAEzD,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,cAAc,CAAC,CAAmB;IAClE,oFAAoF;IACpF,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAmB;IAE1D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAS7C,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IASjC,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EventEmitter } from '../common/events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages the collection of components for a specific surface.
|
|
4
|
+
*/
|
|
5
|
+
export class SurfaceComponentsModel {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.components = new Map();
|
|
8
|
+
this._onCreated = new EventEmitter();
|
|
9
|
+
this._onDeleted = new EventEmitter();
|
|
10
|
+
/** Fires when a new component is added to the model. */
|
|
11
|
+
this.onCreated = this._onCreated;
|
|
12
|
+
/** Fires when a component is removed, providing the ID of the deleted component. */
|
|
13
|
+
this.onDeleted = this._onDeleted;
|
|
14
|
+
}
|
|
15
|
+
get(id) {
|
|
16
|
+
return this.components.get(id);
|
|
17
|
+
}
|
|
18
|
+
addComponent(component) {
|
|
19
|
+
if (this.components.has(component.id)) {
|
|
20
|
+
throw new Error(`Component with id '${component.id}' already exists.`);
|
|
21
|
+
}
|
|
22
|
+
this.components.set(component.id, component);
|
|
23
|
+
this._onCreated.emit(component);
|
|
24
|
+
}
|
|
25
|
+
removeComponent(id) {
|
|
26
|
+
const component = this.components.get(id);
|
|
27
|
+
if (component) {
|
|
28
|
+
this.components.delete(id);
|
|
29
|
+
component.dispose();
|
|
30
|
+
this._onDeleted.emit(id);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
dispose() {
|
|
34
|
+
for (const component of this.components.values()) {
|
|
35
|
+
component.dispose();
|
|
36
|
+
}
|
|
37
|
+
this.components.clear();
|
|
38
|
+
this._onCreated.dispose();
|
|
39
|
+
this._onDeleted.dispose();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=surface-components-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-components-model.js","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-components-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAEhE;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAAnC;QACU,eAAU,GAAgC,IAAI,GAAG,EAAE,CAAC;QAE3C,eAAU,GAAG,IAAI,YAAY,EAAkB,CAAC;QAChD,eAAU,GAAG,IAAI,YAAY,EAAU,CAAC;QAEzD,wDAAwD;QAC/C,cAAS,GAAgC,IAAI,CAAC,UAAU,CAAC;QAClE,oFAAoF;QAC3E,cAAS,GAAwB,IAAI,CAAC,UAAU,CAAC;IAgC5D,CAAC;IA9BC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,SAAyB;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,eAAe,CAAC,EAAU;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3B,SAAS,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-components-model.test.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-components-model.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
3
|
+
import { SurfaceComponentsModel } from './surface-components-model.js';
|
|
4
|
+
import { ComponentModel } from './component-model.js';
|
|
5
|
+
describe('SurfaceComponentsModel', () => {
|
|
6
|
+
let model;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
model = new SurfaceComponentsModel();
|
|
9
|
+
});
|
|
10
|
+
it('starts empty', () => {
|
|
11
|
+
assert.strictEqual(model.get('any'), undefined);
|
|
12
|
+
});
|
|
13
|
+
it('adds a new component', () => {
|
|
14
|
+
const c1 = new ComponentModel('c1', 'Button', { label: 'Click' });
|
|
15
|
+
model.addComponent(c1);
|
|
16
|
+
const retrieved = model.get('c1');
|
|
17
|
+
assert.ok(retrieved);
|
|
18
|
+
assert.strictEqual(retrieved?.id, 'c1');
|
|
19
|
+
assert.strictEqual(retrieved?.type, 'Button');
|
|
20
|
+
assert.strictEqual(retrieved?.properties.label, 'Click');
|
|
21
|
+
});
|
|
22
|
+
it('updates an existing component', () => {
|
|
23
|
+
const c1 = new ComponentModel('c1', 'Button', { label: 'Initial' });
|
|
24
|
+
model.addComponent(c1);
|
|
25
|
+
// Track update on component itself
|
|
26
|
+
let updateCount = 0;
|
|
27
|
+
c1.onUpdated.subscribe(() => { updateCount++; });
|
|
28
|
+
c1.properties = { label: 'Updated' };
|
|
29
|
+
assert.strictEqual(c1.properties.label, 'Updated');
|
|
30
|
+
assert.strictEqual(updateCount, 1);
|
|
31
|
+
});
|
|
32
|
+
it('notifies on component creation', () => {
|
|
33
|
+
let createdComponent;
|
|
34
|
+
model.onCreated.subscribe((c) => {
|
|
35
|
+
createdComponent = c;
|
|
36
|
+
});
|
|
37
|
+
model.addComponent(new ComponentModel('c1', 'Button', {}));
|
|
38
|
+
assert.ok(createdComponent);
|
|
39
|
+
assert.strictEqual(createdComponent?.id, 'c1');
|
|
40
|
+
});
|
|
41
|
+
it('throws when adding duplicate component', () => {
|
|
42
|
+
const c1 = new ComponentModel('c1', 'Button', {});
|
|
43
|
+
model.addComponent(c1);
|
|
44
|
+
assert.throws(() => {
|
|
45
|
+
model.addComponent(new ComponentModel('c1', 'Button', {}));
|
|
46
|
+
}, /already exists/);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=surface-components-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-components-model.test.js","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-components-model.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SurfaceModel } from './surface-model.js';
|
|
2
|
+
import { ComponentApi } from '../catalog/types.js';
|
|
3
|
+
import { EventSource } from '../common/events.js';
|
|
4
|
+
/**
|
|
5
|
+
* The root state model for the A2UI system.
|
|
6
|
+
* Manages the collection of active surfaces.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SurfaceGroupModel<T extends ComponentApi> {
|
|
9
|
+
private surfaces;
|
|
10
|
+
private surfaceUnsubscribers;
|
|
11
|
+
private readonly _onSurfaceCreated;
|
|
12
|
+
private readonly _onSurfaceDeleted;
|
|
13
|
+
private readonly _onAction;
|
|
14
|
+
/** Fires when a new surface is added. */
|
|
15
|
+
readonly onSurfaceCreated: EventSource<SurfaceModel<T>>;
|
|
16
|
+
/** Fires when a surface is removed. */
|
|
17
|
+
readonly onSurfaceDeleted: EventSource<string>;
|
|
18
|
+
/** Fires when an action is dispatched from ANY surface in the group. */
|
|
19
|
+
readonly onAction: EventSource<any>;
|
|
20
|
+
addSurface(surface: SurfaceModel<T>): void;
|
|
21
|
+
deleteSurface(id: string): void;
|
|
22
|
+
getSurface(id: string): SurfaceModel<T> | undefined;
|
|
23
|
+
dispose(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=surface-group-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-group-model.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-group-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAgB,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAE9E;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,YAAY;IACnD,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,oBAAoB,CAAwC;IAEpE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD,yCAAyC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAA0B;IACjF,uCAAuC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAA0B;IACxE,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAkB;IAErD,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAe1C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAe/B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAInD,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EventEmitter } from '../common/events.js';
|
|
2
|
+
/**
|
|
3
|
+
* The root state model for the A2UI system.
|
|
4
|
+
* Manages the collection of active surfaces.
|
|
5
|
+
*/
|
|
6
|
+
export class SurfaceGroupModel {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.surfaces = new Map();
|
|
9
|
+
this.surfaceUnsubscribers = new Map();
|
|
10
|
+
this._onSurfaceCreated = new EventEmitter();
|
|
11
|
+
this._onSurfaceDeleted = new EventEmitter();
|
|
12
|
+
this._onAction = new EventEmitter();
|
|
13
|
+
/** Fires when a new surface is added. */
|
|
14
|
+
this.onSurfaceCreated = this._onSurfaceCreated;
|
|
15
|
+
/** Fires when a surface is removed. */
|
|
16
|
+
this.onSurfaceDeleted = this._onSurfaceDeleted;
|
|
17
|
+
/** Fires when an action is dispatched from ANY surface in the group. */
|
|
18
|
+
this.onAction = this._onAction;
|
|
19
|
+
}
|
|
20
|
+
addSurface(surface) {
|
|
21
|
+
if (this.surfaces.has(surface.id)) {
|
|
22
|
+
console.warn(`Surface ${surface.id} already exists. Ignoring.`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this.surfaces.set(surface.id, surface);
|
|
26
|
+
// Subscribe to surface actions and propagate
|
|
27
|
+
const sub = surface.onAction.subscribe((action) => this._onAction.emit(action));
|
|
28
|
+
this.surfaceUnsubscribers.set(surface.id, sub);
|
|
29
|
+
this._onSurfaceCreated.emit(surface);
|
|
30
|
+
}
|
|
31
|
+
deleteSurface(id) {
|
|
32
|
+
const surface = this.surfaces.get(id);
|
|
33
|
+
if (surface) {
|
|
34
|
+
const sub = this.surfaceUnsubscribers.get(id);
|
|
35
|
+
if (sub) {
|
|
36
|
+
sub.unsubscribe();
|
|
37
|
+
this.surfaceUnsubscribers.delete(id);
|
|
38
|
+
}
|
|
39
|
+
this.surfaces.delete(id);
|
|
40
|
+
surface.dispose();
|
|
41
|
+
this._onSurfaceDeleted.emit(id);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
getSurface(id) {
|
|
45
|
+
return this.surfaces.get(id);
|
|
46
|
+
}
|
|
47
|
+
dispose() {
|
|
48
|
+
for (const id of Array.from(this.surfaces.keys())) {
|
|
49
|
+
this.deleteSurface(id);
|
|
50
|
+
}
|
|
51
|
+
this._onSurfaceCreated.dispose();
|
|
52
|
+
this._onSurfaceDeleted.dispose();
|
|
53
|
+
this._onAction.dispose();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=surface-group-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-group-model.js","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-group-model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAA6B,MAAM,qBAAqB,CAAC;AAE9E;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACU,aAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;QACnD,yBAAoB,GAA8B,IAAI,GAAG,EAAE,CAAC;QAEnD,sBAAiB,GAAG,IAAI,YAAY,EAAmB,CAAC;QACxD,sBAAiB,GAAG,IAAI,YAAY,EAAU,CAAC;QAC/C,cAAS,GAAG,IAAI,YAAY,EAAO,CAAC;QAErD,yCAAyC;QAChC,qBAAgB,GAAiC,IAAI,CAAC,iBAAiB,CAAC;QACjF,uCAAuC;QAC9B,qBAAgB,GAAwB,IAAI,CAAC,iBAAiB,CAAC;QACxE,wEAAwE;QAC/D,aAAQ,GAAqB,IAAI,CAAC,SAAS,CAAC;IA4CvD,CAAC;IA1CC,UAAU,CAAC,OAAwB;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEvC,6CAA6C;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,WAAW,EAAE,CAAC;gBAClB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACL,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-group-model.test.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-group-model.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { describe, it, beforeEach } from 'node:test';
|
|
3
|
+
import { SurfaceGroupModel } from './surface-group-model.js';
|
|
4
|
+
import { Catalog } from '../catalog/types.js';
|
|
5
|
+
import { SurfaceModel } from './surface-model.js';
|
|
6
|
+
describe('SurfaceGroupModel', () => {
|
|
7
|
+
let model;
|
|
8
|
+
let catalog;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
model = new SurfaceGroupModel();
|
|
11
|
+
catalog = new Catalog('test-catalog', []);
|
|
12
|
+
});
|
|
13
|
+
it('adds surface', () => {
|
|
14
|
+
const surface = new SurfaceModel('s1', catalog, {});
|
|
15
|
+
model.addSurface(surface);
|
|
16
|
+
assert.ok(model.getSurface('s1'));
|
|
17
|
+
assert.strictEqual(model.getSurface('s1'), surface);
|
|
18
|
+
});
|
|
19
|
+
it('ignores duplicate surface addition', () => {
|
|
20
|
+
const s1 = new SurfaceModel('s1', catalog, {});
|
|
21
|
+
const s2 = new SurfaceModel('s1', catalog, {}); // Same ID
|
|
22
|
+
model.addSurface(s1);
|
|
23
|
+
model.addSurface(s2);
|
|
24
|
+
assert.strictEqual(model.getSurface('s1'), s1); // Should still be the first one
|
|
25
|
+
});
|
|
26
|
+
it('deletes surface', () => {
|
|
27
|
+
const surface = new SurfaceModel('s1', catalog, {});
|
|
28
|
+
model.addSurface(surface);
|
|
29
|
+
assert.ok(model.getSurface('s1'));
|
|
30
|
+
model.deleteSurface('s1');
|
|
31
|
+
assert.strictEqual(model.getSurface('s1'), undefined);
|
|
32
|
+
});
|
|
33
|
+
it('notifies lifecycle listeners', () => {
|
|
34
|
+
let created;
|
|
35
|
+
let deletedId;
|
|
36
|
+
model.onSurfaceCreated.subscribe((s) => { created = s; });
|
|
37
|
+
model.onSurfaceDeleted.subscribe((id) => { deletedId = id; });
|
|
38
|
+
const surface = new SurfaceModel('s1', catalog, {});
|
|
39
|
+
model.addSurface(surface);
|
|
40
|
+
assert.ok(created);
|
|
41
|
+
assert.strictEqual(created?.id, 's1');
|
|
42
|
+
model.deleteSurface('s1');
|
|
43
|
+
assert.strictEqual(deletedId, 's1');
|
|
44
|
+
});
|
|
45
|
+
it('propagates actions from surfaces', async () => {
|
|
46
|
+
let receivedAction;
|
|
47
|
+
model.onAction.subscribe((action) => {
|
|
48
|
+
receivedAction = action;
|
|
49
|
+
});
|
|
50
|
+
const surface = new SurfaceModel('s1', catalog, {});
|
|
51
|
+
model.addSurface(surface);
|
|
52
|
+
await surface.dispatchAction({ type: 'test' });
|
|
53
|
+
assert.deepStrictEqual(receivedAction, { type: 'test' });
|
|
54
|
+
});
|
|
55
|
+
it('stops propagating actions after deletion', async () => {
|
|
56
|
+
let callCount = 0;
|
|
57
|
+
model.onAction.subscribe(() => {
|
|
58
|
+
callCount++;
|
|
59
|
+
});
|
|
60
|
+
const surface = new SurfaceModel('s1', catalog, {});
|
|
61
|
+
model.addSurface(surface);
|
|
62
|
+
model.deleteSurface('s1');
|
|
63
|
+
await surface.dispatchAction({ type: 'test' });
|
|
64
|
+
assert.strictEqual(callCount, 0);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=surface-group-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-group-model.test.js","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-group-model.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DataModel } from './data-model.js';
|
|
2
|
+
import { Catalog, ComponentApi } from '../catalog/types.js';
|
|
3
|
+
import { SurfaceComponentsModel } from './surface-components-model.js';
|
|
4
|
+
import { EventSource } from '../common/events.js';
|
|
5
|
+
export type ActionListener = (action: any) => void | Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* The state model for a single surface.
|
|
8
|
+
* @template T The concrete type of the ComponentApi.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SurfaceModel<T extends ComponentApi> {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly catalog: Catalog<T>;
|
|
13
|
+
readonly theme: any;
|
|
14
|
+
readonly dataModel: DataModel;
|
|
15
|
+
readonly componentsModel: SurfaceComponentsModel;
|
|
16
|
+
private readonly _onAction;
|
|
17
|
+
/** Fires whenever an action is dispatched from this surface. */
|
|
18
|
+
readonly onAction: EventSource<any>;
|
|
19
|
+
constructor(id: string, catalog: Catalog<T>, theme?: any);
|
|
20
|
+
dispatchAction(action: any): Promise<void>;
|
|
21
|
+
dispose(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=surface-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-model.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAgB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnE;;;GAGG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,YAAY;IAU5C,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,GAAG;IAXrB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IAEjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IAErD,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAkB;gBAG1C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,KAAK,GAAE,GAAQ;IAMpB,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DataModel } from './data-model.js';
|
|
2
|
+
import { SurfaceComponentsModel } from './surface-components-model.js';
|
|
3
|
+
import { EventEmitter } from '../common/events.js';
|
|
4
|
+
/**
|
|
5
|
+
* The state model for a single surface.
|
|
6
|
+
* @template T The concrete type of the ComponentApi.
|
|
7
|
+
*/
|
|
8
|
+
export class SurfaceModel {
|
|
9
|
+
constructor(id, catalog, theme = {}) {
|
|
10
|
+
this.id = id;
|
|
11
|
+
this.catalog = catalog;
|
|
12
|
+
this.theme = theme;
|
|
13
|
+
this._onAction = new EventEmitter();
|
|
14
|
+
/** Fires whenever an action is dispatched from this surface. */
|
|
15
|
+
this.onAction = this._onAction;
|
|
16
|
+
this.dataModel = new DataModel({});
|
|
17
|
+
this.componentsModel = new SurfaceComponentsModel();
|
|
18
|
+
}
|
|
19
|
+
async dispatchAction(action) {
|
|
20
|
+
await this._onAction.emit(action);
|
|
21
|
+
}
|
|
22
|
+
dispose() {
|
|
23
|
+
this.dataModel.dispose();
|
|
24
|
+
this.componentsModel.dispose();
|
|
25
|
+
this._onAction.dispose();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=surface-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-model.js","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAIhE;;;GAGG;AACH,MAAM,OAAO,YAAY;IASvB,YACW,EAAU,EACV,OAAmB,EACnB,QAAa,EAAE;QAFf,OAAE,GAAF,EAAE,CAAQ;QACV,YAAO,GAAP,OAAO,CAAY;QACnB,UAAK,GAAL,KAAK,CAAU;QART,cAAS,GAAG,IAAI,YAAY,EAAO,CAAC;QAErD,gEAAgE;QACvD,aAAQ,GAAqB,IAAI,CAAC,SAAS,CAAC;QAOnD,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,IAAI,sBAAsB,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAW;QAC9B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-model.test.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/state/surface-model.test.ts"],"names":[],"mappings":""}
|