@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,316 @@
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 { ExpressionParser } from '../expressions/expression_parser.js';
17
+ import { computed } from '@preact/signals-core';
18
+ import { createFunctionImplementation, isSignal, } from '../../catalog/types.js';
19
+ import { format } from 'date-fns';
20
+ import { AddApi, SubtractApi, MultiplyApi, DivideApi, EqualsApi, NotEqualsApi, GreaterThanApi, LessThanApi, AndApi, OrApi, NotApi, ContainsApi, StartsWithApi, EndsWithApi, RequiredApi, RegexApi, LengthApi, NumericApi, EmailApi, FormatStringApi, FormatNumberApi, FormatCurrencyApi, FormatDateApi, PluralizeApi, OpenUrlApi, } from './basic_functions_api.js';
21
+ import { A2uiExpressionError } from '../../errors.js';
22
+ // Arithmetic
23
+ /**
24
+ * Implementation of the addition function.
25
+ * Adds two numbers 'a' and 'b'.
26
+ */
27
+ export const AddImplementation = createFunctionImplementation(AddApi, args => args.a + args.b);
28
+ /**
29
+ * Implementation of the subtraction function.
30
+ * Subtracts 'b' from 'a'.
31
+ */
32
+ export const SubtractImplementation = createFunctionImplementation(SubtractApi, args => args.a - args.b);
33
+ /**
34
+ * Implementation of the multiplication function.
35
+ * Multiplies 'a' and 'b'.
36
+ */
37
+ export const MultiplyImplementation = createFunctionImplementation(MultiplyApi, args => args.a * args.b);
38
+ /**
39
+ * Implementation of the division function.
40
+ * Divides 'a' by 'b'. Returns NaN if inputs are invalid, and Infinity if dividing by zero.
41
+ */
42
+ export const DivideImplementation = createFunctionImplementation(DivideApi, args => {
43
+ const a = args.a;
44
+ const b = args.b;
45
+ if (a === undefined || a === null || b === undefined || b === null) {
46
+ return NaN;
47
+ }
48
+ const numA = Number(a);
49
+ const numB = Number(b);
50
+ if (Number.isNaN(numA) || Number.isNaN(numB)) {
51
+ return NaN;
52
+ }
53
+ if (numB === 0) {
54
+ return Infinity;
55
+ }
56
+ return numA / numB;
57
+ });
58
+ // Comparison
59
+ /**
60
+ * Implementation of the equality comparison.
61
+ * Checks if 'a' is strictly equal to 'b'.
62
+ */
63
+ export const EqualsImplementation = createFunctionImplementation(EqualsApi, args => args.a === args.b);
64
+ /**
65
+ * Implementation of the inequality comparison.
66
+ * Checks if 'a' is not strictly equal to 'b'.
67
+ */
68
+ export const NotEqualsImplementation = createFunctionImplementation(NotEqualsApi, args => args.a !== args.b);
69
+ /**
70
+ * Implementation of the greater-than comparison.
71
+ * Checks if 'a' is greater than 'b'.
72
+ */
73
+ export const GreaterThanImplementation = createFunctionImplementation(GreaterThanApi, args => args.a > args.b);
74
+ /**
75
+ * Implementation of the less-than comparison.
76
+ * Checks if 'a' is less than 'b'.
77
+ */
78
+ export const LessThanImplementation = createFunctionImplementation(LessThanApi, args => args.a < args.b);
79
+ // Logical
80
+ /**
81
+ * Implementation of the logical AND function.
82
+ * Returns true if all values in the array are truthy.
83
+ */
84
+ export const AndImplementation = createFunctionImplementation(AndApi, args => {
85
+ return args.values.every((v) => !!v);
86
+ });
87
+ /**
88
+ * Implementation of the logical OR function.
89
+ * Returns true if at least one value in the array is truthy.
90
+ */
91
+ export const OrImplementation = createFunctionImplementation(OrApi, args => {
92
+ return args.values.some((v) => !!v);
93
+ });
94
+ /**
95
+ * Implementation of the logical NOT function.
96
+ * Returns the negation of the value.
97
+ */
98
+ export const NotImplementation = createFunctionImplementation(NotApi, args => !args.value);
99
+ // String
100
+ /**
101
+ * Implementation of the string contains function.
102
+ * Checks if 'string' contains 'substring'.
103
+ */
104
+ export const ContainsImplementation = createFunctionImplementation(ContainsApi, args => args.string.includes(args.substring));
105
+ /**
106
+ * Implementation of the string starts-with function.
107
+ * Checks if 'string' starts with 'prefix'.
108
+ */
109
+ export const StartsWithImplementation = createFunctionImplementation(StartsWithApi, args => args.string.startsWith(args.prefix));
110
+ /**
111
+ * Implementation of the string ends-with function.
112
+ * Checks if 'string' ends with 'suffix'.
113
+ */
114
+ export const EndsWithImplementation = createFunctionImplementation(EndsWithApi, args => args.string.endsWith(args.suffix));
115
+ // Validation
116
+ /**
117
+ * Implementation of the required validation function.
118
+ * Checks if the value is not null, undefined, empty string, or empty array.
119
+ */
120
+ export const RequiredImplementation = createFunctionImplementation(RequiredApi, args => {
121
+ const val = args.value;
122
+ if (val === null || val === undefined)
123
+ return false;
124
+ if (typeof val === 'string' && val === '')
125
+ return false;
126
+ if (Array.isArray(val) && val.length === 0)
127
+ return false;
128
+ return true;
129
+ });
130
+ /**
131
+ * Implementation of the regex validation function.
132
+ * Checks if the value matches the regular expression pattern.
133
+ * Throws A2uiExpressionError if the pattern is invalid.
134
+ */
135
+ export const RegexImplementation = createFunctionImplementation(RegexApi, args => {
136
+ try {
137
+ return new RegExp(args.pattern).test(args.value);
138
+ }
139
+ catch (e) {
140
+ throw new A2uiExpressionError(`Invalid regex pattern: ${args.pattern}`, 'regex', e);
141
+ }
142
+ });
143
+ /**
144
+ * Implementation of the length validation function.
145
+ * Checks if the length of the string or array is within [min, max] range.
146
+ */
147
+ export const LengthImplementation = createFunctionImplementation(LengthApi, args => {
148
+ const val = args.value;
149
+ let len = 0;
150
+ if (typeof val === 'string' || Array.isArray(val)) {
151
+ len = val.length;
152
+ }
153
+ if (args.min !== undefined && !isNaN(args.min) && len < args.min)
154
+ return false;
155
+ if (args.max !== undefined && !isNaN(args.max) && len > args.max)
156
+ return false;
157
+ return true;
158
+ });
159
+ /**
160
+ * Implementation of the numeric validation function.
161
+ * Checks if the value is a number and within [min, max] range.
162
+ */
163
+ export const NumericImplementation = createFunctionImplementation(NumericApi, args => {
164
+ if (isNaN(args.value))
165
+ return false;
166
+ if (args.min !== undefined && !isNaN(args.min) && args.value < args.min)
167
+ return false;
168
+ if (args.max !== undefined && !isNaN(args.max) && args.value > args.max)
169
+ return false;
170
+ return true;
171
+ });
172
+ /**
173
+ * Implementation of the email validation function.
174
+ * Uses a simple regex to check if the value looks like an email address.
175
+ * Note: This is a basic check and not fully compliant with all email standards.
176
+ */
177
+ export const EmailImplementation = createFunctionImplementation(EmailApi, args => {
178
+ // TODO(gspencergoog): Use a "real" email validation function, preferably
179
+ // from an existing package. This is woefully insufficient, real email
180
+ // validation can't be done with a regex.
181
+ return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(args.value);
182
+ });
183
+ // Formatting
184
+ /**
185
+ * Implementation of the string formatting function.
186
+ * Parses a template string and resolves any embedded expressions using the provided context.
187
+ * Returns a computed signal that updates when referenced signals change.
188
+ */
189
+ export const FormatStringImplementation = createFunctionImplementation(FormatStringApi, (args, context) => {
190
+ const template = args.value;
191
+ const parser = new ExpressionParser();
192
+ const parts = parser.parse(template);
193
+ if (parts.length === 0)
194
+ return '';
195
+ const dynamicParts = parts.map(part => {
196
+ // If it's a literal string (or number/boolean/etc), keep it as is
197
+ if (typeof part !== 'object' || part === null || Array.isArray(part)) {
198
+ return part;
199
+ }
200
+ return context.resolveSignal(part);
201
+ });
202
+ return computed(() => {
203
+ return dynamicParts
204
+ .map(p => {
205
+ if (isSignal(p)) {
206
+ return p.value;
207
+ }
208
+ return p;
209
+ })
210
+ .join('');
211
+ });
212
+ });
213
+ /**
214
+ * Implementation of the number formatting function.
215
+ * Formats a number using Intl.NumberFormat with specified decimals and grouping.
216
+ */
217
+ export const FormatNumberImplementation = createFunctionImplementation(FormatNumberApi, args => {
218
+ if (isNaN(args.value))
219
+ return '';
220
+ return new Intl.NumberFormat('en-US', {
221
+ minimumFractionDigits: args.decimals,
222
+ maximumFractionDigits: args.decimals,
223
+ useGrouping: args.grouping,
224
+ }).format(args.value);
225
+ });
226
+ /**
227
+ * Implementation of the currency formatting function.
228
+ * Formats a number as currency using Intl.NumberFormat.
229
+ * Falls back to toFixed if formatting fails.
230
+ */
231
+ export const FormatCurrencyImplementation = createFunctionImplementation(FormatCurrencyApi, args => {
232
+ if (isNaN(args.value))
233
+ return '';
234
+ try {
235
+ return new Intl.NumberFormat('en-US', {
236
+ style: 'currency',
237
+ currency: args.currency,
238
+ minimumFractionDigits: args.decimals,
239
+ maximumFractionDigits: args.decimals,
240
+ useGrouping: args.grouping,
241
+ }).format(args.value);
242
+ }
243
+ catch {
244
+ return args.value.toFixed(args.decimals || 2);
245
+ }
246
+ });
247
+ /**
248
+ * Implementation of the date formatting function.
249
+ * Formats a date using date-fns or returns ISO string.
250
+ */
251
+ export const FormatDateImplementation = createFunctionImplementation(FormatDateApi, args => {
252
+ if (!args.value)
253
+ return '';
254
+ const date = new Date(args.value);
255
+ if (isNaN(date.getTime()))
256
+ return '';
257
+ try {
258
+ if (args.format === 'ISO')
259
+ return date.toISOString();
260
+ return format(date, args.format);
261
+ }
262
+ catch (e) {
263
+ console.warn('Error formatting date:', e);
264
+ return date.toISOString();
265
+ }
266
+ });
267
+ /**
268
+ * Implementation of the pluralization function.
269
+ * Selects the appropriate plural form based on the value using Intl.PluralRules.
270
+ */
271
+ export const PluralizeImplementation = createFunctionImplementation(PluralizeApi, args => {
272
+ const rule = new Intl.PluralRules('en-US').select(args.value);
273
+ return String(args[rule] ?? args.other ?? '');
274
+ });
275
+ // Actions
276
+ /**
277
+ * Implementation of the open URL action.
278
+ * Opens the specified URL in a new window/tab.
279
+ */
280
+ export const OpenUrlImplementation = createFunctionImplementation(OpenUrlApi, args => {
281
+ if (args.url && typeof window !== 'undefined' && window.open) {
282
+ window.open(args.url, '_blank');
283
+ }
284
+ });
285
+ /**
286
+ * Standard function implementations for the Basic Catalog.
287
+ * These functions cover arithmetic, comparison, logic, string manipulation, validation, and formatting.
288
+ */
289
+ export const BASIC_FUNCTIONS = [
290
+ AddImplementation,
291
+ SubtractImplementation,
292
+ MultiplyImplementation,
293
+ DivideImplementation,
294
+ EqualsImplementation,
295
+ NotEqualsImplementation,
296
+ GreaterThanImplementation,
297
+ LessThanImplementation,
298
+ AndImplementation,
299
+ OrImplementation,
300
+ NotImplementation,
301
+ ContainsImplementation,
302
+ StartsWithImplementation,
303
+ EndsWithImplementation,
304
+ RequiredImplementation,
305
+ RegexImplementation,
306
+ LengthImplementation,
307
+ NumericImplementation,
308
+ EmailImplementation,
309
+ FormatStringImplementation,
310
+ FormatNumberImplementation,
311
+ FormatCurrencyImplementation,
312
+ FormatDateImplementation,
313
+ PluralizeImplementation,
314
+ OpenUrlImplementation,
315
+ ];
316
+ //# sourceMappingURL=basic_functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic_functions.js","sourceRoot":"","sources":["../../../../../src/v0_9/basic_catalog/functions/basic_functions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=basic_functions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basic_functions.test.d.ts","sourceRoot":"","sources":["../../../../../src/v0_9/basic_catalog/functions/basic_functions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,301 @@
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 { describe, it } from 'node:test';
17
+ import * as assert from 'node:assert';
18
+ import { effect } from '@preact/signals-core';
19
+ import { BASIC_FUNCTIONS } from './basic_functions.js';
20
+ import { DataModel } from '../../state/data-model.js';
21
+ import { DataContext } from '../../rendering/data-context.js';
22
+ import { A2uiExpressionError } from '../../errors.js';
23
+ import { Catalog } from '../../catalog/types.js';
24
+ const testCatalog = new Catalog('test', [], BASIC_FUNCTIONS);
25
+ function invoke(name, args, context) {
26
+ return testCatalog.invoker(name, args, context);
27
+ }
28
+ const createTestDataContext = (model, path, functionInvoker = testCatalog.invoker) => {
29
+ const mockSurface = {
30
+ dataModel: model,
31
+ catalog: { invoker: functionInvoker },
32
+ dispatchError: () => { },
33
+ };
34
+ return new DataContext(mockSurface, path);
35
+ };
36
+ describe('BASIC_FUNCTIONS', () => {
37
+ const dataModel = new DataModel({ a: 10, b: 20 });
38
+ const context = createTestDataContext(dataModel, '/');
39
+ describe('Arithmetic', () => {
40
+ it('add', () => {
41
+ assert.strictEqual(invoke('add', { a: 1, b: 2 }, context), 3);
42
+ assert.strictEqual(invoke('add', { a: '1', b: '2' }, context), 3);
43
+ assert.throws(() => invoke('add', { a: 10, b: undefined }, context), A2uiExpressionError);
44
+ assert.throws(() => invoke('add', { a: 10 }, context), A2uiExpressionError);
45
+ });
46
+ it('subtract', () => {
47
+ assert.strictEqual(invoke('subtract', { a: 5, b: 3 }, context), 2);
48
+ assert.throws(() => invoke('subtract', { a: 10, b: undefined }, context), A2uiExpressionError);
49
+ assert.throws(() => invoke('subtract', { a: 10 }, context), A2uiExpressionError);
50
+ });
51
+ it('multiply', () => {
52
+ assert.strictEqual(invoke('multiply', { a: 4, b: 2 }, context), 8);
53
+ assert.throws(() => invoke('multiply', { a: 10, b: undefined }, context), A2uiExpressionError);
54
+ assert.throws(() => invoke('multiply', { a: 10 }, context), A2uiExpressionError);
55
+ });
56
+ it('divide', () => {
57
+ assert.strictEqual(invoke('divide', { a: 10, b: 2 }, context), 5);
58
+ assert.strictEqual(invoke('divide', { a: 10, b: 0 }, context), Infinity);
59
+ assert.throws(() => invoke('divide', { a: 10, b: undefined }, context), A2uiExpressionError);
60
+ assert.throws(() => invoke('divide', { a: undefined, b: 10 }, context), A2uiExpressionError);
61
+ assert.throws(() => invoke('divide', { a: undefined, b: undefined }, context), A2uiExpressionError);
62
+ assert.throws(() => invoke('divide', { a: 10, b: null }, context), A2uiExpressionError);
63
+ assert.throws(() => invoke('divide', { a: 10, b: 'invalid' }, context), A2uiExpressionError);
64
+ assert.strictEqual(invoke('divide', { a: 10, b: '2' }, context), 5);
65
+ assert.strictEqual(invoke('divide', { a: '10', b: '2' }, context), 5);
66
+ });
67
+ });
68
+ describe('Comparison', () => {
69
+ it('equals', () => {
70
+ assert.strictEqual(invoke('equals', { a: 1, b: 1 }, context), true);
71
+ assert.strictEqual(invoke('equals', { a: 1, b: 2 }, context), false);
72
+ assert.throws(() => invoke('equals', { a: 1 }, context), A2uiExpressionError);
73
+ assert.throws(() => invoke('equals', { b: 1 }, context), A2uiExpressionError);
74
+ });
75
+ it('not_equals', () => {
76
+ assert.strictEqual(invoke('not_equals', { a: 1, b: 2 }, context), true);
77
+ assert.throws(() => invoke('not_equals', { a: 1 }, context), A2uiExpressionError);
78
+ assert.throws(() => invoke('not_equals', { b: 1 }, context), A2uiExpressionError);
79
+ });
80
+ it('greater_than', () => {
81
+ assert.strictEqual(invoke('greater_than', { a: 5, b: 3 }, context), true);
82
+ assert.strictEqual(invoke('greater_than', { a: 3, b: 5 }, context), false);
83
+ assert.throws(() => invoke('greater_than', { a: 10, b: undefined }, context), A2uiExpressionError);
84
+ assert.throws(() => invoke('greater_than', { a: 10, b: null }, context), A2uiExpressionError);
85
+ assert.throws(() => invoke('greater_than', { a: 10, b: 'invalid' }, context), A2uiExpressionError);
86
+ assert.throws(() => invoke('greater_than', { a: 10 }, context), A2uiExpressionError);
87
+ assert.throws(() => invoke('greater_than', { b: 10 }, context), A2uiExpressionError);
88
+ });
89
+ it('less_than', () => {
90
+ assert.strictEqual(invoke('less_than', { a: 3, b: 5 }, context), true);
91
+ assert.throws(() => invoke('less_than', { a: 3, b: undefined }, context), A2uiExpressionError);
92
+ assert.throws(() => invoke('less_than', { a: 3, b: null }, context), A2uiExpressionError);
93
+ assert.throws(() => invoke('less_than', { a: 3, b: 'invalid' }, context), A2uiExpressionError);
94
+ assert.throws(() => invoke('less_than', { a: 3 }, context), A2uiExpressionError);
95
+ assert.throws(() => invoke('less_than', { b: 3 }, context), A2uiExpressionError);
96
+ });
97
+ });
98
+ describe('Logical', () => {
99
+ it('and', () => {
100
+ // Checks args['values'] array OR args['a'] && args['b'].
101
+ assert.strictEqual(invoke('and', { values: [true, true] }, context), true);
102
+ assert.strictEqual(invoke('and', { values: [true, false] }, context), false);
103
+ assert.throws(() => invoke('and', { values: [true] }, context), A2uiExpressionError);
104
+ assert.throws(() => invoke('and', {}, context), A2uiExpressionError);
105
+ });
106
+ it('or', () => {
107
+ assert.strictEqual(invoke('or', { values: [false, true] }, context), true);
108
+ assert.strictEqual(invoke('or', { values: [false, false] }, context), false);
109
+ assert.throws(() => invoke('or', { values: [true] }, context), A2uiExpressionError);
110
+ assert.throws(() => invoke('or', {}, context), A2uiExpressionError);
111
+ });
112
+ it('not', () => {
113
+ assert.strictEqual(invoke('not', { value: false }, context), true);
114
+ assert.strictEqual(invoke('not', { value: true }, context), false);
115
+ assert.throws(() => invoke('not', {}, context), A2uiExpressionError);
116
+ });
117
+ });
118
+ describe('String', () => {
119
+ it('contains', () => {
120
+ assert.strictEqual(invoke('contains', { string: 'hello world', substring: 'world' }, context), true);
121
+ assert.strictEqual(invoke('contains', { string: 'hello world', substring: 'foo' }, context), false);
122
+ assert.throws(() => invoke('contains', { string: 'hello' }, context), A2uiExpressionError);
123
+ assert.throws(() => invoke('contains', { substring: 'hello' }, context), A2uiExpressionError);
124
+ });
125
+ it('starts_with', () => {
126
+ assert.strictEqual(invoke('starts_with', { string: 'hello', prefix: 'he' }, context), true);
127
+ assert.throws(() => invoke('starts_with', { string: 'hello' }, context), A2uiExpressionError);
128
+ assert.throws(() => invoke('starts_with', { prefix: 'he' }, context), A2uiExpressionError);
129
+ });
130
+ it('ends_with', () => {
131
+ assert.strictEqual(invoke('ends_with', { string: 'hello', suffix: 'lo' }, context), true);
132
+ assert.throws(() => invoke('ends_with', { string: 'hello' }, context), A2uiExpressionError);
133
+ assert.throws(() => invoke('ends_with', { suffix: 'lo' }, context), A2uiExpressionError);
134
+ });
135
+ });
136
+ describe('Validation', () => {
137
+ it('required', () => {
138
+ assert.strictEqual(invoke('required', { value: 'a' }, context), true);
139
+ assert.strictEqual(invoke('required', { value: '' }, context), false);
140
+ assert.strictEqual(invoke('required', { value: null }, context), false);
141
+ assert.throws(() => invoke('required', {}, context), A2uiExpressionError);
142
+ });
143
+ it('length', () => {
144
+ assert.strictEqual(invoke('length', { value: 'abc', min: 2 }, context), true);
145
+ assert.strictEqual(invoke('length', { value: 'abc', max: 2 }, context), false);
146
+ assert.throws(() => invoke('length', {}, context), A2uiExpressionError);
147
+ });
148
+ it('numeric', () => {
149
+ assert.strictEqual(invoke('numeric', { value: 10, min: 5, max: 15 }, context), true);
150
+ assert.strictEqual(invoke('numeric', { value: 3, min: 5 }, context), false);
151
+ assert.throws(() => invoke('numeric', {}, context), A2uiExpressionError);
152
+ });
153
+ it('email', () => {
154
+ assert.strictEqual(invoke('email', { value: 'test@example.com' }, context), true);
155
+ assert.strictEqual(invoke('email', { value: 'test.name@example.com' }, context), true);
156
+ assert.strictEqual(invoke('email', { value: 'test+label@example.com' }, context), true);
157
+ assert.strictEqual(invoke('email', { value: 'test@example-domain.com' }, context), true);
158
+ assert.strictEqual(invoke('email', { value: 'invalid' }, context), false);
159
+ assert.strictEqual(invoke('email', { value: 'test@test' }, context), false);
160
+ assert.strictEqual(invoke('email', { value: 'test@test.c' }, context), false);
161
+ assert.strictEqual(invoke('email', { value: 'test@.com' }, context), false);
162
+ assert.throws(() => invoke('email', {}, context), A2uiExpressionError);
163
+ });
164
+ it('regex', () => {
165
+ assert.strictEqual(invoke('regex', { value: 'abc', pattern: '^[a-z]+$' }, context), true);
166
+ assert.strictEqual(invoke('regex', { value: '123', pattern: '^[a-z]+$' }, context), false);
167
+ });
168
+ it('regex handles invalid pattern', () => {
169
+ assert.throws(() => invoke('regex', { value: 'abc', pattern: '[' }, context), A2uiExpressionError);
170
+ });
171
+ });
172
+ describe('Formatting', () => {
173
+ it('formatString (static literal)', (_, done) => {
174
+ const result = invoke('formatString', { value: 'hello world' }, context);
175
+ let cleanup;
176
+ // Required to pass a reference to cleanup() into th effect(). Probably
177
+ // worth cleaning up at some point.
178
+ // eslint-disable-next-line prefer-const
179
+ cleanup = effect(() => {
180
+ const val = result.value;
181
+ if (val) {
182
+ assert.strictEqual(val, 'hello world');
183
+ if (cleanup)
184
+ cleanup();
185
+ done();
186
+ }
187
+ });
188
+ });
189
+ it('formatString (with data binding)', (_, done) => {
190
+ // Assuming dataModel has { "a": 10 } from setup
191
+ const result = invoke('formatString', { value: 'Value: ${a}' }, context);
192
+ let emitCount = 0;
193
+ let cleanup;
194
+ // Required to pass a reference to cleanup() into th effect(). Probably
195
+ // worth cleaning up at some point.
196
+ // eslint-disable-next-line prefer-const
197
+ cleanup = effect(() => {
198
+ const val = result.value;
199
+ try {
200
+ if (emitCount === 0) {
201
+ assert.strictEqual(val, 'Value: 10');
202
+ emitCount++;
203
+ // Trigger a change in the next tick to avoid uninitialized sub
204
+ setTimeout(() => {
205
+ dataModel.set('/a', 42);
206
+ }, 0);
207
+ }
208
+ else if (emitCount === 1) {
209
+ assert.strictEqual(val, 'Value: 42');
210
+ emitCount++;
211
+ if (cleanup)
212
+ cleanup();
213
+ done();
214
+ }
215
+ }
216
+ catch (e) {
217
+ if (cleanup)
218
+ cleanup();
219
+ done(e);
220
+ }
221
+ });
222
+ });
223
+ it('formatString (with function call)', (_, done) => {
224
+ // Need a functionInvoker for function calls
225
+ const ctxWithInvoker = createTestDataContext(dataModel, '/', (name, args) => {
226
+ if (name === 'add') {
227
+ return Number(args['a']) + Number(args['b']);
228
+ }
229
+ return null;
230
+ });
231
+ const result = invoke('formatString', { value: 'Result: ${add(a: 5, b: 7)}' }, ctxWithInvoker);
232
+ let cleanup;
233
+ // Required to pass a reference to cleanup() into th effect(). Probably
234
+ // worth cleaning up at some point.
235
+ // eslint-disable-next-line prefer-const
236
+ cleanup = effect(() => {
237
+ const val = result.value;
238
+ if (val) {
239
+ assert.strictEqual(val, 'Result: 12');
240
+ if (cleanup)
241
+ cleanup();
242
+ done();
243
+ }
244
+ });
245
+ });
246
+ it('formatNumber', () => {
247
+ // Test basic output as Intl behavior varies by environment.
248
+ const result = invoke('formatNumber', { value: 1234.56, decimals: 1 }, context);
249
+ assert.ok(typeof result === 'string');
250
+ assert.ok(result.includes('1,234.6') ||
251
+ result.includes('1234.6') ||
252
+ result.includes('1 234,6'));
253
+ });
254
+ it('formatCurrency', () => {
255
+ const result = invoke('formatCurrency', { value: 1234.56, currency: 'USD' }, context);
256
+ assert.ok(typeof result === 'string');
257
+ assert.ok(result.includes('1,234.56') || result.includes('1234.56'));
258
+ assert.ok(result.includes('$') || result.includes('USD'));
259
+ });
260
+ it('formatDate', () => {
261
+ const result = invoke('formatDate', { value: '2025-01-01T12:00:00Z', format: 'yyyy-MM-dd' }, context);
262
+ assert.strictEqual(result, '2025-01-01');
263
+ const resultISO = invoke('formatDate', { value: '2025-01-01T12:00:00Z', format: 'ISO' }, context);
264
+ assert.strictEqual(resultISO, '2025-01-01T12:00:00.000Z');
265
+ });
266
+ it('formatDate handles invalid dates', () => {
267
+ const result = invoke('formatDate', { value: 'invalid-date', format: 'yyyy' }, context);
268
+ assert.strictEqual(result, '');
269
+ });
270
+ it('formatCurrency fallback on formatting error', () => {
271
+ const result = invoke('formatCurrency', { value: 1234.56, currency: 'INVALID-CURRENCY', decimals: 2 }, context);
272
+ // Fallbacks to toFixed
273
+ assert.strictEqual(result, '1234.56');
274
+ });
275
+ it('pluralize', () => {
276
+ assert.strictEqual(invoke('pluralize', { value: 1, one: 'apple', other: 'apples' }, context), 'apple');
277
+ assert.strictEqual(invoke('pluralize', { value: 2, one: 'apple', other: 'apples' }, context), 'apples');
278
+ });
279
+ });
280
+ describe('Actions', () => {
281
+ it('openUrl', () => {
282
+ // Set up mock window object
283
+ const originalWindow = global.window;
284
+ let openedUrl = '';
285
+ global.window = {
286
+ open: (url) => {
287
+ openedUrl = url;
288
+ },
289
+ };
290
+ try {
291
+ invoke('openUrl', { url: 'https://google.com' }, context);
292
+ assert.strictEqual(openedUrl, 'https://google.com');
293
+ assert.throws(() => invoke('openUrl', {}, context), A2uiExpressionError);
294
+ }
295
+ finally {
296
+ global.window = originalWindow;
297
+ }
298
+ });
299
+ });
300
+ });
301
+ //# sourceMappingURL=basic_functions.test.js.map