@a2ui/web_core 0.8.0 → 0.9.1-alpha.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 (435) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/LICENSE +203 -0
  3. package/README.md +50 -4
  4. package/package.json +42 -72
  5. package/{dist/src → src}/v0_8/data/guards.js +13 -13
  6. package/src/v0_8/data/guards.test.d.ts +2 -0
  7. package/src/v0_8/data/guards.test.d.ts.map +1 -0
  8. package/src/v0_8/data/guards.test.js +174 -0
  9. package/src/v0_8/data/guards.test.js.map +1 -0
  10. package/{dist/src → src}/v0_8/data/model-processor.d.ts +1 -1
  11. package/{dist/src → src}/v0_8/data/model-processor.d.ts.map +1 -1
  12. package/{dist/src → src}/v0_8/data/model-processor.js +51 -40
  13. package/src/v0_8/data/model-processor.js.map +1 -0
  14. package/src/v0_8/data/model-processor.test.d.ts +2 -0
  15. package/src/v0_8/data/model-processor.test.d.ts.map +1 -0
  16. package/src/v0_8/data/model-processor.test.js +712 -0
  17. package/src/v0_8/data/model-processor.test.js.map +1 -0
  18. package/src/v0_8/errors.d.ts +35 -0
  19. package/src/v0_8/errors.d.ts.map +1 -0
  20. package/src/v0_8/errors.js +65 -0
  21. package/src/v0_8/errors.js.map +1 -0
  22. package/src/v0_8/events/validation-event.d.ts.map +1 -0
  23. package/{dist/src → src}/v0_8/events/validation-event.js.map +1 -1
  24. package/{dist/src → src}/v0_8/index.d.ts +35 -4
  25. package/{dist/src → src}/v0_8/index.d.ts.map +1 -1
  26. package/src/v0_8/index.js +28 -0
  27. package/src/v0_8/index.js.map +1 -0
  28. package/src/v0_8/schema/common-types.d.ts +1189 -0
  29. package/src/v0_8/schema/common-types.d.ts.map +1 -0
  30. package/src/v0_8/schema/common-types.js +381 -0
  31. package/src/v0_8/schema/common-types.js.map +1 -0
  32. package/src/v0_8/schema/server-to-client.d.ts +17949 -0
  33. package/src/v0_8/schema/server-to-client.d.ts.map +1 -0
  34. package/src/v0_8/schema/server-to-client.js +228 -0
  35. package/src/v0_8/schema/server-to-client.js.map +1 -0
  36. package/src/v0_8/schema/verify-schema.test.d.ts +17 -0
  37. package/src/v0_8/schema/verify-schema.test.d.ts.map +1 -0
  38. package/src/v0_8/schema/verify-schema.test.js +167 -0
  39. package/src/v0_8/schema/verify-schema.test.js.map +1 -0
  40. package/{dist/src → src}/v0_8/schemas/server_to_client.json +1 -1
  41. package/src/v0_8/schemas/server_to_client_with_standard_catalog.json +817 -787
  42. package/{dist/src → src}/v0_8/schemas/standard_catalog_definition.json +26 -0
  43. package/{dist/src → src}/v0_8/styles/behavior.js +13 -13
  44. package/{dist/src → src}/v0_8/styles/border.js +13 -13
  45. package/{dist/src → src}/v0_8/styles/colors.js +13 -13
  46. package/{dist/src → src}/v0_8/styles/colors.js.map +1 -1
  47. package/src/v0_8/styles/icons.d.ts +11 -0
  48. package/{dist/src → src}/v0_8/styles/icons.d.ts.map +1 -1
  49. package/{dist/src → src}/v0_8/styles/icons.js +17 -14
  50. package/{dist/src → src}/v0_8/styles/icons.js.map +1 -1
  51. package/src/v0_8/styles/index.js +35 -0
  52. package/{dist/src → src}/v0_8/styles/layout.js +13 -13
  53. package/{dist/src → src}/v0_8/styles/layout.js.map +1 -1
  54. package/src/v0_8/styles/opacity.js +24 -0
  55. package/src/v0_8/{events/index.ts → styles/shared.js} +3 -4
  56. package/src/v0_8/styles/styles.test.d.ts +2 -0
  57. package/src/v0_8/styles/styles.test.d.ts.map +1 -0
  58. package/src/v0_8/styles/styles.test.js +86 -0
  59. package/src/v0_8/styles/styles.test.js.map +1 -0
  60. package/{dist/src → src}/v0_8/styles/type.js +13 -13
  61. package/{dist/src → src}/v0_8/styles/utils.js +13 -13
  62. package/{dist/src → src}/v0_8/types/client-event.d.ts +10 -8
  63. package/src/v0_8/types/client-event.d.ts.map +1 -0
  64. package/src/v0_8/types/client-event.js +17 -0
  65. package/src/v0_8/types/colors.js +19 -0
  66. package/src/v0_8/types/components.d.ts +41 -0
  67. package/src/v0_8/types/components.d.ts.map +1 -0
  68. package/src/v0_8/types/components.js +17 -0
  69. package/src/v0_8/types/primitives.d.ts +9 -0
  70. package/src/v0_8/types/primitives.d.ts.map +1 -0
  71. package/src/v0_8/types/primitives.js +17 -0
  72. package/{dist/src → src}/v0_8/types/types.d.ts +44 -22
  73. package/src/v0_8/types/types.d.ts.map +1 -0
  74. package/src/v0_8/types/types.js +17 -0
  75. package/src/v0_9/basic_catalog/components/basic_components.d.ts +3359 -0
  76. package/src/v0_9/basic_catalog/components/basic_components.d.ts.map +1 -0
  77. package/src/v0_9/basic_catalog/components/basic_components.js +448 -0
  78. package/src/v0_9/basic_catalog/components/basic_components.js.map +1 -0
  79. package/src/v0_9/basic_catalog/components/basic_components.test.d.ts +2 -0
  80. package/src/v0_9/basic_catalog/components/basic_components.test.d.ts.map +1 -0
  81. package/src/v0_9/basic_catalog/components/basic_components.test.js +46 -0
  82. package/src/v0_9/basic_catalog/components/basic_components.test.js.map +1 -0
  83. package/src/v0_9/basic_catalog/expressions/expression_parser.d.ts +38 -0
  84. package/src/v0_9/basic_catalog/expressions/expression_parser.d.ts.map +1 -0
  85. package/src/v0_9/basic_catalog/expressions/expression_parser.js +294 -0
  86. package/src/v0_9/basic_catalog/expressions/expression_parser.js.map +1 -0
  87. package/src/v0_9/basic_catalog/expressions/expression_parser.test.d.ts +2 -0
  88. package/src/v0_9/basic_catalog/expressions/expression_parser.test.d.ts.map +1 -0
  89. package/src/v0_9/basic_catalog/expressions/expression_parser.test.js +126 -0
  90. package/src/v0_9/basic_catalog/expressions/expression_parser.test.js.map +1 -0
  91. package/src/v0_9/basic_catalog/functions/basic_functions.d.ts +136 -0
  92. package/src/v0_9/basic_catalog/functions/basic_functions.d.ts.map +1 -0
  93. package/src/v0_9/basic_catalog/functions/basic_functions.js +316 -0
  94. package/src/v0_9/basic_catalog/functions/basic_functions.js.map +1 -0
  95. package/src/v0_9/basic_catalog/functions/basic_functions.test.d.ts +2 -0
  96. package/src/v0_9/basic_catalog/functions/basic_functions.test.d.ts.map +1 -0
  97. package/src/v0_9/basic_catalog/functions/basic_functions.test.js +301 -0
  98. package/src/v0_9/basic_catalog/functions/basic_functions.test.js.map +1 -0
  99. package/src/v0_9/basic_catalog/functions/basic_functions_api.d.ts +930 -0
  100. package/src/v0_9/basic_catalog/functions/basic_functions_api.d.ts.map +1 -0
  101. package/src/v0_9/basic_catalog/functions/basic_functions_api.js +466 -0
  102. package/src/v0_9/basic_catalog/functions/basic_functions_api.js.map +1 -0
  103. package/src/v0_9/basic_catalog/index.d.ts +5 -0
  104. package/src/v0_9/basic_catalog/index.d.ts.map +1 -0
  105. package/src/v0_9/basic_catalog/index.js +20 -0
  106. package/src/v0_9/basic_catalog/index.js.map +1 -0
  107. package/src/v0_9/catalog/function_invoker.d.ts +12 -0
  108. package/src/v0_9/catalog/function_invoker.d.ts.map +1 -0
  109. package/src/v0_9/catalog/function_invoker.js +17 -0
  110. package/src/v0_9/catalog/function_invoker.js.map +1 -0
  111. package/src/v0_9/catalog/types.d.ts +80 -0
  112. package/src/v0_9/catalog/types.d.ts.map +1 -0
  113. package/src/v0_9/catalog/types.js +68 -0
  114. package/src/v0_9/catalog/types.js.map +1 -0
  115. package/src/v0_9/catalog/types.test.d.ts +2 -0
  116. package/src/v0_9/catalog/types.test.d.ts.map +1 -0
  117. package/src/v0_9/catalog/types.test.js +89 -0
  118. package/src/v0_9/catalog/types.test.js.map +1 -0
  119. package/src/v0_9/common/events.d.ts +45 -0
  120. package/src/v0_9/common/events.d.ts.map +1 -0
  121. package/src/v0_9/common/events.js +58 -0
  122. package/src/v0_9/common/events.js.map +1 -0
  123. package/src/v0_9/common/events.test.d.ts +2 -0
  124. package/src/v0_9/common/events.test.d.ts.map +1 -0
  125. package/src/v0_9/common/events.test.js +58 -0
  126. package/src/v0_9/common/events.test.js.map +1 -0
  127. package/src/v0_9/errors.d.ts +40 -0
  128. package/src/v0_9/errors.d.ts.map +1 -0
  129. package/src/v0_9/errors.js +69 -0
  130. package/src/v0_9/errors.js.map +1 -0
  131. package/src/v0_9/index.d.ts +152 -0
  132. package/src/v0_9/index.d.ts.map +1 -0
  133. package/src/v0_9/index.js +41 -0
  134. package/src/v0_9/index.js.map +1 -0
  135. package/src/v0_9/processing/message-processor.d.ts +70 -0
  136. package/src/v0_9/processing/message-processor.d.ts.map +1 -0
  137. package/src/v0_9/processing/message-processor.js +289 -0
  138. package/src/v0_9/processing/message-processor.js.map +1 -0
  139. package/src/v0_9/processing/message-processor.test.js +547 -0
  140. package/src/v0_9/processing/message-processor.test.js.map +1 -0
  141. package/src/v0_9/reactivity/signals.d.ts +51 -0
  142. package/src/v0_9/reactivity/signals.d.ts.map +1 -0
  143. package/src/v0_9/reactivity/signals.js +17 -0
  144. package/src/v0_9/reactivity/signals.js.map +1 -0
  145. package/src/{v0_8/events/base.ts → v0_9/reactivity/signals.test.d.ts} +14 -10
  146. package/src/v0_9/reactivity/signals.test.d.ts.map +1 -0
  147. package/src/v0_9/reactivity/signals.test.js +108 -0
  148. package/src/v0_9/reactivity/signals.test.js.map +1 -0
  149. package/src/v0_9/rendering/component-context.d.ts +37 -0
  150. package/src/v0_9/rendering/component-context.d.ts.map +1 -0
  151. package/src/v0_9/rendering/component-context.js +50 -0
  152. package/src/v0_9/rendering/component-context.js.map +1 -0
  153. package/src/v0_9/rendering/component-context.test.d.ts +2 -0
  154. package/src/v0_9/rendering/component-context.test.d.ts.map +1 -0
  155. package/src/v0_9/rendering/component-context.test.js +68 -0
  156. package/src/v0_9/rendering/component-context.test.js.map +1 -0
  157. package/src/v0_9/rendering/data-context.d.ts +99 -0
  158. package/src/v0_9/rendering/data-context.d.ts.map +1 -0
  159. package/src/v0_9/rendering/data-context.js +311 -0
  160. package/src/v0_9/rendering/data-context.js.map +1 -0
  161. package/src/v0_9/rendering/data-context.test.js +379 -0
  162. package/src/v0_9/rendering/data-context.test.js.map +1 -0
  163. package/src/v0_9/rendering/generic-binder.d.ts +122 -0
  164. package/src/v0_9/rendering/generic-binder.d.ts.map +1 -0
  165. package/src/v0_9/rendering/generic-binder.js +315 -0
  166. package/src/v0_9/rendering/generic-binder.js.map +1 -0
  167. package/src/v0_9/rendering/generic-binder.test.d.ts +2 -0
  168. package/src/v0_9/rendering/generic-binder.test.d.ts.map +1 -0
  169. package/src/v0_9/rendering/generic-binder.test.js +166 -0
  170. package/src/v0_9/rendering/generic-binder.test.js.map +1 -0
  171. package/src/v0_9/schema/client-capabilities.d.ts +34 -0
  172. package/src/v0_9/schema/client-capabilities.d.ts.map +1 -0
  173. package/src/v0_9/schema/client-capabilities.js +17 -0
  174. package/src/v0_9/schema/client-capabilities.js.map +1 -0
  175. package/src/v0_9/schema/client-to-server.d.ts +208 -0
  176. package/src/v0_9/schema/client-to-server.d.ts.map +1 -0
  177. package/src/v0_9/schema/client-to-server.js +104 -0
  178. package/src/v0_9/schema/client-to-server.js.map +1 -0
  179. package/src/v0_9/schema/client-to-server.test.d.ts +2 -0
  180. package/src/v0_9/schema/client-to-server.test.d.ts.map +1 -0
  181. package/src/v0_9/schema/client-to-server.test.js +85 -0
  182. package/src/v0_9/schema/client-to-server.test.js.map +1 -0
  183. package/{dist/src → src}/v0_9/schema/common-types.d.ts +318 -88
  184. package/src/v0_9/schema/common-types.d.ts.map +1 -0
  185. package/src/v0_9/schema/common-types.js +141 -0
  186. package/src/v0_9/schema/common-types.js.map +1 -0
  187. package/src/v0_9/schema/index.d.ts +5 -0
  188. package/src/v0_9/schema/index.d.ts.map +1 -0
  189. package/src/v0_9/schema/index.js +20 -0
  190. package/src/v0_9/schema/index.js.map +1 -0
  191. package/src/v0_9/schema/server-to-client.d.ts +307 -0
  192. package/src/v0_9/schema/server-to-client.d.ts.map +1 -0
  193. package/src/v0_9/schema/server-to-client.js +92 -0
  194. package/src/v0_9/schema/server-to-client.js.map +1 -0
  195. package/src/v0_9/schema/verify-schema.test.d.ts +17 -0
  196. package/src/v0_9/schema/verify-schema.test.d.ts.map +1 -0
  197. package/src/v0_9/schema/verify-schema.test.js +174 -0
  198. package/src/v0_9/schema/verify-schema.test.js.map +1 -0
  199. package/src/v0_9/schemas/basic_catalog.json +1387 -0
  200. package/src/v0_9/schemas/client_capabilities.json +97 -0
  201. package/src/v0_9/schemas/client_data_model.json +22 -0
  202. package/src/v0_9/schemas/client_to_server.json +104 -0
  203. package/src/v0_9/schemas/client_to_server_list.json +19 -0
  204. package/src/v0_9/schemas/common_types.json +315 -0
  205. package/src/v0_9/schemas/sample.json +22 -0
  206. package/src/v0_9/schemas/server_capabilities.json +26 -0
  207. package/src/v0_9/schemas/server_to_client.json +131 -0
  208. package/src/v0_9/schemas/server_to_client_list.json +19 -0
  209. package/src/v0_9/state/component-model.d.ts +36 -0
  210. package/src/v0_9/state/component-model.d.ts.map +1 -0
  211. package/src/v0_9/state/component-model.js +65 -0
  212. package/src/v0_9/state/component-model.js.map +1 -0
  213. package/{dist/src → src}/v0_9/state/component-model.test.js +23 -0
  214. package/src/v0_9/state/component-model.test.js.map +1 -0
  215. package/src/v0_9/state/data-model.d.ts +75 -0
  216. package/src/v0_9/state/data-model.d.ts.map +1 -0
  217. package/src/v0_9/state/data-model.js +235 -0
  218. package/src/v0_9/state/data-model.js.map +1 -0
  219. package/{dist/src → src}/v0_9/state/data-model.test.js +77 -17
  220. package/src/v0_9/state/data-model.test.js.map +1 -0
  221. package/src/v0_9/state/surface-components-model.d.ts +45 -0
  222. package/src/v0_9/state/surface-components-model.d.ts.map +1 -0
  223. package/src/v0_9/state/surface-components-model.js +86 -0
  224. package/src/v0_9/state/surface-components-model.js.map +1 -0
  225. package/{dist/src → src}/v0_9/state/surface-components-model.test.js +44 -2
  226. package/src/v0_9/state/surface-components-model.test.js.map +1 -0
  227. package/{dist/src → src}/v0_9/state/surface-group-model.d.ts +28 -1
  228. package/src/v0_9/state/surface-group-model.d.ts.map +1 -0
  229. package/{dist/src → src}/v0_9/state/surface-group-model.js +44 -1
  230. package/src/v0_9/state/surface-group-model.js.map +1 -0
  231. package/{dist/src → src}/v0_9/state/surface-group-model.test.js +47 -6
  232. package/src/v0_9/state/surface-group-model.test.js.map +1 -0
  233. package/src/v0_9/state/surface-model.d.ts +62 -0
  234. package/src/v0_9/state/surface-model.d.ts.map +1 -0
  235. package/src/v0_9/state/surface-model.js +101 -0
  236. package/src/v0_9/state/surface-model.js.map +1 -0
  237. package/src/v0_9/state/surface-model.test.js +93 -0
  238. package/src/v0_9/state/surface-model.test.js.map +1 -0
  239. package/src/v0_9/test/function_execution.spec.d.ts +17 -0
  240. package/src/v0_9/test/function_execution.spec.d.ts.map +1 -0
  241. package/src/v0_9/test/function_execution.spec.js +127 -0
  242. package/src/v0_9/test/function_execution.spec.js.map +1 -0
  243. package/src/v0_9/test/test-utils.d.ts.map +1 -0
  244. package/{dist/src → src}/v0_9/test/test-utils.js +15 -0
  245. package/src/v0_9/test/test-utils.js.map +1 -0
  246. package/dist/.tsbuildinfo +0 -1
  247. package/dist/src/v0_8/data/model-processor.js.map +0 -1
  248. package/dist/src/v0_8/events/validation-event.d.ts.map +0 -1
  249. package/dist/src/v0_8/index.js +0 -12
  250. package/dist/src/v0_8/index.js.map +0 -1
  251. package/dist/src/v0_8/schemas/server_to_client_with_standard_catalog.json +0 -823
  252. package/dist/src/v0_8/styles/icons.d.ts +0 -11
  253. package/dist/src/v0_8/styles/index.js +0 -35
  254. package/dist/src/v0_8/styles/opacity.js +0 -24
  255. package/dist/src/v0_8/styles/shared.js +0 -17
  256. package/dist/src/v0_8/types/client-event.d.ts.map +0 -1
  257. package/dist/src/v0_8/types/client-event.js +0 -17
  258. package/dist/src/v0_8/types/colors.js +0 -19
  259. package/dist/src/v0_8/types/components.d.ts +0 -176
  260. package/dist/src/v0_8/types/components.d.ts.map +0 -1
  261. package/dist/src/v0_8/types/components.js +0 -17
  262. package/dist/src/v0_8/types/primitives.d.ts +0 -43
  263. package/dist/src/v0_8/types/primitives.d.ts.map +0 -1
  264. package/dist/src/v0_8/types/primitives.js +0 -17
  265. package/dist/src/v0_8/types/types.d.ts.map +0 -1
  266. package/dist/src/v0_8/types/types.js +0 -17
  267. package/dist/src/v0_9/catalog/types.d.ts +0 -27
  268. package/dist/src/v0_9/catalog/types.d.ts.map +0 -1
  269. package/dist/src/v0_9/catalog/types.js +0 -11
  270. package/dist/src/v0_9/catalog/types.js.map +0 -1
  271. package/dist/src/v0_9/common/events.d.ts +0 -24
  272. package/dist/src/v0_9/common/events.d.ts.map +0 -1
  273. package/dist/src/v0_9/common/events.js +0 -29
  274. package/dist/src/v0_9/common/events.js.map +0 -1
  275. package/dist/src/v0_9/index.d.ts +0 -11
  276. package/dist/src/v0_9/index.d.ts.map +0 -1
  277. package/dist/src/v0_9/index.js +0 -11
  278. package/dist/src/v0_9/index.js.map +0 -1
  279. package/dist/src/v0_9/processing/message-processor.d.ts +0 -34
  280. package/dist/src/v0_9/processing/message-processor.d.ts.map +0 -1
  281. package/dist/src/v0_9/processing/message-processor.js +0 -128
  282. package/dist/src/v0_9/processing/message-processor.js.map +0 -1
  283. package/dist/src/v0_9/processing/message-processor.test.js +0 -112
  284. package/dist/src/v0_9/processing/message-processor.test.js.map +0 -1
  285. package/dist/src/v0_9/rendering/component-context.d.ts +0 -17
  286. package/dist/src/v0_9/rendering/component-context.d.ts.map +0 -1
  287. package/dist/src/v0_9/rendering/component-context.js +0 -21
  288. package/dist/src/v0_9/rendering/component-context.js.map +0 -1
  289. package/dist/src/v0_9/rendering/data-context.d.ts +0 -37
  290. package/dist/src/v0_9/rendering/data-context.d.ts.map +0 -1
  291. package/dist/src/v0_9/rendering/data-context.js +0 -97
  292. package/dist/src/v0_9/rendering/data-context.js.map +0 -1
  293. package/dist/src/v0_9/rendering/data-context.test.js +0 -71
  294. package/dist/src/v0_9/rendering/data-context.test.js.map +0 -1
  295. package/dist/src/v0_9/schema/common-types.d.ts.map +0 -1
  296. package/dist/src/v0_9/schema/common-types.js +0 -92
  297. package/dist/src/v0_9/schema/common-types.js.map +0 -1
  298. package/dist/src/v0_9/schema/index.d.ts +0 -3
  299. package/dist/src/v0_9/schema/index.d.ts.map +0 -1
  300. package/dist/src/v0_9/schema/index.js +0 -3
  301. package/dist/src/v0_9/schema/index.js.map +0 -1
  302. package/dist/src/v0_9/schema/server-to-client.d.ts +0 -84
  303. package/dist/src/v0_9/schema/server-to-client.d.ts.map +0 -1
  304. package/dist/src/v0_9/schema/server-to-client.js +0 -21
  305. package/dist/src/v0_9/schema/server-to-client.js.map +0 -1
  306. package/dist/src/v0_9/state/component-model.d.ts +0 -16
  307. package/dist/src/v0_9/state/component-model.d.ts.map +0 -1
  308. package/dist/src/v0_9/state/component-model.js +0 -24
  309. package/dist/src/v0_9/state/component-model.js.map +0 -1
  310. package/dist/src/v0_9/state/component-model.test.js.map +0 -1
  311. package/dist/src/v0_9/state/data-model.d.ts +0 -47
  312. package/dist/src/v0_9/state/data-model.d.ts.map +0 -1
  313. package/dist/src/v0_9/state/data-model.js +0 -191
  314. package/dist/src/v0_9/state/data-model.js.map +0 -1
  315. package/dist/src/v0_9/state/data-model.test.js.map +0 -1
  316. package/dist/src/v0_9/state/surface-components-model.d.ts +0 -19
  317. package/dist/src/v0_9/state/surface-components-model.d.ts.map +0 -1
  318. package/dist/src/v0_9/state/surface-components-model.js +0 -42
  319. package/dist/src/v0_9/state/surface-components-model.js.map +0 -1
  320. package/dist/src/v0_9/state/surface-components-model.test.js.map +0 -1
  321. package/dist/src/v0_9/state/surface-group-model.d.ts.map +0 -1
  322. package/dist/src/v0_9/state/surface-group-model.js.map +0 -1
  323. package/dist/src/v0_9/state/surface-group-model.test.js.map +0 -1
  324. package/dist/src/v0_9/state/surface-model.d.ts +0 -23
  325. package/dist/src/v0_9/state/surface-model.d.ts.map +0 -1
  326. package/dist/src/v0_9/state/surface-model.js +0 -28
  327. package/dist/src/v0_9/state/surface-model.js.map +0 -1
  328. package/dist/src/v0_9/state/surface-model.test.js +0 -39
  329. package/dist/src/v0_9/state/surface-model.test.js.map +0 -1
  330. package/dist/src/v0_9/test/test-utils.d.ts.map +0 -1
  331. package/dist/src/v0_9/test/test-utils.js.map +0 -1
  332. package/src/v0_8/data/guards.ts +0 -236
  333. package/src/v0_8/data/model-processor.ts +0 -855
  334. package/src/v0_8/events/validation-event.ts +0 -66
  335. package/src/v0_8/index.ts +0 -12
  336. package/src/v0_8/styles/behavior.ts +0 -55
  337. package/src/v0_8/styles/border.ts +0 -42
  338. package/src/v0_8/styles/colors.ts +0 -100
  339. package/src/v0_8/styles/icons.ts +0 -60
  340. package/src/v0_8/styles/index.ts +0 -37
  341. package/src/v0_8/styles/layout.ts +0 -235
  342. package/src/v0_8/styles/opacity.ts +0 -24
  343. package/src/v0_8/styles/shared.ts +0 -17
  344. package/src/v0_8/styles/type.ts +0 -156
  345. package/src/v0_8/styles/utils.ts +0 -104
  346. package/src/v0_8/types/client-event.ts +0 -80
  347. package/src/v0_8/types/colors.ts +0 -66
  348. package/src/v0_8/types/components.ts +0 -213
  349. package/src/v0_8/types/primitives.ts +0 -60
  350. package/src/v0_8/types/types.ts +0 -557
  351. package/src/v0_9/catalog/types.ts +0 -38
  352. package/src/v0_9/common/events.ts +0 -44
  353. package/src/v0_9/index.ts +0 -12
  354. package/src/v0_9/processing/message-processor.test.ts +0 -133
  355. package/src/v0_9/processing/message-processor.ts +0 -150
  356. package/src/v0_9/rendering/component-context.ts +0 -36
  357. package/src/v0_9/rendering/data-context.test.ts +0 -85
  358. package/src/v0_9/rendering/data-context.ts +0 -110
  359. package/src/v0_9/schema/common-types.ts +0 -125
  360. package/src/v0_9/schema/index.ts +0 -2
  361. package/src/v0_9/schema/server-to-client.ts +0 -23
  362. package/src/v0_9/state/component-model.test.ts +0 -50
  363. package/src/v0_9/state/component-model.ts +0 -32
  364. package/src/v0_9/state/data-model.test.ts +0 -257
  365. package/src/v0_9/state/data-model.ts +0 -239
  366. package/src/v0_9/state/surface-components-model.test.ts +0 -59
  367. package/src/v0_9/state/surface-components-model.ts +0 -48
  368. package/src/v0_9/state/surface-group-model.test.ts +0 -82
  369. package/src/v0_9/state/surface-group-model.ts +0 -66
  370. package/src/v0_9/state/surface-model.test.ts +0 -44
  371. package/src/v0_9/state/surface-model.ts +0 -39
  372. package/src/v0_9/test/test-utils.ts +0 -22
  373. /package/{dist/src → src}/v0_8/data/guards.d.ts +0 -0
  374. /package/{dist/src → src}/v0_8/data/guards.d.ts.map +0 -0
  375. /package/{dist/src → src}/v0_8/data/guards.js.map +0 -0
  376. /package/{dist/src → src}/v0_8/events/base.d.ts +0 -0
  377. /package/{dist/src → src}/v0_8/events/base.d.ts.map +0 -0
  378. /package/{dist/src → src}/v0_8/events/base.js +0 -0
  379. /package/{dist/src → src}/v0_8/events/base.js.map +0 -0
  380. /package/{dist/src → src}/v0_8/events/index.d.ts +0 -0
  381. /package/{dist/src → src}/v0_8/events/index.d.ts.map +0 -0
  382. /package/{dist/src → src}/v0_8/events/index.js +0 -0
  383. /package/{dist/src → src}/v0_8/events/index.js.map +0 -0
  384. /package/{dist/src → src}/v0_8/events/validation-event.d.ts +0 -0
  385. /package/{dist/src → src}/v0_8/events/validation-event.js +0 -0
  386. /package/{dist/src → src}/v0_8/schemas/a2ui_client_capabilities_schema.json +0 -0
  387. /package/{dist/src → src}/v0_8/schemas/catalog_description_schema.json +0 -0
  388. /package/{dist/src → src}/v0_8/schemas/client_to_server.json +0 -0
  389. /package/{dist/src → src}/v0_8/styles/behavior.d.ts +0 -0
  390. /package/{dist/src → src}/v0_8/styles/behavior.d.ts.map +0 -0
  391. /package/{dist/src → src}/v0_8/styles/behavior.js.map +0 -0
  392. /package/{dist/src → src}/v0_8/styles/border.d.ts +0 -0
  393. /package/{dist/src → src}/v0_8/styles/border.d.ts.map +0 -0
  394. /package/{dist/src → src}/v0_8/styles/border.js.map +0 -0
  395. /package/{dist/src → src}/v0_8/styles/colors.d.ts +0 -0
  396. /package/{dist/src → src}/v0_8/styles/colors.d.ts.map +0 -0
  397. /package/{dist/src → src}/v0_8/styles/index.d.ts +0 -0
  398. /package/{dist/src → src}/v0_8/styles/index.d.ts.map +0 -0
  399. /package/{dist/src → src}/v0_8/styles/index.js.map +0 -0
  400. /package/{dist/src → src}/v0_8/styles/layout.d.ts +0 -0
  401. /package/{dist/src → src}/v0_8/styles/layout.d.ts.map +0 -0
  402. /package/{dist/src → src}/v0_8/styles/opacity.d.ts +0 -0
  403. /package/{dist/src → src}/v0_8/styles/opacity.d.ts.map +0 -0
  404. /package/{dist/src → src}/v0_8/styles/opacity.js.map +0 -0
  405. /package/{dist/src → src}/v0_8/styles/shared.d.ts +0 -0
  406. /package/{dist/src → src}/v0_8/styles/shared.d.ts.map +0 -0
  407. /package/{dist/src → src}/v0_8/styles/shared.js.map +0 -0
  408. /package/{dist/src → src}/v0_8/styles/type.d.ts +0 -0
  409. /package/{dist/src → src}/v0_8/styles/type.d.ts.map +0 -0
  410. /package/{dist/src → src}/v0_8/styles/type.js.map +0 -0
  411. /package/{dist/src → src}/v0_8/styles/utils.d.ts +0 -0
  412. /package/{dist/src → src}/v0_8/styles/utils.d.ts.map +0 -0
  413. /package/{dist/src → src}/v0_8/styles/utils.js.map +0 -0
  414. /package/{dist/src → src}/v0_8/types/client-event.js.map +0 -0
  415. /package/{dist/src → src}/v0_8/types/colors.d.ts +0 -0
  416. /package/{dist/src → src}/v0_8/types/colors.d.ts.map +0 -0
  417. /package/{dist/src → src}/v0_8/types/colors.js.map +0 -0
  418. /package/{dist/src → src}/v0_8/types/components.js.map +0 -0
  419. /package/{dist/src → src}/v0_8/types/primitives.js.map +0 -0
  420. /package/{dist/src → src}/v0_8/types/types.js.map +0 -0
  421. /package/{dist/src → src}/v0_9/processing/message-processor.test.d.ts +0 -0
  422. /package/{dist/src → src}/v0_9/processing/message-processor.test.d.ts.map +0 -0
  423. /package/{dist/src → src}/v0_9/rendering/data-context.test.d.ts +0 -0
  424. /package/{dist/src → src}/v0_9/rendering/data-context.test.d.ts.map +0 -0
  425. /package/{dist/src → src}/v0_9/state/component-model.test.d.ts +0 -0
  426. /package/{dist/src → src}/v0_9/state/component-model.test.d.ts.map +0 -0
  427. /package/{dist/src → src}/v0_9/state/data-model.test.d.ts +0 -0
  428. /package/{dist/src → src}/v0_9/state/data-model.test.d.ts.map +0 -0
  429. /package/{dist/src → src}/v0_9/state/surface-components-model.test.d.ts +0 -0
  430. /package/{dist/src → src}/v0_9/state/surface-components-model.test.d.ts.map +0 -0
  431. /package/{dist/src → src}/v0_9/state/surface-group-model.test.d.ts +0 -0
  432. /package/{dist/src → src}/v0_9/state/surface-group-model.test.d.ts.map +0 -0
  433. /package/{dist/src → src}/v0_9/state/surface-model.test.d.ts +0 -0
  434. /package/{dist/src → src}/v0_9/state/surface-model.test.d.ts.map +0 -0
  435. /package/{dist/src → src}/v0_9/test/test-utils.d.ts +0 -0
@@ -0,0 +1,712 @@
1
+ /*
2
+ * Copyright 2025 Google LLC
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * https://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import assert from "node:assert";
17
+ import { describe, it, beforeEach } from "node:test";
18
+ import { A2uiMessageProcessor } from "./model-processor.js";
19
+ describe("A2uiMessageProcessor", () => {
20
+ let processor;
21
+ beforeEach(() => {
22
+ processor = new A2uiMessageProcessor();
23
+ });
24
+ it("handles beginRendering", () => {
25
+ processor.processMessages([
26
+ {
27
+ beginRendering: {
28
+ surfaceId: "s1",
29
+ root: "root",
30
+ styles: { font: "Arial" },
31
+ },
32
+ },
33
+ ]);
34
+ const surfaces = processor.getSurfaces();
35
+ const surface = surfaces.get("s1");
36
+ assert.ok(surface);
37
+ assert.strictEqual(surface.rootComponentId, "root");
38
+ assert.deepStrictEqual(surface.styles, { font: "Arial" });
39
+ // The component tree remains null until components are added via surfaceUpdate.
40
+ assert.strictEqual(surface.componentTree, null);
41
+ });
42
+ it("handles surfaceUpdate", () => {
43
+ processor.processMessages([
44
+ {
45
+ beginRendering: { surfaceId: "s1", root: "root" },
46
+ },
47
+ ]);
48
+ processor.processMessages([
49
+ {
50
+ surfaceUpdate: {
51
+ surfaceId: "s1",
52
+ components: [
53
+ {
54
+ id: "root",
55
+ component: {
56
+ Text: { text: { literal: "Hello" }, usageHint: "body" },
57
+ },
58
+ },
59
+ ],
60
+ },
61
+ },
62
+ ]);
63
+ const surface = processor.getSurfaces().get("s1");
64
+ assert.ok(surface);
65
+ assert.ok(surface.componentTree);
66
+ const root = surface.componentTree;
67
+ assert.strictEqual(root.id, "root");
68
+ assert.strictEqual(root.type, "Text");
69
+ // The property preserves the literal wrapper
70
+ assert.deepStrictEqual(root.properties.text, { literal: "Hello" });
71
+ });
72
+ it("handles dataModelUpdate", () => {
73
+ processor.processMessages([
74
+ {
75
+ beginRendering: { surfaceId: "s1", root: "root" },
76
+ },
77
+ {
78
+ dataModelUpdate: {
79
+ surfaceId: "s1",
80
+ contents: [{ key: "message", valueString: "World" }],
81
+ },
82
+ },
83
+ ]);
84
+ const surface = processor.getSurfaces().get("s1");
85
+ assert.strictEqual(surface?.dataModel.get("message"), "World");
86
+ });
87
+ it("handles deleteSurface", () => {
88
+ processor.processMessages([
89
+ {
90
+ beginRendering: { surfaceId: "s1", root: "root" },
91
+ },
92
+ ]);
93
+ assert.ok(processor.getSurfaces().has("s1"));
94
+ processor.processMessages([
95
+ {
96
+ deleteSurface: { surfaceId: "s1" },
97
+ },
98
+ ]);
99
+ assert.ok(!processor.getSurfaces().has("s1"));
100
+ });
101
+ it("resolves component references (children)", () => {
102
+ processor.processMessages([
103
+ { beginRendering: { surfaceId: "s1", root: "row" } },
104
+ {
105
+ surfaceUpdate: {
106
+ surfaceId: "s1",
107
+ components: [
108
+ {
109
+ id: "row",
110
+ component: {
111
+ Row: { children: { explicitList: ["t1", "t2"] } },
112
+ },
113
+ },
114
+ {
115
+ id: "t1",
116
+ component: {
117
+ Text: { text: { literal: "One" }, usageHint: "body" },
118
+ },
119
+ },
120
+ {
121
+ id: "t2",
122
+ component: {
123
+ Text: { text: { literal: "Two" }, usageHint: "body" },
124
+ },
125
+ },
126
+ ],
127
+ },
128
+ },
129
+ ]);
130
+ const surface = processor.getSurfaces().get("s1");
131
+ const root = surface?.componentTree;
132
+ assert.strictEqual(root.type, "Row");
133
+ assert.strictEqual(root.properties.children.length, 2);
134
+ assert.deepStrictEqual(root.properties.children[0].properties.text, { literal: "One" });
135
+ assert.deepStrictEqual(root.properties.children[1].properties.text, { literal: "Two" });
136
+ });
137
+ it("resolves templates", () => {
138
+ processor.processMessages([
139
+ { beginRendering: { surfaceId: "s1", root: "row" } },
140
+ {
141
+ dataModelUpdate: {
142
+ surfaceId: "s1",
143
+ contents: [
144
+ {
145
+ key: "items",
146
+ valueMap: [
147
+ { key: "0", valueString: "Item A" },
148
+ { key: "1", valueString: "Item B" },
149
+ ],
150
+ },
151
+ ],
152
+ },
153
+ },
154
+ {
155
+ surfaceUpdate: {
156
+ surfaceId: "s1",
157
+ components: [
158
+ {
159
+ id: "row",
160
+ component: {
161
+ Row: {
162
+ children: {
163
+ template: {
164
+ componentId: "item",
165
+ dataBinding: "/items",
166
+ },
167
+ },
168
+ },
169
+ },
170
+ },
171
+ {
172
+ id: "item",
173
+ component: {
174
+ Text: { text: { path: "." }, usageHint: "body" },
175
+ },
176
+ },
177
+ ],
178
+ },
179
+ },
180
+ ]);
181
+ const surface = processor.getSurfaces().get("s1");
182
+ const root = surface?.componentTree;
183
+ assert.strictEqual(root.type, "Row");
184
+ assert.strictEqual(root.properties.children.length, 2);
185
+ // Verify template expansion
186
+ const child0 = root.properties.children[0];
187
+ const child1 = root.properties.children[1];
188
+ // Check that binding paths are correct (processor does NOT resolve the value, just the binding path context)
189
+ assert.deepStrictEqual(child0.properties.text, { path: "." });
190
+ // Now verify we can resolve the data using the node's context
191
+ const textProp0 = child0.properties.text;
192
+ const resolvedValue0 = processor.getData(child0, textProp0.path, 's1');
193
+ assert.strictEqual(resolvedValue0, 'Item A');
194
+ const textProp1 = child1.properties.text;
195
+ const resolvedValue1 = processor.getData(child1, textProp1.path, 's1');
196
+ assert.strictEqual(resolvedValue1, 'Item B');
197
+ });
198
+ it("getData resolves paths relative to node context", () => {
199
+ processor.processMessages([
200
+ { beginRendering: { surfaceId: "s1", root: "root" } },
201
+ {
202
+ dataModelUpdate: {
203
+ surfaceId: "s1",
204
+ contents: [
205
+ { key: "user", valueMap: [{ key: "name", valueString: "Alice" }] },
206
+ ],
207
+ },
208
+ },
209
+ ]);
210
+ processor.getSurfaces().get("s1");
211
+ const node = { id: "test", dataContextPath: "/user" };
212
+ const name = processor.getData(node, "name", "s1");
213
+ assert.strictEqual(name, "Alice");
214
+ const self = processor.getData(node, ".", "s1");
215
+ assert.ok(self instanceof Map);
216
+ assert.strictEqual(self.get("name"), "Alice");
217
+ const rootData = processor.getData(node, "/user/name", "s1");
218
+ assert.strictEqual(rootData, "Alice");
219
+ });
220
+ it("setData updates data model", () => {
221
+ processor.processMessages([
222
+ { beginRendering: { surfaceId: "s1", root: "root" } },
223
+ ]);
224
+ const surface = processor.getSurfaces().get("s1");
225
+ const node = { id: "test", dataContextPath: "/" };
226
+ processor.setData(node, "count", 42, "s1");
227
+ assert.strictEqual(surface?.dataModel.get("count"), 42);
228
+ processor.setData(node, "/nested/value", "foo", "s1");
229
+ const nested = surface?.dataModel.get("nested");
230
+ assert.strictEqual(nested.get("value"), "foo");
231
+ });
232
+ it("normalizes paths correctly", () => {
233
+ const p = processor.normalizePath("users[0].name");
234
+ assert.strictEqual(p, "/users/0/name");
235
+ });
236
+ it("parses JSON strings in data", () => {
237
+ processor.processMessages([
238
+ { beginRendering: { surfaceId: "s1", root: "root" } },
239
+ ]);
240
+ // Explicitly testing private/internal parsing logic via public update
241
+ processor.processMessages([
242
+ {
243
+ dataModelUpdate: {
244
+ surfaceId: "s1",
245
+ contents: [{ key: "config", valueString: '{"theme":"dark"}' }],
246
+ },
247
+ },
248
+ ]);
249
+ const surface = processor.getSurfaces().get("s1");
250
+ const config = surface?.dataModel.get("config");
251
+ assert.deepStrictEqual(config, { theme: "dark" });
252
+ });
253
+ it("test basic edge cases and internal fallbacks", () => {
254
+ // 1. clearSurfaces
255
+ processor.processMessages([
256
+ { beginRendering: { surfaceId: "s1", root: "root" } },
257
+ ]);
258
+ assert.strictEqual(processor.getSurfaces().size, 1);
259
+ processor.clearSurfaces();
260
+ assert.strictEqual(processor.getSurfaces().size, 0);
261
+ // 2. setData with null node
262
+ processor.processMessages([
263
+ { beginRendering: { surfaceId: "s1", root: "root" } },
264
+ ]);
265
+ // Shouldn't throw
266
+ processor.setData(null, "foo", "bar");
267
+ // 3. setData with default data context (default to /)
268
+ const node = { id: "test", dataContextPath: undefined };
269
+ processor.setData(node, ".", "value");
270
+ const surface = processor.getSurfaces().get("s1");
271
+ assert.strictEqual(surface.dataModel.get("."), undefined); // Normal setDataByPath logic when root=/
272
+ // 4. parseIfJsonString with invalid JSON layout
273
+ processor.processMessages([
274
+ {
275
+ dataModelUpdate: {
276
+ surfaceId: "s1",
277
+ contents: [{ key: "badJson", valueString: '{bad" }' }],
278
+ },
279
+ },
280
+ ]);
281
+ assert.strictEqual(surface.dataModel.get("badJson"), '{bad" }'); // Returns original
282
+ // 5. convertKeyValueArrayToMap with missing valueKey
283
+ // Explicit array pass directly to internal mapping simulation
284
+ processor.setDataByPath(surface.dataModel, "malformed", [
285
+ { key: "foo", unknownKey: "bar" }, // missing value map/string etc
286
+ ]);
287
+ const malformed = surface.dataModel.get("malformed");
288
+ assert.strictEqual(malformed.has("foo"), false); // Skips processing
289
+ // 6. object normalization at root
290
+ processor.setDataByPath(surface.dataModel, "/", {
291
+ plain: "object",
292
+ });
293
+ assert.strictEqual(surface.dataModel.get("plain"), "object");
294
+ // 7. non-map/object root fails gracefully
295
+ processor.setDataByPath(surface.dataModel, "/", "stringroot");
296
+ // Doesn't explode, just prints error internally
297
+ });
298
+ it("test array set operations and invalid primitive traversal", () => {
299
+ processor.processMessages([
300
+ { beginRendering: { surfaceId: "s1", root: "root" } },
301
+ ]);
302
+ const surface = processor.getSurfaces().get("s1");
303
+ // Manually set an array to avoid empty array being converted to Map
304
+ surface.dataModel.set("list", ["dummy"]);
305
+ // Now it's an array at /list, set something deep inside it
306
+ processor.setDataByPath(surface.dataModel, "/list/0/name", "Alice");
307
+ // Also test setting a value directly on an array index
308
+ processor.setDataByPath(surface.dataModel, "/list/1", "Bob");
309
+ const list = surface.dataModel.get("list");
310
+ assert.strictEqual(list[0].get("name"), "Alice"); // It creates a Map for `name`
311
+ assert.strictEqual(list[1], "Bob");
312
+ // Test getDataByPath failing traversal over a primitive
313
+ processor.setDataByPath(surface.dataModel, "/primitive", "hello");
314
+ const result = processor.getDataByPath(surface.dataModel, "/primitive/invalid");
315
+ assert.strictEqual(result, null);
316
+ });
317
+ it("test tree rebuilding edge cases", () => {
318
+ processor.processMessages([
319
+ { beginRendering: { surfaceId: "s_tree", root: "root" } },
320
+ ]);
321
+ const surface = processor.getSurfaces().get("s_tree");
322
+ // 1. rebuildComponentTree without rootComponentId
323
+ surface.rootComponentId = null;
324
+ processor.rebuildComponentTree(surface);
325
+ assert.strictEqual(surface.componentTree, null);
326
+ // 2. Circular dependency
327
+ surface.rootComponentId = "circleA";
328
+ surface.components.set("circleA", {
329
+ id: "circleA",
330
+ component: { Row: { children: ["circleB"] } },
331
+ });
332
+ surface.components.set("circleB", {
333
+ id: "circleB",
334
+ component: { Row: { children: ["circleA"] } },
335
+ });
336
+ assert.throws(() => {
337
+ processor.rebuildComponentTree(surface);
338
+ }, /Circular dependency/);
339
+ });
340
+ it("throws A2uiValidationError for malformed components", () => {
341
+ processor.processMessages([
342
+ { beginRendering: { surfaceId: `s_bad_comp`, root: "bad" } },
343
+ ]);
344
+ const surface = processor.getSurfaces().get("s_bad_comp");
345
+ surface.rootComponentId = "bad";
346
+ // Divider is omitted here because it has no required fields, so `{}` is valid.
347
+ const types = [
348
+ "Text",
349
+ "Image",
350
+ "Icon",
351
+ "Video",
352
+ "AudioPlayer",
353
+ "Row",
354
+ "Column",
355
+ "List",
356
+ "Card",
357
+ "Tabs",
358
+ "Modal",
359
+ "Button",
360
+ "CheckBox",
361
+ "TextField",
362
+ "DateTimeInput",
363
+ "MultipleChoice",
364
+ "Slider",
365
+ ];
366
+ for (const type of types) {
367
+ assert.throws(() => {
368
+ surface.components.set("bad", {
369
+ id: "bad",
370
+ component: {
371
+ [type]: {
372
+ /* missing required fields */
373
+ },
374
+ },
375
+ });
376
+ processor.rebuildComponentTree(surface);
377
+ }, /Invalid data; expected/);
378
+ }
379
+ // Default catch-all (doesn't throw, just passes it through)
380
+ surface.components.set("bad", {
381
+ id: "bad",
382
+ component: { CustomWidget: { foo: "bar" } },
383
+ });
384
+ processor.rebuildComponentTree(surface);
385
+ assert.strictEqual(surface.componentTree.type, "CustomWidget");
386
+ });
387
+ it("resolves Template with Array data", () => {
388
+ processor.processMessages([
389
+ { beginRendering: { surfaceId: "s3_arr", root: "list" } },
390
+ {
391
+ dataModelUpdate: {
392
+ surfaceId: "s3_arr",
393
+ path: "/items",
394
+ contents: [
395
+ { key: "0", valueString: "a" },
396
+ { key: "1", valueString: "b" },
397
+ ],
398
+ },
399
+ },
400
+ ]);
401
+ const surface = processor.getSurfaces().get("s3_arr");
402
+ surface.components.set("list", {
403
+ id: "list",
404
+ component: {
405
+ List: {
406
+ children: {
407
+ template: { dataBinding: "/items", componentId: "item" },
408
+ },
409
+ },
410
+ },
411
+ });
412
+ surface.components.set("item", {
413
+ id: "item",
414
+ component: {
415
+ Text: { text: { literalString: "hello" }, usageHint: "body" },
416
+ },
417
+ });
418
+ processor.rebuildComponentTree(surface);
419
+ const root = surface.componentTree;
420
+ assert.strictEqual(root.properties.children.length, 2);
421
+ assert.strictEqual(root.properties.children[0].id, "item:0");
422
+ assert.strictEqual(root.properties.children[0].dataContextPath, "/items/0");
423
+ assert.strictEqual(root.properties.children[1].id, "item:1");
424
+ assert.strictEqual(root.properties.children[1].dataContextPath, "/items/1");
425
+ });
426
+ it("resolves Template with undefined/null data as empty array", () => {
427
+ processor.processMessages([
428
+ { beginRendering: { surfaceId: "s3_null", root: "list" } },
429
+ ]);
430
+ const surface = processor.getSurfaces().get("s3_null");
431
+ surface.components.set("list", {
432
+ id: "list",
433
+ component: {
434
+ List: {
435
+ children: {
436
+ template: { dataBinding: "/missingItems", componentId: "item" },
437
+ },
438
+ },
439
+ },
440
+ });
441
+ surface.components.set("item", {
442
+ id: "item",
443
+ component: {
444
+ Text: { text: { literalString: "hello" }, usageHint: "body" },
445
+ },
446
+ });
447
+ processor.rebuildComponentTree(surface);
448
+ const root = surface.componentTree;
449
+ assert.deepStrictEqual(root.properties.children, []);
450
+ });
451
+ it("sets primitive at path via single array element with dot key", () => {
452
+ processor.processMessages([
453
+ { beginRendering: { surfaceId: "s1_prim", root: "list" } },
454
+ {
455
+ dataModelUpdate: {
456
+ surfaceId: "s1_prim",
457
+ path: "/nested/item",
458
+ contents: [{ key: ".", valueString: "hello" }],
459
+ },
460
+ },
461
+ ]);
462
+ const surface = processor.getSurfaces().get("s1_prim");
463
+ surface.components.set("list", {
464
+ id: "list",
465
+ component: { Row: { children: { explicitList: [] } } },
466
+ });
467
+ processor.rebuildComponentTree(surface);
468
+ const root = surface.componentTree;
469
+ assert.strictEqual(processor.getData(root, "/nested/item", "s1_prim"), "hello");
470
+ // Test the fallback where valueString is absent but we pass something anyway
471
+ assert.throws(() => {
472
+ processor.processMessages([
473
+ {
474
+ dataModelUpdate: {
475
+ surfaceId: "s1_prim",
476
+ path: "/nested/malformed",
477
+ contents: [{ key: "." }],
478
+ },
479
+ },
480
+ ]);
481
+ }, /Value must have exactly one value property/);
482
+ });
483
+ it("path resolves through primitive objects and arrays", () => {
484
+ processor.processMessages([
485
+ { beginRendering: { surfaceId: "s1_path", root: "list" } },
486
+ ]);
487
+ const surface = processor.getSurfaces().get("s1_path");
488
+ surface.dataModel.set("obj", {
489
+ nestedMap: new Map([["index", [1, 2, { val: "hi" }]]]),
490
+ });
491
+ surface.components.set("list", {
492
+ id: "list",
493
+ component: { Row: { children: { explicitList: [] } } },
494
+ });
495
+ processor.rebuildComponentTree(surface);
496
+ const root = surface.componentTree;
497
+ assert.strictEqual(processor.getData(root, "/obj/nestedMap/index/2/val", "s1_path"), "hi");
498
+ assert.strictEqual(processor.getData(root, "/obj/nestedMap/index/2/val/deeper", "s1_path"), null);
499
+ });
500
+ it("builds all component types correctly", () => {
501
+ const surfaceId = "s_all";
502
+ processor.processMessages([{ beginRendering: { surfaceId, root: "col" } }]);
503
+ const surface = processor.getSurfaces().get(surfaceId);
504
+ const components = {
505
+ col: { Column: { children: ["row"] } },
506
+ row: { Row: { children: ["card"] } },
507
+ card: { Card: { child: "tabs" } },
508
+ tabs: {
509
+ Tabs: {
510
+ tabItems: [{ title: { literalString: "T1" }, child: "modal" }],
511
+ },
512
+ },
513
+ modal: { Modal: { entryPointChild: "list", contentChild: "div" } },
514
+ list: { List: { children: ["btn"] } },
515
+ btn: { Button: { child: "btn_txt", action: "act" } },
516
+ btn_txt: { Text: { text: { literalString: "Click" } } },
517
+ div: { Divider: {} },
518
+ chk: {
519
+ CheckBox: {
520
+ label: { literalString: "Chk" },
521
+ value: { literalBoolean: true },
522
+ },
523
+ },
524
+ txt: { TextField: { label: { literalString: "Txt" } } },
525
+ dt: { DateTimeInput: { value: { literalString: "2022-01-01" } } },
526
+ mc: { MultipleChoice: { selections: { literal: ["a"] } } },
527
+ sl: { Slider: { value: { literalNumber: 50 } } },
528
+ img: { Image: { url: { literalString: "http://img" } } },
529
+ icon: { Icon: { name: { literalString: "home" } } },
530
+ vid: { Video: { url: { literalString: "http://vid" } } },
531
+ aud: { AudioPlayer: { url: { literalString: "http://aud" } } },
532
+ };
533
+ for (const [id, comp] of Object.entries(components)) {
534
+ surface.components.set(id, { id, component: comp });
535
+ }
536
+ surface.components.set("root_all", {
537
+ id: "root_all",
538
+ component: {
539
+ Column: {
540
+ children: [
541
+ "col",
542
+ "chk",
543
+ "txt",
544
+ "dt",
545
+ "mc",
546
+ "sl",
547
+ "img",
548
+ "icon",
549
+ "vid",
550
+ "aud",
551
+ ],
552
+ },
553
+ },
554
+ });
555
+ surface.rootComponentId = "root_all";
556
+ processor.rebuildComponentTree(surface);
557
+ const root = surface.componentTree;
558
+ assert.strictEqual(root.type, "Column");
559
+ assert.strictEqual(root.properties.children.length, 10);
560
+ });
561
+ it("handles recursive valueMap in convertKeyValueArrayToMap", () => {
562
+ // We need to bypass private check or use a method that calls it.
563
+ // setData calls setDataByPath which calls convertKeyValueArrayToMap.
564
+ const update = {
565
+ surfaceId: "s_rec",
566
+ contents: [
567
+ {
568
+ key: "nested",
569
+ valueMap: [{ key: "inner", valueString: "val" }],
570
+ },
571
+ ], // Recursive generic type difficult to construct in TS literal
572
+ };
573
+ // We can use processMessages with dataModelUpdate.
574
+ processor.processMessages([
575
+ { beginRendering: { surfaceId: "s_rec", root: "root" } },
576
+ ]);
577
+ // Set root to Map first
578
+ const surface = processor.getSurfaces().get("s_rec");
579
+ surface.dataModel.set("junk", "ignored");
580
+ processor.processMessages([{ dataModelUpdate: update }]);
581
+ // Verify data
582
+ const nested = surface.dataModel.get("nested");
583
+ assert.strictEqual(nested instanceof Map, true);
584
+ assert.strictEqual(nested.get("inner"), "val");
585
+ });
586
+ it("resolves Template with Map data", () => {
587
+ processor.processMessages([
588
+ { beginRendering: { surfaceId: "s3_map", root: "list" } },
589
+ {
590
+ dataModelUpdate: {
591
+ surfaceId: "s3_map",
592
+ contents: [
593
+ {
594
+ key: "items",
595
+ valueMap: [
596
+ { key: "a", valueString: "valA" },
597
+ { key: "b", valueString: "valB" },
598
+ ],
599
+ },
600
+ ],
601
+ },
602
+ },
603
+ ]);
604
+ const surface = processor.getSurfaces().get("s3_map");
605
+ // Define components
606
+ surface.components.set("list", {
607
+ id: "list",
608
+ component: {
609
+ List: {
610
+ children: {
611
+ template: {
612
+ dataBinding: "/items",
613
+ componentId: "item",
614
+ },
615
+ },
616
+ },
617
+ },
618
+ });
619
+ surface.components.set("item", {
620
+ id: "item",
621
+ component: {
622
+ Text: { text: { path: "." } },
623
+ },
624
+ });
625
+ processor.rebuildComponentTree(surface);
626
+ const root = surface.componentTree;
627
+ assert.strictEqual(root.type, "List");
628
+ // Map entries should be processed.
629
+ assert.strictEqual(root.properties.children.length, 2);
630
+ });
631
+ it("handles Object-to-Map normalization in handleDataModelUpdate (direct call)", () => {
632
+ const surfaceId = "s_norm";
633
+ processor.processMessages([
634
+ { beginRendering: { surfaceId, root: "root" } },
635
+ ]);
636
+ const surface = processor.getSurfaces().get(surfaceId);
637
+ // Direct call to bypass Zod validation in processMessages
638
+ processor.handleDataModelUpdate({
639
+ surfaceId,
640
+ contents: { normalized: "value" },
641
+ }, surfaceId);
642
+ assert.strictEqual(surface.dataModel.get("normalized"), "value");
643
+ });
644
+ it("throws validation error for invalid List", () => {
645
+ const surfaceId = "s_bad_list";
646
+ processor.processMessages([
647
+ { beginRendering: { surfaceId, root: "badList" } },
648
+ ]);
649
+ const surface = processor.getSurfaces().get(surfaceId);
650
+ surface.components.set("badList", {
651
+ id: "badList",
652
+ component: { List: { children: "not-array" } },
653
+ });
654
+ assert.throws(() => {
655
+ processor.rebuildComponentTree(surface);
656
+ }, /Invalid data; expected List/);
657
+ });
658
+ it("handles recursive valueMap in convertKeyValueArrayToMap with dot key", () => {
659
+ const surfaceId = "s_dot_rec";
660
+ const surface = processor.getOrCreateSurface(surfaceId);
661
+ const value = [
662
+ {
663
+ key: ".",
664
+ valueMap: [{ key: "inner", valueString: "val" }],
665
+ },
666
+ ];
667
+ // Calling setDataByPath directly (private)
668
+ processor.setDataByPath(surface.dataModel, "/target", value);
669
+ const target = surface.dataModel.get("target");
670
+ assert.strictEqual(target instanceof Map, true);
671
+ assert.strictEqual(target.get("inner"), "val");
672
+ });
673
+ it("resolves Template with Array data (via direct setData)", () => {
674
+ const surfaceId = "s_direct_arr";
675
+ processor.processMessages([
676
+ { beginRendering: { surfaceId, root: "list" } },
677
+ ]);
678
+ const surface = processor.getSurfaces().get(surfaceId);
679
+ // Setup components
680
+ surface.components.set("list", {
681
+ id: "list",
682
+ component: {
683
+ List: {
684
+ children: {
685
+ template: {
686
+ dataBinding: "/items",
687
+ componentId: "item",
688
+ },
689
+ },
690
+ },
691
+ },
692
+ });
693
+ surface.components.set("item", {
694
+ id: "item",
695
+ component: {
696
+ Text: { text: { path: "." } },
697
+ },
698
+ });
699
+ // Direct set array to bypass normalization/schema
700
+ const itemsArray = ["A", "B"];
701
+ surface.dataModel.set("items", itemsArray);
702
+ processor.rebuildComponentTree(surface);
703
+ const root = surface.componentTree;
704
+ assert.strictEqual(root.type, "List");
705
+ assert.strictEqual(root.properties.children.length, 2);
706
+ });
707
+ it("ignores non-strings when trying to parse JSON", () => {
708
+ const result = processor.parseIfJsonString(123);
709
+ assert.strictEqual(result, 123);
710
+ });
711
+ });
712
+ //# sourceMappingURL=model-processor.test.js.map