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