@tellescope/sdk 1.256.15 → 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 (299) 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 +5 -3
  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/file-link-session-confinement.test.d.ts +5 -0
  67. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
  68. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +357 -0
  69. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
  70. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js +2 -2
  71. package/lib/cjs/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
  72. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
  73. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
  74. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +297 -0
  75. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
  76. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  77. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
  78. package/lib/cjs/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  79. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
  80. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
  81. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js +202 -0
  82. package/lib/cjs/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
  83. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
  84. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
  85. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js +233 -0
  86. package/lib/cjs/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
  87. package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts +3 -0
  88. package/lib/cjs/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
  89. package/lib/cjs/tests/api_tests/templated_message_links.test.js +235 -0
  90. package/lib/cjs/tests/api_tests/templated_message_links.test.js.map +1 -0
  91. package/lib/cjs/tests/api_tests/time_tracks.test.js +1 -1
  92. package/lib/cjs/tests/api_tests/time_tracks.test.js.map +1 -1
  93. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
  94. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
  95. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +395 -0
  96. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
  97. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
  98. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
  99. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +471 -0
  100. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
  101. package/lib/cjs/tests/api_tests/user_portal_settings.test.js +1 -1
  102. package/lib/cjs/tests/api_tests/user_portal_settings.test.js.map +1 -1
  103. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
  104. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
  105. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js +233 -0
  106. package/lib/cjs/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
  107. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
  108. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
  109. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +569 -0
  110. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
  111. package/lib/cjs/tests/public_endpoint_tests.js +3 -2
  112. package/lib/cjs/tests/public_endpoint_tests.js.map +1 -1
  113. package/lib/cjs/tests/setup.d.ts +16 -0
  114. package/lib/cjs/tests/setup.d.ts.map +1 -1
  115. package/lib/cjs/tests/setup.js +55 -8
  116. package/lib/cjs/tests/setup.js.map +1 -1
  117. package/lib/cjs/tests/setup_isolated.d.ts +9 -0
  118. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  119. package/lib/cjs/tests/setup_isolated.js +23 -2
  120. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  121. package/lib/cjs/tests/socket_tests.d.ts.map +1 -1
  122. package/lib/cjs/tests/socket_tests.js +3 -2
  123. package/lib/cjs/tests/socket_tests.js.map +1 -1
  124. package/lib/cjs/tests/tests.d.ts.map +1 -1
  125. package/lib/cjs/tests/tests.js +182 -166
  126. package/lib/cjs/tests/tests.js.map +1 -1
  127. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
  128. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
  129. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js +118 -0
  130. package/lib/cjs/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
  131. package/lib/cjs/tests/webhooks_tests.js +3 -2
  132. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  133. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  134. package/lib/esm/enduser.d.ts +2 -0
  135. package/lib/esm/enduser.d.ts.map +1 -1
  136. package/lib/esm/sdk.d.ts +8 -5
  137. package/lib/esm/sdk.d.ts.map +1 -1
  138. package/lib/esm/sdk.js +1 -0
  139. package/lib/esm/sdk.js.map +1 -1
  140. package/lib/esm/session.d.ts +2 -0
  141. package/lib/esm/session.d.ts.map +1 -1
  142. package/lib/esm/tests/api_tests/active_patient_count.test.js +1 -1
  143. package/lib/esm/tests/api_tests/active_patient_count.test.js.map +1 -1
  144. package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js +1 -1
  145. package/lib/esm/tests/api_tests/appointment_rescheduled_trigger.test.js.map +1 -1
  146. package/lib/esm/tests/api_tests/calendar_event_limits.test.js +5 -5
  147. package/lib/esm/tests/api_tests/calendar_event_limits.test.js.map +1 -1
  148. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js +1 -1
  149. package/lib/esm/tests/api_tests/calendar_event_references_update.test.js.map +1 -1
  150. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js +1 -1
  151. package/lib/esm/tests/api_tests/enduser_cross_access_isolation.test.js.map +1 -1
  152. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +21 -0
  153. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -0
  154. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +210 -0
  155. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -0
  156. package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js +7 -7
  157. package/lib/esm/tests/api_tests/enduser_login_rate_limits.test.js.map +1 -1
  158. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js +4 -4
  159. package/lib/esm/tests/api_tests/enduser_session_invalidation.test.js.map +1 -1
  160. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +32 -0
  161. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -0
  162. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +252 -0
  163. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -0
  164. package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js +1 -1
  165. package/lib/esm/tests/api_tests/managed_content_enduser_access.test.js.map +1 -1
  166. package/lib/esm/tests/api_tests/managed_content_file_access.test.js +1 -1
  167. package/lib/esm/tests/api_tests/managed_content_file_access.test.js.map +1 -1
  168. package/lib/esm/tests/api_tests/mdi_webhooks.test.d.ts.map +1 -1
  169. package/lib/esm/tests/api_tests/mdi_webhooks.test.js +21 -8
  170. package/lib/esm/tests/api_tests/mdi_webhooks.test.js.map +1 -1
  171. package/lib/esm/tests/api_tests/nutrition_tracking.test.js +1 -1
  172. package/lib/esm/tests/api_tests/nutrition_tracking.test.js.map +1 -1
  173. package/lib/esm/tests/api_tests/openloop_webhooks.test.js +1 -1
  174. package/lib/esm/tests/api_tests/openloop_webhooks.test.js.map +1 -1
  175. package/lib/esm/tests/api_tests/programs.test.d.ts +5 -0
  176. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -0
  177. package/lib/esm/tests/api_tests/programs.test.js +365 -0
  178. package/lib/esm/tests/api_tests/programs.test.js.map +1 -0
  179. package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts +5 -0
  180. package/lib/esm/tests/api_tests/programs_trigger_filters.test.d.ts.map +1 -0
  181. package/lib/esm/tests/api_tests/programs_trigger_filters.test.js +290 -0
  182. package/lib/esm/tests/api_tests/programs_trigger_filters.test.js.map +1 -0
  183. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js +1 -1
  184. package/lib/esm/tests/api_tests/security/allowed-paths-confinement.test.js.map +1 -1
  185. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +42 -0
  186. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -0
  187. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +479 -0
  188. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -0
  189. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js +1 -1
  190. package/lib/esm/tests/api_tests/security/booking-info-idor-token-mint.test.js.map +1 -1
  191. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js +1 -1
  192. package/lib/esm/tests/api_tests/security/enduser-ai-summary-trust-gate.test.js.map +1 -1
  193. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js +1 -1
  194. package/lib/esm/tests/api_tests/security/enduser-cross-create.test.js.map +1 -1
  195. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js +1 -1
  196. package/lib/esm/tests/api_tests/security/enduser-write-restrictions.test.js.map +1 -1
  197. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +5 -0
  198. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -0
  199. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +349 -0
  200. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -0
  201. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js +3 -3
  202. package/lib/esm/tests/api_tests/security/invite-user-enumeration.test.js.map +1 -1
  203. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +32 -0
  204. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -0
  205. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +292 -0
  206. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -0
  207. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.d.ts.map +1 -1
  208. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js +4 -1
  209. package/lib/esm/tests/api_tests/security/sanitize-user-html-with-iframes.test.js.map +1 -1
  210. package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts +3 -0
  211. package/lib/esm/tests/api_tests/templated_message_date_fields.test.d.ts.map +1 -0
  212. package/lib/esm/tests/api_tests/templated_message_date_fields.test.js +198 -0
  213. package/lib/esm/tests/api_tests/templated_message_date_fields.test.js.map +1 -0
  214. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts +3 -0
  215. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.d.ts.map +1 -0
  216. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js +229 -0
  217. package/lib/esm/tests/api_tests/templated_message_link_in_href.test.js.map +1 -0
  218. package/lib/esm/tests/api_tests/templated_message_links.test.d.ts +3 -0
  219. package/lib/esm/tests/api_tests/templated_message_links.test.d.ts.map +1 -0
  220. package/lib/esm/tests/api_tests/templated_message_links.test.js +231 -0
  221. package/lib/esm/tests/api_tests/templated_message_links.test.js.map +1 -0
  222. package/lib/esm/tests/api_tests/time_tracks.test.js +1 -1
  223. package/lib/esm/tests/api_tests/time_tracks.test.js.map +1 -1
  224. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +5 -0
  225. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -0
  226. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +390 -0
  227. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -0
  228. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +5 -0
  229. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -0
  230. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +466 -0
  231. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -0
  232. package/lib/esm/tests/api_tests/user_portal_settings.test.js +1 -1
  233. package/lib/esm/tests/api_tests/user_portal_settings.test.js.map +1 -1
  234. package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts +2 -0
  235. package/lib/esm/tests/api_tests/validation_behavior_locks.test.d.ts.map +1 -0
  236. package/lib/esm/tests/api_tests/validation_behavior_locks.test.js +229 -0
  237. package/lib/esm/tests/api_tests/validation_behavior_locks.test.js.map +1 -0
  238. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +5 -0
  239. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -0
  240. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +564 -0
  241. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -0
  242. package/lib/esm/tests/public_endpoint_tests.js +3 -2
  243. package/lib/esm/tests/public_endpoint_tests.js.map +1 -1
  244. package/lib/esm/tests/setup.d.ts +16 -0
  245. package/lib/esm/tests/setup.d.ts.map +1 -1
  246. package/lib/esm/tests/setup.js +53 -7
  247. package/lib/esm/tests/setup.js.map +1 -1
  248. package/lib/esm/tests/setup_isolated.d.ts +9 -0
  249. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  250. package/lib/esm/tests/setup_isolated.js +21 -1
  251. package/lib/esm/tests/setup_isolated.js.map +1 -1
  252. package/lib/esm/tests/socket_tests.d.ts.map +1 -1
  253. package/lib/esm/tests/socket_tests.js +3 -2
  254. package/lib/esm/tests/socket_tests.js.map +1 -1
  255. package/lib/esm/tests/tests.d.ts.map +1 -1
  256. package/lib/esm/tests/tests.js +182 -166
  257. package/lib/esm/tests/tests.js.map +1 -1
  258. package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts +3 -0
  259. package/lib/esm/tests/unit_tests/trigger_title_partials.test.d.ts.map +1 -0
  260. package/lib/esm/tests/unit_tests/trigger_title_partials.test.js +115 -0
  261. package/lib/esm/tests/unit_tests/trigger_title_partials.test.js.map +1 -0
  262. package/lib/esm/tests/webhooks_tests.js +3 -2
  263. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  264. package/lib/tsconfig.tsbuildinfo +1 -1
  265. package/package.json +22 -19
  266. package/src/sdk.ts +5 -1
  267. package/src/tests/api_tests/active_patient_count.test.ts +1 -1
  268. package/src/tests/api_tests/appointment_rescheduled_trigger.test.ts +1 -1
  269. package/src/tests/api_tests/calendar_event_references_update.test.ts +1 -1
  270. package/src/tests/api_tests/enduser_cross_access_isolation.test.ts +1 -1
  271. package/src/tests/api_tests/enduser_login_rate_limits.test.ts +7 -7
  272. package/src/tests/api_tests/enduser_session_invalidation.test.ts +4 -4
  273. package/src/tests/api_tests/managed_content_enduser_access.test.ts +1 -1
  274. package/src/tests/api_tests/managed_content_file_access.test.ts +1 -1
  275. package/src/tests/api_tests/mdi_webhooks.test.ts +9 -0
  276. package/src/tests/api_tests/nutrition_tracking.test.ts +1 -1
  277. package/src/tests/api_tests/openloop_webhooks.test.ts +1 -1
  278. package/src/tests/api_tests/security/allowed-paths-confinement.test.ts +1 -1
  279. package/src/tests/api_tests/security/booking-info-idor-token-mint.test.ts +1 -1
  280. package/src/tests/api_tests/security/enduser-ai-summary-trust-gate.test.ts +1 -1
  281. package/src/tests/api_tests/security/enduser-cross-create.test.ts +1 -1
  282. package/src/tests/api_tests/security/enduser-write-restrictions.test.ts +1 -1
  283. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +291 -0
  284. package/src/tests/api_tests/security/invite-user-enumeration.test.ts +3 -3
  285. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +197 -0
  286. package/src/tests/api_tests/security/sanitize-user-html-with-iframes.test.ts +4 -1
  287. package/src/tests/api_tests/templated_message_date_fields.test.ts +146 -0
  288. package/src/tests/api_tests/templated_message_links.test.ts +192 -0
  289. package/src/tests/api_tests/time_tracks.test.ts +1 -1
  290. package/src/tests/api_tests/user_portal_settings.test.ts +1 -1
  291. package/src/tests/api_tests/validation_behavior_locks.test.ts +204 -0
  292. package/src/tests/public_endpoint_tests.ts +3 -2
  293. package/src/tests/setup.ts +43 -7
  294. package/src/tests/setup_isolated.ts +10 -0
  295. package/src/tests/socket_tests.ts +3 -2
  296. package/src/tests/tests.ts +12 -2
  297. package/src/tests/webhooks_tests.ts +4 -2
  298. package/test_generated.pdf +0 -0
  299. package/tsconfig.cjs.json +17 -0
@@ -0,0 +1,229 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import { assert_checks, setup_isolated_tenant, } from "../setup_isolated";
39
+ var host = process.env.API_URL || 'http://localhost:8080';
40
+ /**
41
+ * Coverage for what `get_templated_message` does with a `{url}[text]` link template that sits in
42
+ * ATTRIBUTE position rather than in body text.
43
+ *
44
+ * `replaceLinks` scans the html as a flat string and, for every link template it finds, substitutes a
45
+ * complete `<a href="<tracking url>">text</a>` element. In body text that is the whole point. Inside an
46
+ * attribute it corrupts the document:
47
+ *
48
+ * <a href="{https://x.com}[Click]" target="_blank" style="...">Button</a>
49
+ * became
50
+ * <a href="<a href="https://api.../r/TOKEN">Click</a>" target="_blank" style="...">Button</a>
51
+ *
52
+ * An html parser ends that start tag at the inner `">`, so the href value and every attribute after it
53
+ * render as visible text in the recipient's mail client — a styled CTA button turns into a paragraph of
54
+ * markup. That is what was reported from staging: a button reading
55
+ * `https://google.com/m" target="_blank" style="display:inline-block; ...;"> View Details`.
56
+ *
57
+ * A link template reaches an href either because the author put one there, or because they used a merge
58
+ * field there: every link resolver in `message_templating.ts` (`{{forms.<id>.link}}`,
59
+ * `{{portal.link.<page>}}`, `{{files.<id>.link}}`, ...) returns the `{url}[text]` form, not a URL, so
60
+ * `href="{{forms.<id>.link}}"` lands in the same place. `[$LINK_ONLY]` was the only way to avoid it, and
61
+ * nothing told an author it existed.
62
+ *
63
+ * Now a template in attribute position resolves to the bare tracking URL — tracked exactly as before,
64
+ * with the author's own anchor, styling and target left intact.
65
+ *
66
+ * End-to-end through the endpoint on purpose: `replaceLinks` is module-private, and this is the same
67
+ * endpoint the worker calls through `api_bridge.get_templated_message` on every outbound email.
68
+ *
69
+ * Runs standalone or as part of the main suite:
70
+ * npm run test:modular -- api_tests/templated_message_link_in_href
71
+ */
72
+ var LINK = 'https://example.com/landing-page';
73
+ /** The reported shape: a table-based email CTA whose href holds a link template. */
74
+ var BUTTON_HTML = function (linkTemplate) { return ("<td align=\"center\" style=\"border-radius: 30px;\">"
75
+ + "<a href=\"".concat(linkTemplate, "\" target=\"_blank\" style=\"display:inline-block; padding: 14px 36px; color:#ffffff;\">View Details</a>")
76
+ + "</td>"); };
77
+ /** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
78
+ var TRACKING_URL_EXP = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
79
+ var templated_message_link_in_href_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
80
+ 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;
81
+ return __generator(this, function (_c) {
82
+ switch (_c.label) {
83
+ case 0:
84
+ checks = [];
85
+ return [4 /*yield*/, setup_isolated_tenant({ users: [{ isAdmin: true }] })];
86
+ case 1:
87
+ tenant = _c.sent();
88
+ _c.label = 2;
89
+ case 2:
90
+ _c.trys.push([2, , 13, 15]);
91
+ sdk_1 = tenant.sdk;
92
+ userId_1 = tenant.users[0].id;
93
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Href' })];
94
+ case 3:
95
+ enduser_1 = _c.sent();
96
+ templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
97
+ enduserId: enduser_1.id,
98
+ userId: userId_1,
99
+ channel: 'Email',
100
+ message: message,
101
+ html: html,
102
+ }); };
103
+ attributeHTML = BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
104
+ cases = [
105
+ { label: 'plaintext carries the template too (composer HTML mode)', message: attributeHTML },
106
+ { label: 'plaintext differs from html', message: 'View details at our site' },
107
+ ];
108
+ _i = 0, cases_1 = cases;
109
+ _c.label = 4;
110
+ case 4:
111
+ if (!(_i < cases_1.length)) return [3 /*break*/, 7];
112
+ _a = cases_1[_i], label = _a.label, message = _a.message;
113
+ return [4 /*yield*/, templated(message, attributeHTML)];
114
+ case 5:
115
+ html = (_c.sent()).html;
116
+ checks.push({
117
+ label: "no <a> is spliced inside the href \u2014 ".concat(label),
118
+ pass: !html.includes('href="<a') && !html.includes('</a>"'),
119
+ detail: "rendered ".concat(JSON.stringify(html)),
120
+ });
121
+ checks.push({
122
+ label: "the author's anchor stays a single well-formed tag \u2014 ".concat(label),
123
+ pass: (html.match(/<a\s/g) || []).length === 1 && (html.match(/<\/a>/g) || []).length === 1,
124
+ detail: "rendered ".concat(JSON.stringify(html)),
125
+ });
126
+ checks.push({
127
+ label: "the href is the tracking URL, and the anchor keeps target and style \u2014 ".concat(label),
128
+ pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(html)),
129
+ detail: "rendered ".concat(JSON.stringify(html)),
130
+ });
131
+ checks.push({
132
+ label: "click tracking still happens \u2014 ".concat(label),
133
+ pass: TRACKING_URL_EXP.test(html) && !html.includes(LINK),
134
+ detail: "rendered ".concat(JSON.stringify(html)),
135
+ });
136
+ _c.label = 6;
137
+ case 6:
138
+ _i++;
139
+ return [3 /*break*/, 4];
140
+ case 7:
141
+ bodyTemplate = "Read more here: {".concat(LINK, "}[Read more]");
142
+ return [4 /*yield*/, templated(bodyTemplate, "<p>".concat(bodyTemplate, "</p>"))];
143
+ case 8:
144
+ _b = _c.sent(), bodyHTML = _b.html, bodyText = _b.plaintext;
145
+ checks.push({
146
+ label: 'a link template in body text still becomes an anchor',
147
+ pass: new RegExp("<p>Read more here: <a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a></p>")).test(bodyHTML),
148
+ detail: "rendered ".concat(JSON.stringify(bodyHTML)),
149
+ });
150
+ checks.push({
151
+ label: 'the plaintext version is unaffected by the html handling',
152
+ pass: /^Read more here: Read more \(https?:\/\/.+\/r\/[A-Za-z0-9_-]+\)$/.test(bodyText),
153
+ detail: "rendered ".concat(JSON.stringify(bodyText)),
154
+ });
155
+ afterStrayBracket = "<p>Tom & Jerry <3 \"quotes\" \u2014 {".concat(LINK, "}[Read more]</p>");
156
+ return [4 /*yield*/, templated('Tom & Jerry', afterStrayBracket)];
157
+ case 9:
158
+ strayHTML = (_c.sent()).html;
159
+ checks.push({
160
+ label: 'a stray < in body text does not downgrade the link after it',
161
+ pass: new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">Read more</a>")).test(strayHTML),
162
+ detail: "rendered ".concat(JSON.stringify(strayHTML)),
163
+ });
164
+ return [4 /*yield*/, templated('Button', BUTTON_HTML("{".concat(LINK, "}[$LINK_ONLY]")))];
165
+ case 10:
166
+ linkOnlyHTML = (_c.sent()).html;
167
+ checks.push({
168
+ label: '[$LINK_ONLY] in an href behaves as it always has',
169
+ pass: (new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\" target=\"_blank\" style=\"[^\"]+\">View Details</a>")).test(linkOnlyHTML)
170
+ && !linkOnlyHTML.includes('$LINK_ONLY')),
171
+ detail: "rendered ".concat(JSON.stringify(linkOnlyHTML)),
172
+ });
173
+ mixed = "<p>Or visit {".concat(LINK, "}[our site]</p>") + BUTTON_HTML("{".concat(LINK, "}[").concat(LINK, "]"));
174
+ return [4 /*yield*/, templated('Or visit our site', mixed)];
175
+ case 11:
176
+ mixedHTML = (_c.sent()).html;
177
+ checks.push({
178
+ label: 'body and attribute templates in one message each resolve correctly',
179
+ pass: ((mixedHTML.match(/<a\s/g) || []).length === 2
180
+ && !mixedHTML.includes('href="<a')
181
+ && new RegExp("<a href=\"".concat(TRACKING_URL_EXP.source, "\">our site</a>")).test(mixedHTML)),
182
+ detail: "rendered ".concat(JSON.stringify(mixedHTML)),
183
+ });
184
+ return [4 /*yield*/, templated('{{enduser.fname}} {{enduser.lname}}', '')];
185
+ case 12:
186
+ control = (_c.sent()).plaintext;
187
+ checks.push({
188
+ label: 'control: templating runs at all',
189
+ pass: control === 'Link Href',
190
+ detail: "rendered ".concat(JSON.stringify(control)),
191
+ });
192
+ return [2 /*return*/, checks];
193
+ case 13: return [4 /*yield*/, tenant.teardown()];
194
+ case 14:
195
+ _c.sent();
196
+ return [7 /*endfinally*/];
197
+ case 15: return [2 /*return*/];
198
+ }
199
+ });
200
+ }); };
201
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
202
+ export var templated_message_link_in_href_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
203
+ var _a, _b;
204
+ return __generator(this, function (_c) {
205
+ switch (_c.label) {
206
+ case 0:
207
+ _a = assert_checks;
208
+ _b = ['Templated message link in href'];
209
+ return [4 /*yield*/, templated_message_link_in_href_checks()];
210
+ case 1:
211
+ _a.apply(void 0, _b.concat([_c.sent()]));
212
+ return [2 /*return*/];
213
+ }
214
+ });
215
+ }); };
216
+ // Allow running this test file independently
217
+ if (require.main === module) {
218
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
219
+ templated_message_link_in_href_tests()
220
+ .then(function () {
221
+ console.log("✅ Templated message link in href test suite completed successfully");
222
+ process.exit(0);
223
+ })
224
+ .catch(function (error) {
225
+ console.error("❌ Templated message link in href test suite failed:", error);
226
+ process.exit(1);
227
+ });
228
+ }
229
+ //# 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"}
@@ -0,0 +1,231 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ require('source-map-support').install();
38
+ import { assert_checks, setup_isolated_tenant, } from "../setup_isolated";
39
+ var host = process.env.API_URL || 'http://localhost:8080';
40
+ /**
41
+ * Link templating through the real `templates.get_templated_message` — the same endpoint the worker
42
+ * calls on every outbound email and SMS.
43
+ *
44
+ * The exhaustive coverage of this path lives in the API's own module test
45
+ * (`packages/private/api/api/modules/message_templating.test.ts`), which stubs the database so a case
46
+ * costs microseconds. This suite exists to prove those stubs still describe the real thing: that a
47
+ * rendered link really is a `/r/<token>` redirect, and that `linkOpenTrackingIds` really is one id per
48
+ * redirect record created.
49
+ *
50
+ * Deliberately small. Every case here writes real `url_redirects` rows, and `teardown_tenant` does not
51
+ * remove them — that collection is in neither `schema` nor `getInternalQueries()` — so each extra case
52
+ * leaves rows behind in the database forever.
53
+ *
54
+ * Runs standalone or as part of the main suite:
55
+ * npm run test:modular -- api_tests/templated_message_links
56
+ */
57
+ /** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
58
+ var REDIRECT = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
59
+ /** Bound on the one case that used to hang the request, so a regression fails instead of stalling. */
60
+ var CLIENT_WAIT_MS = 20000;
61
+ var LINK = 'https://example.com/landing';
62
+ var templated_message_link_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
63
+ var checks, tenant, sdk_1, userId_1, enduser_1, templated, body, _a, html, plaintext, linkOpenTrackingIds, body, _b, html, linkOpenTrackingIds, body, _c, html, plaintext, linkOpenTrackingIds, form, body, _d, html, linkOpenTrackingIds, body, outcome, _e, html, linkOpenTrackingIds;
64
+ return __generator(this, function (_f) {
65
+ switch (_f.label) {
66
+ case 0:
67
+ checks = [];
68
+ return [4 /*yield*/, setup_isolated_tenant({ users: [{ isAdmin: true }] })];
69
+ case 1:
70
+ tenant = _f.sent();
71
+ _f.label = 2;
72
+ case 2:
73
+ _f.trys.push([2, , 15, 17]);
74
+ sdk_1 = tenant.sdk;
75
+ userId_1 = tenant.users[0].id;
76
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Templating' })];
77
+ case 3:
78
+ enduser_1 = _f.sent();
79
+ templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
80
+ enduserId: enduser_1.id,
81
+ userId: userId_1,
82
+ channel: 'Email',
83
+ message: message,
84
+ html: html,
85
+ }); };
86
+ body = "Go: {".concat(LINK, "}[Click]");
87
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
88
+ case 4:
89
+ _a = _f.sent(), html = _a.html, plaintext = _a.plaintext, linkOpenTrackingIds = _a.linkOpenTrackingIds;
90
+ checks.push({
91
+ label: 'html renders an anchor whose href is a /r/ redirect',
92
+ pass: new RegExp("^<p>Go: <a href=\"".concat(REDIRECT.source, "\">Click</a></p>$")).test(html),
93
+ detail: "rendered ".concat(JSON.stringify(html)),
94
+ });
95
+ checks.push({
96
+ label: 'plaintext appends the same redirect in parentheses',
97
+ pass: new RegExp("^Go: Click \\(".concat(REDIRECT.source, "\\)$")).test(plaintext),
98
+ detail: "rendered ".concat(JSON.stringify(plaintext)),
99
+ });
100
+ checks.push({
101
+ label: 'one link creates exactly one redirect record',
102
+ pass: linkOpenTrackingIds.length === 1,
103
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
104
+ });
105
+ body = "One {".concat(LINK, "/a}[A], two {").concat(LINK, "/b}[B], three {").concat(LINK, "/c}[C]");
106
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
107
+ case 5:
108
+ _b = _f.sent(), html = _b.html, linkOpenTrackingIds = _b.linkOpenTrackingIds;
109
+ checks.push({
110
+ label: 'every link in one message is replaced',
111
+ pass: (html.match(/<a href="/g) || []).length === 3 && !html.includes('{'),
112
+ detail: "rendered ".concat(JSON.stringify(html)),
113
+ });
114
+ checks.push({
115
+ label: 'three links create exactly three redirect records',
116
+ pass: linkOpenTrackingIds.length === 3,
117
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
118
+ });
119
+ body = "Go: {".concat(LINK, "}[$LINK_ONLY]");
120
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
121
+ case 6:
122
+ _c = _f.sent(), html = _c.html, plaintext = _c.plaintext, linkOpenTrackingIds = _c.linkOpenTrackingIds;
123
+ checks.push({
124
+ label: '$LINK_ONLY substitutes the bare redirect url',
125
+ pass: new RegExp("^<p>Go: ".concat(REDIRECT.source, "</p>$")).test(html)
126
+ && new RegExp("^Go: ".concat(REDIRECT.source, "$")).test(plaintext),
127
+ detail: "html ".concat(JSON.stringify(html), ", plaintext ").concat(JSON.stringify(plaintext)),
128
+ });
129
+ checks.push({
130
+ label: '$LINK_ONLY still creates its redirect record',
131
+ pass: linkOpenTrackingIds.length === 1,
132
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
133
+ });
134
+ return [4 /*yield*/, sdk_1.api.forms.createOne({ title: "Link templating ".concat(Date.now()) })];
135
+ case 7:
136
+ form = _f.sent();
137
+ _f.label = 8;
138
+ case 8:
139
+ _f.trys.push([8, , 10, 12]);
140
+ body = "Start here: {{forms.".concat(form.id, ".link:Begin}}");
141
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
142
+ case 9:
143
+ _d = _f.sent(), html = _d.html, linkOpenTrackingIds = _d.linkOpenTrackingIds;
144
+ checks.push({
145
+ label: 'a form link merge field becomes an anchor on a redirect',
146
+ pass: new RegExp("^<p>Start here: <a href=\"".concat(REDIRECT.source, "\">Begin</a></p>$")).test(html),
147
+ detail: "rendered ".concat(JSON.stringify(html)),
148
+ });
149
+ checks.push({
150
+ label: 'the form link creates exactly one redirect record',
151
+ pass: linkOpenTrackingIds.length === 1,
152
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
153
+ });
154
+ return [3 /*break*/, 12];
155
+ case 10: return [4 /*yield*/, sdk_1.api.forms.deleteOne(form.id)];
156
+ case 11:
157
+ _f.sent();
158
+ return [7 /*endfinally*/];
159
+ case 12:
160
+ body = "Go: {".concat(LINK, "} [Click]");
161
+ return [4 /*yield*/, Promise.race([
162
+ templated(body, "<p>".concat(body, "</p>")).then(function (r) { return r; }).catch(function (e) { var _a; return ({ error: (_a = e === null || e === void 0 ? void 0 : e.message) !== null && _a !== void 0 ? _a : String(e) }); }),
163
+ new Promise(function (resolve) { return setTimeout(function () { return resolve({ timedOut: true }); }, CLIENT_WAIT_MS); }),
164
+ ])];
165
+ case 13:
166
+ outcome = _f.sent();
167
+ checks.push({
168
+ label: 'a template the server cannot replace still returns a response',
169
+ pass: !outcome.timedOut && !outcome.error,
170
+ detail: outcome.timedOut
171
+ ? "no response within ".concat(CLIENT_WAIT_MS, "ms \u2014 the templating loop stopped terminating")
172
+ : outcome.error ? "errored: ".concat(outcome.error) : 'responded',
173
+ });
174
+ if (!outcome.timedOut && !outcome.error) {
175
+ checks.push({
176
+ label: 'it is left literal in both the html and the plaintext',
177
+ pass: outcome.html === "<p>".concat(body, "</p>") && outcome.plaintext === body,
178
+ detail: "html ".concat(JSON.stringify(outcome.html), ", plaintext ").concat(JSON.stringify(outcome.plaintext)),
179
+ });
180
+ checks.push({
181
+ label: 'and it creates no redirect records at all',
182
+ pass: outcome.linkOpenTrackingIds.length === 0,
183
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(outcome.linkOpenTrackingIds)),
184
+ });
185
+ }
186
+ return [4 /*yield*/, templated('No links here', '<p>No links here</p>')];
187
+ case 14:
188
+ _e = _f.sent(), html = _e.html, linkOpenTrackingIds = _e.linkOpenTrackingIds;
189
+ checks.push({
190
+ label: 'control: a body without link syntax is untouched and creates no records',
191
+ pass: html === '<p>No links here</p>' && linkOpenTrackingIds.length === 0,
192
+ detail: "rendered ".concat(JSON.stringify(html), ", linkOpenTrackingIds=").concat(JSON.stringify(linkOpenTrackingIds)),
193
+ });
194
+ return [2 /*return*/, checks];
195
+ case 15: return [4 /*yield*/, tenant.teardown()];
196
+ case 16:
197
+ _f.sent();
198
+ return [7 /*endfinally*/];
199
+ case 17: return [2 /*return*/];
200
+ }
201
+ });
202
+ }); };
203
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
204
+ export var templated_message_link_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
205
+ var _a, _b;
206
+ return __generator(this, function (_c) {
207
+ switch (_c.label) {
208
+ case 0:
209
+ _a = assert_checks;
210
+ _b = ['Templated message links'];
211
+ return [4 /*yield*/, templated_message_link_checks()];
212
+ case 1:
213
+ _a.apply(void 0, _b.concat([_c.sent()]));
214
+ return [2 /*return*/];
215
+ }
216
+ });
217
+ }); };
218
+ // Allow running this test file independently
219
+ if (require.main === module) {
220
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
221
+ templated_message_link_tests()
222
+ .then(function () {
223
+ console.log("✅ Templated message link test suite completed successfully");
224
+ process.exit(0);
225
+ })
226
+ .catch(function (error) {
227
+ console.error("❌ Templated message link test suite failed:", error);
228
+ process.exit(1);
229
+ });
230
+ }
231
+ //# sourceMappingURL=templated_message_links.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templated_message_links.test.js","sourceRoot":"","sources":["../../../../src/tests/api_tests/templated_message_links.test.ts"],"names":[],"mappings":"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"}
@@ -70,7 +70,7 @@ import { Session } from "../../sdk";
70
70
  import { assert, log_header, wait } from "@tellescope/testing";
71
71
  import { setup_tests } from "../setup";
72
72
  var log = console.log;
73
- var host = process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
73
+ var host = process.env.API_URL || process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
74
74
  // Helper to assert that an async function throws an error
75
75
  var assert_throws = function (fn, description) { return __awaiter(void 0, void 0, void 0, function () {
76
76
  var e_1;