@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,2 @@
1
+ export declare const isolated_suite_discovery_unit_tests: () => Promise<void>;
2
+ //# sourceMappingURL=isolated_suite_discovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated_suite_discovery.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit_tests/isolated_suite_discovery.test.ts"],"names":[],"mappings":"AAoEA,eAAO,MAAM,mCAAmC,qBAgG/C,CAAA"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ 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;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.isolated_suite_discovery_unit_tests = void 0;
63
+ require('source-map-support').install();
64
+ var fs = __importStar(require("fs"));
65
+ var path = __importStar(require("path"));
66
+ var testing_1 = require("@tellescope/testing");
67
+ var setup_isolated_1 = require("../setup_isolated");
68
+ /**
69
+ * Guard for the auto-discovering dispatcher (run_discovered_isolated_suites).
70
+ *
71
+ * Discovery walks the COMPILED tree (lib/cjs/tests/api_tests), so the failure mode the old
72
+ * hand-maintained arrays did not have is a suite that silently stops running: a `.test.ts` enrolls
73
+ * itself, the build no-ops, and the dispatcher never sees it. Nothing else in the suite would
74
+ * notice. So the first check here compares the enrolled SOURCE files against what discovery
75
+ * actually loaded, in both directions — a missing one means a stale build (`npm run check:build`),
76
+ * an extra one means a compiled orphan of a deleted test.
77
+ *
78
+ * The other two checks protect the dispatcher's own invariants: names are the only handle on a
79
+ * suite in the output, and a suite that is both discovered and awaited by name in tests.ts would
80
+ * provision its tenants and run twice.
81
+ */
82
+ // compiled location is <sdk>/lib/cjs/tests/unit_tests, so four levels up is the package root
83
+ var SRC_TESTS = path.resolve(__dirname, '..', '..', '..', '..', 'src', 'tests');
84
+ /**
85
+ * Relative paths of every source file under `root` that enrolls itself, split by whether discovery
86
+ * could ever see it. Discovery only loads `*.test.js` under `api_tests`, so a marker anywhere else
87
+ * is a suite that silently never runs — hence `unreachable`, which is an error rather than a miss.
88
+ */
89
+ var enrolled_source_files = function (root) {
90
+ var discoverable = [];
91
+ var unreachable = [];
92
+ var walk = function (dir, prefix) {
93
+ for (var _i = 0, _a = fs.readdirSync(dir, { withFileTypes: true }); _i < _a.length; _i++) {
94
+ var entry = _a[_i];
95
+ var relative = prefix ? "".concat(prefix, "/").concat(entry.name) : entry.name;
96
+ if (entry.isDirectory()) {
97
+ walk(path.join(dir, entry.name), relative);
98
+ continue;
99
+ }
100
+ if (!entry.name.endsWith('.ts') || entry.name.endsWith('.d.ts'))
101
+ continue;
102
+ var source = fs.readFileSync(path.join(dir, entry.name), 'utf8');
103
+ if (!new RegExp("^export const ".concat(setup_isolated_1.ISOLATED_SUITE_EXPORT, "\\b"), 'm').test(source))
104
+ continue;
105
+ var inApiTests = relative === 'api_tests' || relative.indexOf('api_tests/') === 0;
106
+ if (inApiTests && entry.name.endsWith('.test.ts')) {
107
+ discoverable.push(relative.replace(/^api_tests\//, ''));
108
+ }
109
+ else {
110
+ unreachable.push(relative);
111
+ }
112
+ }
113
+ };
114
+ walk(root, '');
115
+ return { discoverable: discoverable.sort(), unreachable: unreachable.sort() };
116
+ };
117
+ var isolated_suite_discovery_unit_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
118
+ var discovered, discoveredFiles, _a, discoverable, unreachable, enrolled_1, missing, extra, byName, _i, discovered_1, s, duplicateNames, testsPath, testsSource, doubleRun, _b, discovered_2, suite, loaded, _c, _d, exported, parallelismCases, _e, parallelismCases_1, _f, raw, expected, actual;
119
+ return __generator(this, function (_g) {
120
+ (0, testing_1.log_header)("Isolated suite discovery");
121
+ discovered = (0, setup_isolated_1.discover_isolated_suites)() // throws on a malformed descriptor or a duplicate name
122
+ ;
123
+ discoveredFiles = discovered.map(function (s) { return s.file; }).sort();
124
+ if (!fs.existsSync(SRC_TESTS)) {
125
+ // Published package, not the monorepo — there is no source tree to compare against.
126
+ console.log(" SKIPPED source comparison: no source tree at ".concat(SRC_TESTS));
127
+ }
128
+ else {
129
+ _a = enrolled_source_files(SRC_TESTS), discoverable = _a.discoverable, unreachable = _a.unreachable;
130
+ enrolled_1 = discoverable.map(function (f) { return f.replace(/\.ts$/, '.js'); });
131
+ // Scanning all of src/tests, not just api_tests: an ISOLATED_SUITE outside the discovered tree
132
+ // (wrong directory, or a filename that is not *.test.ts) would never run and nothing else would say so.
133
+ (0, testing_1.assert)(unreachable.length === 0, "exports ".concat(setup_isolated_1.ISOLATED_SUITE_EXPORT, " where discovery can never see it (must be api_tests/**/*.test.ts): ").concat(unreachable.join(', ')), "every ".concat(setup_isolated_1.ISOLATED_SUITE_EXPORT, " in src/tests lives where discovery looks"));
134
+ missing = enrolled_1.filter(function (f) { return discoveredFiles.indexOf(f) === -1; });
135
+ extra = discoveredFiles.filter(function (f) { return enrolled_1.indexOf(f) === -1; });
136
+ (0, testing_1.assert)(missing.length === 0, "enrolled in src but NOT discovered (stale lib/cjs? run npm run check:build -- --fix): ".concat(missing.join(', ')), "every src file exporting ".concat(setup_isolated_1.ISOLATED_SUITE_EXPORT, " is discovered (").concat(enrolled_1.length, ")"));
137
+ (0, testing_1.assert)(extra.length === 0, "discovered but not enrolled in any src file (compiled orphan? delete lib/cjs and rebuild): ".concat(extra.join(', ')), 'every discovered suite has a source file');
138
+ }
139
+ (0, testing_1.assert)(discovered.length > 0, "no isolated suites discovered under ".concat((0, setup_isolated_1.isolated_suites_root)()), 'suites were discovered');
140
+ byName = {};
141
+ for (_i = 0, discovered_1 = discovered; _i < discovered_1.length; _i++) {
142
+ s = discovered_1[_i];
143
+ byName[s.name] = (byName[s.name] || []).concat(s.file);
144
+ }
145
+ duplicateNames = Object.keys(byName).filter(function (n) { return byName[n].length > 1; });
146
+ (0, testing_1.assert)(duplicateNames.length === 0, "duplicate suite names: ".concat(duplicateNames.map(function (n) { return "".concat(JSON.stringify(n), " in ").concat(byName[n].join(' and ')); }).join('; ')), "suite names are unique (".concat(discovered.length, ")"));
147
+ testsPath = path.join(SRC_TESTS, 'tests.ts');
148
+ if (!fs.existsSync(testsPath)) {
149
+ console.log(" SKIPPED tests.ts comparison: not found at ".concat(testsPath));
150
+ }
151
+ else {
152
+ testsSource = fs.readFileSync(testsPath, 'utf8');
153
+ doubleRun = [];
154
+ for (_b = 0, discovered_2 = discovered; _b < discovered_2.length; _b++) {
155
+ suite = discovered_2[_b];
156
+ loaded = require(path.join((0, setup_isolated_1.isolated_suites_root)(), suite.file));
157
+ for (_c = 0, _d = Object.keys(loaded); _c < _d.length; _c++) {
158
+ exported = _d[_c];
159
+ if (exported === setup_isolated_1.ISOLATED_SUITE_EXPORT)
160
+ continue; // every enrolled file exports this one
161
+ if (new RegExp("\\bawait\\s+".concat(exported, "\\s*\\(")).test(testsSource)) {
162
+ doubleRun.push("".concat(exported, " (api_tests/").concat(suite.file, ", discovered as \"").concat(suite.name, "\")"));
163
+ }
164
+ }
165
+ }
166
+ (0, testing_1.assert)(doubleRun.length === 0, "awaited directly in tests.ts as well as discovered, so it would run twice: ".concat(doubleRun.join(', ')), 'no discovered suite is also awaited directly in tests.ts');
167
+ }
168
+ parallelismCases = [
169
+ [undefined, setup_isolated_1.DEFAULT_TEST_PARALLELISM],
170
+ ['', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
171
+ [' ', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
172
+ ['abc', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
173
+ ['0', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
174
+ ['-1', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
175
+ ['2.5', setup_isolated_1.DEFAULT_TEST_PARALLELISM],
176
+ ['1', 1],
177
+ [' 3 ', 3],
178
+ ['16', 16],
179
+ ];
180
+ for (_e = 0, parallelismCases_1 = parallelismCases; _e < parallelismCases_1.length; _e++) {
181
+ _f = parallelismCases_1[_e], raw = _f[0], expected = _f[1];
182
+ actual = (0, setup_isolated_1.parse_test_parallelism)(raw);
183
+ (0, testing_1.assert)(actual === expected, "TEST_PARALLELISM=".concat(JSON.stringify(raw), " parsed as ").concat(actual, ", expected ").concat(expected), "TEST_PARALLELISM=".concat(JSON.stringify(raw), " \u2192 ").concat(expected));
184
+ }
185
+ return [2 /*return*/];
186
+ });
187
+ }); };
188
+ exports.isolated_suite_discovery_unit_tests = isolated_suite_discovery_unit_tests;
189
+ // Allow running this test file independently
190
+ if (require.main === module) {
191
+ (0, exports.isolated_suite_discovery_unit_tests)()
192
+ .then(function () {
193
+ console.log("Isolated suite discovery unit tests completed successfully");
194
+ process.exit(0);
195
+ })
196
+ .catch(function (error) {
197
+ console.error("Isolated suite discovery unit tests failed:", error);
198
+ process.exit(1);
199
+ });
200
+ }
201
+ //# sourceMappingURL=isolated_suite_discovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isolated_suite_discovery.test.js","sourceRoot":"","sources":["../../../../src/tests/unit_tests/isolated_suite_discovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const run_all: () => void;
2
+ export { run_all as programs_conditional_logic_unit_tests };
3
+ //# sourceMappingURL=programs_conditional_logic.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs_conditional_logic.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit_tests/programs_conditional_logic.test.ts"],"names":[],"mappings":"AA4KA,QAAA,MAAM,OAAO,YAUZ,CAAA;AAMD,OAAO,EAAE,OAAO,IAAI,qCAAqC,EAAE,CAAA"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.programs_conditional_logic_unit_tests = void 0;
4
+ var utilities_1 = require("@tellescope/utilities");
5
+ /**
6
+ * Unit coverage for the `Programs` key in evaluate_conditional_logic_for_enduser_fields — the V1
7
+ * evaluator that triggers, journeys and phone-tree branches all run on.
8
+ *
9
+ * `{ Programs: { $in: 'CHF' } }` means "has a program named CHF"; adding `$status` means "...whose
10
+ * status is S", bound to that same program entry. Comparison is exact string throughout, matching the
11
+ * shipped Order Status Equals / Vital Update program filters.
12
+ *
13
+ * The round-trip between this and the saved V2 Mongo filter is covered separately, by
14
+ * packages/private/webapp/src/__tests__/programs_condition_filter.test.ts.
15
+ */
16
+ var failures = 0;
17
+ var passed = 0;
18
+ var assert = function (name, actual, expected) {
19
+ if (actual === expected) {
20
+ passed++;
21
+ console.log(" \u2713 ".concat(name));
22
+ }
23
+ else {
24
+ failures++;
25
+ console.error(" \u2717 ".concat(name, " \u2014 expected ").concat(expected, ", got ").concat(actual));
26
+ }
27
+ };
28
+ var with_programs = function (programs) { return ({ programs: programs }); };
29
+ var matches = function (programs, value) { return ((0, utilities_1.evaluate_conditional_logic_for_enduser_fields)(with_programs(programs), { $and: [{ condition: { Programs: value } }] })); };
30
+ var CHF_ACTIVE = [{ name: 'CHF', status: 'active' }];
31
+ var CHF_COMPLETED = [{ name: 'CHF', status: 'completed' }];
32
+ var CHF_NO_STATUS = [{ name: 'CHF' }];
33
+ var TWO = [{ name: 'CHF', status: 'completed' }, { name: 'Diabetes', status: 'active' }];
34
+ var run_is_in_tests = function () {
35
+ console.log("\n[Programs / Is In]");
36
+ assert("matches a patient with that program", matches(CHF_ACTIVE, { $in: 'CHF' }), true);
37
+ assert("does not match a patient with a different program", matches([{ name: 'Diabetes' }], { $in: 'CHF' }), false);
38
+ assert("does not match a patient with no programs", matches([], { $in: 'CHF' }), false);
39
+ assert("does not match a patient whose programs are unset", matches(undefined, { $in: 'CHF' }), false);
40
+ assert("matches one program among several", matches(TWO, { $in: 'Diabetes' }), true);
41
+ // exact string comparison — deliberately NOT case-insensitive
42
+ assert("name comparison is case sensitive", matches(CHF_ACTIVE, { $in: 'chf' }), false);
43
+ assert("name comparison does not substring match", matches(CHF_ACTIVE, { $in: 'CH' }), false);
44
+ assert("a name with spaces and punctuation matches exactly", matches([{ name: 'Post-Op Care' }], { $in: 'Post-Op Care' }), true);
45
+ };
46
+ var run_status_tests = function () {
47
+ console.log("\n[Programs / $status]");
48
+ assert("name + status both match", matches(CHF_ACTIVE, { $in: 'CHF', $status: 'active' }), true);
49
+ assert("name matches but status does not", matches(CHF_COMPLETED, { $in: 'CHF', $status: 'active' }), false);
50
+ assert("status matches but name does not", matches(CHF_ACTIVE, { $in: 'Diabetes', $status: 'active' }), false);
51
+ assert("a program with no status is not matched by a status condition", matches(CHF_NO_STATUS, { $in: 'CHF', $status: 'active' }), false);
52
+ assert("a blank status means any status", matches(CHF_COMPLETED, { $in: 'CHF', $status: '' }), true);
53
+ assert("an omitted status means any status", matches(CHF_NO_STATUS, { $in: 'CHF' }), true);
54
+ assert("status comparison is case sensitive", matches(CHF_ACTIVE, { $in: 'CHF', $status: 'Active' }), false);
55
+ // name and status must come from the SAME program, which is the whole point of one paired key
56
+ assert("does not match when the name and the status come from different programs", matches(TWO, { $in: 'CHF', $status: 'active' }), false);
57
+ // $status serialised FIRST — the generic Object.keys(value)[0] operator dispatch would pick $status
58
+ // here and fall through to false, so the Programs branch must read $in/$nin by name
59
+ assert("$status before $in still evaluates as Is In", matches(CHF_ACTIVE, { $status: 'active', $in: 'CHF' }), true);
60
+ assert("$status before $nin still evaluates as Is Not In", matches(CHF_ACTIVE, { $status: 'active', $nin: 'CHF' }), false);
61
+ };
62
+ var run_is_not_in_tests = function () {
63
+ console.log("\n[Programs / Is Not In]");
64
+ assert("does not match a patient with that program", matches(CHF_ACTIVE, { $nin: 'CHF' }), false);
65
+ assert("matches a patient with a different program", matches([{ name: 'Diabetes' }], { $nin: 'CHF' }), true);
66
+ assert("matches a patient with no programs", matches([], { $nin: 'CHF' }), true);
67
+ assert("matches a patient whose programs are unset", matches(undefined, { $nin: 'CHF' }), true);
68
+ assert("negates the name+status pair", matches(CHF_ACTIVE, { $nin: 'CHF', $status: 'active' }), false);
69
+ assert("matches when the name is present but the status differs", matches(CHF_COMPLETED, { $nin: 'CHF', $status: 'active' }), true);
70
+ };
71
+ var run_unconfigured_tests = function () {
72
+ console.log("\n[Programs / unconfigured]");
73
+ // An unfinished condition must match nobody in BOTH directions. This deliberately DIVERGES from
74
+ // Journeys rather than copying it: `{ Journeys: { $nin: '' } }` matches everybody (the blank id is
75
+ // simply absent from enduser.journeys). Failing open on $nin would fire a trigger for every patient.
76
+ assert("a blank name matches nobody under Is In", matches(CHF_ACTIVE, { $in: '' }), false);
77
+ assert("a blank name matches nobody under Is Not In", matches(CHF_ACTIVE, { $nin: '' }), false);
78
+ assert("a blank name matches nobody even with no programs", matches([], { $nin: '' }), false);
79
+ assert("a value with no operator matches nobody", matches(CHF_ACTIVE, { $status: 'active' }), false);
80
+ // the branch is narrowed to $in/$nin, so any other object condition under a key named 'Programs'
81
+ // falls through to the generic custom-field handler — which is what the V2 translator does too
82
+ assert("a non-$in/$nin operator falls through instead of being swallowed", matches(CHF_ACTIVE, { $isSet: 'Value' }), false);
83
+ };
84
+ var run_other_conditions_unaffected = function () {
85
+ console.log("\n[Programs / coexistence with Care Type and Stage]");
86
+ var enduser = {
87
+ programs: CHF_ACTIVE,
88
+ fields: { 'Care Type': 'RPM', 'Care Stage': 'Onboarding' },
89
+ };
90
+ var evaluate = function (conditions) { return ((0, utilities_1.evaluate_conditional_logic_for_enduser_fields)(enduser, conditions)); };
91
+ assert("an existing Care Type condition is unaffected", evaluate({ $and: [{ condition: { 'Care Type': 'RPM' } }] }), true);
92
+ assert("Care Stage and Programs can be combined in one filter", evaluate({ $and: [{ condition: { 'Care Stage': 'Onboarding' } }, { condition: { Programs: { $in: 'CHF' } } }] }), true);
93
+ assert("the combined filter fails when the Programs half fails", evaluate({ $and: [{ condition: { 'Care Stage': 'Onboarding' } }, { condition: { Programs: { $in: 'Diabetes' } } }] }), false);
94
+ assert("an $or over Care Type and Programs matches on either half", evaluate({ $or: [{ condition: { 'Care Type': 'Nope' } }, { condition: { Programs: { $in: 'CHF' } } }] }), true);
95
+ };
96
+ var run_custom_field_validation_tests = function () {
97
+ console.log("\n[Programs is a built-in field]");
98
+ // without 'Programs' in BUILT_IN_FIELDS, the trigger and journey validation hooks flag every program
99
+ // condition as a reference to a custom field that no longer exists
100
+ var conditions = { $and: [{ condition: { Programs: { $in: 'CHF', $status: 'active' } } }] };
101
+ assert("a Programs condition is not reported as a missing custom field", (0, utilities_1.validate_custom_field_references)(conditions, new Set()).length === 0, true);
102
+ assert("a genuinely missing custom field is still reported", (0, utilities_1.validate_custom_field_references)({ $and: [{ condition: { deletedField: 'x' } }] }, new Set()).includes('deletedField'), true);
103
+ };
104
+ var run_all = function () {
105
+ console.log("Running programs_conditional_logic unit tests");
106
+ run_is_in_tests();
107
+ run_status_tests();
108
+ run_is_not_in_tests();
109
+ run_unconfigured_tests();
110
+ run_other_conditions_unaffected();
111
+ run_custom_field_validation_tests();
112
+ console.log("\nResults: ".concat(passed, " passed, ").concat(failures, " failed"));
113
+ if (failures > 0)
114
+ process.exit(1);
115
+ };
116
+ exports.programs_conditional_logic_unit_tests = run_all;
117
+ if (require.main === module) {
118
+ run_all();
119
+ }
120
+ //# sourceMappingURL=programs_conditional_logic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"programs_conditional_logic.test.js","sourceRoot":"","sources":["../../../../src/tests/unit_tests/programs_conditional_logic.test.ts"],"names":[],"mappings":"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"}
@@ -850,81 +850,91 @@ var run_tests = function () { return __awaiter(void 0, void 0, void 0, function
850
850
  return [4 /*yield*/, (0, setup_1.reset_test_tenant)(sdk)];
851
851
  case 3:
852
852
  _k.sent();
853
- return [4 /*yield*/, nonAdminSdk.authenticate(nonAdminEmail, nonAdminPassword)];
853
+ return [4 /*yield*/, nonAdminSdk.authenticate(nonAdminEmail, nonAdminPassword)
854
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
855
+ ];
854
856
  case 4:
855
857
  _k.sent();
856
- return [4 /*yield*/, (0, testing_1.async_test)('configure webhook is admin only', function () { return nonAdminSdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
858
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
859
+ return [4 /*yield*/, Promise.all([
860
+ sdk.api.users.updateOne(sdk.userInfo.id, { notificationEmailsDisabled: true }),
861
+ sdk.api.users.updateOne(nonAdminSdk.userInfo.id, { notificationEmailsDisabled: true }),
862
+ ]).catch(console.error)];
857
863
  case 5:
864
+ // as in setup_tests: booking cancel/reschedule below would otherwise email the host for real
858
865
  _k.sent();
859
- return [4 /*yield*/, (0, testing_1.async_test)('update webhook is admin only', function () { return nonAdminSdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
866
+ return [4 /*yield*/, (0, testing_1.async_test)('configure webhook is admin only', function () { return nonAdminSdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
860
867
  case 6:
861
868
  _k.sent();
862
- return [4 /*yield*/, (0, testing_1.async_test)('configure webhook', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function (_) { return true; } })];
869
+ return [4 /*yield*/, (0, testing_1.async_test)('update webhook is admin only', function () { return nonAdminSdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
863
870
  case 7:
871
+ _k.sent();
872
+ return [4 /*yield*/, (0, testing_1.async_test)('configure webhook', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function (_) { return true; } })];
873
+ case 8:
864
874
  _k.sent();
865
875
  return [4 /*yield*/, (0, testing_1.async_test)('configure webhook (overwrite)', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function () { return true; } }
866
876
  // { shouldError: true, onError: e => e.message === "Only one webhook configuration is supported per organization. Use /update-webooks to update your configuration." }
867
877
  )];
868
- case 8:
878
+ case 9:
869
879
  _k.sent();
870
880
  return [4 /*yield*/, (0, testing_1.async_test)('get initial webhook configuration', function () { return sdk.api.webhooks.get_configuration({}); }, { onResult: function (r) { var _a; return r.url === webhookURL && (0, utilities_1.object_is_empty)((_a = r.subscriptions) !== null && _a !== void 0 ? _a : {}); } })];
871
- case 9:
881
+ case 10:
872
882
  _k.sent();
873
883
  return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set empty subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: {} }); }, { onResult: function (_) { return true; } })];
874
- case 10:
884
+ case 11:
875
885
  _k.sent();
876
886
  return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set partial subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { chats: { create: true } } }); }, { onResult: function (_) { return true; } })];
877
- case 11:
887
+ case 12:
878
888
  _k.sent();
879
889
  return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set subscriptions)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { onResult: function (_) { return true; } })];
880
- case 12:
890
+ case 13:
881
891
  _k.sent();
882
892
  return [4 /*yield*/, (0, testing_1.async_test)('update webhook invalid model', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { notAModel: { create: false } } }); }, { shouldError: true, onError: function (e) { return e.message === "Error parsing field subscriptionUpdates: Got unexpected field(s) [notAModel]"; } })];
883
- case 13:
893
+ case 14:
884
894
  _k.sent();
885
895
  return [4 /*yield*/, (0, testing_1.async_test)('get initial webhook configuration after updates', function () { return sdk.api.webhooks.get_configuration({}); }, { onResult: function (r) { return r.url === webhookURL && (0, utilities_1.objects_equivalent)(r.subscriptions, fullSubscription); } })];
886
- case 14:
896
+ case 15:
887
897
  _k.sent();
888
898
  return [4 /*yield*/, self_serve_appointment_booking_tests()
889
899
  // reset to only poartial / testing fields
890
900
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
891
901
  ];
892
- case 15:
902
+ case 16:
893
903
  _k.sent();
894
904
  // reset to only poartial / testing fields
895
905
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
896
906
  return [4 /*yield*/, sdk.api.webhooks.update({ subscriptionUpdates: __assign(__assign({}, emptySubscription), { chats: { create: true }, meetings: { create: true, update: true, delete: false } })
897
907
  })];
898
- case 16:
908
+ case 17:
899
909
  // reset to only poartial / testing fields
900
910
  // todo: subscribe in individual tests to avoid issues in ordering of tests / subscriptions
901
911
  _k.sent();
902
912
  (0, testing_1.log_header)("Webhooks Tests with Subscriptions");
903
913
  return [4 /*yield*/, test_automation_webhooks()];
904
- case 17:
914
+ case 18:
905
915
  _k.sent();
906
916
  _a = tests;
907
917
  _b = [];
908
918
  for (_c in _a)
909
919
  _b.push(_c);
910
920
  _i = 0;
911
- _k.label = 18;
912
- case 18:
913
- if (!(_i < _b.length)) return [3 /*break*/, 21];
921
+ _k.label = 19;
922
+ case 19:
923
+ if (!(_i < _b.length)) return [3 /*break*/, 22];
914
924
  _c = _b[_i];
915
- if (!(_c in _a)) return [3 /*break*/, 20];
925
+ if (!(_c in _a)) return [3 /*break*/, 21];
916
926
  t = _c;
917
927
  return [4 /*yield*/, ((_h = tests[t]) === null || _h === void 0 ? void 0 : _h.call(tests, true))];
918
- case 19:
919
- _k.sent();
920
- _k.label = 20;
921
928
  case 20:
922
- _i++;
923
- return [3 /*break*/, 18];
929
+ _k.sent();
930
+ _k.label = 21;
924
931
  case 21:
932
+ _i++;
933
+ return [3 /*break*/, 19];
934
+ case 22:
925
935
  finalLength = handledEvents.length;
926
936
  return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set subscriptions empty)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: __assign({}, emptySubscription) }); }, { onResult: function (_) { return true; } })];
927
- case 22:
937
+ case 23:
928
938
  _k.sent();
929
939
  (0, testing_1.log_header)("Webhooks Tests without Subscriptions");
930
940
  _d = tests;
@@ -932,23 +942,23 @@ var run_tests = function () { return __awaiter(void 0, void 0, void 0, function
932
942
  for (_f in _d)
933
943
  _e.push(_f);
934
944
  _g = 0;
935
- _k.label = 23;
936
- case 23:
937
- if (!(_g < _e.length)) return [3 /*break*/, 26];
945
+ _k.label = 24;
946
+ case 24:
947
+ if (!(_g < _e.length)) return [3 /*break*/, 27];
938
948
  _f = _e[_g];
939
- if (!(_f in _d)) return [3 /*break*/, 25];
949
+ if (!(_f in _d)) return [3 /*break*/, 26];
940
950
  t = _f;
941
951
  if (tests[t] === tests.calendarEventReminders) {
942
- return [3 /*break*/, 25]; // don't require subscription / can't unsubscribe
952
+ return [3 /*break*/, 26]; // don't require subscription / can't unsubscribe
943
953
  }
944
954
  return [4 /*yield*/, ((_j = tests[t]) === null || _j === void 0 ? void 0 : _j.call(tests, false))];
945
- case 24:
946
- _k.sent();
947
- _k.label = 25;
948
955
  case 25:
949
- _g++;
950
- return [3 /*break*/, 23];
956
+ _k.sent();
957
+ _k.label = 26;
951
958
  case 26:
959
+ _g++;
960
+ return [3 /*break*/, 24];
961
+ case 27:
952
962
  (0, testing_1.assert)(finalLength === handledEvents.length, 'length changed after subscriptions', 'No webhooks posted when no subscription');
953
963
  return [2 /*return*/];
954
964
  }