@nyaruka/temba-components 0.131.1 → 0.131.2

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 (427) hide show
  1. package/.github/workflows/publish.yml +4 -1
  2. package/CHANGELOG.md +61 -1
  3. package/demo/data/flows/food-order.json +2 -2
  4. package/demo/data/flows/sample-flow.json +74 -125
  5. package/dist/static/svg/index.svg +1 -1
  6. package/dist/temba-components.js +1155 -618
  7. package/dist/temba-components.js.map +1 -1
  8. package/out-tsc/src/Icons.js +4 -1
  9. package/out-tsc/src/Icons.js.map +1 -1
  10. package/out-tsc/src/events.js.map +1 -1
  11. package/out-tsc/src/flow/CanvasMenu.js +200 -0
  12. package/out-tsc/src/flow/CanvasMenu.js.map +1 -0
  13. package/out-tsc/src/flow/CanvasNode.js +327 -19
  14. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  15. package/out-tsc/src/flow/Editor.js +562 -66
  16. package/out-tsc/src/flow/Editor.js.map +1 -1
  17. package/out-tsc/src/flow/NodeEditor.js +240 -93
  18. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  19. package/out-tsc/src/flow/NodeTypeSelector.js +499 -0
  20. package/out-tsc/src/flow/NodeTypeSelector.js.map +1 -0
  21. package/out-tsc/src/flow/actions/add_contact_groups.js +3 -3
  22. package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
  23. package/out-tsc/src/flow/actions/add_contact_urn.js +62 -4
  24. package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
  25. package/out-tsc/src/flow/actions/add_input_labels.js +3 -3
  26. package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
  27. package/out-tsc/src/flow/actions/play_audio.js +2 -2
  28. package/out-tsc/src/flow/actions/play_audio.js.map +1 -1
  29. package/out-tsc/src/flow/actions/remove_contact_groups.js +6 -5
  30. package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
  31. package/out-tsc/src/flow/actions/request_optin.js +2 -2
  32. package/out-tsc/src/flow/actions/request_optin.js.map +1 -1
  33. package/out-tsc/src/flow/actions/say_msg.js +2 -2
  34. package/out-tsc/src/flow/actions/say_msg.js.map +1 -1
  35. package/out-tsc/src/flow/actions/send_broadcast.js +76 -23
  36. package/out-tsc/src/flow/actions/send_broadcast.js.map +1 -1
  37. package/out-tsc/src/flow/actions/send_email.js +4 -5
  38. package/out-tsc/src/flow/actions/send_email.js.map +1 -1
  39. package/out-tsc/src/flow/actions/send_msg.js +9 -19
  40. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  41. package/out-tsc/src/flow/actions/set_contact_channel.js +5 -9
  42. package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
  43. package/out-tsc/src/flow/actions/set_contact_field.js +19 -20
  44. package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
  45. package/out-tsc/src/flow/actions/set_contact_language.js +2 -2
  46. package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
  47. package/out-tsc/src/flow/actions/set_contact_name.js +2 -12
  48. package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
  49. package/out-tsc/src/flow/actions/set_contact_status.js +2 -2
  50. package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
  51. package/out-tsc/src/flow/actions/set_run_result.js +3 -3
  52. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  53. package/out-tsc/src/flow/actions/start_session.js +180 -6
  54. package/out-tsc/src/flow/actions/start_session.js.map +1 -1
  55. package/out-tsc/src/flow/config.js +11 -15
  56. package/out-tsc/src/flow/config.js.map +1 -1
  57. package/out-tsc/src/flow/currencies.js +45 -0
  58. package/out-tsc/src/flow/currencies.js.map +1 -0
  59. package/out-tsc/src/flow/nodes/shared-rules.js +257 -0
  60. package/out-tsc/src/flow/nodes/shared-rules.js.map +1 -0
  61. package/out-tsc/src/flow/nodes/shared.js +17 -0
  62. package/out-tsc/src/flow/nodes/shared.js.map +1 -0
  63. package/out-tsc/src/flow/nodes/split_by_airtime.js +205 -5
  64. package/out-tsc/src/flow/nodes/split_by_airtime.js.map +1 -1
  65. package/out-tsc/src/flow/nodes/split_by_contact_field.js +147 -3
  66. package/out-tsc/src/flow/nodes/split_by_contact_field.js.map +1 -1
  67. package/out-tsc/src/flow/nodes/split_by_expression.js +68 -2
  68. package/out-tsc/src/flow/nodes/split_by_expression.js.map +1 -1
  69. package/out-tsc/src/flow/nodes/split_by_groups.js +12 -9
  70. package/out-tsc/src/flow/nodes/split_by_groups.js.map +1 -1
  71. package/out-tsc/src/flow/nodes/split_by_intent.js +7 -0
  72. package/out-tsc/src/flow/nodes/split_by_intent.js.map +1 -0
  73. package/out-tsc/src/flow/nodes/split_by_llm.js +3 -2
  74. package/out-tsc/src/flow/nodes/split_by_llm.js.map +1 -1
  75. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js +2 -2
  76. package/out-tsc/src/flow/nodes/split_by_llm_categorize.js.map +1 -1
  77. package/out-tsc/src/flow/nodes/split_by_random.js +3 -3
  78. package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
  79. package/out-tsc/src/flow/nodes/split_by_resthook.js +108 -0
  80. package/out-tsc/src/flow/nodes/split_by_resthook.js.map +1 -0
  81. package/out-tsc/src/flow/nodes/split_by_run_result.js +206 -3
  82. package/out-tsc/src/flow/nodes/split_by_run_result.js.map +1 -1
  83. package/out-tsc/src/flow/nodes/split_by_scheme.js +153 -2
  84. package/out-tsc/src/flow/nodes/split_by_scheme.js.map +1 -1
  85. package/out-tsc/src/flow/nodes/split_by_subflow.js +6 -4
  86. package/out-tsc/src/flow/nodes/split_by_subflow.js.map +1 -1
  87. package/out-tsc/src/flow/nodes/split_by_ticket.js +3 -2
  88. package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -1
  89. package/out-tsc/src/flow/nodes/split_by_webhook.js +3 -2
  90. package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
  91. package/out-tsc/src/flow/nodes/wait_for_audio.js +2 -2
  92. package/out-tsc/src/flow/nodes/wait_for_audio.js.map +1 -1
  93. package/out-tsc/src/flow/nodes/wait_for_digits.js +2 -2
  94. package/out-tsc/src/flow/nodes/wait_for_digits.js.map +1 -1
  95. package/out-tsc/src/flow/nodes/wait_for_image.js +2 -2
  96. package/out-tsc/src/flow/nodes/wait_for_image.js.map +1 -1
  97. package/out-tsc/src/flow/nodes/wait_for_location.js +2 -2
  98. package/out-tsc/src/flow/nodes/wait_for_location.js.map +1 -1
  99. package/out-tsc/src/flow/nodes/wait_for_menu.js +2 -2
  100. package/out-tsc/src/flow/nodes/wait_for_menu.js.map +1 -1
  101. package/out-tsc/src/flow/nodes/wait_for_response.js +32 -567
  102. package/out-tsc/src/flow/nodes/wait_for_response.js.map +1 -1
  103. package/out-tsc/src/flow/nodes/wait_for_video.js +2 -2
  104. package/out-tsc/src/flow/nodes/wait_for_video.js.map +1 -1
  105. package/out-tsc/src/flow/types.js +71 -12
  106. package/out-tsc/src/flow/types.js.map +1 -1
  107. package/out-tsc/src/flow/utils.js +101 -14
  108. package/out-tsc/src/flow/utils.js.map +1 -1
  109. package/out-tsc/src/form/FieldRenderer.js +2 -4
  110. package/out-tsc/src/form/FieldRenderer.js.map +1 -1
  111. package/out-tsc/src/interfaces.js +3 -0
  112. package/out-tsc/src/interfaces.js.map +1 -1
  113. package/out-tsc/src/list/SortableList.js +98 -33
  114. package/out-tsc/src/list/SortableList.js.map +1 -1
  115. package/out-tsc/src/live/ContactChat.js +15 -18
  116. package/out-tsc/src/live/ContactChat.js.map +1 -1
  117. package/out-tsc/src/store/AppState.js +53 -0
  118. package/out-tsc/src/store/AppState.js.map +1 -1
  119. package/out-tsc/src/utils.js +254 -13
  120. package/out-tsc/src/utils.js.map +1 -1
  121. package/out-tsc/temba-modules.js +4 -0
  122. package/out-tsc/temba-modules.js.map +1 -1
  123. package/out-tsc/test/ActionHelper.js +3 -3
  124. package/out-tsc/test/ActionHelper.js.map +1 -1
  125. package/out-tsc/test/NodeHelper.js +6 -3
  126. package/out-tsc/test/NodeHelper.js.map +1 -1
  127. package/out-tsc/test/actions/add_contact_urn.test.js +202 -0
  128. package/out-tsc/test/actions/add_contact_urn.test.js.map +1 -0
  129. package/out-tsc/test/actions/send_broadcast.test.js +148 -0
  130. package/out-tsc/test/actions/send_broadcast.test.js.map +1 -0
  131. package/out-tsc/test/actions/send_email.test.js +17 -23
  132. package/out-tsc/test/actions/send_email.test.js.map +1 -1
  133. package/out-tsc/test/actions/send_msg.test.js +33 -15
  134. package/out-tsc/test/actions/send_msg.test.js.map +1 -1
  135. package/out-tsc/test/actions/start_session.test.js +116 -0
  136. package/out-tsc/test/actions/start_session.test.js.map +1 -0
  137. package/out-tsc/test/nodes/split_by_airtime.test.js +604 -0
  138. package/out-tsc/test/nodes/split_by_airtime.test.js.map +1 -0
  139. package/out-tsc/test/nodes/split_by_contact_field.test.js +387 -0
  140. package/out-tsc/test/nodes/split_by_contact_field.test.js.map +1 -0
  141. package/out-tsc/test/nodes/split_by_expression.test.js +614 -0
  142. package/out-tsc/test/nodes/split_by_expression.test.js.map +1 -0
  143. package/out-tsc/test/nodes/split_by_random.test.js +3 -3
  144. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
  145. package/out-tsc/test/nodes/split_by_resthook.test.js +337 -0
  146. package/out-tsc/test/nodes/split_by_resthook.test.js.map +1 -0
  147. package/out-tsc/test/nodes/split_by_run_result.test.js +920 -0
  148. package/out-tsc/test/nodes/split_by_run_result.test.js.map +1 -0
  149. package/out-tsc/test/nodes/split_by_scheme.test.js +399 -0
  150. package/out-tsc/test/nodes/split_by_scheme.test.js.map +1 -0
  151. package/out-tsc/test/nodes/split_by_subflow.test.js +333 -0
  152. package/out-tsc/test/nodes/split_by_subflow.test.js.map +1 -0
  153. package/out-tsc/test/nodes/wait_for_digits.test.js +2 -2
  154. package/out-tsc/test/nodes/wait_for_digits.test.js.map +1 -1
  155. package/out-tsc/test/nodes/wait_for_response.test.js +2 -1
  156. package/out-tsc/test/nodes/wait_for_response.test.js.map +1 -1
  157. package/out-tsc/test/temba-action-drag-between-nodes.test.js +252 -0
  158. package/out-tsc/test/temba-action-drag-between-nodes.test.js.map +1 -0
  159. package/out-tsc/test/temba-canvas-menu.test.js +122 -0
  160. package/out-tsc/test/temba-canvas-menu.test.js.map +1 -0
  161. package/out-tsc/test/temba-flow-editor-node.test.js +85 -2
  162. package/out-tsc/test/temba-flow-editor-node.test.js.map +1 -1
  163. package/out-tsc/test/temba-flow-editor.test.js +7 -8
  164. package/out-tsc/test/temba-flow-editor.test.js.map +1 -1
  165. package/out-tsc/test/temba-node-editor.test.js +3 -1
  166. package/out-tsc/test/temba-node-editor.test.js.map +1 -1
  167. package/out-tsc/test/temba-node-type-selector.test.js +115 -0
  168. package/out-tsc/test/temba-node-type-selector.test.js.map +1 -0
  169. package/out-tsc/test/temba-omnibox.test.js +2 -1
  170. package/out-tsc/test/temba-omnibox.test.js.map +1 -1
  171. package/out-tsc/test/temba-sortable-list.test.js +51 -0
  172. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  173. package/out-tsc/test/temba-utils-index.test.js +1 -27
  174. package/out-tsc/test/temba-utils-index.test.js.map +1 -1
  175. package/out-tsc/test/utils.test.js +2 -0
  176. package/out-tsc/test/utils.test.js.map +1 -1
  177. package/package.json +2 -1
  178. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  179. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  180. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  181. package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
  182. package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
  183. package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
  184. package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
  185. package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
  186. package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
  187. package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
  188. package/screenshots/truth/actions/add_contact_urn/editor/expression-facebook.png +0 -0
  189. package/screenshots/truth/actions/add_contact_urn/editor/expression-phone.png +0 -0
  190. package/screenshots/truth/actions/add_contact_urn/editor/facebook-id.png +0 -0
  191. package/screenshots/truth/actions/add_contact_urn/editor/instagram-handle.png +0 -0
  192. package/screenshots/truth/actions/add_contact_urn/editor/line-id.png +0 -0
  193. package/screenshots/truth/actions/add_contact_urn/editor/phone-number.png +0 -0
  194. package/screenshots/truth/actions/add_contact_urn/editor/telegram-id.png +0 -0
  195. package/screenshots/truth/actions/add_contact_urn/editor/viber-id.png +0 -0
  196. package/screenshots/truth/actions/add_contact_urn/editor/wechat-id.png +0 -0
  197. package/screenshots/truth/actions/add_contact_urn/editor/whatsapp.png +0 -0
  198. package/screenshots/truth/actions/add_contact_urn/render/expression-facebook.png +0 -0
  199. package/screenshots/truth/actions/add_contact_urn/render/expression-phone.png +0 -0
  200. package/screenshots/truth/actions/add_contact_urn/render/facebook-id.png +0 -0
  201. package/screenshots/truth/actions/add_contact_urn/render/instagram-handle.png +0 -0
  202. package/screenshots/truth/actions/add_contact_urn/render/line-id.png +0 -0
  203. package/screenshots/truth/actions/add_contact_urn/render/phone-number.png +0 -0
  204. package/screenshots/truth/actions/add_contact_urn/render/telegram-id.png +0 -0
  205. package/screenshots/truth/actions/add_contact_urn/render/viber-id.png +0 -0
  206. package/screenshots/truth/actions/add_contact_urn/render/wechat-id.png +0 -0
  207. package/screenshots/truth/actions/add_contact_urn/render/whatsapp.png +0 -0
  208. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  209. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  210. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  211. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  212. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  213. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  214. package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
  215. package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
  216. package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
  217. package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
  218. package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
  219. package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
  220. package/screenshots/truth/actions/send_broadcast/editor/contacts-only.png +0 -0
  221. package/screenshots/truth/actions/send_broadcast/editor/groups-and-contacts.png +0 -0
  222. package/screenshots/truth/actions/send_broadcast/editor/groups-only.png +0 -0
  223. package/screenshots/truth/actions/send_broadcast/editor/many-groups.png +0 -0
  224. package/screenshots/truth/actions/send_broadcast/editor/multiline-text.png +0 -0
  225. package/screenshots/truth/actions/send_broadcast/editor/with-attachments.png +0 -0
  226. package/screenshots/truth/actions/send_broadcast/render/contacts-only.png +0 -0
  227. package/screenshots/truth/actions/send_broadcast/render/groups-and-contacts.png +0 -0
  228. package/screenshots/truth/actions/send_broadcast/render/groups-only.png +0 -0
  229. package/screenshots/truth/actions/send_broadcast/render/many-groups.png +0 -0
  230. package/screenshots/truth/actions/send_broadcast/render/multiline-text.png +0 -0
  231. package/screenshots/truth/actions/send_broadcast/render/with-attachments.png +0 -0
  232. package/screenshots/truth/actions/send_email/editor/complex-business-email.png +0 -0
  233. package/screenshots/truth/actions/send_email/editor/empty-body.png +0 -0
  234. package/screenshots/truth/actions/send_email/editor/empty-subject.png +0 -0
  235. package/screenshots/truth/actions/send_email/editor/long-subject.png +0 -0
  236. package/screenshots/truth/actions/send_email/editor/multiline-body.png +0 -0
  237. package/screenshots/truth/actions/send_email/editor/multiple-recipients.png +0 -0
  238. package/screenshots/truth/actions/send_email/editor/simple-email.png +0 -0
  239. package/screenshots/truth/actions/send_email/editor/with-expressions.png +0 -0
  240. package/screenshots/truth/actions/send_email/render/complex-business-email.png +0 -0
  241. package/screenshots/truth/actions/send_email/render/empty-body.png +0 -0
  242. package/screenshots/truth/actions/send_email/render/empty-subject.png +0 -0
  243. package/screenshots/truth/actions/send_email/render/long-subject.png +0 -0
  244. package/screenshots/truth/actions/send_email/render/multiline-body.png +0 -0
  245. package/screenshots/truth/actions/send_email/render/multiple-recipients.png +0 -0
  246. package/screenshots/truth/actions/send_email/render/simple-email.png +0 -0
  247. package/screenshots/truth/actions/send_email/render/with-expressions.png +0 -0
  248. package/screenshots/truth/actions/send_msg/editor/long-quick-replies.png +0 -0
  249. package/screenshots/truth/actions/send_msg/editor/multiline-text-with-replies.png +0 -0
  250. package/screenshots/truth/actions/send_msg/editor/simple-text.png +0 -0
  251. package/screenshots/truth/actions/send_msg/editor/text-with-linebreaks.png +0 -0
  252. package/screenshots/truth/actions/send_msg/editor/text-with-many-quick-replies.png +0 -0
  253. package/screenshots/truth/actions/send_msg/editor/text-with-quick-replies.png +0 -0
  254. package/screenshots/truth/actions/send_msg/editor/text-without-quick-replies.png +0 -0
  255. package/screenshots/truth/actions/send_msg/render/long-quick-replies.png +0 -0
  256. package/screenshots/truth/actions/send_msg/render/multiline-text-with-replies.png +0 -0
  257. package/screenshots/truth/actions/send_msg/render/simple-text.png +0 -0
  258. package/screenshots/truth/actions/send_msg/render/text-with-linebreaks.png +0 -0
  259. package/screenshots/truth/actions/send_msg/render/text-with-many-quick-replies.png +0 -0
  260. package/screenshots/truth/actions/send_msg/render/text-with-quick-replies.png +0 -0
  261. package/screenshots/truth/actions/send_msg/render/text-without-quick-replies.png +0 -0
  262. package/screenshots/truth/actions/start_session/editor/contact-query.png +0 -0
  263. package/screenshots/truth/actions/start_session/editor/contacts-only.png +0 -0
  264. package/screenshots/truth/actions/start_session/editor/create-contact.png +0 -0
  265. package/screenshots/truth/actions/start_session/editor/groups-and-contacts.png +0 -0
  266. package/screenshots/truth/actions/start_session/editor/groups-only.png +0 -0
  267. package/screenshots/truth/actions/start_session/editor/many-recipients.png +0 -0
  268. package/screenshots/truth/actions/start_session/render/contact-query.png +0 -0
  269. package/screenshots/truth/actions/start_session/render/contacts-only.png +0 -0
  270. package/screenshots/truth/actions/start_session/render/create-contact.png +0 -0
  271. package/screenshots/truth/actions/start_session/render/groups-and-contacts.png +0 -0
  272. package/screenshots/truth/actions/start_session/render/groups-only.png +0 -0
  273. package/screenshots/truth/actions/start_session/render/many-recipients.png +0 -0
  274. package/screenshots/truth/canvas-menu/open.png +0 -0
  275. package/screenshots/truth/editor/router.png +0 -0
  276. package/screenshots/truth/editor/wait.png +0 -0
  277. package/screenshots/truth/list/fields-dragging.png +0 -0
  278. package/screenshots/truth/list/sortable-dragging.png +0 -0
  279. package/screenshots/truth/node-type-selector/action-mode.png +0 -0
  280. package/screenshots/truth/node-type-selector/split-mode.png +0 -0
  281. package/screenshots/truth/nodes/split_by_llm/editor/information-extraction.png +0 -0
  282. package/screenshots/truth/nodes/split_by_llm/editor/sentiment-analysis.png +0 -0
  283. package/screenshots/truth/nodes/split_by_llm/editor/summarization.png +0 -0
  284. package/screenshots/truth/nodes/split_by_llm/editor/translation-task.png +0 -0
  285. package/screenshots/truth/nodes/split_by_llm/render/information-extraction.png +0 -0
  286. package/screenshots/truth/nodes/split_by_llm/render/sentiment-analysis.png +0 -0
  287. package/screenshots/truth/nodes/split_by_llm/render/summarization.png +0 -0
  288. package/screenshots/truth/nodes/split_by_llm/render/translation-task.png +0 -0
  289. package/screenshots/truth/nodes/split_by_llm_categorize/editor/basic-categorization.png +0 -0
  290. package/screenshots/truth/nodes/split_by_llm_categorize/editor/custom-input-and-result-name.png +0 -0
  291. package/screenshots/truth/nodes/split_by_llm_categorize/editor/feedback-categorization.png +0 -0
  292. package/screenshots/truth/nodes/split_by_llm_categorize/editor/many-categories.png +0 -0
  293. package/screenshots/truth/nodes/split_by_llm_categorize/editor/minimal-categories.png +0 -0
  294. package/screenshots/truth/nodes/split_by_llm_categorize/render/basic-categorization.png +0 -0
  295. package/screenshots/truth/nodes/split_by_llm_categorize/render/custom-input-and-result-name.png +0 -0
  296. package/screenshots/truth/nodes/split_by_llm_categorize/render/feedback-categorization.png +0 -0
  297. package/screenshots/truth/nodes/split_by_llm_categorize/render/many-categories.png +0 -0
  298. package/screenshots/truth/nodes/split_by_llm_categorize/render/minimal-categories.png +0 -0
  299. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  300. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  301. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  302. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  303. package/screenshots/truth/nodes/split_by_random/render/ab-test-multiple-variants.png +0 -0
  304. package/screenshots/truth/nodes/split_by_random/render/sampling-split.png +0 -0
  305. package/screenshots/truth/nodes/split_by_random/render/three-way-split.png +0 -0
  306. package/screenshots/truth/nodes/split_by_random/render/two-bucket-split.png +0 -0
  307. package/screenshots/truth/nodes/wait_for_digits/editor/basic-digits-wait.png +0 -0
  308. package/screenshots/truth/nodes/wait_for_digits/editor/phone-number-collection.png +0 -0
  309. package/screenshots/truth/nodes/wait_for_digits/editor/single-digit-with-timeout.png +0 -0
  310. package/screenshots/truth/nodes/wait_for_digits/editor/verification-code.png +0 -0
  311. package/screenshots/truth/nodes/wait_for_digits/render/basic-digits-wait.png +0 -0
  312. package/screenshots/truth/nodes/wait_for_digits/render/phone-number-collection.png +0 -0
  313. package/screenshots/truth/nodes/wait_for_digits/render/single-digit-with-timeout.png +0 -0
  314. package/screenshots/truth/nodes/wait_for_digits/render/verification-code.png +0 -0
  315. package/screenshots/truth/nodes/wait_for_response/editor/basic-wait.png +0 -0
  316. package/screenshots/truth/nodes/wait_for_response/editor/custom-result-name.png +0 -0
  317. package/screenshots/truth/nodes/wait_for_response/editor/no-timeout.png +0 -0
  318. package/screenshots/truth/nodes/wait_for_response/editor/short-timeout.png +0 -0
  319. package/screenshots/truth/nodes/wait_for_response/render/basic-wait.png +0 -0
  320. package/screenshots/truth/nodes/wait_for_response/render/custom-result-name.png +0 -0
  321. package/screenshots/truth/nodes/wait_for_response/render/no-timeout.png +0 -0
  322. package/screenshots/truth/nodes/wait_for_response/render/short-timeout.png +0 -0
  323. package/src/Icons.ts +4 -1
  324. package/src/events.ts +2 -6
  325. package/src/flow/CanvasMenu.ts +217 -0
  326. package/src/flow/CanvasNode.ts +408 -10
  327. package/src/flow/Editor.ts +683 -44
  328. package/src/flow/NodeEditor.ts +304 -125
  329. package/src/flow/NodeTypeSelector.ts +592 -0
  330. package/src/flow/actions/add_contact_groups.ts +4 -4
  331. package/src/flow/actions/add_contact_urn.ts +76 -4
  332. package/src/flow/actions/add_input_labels.ts +4 -4
  333. package/src/flow/actions/play_audio.ts +2 -2
  334. package/src/flow/actions/remove_contact_groups.ts +14 -6
  335. package/src/flow/actions/request_optin.ts +2 -2
  336. package/src/flow/actions/say_msg.ts +2 -2
  337. package/src/flow/actions/send_broadcast.ts +85 -23
  338. package/src/flow/actions/send_email.ts +10 -6
  339. package/src/flow/actions/send_msg.ts +22 -32
  340. package/src/flow/actions/set_contact_channel.ts +5 -11
  341. package/src/flow/actions/set_contact_field.ts +20 -25
  342. package/src/flow/actions/set_contact_language.ts +9 -4
  343. package/src/flow/actions/set_contact_name.ts +3 -15
  344. package/src/flow/actions/set_contact_status.ts +3 -3
  345. package/src/flow/actions/set_run_result.ts +4 -4
  346. package/src/flow/actions/start_session.ts +208 -6
  347. package/src/flow/config.ts +13 -15
  348. package/src/flow/currencies.ts +51 -0
  349. package/src/flow/nodes/shared-rules.ts +301 -0
  350. package/src/flow/nodes/shared.ts +18 -0
  351. package/src/flow/nodes/split_by_airtime.ts +238 -5
  352. package/src/flow/nodes/split_by_contact_field.ts +185 -3
  353. package/src/flow/nodes/split_by_expression.ts +94 -2
  354. package/src/flow/nodes/split_by_groups.ts +15 -10
  355. package/src/flow/nodes/split_by_intent.ts +7 -0
  356. package/src/flow/nodes/split_by_llm.ts +4 -3
  357. package/src/flow/nodes/split_by_llm_categorize.ts +4 -4
  358. package/src/flow/nodes/split_by_random.ts +5 -5
  359. package/src/flow/nodes/split_by_resthook.ts +130 -0
  360. package/src/flow/nodes/split_by_run_result.ts +249 -3
  361. package/src/flow/nodes/split_by_scheme.ts +192 -2
  362. package/src/flow/nodes/split_by_subflow.ts +6 -4
  363. package/src/flow/nodes/split_by_ticket.ts +4 -3
  364. package/src/flow/nodes/split_by_webhook.ts +6 -5
  365. package/src/flow/nodes/wait_for_audio.ts +2 -2
  366. package/src/flow/nodes/wait_for_digits.ts +2 -2
  367. package/src/flow/nodes/wait_for_image.ts +2 -2
  368. package/src/flow/nodes/wait_for_location.ts +2 -2
  369. package/src/flow/nodes/wait_for_menu.ts +2 -2
  370. package/src/flow/nodes/wait_for_response.ts +48 -679
  371. package/src/flow/nodes/wait_for_video.ts +2 -2
  372. package/src/flow/types.ts +109 -23
  373. package/src/flow/utils.ts +108 -14
  374. package/src/form/FieldRenderer.ts +2 -4
  375. package/src/interfaces.ts +3 -0
  376. package/src/list/SortableList.ts +109 -34
  377. package/src/live/ContactChat.ts +15 -18
  378. package/src/store/AppState.ts +69 -0
  379. package/src/store/flow-definition.d.ts +2 -5
  380. package/src/utils.ts +332 -12
  381. package/static/api/channels.json +46 -0
  382. package/static/api/resthooks.json +31 -0
  383. package/static/svg/index.svg +1 -1
  384. package/static/svg/work/traced/lightning-02.svg +1 -0
  385. package/static/svg/work/used/lightning-02.svg +3 -0
  386. package/temba-modules.ts +4 -0
  387. package/test/ActionHelper.ts +3 -3
  388. package/test/NodeHelper.ts +6 -3
  389. package/test/actions/add_contact_urn.test.ts +287 -0
  390. package/test/actions/send_broadcast.test.ts +190 -0
  391. package/test/actions/send_email.test.ts +17 -23
  392. package/test/actions/send_msg.test.ts +39 -15
  393. package/test/actions/start_session.test.ts +151 -0
  394. package/test/nodes/split_by_airtime.test.ts +673 -0
  395. package/test/nodes/split_by_contact_field.test.ts +451 -0
  396. package/test/nodes/split_by_expression.test.ts +751 -0
  397. package/test/nodes/split_by_random.test.ts +3 -3
  398. package/test/nodes/split_by_resthook.test.ts +398 -0
  399. package/test/nodes/split_by_run_result.test.ts +1109 -0
  400. package/test/nodes/split_by_scheme.test.ts +486 -0
  401. package/test/nodes/split_by_subflow.test.ts +381 -0
  402. package/test/nodes/wait_for_digits.test.ts +2 -2
  403. package/test/nodes/wait_for_response.test.ts +2 -1
  404. package/test/temba-action-drag-between-nodes.test.ts +301 -0
  405. package/test/temba-canvas-menu.test.ts +156 -0
  406. package/test/temba-flow-editor-node.test.ts +102 -2
  407. package/test/temba-flow-editor.test.ts +7 -8
  408. package/test/temba-node-editor.test.ts +3 -1
  409. package/test/temba-node-type-selector.test.ts +152 -0
  410. package/test/temba-omnibox.test.ts +2 -1
  411. package/test/temba-sortable-list.test.ts +69 -0
  412. package/test/temba-utils-index.test.ts +0 -35
  413. package/test/utils.test.ts +2 -0
  414. package/test-assets/contacts/history.json +14 -20
  415. package/web-dev-server.config.mjs +3 -1
  416. package/out-tsc/src/flow/actions/call_classifier.js +0 -11
  417. package/out-tsc/src/flow/actions/call_classifier.js.map +0 -1
  418. package/out-tsc/src/flow/actions/call_resthook.js +0 -11
  419. package/out-tsc/src/flow/actions/call_resthook.js.map +0 -1
  420. package/out-tsc/src/flow/actions/split_by_expression_example.js +0 -77
  421. package/out-tsc/src/flow/actions/split_by_expression_example.js.map +0 -1
  422. package/out-tsc/src/flow/actions/transfer_airtime.js +0 -11
  423. package/out-tsc/src/flow/actions/transfer_airtime.js.map +0 -1
  424. package/src/flow/actions/call_classifier.ts +0 -12
  425. package/src/flow/actions/call_resthook.ts +0 -12
  426. package/src/flow/actions/split_by_expression_example.ts +0 -88
  427. package/src/flow/actions/transfer_airtime.ts +0 -12
@@ -1 +1 @@
1
- {"version":3,"file":"temba-utils-index.test.js","sourceRoot":"","sources":["../../test/temba-utils-index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { stub, SinonStub } from 'sinon';\nimport {\n log,\n getHTTPCookie,\n getHeaders,\n getClasses,\n plural,\n range,\n hexToRgb,\n truncate,\n oxford,\n oxfordFn,\n oxfordNamed,\n capitalize,\n formatFileType,\n formatFileSize,\n isImageAttachment,\n stopEvent,\n hslToHex,\n hashCode,\n showModax,\n debounce,\n throttle,\n timeSince,\n isDate,\n getCookie,\n getCookieBoolean,\n setCookie,\n serialize,\n renderIf,\n getElementOffset,\n isElementVisible,\n getScrollParent,\n stubbable,\n renderAvatar,\n fillTemplate,\n spreadAttributes,\n getUrl,\n postUrl,\n postJSON,\n postFormData,\n postForm,\n fetchResultsPage,\n fetchResults,\n getAssetPage,\n getAssets,\n getDialog,\n DEFAULT_MEDIA_ENDPOINT,\n Color,\n COOKIE_KEYS\n} from '../src/utils';\nimport { mockGET, mockPOST, clearMockPosts } from './utils.test';\n\ndescribe('utils/index', () => {\n describe('constants', () => {\n it('exports expected constants', () => {\n expect(DEFAULT_MEDIA_ENDPOINT).to.equal('/api/v2/media.json');\n expect(Color.BLUE).to.equal('color:#5078b5;');\n expect(Color.GREEN).to.equal('color:#62bd6a;');\n expect(Color.RED).to.equal('color:#e36049;');\n expect(Color.PURPLE).to.equal('color:#a626a4;');\n expect(COOKIE_KEYS.SETTINGS).to.equal('settings');\n expect(COOKIE_KEYS.MENU_COLLAPSED).to.equal('menu-collapsed');\n expect(COOKIE_KEYS.TICKET_SHOW_DETAILS).to.equal('tickets.show-details');\n });\n });\n\n describe('log', () => {\n let consoleLogStub: SinonStub;\n\n beforeEach(() => {\n consoleLogStub = stub(console, 'log');\n });\n\n afterEach(() => {\n consoleLogStub.restore();\n });\n\n it('logs a simple message without styling', () => {\n log('test message');\n expect(consoleLogStub.calledOnceWith('test message')).to.be.true;\n });\n\n it('logs an object with styling', () => {\n const obj = { test: 'value' };\n log(obj, 'color: red;');\n expect(\n consoleLogStub.calledOnceWith(\n '%c' + JSON.stringify(obj, null, 2),\n 'color: red;'\n )\n ).to.be.true;\n });\n\n it('logs a string with styling and details', () => {\n log('test message', 'color: blue;', ['detail1', 'detail2']);\n expect(\n consoleLogStub.calledOnceWith(\n '%ctest message',\n 'color: blue;',\n 'detail1',\n 'detail2'\n )\n ).to.be.true;\n });\n });\n\n describe('getHTTPCookie', () => {\n afterEach(() => {\n // clear cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('returns null for non-existent cookie', () => {\n expect(getHTTPCookie('nonexistent')).to.be.null;\n });\n\n it('returns cookie value when it exists', () => {\n document.cookie = 'testcookie=testvalue; path=/';\n expect(getHTTPCookie('testcookie')).to.equal('testvalue');\n });\n\n it('handles cookies with spaces', () => {\n document.cookie = ' spacedcookie = spacedvalue ; path=/';\n expect(getHTTPCookie('spacedcookie')).to.equal('spacedvalue');\n });\n\n it('returns first matching cookie when multiple exist', () => {\n document.cookie = 'cookie1=value1; path=/';\n document.cookie = 'cookie2=value2; path=/';\n expect(getHTTPCookie('cookie1')).to.equal('value1');\n expect(getHTTPCookie('cookie2')).to.equal('value2');\n });\n });\n\n describe('getHeaders', () => {\n let originalOrgId: any;\n let csrfTokenElement: HTMLInputElement;\n\n beforeEach(() => {\n originalOrgId = (window as any).org_id;\n\n // clear existing CSRF token element\n const existing = document.querySelector('[name=csrfmiddlewaretoken]');\n if (existing) {\n existing.remove();\n }\n });\n\n afterEach(() => {\n // clear cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n\n (window as any).org_id = originalOrgId;\n\n if (csrfTokenElement) {\n csrfTokenElement.remove();\n }\n });\n\n it('builds basic headers with XMLHttpRequest marker', () => {\n const headers = getHeaders();\n expect(headers['X-Requested-With']).to.equal('XMLHttpRequest');\n });\n\n it('includes CSRF token from cookie', () => {\n document.cookie = 'csrftoken=test-csrf-token; path=/';\n const headers = getHeaders();\n expect(headers['X-CSRFToken']).to.equal('test-csrf-token');\n });\n\n it('includes CSRF token from form element when cookie not available', () => {\n csrfTokenElement = document.createElement('input');\n csrfTokenElement.name = 'csrfmiddlewaretoken';\n csrfTokenElement.value = 'form-csrf-token';\n document.body.appendChild(csrfTokenElement);\n\n const headers = getHeaders();\n expect(headers['X-CSRFToken']).to.equal('form-csrf-token');\n });\n\n it('includes org id when available', () => {\n (window as any).org_id = '123';\n const headers = getHeaders();\n expect(headers['X-Temba-Org']).to.equal('123');\n });\n\n it('merges provided headers', () => {\n const headers = getHeaders({ 'Custom-Header': 'custom-value' });\n expect(headers['Custom-Header']).to.equal('custom-value');\n expect(headers['X-Requested-With']).to.equal('XMLHttpRequest');\n });\n\n it('removes X-Temba-Org when X-Temba-Service-Org is provided', () => {\n (window as any).org_id = '123';\n const headers = getHeaders({ 'X-Temba-Service-Org': 'service-org' });\n expect(headers['X-Temba-Org']).to.be.undefined;\n expect(headers['X-Temba-Service-Org']).to.equal('service-org');\n });\n });\n\n describe('getClasses', () => {\n it('returns empty string for empty map', () => {\n expect(getClasses({})).to.equal('');\n });\n\n it('returns single class when one is true', () => {\n expect(getClasses({ active: true })).to.equal('active');\n });\n\n it('returns multiple classes when multiple are true', () => {\n const result = getClasses({\n active: true,\n disabled: true,\n hidden: false\n });\n expect(result).to.equal('active disabled');\n });\n\n it('ignores false values', () => {\n expect(getClasses({ active: true, disabled: false })).to.equal('active');\n });\n\n it('trims whitespace correctly', () => {\n expect(getClasses({ class1: true, class2: true })).to.equal(\n 'class1 class2'\n );\n });\n });\n\n describe('plural', () => {\n it('returns singular for count of 1', () => {\n expect(plural(1, 'item', 'items')).to.equal('item');\n });\n\n it('returns plural for count of 0', () => {\n expect(plural(0, 'item', 'items')).to.equal('items');\n });\n\n it('returns plural for count greater than 1', () => {\n expect(plural(5, 'item', 'items')).to.equal('items');\n });\n\n it('returns plural for negative counts', () => {\n expect(plural(-1, 'item', 'items')).to.equal('items');\n });\n });\n\n describe('range', () => {\n it('generates range from 0 to 5', () => {\n expect(range(0, 5)).to.deep.equal([0, 1, 2, 3, 4]);\n });\n\n it('generates range from 2 to 6', () => {\n expect(range(2, 6)).to.deep.equal([2, 3, 4, 5]);\n });\n\n it('generates empty array when start equals end', () => {\n expect(range(3, 3)).to.deep.equal([]);\n });\n\n it('handles negative ranges', () => {\n expect(range(-2, 2)).to.deep.equal([-2, -1, 0, 1]);\n });\n });\n\n describe('hexToRgb', () => {\n it('converts valid hex to RGB', () => {\n expect(hexToRgb('#ff0000')).to.deep.equal({ r: 255, g: 0, b: 0 });\n });\n\n it('converts hex without hash to RGB', () => {\n expect(hexToRgb('00ff00')).to.deep.equal({ r: 0, g: 255, b: 0 });\n });\n\n it('handles lowercase hex', () => {\n expect(hexToRgb('#0000ff')).to.deep.equal({ r: 0, g: 0, b: 255 });\n });\n\n it('handles uppercase hex', () => {\n expect(hexToRgb('#FFFFFF')).to.deep.equal({ r: 255, g: 255, b: 255 });\n });\n\n it('returns null for invalid hex', () => {\n expect(hexToRgb('invalid')).to.be.null;\n });\n\n it('returns null for short hex', () => {\n expect(hexToRgb('#fff')).to.be.null;\n });\n\n it('returns null for empty hex', () => {\n expect(hexToRgb('')).to.be.null;\n });\n\n it('returns null for hash only', () => {\n expect(hexToRgb('#')).to.be.null;\n });\n\n it('returns null for partial hex', () => {\n expect(hexToRgb('#12')).to.be.null;\n });\n });\n\n describe('truncate', () => {\n it('returns original string when shorter than max', () => {\n expect(truncate('hello', 10)).to.equal('hello');\n });\n\n it('truncates string when longer than max', () => {\n expect(truncate('hello world', 5)).to.equal('hello...');\n });\n\n it('handles exact length', () => {\n expect(truncate('hello', 5)).to.equal('hello');\n });\n\n it('handles empty string', () => {\n expect(truncate('', 5)).to.equal('');\n });\n });\n\n describe('oxford', () => {\n it('returns empty string for empty array', () => {\n expect(oxford([])).to.equal('');\n });\n\n it('returns single item unchanged', () => {\n expect(oxford(['apple'])).to.equal('apple');\n });\n\n it('joins two items with \"and\"', () => {\n expect(oxford(['apple', 'banana'])).to.equal('apple and banana');\n });\n\n it('joins three items with oxford comma', () => {\n expect(oxford(['apple', 'banana', 'cherry'])).to.equal(\n 'apple, banana, and cherry'\n );\n });\n\n it('joins four items with oxford comma', () => {\n expect(oxford(['apple', 'banana', 'cherry', 'date'])).to.equal(\n 'apple, banana, cherry, and date'\n );\n });\n\n it('uses custom joiner', () => {\n expect(oxford(['apple', 'banana'], 'or')).to.equal('apple or banana');\n });\n\n it('uses custom joiner with three items', () => {\n expect(oxford(['apple', 'banana', 'cherry'], 'or')).to.equal(\n 'apple, banana, or cherry'\n );\n });\n\n it('handles template results for two items', () => {\n const items = [html`<span>apple</span>`, html`<span>banana</span>`];\n const result = oxford(items);\n // This returns a template result, so we check the structure\n expect(result.strings).to.exist;\n });\n\n it('handles template results for multiple items', () => {\n const items = [\n html`<span>apple</span>`,\n html`<span>banana</span>`,\n html`<span>cherry</span>`\n ];\n const result = oxford(items);\n expect(Array.isArray(result)).to.be.true;\n });\n\n it('handles non-string items returning template result', () => {\n // test with non-string items - returns template result\n const result = oxford([null, undefined]);\n expect(result.strings).to.exist; // it's a TemplateResult because items are objects\n });\n });\n\n describe('oxfordFn', () => {\n it('applies function to items before joining', () => {\n const items = [1, 2, 3];\n const fn = (x: number) => x * 2;\n const result = oxfordFn(items, fn);\n expect(result).to.equal('2, 4, and 6');\n });\n });\n\n describe('oxfordNamed', () => {\n it('joins named objects', () => {\n const items = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];\n const result = oxfordNamed(items);\n expect(result).to.equal('Alice, Bob, and Charlie');\n });\n });\n\n describe('capitalize', () => {\n it('capitalizes first letter', () => {\n expect(capitalize('hello')).to.equal('Hello');\n });\n\n it('handles empty string', () => {\n expect(capitalize('')).to.equal('');\n });\n\n it('handles single character', () => {\n expect(capitalize('a')).to.equal('A');\n });\n\n it('preserves rest of string', () => {\n expect(capitalize('hELLO')).to.equal('HELLO');\n });\n });\n\n describe('formatFileType', () => {\n it('extracts file type from mime type', () => {\n expect(formatFileType('image/jpeg')).to.equal('jpeg');\n });\n\n it('extracts file type from application mime type', () => {\n expect(formatFileType('application/pdf')).to.equal('pdf');\n });\n\n it('handles complex mime types', () => {\n expect(formatFileType('text/plain')).to.equal('plain');\n });\n });\n\n describe('formatFileSize', () => {\n it('formats zero bytes', () => {\n expect(formatFileSize(0, 2)).to.equal('0 KB');\n });\n\n it('formats bytes (starts at KB)', () => {\n expect(formatFileSize(512, 2)).to.equal('512 B');\n });\n\n it('formats kilobytes', () => {\n expect(formatFileSize(1024, 2)).to.equal('1 KB');\n });\n\n it('formats megabytes', () => {\n expect(formatFileSize(1048576, 2)).to.equal('1 MB');\n });\n\n it('formats gigabytes', () => {\n expect(formatFileSize(1073741824, 2)).to.equal('1 GB');\n });\n\n it('uses default decimal places', () => {\n expect(formatFileSize(1536)).to.equal('1.5 KB');\n });\n\n it('formats zero bytes with default precision', () => {\n expect(formatFileSize(0)).to.equal('0 KB');\n });\n\n it('formats with zero decimal places', () => {\n expect(formatFileSize(1, 0)).to.equal('1 B');\n });\n\n it('formats gigabytes with single decimal place', () => {\n expect(formatFileSize(1024 * 1024 * 1024, 1)).to.equal('1 GB');\n });\n });\n\n describe('isImageAttachment', () => {\n it('returns true for image attachments', () => {\n const attachment = { content_type: 'image/jpeg' };\n expect(isImageAttachment(attachment as any)).to.be.true;\n });\n\n it('returns false for non-image attachments', () => {\n const attachment = { content_type: 'application/pdf' };\n expect(isImageAttachment(attachment as any)).to.be.false;\n });\n\n it('returns false for null attachment', () => {\n expect(isImageAttachment(null)).to.be.false;\n });\n\n it('returns false for undefined attachment', () => {\n expect(isImageAttachment(undefined)).to.be.false;\n });\n });\n\n describe('stopEvent', () => {\n it('stops propagation and prevents default', () => {\n const event = {\n stopPropagation: stub(),\n preventDefault: stub()\n };\n\n stopEvent(event as any);\n\n expect(event.stopPropagation.calledOnce).to.be.true;\n expect(event.preventDefault.calledOnce).to.be.true;\n });\n\n it('handles null event gracefully', () => {\n expect(() => stopEvent(null)).to.not.throw;\n });\n\n it('handles undefined event gracefully', () => {\n expect(() => stopEvent(undefined)).to.not.throw;\n });\n });\n\n describe('hslToHex', () => {\n it('converts HSL to hex', () => {\n expect(hslToHex(0, 100, 50)).to.equal('#ff0000'); // red\n });\n\n it('converts HSL to hex for green', () => {\n expect(hslToHex(120, 100, 50)).to.equal('#00ff00'); // green\n });\n\n it('converts HSL to hex for blue', () => {\n expect(hslToHex(240, 100, 50)).to.equal('#0000ff'); // blue\n });\n\n it('handles white', () => {\n expect(hslToHex(0, 0, 100)).to.equal('#ffffff');\n });\n\n it('handles black', () => {\n expect(hslToHex(0, 0, 0)).to.equal('#000000');\n });\n });\n\n describe('hashCode', () => {\n it('generates consistent hash for same string', () => {\n const hash1 = hashCode('test');\n const hash2 = hashCode('test');\n expect(hash1).to.equal(hash2);\n });\n\n it('generates different hashes for different strings', () => {\n const hash1 = hashCode('test1');\n const hash2 = hashCode('test2');\n expect(hash1).to.not.equal(hash2);\n });\n\n it('handles empty string', () => {\n expect(hashCode('')).to.equal(0);\n });\n });\n\n describe('showModax', () => {\n let originalShowModax: any;\n\n beforeEach(() => {\n originalShowModax = (window as any).showModax;\n (window as any).showModax = stub();\n });\n\n afterEach(() => {\n (window as any).showModax = originalShowModax;\n });\n\n it('calls window.showModax with title and endpoint', () => {\n showModax('Test Title', '/test/endpoint');\n expect(\n (window as any).showModax.calledOnceWith('Test Title', '/test/endpoint')\n ).to.be.true;\n });\n });\n\n describe('debounce', () => {\n it('debounces function calls', (done) => {\n const fn = stub();\n const debouncedFn = debounce(fn, 50);\n\n // call multiple times\n debouncedFn('arg1');\n debouncedFn('arg2');\n debouncedFn('arg3');\n\n // the function should not be called immediately\n expect(fn.called).to.be.false;\n\n // wait for the debounce delay and check if called\n setTimeout(() => {\n expect(fn.calledOnce).to.be.true;\n expect(fn.calledWith('arg3')).to.be.true;\n done();\n }, 75);\n });\n\n it('calls immediately when immediate flag is true', () => {\n const fn = stub();\n const debouncedFn = debounce(fn, 100, true);\n\n debouncedFn('test');\n\n expect(fn.calledOnce).to.be.true;\n expect(fn.calledWith('test')).to.be.true;\n });\n });\n\n describe('throttle', () => {\n it('throttles function calls', (done) => {\n const fn = stub();\n const throttledFn = throttle(fn, 50);\n\n // first call should execute immediately\n throttledFn('arg1');\n expect(fn.calledOnce).to.be.true;\n\n // subsequent calls should be ignored until ready\n throttledFn('arg2');\n throttledFn('arg3');\n\n // should still be called only once\n expect(fn.callCount).to.equal(1);\n\n // wait for throttle to reset and test again\n setTimeout(() => {\n throttledFn('arg4');\n expect(fn.callCount).to.equal(2);\n done();\n }, 75);\n });\n });\n\n describe('timeSince', () => {\n let stubbableStub: SinonStub;\n const baseDate = new Date('2023-01-01T12:00:00Z');\n\n beforeEach(() => {\n stubbableStub = stub(stubbable, 'getCurrentDate').returns(baseDate);\n });\n\n afterEach(() => {\n stubbableStub.restore();\n });\n\n it('returns \"just now\" for recent times', () => {\n const recentDate = new Date(baseDate.getTime() - 30 * 1000); // 30 seconds ago\n expect(timeSince(recentDate)).to.equal('just now');\n });\n\n it('returns minutes for times less than an hour ago', () => {\n const minutesAgo = new Date(baseDate.getTime() - 30 * 60 * 1000); // 30 minutes ago\n expect(timeSince(minutesAgo)).to.equal('30m');\n });\n\n it('returns hours for times less than a day ago', () => {\n const hoursAgo = new Date(baseDate.getTime() - 2 * 60 * 60 * 1000); // 2 hours ago\n expect(timeSince(hoursAgo)).to.equal('2h');\n });\n\n it('returns days for times less than a month ago', () => {\n const daysAgo = new Date(baseDate.getTime() - 5 * 24 * 60 * 60 * 1000); // 5 days ago\n expect(timeSince(daysAgo)).to.equal('5d');\n });\n\n it('returns months for times less than 6 months ago', () => {\n const monthsAgo = new Date(\n baseDate.getTime() - 3 * 30 * 24 * 60 * 60 * 1000\n ); // ~3 months ago\n expect(timeSince(monthsAgo)).to.equal('3mth');\n });\n\n it('returns formatted date for times more than 6 months ago', () => {\n const longAgo = new Date(\n baseDate.getTime() - 8 * 30 * 24 * 60 * 60 * 1000\n ); // ~8 months ago\n const result = timeSince(longAgo);\n expect(result).to.match(/\\d+ \\w+ \\d+/); // format like \"1 May 2022\"\n });\n\n it('handles suffix parameter', () => {\n const minutesAgo = new Date(baseDate.getTime() - 30 * 60 * 1000);\n expect(timeSince(minutesAgo, { suffix: ' ago' })).to.equal('30m ago');\n });\n\n it('handles custom compare date', () => {\n const compareDate = new Date('2023-01-01T13:00:00Z');\n const testDate = new Date('2023-01-01T12:30:00Z');\n expect(timeSince(testDate, { compareDate, suffix: '' })).to.equal('30m');\n });\n\n it('handles hideRecentText option', () => {\n const recentDate = new Date(baseDate.getTime() - 30 * 1000);\n expect(\n timeSince(recentDate, { hideRecentText: true, suffix: ' ago' })\n ).to.equal('just now');\n });\n\n it('handles future dates', () => {\n const now = new Date();\n const future = new Date(now.getTime() + 1000);\n\n // test future date (negative seconds)\n expect(timeSince(future, { compareDate: now, suffix: '' })).to.match(\n /\\d+s/\n );\n });\n });\n\n describe('isDate', () => {\n it('returns true for valid ISO date strings', () => {\n expect(isDate('2023-01-01T12:00:00Z')).to.be.true;\n expect(isDate('2023-01-01T12:00:00.123Z')).to.be.true;\n expect(isDate('2023-01-01T12:00:00+05:30')).to.be.true;\n });\n\n it('returns false for invalid date strings', () => {\n expect(isDate('invalid-date')).to.be.false;\n expect(isDate('2023-01-01')).to.be.false;\n expect(isDate('12:00:00')).to.be.false;\n });\n\n it('returns true for Date objects', () => {\n expect(isDate(new Date() as any)).to.be.true;\n });\n\n it('handles strings with replace method', () => {\n const str = ' 2023-01-01T12:00:00Z ';\n expect(isDate(str)).to.be.true;\n });\n\n it('returns true for Date instances', () => {\n expect(isDate(new Date())).to.be.true;\n });\n\n it('returns false for non-date values', () => {\n expect(isDate(123 as any)).to.be.false;\n // Don't test with null as it causes errors - this reveals a bug in the function\n expect(isDate({ replace: () => {} } as any)).to.be.false;\n });\n });\n\n describe('getCookie and setCookie', () => {\n afterEach(() => {\n // clear all cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name =\n eqPos > -1 ? cookie.substr(0, eqPos).trim() : cookie.trim();\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('setCookie sets a cookie with default path', () => {\n setCookie('testcookie', 'testvalue');\n expect(getCookie('testcookie')).to.equal('testvalue');\n });\n\n it('setCookie sets a cookie with custom path', () => {\n // just test that the function doesn't throw\n expect(() => setCookie('testcookie', 'testvalue', '/custom/path')).to.not\n .throw;\n });\n\n it('getCookie returns null for non-existent cookie', () => {\n expect(getCookie('nonexistent')).to.be.null;\n });\n\n it('getCookie handles empty cookie string', () => {\n // save original cookie getter\n const originalGetter = Object.getOwnPropertyDescriptor(\n Document.prototype,\n 'cookie'\n );\n\n // mock empty cookie\n Object.defineProperty(document, 'cookie', {\n value: '',\n configurable: true\n });\n\n expect(getCookie('test')).to.be.null;\n\n // restore original getter\n if (originalGetter) {\n Object.defineProperty(document, 'cookie', originalGetter);\n }\n });\n });\n\n describe('getCookieBoolean', () => {\n beforeEach(() => {\n // clear all cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name =\n eqPos > -1 ? cookie.substr(0, eqPos).trim() : cookie.trim();\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('returns true for cookie value \"true\"', () => {\n setCookie('boolcookie', 'true');\n expect(getCookieBoolean('boolcookie')).to.be.true;\n });\n\n it('returns false for cookie value \"false\"', () => {\n setCookie('boolcookie', 'false');\n expect(getCookieBoolean('boolcookie')).to.be.false;\n });\n\n it('returns false for non-existent cookie', () => {\n expect(getCookieBoolean('nonexistent')).to.be.false;\n });\n\n it('returns false for non-boolean cookie values', () => {\n setCookie('boolcookie', 'somevalue');\n expect(getCookieBoolean('boolcookie')).to.be.false;\n });\n });\n\n describe('serialize', () => {\n let form: HTMLFormElement;\n\n beforeEach(async () => {\n form = await fixture(html`\n <form>\n <input name=\"text\" type=\"text\" value=\"textvalue\" />\n <input name=\"email\" type=\"email\" value=\"test@example.com\" />\n <input name=\"checkbox1\" type=\"checkbox\" value=\"check1\" checked />\n <input name=\"checkbox2\" type=\"checkbox\" value=\"check2\" />\n <input\n name=\"radio1\"\n type=\"radio\"\n name=\"radiogroup\"\n value=\"radio1\"\n checked\n />\n <input name=\"radio2\" type=\"radio\" name=\"radiogroup\" value=\"radio2\" />\n <input name=\"hidden\" type=\"hidden\" value=\"hiddenvalue\" />\n <input name=\"disabled\" type=\"text\" value=\"disabledvalue\" disabled />\n <input name=\"noname\" type=\"text\" value=\"nonamevalue\" />\n <input type=\"submit\" value=\"Submit\" />\n <input type=\"button\" value=\"Button\" />\n <input type=\"file\" />\n <input type=\"reset\" />\n <select name=\"select\" multiple>\n <option value=\"option1\" selected>Option 1</option>\n <option value=\"option2\" selected>Option 2</option>\n <option value=\"option3\">Option 3</option>\n </select>\n <select name=\"singleselect\">\n <option value=\"single1\" selected>Single 1</option>\n <option value=\"single2\">Single 2</option>\n </select>\n </form>\n `);\n });\n\n it('serializes form data correctly', () => {\n const serialized = serialize(form);\n\n expect(serialized).to.include('text=textvalue');\n expect(serialized).to.include('email=test%40example.com');\n expect(serialized).to.include('checkbox1=check1');\n expect(serialized).to.not.include('checkbox2');\n expect(serialized).to.include('radio1=radio1');\n expect(serialized).to.include('hidden=hiddenvalue');\n expect(serialized).to.not.include('disabled');\n // Note: noname field actually gets included because it has a value, just no name attribute\n expect(serialized).to.not.include('Submit');\n expect(serialized).to.not.include('Button');\n expect(serialized).to.include('select=option1');\n expect(serialized).to.include('select=option2');\n expect(serialized).to.include('singleselect=single1');\n });\n\n it('handles empty form', () => {\n const emptyForm = document.createElement('form');\n expect(serialize(emptyForm)).to.equal('');\n });\n\n it('handles form with only disabled fields', () => {\n const disabledForm = document.createElement('form');\n const input = document.createElement('input');\n input.name = 'test';\n input.value = 'value';\n input.disabled = true;\n disabledForm.appendChild(input);\n\n expect(serialize(disabledForm)).to.equal('');\n });\n\n it('handles checkbox without value attribute', () => {\n const form = document.createElement('form');\n\n // add checkbox without value\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.name = 'checknovalue';\n checkbox.checked = true;\n form.appendChild(checkbox);\n\n const serialized = serialize(form);\n expect(serialized).to.include('checknovalue=on'); // default checkbox value is \"on\"\n });\n });\n\n describe('getElementOffset', () => {\n let element: HTMLElement;\n\n beforeEach(async () => {\n element = await fixture(html`\n <div\n style=\"position: absolute; top: 100px; left: 50px; width: 200px; height: 150px;\"\n >\n Test Element\n </div>\n `);\n });\n\n it('returns element offset information', () => {\n const offset = getElementOffset(element);\n\n expect(offset).to.have.property('top');\n expect(offset).to.have.property('left');\n expect(offset).to.have.property('bottom');\n expect(offset).to.have.property('right');\n expect(offset).to.have.property('width');\n expect(offset).to.have.property('height');\n\n expect(typeof offset.top).to.equal('number');\n expect(typeof offset.left).to.equal('number');\n expect(typeof offset.width).to.equal('number');\n expect(typeof offset.height).to.equal('number');\n });\n\n it('handles elements with relative positioning', () => {\n const element = document.createElement('div');\n // set some basic styling\n element.style.position = 'relative';\n element.style.width = '100px';\n element.style.height = '50px';\n document.body.appendChild(element);\n\n const offset = getElementOffset(element);\n expect(offset.width).to.equal(100);\n expect(offset.height).to.equal(50);\n\n document.body.removeChild(element);\n });\n });\n\n describe('isElementVisible', () => {\n let element: HTMLElement;\n let container: HTMLElement;\n\n beforeEach(async () => {\n container = await fixture(html`\n <div style=\"height: 200px; overflow: hidden;\">\n <div id=\"testelement\" style=\"height: 100px; margin-top: 50px;\">\n Test Element\n </div>\n </div>\n `);\n element = container.querySelector('#testelement') as HTMLElement;\n });\n\n it('checks if element is visible within container', () => {\n const visible = isElementVisible(element, container);\n expect(typeof visible).to.equal('boolean');\n });\n\n it('uses document.body as default holder', () => {\n const visible = isElementVisible(element);\n expect(typeof visible).to.equal('boolean');\n });\n });\n\n describe('getScrollParent', () => {\n let scrollableParent: HTMLElement;\n let child: HTMLElement;\n\n beforeEach(async () => {\n scrollableParent = await fixture(html`\n <div style=\"height: 200px; overflow-y: scroll;\">\n <div id=\"child\" style=\"height: 300px;\">Child Element</div>\n </div>\n `);\n child = scrollableParent.querySelector('#child') as HTMLElement;\n });\n\n it('finds scrollable parent', () => {\n const scrollParent = getScrollParent(child);\n // should find a scrollable parent or return null\n expect(scrollParent === null || scrollParent instanceof HTMLElement).to.be\n .true;\n });\n\n it('returns null when no scrollable parent exists', () => {\n const isolatedElement = document.createElement('div');\n const result = getScrollParent(isolatedElement);\n expect(result).to.be.null;\n });\n\n it('handles shadow dom', () => {\n const shadowHost = document.createElement('div');\n const shadowRoot = shadowHost.attachShadow({ mode: 'open' });\n const shadowChild = document.createElement('div');\n shadowRoot.appendChild(shadowChild);\n\n const result = getScrollParent(shadowChild);\n expect(result === null || result instanceof HTMLElement).to.be.true;\n });\n\n it('handles elements with no scrollable parents', () => {\n // test with null parent\n const orphan = document.createElement('div');\n expect(getScrollParent(orphan)).to.be.null;\n\n // test with non-scrollable parent\n const parent = document.createElement('div');\n const child = document.createElement('div');\n parent.appendChild(child);\n\n // most browsers won't have scrollable overflow by default\n const result = getScrollParent(child);\n expect(result === null || result instanceof HTMLElement).to.be.true;\n });\n });\n\n describe('renderIf', () => {\n it('renders then clause when predicate is true', () => {\n const result = renderIf(true)(() => html`<span>true</span>`);\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders otherwise clause when predicate is false', () => {\n const result = renderIf(false)(\n () => html`<span>true</span>`,\n () => html`<span>false</span>`\n );\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders empty when predicate is false and no otherwise clause', () => {\n const result = renderIf(false)(() => html`<span>true</span>`);\n expect(result.strings).to.exist; // empty TemplateResult\n });\n\n it('handles truthy values', () => {\n const result = renderIf('truthy')(() => html`<span>truthy</span>`);\n expect(result.strings).to.exist;\n });\n\n it('handles falsy values', () => {\n const result = renderIf(0)(() => html`<span>falsy</span>`);\n expect(result.strings).to.exist; // empty TemplateResult\n });\n\n it('handles object predicates', () => {\n // test with object predicate\n expect(renderIf({ test: true })(() => html`<span>object</span>`).strings)\n .to.exist;\n });\n\n it('handles array predicates', () => {\n // test with array predicate\n expect(renderIf([1, 2, 3])(() => html`<span>array</span>`).strings).to\n .exist;\n\n // test with empty array (falsy)\n expect(renderIf([])(() => html`<span>empty</span>`).strings).to.exist;\n });\n });\n\n describe('fillTemplate', () => {\n it('creates template with replacements', () => {\n const template = 'Hello {name}, you have {count} messages';\n const replacements = { name: 'Alice', count: 5 };\n const result = fillTemplate(template, replacements);\n\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('handles empty replacements', () => {\n const template = 'No replacements here';\n const result = fillTemplate(template, {});\n\n expect(result.strings).to.exist;\n });\n });\n\n describe('spreadAttributes', () => {\n it('spreads regular attributes', () => {\n const attrs = { id: 'test', class: 'example' };\n const result = spreadAttributes(attrs);\n\n expect(Array.isArray(result)).to.be.true;\n expect(result.length).to.equal(2);\n });\n\n it('handles event attributes with @', () => {\n const attrs = { '@click': 'handleClick' };\n const result = spreadAttributes(attrs);\n\n expect(Array.isArray(result)).to.be.true;\n expect(result.length).to.equal(1);\n });\n\n it('handles property attributes with .', () => {\n const attrs = { '.value': 'test' };\n const result = spreadAttributes(attrs);\n\n expect(Array.isArray(result)).to.be.true;\n expect(result.length).to.equal(1);\n });\n\n it('handles mixed attribute types', () => {\n const attrs = { id: 'test', '@click': 'handler', '.prop': 'value' };\n const result = spreadAttributes(attrs);\n\n expect(Array.isArray(result)).to.be.true;\n expect(result.length).to.equal(3);\n });\n });\n\n describe('renderAvatar', () => {\n it('renders avatar with name only', () => {\n const result = renderAvatar({ name: 'John Doe' });\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders avatar with user object', () => {\n const user = { first_name: 'Jane', last_name: 'Smith', avatar: null };\n const result = renderAvatar({ user });\n expect(result.strings).to.exist;\n });\n\n it('renders avatar with user avatar URL', () => {\n const user = {\n first_name: 'Jane',\n last_name: 'Smith',\n avatar: 'https://example.com/avatar.jpg'\n };\n const result = renderAvatar({ user });\n expect(result.strings).to.exist;\n });\n\n it('handles scale parameter', () => {\n const result = renderAvatar({ name: 'John Doe', scale: 1.5 });\n expect(result.strings).to.exist;\n });\n\n it('handles position parameter', () => {\n const result = renderAvatar({ name: 'John Doe', position: 'left' });\n expect(result.strings).to.exist;\n });\n\n it('handles icon parameter', () => {\n const result = renderAvatar({ name: 'John Doe', icon: 'user' });\n expect(result.strings).to.exist;\n });\n\n it('handles empty input', () => {\n const result = renderAvatar({});\n expect(result.strings).to.exist;\n });\n });\n\n describe('getDialog', () => {\n it('extracts dialog from button shadow root', () => {\n // create a mock button with shadow root\n const shadowRoot = {\n host: { type: 'dialog' }\n };\n const button = {\n getRootNode: stub().returns(shadowRoot)\n };\n\n const dialog = getDialog(button as any);\n expect(dialog).to.equal(shadowRoot.host);\n expect(button.getRootNode.calledOnce).to.be.true;\n });\n });\n\n describe('stubbable', () => {\n it('returns current date', () => {\n const date = stubbable.getCurrentDate();\n expect(date).to.be.instanceOf(Date);\n });\n });\n\n describe('HTTP Functions', () => {\n beforeEach(() => {\n clearMockPosts();\n });\n\n describe('getUrl', () => {\n it('makes GET request and returns response', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test response' }, {}, '200');\n\n const response = await getUrl('/test/endpoint');\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ data: 'test response' });\n expect(response.body).to.be.a('string');\n });\n\n it('handles request with custom headers', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test' }, {}, '200');\n\n const response = await getUrl('/test/endpoint', null, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n\n it('handles request with abort controller', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test' }, {}, '200');\n\n const controller = new AbortController();\n const response = await getUrl('/test/endpoint', controller);\n\n expect(response.status).to.equal(200);\n expect(response.controller).to.equal(controller);\n });\n\n it('rejects on error status', async () => {\n mockGET(/\\/test\\/endpoint/, 'Error response', {}, '404');\n\n try {\n await getUrl('/test/endpoint');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('postUrl', () => {\n it('makes POST request and returns response', async () => {\n mockPOST(/\\/test\\/endpoint/, { success: true }, {}, '200');\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ success: true });\n });\n\n it('handles custom content type', async () => {\n mockPOST(/\\/test\\/endpoint/, { success: true }, {}, '200');\n\n const response = await postUrl(\n '/test/endpoint',\n 'test data',\n {},\n 'text/plain'\n );\n\n expect(response.status).to.equal(200);\n });\n\n it('handles server errors', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Server Error', {}, '500');\n\n try {\n await postUrl('/test/endpoint', 'test data');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('handles toast headers', async () => {\n const toastData = JSON.stringify([\n { message: 'Success!', type: 'success' }\n ]);\n mockPOST(\n /\\/test\\/endpoint/,\n { success: true },\n { 'X-Temba-Toasts': toastData },\n '200'\n );\n\n // create a mock toast element\n const mockToast = {\n addMessages: stub()\n };\n const toastElement = document.createElement('temba-toast');\n Object.assign(toastElement, mockToast);\n document.body.appendChild(toastElement);\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(200);\n\n // clean up\n document.body.removeChild(toastElement);\n });\n\n it('handles client errors gracefully', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Client Error', {}, '400');\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(400);\n expect(response.json).to.deep.equal({});\n });\n\n it('handles response without toasts', async () => {\n // test response without toasts\n mockPOST(/\\/test\\/notoasts/, { success: true }, {}, '201');\n\n const response = await postUrl('/test/notoasts', 'data');\n expect(response.status).to.equal(201);\n });\n });\n\n describe('postJSON', () => {\n it('posts JSON data', async () => {\n mockPOST(/\\/test\\/endpoint/, { received: true }, {}, '200');\n\n const payload = { test: 'data' };\n const response = await postJSON('/test/endpoint', payload);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ received: true });\n });\n });\n\n describe('postFormData', () => {\n it('posts form data successfully', async () => {\n mockPOST(/\\/test\\/endpoint/, { uploaded: true }, {}, '200');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n const response = await postFormData('/test/endpoint', formData);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ uploaded: true });\n });\n\n it('handles form data with custom headers', async () => {\n mockPOST(/\\/test\\/endpoint/, { uploaded: true }, {}, '200');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n const response = await postFormData('/test/endpoint', formData, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n\n it('rejects on client error for non-media endpoint', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Bad Request', {}, '400');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n try {\n await postFormData('/test/endpoint', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.equal('Server failure');\n }\n });\n\n it('rejects with response for media endpoint errors', async () => {\n mockPOST(/\\/api\\/v2\\/media\\.json/, 'Bad Request', {}, '400');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n try {\n await postFormData('/api/v2/media.json', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n expect(error.status).to.equal(400);\n }\n });\n\n it('handles different error status for media endpoint', async () => {\n // test with different error status for media endpoint\n mockPOST(/\\/api\\/v2\\/media\\.json/, 'Forbidden', {}, '403');\n\n const formData = new FormData();\n formData.append('file', 'test');\n\n try {\n await postFormData('/api/v2/media.json', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('postForm', () => {\n it('converts object to FormData and posts', async () => {\n mockPOST(/\\/test\\/endpoint/, { submitted: true }, {}, '200');\n\n const payload = { name: 'John', age: 30 };\n const response = await postForm('/test/endpoint', payload);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ submitted: true });\n });\n\n it('handles form data with custom headers', async () => {\n mockPOST(/\\/test\\/endpoint/, { submitted: true }, {}, '200');\n\n const payload = { name: 'John' };\n const response = await postForm('/test/endpoint', payload, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n });\n\n describe('fetchResultsPage', () => {\n it('fetches a single page of results', async () => {\n const mockResults = {\n results: [{ id: 1 }, { id: 2 }],\n next: 'https://example.com/api/page2'\n };\n mockGET(/\\/api\\/results/, mockResults, {}, '200');\n\n const page = await fetchResultsPage('/api/results/');\n\n expect(page.results).to.deep.equal([{ id: 1 }, { id: 2 }]);\n expect(page.next).to.equal('https://example.com/api/page2');\n });\n\n it('handles requests with controller and headers', async () => {\n const mockResults = { results: [], next: null };\n mockGET(/\\/api\\/uniqueresults/, mockResults, {}, '200');\n\n const controller = new AbortController();\n const page = await fetchResultsPage('/api/uniqueresults/', controller, {\n 'Custom-Header': 'value'\n });\n\n expect(page.results).to.deep.equal([]);\n expect(page.next).to.be.null;\n });\n\n it('propagates errors', async () => {\n mockGET(/\\/api\\/resultserror/, 'Error', {}, '500');\n\n try {\n await fetchResultsPage('/api/resultserror/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('fetchResults', () => {\n it('returns empty array for null URL', async () => {\n const results = await fetchResults(null);\n expect(results).to.deep.equal([]);\n });\n\n it('returns empty array for empty URL', async () => {\n const results = await fetchResults('');\n expect(results).to.deep.equal([]);\n });\n });\n\n describe('getAssetPage', () => {\n it('fetches a single page of assets', async () => {\n const mockAssets = {\n results: [{ key: 'asset1' }, { key: 'asset2' }],\n next: 'https://example.com/api/assets/page2'\n };\n mockGET(/\\/api\\/assets/, mockAssets, {}, '200');\n\n const page = await getAssetPage('/api/assets/');\n\n expect(page.assets).to.deep.equal([\n { key: 'asset1' },\n { key: 'asset2' }\n ]);\n expect(page.next).to.equal('https://example.com/api/assets/page2');\n });\n\n it('rejects on error status', async () => {\n mockGET(/\\/api\\/assets/, 'Not Found', {}, '404');\n\n try {\n await getAssetPage('/api/assets/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('rejects on network error', async () => {\n // Don't mock the endpoint to simulate network error\n try {\n await getAssetPage('/api/nonexistent/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('handles server error scenarios', async () => {\n mockGET(/\\/api\\/asseterror/, 'Server Error', {}, '500');\n\n try {\n await getAssetPage('/api/asseterror/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('getAssets', () => {\n it('returns empty array for null URL', async () => {\n const assets = await getAssets(null);\n expect(assets).to.deep.equal([]);\n });\n\n it('returns empty array for empty URL', async () => {\n const assets = await getAssets('');\n expect(assets).to.deep.equal([]);\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-utils-index.test.js","sourceRoot":"","sources":["../../test/temba-utils-index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { stub, SinonStub } from 'sinon';\nimport {\n log,\n getHTTPCookie,\n getHeaders,\n getClasses,\n plural,\n range,\n hexToRgb,\n truncate,\n oxford,\n oxfordFn,\n oxfordNamed,\n capitalize,\n formatFileType,\n formatFileSize,\n isImageAttachment,\n stopEvent,\n hslToHex,\n hashCode,\n showModax,\n debounce,\n throttle,\n timeSince,\n isDate,\n getCookie,\n getCookieBoolean,\n setCookie,\n serialize,\n renderIf,\n getElementOffset,\n isElementVisible,\n getScrollParent,\n stubbable,\n renderAvatar,\n fillTemplate,\n getUrl,\n postUrl,\n postJSON,\n postFormData,\n postForm,\n fetchResultsPage,\n fetchResults,\n getAssetPage,\n getAssets,\n getDialog,\n DEFAULT_MEDIA_ENDPOINT,\n Color,\n COOKIE_KEYS\n} from '../src/utils';\nimport { mockGET, mockPOST, clearMockPosts } from './utils.test';\n\ndescribe('utils/index', () => {\n describe('constants', () => {\n it('exports expected constants', () => {\n expect(DEFAULT_MEDIA_ENDPOINT).to.equal('/api/v2/media.json');\n expect(Color.BLUE).to.equal('color:#5078b5;');\n expect(Color.GREEN).to.equal('color:#62bd6a;');\n expect(Color.RED).to.equal('color:#e36049;');\n expect(Color.PURPLE).to.equal('color:#a626a4;');\n expect(COOKIE_KEYS.SETTINGS).to.equal('settings');\n expect(COOKIE_KEYS.MENU_COLLAPSED).to.equal('menu-collapsed');\n expect(COOKIE_KEYS.TICKET_SHOW_DETAILS).to.equal('tickets.show-details');\n });\n });\n\n describe('log', () => {\n let consoleLogStub: SinonStub;\n\n beforeEach(() => {\n consoleLogStub = stub(console, 'log');\n });\n\n afterEach(() => {\n consoleLogStub.restore();\n });\n\n it('logs a simple message without styling', () => {\n log('test message');\n expect(consoleLogStub.calledOnceWith('test message')).to.be.true;\n });\n\n it('logs an object with styling', () => {\n const obj = { test: 'value' };\n log(obj, 'color: red;');\n expect(\n consoleLogStub.calledOnceWith(\n '%c' + JSON.stringify(obj, null, 2),\n 'color: red;'\n )\n ).to.be.true;\n });\n\n it('logs a string with styling and details', () => {\n log('test message', 'color: blue;', ['detail1', 'detail2']);\n expect(\n consoleLogStub.calledOnceWith(\n '%ctest message',\n 'color: blue;',\n 'detail1',\n 'detail2'\n )\n ).to.be.true;\n });\n });\n\n describe('getHTTPCookie', () => {\n afterEach(() => {\n // clear cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('returns null for non-existent cookie', () => {\n expect(getHTTPCookie('nonexistent')).to.be.null;\n });\n\n it('returns cookie value when it exists', () => {\n document.cookie = 'testcookie=testvalue; path=/';\n expect(getHTTPCookie('testcookie')).to.equal('testvalue');\n });\n\n it('handles cookies with spaces', () => {\n document.cookie = ' spacedcookie = spacedvalue ; path=/';\n expect(getHTTPCookie('spacedcookie')).to.equal('spacedvalue');\n });\n\n it('returns first matching cookie when multiple exist', () => {\n document.cookie = 'cookie1=value1; path=/';\n document.cookie = 'cookie2=value2; path=/';\n expect(getHTTPCookie('cookie1')).to.equal('value1');\n expect(getHTTPCookie('cookie2')).to.equal('value2');\n });\n });\n\n describe('getHeaders', () => {\n let originalOrgId: any;\n let csrfTokenElement: HTMLInputElement;\n\n beforeEach(() => {\n originalOrgId = (window as any).org_id;\n\n // clear existing CSRF token element\n const existing = document.querySelector('[name=csrfmiddlewaretoken]');\n if (existing) {\n existing.remove();\n }\n });\n\n afterEach(() => {\n // clear cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n\n (window as any).org_id = originalOrgId;\n\n if (csrfTokenElement) {\n csrfTokenElement.remove();\n }\n });\n\n it('builds basic headers with XMLHttpRequest marker', () => {\n const headers = getHeaders();\n expect(headers['X-Requested-With']).to.equal('XMLHttpRequest');\n });\n\n it('includes CSRF token from cookie', () => {\n document.cookie = 'csrftoken=test-csrf-token; path=/';\n const headers = getHeaders();\n expect(headers['X-CSRFToken']).to.equal('test-csrf-token');\n });\n\n it('includes CSRF token from form element when cookie not available', () => {\n csrfTokenElement = document.createElement('input');\n csrfTokenElement.name = 'csrfmiddlewaretoken';\n csrfTokenElement.value = 'form-csrf-token';\n document.body.appendChild(csrfTokenElement);\n\n const headers = getHeaders();\n expect(headers['X-CSRFToken']).to.equal('form-csrf-token');\n });\n\n it('includes org id when available', () => {\n (window as any).org_id = '123';\n const headers = getHeaders();\n expect(headers['X-Temba-Org']).to.equal('123');\n });\n\n it('merges provided headers', () => {\n const headers = getHeaders({ 'Custom-Header': 'custom-value' });\n expect(headers['Custom-Header']).to.equal('custom-value');\n expect(headers['X-Requested-With']).to.equal('XMLHttpRequest');\n });\n\n it('removes X-Temba-Org when X-Temba-Service-Org is provided', () => {\n (window as any).org_id = '123';\n const headers = getHeaders({ 'X-Temba-Service-Org': 'service-org' });\n expect(headers['X-Temba-Org']).to.be.undefined;\n expect(headers['X-Temba-Service-Org']).to.equal('service-org');\n });\n });\n\n describe('getClasses', () => {\n it('returns empty string for empty map', () => {\n expect(getClasses({})).to.equal('');\n });\n\n it('returns single class when one is true', () => {\n expect(getClasses({ active: true })).to.equal('active');\n });\n\n it('returns multiple classes when multiple are true', () => {\n const result = getClasses({\n active: true,\n disabled: true,\n hidden: false\n });\n expect(result).to.equal('active disabled');\n });\n\n it('ignores false values', () => {\n expect(getClasses({ active: true, disabled: false })).to.equal('active');\n });\n\n it('trims whitespace correctly', () => {\n expect(getClasses({ class1: true, class2: true })).to.equal(\n 'class1 class2'\n );\n });\n });\n\n describe('plural', () => {\n it('returns singular for count of 1', () => {\n expect(plural(1, 'item', 'items')).to.equal('item');\n });\n\n it('returns plural for count of 0', () => {\n expect(plural(0, 'item', 'items')).to.equal('items');\n });\n\n it('returns plural for count greater than 1', () => {\n expect(plural(5, 'item', 'items')).to.equal('items');\n });\n\n it('returns plural for negative counts', () => {\n expect(plural(-1, 'item', 'items')).to.equal('items');\n });\n });\n\n describe('range', () => {\n it('generates range from 0 to 5', () => {\n expect(range(0, 5)).to.deep.equal([0, 1, 2, 3, 4]);\n });\n\n it('generates range from 2 to 6', () => {\n expect(range(2, 6)).to.deep.equal([2, 3, 4, 5]);\n });\n\n it('generates empty array when start equals end', () => {\n expect(range(3, 3)).to.deep.equal([]);\n });\n\n it('handles negative ranges', () => {\n expect(range(-2, 2)).to.deep.equal([-2, -1, 0, 1]);\n });\n });\n\n describe('hexToRgb', () => {\n it('converts valid hex to RGB', () => {\n expect(hexToRgb('#ff0000')).to.deep.equal({ r: 255, g: 0, b: 0 });\n });\n\n it('converts hex without hash to RGB', () => {\n expect(hexToRgb('00ff00')).to.deep.equal({ r: 0, g: 255, b: 0 });\n });\n\n it('handles lowercase hex', () => {\n expect(hexToRgb('#0000ff')).to.deep.equal({ r: 0, g: 0, b: 255 });\n });\n\n it('handles uppercase hex', () => {\n expect(hexToRgb('#FFFFFF')).to.deep.equal({ r: 255, g: 255, b: 255 });\n });\n\n it('returns null for invalid hex', () => {\n expect(hexToRgb('invalid')).to.be.null;\n });\n\n it('returns null for short hex', () => {\n expect(hexToRgb('#fff')).to.be.null;\n });\n\n it('returns null for empty hex', () => {\n expect(hexToRgb('')).to.be.null;\n });\n\n it('returns null for hash only', () => {\n expect(hexToRgb('#')).to.be.null;\n });\n\n it('returns null for partial hex', () => {\n expect(hexToRgb('#12')).to.be.null;\n });\n });\n\n describe('truncate', () => {\n it('returns original string when shorter than max', () => {\n expect(truncate('hello', 10)).to.equal('hello');\n });\n\n it('truncates string when longer than max', () => {\n expect(truncate('hello world', 5)).to.equal('hello...');\n });\n\n it('handles exact length', () => {\n expect(truncate('hello', 5)).to.equal('hello');\n });\n\n it('handles empty string', () => {\n expect(truncate('', 5)).to.equal('');\n });\n });\n\n describe('oxford', () => {\n it('returns empty string for empty array', () => {\n expect(oxford([])).to.equal('');\n });\n\n it('returns single item unchanged', () => {\n expect(oxford(['apple'])).to.equal('apple');\n });\n\n it('joins two items with \"and\"', () => {\n expect(oxford(['apple', 'banana'])).to.equal('apple and banana');\n });\n\n it('joins three items with oxford comma', () => {\n expect(oxford(['apple', 'banana', 'cherry'])).to.equal(\n 'apple, banana, and cherry'\n );\n });\n\n it('joins four items with oxford comma', () => {\n expect(oxford(['apple', 'banana', 'cherry', 'date'])).to.equal(\n 'apple, banana, cherry, and date'\n );\n });\n\n it('uses custom joiner', () => {\n expect(oxford(['apple', 'banana'], 'or')).to.equal('apple or banana');\n });\n\n it('uses custom joiner with three items', () => {\n expect(oxford(['apple', 'banana', 'cherry'], 'or')).to.equal(\n 'apple, banana, or cherry'\n );\n });\n\n it('handles template results for two items', () => {\n const items = [html`<span>apple</span>`, html`<span>banana</span>`];\n const result = oxford(items);\n // This returns a template result, so we check the structure\n expect(result.strings).to.exist;\n });\n\n it('handles template results for multiple items', () => {\n const items = [\n html`<span>apple</span>`,\n html`<span>banana</span>`,\n html`<span>cherry</span>`\n ];\n const result = oxford(items);\n expect(Array.isArray(result)).to.be.true;\n });\n\n it('handles non-string items returning template result', () => {\n // test with non-string items - returns template result\n const result = oxford([null, undefined]);\n expect(result.strings).to.exist; // it's a TemplateResult because items are objects\n });\n });\n\n describe('oxfordFn', () => {\n it('applies function to items before joining', () => {\n const items = [1, 2, 3];\n const fn = (x: number) => x * 2;\n const result = oxfordFn(items, fn);\n expect(result).to.equal('2, 4, and 6');\n });\n });\n\n describe('oxfordNamed', () => {\n it('joins named objects', () => {\n const items = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];\n const result = oxfordNamed(items);\n expect(result).to.equal('Alice, Bob, and Charlie');\n });\n });\n\n describe('capitalize', () => {\n it('capitalizes first letter', () => {\n expect(capitalize('hello')).to.equal('Hello');\n });\n\n it('handles empty string', () => {\n expect(capitalize('')).to.equal('');\n });\n\n it('handles single character', () => {\n expect(capitalize('a')).to.equal('A');\n });\n\n it('preserves rest of string', () => {\n expect(capitalize('hELLO')).to.equal('HELLO');\n });\n });\n\n describe('formatFileType', () => {\n it('extracts file type from mime type', () => {\n expect(formatFileType('image/jpeg')).to.equal('jpeg');\n });\n\n it('extracts file type from application mime type', () => {\n expect(formatFileType('application/pdf')).to.equal('pdf');\n });\n\n it('handles complex mime types', () => {\n expect(formatFileType('text/plain')).to.equal('plain');\n });\n });\n\n describe('formatFileSize', () => {\n it('formats zero bytes', () => {\n expect(formatFileSize(0, 2)).to.equal('0 KB');\n });\n\n it('formats bytes (starts at KB)', () => {\n expect(formatFileSize(512, 2)).to.equal('512 B');\n });\n\n it('formats kilobytes', () => {\n expect(formatFileSize(1024, 2)).to.equal('1 KB');\n });\n\n it('formats megabytes', () => {\n expect(formatFileSize(1048576, 2)).to.equal('1 MB');\n });\n\n it('formats gigabytes', () => {\n expect(formatFileSize(1073741824, 2)).to.equal('1 GB');\n });\n\n it('uses default decimal places', () => {\n expect(formatFileSize(1536)).to.equal('1.5 KB');\n });\n\n it('formats zero bytes with default precision', () => {\n expect(formatFileSize(0)).to.equal('0 KB');\n });\n\n it('formats with zero decimal places', () => {\n expect(formatFileSize(1, 0)).to.equal('1 B');\n });\n\n it('formats gigabytes with single decimal place', () => {\n expect(formatFileSize(1024 * 1024 * 1024, 1)).to.equal('1 GB');\n });\n });\n\n describe('isImageAttachment', () => {\n it('returns true for image attachments', () => {\n const attachment = { content_type: 'image/jpeg' };\n expect(isImageAttachment(attachment as any)).to.be.true;\n });\n\n it('returns false for non-image attachments', () => {\n const attachment = { content_type: 'application/pdf' };\n expect(isImageAttachment(attachment as any)).to.be.false;\n });\n\n it('returns false for null attachment', () => {\n expect(isImageAttachment(null)).to.be.false;\n });\n\n it('returns false for undefined attachment', () => {\n expect(isImageAttachment(undefined)).to.be.false;\n });\n });\n\n describe('stopEvent', () => {\n it('stops propagation and prevents default', () => {\n const event = {\n stopPropagation: stub(),\n preventDefault: stub()\n };\n\n stopEvent(event as any);\n\n expect(event.stopPropagation.calledOnce).to.be.true;\n expect(event.preventDefault.calledOnce).to.be.true;\n });\n\n it('handles null event gracefully', () => {\n expect(() => stopEvent(null)).to.not.throw;\n });\n\n it('handles undefined event gracefully', () => {\n expect(() => stopEvent(undefined)).to.not.throw;\n });\n });\n\n describe('hslToHex', () => {\n it('converts HSL to hex', () => {\n expect(hslToHex(0, 100, 50)).to.equal('#ff0000'); // red\n });\n\n it('converts HSL to hex for green', () => {\n expect(hslToHex(120, 100, 50)).to.equal('#00ff00'); // green\n });\n\n it('converts HSL to hex for blue', () => {\n expect(hslToHex(240, 100, 50)).to.equal('#0000ff'); // blue\n });\n\n it('handles white', () => {\n expect(hslToHex(0, 0, 100)).to.equal('#ffffff');\n });\n\n it('handles black', () => {\n expect(hslToHex(0, 0, 0)).to.equal('#000000');\n });\n });\n\n describe('hashCode', () => {\n it('generates consistent hash for same string', () => {\n const hash1 = hashCode('test');\n const hash2 = hashCode('test');\n expect(hash1).to.equal(hash2);\n });\n\n it('generates different hashes for different strings', () => {\n const hash1 = hashCode('test1');\n const hash2 = hashCode('test2');\n expect(hash1).to.not.equal(hash2);\n });\n\n it('handles empty string', () => {\n expect(hashCode('')).to.equal(0);\n });\n });\n\n describe('showModax', () => {\n let originalShowModax: any;\n\n beforeEach(() => {\n originalShowModax = (window as any).showModax;\n (window as any).showModax = stub();\n });\n\n afterEach(() => {\n (window as any).showModax = originalShowModax;\n });\n\n it('calls window.showModax with title and endpoint', () => {\n showModax('Test Title', '/test/endpoint');\n expect(\n (window as any).showModax.calledOnceWith('Test Title', '/test/endpoint')\n ).to.be.true;\n });\n });\n\n describe('debounce', () => {\n it('debounces function calls', (done) => {\n const fn = stub();\n const debouncedFn = debounce(fn, 50);\n\n // call multiple times\n debouncedFn('arg1');\n debouncedFn('arg2');\n debouncedFn('arg3');\n\n // the function should not be called immediately\n expect(fn.called).to.be.false;\n\n // wait for the debounce delay and check if called\n setTimeout(() => {\n expect(fn.calledOnce).to.be.true;\n expect(fn.calledWith('arg3')).to.be.true;\n done();\n }, 75);\n });\n\n it('calls immediately when immediate flag is true', () => {\n const fn = stub();\n const debouncedFn = debounce(fn, 100, true);\n\n debouncedFn('test');\n\n expect(fn.calledOnce).to.be.true;\n expect(fn.calledWith('test')).to.be.true;\n });\n });\n\n describe('throttle', () => {\n it('throttles function calls', (done) => {\n const fn = stub();\n const throttledFn = throttle(fn, 50);\n\n // first call should execute immediately\n throttledFn('arg1');\n expect(fn.calledOnce).to.be.true;\n\n // subsequent calls should be ignored until ready\n throttledFn('arg2');\n throttledFn('arg3');\n\n // should still be called only once\n expect(fn.callCount).to.equal(1);\n\n // wait for throttle to reset and test again\n setTimeout(() => {\n throttledFn('arg4');\n expect(fn.callCount).to.equal(2);\n done();\n }, 75);\n });\n });\n\n describe('timeSince', () => {\n let stubbableStub: SinonStub;\n const baseDate = new Date('2023-01-01T12:00:00Z');\n\n beforeEach(() => {\n stubbableStub = stub(stubbable, 'getCurrentDate').returns(baseDate);\n });\n\n afterEach(() => {\n stubbableStub.restore();\n });\n\n it('returns \"just now\" for recent times', () => {\n const recentDate = new Date(baseDate.getTime() - 30 * 1000); // 30 seconds ago\n expect(timeSince(recentDate)).to.equal('just now');\n });\n\n it('returns minutes for times less than an hour ago', () => {\n const minutesAgo = new Date(baseDate.getTime() - 30 * 60 * 1000); // 30 minutes ago\n expect(timeSince(minutesAgo)).to.equal('30m');\n });\n\n it('returns hours for times less than a day ago', () => {\n const hoursAgo = new Date(baseDate.getTime() - 2 * 60 * 60 * 1000); // 2 hours ago\n expect(timeSince(hoursAgo)).to.equal('2h');\n });\n\n it('returns days for times less than a month ago', () => {\n const daysAgo = new Date(baseDate.getTime() - 5 * 24 * 60 * 60 * 1000); // 5 days ago\n expect(timeSince(daysAgo)).to.equal('5d');\n });\n\n it('returns months for times less than 6 months ago', () => {\n const monthsAgo = new Date(\n baseDate.getTime() - 3 * 30 * 24 * 60 * 60 * 1000\n ); // ~3 months ago\n expect(timeSince(monthsAgo)).to.equal('3mth');\n });\n\n it('returns formatted date for times more than 6 months ago', () => {\n const longAgo = new Date(\n baseDate.getTime() - 8 * 30 * 24 * 60 * 60 * 1000\n ); // ~8 months ago\n const result = timeSince(longAgo);\n expect(result).to.match(/\\d+ \\w+ \\d+/); // format like \"1 May 2022\"\n });\n\n it('handles suffix parameter', () => {\n const minutesAgo = new Date(baseDate.getTime() - 30 * 60 * 1000);\n expect(timeSince(minutesAgo, { suffix: ' ago' })).to.equal('30m ago');\n });\n\n it('handles custom compare date', () => {\n const compareDate = new Date('2023-01-01T13:00:00Z');\n const testDate = new Date('2023-01-01T12:30:00Z');\n expect(timeSince(testDate, { compareDate, suffix: '' })).to.equal('30m');\n });\n\n it('handles hideRecentText option', () => {\n const recentDate = new Date(baseDate.getTime() - 30 * 1000);\n expect(\n timeSince(recentDate, { hideRecentText: true, suffix: ' ago' })\n ).to.equal('just now');\n });\n\n it('handles future dates', () => {\n const now = new Date();\n const future = new Date(now.getTime() + 1000);\n\n // test future date (negative seconds)\n expect(timeSince(future, { compareDate: now, suffix: '' })).to.match(\n /\\d+s/\n );\n });\n });\n\n describe('isDate', () => {\n it('returns true for valid ISO date strings', () => {\n expect(isDate('2023-01-01T12:00:00Z')).to.be.true;\n expect(isDate('2023-01-01T12:00:00.123Z')).to.be.true;\n expect(isDate('2023-01-01T12:00:00+05:30')).to.be.true;\n });\n\n it('returns false for invalid date strings', () => {\n expect(isDate('invalid-date')).to.be.false;\n expect(isDate('2023-01-01')).to.be.false;\n expect(isDate('12:00:00')).to.be.false;\n });\n\n it('returns true for Date objects', () => {\n expect(isDate(new Date() as any)).to.be.true;\n });\n\n it('handles strings with replace method', () => {\n const str = ' 2023-01-01T12:00:00Z ';\n expect(isDate(str)).to.be.true;\n });\n\n it('returns true for Date instances', () => {\n expect(isDate(new Date())).to.be.true;\n });\n\n it('returns false for non-date values', () => {\n expect(isDate(123 as any)).to.be.false;\n // Don't test with null as it causes errors - this reveals a bug in the function\n expect(isDate({ replace: () => {} } as any)).to.be.false;\n });\n });\n\n describe('getCookie and setCookie', () => {\n afterEach(() => {\n // clear all cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name =\n eqPos > -1 ? cookie.substr(0, eqPos).trim() : cookie.trim();\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('setCookie sets a cookie with default path', () => {\n setCookie('testcookie', 'testvalue');\n expect(getCookie('testcookie')).to.equal('testvalue');\n });\n\n it('setCookie sets a cookie with custom path', () => {\n // just test that the function doesn't throw\n expect(() => setCookie('testcookie', 'testvalue', '/custom/path')).to.not\n .throw;\n });\n\n it('getCookie returns null for non-existent cookie', () => {\n expect(getCookie('nonexistent')).to.be.null;\n });\n\n it('getCookie handles empty cookie string', () => {\n // save original cookie getter\n const originalGetter = Object.getOwnPropertyDescriptor(\n Document.prototype,\n 'cookie'\n );\n\n // mock empty cookie\n Object.defineProperty(document, 'cookie', {\n value: '',\n configurable: true\n });\n\n expect(getCookie('test')).to.be.null;\n\n // restore original getter\n if (originalGetter) {\n Object.defineProperty(document, 'cookie', originalGetter);\n }\n });\n });\n\n describe('getCookieBoolean', () => {\n beforeEach(() => {\n // clear all cookies\n document.cookie.split(';').forEach((cookie) => {\n const eqPos = cookie.indexOf('=');\n const name =\n eqPos > -1 ? cookie.substr(0, eqPos).trim() : cookie.trim();\n document.cookie =\n name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';\n });\n });\n\n it('returns true for cookie value \"true\"', () => {\n setCookie('boolcookie', 'true');\n expect(getCookieBoolean('boolcookie')).to.be.true;\n });\n\n it('returns false for cookie value \"false\"', () => {\n setCookie('boolcookie', 'false');\n expect(getCookieBoolean('boolcookie')).to.be.false;\n });\n\n it('returns false for non-existent cookie', () => {\n expect(getCookieBoolean('nonexistent')).to.be.false;\n });\n\n it('returns false for non-boolean cookie values', () => {\n setCookie('boolcookie', 'somevalue');\n expect(getCookieBoolean('boolcookie')).to.be.false;\n });\n });\n\n describe('serialize', () => {\n let form: HTMLFormElement;\n\n beforeEach(async () => {\n form = await fixture(html`\n <form>\n <input name=\"text\" type=\"text\" value=\"textvalue\" />\n <input name=\"email\" type=\"email\" value=\"test@example.com\" />\n <input name=\"checkbox1\" type=\"checkbox\" value=\"check1\" checked />\n <input name=\"checkbox2\" type=\"checkbox\" value=\"check2\" />\n <input\n name=\"radio1\"\n type=\"radio\"\n name=\"radiogroup\"\n value=\"radio1\"\n checked\n />\n <input name=\"radio2\" type=\"radio\" name=\"radiogroup\" value=\"radio2\" />\n <input name=\"hidden\" type=\"hidden\" value=\"hiddenvalue\" />\n <input name=\"disabled\" type=\"text\" value=\"disabledvalue\" disabled />\n <input name=\"noname\" type=\"text\" value=\"nonamevalue\" />\n <input type=\"submit\" value=\"Submit\" />\n <input type=\"button\" value=\"Button\" />\n <input type=\"file\" />\n <input type=\"reset\" />\n <select name=\"select\" multiple>\n <option value=\"option1\" selected>Option 1</option>\n <option value=\"option2\" selected>Option 2</option>\n <option value=\"option3\">Option 3</option>\n </select>\n <select name=\"singleselect\">\n <option value=\"single1\" selected>Single 1</option>\n <option value=\"single2\">Single 2</option>\n </select>\n </form>\n `);\n });\n\n it('serializes form data correctly', () => {\n const serialized = serialize(form);\n\n expect(serialized).to.include('text=textvalue');\n expect(serialized).to.include('email=test%40example.com');\n expect(serialized).to.include('checkbox1=check1');\n expect(serialized).to.not.include('checkbox2');\n expect(serialized).to.include('radio1=radio1');\n expect(serialized).to.include('hidden=hiddenvalue');\n expect(serialized).to.not.include('disabled');\n // Note: noname field actually gets included because it has a value, just no name attribute\n expect(serialized).to.not.include('Submit');\n expect(serialized).to.not.include('Button');\n expect(serialized).to.include('select=option1');\n expect(serialized).to.include('select=option2');\n expect(serialized).to.include('singleselect=single1');\n });\n\n it('handles empty form', () => {\n const emptyForm = document.createElement('form');\n expect(serialize(emptyForm)).to.equal('');\n });\n\n it('handles form with only disabled fields', () => {\n const disabledForm = document.createElement('form');\n const input = document.createElement('input');\n input.name = 'test';\n input.value = 'value';\n input.disabled = true;\n disabledForm.appendChild(input);\n\n expect(serialize(disabledForm)).to.equal('');\n });\n\n it('handles checkbox without value attribute', () => {\n const form = document.createElement('form');\n\n // add checkbox without value\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.name = 'checknovalue';\n checkbox.checked = true;\n form.appendChild(checkbox);\n\n const serialized = serialize(form);\n expect(serialized).to.include('checknovalue=on'); // default checkbox value is \"on\"\n });\n });\n\n describe('getElementOffset', () => {\n let element: HTMLElement;\n\n beforeEach(async () => {\n element = await fixture(html`\n <div\n style=\"position: absolute; top: 100px; left: 50px; width: 200px; height: 150px;\"\n >\n Test Element\n </div>\n `);\n });\n\n it('returns element offset information', () => {\n const offset = getElementOffset(element);\n\n expect(offset).to.have.property('top');\n expect(offset).to.have.property('left');\n expect(offset).to.have.property('bottom');\n expect(offset).to.have.property('right');\n expect(offset).to.have.property('width');\n expect(offset).to.have.property('height');\n\n expect(typeof offset.top).to.equal('number');\n expect(typeof offset.left).to.equal('number');\n expect(typeof offset.width).to.equal('number');\n expect(typeof offset.height).to.equal('number');\n });\n\n it('handles elements with relative positioning', () => {\n const element = document.createElement('div');\n // set some basic styling\n element.style.position = 'relative';\n element.style.width = '100px';\n element.style.height = '50px';\n document.body.appendChild(element);\n\n const offset = getElementOffset(element);\n expect(offset.width).to.equal(100);\n expect(offset.height).to.equal(50);\n\n document.body.removeChild(element);\n });\n });\n\n describe('isElementVisible', () => {\n let element: HTMLElement;\n let container: HTMLElement;\n\n beforeEach(async () => {\n container = await fixture(html`\n <div style=\"height: 200px; overflow: hidden;\">\n <div id=\"testelement\" style=\"height: 100px; margin-top: 50px;\">\n Test Element\n </div>\n </div>\n `);\n element = container.querySelector('#testelement') as HTMLElement;\n });\n\n it('checks if element is visible within container', () => {\n const visible = isElementVisible(element, container);\n expect(typeof visible).to.equal('boolean');\n });\n\n it('uses document.body as default holder', () => {\n const visible = isElementVisible(element);\n expect(typeof visible).to.equal('boolean');\n });\n });\n\n describe('getScrollParent', () => {\n let scrollableParent: HTMLElement;\n let child: HTMLElement;\n\n beforeEach(async () => {\n scrollableParent = await fixture(html`\n <div style=\"height: 200px; overflow-y: scroll;\">\n <div id=\"child\" style=\"height: 300px;\">Child Element</div>\n </div>\n `);\n child = scrollableParent.querySelector('#child') as HTMLElement;\n });\n\n it('finds scrollable parent', () => {\n const scrollParent = getScrollParent(child);\n // should find a scrollable parent or return null\n expect(scrollParent === null || scrollParent instanceof HTMLElement).to.be\n .true;\n });\n\n it('returns null when no scrollable parent exists', () => {\n const isolatedElement = document.createElement('div');\n const result = getScrollParent(isolatedElement);\n expect(result).to.be.null;\n });\n\n it('handles shadow dom', () => {\n const shadowHost = document.createElement('div');\n const shadowRoot = shadowHost.attachShadow({ mode: 'open' });\n const shadowChild = document.createElement('div');\n shadowRoot.appendChild(shadowChild);\n\n const result = getScrollParent(shadowChild);\n expect(result === null || result instanceof HTMLElement).to.be.true;\n });\n\n it('handles elements with no scrollable parents', () => {\n // test with null parent\n const orphan = document.createElement('div');\n expect(getScrollParent(orphan)).to.be.null;\n\n // test with non-scrollable parent\n const parent = document.createElement('div');\n const child = document.createElement('div');\n parent.appendChild(child);\n\n // most browsers won't have scrollable overflow by default\n const result = getScrollParent(child);\n expect(result === null || result instanceof HTMLElement).to.be.true;\n });\n });\n\n describe('renderIf', () => {\n it('renders then clause when predicate is true', () => {\n const result = renderIf(true)(() => html`<span>true</span>`);\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders otherwise clause when predicate is false', () => {\n const result = renderIf(false)(\n () => html`<span>true</span>`,\n () => html`<span>false</span>`\n );\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders empty when predicate is false and no otherwise clause', () => {\n const result = renderIf(false)(() => html`<span>true</span>`);\n expect(result.strings).to.exist; // empty TemplateResult\n });\n\n it('handles truthy values', () => {\n const result = renderIf('truthy')(() => html`<span>truthy</span>`);\n expect(result.strings).to.exist;\n });\n\n it('handles falsy values', () => {\n const result = renderIf(0)(() => html`<span>falsy</span>`);\n expect(result.strings).to.exist; // empty TemplateResult\n });\n\n it('handles object predicates', () => {\n // test with object predicate\n expect(renderIf({ test: true })(() => html`<span>object</span>`).strings)\n .to.exist;\n });\n\n it('handles array predicates', () => {\n // test with array predicate\n expect(renderIf([1, 2, 3])(() => html`<span>array</span>`).strings).to\n .exist;\n\n // test with empty array (falsy)\n expect(renderIf([])(() => html`<span>empty</span>`).strings).to.exist;\n });\n });\n\n describe('fillTemplate', () => {\n it('creates template with replacements', () => {\n const template = 'Hello {name}, you have {count} messages';\n const replacements = { name: 'Alice', count: 5 };\n const result = fillTemplate(template, replacements);\n\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('handles empty replacements', () => {\n const template = 'No replacements here';\n const result = fillTemplate(template, {});\n\n expect(result.strings).to.exist;\n });\n });\n\n describe('renderAvatar', () => {\n it('renders avatar with name only', () => {\n const result = renderAvatar({ name: 'John Doe' });\n expect(result.strings).to.exist; // it's a TemplateResult\n });\n\n it('renders avatar with user object', () => {\n const user = { first_name: 'Jane', last_name: 'Smith', avatar: null };\n const result = renderAvatar({ user });\n expect(result.strings).to.exist;\n });\n\n it('renders avatar with user avatar URL', () => {\n const user = {\n first_name: 'Jane',\n last_name: 'Smith',\n avatar: 'https://example.com/avatar.jpg'\n };\n const result = renderAvatar({ user });\n expect(result.strings).to.exist;\n });\n\n it('handles scale parameter', () => {\n const result = renderAvatar({ name: 'John Doe', scale: 1.5 });\n expect(result.strings).to.exist;\n });\n\n it('handles position parameter', () => {\n const result = renderAvatar({ name: 'John Doe', position: 'left' });\n expect(result.strings).to.exist;\n });\n\n it('handles icon parameter', () => {\n const result = renderAvatar({ name: 'John Doe', icon: 'user' });\n expect(result.strings).to.exist;\n });\n\n it('handles empty input', () => {\n const result = renderAvatar({});\n expect(result.strings).to.exist;\n });\n });\n\n describe('getDialog', () => {\n it('extracts dialog from button shadow root', () => {\n // create a mock button with shadow root\n const shadowRoot = {\n host: { type: 'dialog' }\n };\n const button = {\n getRootNode: stub().returns(shadowRoot)\n };\n\n const dialog = getDialog(button as any);\n expect(dialog).to.equal(shadowRoot.host);\n expect(button.getRootNode.calledOnce).to.be.true;\n });\n });\n\n describe('stubbable', () => {\n it('returns current date', () => {\n const date = stubbable.getCurrentDate();\n expect(date).to.be.instanceOf(Date);\n });\n });\n\n describe('HTTP Functions', () => {\n beforeEach(() => {\n clearMockPosts();\n });\n\n describe('getUrl', () => {\n it('makes GET request and returns response', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test response' }, {}, '200');\n\n const response = await getUrl('/test/endpoint');\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ data: 'test response' });\n expect(response.body).to.be.a('string');\n });\n\n it('handles request with custom headers', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test' }, {}, '200');\n\n const response = await getUrl('/test/endpoint', null, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n\n it('handles request with abort controller', async () => {\n mockGET(/\\/test\\/endpoint/, { data: 'test' }, {}, '200');\n\n const controller = new AbortController();\n const response = await getUrl('/test/endpoint', controller);\n\n expect(response.status).to.equal(200);\n expect(response.controller).to.equal(controller);\n });\n\n it('rejects on error status', async () => {\n mockGET(/\\/test\\/endpoint/, 'Error response', {}, '404');\n\n try {\n await getUrl('/test/endpoint');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('postUrl', () => {\n it('makes POST request and returns response', async () => {\n mockPOST(/\\/test\\/endpoint/, { success: true }, {}, '200');\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ success: true });\n });\n\n it('handles custom content type', async () => {\n mockPOST(/\\/test\\/endpoint/, { success: true }, {}, '200');\n\n const response = await postUrl(\n '/test/endpoint',\n 'test data',\n {},\n 'text/plain'\n );\n\n expect(response.status).to.equal(200);\n });\n\n it('handles server errors', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Server Error', {}, '500');\n\n try {\n await postUrl('/test/endpoint', 'test data');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('handles toast headers', async () => {\n const toastData = JSON.stringify([\n { message: 'Success!', type: 'success' }\n ]);\n mockPOST(\n /\\/test\\/endpoint/,\n { success: true },\n { 'X-Temba-Toasts': toastData },\n '200'\n );\n\n // create a mock toast element\n const mockToast = {\n addMessages: stub()\n };\n const toastElement = document.createElement('temba-toast');\n Object.assign(toastElement, mockToast);\n document.body.appendChild(toastElement);\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(200);\n\n // clean up\n document.body.removeChild(toastElement);\n });\n\n it('handles client errors gracefully', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Client Error', {}, '400');\n\n const response = await postUrl('/test/endpoint', 'test data');\n\n expect(response.status).to.equal(400);\n expect(response.json).to.deep.equal({});\n });\n\n it('handles response without toasts', async () => {\n // test response without toasts\n mockPOST(/\\/test\\/notoasts/, { success: true }, {}, '201');\n\n const response = await postUrl('/test/notoasts', 'data');\n expect(response.status).to.equal(201);\n });\n });\n\n describe('postJSON', () => {\n it('posts JSON data', async () => {\n mockPOST(/\\/test\\/endpoint/, { received: true }, {}, '200');\n\n const payload = { test: 'data' };\n const response = await postJSON('/test/endpoint', payload);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ received: true });\n });\n });\n\n describe('postFormData', () => {\n it('posts form data successfully', async () => {\n mockPOST(/\\/test\\/endpoint/, { uploaded: true }, {}, '200');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n const response = await postFormData('/test/endpoint', formData);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ uploaded: true });\n });\n\n it('handles form data with custom headers', async () => {\n mockPOST(/\\/test\\/endpoint/, { uploaded: true }, {}, '200');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n const response = await postFormData('/test/endpoint', formData, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n\n it('rejects on client error for non-media endpoint', async () => {\n mockPOST(/\\/test\\/endpoint/, 'Bad Request', {}, '400');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n try {\n await postFormData('/test/endpoint', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.equal('Server failure');\n }\n });\n\n it('rejects with response for media endpoint errors', async () => {\n mockPOST(/\\/api\\/v2\\/media\\.json/, 'Bad Request', {}, '400');\n\n const formData = new FormData();\n formData.append('key', 'value');\n\n try {\n await postFormData('/api/v2/media.json', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n expect(error.status).to.equal(400);\n }\n });\n\n it('handles different error status for media endpoint', async () => {\n // test with different error status for media endpoint\n mockPOST(/\\/api\\/v2\\/media\\.json/, 'Forbidden', {}, '403');\n\n const formData = new FormData();\n formData.append('file', 'test');\n\n try {\n await postFormData('/api/v2/media.json', formData);\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('postForm', () => {\n it('converts object to FormData and posts', async () => {\n mockPOST(/\\/test\\/endpoint/, { submitted: true }, {}, '200');\n\n const payload = { name: 'John', age: 30 };\n const response = await postForm('/test/endpoint', payload);\n\n expect(response.status).to.equal(200);\n expect(response.json).to.deep.equal({ submitted: true });\n });\n\n it('handles form data with custom headers', async () => {\n mockPOST(/\\/test\\/endpoint/, { submitted: true }, {}, '200');\n\n const payload = { name: 'John' };\n const response = await postForm('/test/endpoint', payload, {\n 'Custom-Header': 'value'\n });\n\n expect(response.status).to.equal(200);\n });\n });\n\n describe('fetchResultsPage', () => {\n it('fetches a single page of results', async () => {\n const mockResults = {\n results: [{ id: 1 }, { id: 2 }],\n next: 'https://example.com/api/page2'\n };\n mockGET(/\\/api\\/results/, mockResults, {}, '200');\n\n const page = await fetchResultsPage('/api/results/');\n\n expect(page.results).to.deep.equal([{ id: 1 }, { id: 2 }]);\n expect(page.next).to.equal('https://example.com/api/page2');\n });\n\n it('handles requests with controller and headers', async () => {\n const mockResults = { results: [], next: null };\n mockGET(/\\/api\\/uniqueresults/, mockResults, {}, '200');\n\n const controller = new AbortController();\n const page = await fetchResultsPage('/api/uniqueresults/', controller, {\n 'Custom-Header': 'value'\n });\n\n expect(page.results).to.deep.equal([]);\n expect(page.next).to.be.null;\n });\n\n it('propagates errors', async () => {\n mockGET(/\\/api\\/resultserror/, 'Error', {}, '500');\n\n try {\n await fetchResultsPage('/api/resultserror/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('fetchResults', () => {\n it('returns empty array for null URL', async () => {\n const results = await fetchResults(null);\n expect(results).to.deep.equal([]);\n });\n\n it('returns empty array for empty URL', async () => {\n const results = await fetchResults('');\n expect(results).to.deep.equal([]);\n });\n });\n\n describe('getAssetPage', () => {\n it('fetches a single page of assets', async () => {\n const mockAssets = {\n results: [{ key: 'asset1' }, { key: 'asset2' }],\n next: 'https://example.com/api/assets/page2'\n };\n mockGET(/\\/api\\/assets/, mockAssets, {}, '200');\n\n const page = await getAssetPage('/api/assets/');\n\n expect(page.assets).to.deep.equal([\n { key: 'asset1' },\n { key: 'asset2' }\n ]);\n expect(page.next).to.equal('https://example.com/api/assets/page2');\n });\n\n it('rejects on error status', async () => {\n mockGET(/\\/api\\/assets/, 'Not Found', {}, '404');\n\n try {\n await getAssetPage('/api/assets/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('rejects on network error', async () => {\n // Don't mock the endpoint to simulate network error\n try {\n await getAssetPage('/api/nonexistent/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n\n it('handles server error scenarios', async () => {\n mockGET(/\\/api\\/asseterror/, 'Server Error', {}, '500');\n\n try {\n await getAssetPage('/api/asseterror/');\n expect.fail('Should have rejected');\n } catch (error) {\n expect(error).to.exist;\n }\n });\n });\n\n describe('getAssets', () => {\n it('returns empty array for null URL', async () => {\n const assets = await getAssets(null);\n expect(assets).to.deep.equal([]);\n });\n\n it('returns empty array for empty URL', async () => {\n const assets = await getAssets('');\n expect(assets).to.deep.equal([]);\n });\n });\n });\n});\n"]}
@@ -233,6 +233,7 @@ export const clickOption = async (clock, select, index) => {
233
233
  const existingOption = (_a = options.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-option-index="${index}"]`);
234
234
  if (!existingOption) {
235
235
  try {
236
+ // Increased wait time to handle slower CI environments
236
237
  await waitForCondition(() => {
237
238
  var _a;
238
239
  const option = (_a = options.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-option-index="${index}"]`);
@@ -266,6 +267,7 @@ export const openSelect = async (clock, select) => {
266
267
  if (hasEndpoint) {
267
268
  try {
268
269
  // Wait for options to be properly rendered and visible (but only for endpoint selects)
270
+ // Increased max attempts to handle slower CI environments
269
271
  await waitForCondition(() => {
270
272
  const options = select.shadowRoot.querySelector('temba-options[visible]');
271
273
  return options && options.isConnected;