@tellescope/sdk 2.0.0-beta.1 → 2.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/CLAUDE.md +24 -0
  2. package/env.example +6 -0
  3. package/lib/cjs/sdk.d.ts +373 -3
  4. package/lib/cjs/sdk.d.ts.map +1 -1
  5. package/lib/cjs/sdk.js.map +1 -1
  6. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  7. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  8. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +506 -0
  9. package/lib/cjs/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  10. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  11. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  12. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js +3 -1
  13. package/lib/cjs/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  14. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  15. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  16. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js +3 -1
  17. package/lib/cjs/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  18. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  19. package/lib/cjs/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  20. package/lib/cjs/tests/api_tests/form_vital_reading.test.js +461 -0
  21. package/lib/cjs/tests/api_tests/form_vital_reading.test.js.map +1 -0
  22. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  23. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  24. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js +232 -0
  25. package/lib/cjs/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  26. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  27. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  28. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js +243 -0
  29. package/lib/cjs/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  30. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  31. package/lib/cjs/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  32. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js +3 -1
  33. package/lib/cjs/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  34. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts +3 -1
  35. package/lib/cjs/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  36. package/lib/cjs/tests/api_tests/organization_signup.test.js +3 -1
  37. package/lib/cjs/tests/api_tests/organization_signup.test.js.map +1 -1
  38. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  39. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  40. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js +571 -0
  41. package/lib/cjs/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  42. package/lib/cjs/tests/api_tests/programs.test.d.ts +3 -1
  43. package/lib/cjs/tests/api_tests/programs.test.d.ts.map +1 -1
  44. package/lib/cjs/tests/api_tests/programs.test.js +73 -17
  45. package/lib/cjs/tests/api_tests/programs.test.js.map +1 -1
  46. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  47. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  48. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js +733 -0
  49. package/lib/cjs/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  50. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  51. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  52. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +3 -1
  53. package/lib/cjs/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  54. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  55. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  56. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js +3 -1
  57. package/lib/cjs/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  58. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  59. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  60. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js +3 -1
  61. package/lib/cjs/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  62. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  63. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  64. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js +3 -1
  65. package/lib/cjs/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  66. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  67. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  68. package/lib/cjs/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  69. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  70. package/lib/cjs/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  71. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  72. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  73. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +3 -1
  74. package/lib/cjs/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  75. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  76. package/lib/cjs/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  77. package/lib/cjs/tests/api_tests/session_for_join_link.test.js +147 -0
  78. package/lib/cjs/tests/api_tests/session_for_join_link.test.js.map +1 -0
  79. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  80. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js +191 -88
  81. package/lib/cjs/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  82. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  83. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  84. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js +219 -0
  85. package/lib/cjs/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  86. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  87. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  88. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js +396 -0
  89. package/lib/cjs/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  90. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  91. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  92. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js +3 -1
  93. package/lib/cjs/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  94. package/lib/cjs/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  95. package/lib/cjs/tests/api_tests/totp_mfa.test.js +37 -31
  96. package/lib/cjs/tests/api_tests/totp_mfa.test.js.map +1 -1
  97. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  98. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  99. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js +3 -1
  100. package/lib/cjs/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  101. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  102. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  103. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js +3 -1
  104. package/lib/cjs/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  105. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  106. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  107. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js +3 -1
  108. package/lib/cjs/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  109. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts +7 -0
  110. package/lib/cjs/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  111. package/lib/cjs/tests/api_tests/vitl_push.test.js +341 -0
  112. package/lib/cjs/tests/api_tests/vitl_push.test.js.map +1 -0
  113. package/lib/cjs/tests/setup_isolated.d.ts +48 -0
  114. package/lib/cjs/tests/setup_isolated.d.ts.map +1 -1
  115. package/lib/cjs/tests/setup_isolated.js +119 -1
  116. package/lib/cjs/tests/setup_isolated.js.map +1 -1
  117. package/lib/cjs/tests/tests.d.ts.map +1 -1
  118. package/lib/cjs/tests/tests.js +374 -292
  119. package/lib/cjs/tests/tests.js.map +1 -1
  120. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  121. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  122. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js +201 -0
  123. package/lib/cjs/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  124. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  125. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  126. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js +120 -0
  127. package/lib/cjs/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  128. package/lib/cjs/tests/webhooks_tests.js +44 -34
  129. package/lib/cjs/tests/webhooks_tests.js.map +1 -1
  130. package/lib/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  131. package/lib/esm/sdk.d.ts +373 -3
  132. package/lib/esm/sdk.d.ts.map +1 -1
  133. package/lib/esm/sdk.js.map +1 -1
  134. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts +22 -0
  135. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.d.ts.map +1 -0
  136. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js +501 -0
  137. package/lib/esm/tests/api_tests/booking_prevent_upcoming_duplicate.test.js.map +1 -0
  138. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts +3 -1
  139. package/lib/esm/tests/api_tests/enduser_fields_sync.test.d.ts.map +1 -1
  140. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js +2 -0
  141. package/lib/esm/tests/api_tests/enduser_fields_sync.test.js.map +1 -1
  142. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts +3 -1
  143. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.d.ts.map +1 -1
  144. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js +2 -0
  145. package/lib/esm/tests/api_tests/enduser_observations_auto_review.test.js.map +1 -1
  146. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts +7 -0
  147. package/lib/esm/tests/api_tests/form_vital_reading.test.d.ts.map +1 -0
  148. package/lib/esm/tests/api_tests/form_vital_reading.test.js +456 -0
  149. package/lib/esm/tests/api_tests/form_vital_reading.test.js.map +1 -0
  150. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts +26 -0
  151. package/lib/esm/tests/api_tests/journey_statistics_cache.test.d.ts.map +1 -0
  152. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js +227 -0
  153. package/lib/esm/tests/api_tests/journey_statistics_cache.test.js.map +1 -0
  154. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts +34 -0
  155. package/lib/esm/tests/api_tests/journey_step_manual_count.test.d.ts.map +1 -0
  156. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js +238 -0
  157. package/lib/esm/tests/api_tests/journey_step_manual_count.test.js.map +1 -0
  158. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts +3 -1
  159. package/lib/esm/tests/api_tests/load_threads_care_team.test.d.ts.map +1 -1
  160. package/lib/esm/tests/api_tests/load_threads_care_team.test.js +2 -0
  161. package/lib/esm/tests/api_tests/load_threads_care_team.test.js.map +1 -1
  162. package/lib/esm/tests/api_tests/organization_signup.test.d.ts +3 -1
  163. package/lib/esm/tests/api_tests/organization_signup.test.d.ts.map +1 -1
  164. package/lib/esm/tests/api_tests/organization_signup.test.js +2 -0
  165. package/lib/esm/tests/api_tests/organization_signup.test.js.map +1 -1
  166. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts +7 -0
  167. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.d.ts.map +1 -0
  168. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js +566 -0
  169. package/lib/esm/tests/api_tests/phone_embed_leave_message.test.js.map +1 -0
  170. package/lib/esm/tests/api_tests/programs.test.d.ts +3 -1
  171. package/lib/esm/tests/api_tests/programs.test.d.ts.map +1 -1
  172. package/lib/esm/tests/api_tests/programs.test.js +72 -16
  173. package/lib/esm/tests/api_tests/programs.test.js.map +1 -1
  174. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts +7 -0
  175. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.d.ts.map +1 -0
  176. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js +728 -0
  177. package/lib/esm/tests/api_tests/public_form_case_insensitive_match.test.js.map +1 -0
  178. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts +3 -1
  179. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.d.ts.map +1 -1
  180. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js +2 -0
  181. package/lib/esm/tests/api_tests/security/add-to-journey-foreign-enduserid.test.js.map +1 -1
  182. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts +3 -1
  183. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.d.ts.map +1 -1
  184. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js +2 -0
  185. package/lib/esm/tests/api_tests/security/appointment-reschedule-ownership.test.js.map +1 -1
  186. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts +3 -1
  187. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.d.ts.map +1 -1
  188. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js +2 -0
  189. package/lib/esm/tests/api_tests/security/file-link-session-confinement.test.js.map +1 -1
  190. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts +3 -1
  191. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.d.ts.map +1 -1
  192. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js +2 -0
  193. package/lib/esm/tests/api_tests/security/form-logic-js-execution.test.js.map +1 -1
  194. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.d.ts.map +1 -1
  195. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js +424 -39
  196. package/lib/esm/tests/api_tests/security/formsort_webhook_auth_field_lock.test.js.map +1 -1
  197. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js +2 -2
  198. package/lib/esm/tests/api_tests/security/register_business_id_injection.test.js.map +1 -1
  199. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts +3 -1
  200. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.d.ts.map +1 -1
  201. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js +2 -0
  202. package/lib/esm/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.js.map +1 -1
  203. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts +10 -0
  204. package/lib/esm/tests/api_tests/session_for_join_link.test.d.ts.map +1 -0
  205. package/lib/esm/tests/api_tests/session_for_join_link.test.js +142 -0
  206. package/lib/esm/tests/api_tests/session_for_join_link.test.js.map +1 -0
  207. package/lib/esm/tests/api_tests/set_fields_order_templates.test.d.ts.map +1 -1
  208. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js +191 -88
  209. package/lib/esm/tests/api_tests/set_fields_order_templates.test.js.map +1 -1
  210. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts +17 -0
  211. package/lib/esm/tests/api_tests/stripe_checkout_items.test.d.ts.map +1 -0
  212. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js +214 -0
  213. package/lib/esm/tests/api_tests/stripe_checkout_items.test.js.map +1 -0
  214. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts +5 -0
  215. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.d.ts.map +1 -0
  216. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js +388 -0
  217. package/lib/esm/tests/api_tests/stripe_multiple_customer_ids.test.js.map +1 -0
  218. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts +3 -1
  219. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.d.ts.map +1 -1
  220. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js +2 -0
  221. package/lib/esm/tests/api_tests/tickets_bulk_assign_from_queue.test.js.map +1 -1
  222. package/lib/esm/tests/api_tests/totp_mfa.test.d.ts.map +1 -1
  223. package/lib/esm/tests/api_tests/totp_mfa.test.js +37 -31
  224. package/lib/esm/tests/api_tests/totp_mfa.test.js.map +1 -1
  225. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts +3 -1
  226. package/lib/esm/tests/api_tests/trigger_contains_matching.test.d.ts.map +1 -1
  227. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js +2 -0
  228. package/lib/esm/tests/api_tests/trigger_contains_matching.test.js.map +1 -1
  229. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts +3 -1
  230. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.d.ts.map +1 -1
  231. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js +2 -0
  232. package/lib/esm/tests/api_tests/user_logs_restore_deleted.test.js.map +1 -1
  233. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts +3 -1
  234. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.d.ts.map +1 -1
  235. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js +2 -0
  236. package/lib/esm/tests/api_tests/vital_review_trigger_action.test.js.map +1 -1
  237. package/lib/esm/tests/api_tests/vitl_push.test.d.ts +7 -0
  238. package/lib/esm/tests/api_tests/vitl_push.test.d.ts.map +1 -0
  239. package/lib/esm/tests/api_tests/vitl_push.test.js +333 -0
  240. package/lib/esm/tests/api_tests/vitl_push.test.js.map +1 -0
  241. package/lib/esm/tests/setup_isolated.d.ts +48 -0
  242. package/lib/esm/tests/setup_isolated.d.ts.map +1 -1
  243. package/lib/esm/tests/setup_isolated.js +114 -0
  244. package/lib/esm/tests/setup_isolated.js.map +1 -1
  245. package/lib/esm/tests/tests.d.ts.map +1 -1
  246. package/lib/esm/tests/tests.js +375 -293
  247. package/lib/esm/tests/tests.js.map +1 -1
  248. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts +2 -0
  249. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.d.ts.map +1 -0
  250. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js +174 -0
  251. package/lib/esm/tests/unit_tests/isolated_suite_discovery.test.js.map +1 -0
  252. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts +3 -0
  253. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.d.ts.map +1 -0
  254. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js +117 -0
  255. package/lib/esm/tests/unit_tests/programs_conditional_logic.test.js.map +1 -0
  256. package/lib/esm/tests/webhooks_tests.js +44 -34
  257. package/lib/esm/tests/webhooks_tests.js.map +1 -1
  258. package/lib/tsconfig.tsbuildinfo +1 -1
  259. package/package.json +12 -11
  260. package/src/sdk.ts +3 -2
  261. package/src/tests/api_tests/booking_prevent_upcoming_duplicate.test.ts +541 -0
  262. package/src/tests/api_tests/enduser_fields_sync.test.ts +4 -0
  263. package/src/tests/api_tests/enduser_observations_auto_review.test.ts +4 -0
  264. package/src/tests/api_tests/form_vital_reading.test.ts +393 -0
  265. package/src/tests/api_tests/journey_statistics_cache.test.ts +237 -0
  266. package/src/tests/api_tests/journey_step_manual_count.test.ts +220 -0
  267. package/src/tests/api_tests/load_threads_care_team.test.ts +4 -0
  268. package/src/tests/api_tests/organization_signup.test.ts +4 -0
  269. package/src/tests/api_tests/phone_embed_leave_message.test.ts +541 -0
  270. package/src/tests/api_tests/programs.test.ts +351 -0
  271. package/src/tests/api_tests/public_form_case_insensitive_match.test.ts +632 -0
  272. package/src/tests/api_tests/security/add-to-journey-foreign-enduserid.test.ts +4 -0
  273. package/src/tests/api_tests/security/appointment-reschedule-ownership.test.ts +4 -0
  274. package/src/tests/api_tests/security/file-link-session-confinement.test.ts +4 -0
  275. package/src/tests/api_tests/security/form-logic-js-execution.test.ts +4 -0
  276. package/src/tests/api_tests/security/formsort_webhook_auth_field_lock.test.ts +225 -0
  277. package/src/tests/api_tests/security/register_business_id_injection.test.ts +2 -2
  278. package/src/tests/api_tests/security/rich-text-answer-sanitized-on-write.test.ts +4 -0
  279. package/src/tests/api_tests/session_for_join_link.test.ts +99 -0
  280. package/src/tests/api_tests/set_fields_order_templates.test.ts +94 -9
  281. package/src/tests/api_tests/stripe_checkout_items.test.ts +186 -0
  282. package/src/tests/api_tests/tickets_bulk_assign_from_queue.test.ts +4 -0
  283. package/src/tests/api_tests/totp_mfa.test.ts +10 -5
  284. package/src/tests/api_tests/trigger_contains_matching.test.ts +4 -0
  285. package/src/tests/api_tests/user_logs_restore_deleted.test.ts +4 -0
  286. package/src/tests/api_tests/vital_review_trigger_action.test.ts +455 -0
  287. package/src/tests/api_tests/vitl_push.test.ts +323 -0
  288. package/src/tests/setup_isolated.ts +140 -0
  289. package/src/tests/tests.ts +124 -30
  290. package/src/tests/unit_tests/isolated_suite_discovery.test.ts +178 -0
  291. package/src/tests/unit_tests/programs_conditional_logic.test.ts +189 -0
  292. package/src/tests/webhooks_tests.ts +6 -1
  293. package/test_generated.pdf +0 -0
@@ -0,0 +1,728 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ require('source-map-support').install();
49
+ import { EnduserSession } from "../../sdk";
50
+ import { assert_checks, setup_isolated_tenant, } from "../setup_isolated";
51
+ var host = process.env.API_URL || 'http://localhost:8080';
52
+ var RAND = function () { return Math.random().toString(36).slice(2, 10); };
53
+ /**
54
+ * Coverage for `settings.endusers.caseInsensitiveMatching` — the per-org opt-in that makes public
55
+ * form intake match an existing contact when only the CAPITALIZATION of fname/lname differs.
56
+ *
57
+ * Two matchers are gated by the setting and both are exercised here:
58
+ * - `session_for_public_form` (api/v1/api.ts), the intake screen
59
+ * - `resolveAutoMergeBeforeSubmission` (api/modules/auto_merge.ts), for autoMergeOnSubmission forms
60
+ *
61
+ * Fixture warning: `nameValidator` applies `first_letter_capitalized`, so "john" is already stored and
62
+ * submitted as "John" and a "john"/"John" fixture would pass with the setting OFF, proving nothing.
63
+ * Every case here differs AFTER the first letter ("MCDONALD" vs "Mcdonald").
64
+ *
65
+ * `setup_isolated` rather than `setup_tests` because these checks flip an ORGANIZATION setting, which
66
+ * on the shared fixture org would change behavior under every concurrently running suite. It also
67
+ * asserts on "how many contacts match this name", which needs a tenant nobody else writes to.
68
+ *
69
+ * Runs standalone or as part of the main suite:
70
+ * npm run test:modular -- api_tests/public_form_case_insensitive_match
71
+ */
72
+ /** Builds a public form with the intake questions the matchers read.
73
+ * `intakePhone: 'optional'` so `session_for_public_form` does not reject a submission with no phone
74
+ * — the endpoint requires a phone number unless the form configures one. */
75
+ var createPublicForm = function (sdk, _a) {
76
+ var _b = _a === void 0 ? {} : _a, _c = _b.autoMergeOnSubmission, autoMergeOnSubmission = _c === void 0 ? false : _c;
77
+ return __awaiter(void 0, void 0, void 0, function () {
78
+ var form, fnameField, lnameField, dobField, emailField, phoneField;
79
+ return __generator(this, function (_d) {
80
+ switch (_d.label) {
81
+ case 0: return [4 /*yield*/, sdk.api.forms.createOne({
82
+ title: "Case Insensitive Match ".concat(RAND()),
83
+ allowPublicURL: true,
84
+ intakePhone: 'optional',
85
+ autoMergeOnSubmission: autoMergeOnSubmission,
86
+ })
87
+ // sequential: each field's previousFields references the one before it
88
+ ];
89
+ case 1:
90
+ form = _d.sent();
91
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
92
+ formId: form.id, title: 'First Name', type: 'string', intakeField: 'fname',
93
+ previousFields: [{ type: 'root', info: {} }],
94
+ })];
95
+ case 2:
96
+ fnameField = _d.sent();
97
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
98
+ formId: form.id, title: 'Last Name', type: 'string', intakeField: 'lname',
99
+ previousFields: [{ type: 'after', info: { fieldId: fnameField.id } }],
100
+ })];
101
+ case 3:
102
+ lnameField = _d.sent();
103
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
104
+ formId: form.id, title: 'Date of Birth', type: 'dateString', intakeField: 'dateOfBirth',
105
+ previousFields: [{ type: 'after', info: { fieldId: lnameField.id } }],
106
+ })];
107
+ case 4:
108
+ dobField = _d.sent();
109
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
110
+ formId: form.id, title: 'Email', type: 'email', intakeField: 'email',
111
+ previousFields: [{ type: 'after', info: { fieldId: dobField.id } }],
112
+ })];
113
+ case 5:
114
+ emailField = _d.sent();
115
+ return [4 /*yield*/, sdk.api.form_fields.createOne({
116
+ formId: form.id, title: 'Phone', type: 'phone', intakeField: 'phone',
117
+ previousFields: [{ type: 'after', info: { fieldId: emailField.id } }],
118
+ })];
119
+ case 6:
120
+ phoneField = _d.sent();
121
+ return [2 /*return*/, { form: form, fields: [fnameField, lnameField, dobField, emailField, phoneField] }];
122
+ }
123
+ });
124
+ });
125
+ };
126
+ /** Drives the intake screen exactly as a public visitor would, returning the enduser the session was
127
+ * minted for. This is the `session_for_public_form` matcher under test. */
128
+ var intakeSession = function (form, values) { return __awaiter(void 0, void 0, void 0, function () {
129
+ var enduserSDK, _a, enduserId, accessCode, authToken;
130
+ return __generator(this, function (_b) {
131
+ switch (_b.label) {
132
+ case 0:
133
+ enduserSDK = new EnduserSession({ host: host, businessId: form.businessId });
134
+ return [4 /*yield*/, enduserSDK.api.form_responses.session_for_public_form(__assign({ formId: form.id, businessId: form.businessId }, values))];
135
+ case 1:
136
+ _a = _b.sent(), enduserId = _a.enduserId, accessCode = _a.accessCode, authToken = _a.authToken;
137
+ return [2 /*return*/, { enduserId: enduserId, accessCode: accessCode, authedSDK: new EnduserSession({ host: host, businessId: form.businessId, authToken: authToken }) }];
138
+ }
139
+ });
140
+ }); };
141
+ /** The intake screen alone, which is the matcher under test. */
142
+ var intake = function (form, values) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
143
+ switch (_a.label) {
144
+ case 0: return [4 /*yield*/, intakeSession(form, values)];
145
+ case 1: return [2 /*return*/, (_a.sent()).enduserId
146
+ /** Intake followed by a real submission, so the intake-field write onto the matched contact runs. */
147
+ ];
148
+ }
149
+ }); }); };
150
+ /** Intake followed by a real submission, so the intake-field write onto the matched contact runs. */
151
+ var intakeAndSubmit = function (form, fields, values) { return __awaiter(void 0, void 0, void 0, function () {
152
+ var _a, enduserId, accessCode, authedSDK, byIntake;
153
+ return __generator(this, function (_b) {
154
+ switch (_b.label) {
155
+ case 0: return [4 /*yield*/, intakeSession(form, values)];
156
+ case 1:
157
+ _a = _b.sent(), enduserId = _a.enduserId, accessCode = _a.accessCode, authedSDK = _a.authedSDK;
158
+ byIntake = function (intakeField) { return fields.find(function (f) { return f.intakeField === intakeField; }); };
159
+ return [4 /*yield*/, authedSDK.api.form_responses.submit_form_response({
160
+ accessCode: accessCode,
161
+ responses: [
162
+ { fieldId: byIntake('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: values.fname } },
163
+ { fieldId: byIntake('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: values.lname } },
164
+ { fieldId: byIntake('dateOfBirth').id, fieldTitle: 'Date of Birth', answer: { type: 'dateString', value: values.dateOfBirth } },
165
+ ],
166
+ })];
167
+ case 2:
168
+ _b.sent();
169
+ return [2 /*return*/, enduserId];
170
+ }
171
+ });
172
+ }); };
173
+ /** Drives an auto-merge submission: a `skipMatch` session (which always inserts a fresh contact),
174
+ * then a submission whose intake answers are what `resolveAutoMergeBeforeSubmission` matches on. */
175
+ var submitWithSkipMatch = function (form, fields, values) { return __awaiter(void 0, void 0, void 0, function () {
176
+ var enduserSDK, _a, authToken, accessCode, enduserId, authedSDK, byIntake;
177
+ return __generator(this, function (_b) {
178
+ switch (_b.label) {
179
+ case 0:
180
+ enduserSDK = new EnduserSession({ host: host, businessId: form.businessId });
181
+ return [4 /*yield*/, enduserSDK.api.form_responses.session_for_public_form({
182
+ formId: form.id,
183
+ businessId: form.businessId,
184
+ skipMatch: true,
185
+ })];
186
+ case 1:
187
+ _a = _b.sent(), authToken = _a.authToken, accessCode = _a.accessCode, enduserId = _a.enduserId;
188
+ authedSDK = new EnduserSession({ host: host, businessId: form.businessId, authToken: authToken });
189
+ byIntake = function (intakeField) { return fields.find(function (f) { return f.intakeField === intakeField; }); };
190
+ return [4 /*yield*/, authedSDK.api.form_responses.submit_form_response({
191
+ accessCode: accessCode,
192
+ responses: [
193
+ { fieldId: byIntake('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: values.fname } },
194
+ { fieldId: byIntake('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: values.lname } },
195
+ { fieldId: byIntake('dateOfBirth').id, fieldTitle: 'Date of Birth', answer: { type: 'dateString', value: values.dateOfBirth } },
196
+ ],
197
+ })];
198
+ case 2:
199
+ _b.sent();
200
+ return [2 /*return*/, enduserId];
201
+ }
202
+ });
203
+ }); };
204
+ var enduserExists = function (sdk, enduserId) { return __awaiter(void 0, void 0, void 0, function () {
205
+ var _a;
206
+ return __generator(this, function (_b) {
207
+ switch (_b.label) {
208
+ case 0:
209
+ _b.trys.push([0, 2, , 3]);
210
+ return [4 /*yield*/, sdk.api.endusers.getOne(enduserId)];
211
+ case 1:
212
+ _b.sent();
213
+ return [2 /*return*/, true];
214
+ case 2:
215
+ _a = _b.sent();
216
+ return [2 /*return*/, false];
217
+ case 3: return [2 /*return*/];
218
+ }
219
+ });
220
+ }); };
221
+ export var public_form_case_insensitive_match_checks = function () { return __awaiter(void 0, void 0, void 0, function () {
222
+ var checks, record, tenant, sdk_1, businessId_1, caseInsensitiveState_1, setCaseInsensitive, _a, form, fields_1, DOB, stored, matchedId, exactId, OFF_EMAIL, offContact, offSession, offField, offAfter, _b, form_1, fields_2, DOB, stored, matchedId, afterIntake, submittedId, afterSubmit, storedResponses, LOCK_DOB, LOCK_EMAIL, lockContact, lockSession, lockField, lockAfter, RENAME_EMAIL, renameTarget, renameSession, byIntake, renamed, EMAIL, byEmail, emailMatchedId, nameless, namelessMatchId, form, DOB, a, b, _c, lowest_1, highest, resolved, i, _d, _e, form, DOB, target, matchedId, WILDCARD_DOB, decoy, decoyProbeId, HYPHEN_DOB, hyphenated, hyphenMatchedId, DOB, offForm, offDestination, offSourceId, _f, _g, onForm, ON_DOB, onDestination, onSourceId, onSourceGone, mergedDestination, AMBIGUOUS_DOB, ambiguousForm, candidateA, candidateB, ambiguousSourceId, _h, a, b, _j, _k, _l, _m, DOB, stored, first, second_1, group, enduserSDK, _o, authToken, enduserId, authedSDK, secondResponse, attempt, responses, submitted, f, after, form, DOB, dobContact, wrongDobId, EMAIL, emailContact, matchedId, DOB, stored, template, bookingSDK, bookingMatched, sameName, err_1;
223
+ var _p, _q, _r;
224
+ return __generator(this, function (_s) {
225
+ switch (_s.label) {
226
+ case 0:
227
+ checks = [];
228
+ record = function (label, pass, detail) { return checks.push({ label: label, pass: pass, detail: detail }); };
229
+ _s.label = 1;
230
+ case 1:
231
+ _s.trys.push([1, , 99, 101]);
232
+ return [4 /*yield*/, setup_isolated_tenant({
233
+ name: "PublicFormCaseInsensitive ".concat(RAND()),
234
+ users: [{ isAdmin: true }],
235
+ apiKeys: 0,
236
+ })];
237
+ case 2:
238
+ tenant = _s.sent();
239
+ sdk_1 = tenant.sdk, businessId_1 = tenant.businessId;
240
+ setCaseInsensitive = function (on) { return __awaiter(void 0, void 0, void 0, function () {
241
+ return __generator(this, function (_a) {
242
+ switch (_a.label) {
243
+ case 0:
244
+ if (caseInsensitiveState_1 === on)
245
+ return [2 /*return*/];
246
+ return [4 /*yield*/, sdk_1.api.organizations.updateOne(businessId_1, {
247
+ settings: { endusers: { caseInsensitiveMatching: on } },
248
+ })];
249
+ case 1:
250
+ _a.sent();
251
+ caseInsensitiveState_1 = on;
252
+ return [2 /*return*/];
253
+ }
254
+ });
255
+ }); };
256
+ return [4 /*yield*/, setCaseInsensitive(false)];
257
+ case 3:
258
+ _s.sent();
259
+ return [4 /*yield*/, createPublicForm(sdk_1)];
260
+ case 4:
261
+ _a = _s.sent(), form = _a.form, fields_1 = _a.fields;
262
+ DOB = '1990-01-02';
263
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'John', lname: 'MCDONALD', dateOfBirth: DOB })];
264
+ case 5:
265
+ stored = _s.sent();
266
+ record('fixture: a non-first-letter capitalization variant is stored verbatim', stored.lname === 'MCDONALD', "stored lname=".concat(JSON.stringify(stored.lname), " (if this is not MCDONALD every other check is vacuous)"));
267
+ return [4 /*yield*/, intake(form, { fname: 'John', lname: 'Mcdonald', dateOfBirth: DOB })];
268
+ case 6:
269
+ matchedId = _s.sent();
270
+ record('setting OFF: "Mcdonald" does NOT match stored "MCDONALD" (unchanged behavior)', matchedId !== stored.id, "intake resolved to ".concat(matchedId, ", stored contact is ").concat(stored.id));
271
+ return [4 /*yield*/, intake(form, { fname: 'John', lname: 'MCDONALD', dateOfBirth: DOB })];
272
+ case 7:
273
+ exactId = _s.sent();
274
+ record('setting OFF: an exactly-matching name still matches (control)', exactId === stored.id, "intake resolved to ".concat(exactId, ", expected ").concat(stored.id));
275
+ OFF_EMAIL = "dontsend-off-".concat(RAND(), "@tellescope.com");
276
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Off', lname: 'MCDONALD', email: OFF_EMAIL })];
277
+ case 8:
278
+ offContact = _s.sent();
279
+ return [4 /*yield*/, intakeSession(form, { email: OFF_EMAIL })];
280
+ case 9:
281
+ offSession = _s.sent();
282
+ offField = function (intakeField) { return fields_1.find(function (f) { return f.intakeField === intakeField; }); };
283
+ return [4 /*yield*/, offSession.authedSDK.api.form_responses.submit_form_response({
284
+ accessCode: offSession.accessCode,
285
+ responses: [
286
+ { fieldId: offField('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: 'Off' } },
287
+ { fieldId: offField('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: 'Mcdonald' } },
288
+ ],
289
+ })];
290
+ case 10:
291
+ _s.sent();
292
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(offContact.id)];
293
+ case 11:
294
+ offAfter = _s.sent();
295
+ record('setting OFF: a case-only name change from intake still writes through (guard is inert)', offSession.enduserId === offContact.id && offAfter.lname === 'Mcdonald', "intake resolved to ".concat(offSession.enduserId, " (expected ").concat(offContact.id, "); stored lname is ").concat(JSON.stringify(offAfter.lname), ", expected \"Mcdonald\""));
296
+ return [4 /*yield*/, setCaseInsensitive(true)];
297
+ case 12:
298
+ _s.sent();
299
+ return [4 /*yield*/, createPublicForm(sdk_1)];
300
+ case 13:
301
+ _b = _s.sent(), form_1 = _b.form, fields_2 = _b.fields;
302
+ DOB = '1991-02-03';
303
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Jane', lname: 'MCDONALD', dateOfBirth: DOB })];
304
+ case 14:
305
+ stored = _s.sent();
306
+ return [4 /*yield*/, intake(form_1, { fname: 'Jane', lname: 'Mcdonald', dateOfBirth: DOB })];
307
+ case 15:
308
+ matchedId = _s.sent();
309
+ record('setting ON: "Mcdonald" matches stored "MCDONALD"', matchedId === stored.id, "intake resolved to ".concat(matchedId, ", expected ").concat(stored.id));
310
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(stored.id)];
311
+ case 16:
312
+ afterIntake = _s.sent();
313
+ record('setting ON: the intake screen does not rewrite a matched contact\'s capitalization', afterIntake.lname === 'MCDONALD', "stored lname is now ".concat(JSON.stringify(afterIntake.lname), ", must still be \"MCDONALD\""));
314
+ return [4 /*yield*/, intakeAndSubmit(form_1, fields_2, { fname: 'Jane', lname: 'Mcdonald', dateOfBirth: DOB })];
315
+ case 17:
316
+ submittedId = _s.sent();
317
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(stored.id)];
318
+ case 18:
319
+ afterSubmit = _s.sent();
320
+ record('setting ON: SUBMITTING the form does not rewrite a matched contact\'s capitalization', submittedId === stored.id && afterSubmit.lname === 'MCDONALD', "submission resolved to ".concat(submittedId, " (expected ").concat(stored.id, "); stored lname is now ").concat(JSON.stringify(afterSubmit.lname), ", must still be \"MCDONALD\""));
321
+ return [4 /*yield*/, sdk_1.api.form_responses.getSome({ filter: { enduserId: stored.id } })];
322
+ case 19:
323
+ storedResponses = _s.sent();
324
+ record('setting ON: the submitted response is attached to the matched contact', storedResponses.some(function (r) { return r.formId === form_1.id && !!r.submittedAt; }), "form_responses on ".concat(stored.id, ": ").concat(JSON.stringify(storedResponses.map(function (r) { return ({ formId: r.formId, submitted: !!r.submittedAt }); }))));
325
+ LOCK_DOB = '1991-02-04';
326
+ LOCK_EMAIL = "dontsend-lock-".concat(RAND(), "@tellescope.com");
327
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({
328
+ fname: 'Lock', lname: 'MCDONALD', dateOfBirth: LOCK_DOB, email: LOCK_EMAIL, phone: '+15555550123',
329
+ })];
330
+ case 20:
331
+ lockContact = _s.sent();
332
+ return [4 /*yield*/, intakeSession(form_1, { fname: 'Lock', lname: 'Mcdonald', dateOfBirth: LOCK_DOB })];
333
+ case 21:
334
+ lockSession = _s.sent();
335
+ lockField = function (intakeField) { return fields_2.find(function (f) { return f.intakeField === intakeField; }); };
336
+ return [4 /*yield*/, lockSession.authedSDK.api.form_responses.submit_form_response({
337
+ accessCode: lockSession.accessCode,
338
+ responses: [
339
+ { fieldId: lockField('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: 'Lock' } },
340
+ { fieldId: lockField('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: 'Mcdonald' } },
341
+ { fieldId: lockField('email').id, fieldTitle: 'Email', answer: { type: 'email', value: "attacker-".concat(RAND(), "@example.com") } },
342
+ { fieldId: lockField('phone').id, fieldTitle: 'Phone', answer: { type: 'phone', value: '+15555559999' } },
343
+ ],
344
+ })];
345
+ case 22:
346
+ _s.sent();
347
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(lockContact.id)];
348
+ case 23:
349
+ lockAfter = _s.sent();
350
+ record('setting ON: a case-insensitively matched contact keeps its email and phone (auth-field lock holds)', lockSession.enduserId === lockContact.id
351
+ && lockAfter.email === LOCK_EMAIL
352
+ && lockAfter.phone === '+15555550123', "intake resolved to ".concat(lockSession.enduserId, " (expected ").concat(lockContact.id, ");")
353
+ + " email=".concat(JSON.stringify(lockAfter.email), " (expected ").concat(JSON.stringify(LOCK_EMAIL), "),")
354
+ + " phone=".concat(JSON.stringify(lockAfter.phone), " (expected \"+15555550123\")"));
355
+ RENAME_EMAIL = "dontsend-rename-".concat(RAND(), "@tellescope.com");
356
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Rename', lname: 'Smith', email: RENAME_EMAIL })];
357
+ case 24:
358
+ renameTarget = _s.sent();
359
+ return [4 /*yield*/, intakeSession(form_1, { email: RENAME_EMAIL })];
360
+ case 25:
361
+ renameSession = _s.sent();
362
+ byIntake = function (intakeField) { return fields_2.find(function (f) { return f.intakeField === intakeField; }); };
363
+ return [4 /*yield*/, renameSession.authedSDK.api.form_responses.submit_form_response({
364
+ accessCode: renameSession.accessCode,
365
+ responses: [
366
+ { fieldId: byIntake('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: 'Rename' } },
367
+ { fieldId: byIntake('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: 'Smyth' } },
368
+ ],
369
+ })];
370
+ case 26:
371
+ _s.sent();
372
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(renameTarget.id)];
373
+ case 27:
374
+ renamed = _s.sent();
375
+ record('setting ON: a GENUINE name change from intake is still written through (control)', renameSession.enduserId === renameTarget.id && renamed.lname === 'Smyth', "intake resolved to ".concat(renameSession.enduserId, " (expected ").concat(renameTarget.id, "); stored lname is ").concat(JSON.stringify(renamed.lname), ", expected \"Smyth\""));
376
+ EMAIL = "dontsend-ci-".concat(RAND(), "@tellescope.com");
377
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Email', lname: 'Only', email: EMAIL })];
378
+ case 28:
379
+ byEmail = _s.sent();
380
+ return [4 /*yield*/, intake(form_1, { email: EMAIL })];
381
+ case 29:
382
+ emailMatchedId = _s.sent();
383
+ record('setting ON: matching by email alone is unchanged', emailMatchedId === byEmail.id, "intake resolved to ".concat(emailMatchedId, ", expected ").concat(byEmail.id));
384
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ dateOfBirth: '1960-06-06' })];
385
+ case 30:
386
+ nameless = _s.sent();
387
+ return [4 /*yield*/, intake(form_1, { fname: 'Nobody', dateOfBirth: '1960-06-06' })];
388
+ case 31:
389
+ namelessMatchId = _s.sent();
390
+ record('setting ON: a blank name does not match a nameless contact (sentinel survives)', namelessMatchId !== nameless.id, "intake resolved to ".concat(namelessMatchId, ", nameless contact is ").concat(nameless.id));
391
+ return [4 /*yield*/, setCaseInsensitive(true)];
392
+ case 32:
393
+ _s.sent();
394
+ return [4 /*yield*/, createPublicForm(sdk_1)];
395
+ case 33:
396
+ form = (_s.sent()).form;
397
+ DOB = '1992-03-04';
398
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Olive', lname: 'Mcdonald', dateOfBirth: DOB })];
399
+ case 34:
400
+ a = _s.sent();
401
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Olive', lname: 'MCDONALD', dateOfBirth: DOB })];
402
+ case 35:
403
+ b = _s.sent();
404
+ _c = a.id < b.id ? [a, b] : [b, a], lowest_1 = _c[0], highest = _c[1];
405
+ resolved = [];
406
+ i = 0;
407
+ _s.label = 36;
408
+ case 36:
409
+ if (!(i < 3)) return [3 /*break*/, 39];
410
+ _e = (_d = resolved).push;
411
+ return [4 /*yield*/, intake(form, { fname: 'Olive', lname: 'McDonald', dateOfBirth: DOB })];
412
+ case 37:
413
+ _e.apply(_d, [_s.sent()]);
414
+ _s.label = 38;
415
+ case 38:
416
+ i++;
417
+ return [3 /*break*/, 36];
418
+ case 39:
419
+ record('setting ON: with two case variants, the lowest-_id (oldest) contact wins on every submission', resolved.every(function (id) { return id === lowest_1.id; }), "resolved ".concat(JSON.stringify(resolved), ", lowest _id=").concat(lowest_1.id, ", other=").concat(highest.id));
420
+ return [4 /*yield*/, setCaseInsensitive(true)];
421
+ case 40:
422
+ _s.sent();
423
+ return [4 /*yield*/, createPublicForm(sdk_1)];
424
+ case 41:
425
+ form = (_s.sent()).form;
426
+ DOB = '1993-04-05';
427
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Mary', lname: 'O.Brien', dateOfBirth: DOB })];
428
+ case 42:
429
+ target = _s.sent();
430
+ return [4 /*yield*/, intake(form, { fname: 'Mary', lname: 'o.BRIEN', dateOfBirth: DOB })];
431
+ case 43:
432
+ matchedId = _s.sent();
433
+ record('setting ON: "." in a name is matched literally (matches the contact that has it)', matchedId === target.id, "intake resolved to ".concat(matchedId, ", expected O.Brien ").concat(target.id));
434
+ WILDCARD_DOB = '1993-04-06';
435
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Mary', lname: 'OXBrien', dateOfBirth: WILDCARD_DOB })];
436
+ case 44:
437
+ decoy = _s.sent();
438
+ return [4 /*yield*/, intake(form, { fname: 'Mary', lname: 'O.Brien', dateOfBirth: WILDCARD_DOB })];
439
+ case 45:
440
+ decoyProbeId = _s.sent();
441
+ record('setting ON: "." is NOT a wildcard (does not match a contact with another character there)', decoyProbeId !== decoy.id, "intake resolved to ".concat(decoyProbeId, ", must NOT be the OXBrien contact ").concat(decoy.id));
442
+ HYPHEN_DOB = '1994-05-06';
443
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Ann', lname: 'Smith-Jones', dateOfBirth: HYPHEN_DOB })];
444
+ case 46:
445
+ hyphenated = _s.sent();
446
+ return [4 /*yield*/, intake(form, { fname: 'Ann', lname: 'SMITH-JONES', dateOfBirth: HYPHEN_DOB })];
447
+ case 47:
448
+ hyphenMatchedId = _s.sent();
449
+ record('setting ON: a hyphenated name matches case-insensitively', hyphenMatchedId === hyphenated.id, "intake resolved to ".concat(hyphenMatchedId, ", expected ").concat(hyphenated.id));
450
+ DOB = '1995-06-07';
451
+ // 5a. setting OFF: a capitalization variant is not a merge candidate
452
+ return [4 /*yield*/, setCaseInsensitive(false)];
453
+ case 48:
454
+ // 5a. setting OFF: a capitalization variant is not a merge candidate
455
+ _s.sent();
456
+ return [4 /*yield*/, createPublicForm(sdk_1, { autoMergeOnSubmission: true })];
457
+ case 49:
458
+ offForm = _s.sent();
459
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Merge', lname: 'MCDONALD', dateOfBirth: DOB })];
460
+ case 50:
461
+ offDestination = _s.sent();
462
+ return [4 /*yield*/, submitWithSkipMatch(offForm.form, offForm.fields, {
463
+ fname: 'Merge', lname: 'Mcdonald', dateOfBirth: DOB,
464
+ })];
465
+ case 51:
466
+ offSourceId = _s.sent();
467
+ _f = record;
468
+ _g = ['auto-merge, setting OFF: a capitalization variant does NOT merge (unchanged behavior)'];
469
+ return [4 /*yield*/, enduserExists(sdk_1, offSourceId)];
470
+ case 52:
471
+ _f.apply(void 0, _g.concat([_s.sent(), "source ".concat(offSourceId, " should still exist alongside destination ").concat(offDestination.id)]));
472
+ // 5b. setting ON: the same submission merges
473
+ return [4 /*yield*/, setCaseInsensitive(true)];
474
+ case 53:
475
+ // 5b. setting ON: the same submission merges
476
+ _s.sent();
477
+ return [4 /*yield*/, createPublicForm(sdk_1, { autoMergeOnSubmission: true })];
478
+ case 54:
479
+ onForm = _s.sent();
480
+ ON_DOB = '1996-07-08';
481
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Merge', lname: 'MCDONNELL', dateOfBirth: ON_DOB })];
482
+ case 55:
483
+ onDestination = _s.sent();
484
+ return [4 /*yield*/, submitWithSkipMatch(onForm.form, onForm.fields, {
485
+ fname: 'Merge', lname: 'Mcdonnell', dateOfBirth: ON_DOB,
486
+ })];
487
+ case 56:
488
+ onSourceId = _s.sent();
489
+ return [4 /*yield*/, enduserExists(sdk_1, onSourceId)];
490
+ case 57:
491
+ onSourceGone = !(_s.sent());
492
+ return [4 /*yield*/, sdk_1.api.endusers.getOne(onDestination.id)];
493
+ case 58:
494
+ mergedDestination = _s.sent();
495
+ record('auto-merge, setting ON: a capitalization variant merges into the existing contact', onSourceGone && !!((_p = mergedDestination.mergedIds) === null || _p === void 0 ? void 0 : _p.includes(onSourceId)), "source deleted=".concat(onSourceGone, ", destination mergedIds=").concat(JSON.stringify(mergedDestination.mergedIds)));
496
+ record('auto-merge, setting ON: the merged-into contact keeps its stored capitalization', mergedDestination.lname === 'MCDONNELL', "destination lname is ".concat(JSON.stringify(mergedDestination.lname), ", must still be \"MCDONNELL\""));
497
+ AMBIGUOUS_DOB = '1997-08-09';
498
+ return [4 /*yield*/, createPublicForm(sdk_1, { autoMergeOnSubmission: true })];
499
+ case 59:
500
+ ambiguousForm = _s.sent();
501
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Ambi', lname: 'Mcguire', dateOfBirth: AMBIGUOUS_DOB })];
502
+ case 60:
503
+ candidateA = _s.sent();
504
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Ambi', lname: 'MCGUIRE', dateOfBirth: AMBIGUOUS_DOB })];
505
+ case 61:
506
+ candidateB = _s.sent();
507
+ return [4 /*yield*/, submitWithSkipMatch(ambiguousForm.form, ambiguousForm.fields, {
508
+ fname: 'Ambi', lname: 'McGuire', dateOfBirth: AMBIGUOUS_DOB,
509
+ })];
510
+ case 62:
511
+ ambiguousSourceId = _s.sent();
512
+ return [4 /*yield*/, Promise.all([
513
+ sdk_1.api.endusers.getOne(candidateA.id),
514
+ sdk_1.api.endusers.getOne(candidateB.id),
515
+ ])];
516
+ case 63:
517
+ _h = _s.sent(), a = _h[0], b = _h[1];
518
+ _j = record;
519
+ _k = ['auto-merge, setting ON: two case variants are ambiguous, so NOTHING is merged'];
520
+ return [4 /*yield*/, enduserExists(sdk_1, ambiguousSourceId)];
521
+ case 64:
522
+ _k = _k.concat([(_s.sent())
523
+ && !((_q = a.mergedIds) === null || _q === void 0 ? void 0 : _q.includes(ambiguousSourceId))
524
+ && !((_r = b.mergedIds) === null || _r === void 0 ? void 0 : _r.includes(ambiguousSourceId))]);
525
+ _m = (_l = "source ".concat(ambiguousSourceId, " exists=")).concat;
526
+ return [4 /*yield*/, enduserExists(sdk_1, ambiguousSourceId)];
527
+ case 65:
528
+ _j.apply(void 0, _k.concat([_m.apply(_l, [_s.sent(), ","])
529
+ + " A.mergedIds=".concat(JSON.stringify(a.mergedIds), ", B.mergedIds=").concat(JSON.stringify(b.mergedIds))]));
530
+ return [4 /*yield*/, setCaseInsensitive(true)];
531
+ case 66:
532
+ _s.sent();
533
+ DOB = '1986-06-16';
534
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Group', lname: 'MCDONALD', dateOfBirth: DOB })
535
+ // Form 1 carries the intake screen that does the matching; form 2 ALSO carries name intake
536
+ // questions, which is the case that escapes a publicSubmit-only guard — the follow-on group
537
+ // responses are inserted by session_for_public_form without publicSubmit.
538
+ ];
539
+ case 67:
540
+ stored = _s.sent();
541
+ return [4 /*yield*/, createPublicForm(sdk_1)];
542
+ case 68:
543
+ first = _s.sent();
544
+ return [4 /*yield*/, createPublicForm(sdk_1)];
545
+ case 69:
546
+ second_1 = _s.sent();
547
+ return [4 /*yield*/, sdk_1.api.form_groups.createOne({
548
+ title: "Case Insensitive Group ".concat(RAND()),
549
+ formIds: [first.form.id, second_1.form.id],
550
+ })];
551
+ case 70:
552
+ group = _s.sent();
553
+ enduserSDK = new EnduserSession({ host: host, businessId: businessId_1 });
554
+ return [4 /*yield*/, enduserSDK.api.form_responses.session_for_public_form({
555
+ formId: first.form.id,
556
+ businessId: businessId_1,
557
+ groupId: group.id,
558
+ fname: 'Group',
559
+ lname: 'Mcdonald',
560
+ dateOfBirth: DOB,
561
+ })];
562
+ case 71:
563
+ _o = _s.sent(), authToken = _o.authToken, enduserId = _o.enduserId;
564
+ authedSDK = new EnduserSession({ host: host, businessId: businessId_1, authToken: authToken });
565
+ secondResponse = void 0;
566
+ attempt = 0;
567
+ _s.label = 72;
568
+ case 72:
569
+ if (!(attempt < 20 && !secondResponse)) return [3 /*break*/, 76];
570
+ return [4 /*yield*/, sdk_1.api.form_responses.getSome({ filter: { enduserId: stored.id } })];
571
+ case 73:
572
+ responses = _s.sent();
573
+ secondResponse = responses.find(function (r) { return r.formId === second_1.form.id; });
574
+ if (!!secondResponse) return [3 /*break*/, 75];
575
+ return [4 /*yield*/, new Promise(function (res) { return setTimeout(res, 100); })];
576
+ case 74:
577
+ _s.sent();
578
+ _s.label = 75;
579
+ case 75:
580
+ attempt++;
581
+ return [3 /*break*/, 72];
582
+ case 76:
583
+ submitted = false;
584
+ if (!(secondResponse === null || secondResponse === void 0 ? void 0 : secondResponse.accessCode)) return [3 /*break*/, 78];
585
+ f = function (intakeField) { return second_1.fields.find(function (x) { return x.intakeField === intakeField; }); };
586
+ return [4 /*yield*/, authedSDK.api.form_responses.submit_form_response({
587
+ accessCode: secondResponse.accessCode,
588
+ responses: [
589
+ { fieldId: f('fname').id, fieldTitle: 'First Name', answer: { type: 'string', value: 'Group' } },
590
+ { fieldId: f('lname').id, fieldTitle: 'Last Name', answer: { type: 'string', value: 'Mcdonald' } },
591
+ ],
592
+ })];
593
+ case 77:
594
+ _s.sent();
595
+ submitted = true;
596
+ _s.label = 78;
597
+ case 78: return [4 /*yield*/, sdk_1.api.endusers.getOne(stored.id)];
598
+ case 79:
599
+ after = _s.sent();
600
+ record('setting ON: form 2 of a public GROUP does not rewrite the matched contact\'s capitalization', enduserId === stored.id && submitted && after.lname === 'MCDONALD', "intake resolved to ".concat(enduserId, " (expected ").concat(stored.id, "); submitted form 2 = ").concat(submitted)
601
+ + " (accessCode present = ".concat(!!(secondResponse === null || secondResponse === void 0 ? void 0 : secondResponse.accessCode), "); stored lname is ").concat(JSON.stringify(after.lname), ", must still be \"MCDONALD\""));
602
+ return [4 /*yield*/, setCaseInsensitive(true)];
603
+ case 80:
604
+ _s.sent();
605
+ return [4 /*yield*/, createPublicForm(sdk_1)
606
+ // dateOfBirth is an identifier and stays an exact match: the same name with a different DOB
607
+ // must not match, with the setting on
608
+ ];
609
+ case 81:
610
+ form = (_s.sent()).form;
611
+ DOB = '1999-10-11';
612
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Dob', lname: 'MCDONALD', dateOfBirth: DOB })];
613
+ case 82:
614
+ dobContact = _s.sent();
615
+ return [4 /*yield*/, intake(form, { fname: 'Dob', lname: 'Mcdonald', dateOfBirth: '1999-10-12' })];
616
+ case 83:
617
+ wrongDobId = _s.sent();
618
+ record('setting ON: dateOfBirth is still an exact match (a different DOB does not match)', wrongDobId !== dobContact.id, "intake resolved to ".concat(wrongDobId, ", contact with DOB ").concat(DOB, " is ").concat(dobContact.id));
619
+ // with matchEmailAndNames on, the email branch of the $or additionally requires fname + lname;
620
+ // those two must be case-insensitive as well, or the opt-in silently excludes email matching
621
+ return [4 /*yield*/, sdk_1.api.organizations.updateOne(businessId_1, {
622
+ settings: { endusers: { matchEmailAndNames: true } },
623
+ })];
624
+ case 84:
625
+ // with matchEmailAndNames on, the email branch of the $or additionally requires fname + lname;
626
+ // those two must be case-insensitive as well, or the opt-in silently excludes email matching
627
+ _s.sent();
628
+ _s.label = 85;
629
+ case 85:
630
+ _s.trys.push([85, , 88, 90]);
631
+ EMAIL = "dontsend-mean-".concat(RAND(), "@tellescope.com");
632
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Mean', lname: 'MCDONALD', email: EMAIL })];
633
+ case 86:
634
+ emailContact = _s.sent();
635
+ return [4 /*yield*/, intake(form, { email: EMAIL, fname: 'Mean', lname: 'Mcdonald' })];
636
+ case 87:
637
+ matchedId = _s.sent();
638
+ record('setting ON + matchEmailAndNames: the email+fname+lname clause is case-insensitive too', matchedId === emailContact.id, "intake resolved to ".concat(matchedId, ", expected ").concat(emailContact.id));
639
+ return [3 /*break*/, 90];
640
+ case 88: return [4 /*yield*/, sdk_1.api.organizations.updateOne(businessId_1, {
641
+ settings: { endusers: { matchEmailAndNames: false } },
642
+ })];
643
+ case 89:
644
+ _s.sent();
645
+ return [7 /*endfinally*/];
646
+ case 90: return [4 /*yield*/, setCaseInsensitive(true)];
647
+ case 91:
648
+ _s.sent();
649
+ DOB = '1998-09-10';
650
+ return [4 /*yield*/, sdk_1.api.endusers.createOne({ fname: 'Booking', lname: 'MCDONALD', dateOfBirth: DOB })];
651
+ case 92:
652
+ stored = _s.sent();
653
+ return [4 /*yield*/, sdk_1.api.calendar_event_templates.createOne({
654
+ title: "Case Insensitive Booking ".concat(RAND()),
655
+ durationInMinutes: 30,
656
+ })];
657
+ case 93:
658
+ template = _s.sent();
659
+ bookingSDK = new EnduserSession({ host: host, businessId: businessId_1 });
660
+ bookingMatched = void 0;
661
+ _s.label = 94;
662
+ case 94:
663
+ _s.trys.push([94, 97, , 98]);
664
+ return [4 /*yield*/, bookingSDK.api.calendar_events.session_for_public_appointment_booking({
665
+ calendarEventTemplateId: template.id,
666
+ businessId: businessId_1,
667
+ fname: 'Booking',
668
+ lname: 'Mcdonald',
669
+ dateOfBirth: DOB,
670
+ })
671
+ // the booking endpoint returns only an authToken, so "did it match?" is read off the contact
672
+ // list: a non-match inserts a SECOND contact with the submitted capitalization
673
+ ];
674
+ case 95:
675
+ _s.sent();
676
+ return [4 /*yield*/, sdk_1.api.endusers.getSome({ filter: { dateOfBirth: DOB } })];
677
+ case 96:
678
+ sameName = _s.sent();
679
+ bookingMatched = sameName.length === 1;
680
+ return [3 /*break*/, 98];
681
+ case 97:
682
+ err_1 = _s.sent();
683
+ bookingMatched = undefined;
684
+ return [3 /*break*/, 98];
685
+ case 98:
686
+ record('appointment booking stays byte-exact even with the setting ON (deliberately out of scope)', bookingMatched === false, bookingMatched === undefined
687
+ ? 'the booking endpoint errored, so this check could not be evaluated'
688
+ : "contacts with dateOfBirth ".concat(DOB, ": ").concat(bookingMatched ? 1 : 2, "; expected 2 (a separate contact), stored=").concat(stored.id));
689
+ return [2 /*return*/, checks];
690
+ case 99: return [4 /*yield*/, (tenant === null || tenant === void 0 ? void 0 : tenant.teardown())];
691
+ case 100:
692
+ _s.sent();
693
+ return [7 /*endfinally*/];
694
+ case 101: return [2 /*return*/];
695
+ }
696
+ });
697
+ }); };
698
+ /** Asserting wrapper, for standalone runs. */
699
+ export var public_form_case_insensitive_match_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
700
+ var _a, _b;
701
+ return __generator(this, function (_c) {
702
+ switch (_c.label) {
703
+ case 0:
704
+ _a = assert_checks;
705
+ _b = ['Public form case-insensitive matching'];
706
+ return [4 /*yield*/, public_form_case_insensitive_match_checks()];
707
+ case 1:
708
+ _a.apply(void 0, _b.concat([_c.sent()]));
709
+ return [2 /*return*/];
710
+ }
711
+ });
712
+ }); };
713
+ /** Enrolls this suite in the auto-discovered parallel pool — see run_discovered_isolated_suites. */
714
+ export var ISOLATED_SUITE = { name: 'Public form case-insensitive matching', run: public_form_case_insensitive_match_checks };
715
+ // Allow running this test file independently
716
+ if (require.main === module) {
717
+ console.log("Using API URL: ".concat(host));
718
+ public_form_case_insensitive_match_tests()
719
+ .then(function () {
720
+ console.log("Public form case-insensitive match test suite completed successfully");
721
+ process.exit(0);
722
+ })
723
+ .catch(function (error) {
724
+ console.error("Public form case-insensitive match test suite failed:", error);
725
+ process.exit(1);
726
+ });
727
+ }
728
+ //# sourceMappingURL=public_form_case_insensitive_match.test.js.map