@tellescope/sdk 1.256.16 → 2.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/CLAUDE.md +5 -0
  2. package/env.example +39 -0
  3. package/lib/cjs/enduser.d.ts +1 -0
  4. package/lib/cjs/enduser.d.ts.map +1 -1
  5. package/lib/cjs/sdk.d.ts +3 -1
  6. package/lib/cjs/sdk.d.ts.map +1 -1
  7. package/lib/cjs/sdk.js +1 -0
  8. package/lib/cjs/sdk.js.map +1 -1
  9. package/lib/cjs/session.d.ts +1 -0
  10. package/lib/cjs/session.d.ts.map +1 -1
  11. package/lib/cjs/tests/api_tests/active_patient_count.test.js +1 -1
  12. package/lib/cjs/tests/api_tests/active_patient_count.test.js.map +1 -1
  13. package/lib/cjs/tests/api_tests/appointment_rescheduled_trigger.test.js +1 -1
  14. package/lib/cjs/tests/api_tests/appointment_rescheduled_trigger.test.js.map +1 -1
  15. package/lib/cjs/tests/api_tests/calendar_event_limits.test.js +5 -5
  16. package/lib/cjs/tests/api_tests/calendar_event_limits.test.js.map +1 -1
  17. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js +1 -1
  18. package/lib/cjs/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
  19. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js +1 -1
  20. package/lib/cjs/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  21. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +21 -0
  22. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -0
  23. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +215 -0
  24. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -0
  25. package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js +6 -6
  26. package/lib/cjs/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -1
  27. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js +3 -3
  28. package/lib/cjs/tests/api_tests/enduser_session_invalidation.test.js.map +1 -1
  29. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +32 -0
  30. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -0
  31. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +257 -0
  32. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -0
  33. package/lib/cjs/tests/api_tests/managed_content_enduser_access.test.js +1 -1
  34. package/lib/cjs/tests/api_tests/managed_content_enduser_access.test.js.map +1 -1
  35. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js +1 -1
  36. package/lib/cjs/tests/api_tests/managed_content_file_access.test.js.map +1 -1
  37. package/lib/cjs/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
  38. package/lib/cjs/tests/api_tests/mdi_webhooks.test.js +21 -8
  39. package/lib/cjs/tests/api_tests/mdi_webhooks.test.js.map +1 -1
  40. package/lib/cjs/tests/api_tests/nutrition_tracking.test.js +1 -1
  41. package/lib/cjs/tests/api_tests/nutrition_tracking.test.js.map +1 -1
  42. package/lib/cjs/tests/api_tests/openloop_webhooks.test.js +1 -1
  43. package/lib/cjs/tests/api_tests/openloop_webhooks.test.js.map +1 -1
  44. package/lib/cjs/tests/api_tests/programs.test.d.ts +5 -0
  45. package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -0
  46. package/lib/cjs/tests/api_tests/programs.test.js +370 -0
  47. package/lib/cjs/tests/api_tests/programs.test.js.map +1 -0
  48. package/lib/cjs/tests/api_tests/programs_trigger_filters.test.d.ts +5 -0
  49. package/lib/cjs/tests/api_tests/programs_trigger_filters.test.d.ts.map +1 -0
  50. package/lib/cjs/tests/api_tests/programs_trigger_filters.test.js +295 -0
  51. package/lib/cjs/tests/api_tests/programs_trigger_filters.test.js.map +1 -0
  52. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js +1 -1
  53. package/lib/cjs/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -1
  54. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +42 -0
  55. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -0
  56. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +484 -0
  57. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -0
  58. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js +1 -1
  59. package/lib/cjs/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
  60. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +1 -1
  61. package/lib/cjs/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  62. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js +1 -1
  63. package/lib/cjs/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
  64. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js +1 -1
  65. package/lib/cjs/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
  66. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js +2 -2
  67. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
  68. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
  69. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
  70. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +297 -0
  71. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
  72. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  73. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
  74. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  75. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
  76. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
  77. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js +202 -0
  78. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
  79. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
  80. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
  81. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js +233 -0
  82. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
  83. package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts +3 -0
  84. package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
  85. package/lib/cjs/tests/api_tests/templated_message_links.test.js +235 -0
  86. package/lib/cjs/tests/api_tests/templated_message_links.test.js.map +1 -0
  87. package/lib/cjs/tests/api_tests/time_tracks.test.js +1 -1
  88. package/lib/cjs/tests/api_tests/time_tracks.test.js.map +1 -1
  89. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
  90. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
  91. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +395 -0
  92. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
  93. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
  94. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
  95. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +471 -0
  96. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
  97. package/lib/cjs/tests/api_tests/user_portal_settings.test.js +1 -1
  98. package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -1
  99. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
  100. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
  101. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js +233 -0
  102. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
  103. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
  104. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
  105. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +569 -0
  106. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
  107. package/lib/cjs/tests/public_endpoint_tests.js +3 -2
  108. package/lib/cjs/tests/public_endpoint_tests.js.map +1 -1
  109. package/lib/cjs/tests/setup.d.ts +16 -0
  110. package/lib/cjs/tests/setup.d.ts.map +1 -1
  111. package/lib/cjs/tests/setup.js +55 -8
  112. package/lib/cjs/tests/setup.js.map +1 -1
  113. package/lib/cjs/tests/setup_isolated.d.ts +9 -0
  114. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  115. package/lib/cjs/tests/setup_isolated.js +23 -2
  116. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  117. package/lib/cjs/tests/socket_tests.d.ts.map +1 -1
  118. package/lib/cjs/tests/socket_tests.js +3 -2
  119. package/lib/cjs/tests/socket_tests.js.map +1 -1
  120. package/lib/cjs/tests/tests.d.ts.map +1 -1
  121. package/lib/cjs/tests/tests.js +180 -166
  122. package/lib/cjs/tests/tests.js.map +1 -1
  123. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
  124. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
  125. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js +118 -0
  126. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
  127. package/lib/cjs/tests/webhooks_tests.js +3 -2
  128. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  129. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  130. package/lib/esm/enduser.d.ts +2 -0
  131. package/lib/esm/enduser.d.ts.map +1 -1
  132. package/lib/esm/sdk.d.ts +6 -3
  133. package/lib/esm/sdk.d.ts.map +1 -1
  134. package/lib/esm/sdk.js +1 -0
  135. package/lib/esm/sdk.js.map +1 -1
  136. package/lib/esm/session.d.ts +2 -0
  137. package/lib/esm/session.d.ts.map +1 -1
  138. package/lib/esm/tests/api_tests/active_patient_count.test.js +1 -1
  139. package/lib/esm/tests/api_tests/active_patient_count.test.js.map +1 -1
  140. package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js +1 -1
  141. package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js.map +1 -1
  142. package/lib/esm/tests/api_tests/calendar_event_limits.test.js +5 -5
  143. package/lib/esm/tests/api_tests/calendar_event_limits.test.js.map +1 -1
  144. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js +1 -1
  145. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
  146. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js +1 -1
  147. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  148. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +21 -0
  149. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -0
  150. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +210 -0
  151. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -0
  152. package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js +7 -7
  153. package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -1
  154. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js +4 -4
  155. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js.map +1 -1
  156. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +32 -0
  157. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -0
  158. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +252 -0
  159. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -0
  160. package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js +1 -1
  161. package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js.map +1 -1
  162. package/lib/esm/tests/api_tests/managed_content_file_access.test.js +1 -1
  163. package/lib/esm/tests/api_tests/managed_content_file_access.test.js.map +1 -1
  164. package/lib/esm/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
  165. package/lib/esm/tests/api_tests/mdi_webhooks.test.js +21 -8
  166. package/lib/esm/tests/api_tests/mdi_webhooks.test.js.map +1 -1
  167. package/lib/esm/tests/api_tests/nutrition_tracking.test.js +1 -1
  168. package/lib/esm/tests/api_tests/nutrition_tracking.test.js.map +1 -1
  169. package/lib/esm/tests/api_tests/openloop_webhooks.test.js +1 -1
  170. package/lib/esm/tests/api_tests/openloop_webhooks.test.js.map +1 -1
  171. package/lib/esm/tests/api_tests/programs.test.d.ts +5 -0
  172. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -0
  173. package/lib/esm/tests/api_tests/programs.test.js +365 -0
  174. package/lib/esm/tests/api_tests/programs.test.js.map +1 -0
  175. package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts +5 -0
  176. package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts.map +1 -0
  177. package/lib/esm/tests/api_tests/programs_trigger_filters.test.js +290 -0
  178. package/lib/esm/tests/api_tests/programs_trigger_filters.test.js.map +1 -0
  179. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js +1 -1
  180. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -1
  181. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +42 -0
  182. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -0
  183. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +479 -0
  184. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -0
  185. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +1 -1
  186. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
  187. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +1 -1
  188. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  189. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +1 -1
  190. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
  191. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +1 -1
  192. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
  193. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js +3 -3
  194. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
  195. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
  196. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
  197. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +292 -0
  198. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
  199. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  200. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
  201. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  202. package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
  203. package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
  204. package/lib/esm/tests/api_tests/templated_message_date_fields.test.js +198 -0
  205. package/lib/esm/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
  206. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
  207. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
  208. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js +229 -0
  209. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
  210. package/lib/esm/tests/api_tests/templated_message_links.test.d.ts +3 -0
  211. package/lib/esm/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
  212. package/lib/esm/tests/api_tests/templated_message_links.test.js +231 -0
  213. package/lib/esm/tests/api_tests/templated_message_links.test.js.map +1 -0
  214. package/lib/esm/tests/api_tests/time_tracks.test.js +1 -1
  215. package/lib/esm/tests/api_tests/time_tracks.test.js.map +1 -1
  216. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
  217. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
  218. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +390 -0
  219. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
  220. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
  221. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
  222. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +466 -0
  223. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
  224. package/lib/esm/tests/api_tests/user_portal_settings.test.js +1 -1
  225. package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -1
  226. package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
  227. package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
  228. package/lib/esm/tests/api_tests/validation_behavior_locks.test.js +229 -0
  229. package/lib/esm/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
  230. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
  231. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
  232. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +564 -0
  233. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
  234. package/lib/esm/tests/public_endpoint_tests.js +3 -2
  235. package/lib/esm/tests/public_endpoint_tests.js.map +1 -1
  236. package/lib/esm/tests/setup.d.ts +16 -0
  237. package/lib/esm/tests/setup.d.ts.map +1 -1
  238. package/lib/esm/tests/setup.js +53 -7
  239. package/lib/esm/tests/setup.js.map +1 -1
  240. package/lib/esm/tests/setup_isolated.d.ts +9 -0
  241. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  242. package/lib/esm/tests/setup_isolated.js +21 -1
  243. package/lib/esm/tests/setup_isolated.js.map +1 -1
  244. package/lib/esm/tests/socket_tests.d.ts.map +1 -1
  245. package/lib/esm/tests/socket_tests.js +3 -2
  246. package/lib/esm/tests/socket_tests.js.map +1 -1
  247. package/lib/esm/tests/tests.d.ts.map +1 -1
  248. package/lib/esm/tests/tests.js +180 -166
  249. package/lib/esm/tests/tests.js.map +1 -1
  250. package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
  251. package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
  252. package/lib/esm/tests/unit_tests/trigger_title_partials.test.js +115 -0
  253. package/lib/esm/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
  254. package/lib/esm/tests/webhooks_tests.js +3 -2
  255. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  256. package/lib/tsconfig.tsbuildinfo +1 -1
  257. package/package.json +22 -19
  258. package/src/sdk.ts +5 -1
  259. package/src/tests/api_tests/active_patient_count.test.ts +1 -1
  260. package/src/tests/api_tests/appointment_rescheduled_trigger.test.ts +1 -1
  261. package/src/tests/api_tests/calendar_event_references_update.test.ts +1 -1
  262. package/src/tests/api_tests/enduser_cross_access_isolation.test.ts +1 -1
  263. package/src/tests/api_tests/enduser_login_rate_limits.test.ts +7 -7
  264. package/src/tests/api_tests/enduser_session_invalidation.test.ts +4 -4
  265. package/src/tests/api_tests/managed_content_enduser_access.test.ts +1 -1
  266. package/src/tests/api_tests/managed_content_file_access.test.ts +1 -1
  267. package/src/tests/api_tests/mdi_webhooks.test.ts +9 -0
  268. package/src/tests/api_tests/nutrition_tracking.test.ts +1 -1
  269. package/src/tests/api_tests/openloop_webhooks.test.ts +1 -1
  270. package/src/tests/api_tests/security/allowed-paths-confinement.test.ts +1 -1
  271. package/src/tests/api_tests/security/booking-info-idor-token-mint.test.ts +1 -1
  272. package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +1 -1
  273. package/src/tests/api_tests/security/enduser-cross-create.test.ts +1 -1
  274. package/src/tests/api_tests/security/enduser-write-restrictions.test.ts +1 -1
  275. package/src/tests/api_tests/security/invite-user-enumeration.test.ts +3 -3
  276. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +197 -0
  277. package/src/tests/api_tests/security/sanitize-user-html-with-iframes.test.ts +4 -1
  278. package/src/tests/api_tests/templated_message_date_fields.test.ts +146 -0
  279. package/src/tests/api_tests/templated_message_links.test.ts +192 -0
  280. package/src/tests/api_tests/time_tracks.test.ts +1 -1
  281. package/src/tests/api_tests/user_portal_settings.test.ts +1 -1
  282. package/src/tests/api_tests/validation_behavior_locks.test.ts +204 -0
  283. package/src/tests/public_endpoint_tests.ts +3 -2
  284. package/src/tests/setup.ts +43 -7
  285. package/src/tests/setup_isolated.ts +10 -0
  286. package/src/tests/socket_tests.ts +3 -2
  287. package/src/tests/tests.ts +10 -2
  288. package/src/tests/webhooks_tests.ts +4 -2
  289. package/test_generated.pdf +0 -0
  290. package/tsconfig.cjs.json +17 -0
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.templated_message_date_field_tests = void 0;
40
+ require('source-map-support').install();
41
+ var setup_isolated_1 = require("../setup_isolated");
42
+ var host = process.env.API_URL || 'http://localhost:8080';
43
+ /**
44
+ * Coverage for how `get_templated_message` renders enduser field values that LOOK like dates.
45
+ *
46
+ * The rule: a value stored as text renders as the author stored it. `message_templating.ts` only
47
+ * reformats an actual `Date` object, and a custom field is always a string.
48
+ *
49
+ * This exists because that rule was silently broken IN PRODUCTION, and had been for a long time.
50
+ * The templating code read `if (fieldValue instanceof Date || isDate(fieldValue))`. Validator
51
+ * 13.11.0's `isDate` was timezone-dependent — it compared a UTC-parsed date against a local-time
52
+ * `.getDate()` — so it returned false on a US developer's machine but TRUE in UTC, which is what
53
+ * the servers run. A date of birth stored as "1985-03-12" therefore took the Date branch in
54
+ * production, was parsed as UTC midnight and localized to the enduser's timezone, and rendered in a
55
+ * patient-facing SMS or email as "3/11/1985, 7:00:00 PM" — the PREVIOUS day, with a time nobody
56
+ * entered. A January date lost a year: "2024-01-01" rendered "12/31/2023".
57
+ *
58
+ * The validator bump did not cause this; it made it reproducible locally, which is how it surfaced.
59
+ * Removing the `isDate` half of the condition fixes it in every timezone.
60
+ *
61
+ * This is the ONE intentional production behavior change in an otherwise behavior-neutral
62
+ * dependency PR, made deliberately rather than shipping wrong dates to patients for another
63
+ * cycle. Every other validator touched here was pinned to production's existing behavior.
64
+ *
65
+ * So the assertions below are about the day not moving and no clock time appearing, which is what a
66
+ * patient would actually notice. A pure-function test could not have caught this: the function that
67
+ * does the work is module-private and the endpoint is the real surface.
68
+ *
69
+ * Runs standalone or as part of the main suite:
70
+ * npm run test:modular -- api_tests/templated_message_date_fields
71
+ */
72
+ /** Values a customer realistically stores in a date-ish custom field, and what must come back. */
73
+ var DATE_SHAPED_VALUES = [
74
+ { label: 'ISO date (the shape that regressed)', value: '1985-03-12' },
75
+ { label: 'ISO date, recent', value: '2024-01-01' },
76
+ { label: 'slash-separated date', value: '1999/12/31' },
77
+ { label: 'MM-DD-YYYY (the dateOfBirth format)', value: '03-12-1985' },
78
+ { label: 'ISO datetime string', value: '2024-06-15T14:30:00.000Z' },
79
+ { label: 'leap day', value: '2000-02-29' },
80
+ ];
81
+ /** A rendered date-only value must not have grown a clock time or a timezone abbreviation. */
82
+ var LOOKS_REFORMATTED = /\d{1,2}:\d{2}|\bAM\b|\bPM\b|\bE[SD]T\b|\bUTC\b|\bGMT\b/;
83
+ var templated_message_date_field_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
84
+ var checks, tenant, sdk, userId, fields, enduser, i, _a, label, value, plaintext, dob, control;
85
+ return __generator(this, function (_b) {
86
+ switch (_b.label) {
87
+ case 0:
88
+ checks = [];
89
+ return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({ users: [{ isAdmin: true }] })];
90
+ case 1:
91
+ tenant = _b.sent();
92
+ _b.label = 2;
93
+ case 2:
94
+ _b.trys.push([2, , 10, 12]);
95
+ sdk = tenant.sdk;
96
+ userId = tenant.users[0].id;
97
+ fields = Object.fromEntries(DATE_SHAPED_VALUES.map(function (c, i) { return ["DateField".concat(i), c.value]; }));
98
+ return [4 /*yield*/, sdk.api.endusers.createOne({
99
+ fname: 'Date',
100
+ lname: 'Fields',
101
+ timezone: 'America/New_York',
102
+ fields: fields,
103
+ })];
104
+ case 3:
105
+ enduser = _b.sent();
106
+ i = 0;
107
+ _b.label = 4;
108
+ case 4:
109
+ if (!(i < DATE_SHAPED_VALUES.length)) return [3 /*break*/, 7];
110
+ _a = DATE_SHAPED_VALUES[i], label = _a.label, value = _a.value;
111
+ return [4 /*yield*/, sdk.api.templates.get_templated_message({
112
+ enduserId: enduser.id,
113
+ userId: userId,
114
+ channel: 'Chat',
115
+ message: "[{{enduser.DateField".concat(i, "}}]"),
116
+ })];
117
+ case 5:
118
+ plaintext = (_b.sent()).plaintext;
119
+ checks.push({
120
+ label: "".concat(label, " renders exactly as stored"),
121
+ pass: plaintext === "[".concat(value, "]"),
122
+ detail: "stored ".concat(JSON.stringify(value), ", rendered ").concat(JSON.stringify(plaintext)),
123
+ });
124
+ // A second, independent signal for the specific symptom, so this still catches a shifted
125
+ // rendering even if the equality check above is ever loosened. Only meaningful for values
126
+ // that carry no time of their own — an ISO datetime legitimately contains one.
127
+ if (!LOOKS_REFORMATTED.test(value)) {
128
+ checks.push({
129
+ label: "".concat(label, " does not gain a clock time"),
130
+ pass: !LOOKS_REFORMATTED.test(plaintext),
131
+ detail: "rendered ".concat(JSON.stringify(plaintext)),
132
+ });
133
+ }
134
+ _b.label = 6;
135
+ case 6:
136
+ i++;
137
+ return [3 /*break*/, 4];
138
+ case 7: return [4 /*yield*/, sdk.api.templates.get_templated_message({
139
+ enduserId: enduser.id,
140
+ userId: userId,
141
+ channel: 'Chat',
142
+ message: "DOB: {{enduser.DateField0}}",
143
+ })];
144
+ case 8:
145
+ dob = (_b.sent()).plaintext;
146
+ checks.push({
147
+ label: 'a date of birth does not render as the previous day',
148
+ pass: dob.includes('1985-03-12') && !dob.includes('3/11/1985'),
149
+ detail: "rendered ".concat(JSON.stringify(dob)),
150
+ });
151
+ return [4 /*yield*/, sdk.api.templates.get_templated_message({
152
+ enduserId: enduser.id,
153
+ userId: userId,
154
+ channel: 'Chat',
155
+ message: "{{enduser.fname}} {{enduser.lname}}",
156
+ })];
157
+ case 9:
158
+ control = (_b.sent()).plaintext;
159
+ checks.push({
160
+ label: 'control: non-date fields are still templated at all',
161
+ pass: control === 'Date Fields',
162
+ detail: "rendered ".concat(JSON.stringify(control)),
163
+ });
164
+ return [2 /*return*/, checks];
165
+ case 10: return [4 /*yield*/, tenant.teardown()];
166
+ case 11:
167
+ _b.sent();
168
+ return [7 /*endfinally*/];
169
+ case 12: return [2 /*return*/];
170
+ }
171
+ });
172
+ }); };
173
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
174
+ var templated_message_date_field_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
175
+ var _a, _b;
176
+ return __generator(this, function (_c) {
177
+ switch (_c.label) {
178
+ case 0:
179
+ _a = setup_isolated_1.assert_checks;
180
+ _b = ['Templated message date-shaped fields'];
181
+ return [4 /*yield*/, templated_message_date_field_checks()];
182
+ case 1:
183
+ _a.apply(void 0, _b.concat([_c.sent()]));
184
+ return [2 /*return*/];
185
+ }
186
+ });
187
+ }); };
188
+ exports.templated_message_date_field_tests = templated_message_date_field_tests;
189
+ // Allow running this test file independently
190
+ if (require.main === module) {
191
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
192
+ (0, exports.templated_message_date_field_tests)()
193
+ .then(function () {
194
+ console.log("✅ Templated message date field test suite completed successfully");
195
+ process.exit(0);
196
+ })
197
+ .catch(function (error) {
198
+ console.error("❌ Templated message date field test suite failed:", error);
199
+ process.exit(1);
200
+ });
201
+ }
202
+ //# sourceMappingURL=templated_message_date_fields.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated_message_date_fields.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_date_fields.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
2
+ export declare const templated_message_link_in_href_tests: () => Promise<void>;
3
+ //# sourceMappingURL=templated_message_link_in_href.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated_message_link_in_href.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_link_in_href.test.ts"],"names":[],"mappings":"AAyKA,kFAAkF;AAClF,eAAO,MAAM,oCAAoC,qBAEhD,CAAA"}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.templated_message_link_in_href_tests = void 0;
40
+ require('source-map-support').install();
41
+ var setup_isolated_1 = require("../setup_isolated");
42
+ var host = process.env.API_URL || 'http://localhost:8080';
43
+ /**
44
+ * Coverage for what `get_templated_message` does with a `{url}[text]` link template that sits in
45
+ * ATTRIBUTE position rather than in body text.
46
+ *
47
+ * `replaceLinks` scans the html as a flat string and, for every link template it finds, substitutes a
48
+ * complete `<a href="<tracking url>">text</a>` element. In body text that is the whole point. Inside an
49
+ * attribute it corrupts the document:
50
+ *
51
+ * <a href="{https://x.com}[Click]" target="_blank" style="...">Button</a>
52
+ * became
53
+ * <a href="<a href="https://api.../r/TOKEN">Click</a>" target="_blank" style="...">Button</a>
54
+ *
55
+ * An html parser ends that start tag at the inner `">`, so the href value and every attribute after it
56
+ * render as visible text in the recipient's mail client — a styled CTA button turns into a paragraph of
57
+ * markup. That is what was reported from staging: a button reading
58
+ * `https://google.com/m" target="_blank" style="display:inline-block; ...;"> View Details`.
59
+ *
60
+ * A link template reaches an href either because the author put one there, or because they used a merge
61
+ * field there: every link resolver in `message_templating.ts` (`{{forms.<id>.link}}`,
62
+ * `{{portal.link.<page>}}`, `{{files.<id>.link}}`, ...) returns the `{url}[text]` form, not a URL, so
63
+ * `href="{{forms.<id>.link}}"` lands in the same place. `[$LINK_ONLY]` was the only way to avoid it, and
64
+ * nothing told an author it existed.
65
+ *
66
+ * Now a template in attribute position resolves to the bare tracking URL — tracked exactly as before,
67
+ * with the author's own anchor, styling and target left intact.
68
+ *
69
+ * End-to-end through the endpoint on purpose: `replaceLinks` is module-private, and this is the same
70
+ * endpoint the worker calls through `api_bridge.get_templated_message` on every outbound email.
71
+ *
72
+ * Runs standalone or as part of the main suite:
73
+ * npm run test:modular -- api_tests/templated_message_link_in_href
74
+ */
75
+ var LINK = 'https://example.com/landing-page';
76
+ /** The reported shape: a table-based email CTA whose href holds a link template. */
77
+ var BUTTON_HTML = function (linkTemplate) { return ("<td align=\"center\" style=\"border-radius: 30px;\">"
78
+ + "<a href=\"".concat(linkTemplate, "\" target=\"_blank\" style=\"display:inline-block; padding: 14px 36px; color:#ffffff;\">View Details</a>")
79
+ + "</td>"); };
80
+ /** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
81
+ var TRACKING_URL_EXP = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
82
+ var templated_message_link_in_href_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
83
+ var checks, tenant, sdk_1, userId_1, enduser_1, templated, attributeHTML, cases, _i, cases_1, _a, label, message, html, bodyTemplate, _b, bodyHTML, bodyText, afterStrayBracket, strayHTML, linkOnlyHTML, mixed, mixedHTML, control;
84
+ return __generator(this, function (_c) {
85
+ switch (_c.label) {
86
+ case 0:
87
+ checks = [];
88
+ return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({ users: [{ isAdmin: true }] })];
89
+ case 1:
90
+ tenant = _c.sent();
91
+ _c.label = 2;
92
+ case 2:
93
+ _c.trys.push([2, , 13, 15]);
94
+ sdk_1 = tenant.sdk;
95
+ userId_1 = tenant.users[0].id;
96
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Href' })];
97
+ case 3:
98
+ enduser_1 = _c.sent();
99
+ templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
100
+ enduserId: enduser_1.id,
101
+ userId: userId_1,
102
+ channel: 'Email',
103
+ message: message,
104
+ html: html,
105
+ }); };
106
+ attributeHTML = BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
107
+ cases = [
108
+ { label: 'plaintext carries the template too (composer HTML mode)', message: attributeHTML },
109
+ { label: 'plaintext differs from html', message: 'View details at our site' },
110
+ ];
111
+ _i = 0, cases_1 = cases;
112
+ _c.label = 4;
113
+ case 4:
114
+ if (!(_i < cases_1.length)) return [3 /*break*/, 7];
115
+ _a = cases_1[_i], label = _a.label, message = _a.message;
116
+ return [4 /*yield*/, templated(message, attributeHTML)];
117
+ case 5:
118
+ html = (_c.sent()).html;
119
+ checks.push({
120
+ label: "no <a> is spliced inside the href \u2014 ".concat(label),
121
+ pass: !html.includes('href="<a') && !html.includes('</a>"'),
122
+ detail: "rendered ".concat(JSON.stringify(html)),
123
+ });
124
+ checks.push({
125
+ label: "the author's anchor stays a single well-formed tag \u2014 ".concat(label),
126
+ pass: (html.match(/<a\s/g) || []).length === 1 && (html.match(/<\/a>/g) || []).length === 1,
127
+ detail: "rendered ".concat(JSON.stringify(html)),
128
+ });
129
+ checks.push({
130
+ label: "the href is the tracking URL, and the anchor keeps target and style \u2014 ".concat(label),
131
+ pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(html)),
132
+ detail: "rendered ".concat(JSON.stringify(html)),
133
+ });
134
+ checks.push({
135
+ label: "click tracking still happens \u2014 ".concat(label),
136
+ pass: TRACKING_URL_EXP.test(html) && !html.includes(LINK),
137
+ detail: "rendered ".concat(JSON.stringify(html)),
138
+ });
139
+ _c.label = 6;
140
+ case 6:
141
+ _i++;
142
+ return [3 /*break*/, 4];
143
+ case 7:
144
+ bodyTemplate = "Read more here: {".concat(LINK, "}[Read more]");
145
+ return [4 /*yield*/, templated(bodyTemplate, "<p>".concat(bodyTemplate, "</p>"))];
146
+ case 8:
147
+ _b = _c.sent(), bodyHTML = _b.html, bodyText = _b.plaintext;
148
+ checks.push({
149
+ label: 'a link template in body text still becomes an anchor',
150
+ pass: new RegExp("<p>Read more here: <a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a></p>")).test(bodyHTML),
151
+ detail: "rendered ".concat(JSON.stringify(bodyHTML)),
152
+ });
153
+ checks.push({
154
+ label: 'the plaintext version is unaffected by the html handling',
155
+ pass: /^Read more here: Read more \(https?:\/\/.+\/r\/[A-Za-z0-9_-]+\)$/.test(bodyText),
156
+ detail: "rendered ".concat(JSON.stringify(bodyText)),
157
+ });
158
+ afterStrayBracket = "<p>Tom & Jerry <3 \"quotes\" \u2014 {".concat(LINK, "}[Read more]</p>");
159
+ return [4 /*yield*/, templated('Tom & Jerry', afterStrayBracket)];
160
+ case 9:
161
+ strayHTML = (_c.sent()).html;
162
+ checks.push({
163
+ label: 'a stray < in body text does not downgrade the link after it',
164
+ pass: new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a>")).test(strayHTML),
165
+ detail: "rendered ".concat(JSON.stringify(strayHTML)),
166
+ });
167
+ return [4 /*yield*/, templated('Button', BUTTON_HTML("{".concat(LINK, "}[$LINK_ONLY]")))];
168
+ case 10:
169
+ linkOnlyHTML = (_c.sent()).html;
170
+ checks.push({
171
+ label: '[$LINK_ONLY] in an href behaves as it always has',
172
+ pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(linkOnlyHTML)
173
+ && !linkOnlyHTML.includes('$LINK_ONLY')),
174
+ detail: "rendered ".concat(JSON.stringify(linkOnlyHTML)),
175
+ });
176
+ mixed = "<p>Or visit {".concat(LINK, "}[our site]</p>") + BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
177
+ return [4 /*yield*/, templated('Or visit our site', mixed)];
178
+ case 11:
179
+ mixedHTML = (_c.sent()).html;
180
+ checks.push({
181
+ label: 'body and attribute templates in one message each resolve correctly',
182
+ pass: ((mixedHTML.match(/<a\s/g) || []).length === 2
183
+ && !mixedHTML.includes('href="<a')
184
+ && new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">our site</a>")).test(mixedHTML)),
185
+ detail: "rendered ".concat(JSON.stringify(mixedHTML)),
186
+ });
187
+ return [4 /*yield*/, templated('{{enduser.fname}} {{enduser.lname}}', '')];
188
+ case 12:
189
+ control = (_c.sent()).plaintext;
190
+ checks.push({
191
+ label: 'control: templating runs at all',
192
+ pass: control === 'Link Href',
193
+ detail: "rendered ".concat(JSON.stringify(control)),
194
+ });
195
+ return [2 /*return*/, checks];
196
+ case 13: return [4 /*yield*/, tenant.teardown()];
197
+ case 14:
198
+ _c.sent();
199
+ return [7 /*endfinally*/];
200
+ case 15: return [2 /*return*/];
201
+ }
202
+ });
203
+ }); };
204
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
205
+ var templated_message_link_in_href_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
206
+ var _a, _b;
207
+ return __generator(this, function (_c) {
208
+ switch (_c.label) {
209
+ case 0:
210
+ _a = setup_isolated_1.assert_checks;
211
+ _b = ['Templated message link in href'];
212
+ return [4 /*yield*/, templated_message_link_in_href_checks()];
213
+ case 1:
214
+ _a.apply(void 0, _b.concat([_c.sent()]));
215
+ return [2 /*return*/];
216
+ }
217
+ });
218
+ }); };
219
+ exports.templated_message_link_in_href_tests = templated_message_link_in_href_tests;
220
+ // Allow running this test file independently
221
+ if (require.main === module) {
222
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
223
+ (0, exports.templated_message_link_in_href_tests)()
224
+ .then(function () {
225
+ console.log("✅ Templated message link in href test suite completed successfully");
226
+ process.exit(0);
227
+ })
228
+ .catch(function (error) {
229
+ console.error("❌ Templated message link in href test suite failed:", error);
230
+ process.exit(1);
231
+ });
232
+ }
233
+ //# sourceMappingURL=templated_message_link_in_href.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated_message_link_in_href.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_link_in_href.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
2
+ export declare const templated_message_link_tests: () => Promise<void>;
3
+ //# sourceMappingURL=templated_message_links.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated_message_links.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_links.test.ts"],"names":[],"mappings":"AA8KA,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,qBAExC,CAAA"}