@hexclave/next 1.0.41 → 1.0.42
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/dist/account-settings-cTsj8rpJ.d.ts +56 -0
- package/dist/account-settings-cTsj8rpJ.d.ts.map +1 -0
- package/dist/admin-app-impl-B4i11dbJ.d.ts +1282 -0
- package/dist/admin-app-impl-B4i11dbJ.d.ts.map +1 -0
- package/dist/auth-page-YnM_LtbN.d.ts +24 -0
- package/dist/auth-page-YnM_LtbN.d.ts.map +1 -0
- package/dist/cli-auth-confirm-BW3PYpKb.d.ts +19 -0
- package/dist/cli-auth-confirm-BW3PYpKb.d.ts.map +1 -0
- package/dist/clickmap/clickmap-core.d.ts +1 -2
- package/dist/clickmap/clickmap-core.d.ts.map +1 -1
- package/dist/clickmap/clickmap-core.js +2 -4
- package/dist/clickmap/clickmap-core.js.map +1 -1
- package/dist/clickmap/clickmap-styles.js +3 -6
- package/dist/clickmap/clickmap-styles.js.map +1 -1
- package/dist/clickmap/index.d.ts +1 -2
- package/dist/clickmap/index.d.ts.map +1 -1
- package/dist/clickmap/index.js +2 -4
- package/dist/clickmap/index.js.map +1 -1
- package/dist/client-app-Bi8p4lxS.d.ts +1359 -0
- package/dist/client-app-Bi8p4lxS.d.ts.map +1 -0
- package/dist/common-B2gkWlXX.d.ts +183 -0
- package/dist/common-B2gkWlXX.d.ts.map +1 -0
- package/dist/common-BK_sydxF.d.ts +66 -0
- package/dist/common-BK_sydxF.d.ts.map +1 -0
- package/dist/components/api-key-dialogs.d.ts +3 -4
- package/dist/components/api-key-dialogs.d.ts.map +1 -1
- package/dist/components/api-key-dialogs.js +3 -6
- package/dist/components/api-key-dialogs.js.map +1 -1
- package/dist/components/api-key-table.d.ts +2 -3
- package/dist/components/api-key-table.d.ts.map +1 -1
- package/dist/components/api-key-table.js +3 -6
- package/dist/components/api-key-table.js.map +1 -1
- package/dist/components/credential-sign-in.d.ts +2 -7
- package/dist/components/credential-sign-in.js +3 -6
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.d.ts +2 -9
- package/dist/components/credential-sign-up.js +6 -8
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/form-warning.d.ts +1 -3
- package/dist/components/elements/form-warning.d.ts.map +1 -1
- package/dist/components/elements/form-warning.js +3 -6
- package/dist/components/elements/form-warning.js.map +1 -1
- package/dist/components/elements/maybe-full-page.d.ts +1 -2
- package/dist/components/elements/maybe-full-page.d.ts.map +1 -1
- package/dist/components/elements/maybe-full-page.js +4 -6
- package/dist/components/elements/maybe-full-page.js.map +1 -1
- package/dist/components/elements/separator-with-text.d.ts +1 -3
- package/dist/components/elements/separator-with-text.d.ts.map +1 -1
- package/dist/components/elements/separator-with-text.js +3 -6
- package/dist/components/elements/separator-with-text.js.map +1 -1
- package/dist/components/elements/sidebar-layout.d.ts +1 -2
- package/dist/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/components/elements/sidebar-layout.js +5 -7
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/ssr-layout-effect.d.ts +1 -3
- package/dist/components/elements/ssr-layout-effect.d.ts.map +1 -1
- package/dist/components/elements/ssr-layout-effect.js +2 -5
- package/dist/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/components/elements/user-avatar.d.ts +2 -15
- package/dist/components/elements/user-avatar.js +2 -4
- package/dist/components/elements/user-avatar.js.map +1 -1
- package/dist/components/link.d.ts +2 -4
- package/dist/components/link.d.ts.map +1 -1
- package/dist/components/link.js +5 -7
- package/dist/components/link.js.map +1 -1
- package/dist/components/magic-link-sign-in.d.ts +2 -7
- package/dist/components/magic-link-sign-in.js +3 -6
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/known-error-message-card.d.ts +1 -2
- package/dist/components/message-cards/known-error-message-card.d.ts.map +1 -1
- package/dist/components/message-cards/known-error-message-card.js +2 -5
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/message-card.d.ts +2 -19
- package/dist/components/message-cards/message-card.js +5 -7
- package/dist/components/message-cards/message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.d.ts +1 -3
- package/dist/components/message-cards/predefined-message-card.d.ts.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js +2 -5
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button-group.d.ts +2 -19
- package/dist/components/oauth-button-group.js +3 -6
- package/dist/components/oauth-button-group.js.map +1 -1
- package/dist/components/oauth-button.d.ts +2 -17
- package/dist/components/oauth-button.js +5 -7
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.d.ts +1 -3
- package/dist/components/passkey-button.d.ts.map +1 -1
- package/dist/components/passkey-button.js +3 -6
- package/dist/components/passkey-button.js.map +1 -1
- package/dist/components/profile-image-editor.d.ts +2 -3
- package/dist/components/profile-image-editor.d.ts.map +1 -1
- package/dist/components/profile-image-editor.js +5 -6
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.d.ts +2 -31
- package/dist/components/selected-team-switcher.js +3 -6
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/team-icon.d.ts +2 -4
- package/dist/components/team-icon.d.ts.map +1 -1
- package/dist/components/team-icon.js +2 -4
- package/dist/components/team-icon.js.map +1 -1
- package/dist/components/team-switcher.d.ts +2 -31
- package/dist/components/team-switcher.js +3 -6
- package/dist/components/team-switcher.js.map +1 -1
- package/dist/components/use-in-iframe.d.ts.map +1 -1
- package/dist/components/use-in-iframe.js +3 -6
- package/dist/components/use-in-iframe.js.map +1 -1
- package/dist/components/user-button.d.ts +2 -22
- package/dist/components/user-button.js +5 -7
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts +1 -3
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +2 -4
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts +1 -3
- package/dist/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.js +2 -4
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.d.ts +1 -3
- package/dist/components-page/account-settings/editable-text.d.ts.map +1 -1
- package/dist/components-page/account-settings/editable-text.js +2 -4
- package/dist/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js +5 -6
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js +2 -4
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.d.ts +1 -3
- package/dist/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js +4 -5
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.d.ts +1 -3
- package/dist/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.js +2 -4
- package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/components-page/account-settings/page-layout.d.ts +1 -3
- package/dist/components-page/account-settings/page-layout.d.ts.map +1 -1
- package/dist/components-page/account-settings/page-layout.js +2 -4
- package/dist/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.d.ts +2 -4
- package/dist/components-page/account-settings/payments/payments-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.js +3 -6
- package/dist/components-page/account-settings/payments/payments-page.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-panel.d.ts +2 -3
- package/dist/components-page/account-settings/payments/payments-panel.d.ts.map +1 -1
- package/dist/components-page/account-settings/payments/payments-panel.js +3 -6
- package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/components-page/account-settings/profile-page/profile-page.d.ts +1 -3
- package/dist/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/profile-page/profile-page.js +2 -4
- package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/components-page/account-settings/section.d.ts +1 -3
- package/dist/components-page/account-settings/section.d.ts.map +1 -1
- package/dist/components-page/account-settings/section.js +2 -4
- package/dist/components-page/account-settings/section.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.d.ts +1 -3
- package/dist/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js +2 -4
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.d.ts +1 -3
- package/dist/components-page/account-settings/settings/settings-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.js +2 -4
- package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.d.ts +1 -3
- package/dist/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js +2 -4
- package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.js +2 -4
- package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +2 -3
- package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.d.ts +1 -3
- package/dist/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js +2 -4
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-page.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.js +2 -4
- package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +2 -4
- package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.js +2 -4
- package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/components-page/account-settings.d.ts +2 -58
- package/dist/components-page/account-settings.js +5 -7
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.d.ts +2 -26
- package/dist/components-page/auth-page.js +3 -6
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.d.ts +2 -21
- package/dist/components-page/cli-auth-confirm.js +3 -6
- package/dist/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.test.js +3 -4
- package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/components-page/email-verification.d.ts +2 -10
- package/dist/components-page/email-verification.js +5 -7
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.d.ts +2 -10
- package/dist/components-page/error-page.js +3 -6
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.d.ts +2 -14
- package/dist/components-page/forgot-password.js +3 -6
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/hexclave-handler-client.d.ts +2 -62
- package/dist/components-page/hexclave-handler-client.js +2 -5
- package/dist/components-page/hexclave-handler-client.js.map +1 -1
- package/dist/components-page/hexclave-handler-client.test.js +1 -3
- package/dist/components-page/hexclave-handler-client.test.js.map +1 -1
- package/dist/components-page/hexclave-handler.d.ts +2 -37
- package/dist/components-page/hexclave-handler.js +5 -4
- package/dist/components-page/hexclave-handler.js.map +1 -1
- package/dist/components-page/magic-link-callback.d.ts +2 -10
- package/dist/components-page/magic-link-callback.js +6 -9
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.d.ts +2 -11
- package/dist/components-page/mfa.js +2 -5
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.d.ts +2 -11
- package/dist/components-page/oauth-callback.js +3 -6
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/components-page/oauth-callback.test.js +3 -4
- package/dist/components-page/oauth-callback.test.js.map +1 -1
- package/dist/components-page/onboarding.d.ts +2 -9
- package/dist/components-page/onboarding.js +3 -6
- package/dist/components-page/onboarding.js.map +1 -1
- package/dist/components-page/password-reset.d.ts +2 -17
- package/dist/components-page/password-reset.js +8 -7
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/section.js +2 -2
- package/dist/components-page/sign-in.d.ts +2 -23
- package/dist/components-page/sign-in.js +2 -4
- package/dist/components-page/sign-in.js.map +1 -1
- package/dist/components-page/sign-out.d.ts +2 -10
- package/dist/components-page/sign-out.js +3 -6
- package/dist/components-page/sign-out.js.map +1 -1
- package/dist/components-page/sign-up.d.ts +2 -13
- package/dist/components-page/sign-up.js +3 -6
- package/dist/components-page/sign-up.js.map +1 -1
- package/dist/components-page/team-creation.d.ts +1 -3
- package/dist/components-page/team-creation.d.ts.map +1 -1
- package/dist/components-page/team-creation.js +3 -6
- package/dist/components-page/team-creation.js.map +1 -1
- package/dist/components-page/team-invitation.d.ts +2 -13
- package/dist/components-page/team-invitation.js +5 -7
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/config.js +17 -19
- package/dist/convex-D2mFhYyd.d.ts +13 -0
- package/dist/convex-D2mFhYyd.d.ts.map +1 -0
- package/dist/cookie-DTOQvCYn.d.ts +42 -0
- package/dist/cookie-DTOQvCYn.d.ts.map +1 -0
- package/dist/credential-sign-in-BxCi9NEV.d.ts +5 -0
- package/dist/credential-sign-in-BxCi9NEV.d.ts.map +1 -0
- package/dist/credential-sign-up-tYm5rV86.d.ts +7 -0
- package/dist/credential-sign-up-tYm5rV86.d.ts.map +1 -0
- package/dist/dev-tool/dev-tool-core.d.ts +1 -2
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +2 -4
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-styles.js +3 -6
- package/dist/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.js +6 -7
- package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -3
- package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/dev-tool/index.d.ts +1 -2
- package/dist/dev-tool/index.d.ts.map +1 -1
- package/dist/dev-tool/index.js +2 -4
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/email-verification-Cr_KKvtQ.d.ts +8 -0
- package/dist/email-verification-Cr_KKvtQ.d.ts.map +1 -0
- package/dist/error-page-D0KwN73t.d.ts +8 -0
- package/dist/error-page-D0KwN73t.d.ts.map +1 -0
- package/dist/esm/clickmap/clickmap-core.d.ts +1 -1
- package/dist/esm/clickmap/clickmap-core.d.ts.map +1 -1
- package/dist/esm/clickmap/clickmap-core.js +1 -2
- package/dist/esm/clickmap/clickmap-core.js.map +1 -1
- package/dist/esm/clickmap/clickmap-styles.js +1 -2
- package/dist/esm/clickmap/clickmap-styles.js.map +1 -1
- package/dist/esm/clickmap/index.d.ts +1 -1
- package/dist/esm/clickmap/index.d.ts.map +1 -1
- package/dist/esm/clickmap/index.js +1 -2
- package/dist/esm/clickmap/index.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.d.ts +3 -4
- package/dist/esm/components/api-key-dialogs.d.ts.map +1 -1
- package/dist/esm/components/api-key-dialogs.js +2 -4
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/api-key-table.d.ts +2 -3
- package/dist/esm/components/api-key-table.d.ts.map +1 -1
- package/dist/esm/components/api-key-table.js +2 -4
- package/dist/esm/components/api-key-table.js.map +1 -1
- package/dist/esm/components/credential-sign-in.d.ts +1 -3
- package/dist/esm/components/credential-sign-in.d.ts.map +1 -1
- package/dist/esm/components/credential-sign-in.js +2 -4
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.d.ts +1 -3
- package/dist/esm/components/credential-sign-up.d.ts.map +1 -1
- package/dist/esm/components/credential-sign-up.js +3 -5
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/form-warning.d.ts +1 -3
- package/dist/esm/components/elements/form-warning.d.ts.map +1 -1
- package/dist/esm/components/elements/form-warning.js +2 -4
- package/dist/esm/components/elements/form-warning.js.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.d.ts +1 -2
- package/dist/esm/components/elements/maybe-full-page.d.ts.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.js +2 -4
- package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
- package/dist/esm/components/elements/separator-with-text.d.ts +1 -3
- package/dist/esm/components/elements/separator-with-text.d.ts.map +1 -1
- package/dist/esm/components/elements/separator-with-text.js +2 -4
- package/dist/esm/components/elements/separator-with-text.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.d.ts +1 -2
- package/dist/esm/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js +3 -5
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.d.ts +1 -3
- package/dist/esm/components/elements/ssr-layout-effect.d.ts.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.js +1 -3
- package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.d.ts +1 -3
- package/dist/esm/components/elements/user-avatar.d.ts.map +1 -1
- package/dist/esm/components/elements/user-avatar.js +1 -2
- package/dist/esm/components/elements/user-avatar.js.map +1 -1
- package/dist/esm/components/link.d.ts +2 -4
- package/dist/esm/components/link.d.ts.map +1 -1
- package/dist/esm/components/link.js +2 -4
- package/dist/esm/components/link.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.d.ts +1 -3
- package/dist/esm/components/magic-link-sign-in.d.ts.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js +2 -4
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.d.ts +1 -2
- package/dist/esm/components/message-cards/known-error-message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js +1 -3
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/message-card.d.ts +1 -2
- package/dist/esm/components/message-cards/message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/message-card.js +3 -5
- package/dist/esm/components/message-cards/message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.d.ts +1 -3
- package/dist/esm/components/message-cards/predefined-message-card.d.ts.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js +1 -3
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button-group.d.ts +1 -3
- package/dist/esm/components/oauth-button-group.d.ts.map +1 -1
- package/dist/esm/components/oauth-button-group.js +2 -4
- package/dist/esm/components/oauth-button-group.js.map +1 -1
- package/dist/esm/components/oauth-button.d.ts +1 -3
- package/dist/esm/components/oauth-button.d.ts.map +1 -1
- package/dist/esm/components/oauth-button.js +2 -4
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.d.ts +1 -3
- package/dist/esm/components/passkey-button.d.ts.map +1 -1
- package/dist/esm/components/passkey-button.js +2 -4
- package/dist/esm/components/passkey-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.d.ts +2 -3
- package/dist/esm/components/profile-image-editor.d.ts.map +1 -1
- package/dist/esm/components/profile-image-editor.js +1 -2
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.d.ts +2 -3
- package/dist/esm/components/selected-team-switcher.d.ts.map +1 -1
- package/dist/esm/components/selected-team-switcher.js +2 -4
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/team-icon.d.ts +2 -3
- package/dist/esm/components/team-icon.d.ts.map +1 -1
- package/dist/esm/components/team-icon.js +1 -2
- package/dist/esm/components/team-icon.js.map +1 -1
- package/dist/esm/components/team-switcher.d.ts +2 -3
- package/dist/esm/components/team-switcher.d.ts.map +1 -1
- package/dist/esm/components/team-switcher.js +2 -4
- package/dist/esm/components/team-switcher.js.map +1 -1
- package/dist/esm/components/use-in-iframe.d.ts.map +1 -1
- package/dist/esm/components/use-in-iframe.js +2 -4
- package/dist/esm/components/use-in-iframe.js.map +1 -1
- package/dist/esm/components/user-button.d.ts +1 -2
- package/dist/esm/components/user-button.d.ts.map +1 -1
- package/dist/esm/components/user-button.js +3 -5
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +1 -2
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js +1 -2
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.d.ts +1 -3
- package/dist/esm/components-page/account-settings/editable-text.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js +1 -2
- package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +2 -3
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +1 -2
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/notifications/notifications-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js +1 -2
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.d.ts +1 -3
- package/dist/esm/components-page/account-settings/page-layout.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.js +1 -2
- package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.d.ts +2 -3
- package/dist/esm/components-page/account-settings/payments/payments-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.js +2 -4
- package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts +2 -3
- package/dist/esm/components-page/account-settings/payments/payments-panel.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-panel.js +2 -4
- package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
- package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/profile-page/profile-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js +1 -2
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/section.js +1 -2
- package/dist/esm/components-page/account-settings/section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/delete-account-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js +1 -2
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/settings-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.js +1 -2
- package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts +1 -3
- package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js +1 -2
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/leave-team-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts +1 -3
- package/dist/esm/components-page/account-settings/teams/team-creation-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-page.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts +2 -3
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js +1 -2
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/esm/components-page/account-settings.d.ts +9 -11
- package/dist/esm/components-page/account-settings.d.ts.map +1 -1
- package/dist/esm/components-page/account-settings.js +3 -5
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.d.ts +1 -3
- package/dist/esm/components-page/auth-page.d.ts.map +1 -1
- package/dist/esm/components-page/auth-page.js +2 -4
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.d.ts +1 -3
- package/dist/esm/components-page/cli-auth-confirm.d.ts.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js +2 -4
- package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.test.js +3 -4
- package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
- package/dist/esm/components-page/email-verification.d.ts +1 -3
- package/dist/esm/components-page/email-verification.d.ts.map +1 -1
- package/dist/esm/components-page/email-verification.js +2 -4
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.d.ts +1 -3
- package/dist/esm/components-page/error-page.d.ts.map +1 -1
- package/dist/esm/components-page/error-page.js +2 -4
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.d.ts +2 -4
- package/dist/esm/components-page/forgot-password.d.ts.map +1 -1
- package/dist/esm/components-page/forgot-password.js +2 -4
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.d.ts +14 -14
- package/dist/esm/components-page/hexclave-handler-client.d.ts.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.js +1 -3
- package/dist/esm/components-page/hexclave-handler-client.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler-client.test.js +2 -3
- package/dist/esm/components-page/hexclave-handler-client.test.js.map +1 -1
- package/dist/esm/components-page/hexclave-handler.d.ts +2 -3
- package/dist/esm/components-page/hexclave-handler.d.ts.map +1 -1
- package/dist/esm/components-page/hexclave-handler.js +1 -2
- package/dist/esm/components-page/hexclave-handler.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.d.ts +1 -3
- package/dist/esm/components-page/magic-link-callback.d.ts.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js +2 -4
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.d.ts +1 -3
- package/dist/esm/components-page/mfa.d.ts.map +1 -1
- package/dist/esm/components-page/mfa.js +1 -3
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.d.ts +1 -3
- package/dist/esm/components-page/oauth-callback.d.ts.map +1 -1
- package/dist/esm/components-page/oauth-callback.js +2 -4
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.test.js +3 -4
- package/dist/esm/components-page/oauth-callback.test.js.map +1 -1
- package/dist/esm/components-page/onboarding.d.ts +1 -3
- package/dist/esm/components-page/onboarding.d.ts.map +1 -1
- package/dist/esm/components-page/onboarding.js +2 -4
- package/dist/esm/components-page/onboarding.js.map +1 -1
- package/dist/esm/components-page/password-reset.d.ts +2 -4
- package/dist/esm/components-page/password-reset.d.ts.map +1 -1
- package/dist/esm/components-page/password-reset.js +2 -4
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/section.js +3 -4
- package/dist/esm/components-page/sign-in.d.ts +1 -3
- package/dist/esm/components-page/sign-in.d.ts.map +1 -1
- package/dist/esm/components-page/sign-in.js +1 -2
- package/dist/esm/components-page/sign-in.js.map +1 -1
- package/dist/esm/components-page/sign-out.d.ts +1 -3
- package/dist/esm/components-page/sign-out.d.ts.map +1 -1
- package/dist/esm/components-page/sign-out.js +2 -4
- package/dist/esm/components-page/sign-out.js.map +1 -1
- package/dist/esm/components-page/sign-up.d.ts +1 -3
- package/dist/esm/components-page/sign-up.d.ts.map +1 -1
- package/dist/esm/components-page/sign-up.js +2 -4
- package/dist/esm/components-page/sign-up.js.map +1 -1
- package/dist/esm/components-page/team-creation.d.ts +1 -3
- package/dist/esm/components-page/team-creation.d.ts.map +1 -1
- package/dist/esm/components-page/team-creation.js +2 -4
- package/dist/esm/components-page/team-creation.js.map +1 -1
- package/dist/esm/components-page/team-invitation.d.ts +1 -3
- package/dist/esm/components-page/team-invitation.d.ts.map +1 -1
- package/dist/esm/components-page/team-invitation.js +2 -4
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/config.js +1 -2
- package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +1 -2
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.js +1 -2
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.js +5 -5
- package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +2 -3
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts +1 -1
- package/dist/esm/dev-tool/index.d.ts.map +1 -1
- package/dist/esm/dev-tool/index.js +1 -2
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/generated/env.js +1 -1
- package/dist/esm/generated/env.js.map +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/generated/quetzal-translations.js +1 -2
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/global.d.ts.map +1 -1
- package/dist/esm/in-page-ui/base-styles.d.ts.map +1 -1
- package/dist/esm/in-page-ui/base-styles.js +1 -1
- package/dist/esm/in-page-ui/base-styles.js.map +1 -1
- package/dist/esm/in-page-ui/dom.d.ts.map +1 -1
- package/dist/esm/in-page-ui/dom.js +1 -1
- package/dist/esm/in-page-ui/dom.js.map +1 -1
- package/dist/esm/index.d.ts +25 -25
- package/dist/esm/index.js +2 -4
- package/dist/esm/integrations/convex/component/convex.config.d.ts +1 -3
- package/dist/esm/integrations/convex/component/convex.config.d.ts.map +1 -1
- package/dist/esm/integrations/convex/component/convex.config.js +1 -2
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/esm/integrations/convex.js +1 -2
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js +1 -2
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/auth.test.js +2 -3
- package/dist/esm/lib/auth.test.js.map +1 -1
- package/dist/esm/lib/cookie.d.ts.map +1 -1
- package/dist/esm/lib/cookie.js +4 -22
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.js +1 -2
- package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +34 -42
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +26 -28
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js +7 -8
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +3 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +13 -13
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js +2 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js +13 -7
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js +134 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/index.d.ts +3 -3
- package/dist/esm/lib/hexclave-app/apps/index.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts +8 -8
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +6 -6
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts +7 -7
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js +1 -2
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/common.js +1 -1
- package/dist/esm/lib/hexclave-app/common.js.map +1 -1
- package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/connected-accounts/index.js +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.js +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.js +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/email/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/index.d.ts +14 -14
- package/dist/esm/lib/hexclave-app/index.js +1 -2
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.js +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/notification-categories/index.js +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.js +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/plan-usage/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/plan-usage/index.js +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.js +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.d.ts +2 -2
- package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.js +5 -1
- package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/session-replays/index.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.d.ts +4 -4
- package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.js +2 -3
- package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.test.js +2 -3
- package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/users/index.d.ts +9 -9
- package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/users/index.js +1 -2
- package/dist/esm/lib/hexclave-app/users/index.js.map +1 -1
- package/dist/esm/lib/hooks.d.ts +1 -1
- package/dist/esm/lib/hooks.d.ts.map +1 -1
- package/dist/esm/lib/hooks.js +1 -2
- package/dist/esm/lib/hooks.js.map +1 -1
- package/dist/esm/lib/translations.d.ts.map +1 -1
- package/dist/esm/lib/translations.js +1 -2
- package/dist/esm/lib/translations.js.map +1 -1
- package/dist/esm/providers/hexclave-context.d.ts +1 -1
- package/dist/esm/providers/hexclave-context.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-context.js +1 -3
- package/dist/esm/providers/hexclave-context.js.map +1 -1
- package/dist/esm/providers/hexclave-provider-client.d.ts +2 -3
- package/dist/esm/providers/hexclave-provider-client.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-provider-client.js +2 -4
- package/dist/esm/providers/hexclave-provider-client.js.map +1 -1
- package/dist/esm/providers/hexclave-provider.d.ts +3 -4
- package/dist/esm/providers/hexclave-provider.d.ts.map +1 -1
- package/dist/esm/providers/hexclave-provider.js +2 -3
- package/dist/esm/providers/hexclave-provider.js.map +1 -1
- package/dist/esm/providers/theme-provider.d.ts +1 -2
- package/dist/esm/providers/theme-provider.d.ts.map +1 -1
- package/dist/esm/providers/theme-provider.js +3 -5
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/providers/translation-provider-client.d.ts +1 -2
- package/dist/esm/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/esm/providers/translation-provider-client.js +1 -3
- package/dist/esm/providers/translation-provider-client.js.map +1 -1
- package/dist/esm/providers/translation-provider.d.ts +2 -3
- package/dist/esm/providers/translation-provider.d.ts.map +1 -1
- package/dist/esm/providers/translation-provider.js +1 -2
- package/dist/esm/providers/translation-provider.js.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.d.ts +1 -1
- package/dist/esm/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.js +1 -2
- package/dist/esm/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.test.js +2 -3
- package/dist/esm/pushed-config-error-overlay/index.test.js.map +1 -1
- package/dist/esm/tanstack-start-server-context.d.ts +1 -3
- package/dist/esm/tanstack-start-server-context.d.ts.map +1 -1
- package/dist/esm/utils/browser-script.d.ts +1 -3
- package/dist/esm/utils/browser-script.d.ts.map +1 -1
- package/dist/esm/utils/browser-script.js +1 -2
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/esm/utils/constants.js +1 -1
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/url.d.ts.map +1 -1
- package/dist/esm/utils/url.js +1 -2
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/forgot-password-B7RLLsC2.d.ts +12 -0
- package/dist/forgot-password-B7RLLsC2.d.ts.map +1 -0
- package/dist/generated/env.js +2 -3
- package/dist/generated/env.js.map +1 -1
- package/dist/generated/global-css.js +2 -3
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.d.ts +2 -6
- package/dist/generated/quetzal-translations.js +2 -4
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/hexclave-provider-BdiqjaCz.d.ts +29 -0
- package/dist/hexclave-provider-BdiqjaCz.d.ts.map +1 -0
- package/dist/hooks-psPwqxZ4.d.ts +43 -0
- package/dist/hooks-psPwqxZ4.d.ts.map +1 -0
- package/dist/in-page-ui/base-styles.d.ts.map +1 -1
- package/dist/in-page-ui/base-styles.js +2 -3
- package/dist/in-page-ui/base-styles.js.map +1 -1
- package/dist/in-page-ui/dom.d.ts.map +1 -1
- package/dist/in-page-ui/dom.js +2 -3
- package/dist/in-page-ui/dom.js.map +1 -1
- package/dist/index-BKZ67WMa.d.ts +1 -0
- package/dist/index-BSr2pd22.d.ts +14 -0
- package/dist/index-BSr2pd22.d.ts.map +1 -0
- package/dist/index-BVVgDSdq.d.ts +1 -0
- package/dist/index-Bo5DpPFH.d.ts +17 -0
- package/dist/index-Bo5DpPFH.d.ts.map +1 -0
- package/dist/index-CBDR4cNg.d.ts +206 -0
- package/dist/index-CBDR4cNg.d.ts.map +1 -0
- package/dist/index-C_kxyHao.d.ts +57 -0
- package/dist/{lib/hexclave-app/connected-accounts/index.d.ts.map → index-C_kxyHao.d.ts.map} +1 -1
- package/dist/index-D7Vdg30O.d.ts +27 -0
- package/dist/index-D7Vdg30O.d.ts.map +1 -0
- package/dist/index-DN04TjLM.d.ts +43 -0
- package/dist/index-DN04TjLM.d.ts.map +1 -0
- package/dist/index-DSzMf-rS.d.ts +43 -0
- package/dist/index-DSzMf-rS.d.ts.map +1 -0
- package/dist/index-DbiyXho6.d.ts +129 -0
- package/dist/index-DbiyXho6.d.ts.map +1 -0
- package/dist/index-Dq4xsW7_.d.ts +106 -0
- package/dist/index-Dq4xsW7_.d.ts.map +1 -0
- package/dist/index-O3hJsHSl.d.ts +11 -0
- package/dist/index-O3hJsHSl.d.ts.map +1 -0
- package/dist/index-TUtJOdMm.d.ts +42 -0
- package/dist/index-TUtJOdMm.d.ts.map +1 -0
- package/dist/index-fOYcs4NH.d.ts +53 -0
- package/dist/{lib/hexclave-app/api-keys/index.d.ts.map → index-fOYcs4NH.d.ts.map} +1 -1
- package/dist/index-hYjsGKNc.d.ts +66 -0
- package/dist/index-hYjsGKNc.d.ts.map +1 -0
- package/dist/index-p0N9MbE5.d.ts +147 -0
- package/dist/index-p0N9MbE5.d.ts.map +1 -0
- package/dist/index.d.ts +33 -41
- package/dist/index.js +193 -193
- package/dist/integrations/convex/component/convex.config.d.ts +1 -1
- package/dist/integrations/convex/component/convex.config.d.ts.map +1 -1
- package/dist/integrations/convex/component/convex.config.js +2 -5
- package/dist/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/integrations/convex.d.ts +2 -13
- package/dist/integrations/convex.js +2 -4
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js +2 -4
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/auth.test.js +1 -3
- package/dist/lib/auth.test.js.map +1 -1
- package/dist/lib/cookie.d.ts +2 -42
- package/dist/lib/cookie.js +7 -25
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hexclave-app/api-keys/index.d.ts +2 -53
- package/dist/lib/hexclave-app/api-keys/index.js +2 -4
- package/dist/lib/hexclave-app/api-keys/index.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +2 -449
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +2 -611
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +7 -8
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/common.d.ts +2 -66
- package/dist/lib/hexclave-app/apps/implementations/common.js +9 -10
- package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -3
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +2 -35
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +2 -274
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +2 -4
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js +2 -3
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js +1 -3
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.d.ts +2 -122
- package/dist/lib/hexclave-app/apps/implementations/session-replay.js +14 -9
- package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js +135 -3
- package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/index.d.ts +1 -3
- package/dist/lib/hexclave-app/apps/index.js +32 -34
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +3 -272
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +2 -237
- package/dist/lib/hexclave-app/apps/interfaces/client-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +2 -174
- package/dist/lib/hexclave-app/apps/interfaces/server-app.js +3 -6
- package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/hexclave-app/common.d.ts +2 -183
- package/dist/lib/hexclave-app/common.js +2 -3
- package/dist/lib/hexclave-app/common.js.map +1 -1
- package/dist/lib/hexclave-app/connected-accounts/index.d.ts +2 -57
- package/dist/lib/hexclave-app/contact-channels/index.d.ts +2 -43
- package/dist/lib/hexclave-app/contact-channels/index.js +2 -3
- package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -1
- package/dist/lib/hexclave-app/customers/index.d.ts +2 -129
- package/dist/lib/hexclave-app/data-vault/index.d.ts +2 -14
- package/dist/lib/hexclave-app/email/index.d.ts +2 -206
- package/dist/lib/hexclave-app/email-templates/index.d.ts +2 -17
- package/dist/lib/hexclave-app/email-templates/index.js +2 -3
- package/dist/lib/hexclave-app/email-templates/index.js.map +1 -1
- package/dist/lib/hexclave-app/index.d.ts +10 -15
- package/dist/lib/hexclave-app/index.js +49 -51
- package/dist/lib/hexclave-app/internal-api-keys/index.d.ts +2 -42
- package/dist/lib/hexclave-app/internal-api-keys/index.js +2 -3
- package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/hexclave-app/notification-categories/index.d.ts +2 -11
- package/dist/lib/hexclave-app/permissions/index.d.ts +2 -43
- package/dist/lib/hexclave-app/permissions/index.js +2 -3
- package/dist/lib/hexclave-app/permissions/index.js.map +1 -1
- package/dist/lib/hexclave-app/plan-usage/index.d.ts +2 -27
- package/dist/lib/hexclave-app/project-configs/index.d.ts +2 -106
- package/dist/lib/hexclave-app/projects/index.d.ts +2 -154
- package/dist/lib/hexclave-app/projects/index.js +6 -3
- package/dist/lib/hexclave-app/projects/index.js.map +1 -1
- package/dist/lib/hexclave-app/session-replays/index.d.ts +2 -66
- package/dist/lib/hexclave-app/teams/index.d.ts +2 -167
- package/dist/lib/hexclave-app/teams/index.js +2 -3
- package/dist/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/lib/hexclave-app/url-targets.d.ts +2 -39
- package/dist/lib/hexclave-app/url-targets.js +3 -5
- package/dist/lib/hexclave-app/url-targets.js.map +1 -1
- package/dist/lib/hexclave-app/url-targets.test.js +1 -3
- package/dist/lib/hexclave-app/url-targets.test.js.map +1 -1
- package/dist/lib/hexclave-app/users/index.d.ts +2 -400
- package/dist/lib/hexclave-app/users/index.js +2 -4
- package/dist/lib/hexclave-app/users/index.js.map +1 -1
- package/dist/lib/hooks.d.ts +2 -45
- package/dist/lib/hooks.js +2 -4
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/translations.d.ts.map +1 -1
- package/dist/lib/translations.js +4 -5
- package/dist/lib/translations.js.map +1 -1
- package/dist/magic-link-callback-DOfNLydt.d.ts +8 -0
- package/dist/magic-link-callback-DOfNLydt.d.ts.map +1 -0
- package/dist/magic-link-sign-in-D5MFDeWQ.d.ts +5 -0
- package/dist/magic-link-sign-in-D5MFDeWQ.d.ts.map +1 -0
- package/dist/message-card-C0AQX5-y.d.ts +18 -0
- package/dist/message-card-C0AQX5-y.d.ts.map +1 -0
- package/dist/mfa-CwYuxAd-.d.ts +9 -0
- package/dist/mfa-CwYuxAd-.d.ts.map +1 -0
- package/dist/oauth-button-PE3z60ay.d.ts +15 -0
- package/dist/oauth-button-PE3z60ay.d.ts.map +1 -0
- package/dist/oauth-button-group-slCOrSxK.d.ts +17 -0
- package/dist/oauth-button-group-slCOrSxK.d.ts.map +1 -0
- package/dist/oauth-callback-tCVTRbF2.d.ts +9 -0
- package/dist/oauth-callback-tCVTRbF2.d.ts.map +1 -0
- package/dist/onboarding-CdpQNCZF.d.ts +7 -0
- package/dist/onboarding-CdpQNCZF.d.ts.map +1 -0
- package/dist/password-reset-CxIuXeIx.d.ts +15 -0
- package/dist/password-reset-CxIuXeIx.d.ts.map +1 -0
- package/dist/providers/hexclave-context.d.ts +1 -1
- package/dist/providers/hexclave-context.d.ts.map +1 -1
- package/dist/providers/hexclave-context.js +5 -8
- package/dist/providers/hexclave-context.js.map +1 -1
- package/dist/providers/hexclave-provider-client.d.ts +2 -3
- package/dist/providers/hexclave-provider-client.d.ts.map +1 -1
- package/dist/providers/hexclave-provider-client.js +4 -6
- package/dist/providers/hexclave-provider-client.js.map +1 -1
- package/dist/providers/hexclave-provider.d.ts +2 -32
- package/dist/providers/hexclave-provider.js +7 -5
- package/dist/providers/hexclave-provider.js.map +1 -1
- package/dist/providers/theme-provider.d.ts +2 -50
- package/dist/providers/theme-provider.js +6 -8
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/providers/translation-provider-client.d.ts +1 -2
- package/dist/providers/translation-provider-client.d.ts.map +1 -1
- package/dist/providers/translation-provider-client.js +5 -8
- package/dist/providers/translation-provider-client.js.map +1 -1
- package/dist/providers/translation-provider.d.ts +2 -16
- package/dist/providers/translation-provider.js +2 -4
- package/dist/providers/translation-provider.js.map +1 -1
- package/dist/pushed-config-error-overlay/index.d.ts +1 -2
- package/dist/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/pushed-config-error-overlay/index.js +2 -4
- package/dist/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/pushed-config-error-overlay/index.test.js +1 -3
- package/dist/pushed-config-error-overlay/index.test.js.map +1 -1
- package/dist/quetzal-translations-XeH3zQ9l.d.ts +6 -0
- package/dist/quetzal-translations-XeH3zQ9l.d.ts.map +1 -0
- package/dist/redirect-page-urls-NUHUchgR.d.ts +35 -0
- package/dist/redirect-page-urls-NUHUchgR.d.ts.map +1 -0
- package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
- package/dist/session-replay-CQ849yH1.d.ts +122 -0
- package/dist/session-replay-CQ849yH1.d.ts.map +1 -0
- package/dist/sign-in-BT45jb_W.d.ts +21 -0
- package/dist/sign-in-BT45jb_W.d.ts.map +1 -0
- package/dist/sign-out-DBnSkfDz.d.ts +8 -0
- package/dist/sign-out-DBnSkfDz.d.ts.map +1 -0
- package/dist/sign-up-BjE_0DB4.d.ts +11 -0
- package/dist/sign-up-BjE_0DB4.d.ts.map +1 -0
- package/dist/{storage-ksajV_p6.d.ts → storage-kputlpQY.d.ts} +1 -1
- package/dist/storage-kputlpQY.d.ts.map +1 -0
- package/dist/tanstack-start-server-context.d.ts +2635 -2
- package/dist/tanstack-start-server-context.d.ts.map +1 -1
- package/dist/team-invitation-B5Ol7vdd.d.ts +11 -0
- package/dist/team-invitation-B5Ol7vdd.d.ts.map +1 -0
- package/dist/theme-provider-D9_ngSbi.d.ts +49 -0
- package/dist/theme-provider-D9_ngSbi.d.ts.map +1 -0
- package/dist/translation-provider-WOaZXqAz.d.ts +15 -0
- package/dist/translation-provider-WOaZXqAz.d.ts.map +1 -0
- package/dist/url-targets-CWO0mjTr.d.ts +39 -0
- package/dist/url-targets-CWO0mjTr.d.ts.map +1 -0
- package/dist/user-avatar-CTyDsibI.d.ts +13 -0
- package/dist/user-avatar-CTyDsibI.d.ts.map +1 -0
- package/dist/user-button-CykqVKoH.d.ts +21 -0
- package/dist/user-button-CykqVKoH.d.ts.map +1 -0
- package/dist/utils/browser-script.d.ts +1 -3
- package/dist/utils/browser-script.d.ts.map +1 -1
- package/dist/utils/browser-script.js +2 -4
- package/dist/utils/browser-script.js.map +1 -1
- package/dist/utils/constants.js +2 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +2 -4
- package/dist/utils/url.js.map +1 -1
- package/package.json +6 -6
- package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +160 -1
- package/src/lib/hexclave-app/apps/implementations/session-replay.ts +38 -12
- package/dist/components/credential-sign-in.d.ts.map +0 -1
- package/dist/components/credential-sign-up.d.ts.map +0 -1
- package/dist/components/elements/user-avatar.d.ts.map +0 -1
- package/dist/components/magic-link-sign-in.d.ts.map +0 -1
- package/dist/components/message-cards/message-card.d.ts.map +0 -1
- package/dist/components/oauth-button-group.d.ts.map +0 -1
- package/dist/components/oauth-button.d.ts.map +0 -1
- package/dist/components/selected-team-switcher.d.ts.map +0 -1
- package/dist/components/team-switcher.d.ts.map +0 -1
- package/dist/components/user-button.d.ts.map +0 -1
- package/dist/components-page/account-settings.d.ts.map +0 -1
- package/dist/components-page/auth-page.d.ts.map +0 -1
- package/dist/components-page/cli-auth-confirm.d.ts.map +0 -1
- package/dist/components-page/email-verification.d.ts.map +0 -1
- package/dist/components-page/error-page.d.ts.map +0 -1
- package/dist/components-page/forgot-password.d.ts.map +0 -1
- package/dist/components-page/hexclave-handler-client.d.ts.map +0 -1
- package/dist/components-page/hexclave-handler.d.ts.map +0 -1
- package/dist/components-page/magic-link-callback.d.ts.map +0 -1
- package/dist/components-page/mfa.d.ts.map +0 -1
- package/dist/components-page/oauth-callback.d.ts.map +0 -1
- package/dist/components-page/onboarding.d.ts.map +0 -1
- package/dist/components-page/password-reset.d.ts.map +0 -1
- package/dist/components-page/sign-in.d.ts.map +0 -1
- package/dist/components-page/sign-out.d.ts.map +0 -1
- package/dist/components-page/sign-up.d.ts.map +0 -1
- package/dist/components-page/team-invitation.d.ts.map +0 -1
- package/dist/generated/quetzal-translations.d.ts.map +0 -1
- package/dist/integrations/convex.d.ts.map +0 -1
- package/dist/lib/cookie.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/common.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +0 -1
- package/dist/lib/hexclave-app/common.d.ts.map +0 -1
- package/dist/lib/hexclave-app/contact-channels/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/customers/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/data-vault/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/email/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/email-templates/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/internal-api-keys/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/notification-categories/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/permissions/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/plan-usage/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/project-configs/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/projects/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/session-replays/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/teams/index.d.ts.map +0 -1
- package/dist/lib/hexclave-app/url-targets.d.ts.map +0 -1
- package/dist/lib/hexclave-app/users/index.d.ts.map +0 -1
- package/dist/lib/hooks.d.ts.map +0 -1
- package/dist/providers/hexclave-provider.d.ts.map +0 -1
- package/dist/providers/theme-provider.d.ts.map +0 -1
- package/dist/providers/translation-provider.d.ts.map +0 -1
- package/dist/storage-ksajV_p6.d.ts.map +0 -1
package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { StackClientApp } from "../interfaces/client-app.js";
|
|
3
|
-
|
|
4
3
|
//#region src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts
|
|
5
4
|
describe("StackClientApp OAuth prefetch", () => {
|
|
6
5
|
it("does not prefetch cross-domain handoff params on construction", () => {
|
|
@@ -26,7 +25,7 @@ describe("StackClientApp OAuth prefetch", () => {
|
|
|
26
25
|
}
|
|
27
26
|
});
|
|
28
27
|
});
|
|
29
|
-
|
|
30
28
|
//#endregion
|
|
31
|
-
export {
|
|
29
|
+
export {};
|
|
30
|
+
|
|
32
31
|
//# sourceMappingURL=client-app-impl.oauth-prefetch.test.js.map
|
package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-app-impl.oauth-prefetch.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it } from \"vitest\";\nimport { StackClientApp } from \"../interfaces/client-app\";\n\ndescribe(\"StackClientApp OAuth prefetch\", () => {\n it(\"does not prefetch cross-domain handoff params on construction\", () => {\n const prefetchMethodName = \"_prefetchCrossDomainHandoffParamsIfNeeded\";\n const originalPrefetch = Reflect.get(StackClientApp.prototype, prefetchMethodName);\n let prefetchCalls = 0;\n Reflect.set(StackClientApp.prototype, prefetchMethodName, () => {\n prefetchCalls += 1;\n });\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n\n expect(prefetchCalls).toBe(0);\n } finally {\n if (originalPrefetch === undefined) {\n Reflect.deleteProperty(StackClientApp.prototype, prefetchMethodName);\n } else {\n Reflect.set(StackClientApp.prototype, prefetchMethodName, originalPrefetch);\n }\n }\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"client-app-impl.oauth-prefetch.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it } from \"vitest\";\nimport { StackClientApp } from \"../interfaces/client-app\";\n\ndescribe(\"StackClientApp OAuth prefetch\", () => {\n it(\"does not prefetch cross-domain handoff params on construction\", () => {\n const prefetchMethodName = \"_prefetchCrossDomainHandoffParamsIfNeeded\";\n const originalPrefetch = Reflect.get(StackClientApp.prototype, prefetchMethodName);\n let prefetchCalls = 0;\n Reflect.set(StackClientApp.prototype, prefetchMethodName, () => {\n prefetchCalls += 1;\n });\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n\n expect(prefetchCalls).toBe(0);\n } finally {\n if (originalPrefetch === undefined) {\n Reflect.deleteProperty(StackClientApp.prototype, prefetchMethodName);\n } else {\n Reflect.set(StackClientApp.prototype, prefetchMethodName, originalPrefetch);\n }\n }\n });\n});\n"],"mappings":";;;AAOA,SAAS,uCAAuC;CAC9C,GAAG,uEAAuE;EACxE,MAAM,qBAAqB;EAC3B,MAAM,mBAAmB,QAAQ,IAAI,eAAe,WAAW,kBAAkB;EACjF,IAAI,gBAAgB;EACpB,QAAQ,IAAI,eAAe,WAAW,0BAA0B;GAC9D,iBAAiB;EACnB,CAAC;EAED,IAAI;GACF,IAAI,eAAe;IACjB,SAAS;IACT,WAAW;IACX,sBAAsB;IACtB,YAAY;IACZ,gBAAgB;IAChB,qBAAqB;GACvB,CAAC;GAED,OAAO,aAAa,CAAC,CAAC,KAAK,CAAC;EAC9B,UAAU;GACR,IAAI,qBAAqB,KAAA,GACvB,QAAQ,eAAe,eAAe,WAAW,kBAAkB;QAEnE,QAAQ,IAAI,eAAe,WAAW,oBAAoB,gBAAgB;EAE9E;CACF,CAAC;AACH,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AsyncCache } from "@hexclave/shared/dist/utils/caches";
|
|
2
2
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
3
|
+
import { HandlerUrlOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol } from "../../common.js";
|
|
3
4
|
import { InternalSession } from "@hexclave/shared/dist/sessions";
|
|
4
5
|
import { Store } from "@hexclave/shared/dist/utils/stores";
|
|
5
|
-
import { HandlerUrlOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol } from "../../common";
|
|
6
6
|
|
|
7
7
|
//#region src/lib/hexclave-app/apps/implementations/common.d.ts
|
|
8
8
|
declare const clientVersion = "STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/common.ts"],"mappings":";;;;;;;cAoBa,aAAA;AAAA,cAgCA,WAAA,uBAAmC,OAAA,GAAU,YAAA,EAAc,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA;AAAA,cAO3E,oBAAA,uBAA4C,OAAA,GAAU,OAAA,EAAS,eAAA,EAAiB,iBAAA,EAAmB,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,EAAA,eAAA,KAAA,CAAA,GAAA,MAAA,CAAA,CAAA;AAAA,KAa3H,OAAA;EAAA,CAAa,
|
|
1
|
+
{"version":3,"file":"common.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/common.ts"],"mappings":";;;;;;;cAoBa,aAAA;AAAA,cAgCA,WAAA,uBAAmC,OAAA,GAAU,YAAA,EAAc,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA;AAAA,cAO3E,oBAAA,uBAA4C,OAAA,GAAU,OAAA,EAAS,eAAA,EAAiB,iBAAA,EAAmB,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,EAAA,eAAA,KAAA,CAAA,GAAA,MAAA,CAAA,CAAA;AAAA,KAa3H,OAAA;EAAA,CAAa,0BAA0B;IAAK,qBAAqB;EAAA;AAAA;AAAA,iBACtD,yBAAA;EAAsC,YAAA,GAAe,OAAA;AAAA,GAAW,OAAA,EAAS,CAAA,GAAI,CAAA;EAAM,YAAA;AAAA;AAAA,iBAOnF,OAAA,CAAQ,OAAA,EAAS,iBAAA,EAAmB,OAAA;EAAW,SAAA;AAAA,IAAsB,mBAAmB;AAAA,iBAOxF,mBAAA;AAAA,iBAIA,8BAAA;AAAA,iBAIA,yBAAA;AAAA,iBAIA,6BAAA;AAAA,iBAIA,6BAAA;;;;;;;;;;;AAnDwE;AAOxF;;;;;;;iBAkEgB,UAAA,CAAW,oBAAA;EAAiC,OAAA;EAAiB,MAAA;AAAA;AAAA,cAwBhE,cAAA;AAAA,cACA,uBAAA;AAAA,iBAOG,mBAAA,CAAoB,cAAsB;AAAA,iBA0B1C,cAAA,CAAe,mBAAA;EAAgC,OAAA;EAAiB,MAAA;AAAA;AAAA,KAcpE,WAAA;EACV,WAAA;EACA,YAAY;AAAA;AAAA,iBAGE,qBAAA,IAAqB,KAAA,CAAA,WAAA;AAAA,iBASrB,aAAA,qBAAkC,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,MAAA,CAAO,CAAA,IAAK,YAAA,EAAc,CAAA,EAAG,MAAA,WAAiB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { captureError, concatStacktraces, throwErr } from "@hexclave/shared/dist/utils/errors";
|
|
3
3
|
import React, { useCallback } from "react";
|
|
4
4
|
import { suspendIfSsr, use } from "@hexclave/shared/dist/utils/react";
|
|
5
5
|
import { filterUndefined, omit } from "@hexclave/shared/dist/utils/objects";
|
|
@@ -12,10 +12,9 @@ import { hexclaveAppInternalsSymbol } from "../../common.js";
|
|
|
12
12
|
import { Store } from "@hexclave/shared/dist/utils/stores";
|
|
13
13
|
import { envVars } from "../../../../generated/env.js";
|
|
14
14
|
import { resolveHandlerUrls } from "../../url-targets.js";
|
|
15
|
-
|
|
16
15
|
//#region src/lib/hexclave-app/apps/implementations/common.ts
|
|
17
|
-
const clientVersion = "js @hexclave/next@1.0.
|
|
18
|
-
if (
|
|
16
|
+
const clientVersion = "js @hexclave/next@1.0.42";
|
|
17
|
+
if ("js @hexclave/next@1.0.42".startsWith("STACK_COMPILE_TIME"));
|
|
19
18
|
const replaceHexclavePortPrefix = (input) => {
|
|
20
19
|
if (!input) return input;
|
|
21
20
|
const prefix = envVars.HEXCLAVE_PORT_PREFIX;
|
|
@@ -33,7 +32,7 @@ const showMissingConfigAlertInBrowser = (message) => {
|
|
|
33
32
|
const throwMissingProjectIdError = () => {
|
|
34
33
|
const message = "Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the HEXCLAVE_PROJECT_ID environment variable.";
|
|
35
34
|
showMissingConfigAlertInBrowser(message);
|
|
36
|
-
return throwErr(new Error(message));
|
|
35
|
+
return throwErr(/* @__PURE__ */ new Error(message));
|
|
37
36
|
};
|
|
38
37
|
const createCache = (fetcher) => {
|
|
39
38
|
return new AsyncCache(async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)), {});
|
|
@@ -97,13 +96,13 @@ function getBaseUrl(userSpecifiedBaseUrl) {
|
|
|
97
96
|
else {
|
|
98
97
|
if (isBrowserLike()) url = envVars.HEXCLAVE_API_URL_BROWSER;
|
|
99
98
|
else url = envVars.HEXCLAVE_API_URL_SERVER;
|
|
100
|
-
url = url || envVars.HEXCLAVE_API_URL ||
|
|
99
|
+
url = url || envVars.HEXCLAVE_API_URL || "https://api.hexclave.com";
|
|
101
100
|
}
|
|
102
101
|
return replaceHexclavePortPrefix(url.endsWith("/") ? url.slice(0, -1) : url);
|
|
103
102
|
}
|
|
104
103
|
const defaultBaseUrl = "https://api.hexclave.com";
|
|
105
104
|
const defaultAnalyticsBaseUrl = "https://r.hexclave.com";
|
|
106
|
-
const analyticsBaseUrlsByApiBaseUrl = new Map([[defaultBaseUrl, defaultAnalyticsBaseUrl], ["https://api.stack-auth.com", "https://r.stack-auth.com"]]);
|
|
105
|
+
const analyticsBaseUrlsByApiBaseUrl = /* @__PURE__ */ new Map([[defaultBaseUrl, defaultAnalyticsBaseUrl], ["https://api.stack-auth.com", "https://r.stack-auth.com"]]);
|
|
107
106
|
function getAnalyticsBaseUrl(regularBaseUrl) {
|
|
108
107
|
return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;
|
|
109
108
|
}
|
|
@@ -172,7 +171,7 @@ function useAsyncCache(cache, dependencies, caller) {
|
|
|
172
171
|
}
|
|
173
172
|
return result.data;
|
|
174
173
|
}
|
|
175
|
-
|
|
176
174
|
//#endregion
|
|
177
175
|
export { clientVersion, createCache, createCacheBySession, createEmptyTokenStore, defaultAnalyticsBaseUrl, defaultBaseUrl, getAnalyticsBaseUrl, getBaseUrl, getDefaultExtraRequestHeaders, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey, getDefaultSuperSecretAdminKey, getUrls, resolveApiUrls, resolveConstructorOptions, useAsyncCache };
|
|
176
|
+
|
|
178
177
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { InternalSession } from \"@hexclave/shared/dist/sessions\";\nimport { AsyncCache } from \"@hexclave/shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { HexclaveAssertionError, captureError, concatStacktraces, throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { createGlobal, getGlobal } from \"@hexclave/shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@hexclave/shared/dist/utils/objects\";\nimport { ReactPromise, runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { suspendIfSsr, use } from \"@hexclave/shared/dist/utils/react\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { Store } from \"@hexclave/shared/dist/utils/stores\";\nimport { getDefaultApiUrls } from \"@hexclave/shared/dist/utils/urls\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { envVars } from \"../../../../generated/env\";\nimport { HandlerUrlOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol } from \"../../common\";\nimport { resolveHandlerUrls } from \"../../url-targets\";\n\nexport const clientVersion = \"STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new HexclaveAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\nconst replaceHexclavePortPrefix = <T extends string | undefined>(input: T): T => {\n if (!input) return input;\n const prefix = envVars.HEXCLAVE_PORT_PREFIX;\n return prefix ? input.replace(/\\$\\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\\}/g, prefix) as T : input;\n};\n\nconst showMissingConfigAlertInBrowser = (message: string) => {\n if (!isBrowserLike()) return;\n\n const global = globalThis as any;\n const alertAlreadyShownKey = \"__hexclave_missing_config_alert_already_shown\";\n if (global[alertAlreadyShownKey]) return;\n global[alertAlreadyShownKey] = true;\n\n const alertFn = global.alert;\n if (typeof alertFn === \"function\") {\n alertFn(message);\n }\n};\n\nconst throwMissingProjectIdError = (): never => {\n const message = \"Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the HEXCLAVE_PROJECT_ID environment variable.\";\n showMissingConfigAlertInBrowser(message);\n return throwErr(new Error(message));\n};\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\n\ntype AppLike = { [hexclaveAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[hexclaveAppInternalsSymbol].getConstructorOptions() ?? {},\n ...filterUndefined(omit(options, [\"inheritsFrom\"])),\n };\n}\n\nexport function getUrls(partial: HandlerUrlOptions, options: { projectId: string }): ResolvedHandlerUrls {\n return resolveHandlerUrls({\n urls: partial,\n projectId: options.projectId,\n });\n}\n\nexport function getDefaultProjectId() {\n return envVars.HEXCLAVE_PROJECT_ID || throwMissingProjectIdError();\n}\n\nexport function getDefaultPublishableClientKey() {\n return envVars.HEXCLAVE_PUBLISHABLE_CLIENT_KEY;\n}\n\nexport function getDefaultSecretServerKey() {\n return envVars.HEXCLAVE_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the HEXCLAVE_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return envVars.HEXCLAVE_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the HEXCLAVE_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(envVars.HEXCLAVE_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_HEXCLAVE_API_URL_BROWSER/VITE_HEXCLAVE_API_URL_BROWSER\n * - Server: HEXCLAVE_API_URL_SERVER\n * - Default: HEXCLAVE_API_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n if (isBrowserLike()) {\n url = envVars.HEXCLAVE_API_URL_BROWSER;\n } else {\n url = envVars.HEXCLAVE_API_URL_SERVER;\n }\n url = url || envVars.HEXCLAVE_API_URL || defaultBaseUrl;\n }\n\n return replaceHexclavePortPrefix(url.endsWith('/') ? url.slice(0, -1) : url);\n}\n\nexport const defaultBaseUrl = \"https://api.hexclave.com\";\nexport const defaultAnalyticsBaseUrl = \"https://r.hexclave.com\";\n\nconst analyticsBaseUrlsByApiBaseUrl = new Map<string, string>([\n [defaultBaseUrl, defaultAnalyticsBaseUrl],\n [\"https://api.stack-auth.com\", \"https://r.stack-auth.com\"],\n]);\n\nexport function getAnalyticsBaseUrl(regularBaseUrl: string): string {\n return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;\n}\n\n\nfunction fetchBackendUrlsInBackground(primaryBaseUrl: string): void {\n createGlobal('__stack-fetch-backend-urls-started', () => {\n runAsynchronously(async () => {\n try {\n const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);\n if (!res.ok) {\n return;\n }\n const data = await res.json();\n if (!Array.isArray(data.urls) || !data.urls.every((u: unknown) => typeof u === 'string')) {\n return;\n }\n createGlobal('__stack-fetched-backend-urls', () => data.urls as string[]);\n } catch (e) {\n captureError('fetch-backend-urls-in-background', e);\n }\n });\n return true;\n });\n}\n\nexport function resolveApiUrls(userExplicitBaseUrl: string | { browser: string, server: string } | undefined): () => string[] {\n return () => {\n if (userExplicitBaseUrl != null) {\n return [getBaseUrl(userExplicitBaseUrl)];\n }\n const primary = getBaseUrl(undefined);\n // Always try to fetch server-configured URLs (supports custom domains via\n // STACK_BACKEND_URLS_CONFIG). Hardcoded fallbacks are used as a default\n // until the background fetch completes.\n fetchBackendUrlsInBackground(primary);\n return getGlobal('__stack-fetched-backend-urls') ?? getDefaultApiUrls(primary);\n };\n}\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByHookId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n // on the dashboard, we do some perf monitoring for pre-fetching which should hook right in here\n const asyncCacheHooks: any[] = getGlobal(\"use-async-cache-execution-hooks\") ?? [];\n for (const hook of asyncCacheHooks) {\n hook({ cache, caller, dependencies });\n }\n\n const id = React.useId();\n\n // whenever the dependencies change, we need to refresh the promise cache\n React.useEffect(() => {\n cachePromiseByHookId.delete(id);\n }, [...dependencies, id]);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByHookId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByHookId.has(id)) {\n cachePromiseByHookId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByHookId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error on Next.js (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n const result = use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"common.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { InternalSession } from \"@hexclave/shared/dist/sessions\";\nimport { AsyncCache } from \"@hexclave/shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { HexclaveAssertionError, captureError, concatStacktraces, throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { createGlobal, getGlobal } from \"@hexclave/shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@hexclave/shared/dist/utils/objects\";\nimport { ReactPromise, runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { suspendIfSsr, use } from \"@hexclave/shared/dist/utils/react\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { Store } from \"@hexclave/shared/dist/utils/stores\";\nimport { getDefaultApiUrls } from \"@hexclave/shared/dist/utils/urls\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { envVars } from \"../../../../generated/env\";\nimport { HandlerUrlOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol } from \"../../common\";\nimport { resolveHandlerUrls } from \"../../url-targets\";\n\nexport const clientVersion = \"STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new HexclaveAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\nconst replaceHexclavePortPrefix = <T extends string | undefined>(input: T): T => {\n if (!input) return input;\n const prefix = envVars.HEXCLAVE_PORT_PREFIX;\n return prefix ? input.replace(/\\$\\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\\}/g, prefix) as T : input;\n};\n\nconst showMissingConfigAlertInBrowser = (message: string) => {\n if (!isBrowserLike()) return;\n\n const global = globalThis as any;\n const alertAlreadyShownKey = \"__hexclave_missing_config_alert_already_shown\";\n if (global[alertAlreadyShownKey]) return;\n global[alertAlreadyShownKey] = true;\n\n const alertFn = global.alert;\n if (typeof alertFn === \"function\") {\n alertFn(message);\n }\n};\n\nconst throwMissingProjectIdError = (): never => {\n const message = \"Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the HEXCLAVE_PROJECT_ID environment variable.\";\n showMissingConfigAlertInBrowser(message);\n return throwErr(new Error(message));\n};\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\n\ntype AppLike = { [hexclaveAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[hexclaveAppInternalsSymbol].getConstructorOptions() ?? {},\n ...filterUndefined(omit(options, [\"inheritsFrom\"])),\n };\n}\n\nexport function getUrls(partial: HandlerUrlOptions, options: { projectId: string }): ResolvedHandlerUrls {\n return resolveHandlerUrls({\n urls: partial,\n projectId: options.projectId,\n });\n}\n\nexport function getDefaultProjectId() {\n return envVars.HEXCLAVE_PROJECT_ID || throwMissingProjectIdError();\n}\n\nexport function getDefaultPublishableClientKey() {\n return envVars.HEXCLAVE_PUBLISHABLE_CLIENT_KEY;\n}\n\nexport function getDefaultSecretServerKey() {\n return envVars.HEXCLAVE_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the HEXCLAVE_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return envVars.HEXCLAVE_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the HEXCLAVE_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(envVars.HEXCLAVE_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_HEXCLAVE_API_URL_BROWSER/VITE_HEXCLAVE_API_URL_BROWSER\n * - Server: HEXCLAVE_API_URL_SERVER\n * - Default: HEXCLAVE_API_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n if (isBrowserLike()) {\n url = envVars.HEXCLAVE_API_URL_BROWSER;\n } else {\n url = envVars.HEXCLAVE_API_URL_SERVER;\n }\n url = url || envVars.HEXCLAVE_API_URL || defaultBaseUrl;\n }\n\n return replaceHexclavePortPrefix(url.endsWith('/') ? url.slice(0, -1) : url);\n}\n\nexport const defaultBaseUrl = \"https://api.hexclave.com\";\nexport const defaultAnalyticsBaseUrl = \"https://r.hexclave.com\";\n\nconst analyticsBaseUrlsByApiBaseUrl = new Map<string, string>([\n [defaultBaseUrl, defaultAnalyticsBaseUrl],\n [\"https://api.stack-auth.com\", \"https://r.stack-auth.com\"],\n]);\n\nexport function getAnalyticsBaseUrl(regularBaseUrl: string): string {\n return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;\n}\n\n\nfunction fetchBackendUrlsInBackground(primaryBaseUrl: string): void {\n createGlobal('__stack-fetch-backend-urls-started', () => {\n runAsynchronously(async () => {\n try {\n const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);\n if (!res.ok) {\n return;\n }\n const data = await res.json();\n if (!Array.isArray(data.urls) || !data.urls.every((u: unknown) => typeof u === 'string')) {\n return;\n }\n createGlobal('__stack-fetched-backend-urls', () => data.urls as string[]);\n } catch (e) {\n captureError('fetch-backend-urls-in-background', e);\n }\n });\n return true;\n });\n}\n\nexport function resolveApiUrls(userExplicitBaseUrl: string | { browser: string, server: string } | undefined): () => string[] {\n return () => {\n if (userExplicitBaseUrl != null) {\n return [getBaseUrl(userExplicitBaseUrl)];\n }\n const primary = getBaseUrl(undefined);\n // Always try to fetch server-configured URLs (supports custom domains via\n // STACK_BACKEND_URLS_CONFIG). Hardcoded fallbacks are used as a default\n // until the background fetch completes.\n fetchBackendUrlsInBackground(primary);\n return getGlobal('__stack-fetched-backend-urls') ?? getDefaultApiUrls(primary);\n };\n}\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByHookId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n // on the dashboard, we do some perf monitoring for pre-fetching which should hook right in here\n const asyncCacheHooks: any[] = getGlobal(\"use-async-cache-execution-hooks\") ?? [];\n for (const hook of asyncCacheHooks) {\n hook({ cache, caller, dependencies });\n }\n\n const id = React.useId();\n\n // whenever the dependencies change, we need to refresh the promise cache\n React.useEffect(() => {\n cachePromiseByHookId.delete(id);\n }, [...dependencies, id]);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByHookId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByHookId.has(id)) {\n cachePromiseByHookId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByHookId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error on Next.js (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n const result = use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-tracker.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.ts"],"mappings":";;;KAwGY,gBAAA;EACV,SAAA;EACA,SAAA,GAAY,IAAA,UAAc,OAAA;IAAW,SAAA;EAAA,MAAyB,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAU,KAAA;AAAA;AAAA,cAS5E,YAAA;EAAA,QACH,QAAA;EAAA,QACA,UAAA;EAAA,QACA,SAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;EAAA,QACA,QAAA;EAAA,iBACS,uBAAA;EAAA,iBACA,KAAA;EAAA,QAET,kBAAA;EAAA,QACA,qBAAA;EAAA,QAEA,eAAA;EAAA,QACA,0BAAA;EAAA,QAGA,mBAAA;EAAA,QACA,iBAAA;EAAA,QACA,eAAA;EAAA,QACA,yBAAA;EAAA,QACA,yBAAA;cAEI,IAAA,EAAM,
|
|
1
|
+
{"version":3,"file":"event-tracker.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.ts"],"mappings":";;;KAwGY,gBAAA;EACV,SAAA;EACA,SAAA,GAAY,IAAA,UAAc,OAAA;IAAW,SAAA;EAAA,MAAyB,OAAA,CAAQ,MAAA,CAAO,QAAA,EAAU,KAAA;AAAA;AAAA,cAS5E,YAAA;EAAA,QACH,QAAA;EAAA,QACA,UAAA;EAAA,QACA,SAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;EAAA,QACA,QAAA;EAAA,iBACS,uBAAA;EAAA,iBACA,KAAA;EAAA,QAET,kBAAA;EAAA,QACA,qBAAA;EAAA,QAEA,eAAA;EAAA,QACA,0BAAA;EAAA,QAGA,mBAAA;EAAA,QACA,iBAAA;EAAA,QACA,eAAA;EAAA,QACA,yBAAA;EAAA,QACA,yBAAA;cAEI,IAAA,EAAM,gBAAgB;EAKlC,KAAA;EAsBA,IAAA;EAUA,WAAA;EAAA,QAMQ,UAAA;EAAA,QASA,gBAAA;EAAA,QA4BA,qBAAA;EAAA,iBA4BS,WAAA;EAAA,QAIT,cAAA;EAAA,QA6CA,sBAAA;EAAA,iBAWS,eAAA;EAAA,QAiDT,kBAAA;EAAA,iBAIS,kBAAA;EAAA,iBAIA,2BAAA;EAAA,iBAIA,4BAAA;EAAA,QAIT,wBAAA;EAAA,QA2BA,gBAAA;EAAA,QAoBA,2BAAA;EAAA,iBAeS,WAAA;EAAA,QAIT,uBAAA;EAAA,QASA,SAAA;EAAA,QA2BM,MAAA;EAAA,QAoDN,QAAA;EAAA,QASA,KAAA;AAAA"}
|
|
@@ -4,7 +4,6 @@ import { ELEMENTS_CHAIN_MAX_DEPTH, buildElementsChain } from "@hexclave/shared/d
|
|
|
4
4
|
import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
|
|
5
5
|
import { isBrowserLike } from "@hexclave/shared/dist/utils/env";
|
|
6
6
|
import { generateUuid, isAdBlockerNetworkError, isAnalyticsNotEnabledError } from "./session-replay.js";
|
|
7
|
-
|
|
8
7
|
//#region src/lib/hexclave-app/apps/implementations/event-tracker.ts
|
|
9
8
|
const FLUSH_INTERVAL_MS = 1e4;
|
|
10
9
|
const MAX_EVENTS_PER_BATCH = 50;
|
|
@@ -357,7 +356,7 @@ var EventTracker = class {
|
|
|
357
356
|
if (this._events.length > 0) runAsynchronously(() => this._flush({ keepalive: false }));
|
|
358
357
|
}
|
|
359
358
|
};
|
|
360
|
-
|
|
361
359
|
//#endregion
|
|
362
360
|
export { EventTracker };
|
|
361
|
+
|
|
363
362
|
//# sourceMappingURL=event-tracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-tracker.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { CLICKMAP_ROOT_ID, DEV_TOOL_ROOT_ID } from \"@hexclave/shared/dist/utils/dev-tool\";\nimport { cssEscapeIdent } from \"@hexclave/shared/dist/utils/dom\";\nimport { buildElementsChain, ELEMENTS_CHAIN_MAX_DEPTH } from \"@hexclave/shared/dist/utils/elements-chain\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { generateUuid, isAdBlockerNetworkError, isAnalyticsNotEnabledError } from \"./session-replay\";\n\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_EVENTS_PER_BATCH = 50;\nconst MAX_APPROX_BYTES_PER_BATCH = 64_000;\n\nfunction hasScreenDimensions(value: unknown): value is { width: number, height: number } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"width\" in value) || !(\"height\" in value)) {\n return false;\n }\n return typeof value.width === \"number\" && typeof value.height === \"number\";\n}\n\nfunction hasHistoryMethods(value: unknown): value is { pushState: History[\"pushState\"], replaceState: History[\"replaceState\"] } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"pushState\" in value) || !(\"replaceState\" in value)) {\n return false;\n }\n return typeof value.pushState === \"function\" && typeof value.replaceState === \"function\";\n}\n\nfunction getTextSnippet(textContent: string | null): string {\n return textContent == null ? \"\" : textContent.trim().substring(0, 200);\n}\n\n// Pixel quantization factor for x/y/viewport in stored click events. Matches the\n// SCALE_FACTOR used by the ClickHouse clickmap_events MV — keep them in sync.\nconst CLICKMAP_SCALE_FACTOR = 16;\n\n// Dead-click detection (PostHog-style). Whether an element has a click handler\n// is unknowable from page script, so a click is classified by its observable\n// consequences instead: it is \"alive\" if the page scrolled, the text selection\n// changed, or the tab visibility changed (a new tab opened) almost\n// immediately, or if the DOM mutated within a couple of seconds — and \"dead\"\n// if none of that happened by the absolute timeout.\n//\n// The $click event is buffered immediately like any other event (so\n// event_at_ms, ordering, and every query are untouched) and the sweep sets\n// data.dead=1 on it in place if nothing observable happened. _flush holds\n// back clicks that are still unclassified — classification always finishes\n// well within one FLUSH_INTERVAL_MS, so a held click rides the next flush at\n// the latest. A keepalive flush (pagehide/stop) sends them unmarked: a click\n// still pending when the page unloads led to that navigation, alive by\n// definition.\n//\n// NOTE — blocker for any future real-time / \"live clicks\" view: a click that\n// is still unclassified when its natural flush fires arrives up to one extra\n// FLUSH_INTERVAL_MS late. A surface showing clicks as they happen must either\n// accept that lag or emit a provisional $click plus a later dead-click\n// reconciliation event.\nconst DEAD_CLICK_SCROLL_THRESHOLD_MS = 100;\nconst DEAD_CLICK_SELECTION_CHANGED_THRESHOLD_MS = 100;\nconst DEAD_CLICK_VISIBILITY_CHANGE_THRESHOLD_MS = 100;\nconst DEAD_CLICK_MUTATION_THRESHOLD_MS = 2_500;\n// 1.1x the mutation threshold, mirroring posthog-js: every signal window has\n// closed before a click is declared dead.\nconst DEAD_CLICK_ABSOLUTE_TIMEOUT_MS = 2_750;\nconst DEAD_CLICK_CHECK_INTERVAL_MS = 1_000;\n// Backstop against click storms (e.g. rage clicks on a dead element): past the\n// cap, clicks are simply not classified rather than not recorded.\nconst DEAD_CLICK_MAX_PENDING = 50;\n\nfunction isPointerTargetFixed(element: Element): boolean {\n let current: Element | null = element;\n let depth = 0;\n while (current != null && depth < ELEMENTS_CHAIN_MAX_DEPTH * 2) {\n const style = window.getComputedStyle(current);\n if (style.position === \"fixed\" || style.position === \"sticky\") {\n return true;\n }\n current = current.parentElement;\n depth += 1;\n }\n return false;\n}\n\n// Clicks on Hexclave's own in-page UI (the dev tool and the standalone\n// clickmap overlay) must never be ingested as analytics events.\nfunction isInsideHexclaveUi(element: Element): boolean {\n return element.closest(`#${cssEscapeIdent(DEV_TOOL_ROOT_ID)}, #${cssEscapeIdent(CLICKMAP_ROOT_ID)}`) != null;\n}\n\n// Mutation-record targets can be text/comment nodes; resolve to the nearest\n// element before asking whether the mutation came from Hexclave's own UI.\nfunction isInsideHexclaveUiNode(node: Node | null): boolean {\n const element = node instanceof Element ? node : node?.parentElement ?? null;\n return element != null && isInsideHexclaveUi(element);\n}\n\nexport type EventTrackerDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\ntype TrackedEvent = {\n event_type: \"$page-view\" | \"$click\",\n event_at_ms: number,\n data: Record<string, unknown>,\n};\n\nexport class EventTracker {\n private _started = false;\n private _cancelled = false;\n private _disabled = false;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: TrackedEvent[] = [];\n private _approxBytes = 0;\n private _lastUrl: string | null = null;\n private readonly _sessionReplaySegmentId: string;\n private readonly _deps: EventTrackerDeps;\n\n private _originalPushState: History[\"pushState\"] | null = null;\n private _originalReplaceState: History[\"replaceState\"] | null = null;\n\n private _deadClickTimer: ReturnType<typeof setInterval> | null = null;\n private _deadClickMutationObserver: MutationObserver | null = null;\n // Buffered $click events still awaiting dead-click classification. Always a\n // subset of _events — _flush holds these back until the sweep resolves them.\n private _unclassifiedClicks = new Set<TrackedEvent>();\n private _lastMutationAtMs: number | null = null;\n private _lastScrollAtMs: number | null = null;\n private _lastSelectionChangedAtMs: number | null = null;\n private _lastVisibilityChangeAtMs: number | null = null;\n\n constructor(deps: EventTrackerDeps) {\n this._deps = deps;\n this._sessionReplaySegmentId = generateUuid();\n }\n\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n if (\n typeof window.addEventListener !== \"function\"\n || typeof window.removeEventListener !== \"function\"\n || typeof document.addEventListener !== \"function\"\n || typeof document.removeEventListener !== \"function\"\n || !hasScreenDimensions(window.screen)\n ) {\n return;\n }\n this._started = true;\n\n this._setupPageViewCapture();\n this._setupClickCapture();\n this._setupDeadClickDetection();\n this._setupPageHideListeners();\n\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._teardown();\n }\n\n clearBuffer() {\n this._events = [];\n this._approxBytes = 0;\n this._unclassifiedClicks.clear();\n }\n\n private _pushEvent(event: TrackedEvent) {\n if (this._disabled) return;\n this._events.push(event);\n this._approxBytes += JSON.stringify(event).length;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n\n private _capturePageView(entryType: \"initial\" | \"push\" | \"replace\" | \"pop\") {\n const screenObject = window.screen;\n if (!hasScreenDimensions(screenObject)) {\n return;\n }\n\n const url = window.location.href;\n if (url === this._lastUrl && entryType !== \"initial\") return;\n this._lastUrl = url;\n\n this._pushEvent({\n event_type: \"$page-view\",\n event_at_ms: Date.now(),\n data: {\n url,\n path: window.location.pathname,\n referrer: document.referrer,\n title: document.title,\n entry_type: entryType,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n screen_width: screenObject.width,\n screen_height: screenObject.height,\n user_agent: typeof navigator !== \"undefined\" ? navigator.userAgent : null,\n },\n });\n }\n\n private _setupPageViewCapture() {\n // Fire initial page-view\n this._capturePageView(\"initial\");\n const historyObject = window.history;\n if (!hasHistoryMethods(historyObject)) {\n return;\n }\n const originalPushState = historyObject.pushState;\n const originalReplaceState = historyObject.replaceState;\n\n // Monkey-patch history.pushState\n this._originalPushState = (...args: Parameters<History[\"pushState\"]>) => originalPushState.apply(historyObject, args);\n historyObject.pushState = (...args: Parameters<History[\"pushState\"]>) => {\n this._originalPushState!(...args);\n this._capturePageView(\"push\");\n };\n\n // Monkey-patch history.replaceState\n this._originalReplaceState = (...args: Parameters<History[\"replaceState\"]>) => originalReplaceState.apply(historyObject, args);\n historyObject.replaceState = (...args: Parameters<History[\"replaceState\"]>) => {\n this._originalReplaceState!(...args);\n this._capturePageView(\"replace\");\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this._onPopState);\n }\n\n private readonly _onPopState = () => {\n this._capturePageView(\"pop\");\n };\n\n private _buildSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && depth < 8 && current !== document.documentElement) {\n let part = current.tagName.toLowerCase();\n let testIdAttr = \"data-testid\";\n let testId = current.getAttribute(\"data-testid\");\n if (testId == null) {\n testIdAttr = \"data-test-id\";\n testId = current.getAttribute(\"data-test-id\");\n }\n if (testId != null && testId.trim() !== \"\") {\n part += `[${testIdAttr}=\"${testId.replace(/\"/g, '\\\\\"')}\"]`;\n parts.unshift(part);\n break;\n }\n if (current.id !== \"\") {\n part += `#${cssEscapeIdent(current.id)}`;\n parts.unshift(part);\n break;\n }\n if (current.className && typeof current.className === \"string\") {\n const classes = current.className.trim().split(/\\s+/).filter(Boolean).slice(0, 4);\n if (classes.length > 0) {\n part += `.${classes.map(cssEscapeIdent).join(\".\")}`;\n }\n }\n const parent: Element | null = current.parentElement;\n if (parent != null) {\n const tagName = current.tagName;\n const siblings = Array.from(parent.children).filter((child) => child.tagName === tagName);\n if (siblings.length > 1) {\n part += `:nth-of-type(${siblings.indexOf(current) + 1})`;\n }\n }\n parts.unshift(part);\n current = parent;\n depth++;\n }\n\n return parts.join(\" > \");\n }\n\n private _findNearestAnchorHref(element: Element): string | null {\n let current: Element | null = element;\n while (current) {\n if (current.tagName === \"A\" && current.hasAttribute(\"href\")) {\n return current.getAttribute(\"href\");\n }\n current = current.parentElement;\n }\n return null;\n }\n\n private readonly _onClickCapture = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (isInsideHexclaveUi(target)) return;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const pointerTargetFixed = isPointerTargetFixed(target);\n // Pre-scale at ingest so old + new rows land in identical buckets in CH.\n const xScaled = Math.round(event.pageX / CLICKMAP_SCALE_FACTOR);\n const yScaled = Math.round(event.pageY / CLICKMAP_SCALE_FACTOR);\n const clientYScaled = Math.round(event.clientY / CLICKMAP_SCALE_FACTOR);\n const relativeX = viewportWidth > 0 ? event.clientX / viewportWidth : 0;\n\n const clickEvent: TrackedEvent = {\n event_type: \"$click\",\n event_at_ms: Date.now(),\n data: {\n tag_name: target.tagName.toLowerCase(),\n text: getTextSnippet(target.textContent),\n href: this._findNearestAnchorHref(target),\n selector: this._buildSelector(target),\n elements_chain: buildElementsChain(target),\n pointer_target_fixed: pointerTargetFixed ? 1 : 0,\n url: window.location.href,\n path: window.location.pathname,\n title: document.title,\n x: event.clientX,\n y: event.clientY,\n page_x: event.pageX,\n page_y: event.pageY,\n x_scaled: xScaled,\n y_scaled: yScaled,\n client_y_scaled: clientYScaled,\n pointer_relative_x: relativeX,\n viewport_width: viewportWidth,\n viewport_height: viewportHeight,\n scale_factor: CLICKMAP_SCALE_FACTOR,\n },\n };\n\n // Register for dead-click classification before buffering, so a\n // size-triggered flush from this very push already holds the click back.\n if (this._deadClickTimer !== null && this._unclassifiedClicks.size < DEAD_CLICK_MAX_PENDING) {\n this._unclassifiedClicks.add(clickEvent);\n }\n this._pushEvent(clickEvent);\n };\n\n private _setupClickCapture() {\n document.addEventListener(\"click\", this._onClickCapture, { capture: true });\n }\n\n private readonly _onDeadClickScroll = () => {\n this._lastScrollAtMs = Date.now();\n };\n\n private readonly _onDeadClickSelectionChange = () => {\n this._lastSelectionChangedAtMs = Date.now();\n };\n\n private readonly _onDeadClickVisibilityChange = () => {\n this._lastVisibilityChangeAtMs = Date.now();\n };\n\n private _setupDeadClickDetection() {\n if (typeof MutationObserver !== \"function\") return;\n\n this._deadClickMutationObserver = new MutationObserver((mutations) => {\n // The dev tool and the clickmap overlay rewrite their own DOM constantly\n // while open; their mutations must not mark host-page clicks as alive.\n if (mutations.every((mutation) => isInsideHexclaveUiNode(mutation.target))) {\n return;\n }\n this._lastMutationAtMs = Date.now();\n });\n this._deadClickMutationObserver.observe(document.documentElement, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n\n // Capture phase so scrolls inside nested scroll containers count, not just\n // the document itself (scroll events don't bubble).\n document.addEventListener(\"scroll\", this._onDeadClickScroll, { capture: true, passive: true });\n document.addEventListener(\"selectionchange\", this._onDeadClickSelectionChange);\n document.addEventListener(\"visibilitychange\", this._onDeadClickVisibilityChange);\n\n this._deadClickTimer = setInterval(() => this._checkDeadClicks(), DEAD_CLICK_CHECK_INTERVAL_MS);\n }\n\n private _checkDeadClicks() {\n const nowMs = Date.now();\n for (const click of this._unclassifiedClicks) {\n const signalWithin = (signalAtMs: number | null, thresholdMs: number) =>\n signalAtMs != null && signalAtMs >= click.event_at_ms && signalAtMs - click.event_at_ms < thresholdMs;\n\n const isAlive = signalWithin(this._lastScrollAtMs, DEAD_CLICK_SCROLL_THRESHOLD_MS)\n || signalWithin(this._lastSelectionChangedAtMs, DEAD_CLICK_SELECTION_CHANGED_THRESHOLD_MS)\n || signalWithin(this._lastVisibilityChangeAtMs, DEAD_CLICK_VISIBILITY_CHANGE_THRESHOLD_MS)\n || signalWithin(this._lastMutationAtMs, DEAD_CLICK_MUTATION_THRESHOLD_MS);\n if (isAlive) {\n this._unclassifiedClicks.delete(click);\n } else if (nowMs - click.event_at_ms >= DEAD_CLICK_ABSOLUTE_TIMEOUT_MS) {\n // The already-buffered event is marked in place — no second event.\n click.data.dead = 1;\n this._unclassifiedClicks.delete(click);\n }\n }\n }\n\n private _teardownDeadClickDetection() {\n if (this._deadClickTimer !== null) {\n clearInterval(this._deadClickTimer);\n this._deadClickTimer = null;\n }\n if (this._deadClickMutationObserver !== null) {\n this._deadClickMutationObserver.disconnect();\n this._deadClickMutationObserver = null;\n }\n document.removeEventListener(\"scroll\", this._onDeadClickScroll, { capture: true });\n document.removeEventListener(\"selectionchange\", this._onDeadClickSelectionChange);\n document.removeEventListener(\"visibilitychange\", this._onDeadClickVisibilityChange);\n this._unclassifiedClicks.clear();\n }\n\n private readonly _onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n\n private _setupPageHideListeners() {\n window.addEventListener(\"pagehide\", this._onPageHide);\n document.addEventListener(\"visibilitychange\", this._onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", this._onPageHide);\n document.removeEventListener(\"visibilitychange\", this._onPageHide);\n };\n }\n\n private _teardown() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n\n // Restore history methods\n const historyObject = window.history;\n if (hasHistoryMethods(historyObject)) {\n if (this._originalPushState) {\n historyObject.pushState = this._originalPushState;\n }\n if (this._originalReplaceState) {\n historyObject.replaceState = this._originalReplaceState;\n }\n }\n this._originalPushState = null;\n this._originalReplaceState = null;\n\n window.removeEventListener(\"popstate\", this._onPopState);\n document.removeEventListener(\"click\", this._onClickCapture, { capture: true });\n this._teardownDeadClickDetection();\n\n this._events = [];\n this._approxBytes = 0;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._disabled) return;\n\n // A keepalive flush means the page is unloading — a click still awaiting\n // dead-click classification led to that unload, so it is alive by\n // definition and ships unmarked.\n if (options.keepalive) {\n this._unclassifiedClicks.clear();\n }\n\n // Clicks still awaiting classification stay buffered so the sweep can\n // mark them dead in place; classification finishes well within one flush\n // interval, so they ride the next flush at the latest.\n const events = this._events.filter((event) => !this._unclassifiedClicks.has(event));\n if (events.length === 0) return;\n this._events = this._events.filter((event) => this._unclassifiedClicks.has(event));\n this._approxBytes = this._events.reduce((total, event) => total + JSON.stringify(event).length, 0);\n\n const nowMs = Date.now();\n\n const batchId = generateUuid();\n const payload = {\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n sent_at_ms: nowMs,\n events,\n };\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n if (isAnalyticsNotEnabledError(res.error)) {\n this._disable();\n return;\n }\n // Ad blockers commonly block analytics endpoints, causing network\n // errors. These are expected and should not pollute the console.\n if (isAdBlockerNetworkError(res.error)) {\n return;\n }\n console.warn(\"EventTracker flush failed:\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n console.warn(\"EventTracker flush failed:\", res.data.status, await res.data.text());\n }\n }\n\n private _disable() {\n this._disabled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n this._teardown();\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"event-tracker.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { CLICKMAP_ROOT_ID, DEV_TOOL_ROOT_ID } from \"@hexclave/shared/dist/utils/dev-tool\";\nimport { cssEscapeIdent } from \"@hexclave/shared/dist/utils/dom\";\nimport { buildElementsChain, ELEMENTS_CHAIN_MAX_DEPTH } from \"@hexclave/shared/dist/utils/elements-chain\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { generateUuid, isAdBlockerNetworkError, isAnalyticsNotEnabledError } from \"./session-replay\";\n\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_EVENTS_PER_BATCH = 50;\nconst MAX_APPROX_BYTES_PER_BATCH = 64_000;\n\nfunction hasScreenDimensions(value: unknown): value is { width: number, height: number } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"width\" in value) || !(\"height\" in value)) {\n return false;\n }\n return typeof value.width === \"number\" && typeof value.height === \"number\";\n}\n\nfunction hasHistoryMethods(value: unknown): value is { pushState: History[\"pushState\"], replaceState: History[\"replaceState\"] } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"pushState\" in value) || !(\"replaceState\" in value)) {\n return false;\n }\n return typeof value.pushState === \"function\" && typeof value.replaceState === \"function\";\n}\n\nfunction getTextSnippet(textContent: string | null): string {\n return textContent == null ? \"\" : textContent.trim().substring(0, 200);\n}\n\n// Pixel quantization factor for x/y/viewport in stored click events. Matches the\n// SCALE_FACTOR used by the ClickHouse clickmap_events MV — keep them in sync.\nconst CLICKMAP_SCALE_FACTOR = 16;\n\n// Dead-click detection (PostHog-style). Whether an element has a click handler\n// is unknowable from page script, so a click is classified by its observable\n// consequences instead: it is \"alive\" if the page scrolled, the text selection\n// changed, or the tab visibility changed (a new tab opened) almost\n// immediately, or if the DOM mutated within a couple of seconds — and \"dead\"\n// if none of that happened by the absolute timeout.\n//\n// The $click event is buffered immediately like any other event (so\n// event_at_ms, ordering, and every query are untouched) and the sweep sets\n// data.dead=1 on it in place if nothing observable happened. _flush holds\n// back clicks that are still unclassified — classification always finishes\n// well within one FLUSH_INTERVAL_MS, so a held click rides the next flush at\n// the latest. A keepalive flush (pagehide/stop) sends them unmarked: a click\n// still pending when the page unloads led to that navigation, alive by\n// definition.\n//\n// NOTE — blocker for any future real-time / \"live clicks\" view: a click that\n// is still unclassified when its natural flush fires arrives up to one extra\n// FLUSH_INTERVAL_MS late. A surface showing clicks as they happen must either\n// accept that lag or emit a provisional $click plus a later dead-click\n// reconciliation event.\nconst DEAD_CLICK_SCROLL_THRESHOLD_MS = 100;\nconst DEAD_CLICK_SELECTION_CHANGED_THRESHOLD_MS = 100;\nconst DEAD_CLICK_VISIBILITY_CHANGE_THRESHOLD_MS = 100;\nconst DEAD_CLICK_MUTATION_THRESHOLD_MS = 2_500;\n// 1.1x the mutation threshold, mirroring posthog-js: every signal window has\n// closed before a click is declared dead.\nconst DEAD_CLICK_ABSOLUTE_TIMEOUT_MS = 2_750;\nconst DEAD_CLICK_CHECK_INTERVAL_MS = 1_000;\n// Backstop against click storms (e.g. rage clicks on a dead element): past the\n// cap, clicks are simply not classified rather than not recorded.\nconst DEAD_CLICK_MAX_PENDING = 50;\n\nfunction isPointerTargetFixed(element: Element): boolean {\n let current: Element | null = element;\n let depth = 0;\n while (current != null && depth < ELEMENTS_CHAIN_MAX_DEPTH * 2) {\n const style = window.getComputedStyle(current);\n if (style.position === \"fixed\" || style.position === \"sticky\") {\n return true;\n }\n current = current.parentElement;\n depth += 1;\n }\n return false;\n}\n\n// Clicks on Hexclave's own in-page UI (the dev tool and the standalone\n// clickmap overlay) must never be ingested as analytics events.\nfunction isInsideHexclaveUi(element: Element): boolean {\n return element.closest(`#${cssEscapeIdent(DEV_TOOL_ROOT_ID)}, #${cssEscapeIdent(CLICKMAP_ROOT_ID)}`) != null;\n}\n\n// Mutation-record targets can be text/comment nodes; resolve to the nearest\n// element before asking whether the mutation came from Hexclave's own UI.\nfunction isInsideHexclaveUiNode(node: Node | null): boolean {\n const element = node instanceof Element ? node : node?.parentElement ?? null;\n return element != null && isInsideHexclaveUi(element);\n}\n\nexport type EventTrackerDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\ntype TrackedEvent = {\n event_type: \"$page-view\" | \"$click\",\n event_at_ms: number,\n data: Record<string, unknown>,\n};\n\nexport class EventTracker {\n private _started = false;\n private _cancelled = false;\n private _disabled = false;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: TrackedEvent[] = [];\n private _approxBytes = 0;\n private _lastUrl: string | null = null;\n private readonly _sessionReplaySegmentId: string;\n private readonly _deps: EventTrackerDeps;\n\n private _originalPushState: History[\"pushState\"] | null = null;\n private _originalReplaceState: History[\"replaceState\"] | null = null;\n\n private _deadClickTimer: ReturnType<typeof setInterval> | null = null;\n private _deadClickMutationObserver: MutationObserver | null = null;\n // Buffered $click events still awaiting dead-click classification. Always a\n // subset of _events — _flush holds these back until the sweep resolves them.\n private _unclassifiedClicks = new Set<TrackedEvent>();\n private _lastMutationAtMs: number | null = null;\n private _lastScrollAtMs: number | null = null;\n private _lastSelectionChangedAtMs: number | null = null;\n private _lastVisibilityChangeAtMs: number | null = null;\n\n constructor(deps: EventTrackerDeps) {\n this._deps = deps;\n this._sessionReplaySegmentId = generateUuid();\n }\n\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n if (\n typeof window.addEventListener !== \"function\"\n || typeof window.removeEventListener !== \"function\"\n || typeof document.addEventListener !== \"function\"\n || typeof document.removeEventListener !== \"function\"\n || !hasScreenDimensions(window.screen)\n ) {\n return;\n }\n this._started = true;\n\n this._setupPageViewCapture();\n this._setupClickCapture();\n this._setupDeadClickDetection();\n this._setupPageHideListeners();\n\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._teardown();\n }\n\n clearBuffer() {\n this._events = [];\n this._approxBytes = 0;\n this._unclassifiedClicks.clear();\n }\n\n private _pushEvent(event: TrackedEvent) {\n if (this._disabled) return;\n this._events.push(event);\n this._approxBytes += JSON.stringify(event).length;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n\n private _capturePageView(entryType: \"initial\" | \"push\" | \"replace\" | \"pop\") {\n const screenObject = window.screen;\n if (!hasScreenDimensions(screenObject)) {\n return;\n }\n\n const url = window.location.href;\n if (url === this._lastUrl && entryType !== \"initial\") return;\n this._lastUrl = url;\n\n this._pushEvent({\n event_type: \"$page-view\",\n event_at_ms: Date.now(),\n data: {\n url,\n path: window.location.pathname,\n referrer: document.referrer,\n title: document.title,\n entry_type: entryType,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n screen_width: screenObject.width,\n screen_height: screenObject.height,\n user_agent: typeof navigator !== \"undefined\" ? navigator.userAgent : null,\n },\n });\n }\n\n private _setupPageViewCapture() {\n // Fire initial page-view\n this._capturePageView(\"initial\");\n const historyObject = window.history;\n if (!hasHistoryMethods(historyObject)) {\n return;\n }\n const originalPushState = historyObject.pushState;\n const originalReplaceState = historyObject.replaceState;\n\n // Monkey-patch history.pushState\n this._originalPushState = (...args: Parameters<History[\"pushState\"]>) => originalPushState.apply(historyObject, args);\n historyObject.pushState = (...args: Parameters<History[\"pushState\"]>) => {\n this._originalPushState!(...args);\n this._capturePageView(\"push\");\n };\n\n // Monkey-patch history.replaceState\n this._originalReplaceState = (...args: Parameters<History[\"replaceState\"]>) => originalReplaceState.apply(historyObject, args);\n historyObject.replaceState = (...args: Parameters<History[\"replaceState\"]>) => {\n this._originalReplaceState!(...args);\n this._capturePageView(\"replace\");\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this._onPopState);\n }\n\n private readonly _onPopState = () => {\n this._capturePageView(\"pop\");\n };\n\n private _buildSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && depth < 8 && current !== document.documentElement) {\n let part = current.tagName.toLowerCase();\n let testIdAttr = \"data-testid\";\n let testId = current.getAttribute(\"data-testid\");\n if (testId == null) {\n testIdAttr = \"data-test-id\";\n testId = current.getAttribute(\"data-test-id\");\n }\n if (testId != null && testId.trim() !== \"\") {\n part += `[${testIdAttr}=\"${testId.replace(/\"/g, '\\\\\"')}\"]`;\n parts.unshift(part);\n break;\n }\n if (current.id !== \"\") {\n part += `#${cssEscapeIdent(current.id)}`;\n parts.unshift(part);\n break;\n }\n if (current.className && typeof current.className === \"string\") {\n const classes = current.className.trim().split(/\\s+/).filter(Boolean).slice(0, 4);\n if (classes.length > 0) {\n part += `.${classes.map(cssEscapeIdent).join(\".\")}`;\n }\n }\n const parent: Element | null = current.parentElement;\n if (parent != null) {\n const tagName = current.tagName;\n const siblings = Array.from(parent.children).filter((child) => child.tagName === tagName);\n if (siblings.length > 1) {\n part += `:nth-of-type(${siblings.indexOf(current) + 1})`;\n }\n }\n parts.unshift(part);\n current = parent;\n depth++;\n }\n\n return parts.join(\" > \");\n }\n\n private _findNearestAnchorHref(element: Element): string | null {\n let current: Element | null = element;\n while (current) {\n if (current.tagName === \"A\" && current.hasAttribute(\"href\")) {\n return current.getAttribute(\"href\");\n }\n current = current.parentElement;\n }\n return null;\n }\n\n private readonly _onClickCapture = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n if (isInsideHexclaveUi(target)) return;\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const pointerTargetFixed = isPointerTargetFixed(target);\n // Pre-scale at ingest so old + new rows land in identical buckets in CH.\n const xScaled = Math.round(event.pageX / CLICKMAP_SCALE_FACTOR);\n const yScaled = Math.round(event.pageY / CLICKMAP_SCALE_FACTOR);\n const clientYScaled = Math.round(event.clientY / CLICKMAP_SCALE_FACTOR);\n const relativeX = viewportWidth > 0 ? event.clientX / viewportWidth : 0;\n\n const clickEvent: TrackedEvent = {\n event_type: \"$click\",\n event_at_ms: Date.now(),\n data: {\n tag_name: target.tagName.toLowerCase(),\n text: getTextSnippet(target.textContent),\n href: this._findNearestAnchorHref(target),\n selector: this._buildSelector(target),\n elements_chain: buildElementsChain(target),\n pointer_target_fixed: pointerTargetFixed ? 1 : 0,\n url: window.location.href,\n path: window.location.pathname,\n title: document.title,\n x: event.clientX,\n y: event.clientY,\n page_x: event.pageX,\n page_y: event.pageY,\n x_scaled: xScaled,\n y_scaled: yScaled,\n client_y_scaled: clientYScaled,\n pointer_relative_x: relativeX,\n viewport_width: viewportWidth,\n viewport_height: viewportHeight,\n scale_factor: CLICKMAP_SCALE_FACTOR,\n },\n };\n\n // Register for dead-click classification before buffering, so a\n // size-triggered flush from this very push already holds the click back.\n if (this._deadClickTimer !== null && this._unclassifiedClicks.size < DEAD_CLICK_MAX_PENDING) {\n this._unclassifiedClicks.add(clickEvent);\n }\n this._pushEvent(clickEvent);\n };\n\n private _setupClickCapture() {\n document.addEventListener(\"click\", this._onClickCapture, { capture: true });\n }\n\n private readonly _onDeadClickScroll = () => {\n this._lastScrollAtMs = Date.now();\n };\n\n private readonly _onDeadClickSelectionChange = () => {\n this._lastSelectionChangedAtMs = Date.now();\n };\n\n private readonly _onDeadClickVisibilityChange = () => {\n this._lastVisibilityChangeAtMs = Date.now();\n };\n\n private _setupDeadClickDetection() {\n if (typeof MutationObserver !== \"function\") return;\n\n this._deadClickMutationObserver = new MutationObserver((mutations) => {\n // The dev tool and the clickmap overlay rewrite their own DOM constantly\n // while open; their mutations must not mark host-page clicks as alive.\n if (mutations.every((mutation) => isInsideHexclaveUiNode(mutation.target))) {\n return;\n }\n this._lastMutationAtMs = Date.now();\n });\n this._deadClickMutationObserver.observe(document.documentElement, {\n childList: true,\n attributes: true,\n characterData: true,\n subtree: true,\n });\n\n // Capture phase so scrolls inside nested scroll containers count, not just\n // the document itself (scroll events don't bubble).\n document.addEventListener(\"scroll\", this._onDeadClickScroll, { capture: true, passive: true });\n document.addEventListener(\"selectionchange\", this._onDeadClickSelectionChange);\n document.addEventListener(\"visibilitychange\", this._onDeadClickVisibilityChange);\n\n this._deadClickTimer = setInterval(() => this._checkDeadClicks(), DEAD_CLICK_CHECK_INTERVAL_MS);\n }\n\n private _checkDeadClicks() {\n const nowMs = Date.now();\n for (const click of this._unclassifiedClicks) {\n const signalWithin = (signalAtMs: number | null, thresholdMs: number) =>\n signalAtMs != null && signalAtMs >= click.event_at_ms && signalAtMs - click.event_at_ms < thresholdMs;\n\n const isAlive = signalWithin(this._lastScrollAtMs, DEAD_CLICK_SCROLL_THRESHOLD_MS)\n || signalWithin(this._lastSelectionChangedAtMs, DEAD_CLICK_SELECTION_CHANGED_THRESHOLD_MS)\n || signalWithin(this._lastVisibilityChangeAtMs, DEAD_CLICK_VISIBILITY_CHANGE_THRESHOLD_MS)\n || signalWithin(this._lastMutationAtMs, DEAD_CLICK_MUTATION_THRESHOLD_MS);\n if (isAlive) {\n this._unclassifiedClicks.delete(click);\n } else if (nowMs - click.event_at_ms >= DEAD_CLICK_ABSOLUTE_TIMEOUT_MS) {\n // The already-buffered event is marked in place — no second event.\n click.data.dead = 1;\n this._unclassifiedClicks.delete(click);\n }\n }\n }\n\n private _teardownDeadClickDetection() {\n if (this._deadClickTimer !== null) {\n clearInterval(this._deadClickTimer);\n this._deadClickTimer = null;\n }\n if (this._deadClickMutationObserver !== null) {\n this._deadClickMutationObserver.disconnect();\n this._deadClickMutationObserver = null;\n }\n document.removeEventListener(\"scroll\", this._onDeadClickScroll, { capture: true });\n document.removeEventListener(\"selectionchange\", this._onDeadClickSelectionChange);\n document.removeEventListener(\"visibilitychange\", this._onDeadClickVisibilityChange);\n this._unclassifiedClicks.clear();\n }\n\n private readonly _onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n\n private _setupPageHideListeners() {\n window.addEventListener(\"pagehide\", this._onPageHide);\n document.addEventListener(\"visibilitychange\", this._onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", this._onPageHide);\n document.removeEventListener(\"visibilitychange\", this._onPageHide);\n };\n }\n\n private _teardown() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n\n // Restore history methods\n const historyObject = window.history;\n if (hasHistoryMethods(historyObject)) {\n if (this._originalPushState) {\n historyObject.pushState = this._originalPushState;\n }\n if (this._originalReplaceState) {\n historyObject.replaceState = this._originalReplaceState;\n }\n }\n this._originalPushState = null;\n this._originalReplaceState = null;\n\n window.removeEventListener(\"popstate\", this._onPopState);\n document.removeEventListener(\"click\", this._onClickCapture, { capture: true });\n this._teardownDeadClickDetection();\n\n this._events = [];\n this._approxBytes = 0;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._disabled) return;\n\n // A keepalive flush means the page is unloading — a click still awaiting\n // dead-click classification led to that unload, so it is alive by\n // definition and ships unmarked.\n if (options.keepalive) {\n this._unclassifiedClicks.clear();\n }\n\n // Clicks still awaiting classification stay buffered so the sweep can\n // mark them dead in place; classification finishes well within one flush\n // interval, so they ride the next flush at the latest.\n const events = this._events.filter((event) => !this._unclassifiedClicks.has(event));\n if (events.length === 0) return;\n this._events = this._events.filter((event) => this._unclassifiedClicks.has(event));\n this._approxBytes = this._events.reduce((total, event) => total + JSON.stringify(event).length, 0);\n\n const nowMs = Date.now();\n\n const batchId = generateUuid();\n const payload = {\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n sent_at_ms: nowMs,\n events,\n };\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n if (isAnalyticsNotEnabledError(res.error)) {\n this._disable();\n return;\n }\n // Ad blockers commonly block analytics endpoints, causing network\n // errors. These are expected and should not pollute the console.\n if (isAdBlockerNetworkError(res.error)) {\n return;\n }\n console.warn(\"EventTracker flush failed:\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n console.warn(\"EventTracker flush failed:\", res.data.status, await res.data.text());\n }\n }\n\n private _disable() {\n this._disabled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n this._teardown();\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import { afterEach, describe, expect, it, vi } from "vitest";
|
|
|
2
2
|
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
3
3
|
import { KnownErrors } from "@hexclave/shared/dist/known-errors";
|
|
4
4
|
import { EventTracker } from "./event-tracker.js";
|
|
5
|
-
|
|
6
5
|
//#region src/lib/hexclave-app/apps/implementations/event-tracker.test.ts
|
|
7
6
|
// @vitest-environment jsdom
|
|
8
7
|
async function advancePastFlush() {
|
|
@@ -355,7 +354,7 @@ describe("EventTracker", () => {
|
|
|
355
354
|
}
|
|
356
355
|
});
|
|
357
356
|
});
|
|
358
|
-
|
|
359
357
|
//#endregion
|
|
360
|
-
export {
|
|
358
|
+
export {};
|
|
359
|
+
|
|
361
360
|
//# sourceMappingURL=event-tracker.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-tracker.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n // Dead-click classification marks the buffered $click in place —\n // exactly one click event either way.\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"emits a PostHog-style elements_chain plus scaled pointer coords for $click\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <main>\n <section class=\"card panel\">\n <button id=\"save-btn\" data-testid=\"save\" aria-label=\"Save project\">Save changes</button>\n </section>\n </main>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#save-btn\");\n if (button == null) throw new Error(\"button missing\");\n button.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n if (click == null) throw new Error(\"no $click event captured\");\n\n // elements_chain encodes the target leaf plus a few ancestors. Leaf is\n // first; segments are `;`-delimited. Assert against substrings rather\n // than the full string so jsdom layout quirks don't make this flaky.\n const chain = click.data.elements_chain;\n expect(typeof chain).toBe(\"string\");\n expect(chain).toContain('button');\n expect(chain).toContain('attr__id=\"save-btn\"');\n expect(chain).toContain('attr__data-testid=\"save\"');\n expect(chain).toContain('attr__aria-label=\"Save project\"');\n expect(chain).toContain('text=\"Save changes\"');\n // Ancestor section is in the chain too.\n expect(chain).toContain(\"section\");\n\n // Pre-scaled coords land in clickmap_events.pointer_*. SCALE_FACTOR=16.\n expect(click.data.x_scaled).toBe(Math.round(100 / 16));\n expect(click.data.y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.client_y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.scale_factor).toBe(16);\n expect(click.data.pointer_relative_x).toBeCloseTo(100 / window.innerWidth, 4);\n expect(click.data.pointer_target_fixed).toBe(0);\n\n // Legacy CSS selector still emitted for back-compat. The builder prefers\n // data-testid over id, so we assert against that anchor rather than #id.\n expect(click.data.selector).toContain('data-testid=\"save\"');\n expect(click.data.tag_name).toBe(\"button\");\n } finally {\n tracker.stop();\n }\n });\n\n it(\"ignores clicks inside the Hexclave dev tool\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <div id=\"__hexclave-dev-tool-root\">\n <button>Clickmap toolbar control</button>\n </div>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags pointer_target_fixed when the target sits under a fixed-position ancestor\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <header style=\"position: fixed; top: 0\">\n <button id=\"cta\">Sign up</button>\n </header>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"#cta\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n expect(click?.data.pointer_target_fixed).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags a click with no observable effect as dead on its single $click event\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"dead\\\">Does nothing</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#dead\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 10,\n clientY: 20,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n const click = clicks[0];\n\n // One event per physical click: the buffered $click is marked dead in\n // place, still timestamped at the original click rather than at\n // classification time (~3s later).\n expect(click.data.dead).toBe(1);\n expect(click.event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"does not flag a click as dead when it mutates the DOM\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"live\\\">Adds content</button><div id=\\\"out\\\"></div>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#live\");\n if (button == null) throw new Error(\"button missing\");\n button.addEventListener(\"click\", () => {\n document.querySelector(\"#out\")?.appendChild(document.createElement(\"p\"));\n });\n button.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n // Let the MutationObserver microtask run so the mutation is recorded\n // before the dead-click sweeps start.\n await Promise.resolve();\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n } finally {\n tracker.stop();\n }\n });\n\n it(\"drains held clicks as alive on pagehide so navigation clicks are never lost\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<a id=\\\"nav\\\" href=\\\"/pricing\\\">Pricing</a>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#nav\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n\n // Navigation fires pagehide well before any classification sweep — the\n // keepalive flush ships the still-unclassified click as a plain (alive)\n // $click.\n window.dispatchEvent(new Event(\"pagehide\"));\n await Promise.resolve();\n await Promise.resolve();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n expect(clicks[0].event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"holds an unclassified click out of a flush and ships it on the next one\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"late\\\">Late click</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n // Click 500ms before the 10s flush tick: classification cannot finish\n // in time, so the flush must hold the click back rather than send it\n // unclassified.\n await vi.advanceTimersByTimeAsync(9_500);\n document.querySelector(\"#late\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await vi.advanceTimersByTimeAsync(500);\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n\n // By the next flush the sweep has classified it (dead — nothing\n // observable happened) and it ships marked.\n await vi.advanceTimersByTimeAsync(10_000);\n const second = JSON.parse(sentBodies[1] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n expect(second.events.map((event) => event.event_type)).toMatchInlineSnapshot(`\n [\n \"$click\",\n ]\n `);\n expect(second.events[0].data.dead).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"silently ignores network errors caused by ad blockers\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Click me</button>\";\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new TypeError(\"Failed to fetch\"));\n },\n });\n\n try {\n tracker.start();\n\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n // Unlike ANALYTICS_NOT_ENABLED, ad blocker errors do NOT disable the\n // tracker — subsequent flushes continue attempting delivery.\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n expect(sentBodies).toHaveLength(2);\n expect(warnSpy).not.toHaveBeenCalled();\n } finally {\n tracker.stop();\n warnSpy.mockRestore();\n }\n });\n\n it(\"silently disables when client interface returns ANALYTICS_NOT_ENABLED as an error\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Click me</button>\";\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new KnownErrors.AnalyticsNotEnabled());\n },\n });\n\n try {\n tracker.start();\n\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect((tracker as any)._flushTimer).toBeNull();\n\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n } finally {\n tracker.stop();\n warnSpy.mockRestore();\n }\n });\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"event-tracker.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { KnownErrors } from \"@hexclave/shared/dist/known-errors\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n // Dead-click classification marks the buffered $click in place —\n // exactly one click event either way.\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"emits a PostHog-style elements_chain plus scaled pointer coords for $click\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <main>\n <section class=\"card panel\">\n <button id=\"save-btn\" data-testid=\"save\" aria-label=\"Save project\">Save changes</button>\n </section>\n </main>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#save-btn\");\n if (button == null) throw new Error(\"button missing\");\n button.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n if (click == null) throw new Error(\"no $click event captured\");\n\n // elements_chain encodes the target leaf plus a few ancestors. Leaf is\n // first; segments are `;`-delimited. Assert against substrings rather\n // than the full string so jsdom layout quirks don't make this flaky.\n const chain = click.data.elements_chain;\n expect(typeof chain).toBe(\"string\");\n expect(chain).toContain('button');\n expect(chain).toContain('attr__id=\"save-btn\"');\n expect(chain).toContain('attr__data-testid=\"save\"');\n expect(chain).toContain('attr__aria-label=\"Save project\"');\n expect(chain).toContain('text=\"Save changes\"');\n // Ancestor section is in the chain too.\n expect(chain).toContain(\"section\");\n\n // Pre-scaled coords land in clickmap_events.pointer_*. SCALE_FACTOR=16.\n expect(click.data.x_scaled).toBe(Math.round(100 / 16));\n expect(click.data.y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.client_y_scaled).toBe(Math.round(200 / 16));\n expect(click.data.scale_factor).toBe(16);\n expect(click.data.pointer_relative_x).toBeCloseTo(100 / window.innerWidth, 4);\n expect(click.data.pointer_target_fixed).toBe(0);\n\n // Legacy CSS selector still emitted for back-compat. The builder prefers\n // data-testid over id, so we assert against that anchor rather than #id.\n expect(click.data.selector).toContain('data-testid=\"save\"');\n expect(click.data.tag_name).toBe(\"button\");\n } finally {\n tracker.stop();\n }\n });\n\n it(\"ignores clicks inside the Hexclave dev tool\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <div id=\"__hexclave-dev-tool-root\">\n <button>Clickmap toolbar control</button>\n </div>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 100,\n clientY: 200,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags pointer_target_fixed when the target sits under a fixed-position ancestor\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = `\n <header style=\"position: fixed; top: 0\">\n <button id=\"cta\">Sign up</button>\n </header>\n `;\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"#cta\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const click = payload.events.find((event) => event.event_type === \"$click\");\n expect(click?.data.pointer_target_fixed).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"flags a click with no observable effect as dead on its single $click event\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"dead\\\">Does nothing</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#dead\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 10,\n clientY: 20,\n }));\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n const click = clicks[0];\n\n // One event per physical click: the buffered $click is marked dead in\n // place, still timestamped at the original click rather than at\n // classification time (~3s later).\n expect(click.data.dead).toBe(1);\n expect(click.event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"does not flag a click as dead when it mutates the DOM\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"live\\\">Adds content</button><div id=\\\"out\\\"></div>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const button = document.querySelector(\"#live\");\n if (button == null) throw new Error(\"button missing\");\n button.addEventListener(\"click\", () => {\n document.querySelector(\"#out\")?.appendChild(document.createElement(\"p\"));\n });\n button.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n // Let the MutationObserver microtask run so the mutation is recorded\n // before the dead-click sweeps start.\n await Promise.resolve();\n\n await advancePastFlush();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n } finally {\n tracker.stop();\n }\n });\n\n it(\"drains held clicks as alive on pagehide so navigation clicks are never lost\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<a id=\\\"nav\\\" href=\\\"/pricing\\\">Pricing</a>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n const clickAtMs = Date.now();\n document.querySelector(\"#nav\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n\n // Navigation fires pagehide well before any classification sweep — the\n // keepalive flush ships the still-unclassified click as a plain (alive)\n // $click.\n window.dispatchEvent(new Event(\"pagehide\"));\n await Promise.resolve();\n await Promise.resolve();\n\n const payload = JSON.parse(sentBodies[0] ?? \"{}\") as { events: { event_type: string, event_at_ms: number, data: Record<string, unknown> }[] };\n const clicks = payload.events.filter((event) => event.event_type === \"$click\");\n expect(clicks).toHaveLength(1);\n expect(clicks[0].data.dead).toBeUndefined();\n expect(clicks[0].event_at_ms).toBe(clickAtMs);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"holds an unclassified click out of a flush and ships it on the next one\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button id=\\\"late\\\">Late click</button>\";\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n // Click 500ms before the 10s flush tick: classification cannot finish\n // in time, so the flush must hold the click back rather than send it\n // unclassified.\n await vi.advanceTimersByTimeAsync(9_500);\n document.querySelector(\"#late\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await vi.advanceTimersByTimeAsync(500);\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n ]\n `);\n\n // By the next flush the sweep has classified it (dead — nothing\n // observable happened) and it ships marked.\n await vi.advanceTimersByTimeAsync(10_000);\n const second = JSON.parse(sentBodies[1] ?? \"{}\") as { events: { event_type: string, data: Record<string, unknown> }[] };\n expect(second.events.map((event) => event.event_type)).toMatchInlineSnapshot(`\n [\n \"$click\",\n ]\n `);\n expect(second.events[0].data.dead).toBe(1);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"silently ignores network errors caused by ad blockers\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Click me</button>\";\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new TypeError(\"Failed to fetch\"));\n },\n });\n\n try {\n tracker.start();\n\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n\n // Unlike ANALYTICS_NOT_ENABLED, ad blocker errors do NOT disable the\n // tracker — subsequent flushes continue attempting delivery.\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n expect(sentBodies).toHaveLength(2);\n expect(warnSpy).not.toHaveBeenCalled();\n } finally {\n tracker.stop();\n warnSpy.mockRestore();\n }\n });\n\n it(\"silently disables when client interface returns ANALYTICS_NOT_ENABLED as an error\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Click me</button>\";\n\n const warnSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.error(new KnownErrors.AnalyticsNotEnabled());\n },\n });\n\n try {\n tracker.start();\n\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n expect(warnSpy).not.toHaveBeenCalled();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect((tracker as any)._flushTimer).toBeNull();\n\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", { bubbles: true }));\n await advancePastFlush();\n expect(sentBodies).toHaveLength(1);\n } finally {\n tracker.stop();\n warnSpy.mockRestore();\n }\n });\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { _HexclaveServerAppImplIncomplete } from "./server-app-impl";
|
|
2
|
-
import { _HexclaveAdminAppImplIncomplete } from "./admin-app-impl";
|
|
3
|
-
import { _HexclaveClientAppImplIncomplete } from "./client-app-impl";
|
|
1
|
+
import { _HexclaveServerAppImplIncomplete } from "./server-app-impl.js";
|
|
2
|
+
import { _HexclaveAdminAppImplIncomplete } from "./admin-app-impl.js";
|
|
3
|
+
import { _HexclaveClientAppImplIncomplete } from "./client-app-impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/lib/hexclave-app/apps/implementations/index.d.ts
|
|
6
6
|
declare const _HexclaveAdminAppImpl: typeof _HexclaveAdminAppImplIncomplete, _HexclaveClientAppImpl: typeof _HexclaveClientAppImplIncomplete, _HexclaveServerAppImpl: typeof _HexclaveServerAppImplIncomplete;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/index.ts"],"mappings":";;;;;cA8BE,qBAAA,SAAqB,+BAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/index.ts"],"mappings":";;;;;cA8BE,qBAAA,SAAqB,+BAAA,iCACC,gCAAA,iCACA,gCAAA"}
|
|
@@ -2,7 +2,6 @@ import { _HexclaveServerAppImplIncomplete } from "./server-app-impl.js";
|
|
|
2
2
|
import { scrambleDuringCompileTime } from "@hexclave/shared/dist/utils/compile-time";
|
|
3
3
|
import { _HexclaveAdminAppImplIncomplete } from "./admin-app-impl.js";
|
|
4
4
|
import { _HexclaveClientAppImplIncomplete } from "./client-app-impl.js";
|
|
5
|
-
|
|
6
5
|
//#region src/lib/hexclave-app/apps/implementations/index.ts
|
|
7
6
|
/**
|
|
8
7
|
* Prevents a circular dependency between the client and admin apps. For more information, see the documentation comment
|
|
@@ -21,7 +20,7 @@ function complete() {
|
|
|
21
20
|
};
|
|
22
21
|
}
|
|
23
22
|
const { _HexclaveAdminAppImpl, _HexclaveClientAppImpl, _HexclaveServerAppImpl } = complete();
|
|
24
|
-
|
|
25
23
|
//#endregion
|
|
26
24
|
export { _HexclaveAdminAppImpl, _HexclaveClientAppImpl, _HexclaveServerAppImpl };
|
|
25
|
+
|
|
27
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { scrambleDuringCompileTime } from \"@hexclave/shared/dist/utils/compile-time\";\nimport { _HexclaveAdminAppImplIncomplete } from \"./admin-app-impl\";\nimport { _HexclaveClientAppImplIncomplete } from \"./client-app-impl\";\nimport { _HexclaveServerAppImplIncomplete } from \"./server-app-impl\";\n\n\n/**\n * Prevents a circular dependency between the client and admin apps. For more information, see the documentation comment\n * of `_HexclaveClientAppImplIncomplete.LazyStackAdminAppImpl`.\n *\n * Note: This is an explicitly defined function that returns the new values (and not a barrel file with top-level side\n * effects) because we have `sideEffects: false` in the package.json, and so it would be tree-shaken away if we just\n * exported the values directly.\n */\nfunction complete() {\n _HexclaveClientAppImplIncomplete.LazyStackAdminAppImpl.value = _HexclaveAdminAppImplIncomplete;\n\n return {\n _HexclaveAdminAppImpl: scrambleDuringCompileTime(_HexclaveAdminAppImplIncomplete),\n _HexclaveClientAppImpl: scrambleDuringCompileTime(_HexclaveClientAppImplIncomplete),\n _HexclaveServerAppImpl: scrambleDuringCompileTime(_HexclaveServerAppImplIncomplete),\n };\n}\n\nexport const {\n _HexclaveAdminAppImpl,\n _HexclaveClientAppImpl,\n _HexclaveServerAppImpl\n} = complete();\n\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { scrambleDuringCompileTime } from \"@hexclave/shared/dist/utils/compile-time\";\nimport { _HexclaveAdminAppImplIncomplete } from \"./admin-app-impl\";\nimport { _HexclaveClientAppImplIncomplete } from \"./client-app-impl\";\nimport { _HexclaveServerAppImplIncomplete } from \"./server-app-impl\";\n\n\n/**\n * Prevents a circular dependency between the client and admin apps. For more information, see the documentation comment\n * of `_HexclaveClientAppImplIncomplete.LazyStackAdminAppImpl`.\n *\n * Note: This is an explicitly defined function that returns the new values (and not a barrel file with top-level side\n * effects) because we have `sideEffects: false` in the package.json, and so it would be tree-shaken away if we just\n * exported the values directly.\n */\nfunction complete() {\n _HexclaveClientAppImplIncomplete.LazyStackAdminAppImpl.value = _HexclaveAdminAppImplIncomplete;\n\n return {\n _HexclaveAdminAppImpl: scrambleDuringCompileTime(_HexclaveAdminAppImplIncomplete),\n _HexclaveClientAppImpl: scrambleDuringCompileTime(_HexclaveClientAppImplIncomplete),\n _HexclaveServerAppImpl: scrambleDuringCompileTime(_HexclaveServerAppImplIncomplete),\n };\n}\n\nexport const {\n _HexclaveAdminAppImpl,\n _HexclaveClientAppImpl,\n _HexclaveServerAppImpl\n} = complete();\n\n"],"mappings":";;;;;;;;;;;;;AAmBA,SAAS,WAAW;CAClB,iCAAiC,sBAAsB,QAAQ;CAE/D,OAAO;EACL,uBAAuB,0BAA0B,+BAA+B;EAChF,wBAAwB,0BAA0B,gCAAgC;EAClF,wBAAwB,0BAA0B,gCAAgC;CACpF;AACF;AAEA,MAAa,EACX,uBACA,wBACA,2BACE,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect-page-urls.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts"],"mappings":";;;cAQa,0BAAA;EAAA;;;;;KAqBD,wBAAA;EACV,KAAA;EACA,
|
|
1
|
+
{"version":3,"file":"redirect-page-urls.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts"],"mappings":";;;cAQa,0BAAA;EAAA;;;;;KAqBD,wBAAA;EACV,KAAA;EACA,aAAa;AAAA;AAAA,iBAGC,yCAAA,CAA0C,UAAA,EAAY,GAAA,GAAM,wBAAwB;AAAA,KAkI/F,qBAAA;EACC,IAAA;EAAkB,GAAA;AAAA;EAEpB,IAAA;EACA,WAAA;EACA,KAAA;EACA,aAAA;EACA,wBAAA;AAAA;AAAA,iBAsCkB,qBAAA,CAAsB,OAAA;EAC1C,WAAA,QAAmB,WAAA;EACnB,aAAA;EACA,cAAA;EACA,UAAA,EAAY,GAAA;EACZ,qBAAA;EACA,2BAAA,GAA8B,UAAA,EAAY,GAAA,KAAQ,OAAA,CAAQ,wBAAA;AAAA,IACxD,OAAA,CAAQ,qBAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { HexclaveAssertionError } from "@hexclave/shared/dist/utils/errors";
|
|
2
2
|
import { getRelativePart } from "@hexclave/shared/dist/utils/urls";
|
|
3
|
-
|
|
4
3
|
//#region src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts
|
|
5
4
|
const crossDomainAuthQueryParams = {
|
|
6
5
|
marker: "hexclave_cross_domain_auth",
|
|
@@ -191,7 +190,7 @@ function getCrossDomainHandoffForRedirect(options) {
|
|
|
191
190
|
handoffParams
|
|
192
191
|
};
|
|
193
192
|
}
|
|
194
|
-
|
|
195
193
|
//#endregion
|
|
196
194
|
export { crossDomainAuthQueryParams, getCrossDomainHandoffParamsFromCurrentUrl, planRedirectToHandler };
|
|
195
|
+
|
|
197
196
|
//# sourceMappingURL=redirect-page-urls.js.map
|