@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.
Files changed (225) hide show
  1. package/README.md +13 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/src/v0_8/data/guards.d.ts +24 -0
  4. package/dist/src/v0_8/data/guards.d.ts.map +1 -0
  5. package/dist/src/v0_8/data/guards.js +153 -0
  6. package/dist/src/v0_8/data/guards.js.map +1 -0
  7. package/dist/src/v0_8/data/model-processor.d.ts +79 -0
  8. package/dist/src/v0_8/data/model-processor.d.ts.map +1 -0
  9. package/dist/src/v0_8/data/model-processor.js +627 -0
  10. package/dist/src/v0_8/data/model-processor.js.map +1 -0
  11. package/dist/src/v0_8/events/base.d.ts +24 -0
  12. package/dist/src/v0_8/events/base.d.ts.map +1 -0
  13. package/dist/src/v0_8/events/base.js +17 -0
  14. package/dist/src/v0_8/events/base.js.map +1 -0
  15. package/dist/src/v0_8/events/index.d.ts +18 -0
  16. package/dist/src/v0_8/events/index.d.ts.map +1 -0
  17. package/dist/src/v0_8/events/index.js +18 -0
  18. package/dist/src/v0_8/events/index.js.map +1 -0
  19. package/dist/src/v0_8/events/validation-event.d.ts +46 -0
  20. package/dist/src/v0_8/events/validation-event.d.ts.map +1 -0
  21. package/dist/src/v0_8/events/validation-event.js +33 -0
  22. package/dist/src/v0_8/events/validation-event.js.map +1 -0
  23. package/dist/src/v0_8/index.d.ts +743 -0
  24. package/dist/src/v0_8/index.d.ts.map +1 -0
  25. package/dist/src/v0_8/index.js +12 -0
  26. package/dist/src/v0_8/index.js.map +1 -0
  27. package/dist/src/v0_8/schemas/a2ui_client_capabilities_schema.json +23 -0
  28. package/dist/src/v0_8/schemas/catalog_description_schema.json +34 -0
  29. package/dist/src/v0_8/schemas/client_to_server.json +53 -0
  30. package/dist/src/v0_8/schemas/server_to_client.json +148 -0
  31. package/dist/src/v0_8/schemas/server_to_client_with_standard_catalog.json +823 -0
  32. package/dist/src/v0_8/schemas/standard_catalog_definition.json +772 -0
  33. package/dist/src/v0_8/styles/behavior.d.ts +2 -0
  34. package/dist/src/v0_8/styles/behavior.d.ts.map +1 -0
  35. package/dist/src/v0_8/styles/behavior.js +54 -0
  36. package/dist/src/v0_8/styles/behavior.js.map +1 -0
  37. package/dist/src/v0_8/styles/border.d.ts +2 -0
  38. package/dist/src/v0_8/styles/border.d.ts.map +1 -0
  39. package/dist/src/v0_8/styles/border.js +41 -0
  40. package/dist/src/v0_8/styles/border.js.map +1 -0
  41. package/dist/src/v0_8/styles/colors.d.ts +2 -0
  42. package/dist/src/v0_8/styles/colors.d.ts.map +1 -0
  43. package/dist/src/v0_8/styles/colors.js +80 -0
  44. package/dist/src/v0_8/styles/colors.js.map +1 -0
  45. package/dist/src/v0_8/styles/icons.d.ts +11 -0
  46. package/dist/src/v0_8/styles/icons.d.ts.map +1 -0
  47. package/dist/src/v0_8/styles/icons.js +60 -0
  48. package/dist/src/v0_8/styles/icons.js.map +1 -0
  49. package/dist/src/v0_8/styles/index.d.ts +3 -0
  50. package/dist/src/v0_8/styles/index.d.ts.map +1 -0
  51. package/dist/src/v0_8/styles/index.js +35 -0
  52. package/dist/src/v0_8/styles/index.js.map +1 -0
  53. package/dist/src/v0_8/styles/layout.d.ts +2 -0
  54. package/dist/src/v0_8/styles/layout.d.ts.map +1 -0
  55. package/dist/src/v0_8/styles/layout.js +232 -0
  56. package/dist/src/v0_8/styles/layout.js.map +1 -0
  57. package/dist/src/v0_8/styles/opacity.d.ts +2 -0
  58. package/dist/src/v0_8/styles/opacity.d.ts.map +1 -0
  59. package/dist/src/v0_8/styles/opacity.js +24 -0
  60. package/dist/src/v0_8/styles/opacity.js.map +1 -0
  61. package/dist/src/v0_8/styles/shared.d.ts +2 -0
  62. package/dist/src/v0_8/styles/shared.d.ts.map +1 -0
  63. package/dist/src/v0_8/styles/shared.js +17 -0
  64. package/dist/src/v0_8/styles/shared.js.map +1 -0
  65. package/dist/src/v0_8/styles/type.d.ts +2 -0
  66. package/dist/src/v0_8/styles/type.d.ts.map +1 -0
  67. package/dist/src/v0_8/styles/type.js +156 -0
  68. package/dist/src/v0_8/styles/type.js.map +1 -0
  69. package/dist/src/v0_8/styles/utils.d.ts +6 -0
  70. package/dist/src/v0_8/styles/utils.d.ts.map +1 -0
  71. package/dist/src/v0_8/styles/utils.js +81 -0
  72. package/dist/src/v0_8/styles/utils.js.map +1 -0
  73. package/dist/src/v0_8/types/client-event.d.ts +66 -0
  74. package/dist/src/v0_8/types/client-event.d.ts.map +1 -0
  75. package/dist/src/v0_8/types/client-event.js +17 -0
  76. package/dist/src/v0_8/types/client-event.js.map +1 -0
  77. package/dist/src/v0_8/types/colors.d.ts +25 -0
  78. package/dist/src/v0_8/types/colors.d.ts.map +1 -0
  79. package/dist/src/v0_8/types/colors.js +19 -0
  80. package/dist/src/v0_8/types/colors.js.map +1 -0
  81. package/dist/src/v0_8/types/components.d.ts +176 -0
  82. package/dist/src/v0_8/types/components.d.ts.map +1 -0
  83. package/dist/src/v0_8/types/components.js +17 -0
  84. package/dist/src/v0_8/types/components.js.map +1 -0
  85. package/dist/src/v0_8/types/primitives.d.ts +43 -0
  86. package/dist/src/v0_8/types/primitives.d.ts.map +1 -0
  87. package/dist/src/v0_8/types/primitives.js +17 -0
  88. package/dist/src/v0_8/types/primitives.js.map +1 -0
  89. package/dist/src/v0_8/types/types.d.ts +411 -0
  90. package/dist/src/v0_8/types/types.d.ts.map +1 -0
  91. package/dist/src/v0_8/types/types.js +17 -0
  92. package/dist/src/v0_8/types/types.js.map +1 -0
  93. package/dist/src/v0_9/catalog/types.d.ts +27 -0
  94. package/dist/src/v0_9/catalog/types.d.ts.map +1 -0
  95. package/dist/src/v0_9/catalog/types.js +11 -0
  96. package/dist/src/v0_9/catalog/types.js.map +1 -0
  97. package/dist/src/v0_9/common/events.d.ts +24 -0
  98. package/dist/src/v0_9/common/events.d.ts.map +1 -0
  99. package/dist/src/v0_9/common/events.js +29 -0
  100. package/dist/src/v0_9/common/events.js.map +1 -0
  101. package/dist/src/v0_9/index.d.ts +11 -0
  102. package/dist/src/v0_9/index.d.ts.map +1 -0
  103. package/dist/src/v0_9/index.js +11 -0
  104. package/dist/src/v0_9/index.js.map +1 -0
  105. package/dist/src/v0_9/processing/message-processor.d.ts +34 -0
  106. package/dist/src/v0_9/processing/message-processor.d.ts.map +1 -0
  107. package/dist/src/v0_9/processing/message-processor.js +128 -0
  108. package/dist/src/v0_9/processing/message-processor.js.map +1 -0
  109. package/dist/src/v0_9/processing/message-processor.test.d.ts +2 -0
  110. package/dist/src/v0_9/processing/message-processor.test.d.ts.map +1 -0
  111. package/dist/src/v0_9/processing/message-processor.test.js +112 -0
  112. package/dist/src/v0_9/processing/message-processor.test.js.map +1 -0
  113. package/dist/src/v0_9/rendering/component-context.d.ts +17 -0
  114. package/dist/src/v0_9/rendering/component-context.d.ts.map +1 -0
  115. package/dist/src/v0_9/rendering/component-context.js +21 -0
  116. package/dist/src/v0_9/rendering/component-context.js.map +1 -0
  117. package/dist/src/v0_9/rendering/data-context.d.ts +37 -0
  118. package/dist/src/v0_9/rendering/data-context.d.ts.map +1 -0
  119. package/dist/src/v0_9/rendering/data-context.js +97 -0
  120. package/dist/src/v0_9/rendering/data-context.js.map +1 -0
  121. package/dist/src/v0_9/rendering/data-context.test.d.ts +2 -0
  122. package/dist/src/v0_9/rendering/data-context.test.d.ts.map +1 -0
  123. package/dist/src/v0_9/rendering/data-context.test.js +71 -0
  124. package/dist/src/v0_9/rendering/data-context.test.js.map +1 -0
  125. package/dist/src/v0_9/schema/common-types.d.ts +608 -0
  126. package/dist/src/v0_9/schema/common-types.d.ts.map +1 -0
  127. package/dist/src/v0_9/schema/common-types.js +92 -0
  128. package/dist/src/v0_9/schema/common-types.js.map +1 -0
  129. package/dist/src/v0_9/schema/index.d.ts +3 -0
  130. package/dist/src/v0_9/schema/index.d.ts.map +1 -0
  131. package/dist/src/v0_9/schema/index.js +3 -0
  132. package/dist/src/v0_9/schema/index.js.map +1 -0
  133. package/dist/src/v0_9/schema/server-to-client.d.ts +84 -0
  134. package/dist/src/v0_9/schema/server-to-client.d.ts.map +1 -0
  135. package/dist/src/v0_9/schema/server-to-client.js +21 -0
  136. package/dist/src/v0_9/schema/server-to-client.js.map +1 -0
  137. package/dist/src/v0_9/state/component-model.d.ts +16 -0
  138. package/dist/src/v0_9/state/component-model.d.ts.map +1 -0
  139. package/dist/src/v0_9/state/component-model.js +24 -0
  140. package/dist/src/v0_9/state/component-model.js.map +1 -0
  141. package/dist/src/v0_9/state/component-model.test.d.ts +2 -0
  142. package/dist/src/v0_9/state/component-model.test.d.ts.map +1 -0
  143. package/dist/src/v0_9/state/component-model.test.js +39 -0
  144. package/dist/src/v0_9/state/component-model.test.js.map +1 -0
  145. package/dist/src/v0_9/state/data-model.d.ts +47 -0
  146. package/dist/src/v0_9/state/data-model.d.ts.map +1 -0
  147. package/dist/src/v0_9/state/data-model.js +191 -0
  148. package/dist/src/v0_9/state/data-model.js.map +1 -0
  149. package/dist/src/v0_9/state/data-model.test.d.ts +2 -0
  150. package/dist/src/v0_9/state/data-model.test.d.ts.map +1 -0
  151. package/dist/src/v0_9/state/data-model.test.js +204 -0
  152. package/dist/src/v0_9/state/data-model.test.js.map +1 -0
  153. package/dist/src/v0_9/state/surface-components-model.d.ts +19 -0
  154. package/dist/src/v0_9/state/surface-components-model.d.ts.map +1 -0
  155. package/dist/src/v0_9/state/surface-components-model.js +42 -0
  156. package/dist/src/v0_9/state/surface-components-model.js.map +1 -0
  157. package/dist/src/v0_9/state/surface-components-model.test.d.ts +2 -0
  158. package/dist/src/v0_9/state/surface-components-model.test.d.ts.map +1 -0
  159. package/dist/src/v0_9/state/surface-components-model.test.js +49 -0
  160. package/dist/src/v0_9/state/surface-components-model.test.js.map +1 -0
  161. package/dist/src/v0_9/state/surface-group-model.d.ts +25 -0
  162. package/dist/src/v0_9/state/surface-group-model.d.ts.map +1 -0
  163. package/dist/src/v0_9/state/surface-group-model.js +56 -0
  164. package/dist/src/v0_9/state/surface-group-model.js.map +1 -0
  165. package/dist/src/v0_9/state/surface-group-model.test.d.ts +2 -0
  166. package/dist/src/v0_9/state/surface-group-model.test.d.ts.map +1 -0
  167. package/dist/src/v0_9/state/surface-group-model.test.js +67 -0
  168. package/dist/src/v0_9/state/surface-group-model.test.js.map +1 -0
  169. package/dist/src/v0_9/state/surface-model.d.ts +23 -0
  170. package/dist/src/v0_9/state/surface-model.d.ts.map +1 -0
  171. package/dist/src/v0_9/state/surface-model.js +28 -0
  172. package/dist/src/v0_9/state/surface-model.js.map +1 -0
  173. package/dist/src/v0_9/state/surface-model.test.d.ts +2 -0
  174. package/dist/src/v0_9/state/surface-model.test.d.ts.map +1 -0
  175. package/dist/src/v0_9/state/surface-model.test.js +39 -0
  176. package/dist/src/v0_9/state/surface-model.test.js.map +1 -0
  177. package/dist/src/v0_9/test/test-utils.d.ts +8 -0
  178. package/dist/src/v0_9/test/test-utils.d.ts.map +1 -0
  179. package/dist/src/v0_9/test/test-utils.js +18 -0
  180. package/dist/src/v0_9/test/test-utils.js.map +1 -0
  181. package/package.json +94 -0
  182. package/src/v0_8/data/guards.ts +236 -0
  183. package/src/v0_8/data/model-processor.ts +855 -0
  184. package/src/v0_8/events/base.ts +24 -0
  185. package/src/v0_8/events/index.ts +18 -0
  186. package/src/v0_8/events/validation-event.ts +66 -0
  187. package/src/v0_8/index.ts +12 -0
  188. package/src/v0_8/schemas/server_to_client_with_standard_catalog.json +823 -0
  189. package/src/v0_8/styles/behavior.ts +55 -0
  190. package/src/v0_8/styles/border.ts +42 -0
  191. package/src/v0_8/styles/colors.ts +100 -0
  192. package/src/v0_8/styles/icons.ts +60 -0
  193. package/src/v0_8/styles/index.ts +37 -0
  194. package/src/v0_8/styles/layout.ts +235 -0
  195. package/src/v0_8/styles/opacity.ts +24 -0
  196. package/src/v0_8/styles/shared.ts +17 -0
  197. package/src/v0_8/styles/type.ts +156 -0
  198. package/src/v0_8/styles/utils.ts +104 -0
  199. package/src/v0_8/types/client-event.ts +80 -0
  200. package/src/v0_8/types/colors.ts +66 -0
  201. package/src/v0_8/types/components.ts +213 -0
  202. package/src/v0_8/types/primitives.ts +60 -0
  203. package/src/v0_8/types/types.ts +557 -0
  204. package/src/v0_9/catalog/types.ts +38 -0
  205. package/src/v0_9/common/events.ts +44 -0
  206. package/src/v0_9/index.ts +12 -0
  207. package/src/v0_9/processing/message-processor.test.ts +133 -0
  208. package/src/v0_9/processing/message-processor.ts +150 -0
  209. package/src/v0_9/rendering/component-context.ts +36 -0
  210. package/src/v0_9/rendering/data-context.test.ts +85 -0
  211. package/src/v0_9/rendering/data-context.ts +110 -0
  212. package/src/v0_9/schema/common-types.ts +125 -0
  213. package/src/v0_9/schema/index.ts +2 -0
  214. package/src/v0_9/schema/server-to-client.ts +23 -0
  215. package/src/v0_9/state/component-model.test.ts +50 -0
  216. package/src/v0_9/state/component-model.ts +32 -0
  217. package/src/v0_9/state/data-model.test.ts +257 -0
  218. package/src/v0_9/state/data-model.ts +239 -0
  219. package/src/v0_9/state/surface-components-model.test.ts +59 -0
  220. package/src/v0_9/state/surface-components-model.ts +48 -0
  221. package/src/v0_9/state/surface-group-model.test.ts +82 -0
  222. package/src/v0_9/state/surface-group-model.ts +66 -0
  223. package/src/v0_9/state/surface-model.test.ts +44 -0
  224. package/src/v0_9/state/surface-model.ts +39 -0
  225. package/src/v0_9/test/test-utils.ts +22 -0
@@ -0,0 +1,128 @@
1
+ import { SurfaceModel } from '../state/surface-model.js';
2
+ import { SurfaceGroupModel } from '../state/surface-group-model.js';
3
+ import { ComponentModel } from '../state/component-model.js';
4
+ /**
5
+ * The central processor for A2UI messages.
6
+ * @template T The concrete type of the ComponentApi.
7
+ */
8
+ export class MessageProcessor {
9
+ /**
10
+ * @param catalogs A list of available catalogs.
11
+ * @param actionHandler A global handler for actions from all surfaces.
12
+ */
13
+ constructor(catalogs, actionHandler) {
14
+ this.catalogs = catalogs;
15
+ this.actionHandler = actionHandler;
16
+ this.model = new SurfaceGroupModel();
17
+ this.model.onAction.subscribe(this.actionHandler);
18
+ }
19
+ /**
20
+ * Subscribes to surface creation events.
21
+ */
22
+ onSurfaceCreated(handler) {
23
+ return this.model.onSurfaceCreated.subscribe(handler);
24
+ }
25
+ /**
26
+ * Subscribes to surface deletion events.
27
+ */
28
+ onSurfaceDeleted(handler) {
29
+ return this.model.onSurfaceDeleted.subscribe(handler);
30
+ }
31
+ processMessages(messages) {
32
+ for (const message of messages) {
33
+ this.processMessage(message);
34
+ }
35
+ }
36
+ processMessage(message) {
37
+ if (message.createSurface) {
38
+ this.processCreateSurfaceMessage(message);
39
+ return;
40
+ }
41
+ const updateTypes = ['updateComponents', 'updateDataModel', 'deleteSurface'].filter(k => message[k]);
42
+ if (updateTypes.length > 1) {
43
+ console.warn(`Message contains multiple update types: ${updateTypes.join(', ')}. Ignoring.`);
44
+ return;
45
+ }
46
+ if (message.deleteSurface) {
47
+ this.processDeleteSurfaceMessage(message);
48
+ return;
49
+ }
50
+ if (message.updateComponents) {
51
+ this.processUpdateComponentsMessage(message);
52
+ return;
53
+ }
54
+ if (message.updateDataModel) {
55
+ this.processUpdateDataModelMessage(message);
56
+ return;
57
+ }
58
+ }
59
+ processCreateSurfaceMessage(message) {
60
+ const payload = message.createSurface;
61
+ const { surfaceId, catalogId, theme } = payload;
62
+ // Find catalog
63
+ const catalog = this.catalogs.find(c => c.id === catalogId);
64
+ if (!catalog) {
65
+ console.warn(`Catalog not found: ${catalogId}`);
66
+ return;
67
+ }
68
+ if (this.model.getSurface(surfaceId)) {
69
+ console.warn(`Surface ${surfaceId} already exists. Ignoring.`);
70
+ return;
71
+ }
72
+ const surface = new SurfaceModel(surfaceId, catalog, theme);
73
+ this.model.addSurface(surface);
74
+ }
75
+ processDeleteSurfaceMessage(message) {
76
+ const payload = message.deleteSurface;
77
+ if (!payload.surfaceId)
78
+ return;
79
+ this.model.deleteSurface(payload.surfaceId);
80
+ }
81
+ processUpdateComponentsMessage(message) {
82
+ const payload = message.updateComponents;
83
+ if (!payload.surfaceId)
84
+ return;
85
+ const surface = this.model.getSurface(payload.surfaceId);
86
+ if (!surface) {
87
+ console.warn(`Surface not found for message: ${payload.surfaceId}`);
88
+ return;
89
+ }
90
+ for (const comp of payload.components) {
91
+ const { id, component, ...properties } = comp;
92
+ const existing = surface.componentsModel.get(id);
93
+ if (existing) {
94
+ if (component && component !== existing.type) {
95
+ // Recreate component if type changes
96
+ surface.componentsModel.removeComponent(id);
97
+ const newComponent = new ComponentModel(id, component, properties);
98
+ surface.componentsModel.addComponent(newComponent);
99
+ }
100
+ else {
101
+ existing.properties = properties;
102
+ }
103
+ }
104
+ else {
105
+ if (!component) {
106
+ console.warn(`Cannot create component ${id} without a type.`);
107
+ continue;
108
+ }
109
+ const newComponent = new ComponentModel(id, component, properties);
110
+ surface.componentsModel.addComponent(newComponent);
111
+ }
112
+ }
113
+ }
114
+ processUpdateDataModelMessage(message) {
115
+ const payload = message.updateDataModel;
116
+ if (!payload.surfaceId)
117
+ return;
118
+ const surface = this.model.getSurface(payload.surfaceId);
119
+ if (!surface) {
120
+ console.warn(`Surface not found for message: ${payload.surfaceId}`);
121
+ return;
122
+ }
123
+ const path = payload.path || '/';
124
+ const value = payload.value;
125
+ surface.dataModel.set(path, value);
126
+ }
127
+ }
128
+ //# sourceMappingURL=message-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processor.js","sourceRoot":"","sources":["../../../../src/v0_9/processing/message-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=message-processor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processor.test.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/processing/message-processor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ import assert from 'node:assert';
2
+ import { describe, it, beforeEach } from 'node:test';
3
+ import { MessageProcessor } from './message-processor.js';
4
+ import { Catalog } from '../catalog/types.js';
5
+ describe('MessageProcessor', () => {
6
+ let processor;
7
+ let testCatalog;
8
+ let actions = [];
9
+ beforeEach(() => {
10
+ actions = [];
11
+ testCatalog = new Catalog('test-catalog', []);
12
+ processor = new MessageProcessor([testCatalog], async (a) => { actions.push(a); });
13
+ });
14
+ it('creates surface', () => {
15
+ processor.processMessages([{
16
+ createSurface: {
17
+ surfaceId: 's1',
18
+ catalogId: 'test-catalog',
19
+ theme: {}
20
+ }
21
+ }]);
22
+ const surface = processor.model.getSurface('s1');
23
+ assert.ok(surface);
24
+ assert.strictEqual(surface.id, 's1');
25
+ });
26
+ it('updates components on correct surface', () => {
27
+ processor.processMessages([{
28
+ createSurface: { surfaceId: 's1', catalogId: 'test-catalog' }
29
+ }]);
30
+ processor.processMessages([{
31
+ updateComponents: {
32
+ surfaceId: 's1',
33
+ components: [{ id: 'root', component: 'Box' }]
34
+ }
35
+ }]);
36
+ const surface = processor.model.getSurface('s1');
37
+ assert.ok(surface?.componentsModel.get('root'));
38
+ });
39
+ it('updates existing components via message', () => {
40
+ processor.processMessages([{
41
+ createSurface: { surfaceId: 's1', catalogId: 'test-catalog' }
42
+ }]);
43
+ // Create
44
+ processor.processMessages([{
45
+ updateComponents: {
46
+ surfaceId: 's1',
47
+ components: [{ id: 'btn', component: 'Button', label: 'Initial' }]
48
+ }
49
+ }]);
50
+ const surface = processor.model.getSurface('s1');
51
+ const btn = surface?.componentsModel.get('btn');
52
+ assert.strictEqual(btn?.properties.label, 'Initial');
53
+ // Update
54
+ processor.processMessages([{
55
+ updateComponents: {
56
+ surfaceId: 's1',
57
+ components: [{ id: 'btn', component: 'Button', label: 'Updated' }]
58
+ }
59
+ }]);
60
+ assert.strictEqual(btn?.properties.label, 'Updated');
61
+ });
62
+ it('deletes surface', () => {
63
+ processor.processMessages([{
64
+ createSurface: { surfaceId: 's1', catalogId: 'test-catalog' }
65
+ }]);
66
+ assert.ok(processor.model.getSurface('s1'));
67
+ processor.processMessages([{
68
+ deleteSurface: { surfaceId: 's1' }
69
+ }]);
70
+ assert.strictEqual(processor.model.getSurface('s1'), undefined);
71
+ });
72
+ it('routes data model updates', () => {
73
+ processor.processMessages([{
74
+ createSurface: { surfaceId: 's1', catalogId: 'test-catalog' }
75
+ }]);
76
+ processor.processMessages([{
77
+ updateDataModel: {
78
+ surfaceId: 's1',
79
+ path: '/foo',
80
+ value: 'bar'
81
+ }
82
+ }]);
83
+ const surface = processor.model.getSurface('s1');
84
+ assert.strictEqual(surface?.dataModel.get('/foo'), 'bar');
85
+ });
86
+ it('notifies lifecycle listeners', () => {
87
+ let created = null;
88
+ let deletedId = null;
89
+ const sub = processor.onSurfaceCreated((s) => { created = s; });
90
+ const sub2 = processor.onSurfaceDeleted((id) => { deletedId = id; });
91
+ // Create
92
+ processor.processMessages([{
93
+ createSurface: { surfaceId: 's1', catalogId: 'test-catalog' }
94
+ }]);
95
+ assert.ok(created);
96
+ assert.strictEqual(created.id, 's1');
97
+ // Delete
98
+ processor.processMessages([{
99
+ deleteSurface: { surfaceId: 's1' }
100
+ }]);
101
+ assert.strictEqual(deletedId, 's1');
102
+ // Test Unsubscribe
103
+ created = null;
104
+ sub.unsubscribe();
105
+ processor.processMessages([{
106
+ createSurface: { surfaceId: 's2', catalogId: 'test-catalog' }
107
+ }]);
108
+ assert.strictEqual(created, null);
109
+ sub2.unsubscribe();
110
+ });
111
+ });
112
+ //# sourceMappingURL=message-processor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-processor.test.js","sourceRoot":"","sources":["../../../../src/v0_9/processing/message-processor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { DataContext } from './data-context.js';
2
+ import { ComponentModel } from '../state/component-model.js';
3
+ import type { SurfaceModel } from '../state/surface-model.js';
4
+ import type { SurfaceComponentsModel } from '../state/surface-components-model.js';
5
+ /**
6
+ * Context provided to components during rendering.
7
+ * It provides access to the component's model, the data context, and a way to dispatch actions.
8
+ */
9
+ export declare class ComponentContext {
10
+ readonly componentModel: ComponentModel;
11
+ readonly dataContext: DataContext;
12
+ readonly surfaceComponents: SurfaceComponentsModel;
13
+ constructor(surface: SurfaceModel<any>, componentId: string, dataModelBasePath?: string);
14
+ private _actionDispatcher;
15
+ dispatchAction(action: any): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=component-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-context.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/rendering/component-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAEnF;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;gBAGjD,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,EAC1B,WAAW,EAAE,MAAM,EACnB,iBAAiB,GAAE,MAAY;IAYjC,OAAO,CAAC,iBAAiB,CAAiC;IAE1D,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3C"}
@@ -0,0 +1,21 @@
1
+ import { DataContext } from './data-context.js';
2
+ /**
3
+ * Context provided to components during rendering.
4
+ * It provides access to the component's model, the data context, and a way to dispatch actions.
5
+ */
6
+ export class ComponentContext {
7
+ constructor(surface, componentId, dataModelBasePath = '/') {
8
+ const model = surface.componentsModel.get(componentId);
9
+ if (!model) {
10
+ throw new Error(`Component not found: ${componentId}`);
11
+ }
12
+ this.componentModel = model;
13
+ this.surfaceComponents = surface.componentsModel;
14
+ this.dataContext = new DataContext(surface.dataModel, dataModelBasePath);
15
+ this._actionDispatcher = (action) => surface.dispatchAction(action);
16
+ }
17
+ dispatchAction(action) {
18
+ return this._actionDispatcher(action);
19
+ }
20
+ }
21
+ //# sourceMappingURL=component-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-context.js","sourceRoot":"","sources":["../../../../src/v0_9/rendering/component-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAK3B,YACE,OAA0B,EAC1B,WAAmB,EACnB,oBAA4B,GAAG;QAE/B,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACzE,IAAI,CAAC,iBAAiB,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAID,cAAc,CAAC,MAAW;QACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import { DataModel, DataSubscription } from '../state/data-model.js';
2
+ import type { DynamicValue } from '../schema/common-types.js';
3
+ /**
4
+ * A contextual view of the main DataModel, serving as the unified interface for resolving
5
+ * DynamicValues (literals, data paths, function calls) within a specific scope.
6
+ */
7
+ export declare class DataContext {
8
+ readonly dataModel: DataModel;
9
+ readonly path: string;
10
+ /**
11
+ * @param dataModel The shared DataModel instance.
12
+ * @param path The absolute path this context is currently pointing to.
13
+ */
14
+ constructor(dataModel: DataModel, path: string);
15
+ /**
16
+ * Updates the data model at the specified path, resolving it against the current context.
17
+ * This is the only method for mutating the data model.
18
+ */
19
+ set(path: string, value: any): void;
20
+ /**
21
+ * Resolves a DynamicValue to its current evaluation.
22
+ * Does not set up any subscriptions.
23
+ */
24
+ resolveDynamicValue<V>(value: DynamicValue): V;
25
+ /**
26
+ * Subscribes to changes in a DynamicValue.
27
+ * Returns a Subscription object that provides the current value and allows listening for updates.
28
+ */
29
+ subscribeDynamicValue<V>(value: DynamicValue, onChange: (value: V | undefined) => void): DataSubscription<V>;
30
+ /**
31
+ * Creates a new, nested DataContext for a child component.
32
+ * Used by list/template components for their children.
33
+ */
34
+ nested(relativePath: string): DataContext;
35
+ private resolvePath;
36
+ }
37
+ //# sourceMappingURL=data-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-context.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/rendering/data-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,2BAA2B,CAAC;AAEzF;;;GAGG;AACH,qBAAa,WAAW;IAMpB,QAAQ,CAAC,SAAS,EAAE,SAAS;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM;IANvB;;;OAGG;gBAEQ,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM;IAGvB;;;OAGG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAKnC;;;OAGG;IACH,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,CAAC;IAuB9C;;;OAGG;IACH,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAwB5G;;;OAGG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAKzC,OAAO,CAAC,WAAW;CAmBpB"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * A contextual view of the main DataModel, serving as the unified interface for resolving
3
+ * DynamicValues (literals, data paths, function calls) within a specific scope.
4
+ */
5
+ export class DataContext {
6
+ /**
7
+ * @param dataModel The shared DataModel instance.
8
+ * @param path The absolute path this context is currently pointing to.
9
+ */
10
+ constructor(dataModel, path) {
11
+ this.dataModel = dataModel;
12
+ this.path = path;
13
+ }
14
+ /**
15
+ * Updates the data model at the specified path, resolving it against the current context.
16
+ * This is the only method for mutating the data model.
17
+ */
18
+ set(path, value) {
19
+ const absolutePath = this.resolvePath(path);
20
+ this.dataModel.set(absolutePath, value);
21
+ }
22
+ /**
23
+ * Resolves a DynamicValue to its current evaluation.
24
+ * Does not set up any subscriptions.
25
+ */
26
+ resolveDynamicValue(value) {
27
+ // 1. Literal Check
28
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
29
+ // TODO: Define error handling when V doesn't match
30
+ return value;
31
+ }
32
+ // 2. Path Check: { path: "..." }
33
+ if ('path' in value) {
34
+ const absolutePath = this.resolvePath(value.path);
35
+ return this.dataModel.get(absolutePath);
36
+ }
37
+ // 3. Function Call: { call: "...", args: ... }
38
+ if ('call' in value) {
39
+ // TODO: Implement function calls (expected for now)
40
+ // For now, return as is or undefined
41
+ }
42
+ // TODO: Define error handling when V doesn't match
43
+ return value;
44
+ }
45
+ /**
46
+ * Subscribes to changes in a DynamicValue.
47
+ * Returns a Subscription object that provides the current value and allows listening for updates.
48
+ */
49
+ subscribeDynamicValue(value, onChange) {
50
+ // 1. Literal: Return a static subscription
51
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
52
+ return {
53
+ // TODO: Define error handling when V doesn't match
54
+ value: value,
55
+ unsubscribe: () => { }
56
+ };
57
+ }
58
+ // 2. Path Check: { path: "..." }
59
+ if ('path' in value) {
60
+ const absolutePath = this.resolvePath(value.path);
61
+ return this.dataModel.subscribe(absolutePath, onChange);
62
+ }
63
+ // 3. Function Call (TODO)
64
+ return {
65
+ // TODO: Define error handling when V doesn't match
66
+ value: value,
67
+ unsubscribe: () => { }
68
+ };
69
+ }
70
+ /**
71
+ * Creates a new, nested DataContext for a child component.
72
+ * Used by list/template components for their children.
73
+ */
74
+ nested(relativePath) {
75
+ const newPath = this.resolvePath(relativePath);
76
+ return new DataContext(this.dataModel, newPath);
77
+ }
78
+ resolvePath(path) {
79
+ // Absolute path - no resolution required.
80
+ if (path.startsWith('/')) {
81
+ return path;
82
+ }
83
+ // Handle specific cases like '.' or empty
84
+ if (path === '' || path === '.') {
85
+ return this.path;
86
+ }
87
+ // Normalize current path (remove trailing slash if exists, unless root)
88
+ let base = this.path;
89
+ if (base.endsWith('/') && base.length > 1) {
90
+ base = base.slice(0, -1);
91
+ }
92
+ if (base === '/')
93
+ base = '';
94
+ return `${base}/${path}`;
95
+ }
96
+ }
97
+ //# sourceMappingURL=data-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-context.js","sourceRoot":"","sources":["../../../../src/v0_9/rendering/data-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-context.test.d.ts","sourceRoot":"","sources":["../../../../src/v0_9/rendering/data-context.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import assert from 'node:assert';
2
+ import { describe, it, beforeEach } from 'node:test';
3
+ import { DataModel } from '../state/data-model.js';
4
+ import { DataContext } from './data-context.js';
5
+ describe('DataContext', () => {
6
+ let model;
7
+ let context;
8
+ beforeEach(() => {
9
+ model = new DataModel({
10
+ user: {
11
+ name: 'Alice',
12
+ address: {
13
+ city: 'Wonderland'
14
+ }
15
+ },
16
+ list: ['a', 'b']
17
+ });
18
+ context = new DataContext(model, '/user');
19
+ });
20
+ it('resolves relative paths', () => {
21
+ assert.strictEqual(context.resolveDynamicValue({ path: 'name' }), 'Alice');
22
+ });
23
+ it('resolves absolute paths', () => {
24
+ assert.strictEqual(context.resolveDynamicValue({ path: '/list/0' }), 'a');
25
+ });
26
+ it('resolves nested paths', () => {
27
+ assert.strictEqual(context.resolveDynamicValue({ path: 'address/city' }), 'Wonderland');
28
+ });
29
+ it('updates data via relative path', () => {
30
+ context.set('name', 'Bob');
31
+ assert.strictEqual(model.get('/user/name'), 'Bob');
32
+ });
33
+ it('creates nested context', () => {
34
+ const addressContext = context.nested('address');
35
+ assert.strictEqual(addressContext.path, '/user/address');
36
+ assert.strictEqual(addressContext.resolveDynamicValue({ path: 'city' }), 'Wonderland');
37
+ });
38
+ it('handles root context', () => {
39
+ const rootContext = new DataContext(model, '/');
40
+ assert.strictEqual(rootContext.resolveDynamicValue({ path: 'user/name' }), 'Alice');
41
+ });
42
+ it('subscribes relative path', () => {
43
+ let called = false;
44
+ const sub = context.subscribeDynamicValue({ path: 'name' }, (val) => {
45
+ assert.strictEqual(val, 'Charlie');
46
+ called = true;
47
+ });
48
+ context.set('name', 'Charlie');
49
+ assert.strictEqual(called, true, 'Callback was never called');
50
+ });
51
+ it('resolves using resolveDynamicValue() method with literals', () => {
52
+ // Literal
53
+ assert.strictEqual(context.resolveDynamicValue('literal'), 'literal');
54
+ // Path
55
+ assert.strictEqual(context.resolveDynamicValue({ path: 'name' }), 'Alice');
56
+ // Absolute Path
57
+ assert.strictEqual(context.resolveDynamicValue({ path: '/list/0' }), 'a');
58
+ });
59
+ it('resolves literal arrays', () => {
60
+ assert.deepStrictEqual(context.resolveDynamicValue(['literal', 'array']), ['literal', 'array']);
61
+ });
62
+ it('subscribes literal arrays as static', () => {
63
+ let called = false;
64
+ const sub = context.subscribeDynamicValue(['literal', 'array'], () => { called = true; });
65
+ assert.deepStrictEqual(sub.value, ['literal', 'array']);
66
+ // Simulate some generic path update that shouldn't trigger anything for this static sub
67
+ context.set('name', 'Charlie');
68
+ assert.strictEqual(called, false);
69
+ });
70
+ });
71
+ //# sourceMappingURL=data-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-context.test.js","sourceRoot":"","sources":["../../../../src/v0_9/rendering/data-context.test.ts"],"names":[],"mappings":"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"}