@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,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"}
@@ -0,0 +1,235 @@
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_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
+ * Link templating through the real `templates.get_templated_message` — the same endpoint the worker
45
+ * calls on every outbound email and SMS.
46
+ *
47
+ * The exhaustive coverage of this path lives in the API's own module test
48
+ * (`packages/private/api/api/modules/message_templating.test.ts`), which stubs the database so a case
49
+ * costs microseconds. This suite exists to prove those stubs still describe the real thing: that a
50
+ * rendered link really is a `/r/<token>` redirect, and that `linkOpenTrackingIds` really is one id per
51
+ * redirect record created.
52
+ *
53
+ * Deliberately small. Every case here writes real `url_redirects` rows, and `teardown_tenant` does not
54
+ * remove them — that collection is in neither `schema` nor `getInternalQueries()` — so each extra case
55
+ * leaves rows behind in the database forever.
56
+ *
57
+ * Runs standalone or as part of the main suite:
58
+ * npm run test:modular -- api_tests/templated_message_links
59
+ */
60
+ /** A tracked link is `<portal or api url>/r/<token>`; the token itself is not predictable. */
61
+ var REDIRECT = /https?:\/\/[^\s"'<>]+\/r\/[A-Za-z0-9_-]+/;
62
+ /** Bound on the one case that used to hang the request, so a regression fails instead of stalling. */
63
+ var CLIENT_WAIT_MS = 20000;
64
+ var LINK = 'https://example.com/landing';
65
+ var templated_message_link_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
66
+ 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;
67
+ return __generator(this, function (_f) {
68
+ switch (_f.label) {
69
+ case 0:
70
+ checks = [];
71
+ return [4 /*yield*/, (0, setup_isolated_1.setup_isolated_tenant)({ users: [{ isAdmin: true }] })];
72
+ case 1:
73
+ tenant = _f.sent();
74
+ _f.label = 2;
75
+ case 2:
76
+ _f.trys.push([2, , 15, 17]);
77
+ sdk_1 = tenant.sdk;
78
+ userId_1 = tenant.users[0].id;
79
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Link', lname: 'Templating' })];
80
+ case 3:
81
+ enduser_1 = _f.sent();
82
+ templated = function (message, html) { return sdk_1.api.templates.get_templated_message({
83
+ enduserId: enduser_1.id,
84
+ userId: userId_1,
85
+ channel: 'Email',
86
+ message: message,
87
+ html: html,
88
+ }); };
89
+ body = "Go: {".concat(LINK, "}[Click]");
90
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
91
+ case 4:
92
+ _a = _f.sent(), html = _a.html, plaintext = _a.plaintext, linkOpenTrackingIds = _a.linkOpenTrackingIds;
93
+ checks.push({
94
+ label: 'html renders an anchor whose href is a /r/ redirect',
95
+ pass: new RegExp("^<p>Go: <a href=\"".concat(REDIRECT.source, "\">Click</a></p>$")).test(html),
96
+ detail: "rendered ".concat(JSON.stringify(html)),
97
+ });
98
+ checks.push({
99
+ label: 'plaintext appends the same redirect in parentheses',
100
+ pass: new RegExp("^Go: Click \\(".concat(REDIRECT.source, "\\)$")).test(plaintext),
101
+ detail: "rendered ".concat(JSON.stringify(plaintext)),
102
+ });
103
+ checks.push({
104
+ label: 'one link creates exactly one redirect record',
105
+ pass: linkOpenTrackingIds.length === 1,
106
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
107
+ });
108
+ body = "One {".concat(LINK, "/a}[A], two {").concat(LINK, "/b}[B], three {").concat(LINK, "/c}[C]");
109
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
110
+ case 5:
111
+ _b = _f.sent(), html = _b.html, linkOpenTrackingIds = _b.linkOpenTrackingIds;
112
+ checks.push({
113
+ label: 'every link in one message is replaced',
114
+ pass: (html.match(/<a href="/g) || []).length === 3 && !html.includes('{'),
115
+ detail: "rendered ".concat(JSON.stringify(html)),
116
+ });
117
+ checks.push({
118
+ label: 'three links create exactly three redirect records',
119
+ pass: linkOpenTrackingIds.length === 3,
120
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
121
+ });
122
+ body = "Go: {".concat(LINK, "}[$LINK_ONLY]");
123
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
124
+ case 6:
125
+ _c = _f.sent(), html = _c.html, plaintext = _c.plaintext, linkOpenTrackingIds = _c.linkOpenTrackingIds;
126
+ checks.push({
127
+ label: '$LINK_ONLY substitutes the bare redirect url',
128
+ pass: new RegExp("^<p>Go: ".concat(REDIRECT.source, "</p>$")).test(html)
129
+ && new RegExp("^Go: ".concat(REDIRECT.source, "$")).test(plaintext),
130
+ detail: "html ".concat(JSON.stringify(html), ", plaintext ").concat(JSON.stringify(plaintext)),
131
+ });
132
+ checks.push({
133
+ label: '$LINK_ONLY still creates its redirect record',
134
+ pass: linkOpenTrackingIds.length === 1,
135
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
136
+ });
137
+ return [4 /*yield*/, sdk_1.api.forms.createOne({ title: "Link templating ".concat(Date.now()) })];
138
+ case 7:
139
+ form = _f.sent();
140
+ _f.label = 8;
141
+ case 8:
142
+ _f.trys.push([8, , 10, 12]);
143
+ body = "Start here: {{forms.".concat(form.id, ".link:Begin}}");
144
+ return [4 /*yield*/, templated(body, "<p>".concat(body, "</p>"))];
145
+ case 9:
146
+ _d = _f.sent(), html = _d.html, linkOpenTrackingIds = _d.linkOpenTrackingIds;
147
+ checks.push({
148
+ label: 'a form link merge field becomes an anchor on a redirect',
149
+ pass: new RegExp("^<p>Start here: <a href=\"".concat(REDIRECT.source, "\">Begin</a></p>$")).test(html),
150
+ detail: "rendered ".concat(JSON.stringify(html)),
151
+ });
152
+ checks.push({
153
+ label: 'the form link creates exactly one redirect record',
154
+ pass: linkOpenTrackingIds.length === 1,
155
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(linkOpenTrackingIds)),
156
+ });
157
+ return [3 /*break*/, 12];
158
+ case 10: return [4 /*yield*/, sdk_1.api.forms.deleteOne(form.id)];
159
+ case 11:
160
+ _f.sent();
161
+ return [7 /*endfinally*/];
162
+ case 12:
163
+ body = "Go: {".concat(LINK, "} [Click]");
164
+ return [4 /*yield*/, Promise.race([
165
+ 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) }); }),
166
+ new Promise(function (resolve) { return setTimeout(function () { return resolve({ timedOut: true }); }, CLIENT_WAIT_MS); }),
167
+ ])];
168
+ case 13:
169
+ outcome = _f.sent();
170
+ checks.push({
171
+ label: 'a template the server cannot replace still returns a response',
172
+ pass: !outcome.timedOut && !outcome.error,
173
+ detail: outcome.timedOut
174
+ ? "no response within ".concat(CLIENT_WAIT_MS, "ms \u2014 the templating loop stopped terminating")
175
+ : outcome.error ? "errored: ".concat(outcome.error) : 'responded',
176
+ });
177
+ if (!outcome.timedOut && !outcome.error) {
178
+ checks.push({
179
+ label: 'it is left literal in both the html and the plaintext',
180
+ pass: outcome.html === "<p>".concat(body, "</p>") && outcome.plaintext === body,
181
+ detail: "html ".concat(JSON.stringify(outcome.html), ", plaintext ").concat(JSON.stringify(outcome.plaintext)),
182
+ });
183
+ checks.push({
184
+ label: 'and it creates no redirect records at all',
185
+ pass: outcome.linkOpenTrackingIds.length === 0,
186
+ detail: "linkOpenTrackingIds=".concat(JSON.stringify(outcome.linkOpenTrackingIds)),
187
+ });
188
+ }
189
+ return [4 /*yield*/, templated('No links here', '<p>No links here</p>')];
190
+ case 14:
191
+ _e = _f.sent(), html = _e.html, linkOpenTrackingIds = _e.linkOpenTrackingIds;
192
+ checks.push({
193
+ label: 'control: a body without link syntax is untouched and creates no records',
194
+ pass: html === '<p>No links here</p>' && linkOpenTrackingIds.length === 0,
195
+ detail: "rendered ".concat(JSON.stringify(html), ", linkOpenTrackingIds=").concat(JSON.stringify(linkOpenTrackingIds)),
196
+ });
197
+ return [2 /*return*/, checks];
198
+ case 15: return [4 /*yield*/, tenant.teardown()];
199
+ case 16:
200
+ _f.sent();
201
+ return [7 /*endfinally*/];
202
+ case 17: return [2 /*return*/];
203
+ }
204
+ });
205
+ }); };
206
+ /** Asserting wrapper, for standalone runs and for sequential use in the suite. */
207
+ var templated_message_link_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
208
+ var _a, _b;
209
+ return __generator(this, function (_c) {
210
+ switch (_c.label) {
211
+ case 0:
212
+ _a = setup_isolated_1.assert_checks;
213
+ _b = ['Templated message links'];
214
+ return [4 /*yield*/, templated_message_link_checks()];
215
+ case 1:
216
+ _a.apply(void 0, _b.concat([_c.sent()]));
217
+ return [2 /*return*/];
218
+ }
219
+ });
220
+ }); };
221
+ exports.templated_message_link_tests = templated_message_link_tests;
222
+ // Allow running this test file independently
223
+ if (require.main === module) {
224
+ console.log("\uD83C\uDF10 Using API URL: ".concat(host));
225
+ (0, exports.templated_message_link_tests)()
226
+ .then(function () {
227
+ console.log("✅ Templated message link test suite completed successfully");
228
+ process.exit(0);
229
+ })
230
+ .catch(function (error) {
231
+ console.error("❌ Templated message link test suite failed:", error);
232
+ process.exit(1);
233
+ });
234
+ }
235
+ //# 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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"}
@@ -73,7 +73,7 @@ var sdk_1 = require("../../sdk");
73
73
  var testing_1 = require("@tellescope/testing");
74
74
  var setup_1 = require("../setup");
75
75
  var log = console.log;
76
- var host = process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
76
+ var host = process.env.API_URL || process.env.REACT_APP_TELLESCOPE_API_URL || 'http://localhost:8080';
77
77
  // Helper to assert that an async function throws an error
78
78
  var assert_throws = function (fn, description) { return __awaiter(void 0, void 0, void 0, function () {
79
79
  var e_1;