@hexclave/js 1.0.2 → 1.0.5
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/dev-tool/dev-tool-core.d.ts +1 -1
- package/dist/dev-tool/dev-tool-core.js +11 -11
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/dev-tool/dev-tool-styles.js +371 -371
- package/dist/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/dev-tool/index.d.ts +4 -4
- package/dist/dev-tool/index.js +4 -4
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +10 -10
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
- package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts +4 -4
- package/dist/esm/dev-tool/index.js +4 -4
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/esm/integrations/convex.js +1 -1
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/auth.test.js.map +1 -1
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/env.js.map +1 -1
- package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
- package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +7 -7
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +23 -30
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +6 -6
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → 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 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +5 -5
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
- package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
- package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
- package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
- package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
- package/dist/esm/lib/hexclave-app/common.js +7 -0
- package/dist/esm/lib/hexclave-app/common.js.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/contact-channels/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
- package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
- package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
- package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
- package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
- package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
- package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
- package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
- package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
- package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
- package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
- package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/index.d.ts +15 -15
- package/dist/index.js +3 -3
- package/dist/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/integrations/convex.js +2 -2
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/auth.test.js.map +1 -1
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/env.js.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
- package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +5 -5
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +22 -29
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +5 -5
- package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
- package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
- package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +4 -4
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
- package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
- package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
- package/dist/lib/hexclave-app/common.js +9 -0
- package/dist/lib/hexclave-app/common.js.map +1 -0
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
- package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
- package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
- package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
- package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
- package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
- package/dist/lib/hexclave-app/projects/index.js.map +1 -0
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
- package/dist/lib/hexclave-app/teams/index.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
- package/dist/lib/hexclave-app/url-targets.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
- package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
- package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
- package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
- package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
- package/dist/lib/hexclave-app/users/index.js.map +1 -0
- package/dist/utils/url.js.map +1 -1
- package/package.json +4 -3
- package/src/dev-tool/dev-tool-core.ts +2460 -0
- package/src/dev-tool/dev-tool-styles.ts +2758 -0
- package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
- package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
- package/src/dev-tool/index.ts +149 -0
- package/src/index.ts +12 -0
- package/src/integrations/convex/component/README.md +74 -0
- package/src/integrations/convex/component/convex.config.ts +9 -0
- package/src/integrations/convex.ts +28 -0
- package/src/lib/auth.test.ts +67 -0
- package/src/lib/auth.ts +175 -0
- package/src/lib/cookie.ts +327 -0
- package/src/lib/env.ts +93 -0
- package/src/lib/hexclave-app/api-keys/index.ts +73 -0
- package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1159 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +141 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3525 -0
- package/src/lib/hexclave-app/apps/implementations/common.ts +190 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
- package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
- package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
- package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
- package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1322 -0
- package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
- package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
- package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
- package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
- package/src/lib/hexclave-app/apps/index.ts +40 -0
- package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +189 -0
- package/src/lib/hexclave-app/apps/interfaces/client-app.ts +172 -0
- package/src/lib/hexclave-app/apps/interfaces/server-app.ts +114 -0
- package/src/lib/hexclave-app/common.ts +209 -0
- package/src/lib/hexclave-app/connected-accounts/index.ts +47 -0
- package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
- package/src/lib/hexclave-app/customers/index.ts +158 -0
- package/src/lib/hexclave-app/data-vault/index.ts +12 -0
- package/src/lib/hexclave-app/email/index.ts +280 -0
- package/src/lib/hexclave-app/email-templates/index.ts +24 -0
- package/src/lib/hexclave-app/index.ts +146 -0
- package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
- package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
- package/src/lib/hexclave-app/permissions/index.ts +75 -0
- package/src/lib/hexclave-app/project-configs/index.ts +103 -0
- package/src/lib/hexclave-app/projects/index.ts +234 -0
- package/src/lib/hexclave-app/session-replays/index.ts +72 -0
- package/src/lib/hexclave-app/teams/index.ts +203 -0
- package/src/lib/hexclave-app/url-targets.test.ts +253 -0
- package/src/lib/hexclave-app/url-targets.ts +395 -0
- package/src/lib/hexclave-app/users/index.ts +495 -0
- package/src/utils/url.ts +24 -0
- package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
- package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
- package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
- package/dist/esm/lib/stack-app/common.js +0 -7
- package/dist/esm/lib/stack-app/common.js.map +0 -1
- package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
- package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
- package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
- package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
- package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
- package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
- package/dist/esm/lib/stack-app/users/index.js.map +0 -1
- package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
- package/dist/lib/stack-app/api-keys/index.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
- package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/index.js +0 -31
- package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
- package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
- package/dist/lib/stack-app/common.d.ts.map +0 -1
- package/dist/lib/stack-app/common.js +0 -9
- package/dist/lib/stack-app/common.js.map +0 -1
- package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
- package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
- package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
- package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
- package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
- package/dist/lib/stack-app/email/index.d.ts.map +0 -1
- package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
- package/dist/lib/stack-app/email-templates/index.js.map +0 -1
- package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
- package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
- package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
- package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
- package/dist/lib/stack-app/permissions/index.js.map +0 -1
- package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
- package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
- package/dist/lib/stack-app/projects/index.js.map +0 -1
- package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
- package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
- package/dist/lib/stack-app/teams/index.js.map +0 -1
- package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
- package/dist/lib/stack-app/url-targets.js.map +0 -1
- package/dist/lib/stack-app/url-targets.test.js.map +0 -1
- package/dist/lib/stack-app/users/index.d.ts.map +0 -1
- package/dist/lib/stack-app/users/index.js.map +0 -1
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
- /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
- /package/dist/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
|
|
2
|
+
//===========================================
|
|
3
|
+
// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
|
|
4
|
+
//===========================================
|
|
5
|
+
import { describe, expect, it, vi } from "vitest";
|
|
6
|
+
import { subscribeSessionRefresh } from "./session-refresh-subscription";
|
|
7
|
+
|
|
8
|
+
type Listener = () => void;
|
|
9
|
+
|
|
10
|
+
function createTokenStoreTestDouble() {
|
|
11
|
+
const listeners = new Set<Listener>();
|
|
12
|
+
const unsubscribe = vi.fn((listener: Listener) => {
|
|
13
|
+
listeners.delete(listener);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
tokenStore: {
|
|
18
|
+
onChange: vi.fn((listener: Listener) => {
|
|
19
|
+
listeners.add(listener);
|
|
20
|
+
return {
|
|
21
|
+
unsubscribe: () => unsubscribe(listener),
|
|
22
|
+
};
|
|
23
|
+
}),
|
|
24
|
+
},
|
|
25
|
+
emitChange: () => {
|
|
26
|
+
for (const listener of [...listeners]) {
|
|
27
|
+
listener();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
unsubscribe,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function createSessionTestDouble(sessionKey: string) {
|
|
35
|
+
const refreshUnsubscribe = vi.fn();
|
|
36
|
+
return {
|
|
37
|
+
session: {
|
|
38
|
+
sessionKey,
|
|
39
|
+
startRefreshingAccessToken: vi.fn(() => ({
|
|
40
|
+
unsubscribe: refreshUnsubscribe,
|
|
41
|
+
})),
|
|
42
|
+
},
|
|
43
|
+
refreshUnsubscribe,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
describe("subscribeSessionRefresh", () => {
|
|
48
|
+
it("starts token refresh while subscribed and stops it on unsubscribe", () => {
|
|
49
|
+
const tokenStore = createTokenStoreTestDouble();
|
|
50
|
+
const firstSession = createSessionTestDouble("refresh-token-1");
|
|
51
|
+
const onTokenStoreChange = vi.fn();
|
|
52
|
+
|
|
53
|
+
const unsubscribe = subscribeSessionRefresh({
|
|
54
|
+
tokenStore: tokenStore.tokenStore,
|
|
55
|
+
getSession: () => firstSession.session,
|
|
56
|
+
onTokenStoreChange,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);
|
|
60
|
+
expect(tokenStore.tokenStore.onChange).toHaveBeenCalledOnce();
|
|
61
|
+
|
|
62
|
+
unsubscribe();
|
|
63
|
+
|
|
64
|
+
expect(tokenStore.unsubscribe).toHaveBeenCalledOnce();
|
|
65
|
+
expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("keeps the existing refresh loop when the token store changes within the same session", () => {
|
|
69
|
+
const tokenStore = createTokenStoreTestDouble();
|
|
70
|
+
const firstSession = createSessionTestDouble("refresh-token-1");
|
|
71
|
+
const onTokenStoreChange = vi.fn();
|
|
72
|
+
|
|
73
|
+
subscribeSessionRefresh({
|
|
74
|
+
tokenStore: tokenStore.tokenStore,
|
|
75
|
+
getSession: () => firstSession.session,
|
|
76
|
+
onTokenStoreChange,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
tokenStore.emitChange();
|
|
80
|
+
|
|
81
|
+
expect(onTokenStoreChange).toHaveBeenCalledOnce();
|
|
82
|
+
expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledOnce();
|
|
83
|
+
expect(firstSession.refreshUnsubscribe).not.toHaveBeenCalled();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("moves the refresh loop when the token store changes to a different session", () => {
|
|
87
|
+
const tokenStore = createTokenStoreTestDouble();
|
|
88
|
+
const firstSession = createSessionTestDouble("refresh-token-1");
|
|
89
|
+
const secondSession = createSessionTestDouble("refresh-token-2");
|
|
90
|
+
const sessions = [firstSession.session, secondSession.session];
|
|
91
|
+
const onTokenStoreChange = vi.fn();
|
|
92
|
+
|
|
93
|
+
subscribeSessionRefresh({
|
|
94
|
+
tokenStore: tokenStore.tokenStore,
|
|
95
|
+
getSession: () => sessions[0] ?? secondSession.session,
|
|
96
|
+
onTokenStoreChange,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
sessions.shift();
|
|
100
|
+
tokenStore.emitChange();
|
|
101
|
+
|
|
102
|
+
expect(onTokenStoreChange).toHaveBeenCalledOnce();
|
|
103
|
+
expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();
|
|
104
|
+
expect(secondSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
//===========================================
|
|
3
|
+
// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
|
|
4
|
+
//===========================================
|
|
5
|
+
type TokenStoreSubscription = {
|
|
6
|
+
unsubscribe: () => void,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type TokenStoreLike = {
|
|
10
|
+
onChange: (callback: () => void) => TokenStoreSubscription,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type SessionRefreshLike = {
|
|
14
|
+
sessionKey: string,
|
|
15
|
+
startRefreshingAccessToken: (minMillisUntilExpiration: number, maxMillisSinceIssued: number | null) => TokenStoreSubscription,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Keeps the currently mounted React session fresh while `useSyncExternalStore`
|
|
20
|
+
* has an active subscriber. The token store owns which session is current; when
|
|
21
|
+
* it changes to a different session key, we stop refreshing the old session and
|
|
22
|
+
* start refreshing the new one. The caller still receives every token-store
|
|
23
|
+
* change through `onTokenStoreChange` so React can re-read the session snapshot.
|
|
24
|
+
*/
|
|
25
|
+
export function subscribeSessionRefresh(options: {
|
|
26
|
+
tokenStore: TokenStoreLike,
|
|
27
|
+
getSession: () => SessionRefreshLike,
|
|
28
|
+
onTokenStoreChange: () => void,
|
|
29
|
+
minMillisUntilExpiration?: number,
|
|
30
|
+
maxMillisSinceIssued?: number | null,
|
|
31
|
+
}): () => void {
|
|
32
|
+
const minMillisUntilExpiration = options.minMillisUntilExpiration ?? 30_000;
|
|
33
|
+
const maxMillisSinceIssued = options.maxMillisSinceIssued ?? 60_000;
|
|
34
|
+
|
|
35
|
+
let refreshedSession = options.getSession();
|
|
36
|
+
let refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);
|
|
37
|
+
|
|
38
|
+
const tokenStoreSubscription = options.tokenStore.onChange(() => {
|
|
39
|
+
const nextSession = options.getSession();
|
|
40
|
+
if (nextSession.sessionKey !== refreshedSession.sessionKey) {
|
|
41
|
+
refreshSubscription.unsubscribe();
|
|
42
|
+
refreshedSession = nextSession;
|
|
43
|
+
refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);
|
|
44
|
+
}
|
|
45
|
+
options.onTokenStoreChange();
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return () => {
|
|
49
|
+
tokenStoreSubscription.unsubscribe();
|
|
50
|
+
refreshSubscription.unsubscribe();
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
|
|
2
|
+
//===========================================
|
|
3
|
+
// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
|
|
4
|
+
//===========================================
|
|
5
|
+
import { describe, expect, it } from "vitest";
|
|
6
|
+
import { analyticsOptionsFromJson, analyticsOptionsToJson } from "./session-replay";
|
|
7
|
+
|
|
8
|
+
describe("analytics option JSON conversion", () => {
|
|
9
|
+
it("preserves top-level analytics options when serializing replay block classes", () => {
|
|
10
|
+
const json = analyticsOptionsToJson({
|
|
11
|
+
enabled: false,
|
|
12
|
+
replays: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
blockClass: /stack-sensitive/u,
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
expect(json?.enabled).toBe(false);
|
|
19
|
+
expect(json?.replays?.enabled).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("preserves top-level analytics options when deserializing replay block classes", () => {
|
|
23
|
+
const roundTripped = analyticsOptionsFromJson(analyticsOptionsToJson({
|
|
24
|
+
enabled: false,
|
|
25
|
+
replays: {
|
|
26
|
+
blockClass: /stack-sensitive/u,
|
|
27
|
+
},
|
|
28
|
+
}));
|
|
29
|
+
|
|
30
|
+
expect(roundTripped?.enabled).toBe(false);
|
|
31
|
+
expect(roundTripped?.replays?.blockClass).toEqual(/stack-sensitive/u);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
|
|
2
|
+
//===========================================
|
|
3
|
+
// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
|
|
4
|
+
//===========================================
|
|
5
|
+
import { isBrowserLike } from "@hexclave/shared/dist/utils/env";
|
|
6
|
+
import { captureWarning } from "@hexclave/shared/dist/utils/errors";
|
|
7
|
+
import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
|
|
8
|
+
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
9
|
+
|
|
10
|
+
export type AnalyticsReplayOptions = {
|
|
11
|
+
/**
|
|
12
|
+
* Whether session replays are enabled.
|
|
13
|
+
*
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
16
|
+
enabled?: boolean,
|
|
17
|
+
/**
|
|
18
|
+
* Whether to mask the content of all `<input>` elements.
|
|
19
|
+
*
|
|
20
|
+
* @default true
|
|
21
|
+
*/
|
|
22
|
+
maskAllInputs?: boolean,
|
|
23
|
+
/**
|
|
24
|
+
* A CSS class name or RegExp. Elements with a matching class will be blocked
|
|
25
|
+
* (replaced with a placeholder in the recording).
|
|
26
|
+
*
|
|
27
|
+
* @default undefined
|
|
28
|
+
*/
|
|
29
|
+
blockClass?: string | RegExp,
|
|
30
|
+
/**
|
|
31
|
+
* A CSS selector string. Elements matching this selector will be blocked
|
|
32
|
+
* (replaced with a placeholder in the recording).
|
|
33
|
+
*
|
|
34
|
+
* @default undefined
|
|
35
|
+
*/
|
|
36
|
+
blockSelector?: string,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type AnalyticsOptions = {
|
|
40
|
+
/**
|
|
41
|
+
* Whether SDK-managed analytics capture is enabled.
|
|
42
|
+
*
|
|
43
|
+
* @default true
|
|
44
|
+
*/
|
|
45
|
+
enabled?: boolean,
|
|
46
|
+
/**
|
|
47
|
+
* Options for session replay recording. Replays are disabled by default;
|
|
48
|
+
* set `enabled: true` to opt in.
|
|
49
|
+
*/
|
|
50
|
+
replays?: AnalyticsReplayOptions,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Converts AnalyticsOptions to a JSON-safe representation.
|
|
55
|
+
* RegExp blockClass values are serialized as `{ __regexp, __flags }` objects.
|
|
56
|
+
* The return type is AnalyticsOptions to keep StackClientAppJson simple;
|
|
57
|
+
* the actual runtime value is JSON-safe.
|
|
58
|
+
*/
|
|
59
|
+
export function analyticsOptionsToJson(options: AnalyticsOptions | undefined): AnalyticsOptions | undefined {
|
|
60
|
+
if (!options?.replays?.blockClass) return options;
|
|
61
|
+
const { blockClass, ...rest } = options.replays;
|
|
62
|
+
if (!(blockClass instanceof RegExp)) return options;
|
|
63
|
+
return {
|
|
64
|
+
...options,
|
|
65
|
+
replays: {
|
|
66
|
+
...rest,
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
68
|
+
blockClass: { __regexp: blockClass.source, __flags: blockClass.flags } as any,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Reconstructs AnalyticsOptions from a JSON-deserialized value.
|
|
75
|
+
* Converts `{ __regexp, __flags }` objects back to RegExp instances.
|
|
76
|
+
*/
|
|
77
|
+
export function analyticsOptionsFromJson(json: AnalyticsOptions | undefined): AnalyticsOptions | undefined {
|
|
78
|
+
if (!json?.replays?.blockClass) return json;
|
|
79
|
+
const { blockClass, ...rest } = json.replays;
|
|
80
|
+
if (typeof blockClass === 'object' && '__regexp' in blockClass) {
|
|
81
|
+
const bc = blockClass as unknown as { __regexp: string, __flags: string };
|
|
82
|
+
return {
|
|
83
|
+
...json,
|
|
84
|
+
replays: {
|
|
85
|
+
...rest,
|
|
86
|
+
blockClass: new RegExp(bc.__regexp, bc.__flags),
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return json;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------- Recording internals ----------
|
|
94
|
+
|
|
95
|
+
// Hexclave rebrand: canonical localStorage prefix (colon delimiters preserved).
|
|
96
|
+
const LOCAL_STORAGE_PREFIX = "hexclave:session-replay:v1";
|
|
97
|
+
// Hexclave rebrand: legacy prefix — dual-read only, so a recording session active
|
|
98
|
+
// across an SDK upgrade is not orphaned. Never written.
|
|
99
|
+
const LEGACY_LOCAL_STORAGE_PREFIX = "stack:session-replay:v1";
|
|
100
|
+
const IDLE_TTL_MS = 3 * 60 * 1000;
|
|
101
|
+
|
|
102
|
+
const FLUSH_INTERVAL_MS = 5_000;
|
|
103
|
+
const MAX_EVENTS_PER_BATCH = 200;
|
|
104
|
+
const MAX_APPROX_BYTES_PER_BATCH = 512_000;
|
|
105
|
+
|
|
106
|
+
export type StoredSession = {
|
|
107
|
+
session_id: string,
|
|
108
|
+
created_at_ms: number,
|
|
109
|
+
last_activity_ms: number,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export function safeParseStoredSession(raw: string | null): StoredSession | null {
|
|
113
|
+
if (!raw) return null;
|
|
114
|
+
try {
|
|
115
|
+
const parsed = JSON.parse(raw);
|
|
116
|
+
if (typeof parsed !== "object" || parsed === null) return null;
|
|
117
|
+
if (typeof parsed.session_id !== "string") return null;
|
|
118
|
+
if (typeof parsed.created_at_ms !== "number") return null;
|
|
119
|
+
if (typeof parsed.last_activity_ms !== "number") return null;
|
|
120
|
+
return parsed as StoredSession;
|
|
121
|
+
} catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function makeStorageKey(projectId: string) {
|
|
127
|
+
return `${LOCAL_STORAGE_PREFIX}:${projectId}`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Hexclave rebrand: legacy key, dual-read only (never written).
|
|
131
|
+
export function makeLegacyStorageKey(projectId: string) {
|
|
132
|
+
return `${LEGACY_LOCAL_STORAGE_PREFIX}:${projectId}`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function generateUuid() {
|
|
136
|
+
return crypto.randomUUID();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function getOrRotateSession(options: { key: string, legacyKey?: string, nowMs: number }): StoredSession {
|
|
140
|
+
// Hexclave rebrand: prefer the new key; fall back to the legacy key so a
|
|
141
|
+
// recording session active across an SDK upgrade is not orphaned.
|
|
142
|
+
const existing = safeParseStoredSession(localStorage.getItem(options.key))
|
|
143
|
+
?? (options.legacyKey ? safeParseStoredSession(localStorage.getItem(options.legacyKey)) : null);
|
|
144
|
+
if (existing && options.nowMs - existing.last_activity_ms <= IDLE_TTL_MS) {
|
|
145
|
+
return existing;
|
|
146
|
+
}
|
|
147
|
+
const next: StoredSession = {
|
|
148
|
+
session_id: generateUuid(),
|
|
149
|
+
created_at_ms: options.nowMs,
|
|
150
|
+
last_activity_ms: options.nowMs,
|
|
151
|
+
};
|
|
152
|
+
localStorage.setItem(options.key, JSON.stringify(next));
|
|
153
|
+
return next;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export type SessionRecorderDeps = {
|
|
157
|
+
projectId: string,
|
|
158
|
+
sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export class SessionRecorder {
|
|
162
|
+
private _started = false;
|
|
163
|
+
private _cancelled = false;
|
|
164
|
+
private _stopRecording: (() => void) | null = null;
|
|
165
|
+
private _detachListeners: (() => void) | null = null;
|
|
166
|
+
private _flushTimer: ReturnType<typeof setInterval> | null = null;
|
|
167
|
+
private _events: unknown[] = [];
|
|
168
|
+
private _approxBytes = 0;
|
|
169
|
+
private _lastPersistActivity = 0;
|
|
170
|
+
private _recording = false;
|
|
171
|
+
private _rrwebModule: typeof import("rrweb") | null = null;
|
|
172
|
+
private _lastBrowserSessionId: string | null = null;
|
|
173
|
+
private _takingSnapshot = false;
|
|
174
|
+
private _flushInProgress = false;
|
|
175
|
+
private readonly _sessionReplaySegmentId: string;
|
|
176
|
+
private readonly _storageKey: string;
|
|
177
|
+
// Hexclave rebrand: legacy key used for dual-read fallback only.
|
|
178
|
+
private readonly _legacyStorageKey: string;
|
|
179
|
+
private readonly _deps: SessionRecorderDeps;
|
|
180
|
+
private readonly _replayOptions: AnalyticsReplayOptions;
|
|
181
|
+
|
|
182
|
+
constructor(deps: SessionRecorderDeps, replayOptions: AnalyticsReplayOptions) {
|
|
183
|
+
this._deps = deps;
|
|
184
|
+
this._replayOptions = replayOptions;
|
|
185
|
+
this._sessionReplaySegmentId = generateUuid();
|
|
186
|
+
this._storageKey = makeStorageKey(deps.projectId);
|
|
187
|
+
this._legacyStorageKey = makeLegacyStorageKey(deps.projectId);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Starts recording. Idempotent — calling multiple times is safe.
|
|
192
|
+
*/
|
|
193
|
+
start() {
|
|
194
|
+
if (this._started) return;
|
|
195
|
+
if (!isBrowserLike()) return;
|
|
196
|
+
this._started = true;
|
|
197
|
+
|
|
198
|
+
// Kick off rrweb recording
|
|
199
|
+
runAsynchronously(() => this._startRecording(), { noErrorLogging: true });
|
|
200
|
+
|
|
201
|
+
// Periodic flush
|
|
202
|
+
this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
stop() {
|
|
206
|
+
this._cancelled = true;
|
|
207
|
+
if (this._flushTimer !== null) {
|
|
208
|
+
clearInterval(this._flushTimer);
|
|
209
|
+
this._flushTimer = null;
|
|
210
|
+
}
|
|
211
|
+
// Flush remaining events before cleanup
|
|
212
|
+
runAsynchronously(() => this._flush({ keepalive: true }));
|
|
213
|
+
this._stopCurrentRecording();
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
clearBuffer() {
|
|
217
|
+
this._events = [];
|
|
218
|
+
this._approxBytes = 0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private _persistActivity(nowMs: number): StoredSession {
|
|
222
|
+
const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });
|
|
223
|
+
if (nowMs - this._lastPersistActivity < 5_000) return stored;
|
|
224
|
+
this._lastPersistActivity = nowMs;
|
|
225
|
+
const updated: StoredSession = { ...stored, last_activity_ms: nowMs };
|
|
226
|
+
localStorage.setItem(this._storageKey, JSON.stringify(updated));
|
|
227
|
+
return stored;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private async _flush(options: { keepalive: boolean }) {
|
|
231
|
+
if (this._events.length === 0) return;
|
|
232
|
+
// Prevent concurrent in-flight HTTP requests. When a flush is already
|
|
233
|
+
// in-flight, a second batch could race on the server (both call
|
|
234
|
+
// findRecentSessionReplay before either upsert commits) and create
|
|
235
|
+
// duplicate SessionReplay records. Events stay in _events and will be
|
|
236
|
+
// picked up by the next tick or batch-size check.
|
|
237
|
+
if (this._flushInProgress) return;
|
|
238
|
+
|
|
239
|
+
const nowMs = Date.now();
|
|
240
|
+
const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });
|
|
241
|
+
|
|
242
|
+
const batchId = generateUuid();
|
|
243
|
+
const payload = {
|
|
244
|
+
browser_session_id: stored.session_id,
|
|
245
|
+
session_replay_segment_id: this._sessionReplaySegmentId,
|
|
246
|
+
batch_id: batchId,
|
|
247
|
+
started_at_ms: stored.created_at_ms,
|
|
248
|
+
sent_at_ms: nowMs,
|
|
249
|
+
events: this._events,
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
this._events = [];
|
|
253
|
+
this._approxBytes = 0;
|
|
254
|
+
|
|
255
|
+
this._flushInProgress = true;
|
|
256
|
+
try {
|
|
257
|
+
const res = await this._deps.sendBatch(
|
|
258
|
+
JSON.stringify(payload),
|
|
259
|
+
{ keepalive: options.keepalive },
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
if (res.status === "error") {
|
|
263
|
+
captureWarning("SessionRecorder.flush", res.error);
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (!res.data.ok) {
|
|
268
|
+
captureWarning("SessionRecorder.flush", new Error(`SessionRecorder flush failed: ${res.data.status} ${await res.data.text()}`));
|
|
269
|
+
}
|
|
270
|
+
} finally {
|
|
271
|
+
this._flushInProgress = false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
private async _startRecording() {
|
|
276
|
+
if (this._recording || this._cancelled) return;
|
|
277
|
+
|
|
278
|
+
if (!this._rrwebModule) {
|
|
279
|
+
const rrwebImport = await Result.fromPromise(import("rrweb"));
|
|
280
|
+
if (rrwebImport.status === "error") {
|
|
281
|
+
console.warn("SessionRecorder: rrweb import failed. Is rrweb installed?", rrwebImport.error);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
this._rrwebModule = rrwebImport.data;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// cancelled may change during the await above
|
|
288
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
289
|
+
if (this._cancelled) return;
|
|
290
|
+
|
|
291
|
+
this._stopRecording = this._rrwebModule.record({
|
|
292
|
+
emit: (event) => {
|
|
293
|
+
const nowMs = Date.now();
|
|
294
|
+
const stored = this._persistActivity(nowMs);
|
|
295
|
+
|
|
296
|
+
// Detect session rotation: after 3+ minutes idle, getOrRotateSession
|
|
297
|
+
// creates a new session ID. We need to inject a FullSnapshot so the
|
|
298
|
+
// new server-side SessionReplay record is playable.
|
|
299
|
+
if (this._lastBrowserSessionId === null) {
|
|
300
|
+
this._lastBrowserSessionId = stored.session_id;
|
|
301
|
+
} else if (stored.session_id !== this._lastBrowserSessionId && !this._takingSnapshot) {
|
|
302
|
+
this._lastBrowserSessionId = stored.session_id;
|
|
303
|
+
// Inject a FullSnapshot for the new session (calls emit synchronously)
|
|
304
|
+
this._takingSnapshot = true;
|
|
305
|
+
try {
|
|
306
|
+
this._rrwebModule!.record.takeFullSnapshot();
|
|
307
|
+
} finally {
|
|
308
|
+
this._takingSnapshot = false;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
this._events.push(event);
|
|
313
|
+
this._approxBytes += JSON.stringify(event).length;
|
|
314
|
+
if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {
|
|
315
|
+
runAsynchronously(() => this._flush({ keepalive: false }));
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
maskAllInputs: this._replayOptions.maskAllInputs ?? true,
|
|
319
|
+
...(this._replayOptions.blockClass !== undefined ? { blockClass: this._replayOptions.blockClass } : {}),
|
|
320
|
+
...(this._replayOptions.blockSelector !== undefined ? { blockSelector: this._replayOptions.blockSelector } : {}),
|
|
321
|
+
}) ?? null;
|
|
322
|
+
|
|
323
|
+
this._recording = true;
|
|
324
|
+
|
|
325
|
+
const onPageHide = () => {
|
|
326
|
+
runAsynchronously(() => this._flush({ keepalive: true }));
|
|
327
|
+
};
|
|
328
|
+
window.addEventListener("pagehide", onPageHide);
|
|
329
|
+
document.addEventListener("visibilitychange", onPageHide);
|
|
330
|
+
this._detachListeners = () => {
|
|
331
|
+
window.removeEventListener("pagehide", onPageHide);
|
|
332
|
+
document.removeEventListener("visibilitychange", onPageHide);
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
private _stopCurrentRecording() {
|
|
337
|
+
if (this._detachListeners) {
|
|
338
|
+
this._detachListeners();
|
|
339
|
+
this._detachListeners = null;
|
|
340
|
+
}
|
|
341
|
+
if (this._stopRecording) {
|
|
342
|
+
this._stopRecording();
|
|
343
|
+
this._stopRecording = null;
|
|
344
|
+
}
|
|
345
|
+
this._events = [];
|
|
346
|
+
this._approxBytes = 0;
|
|
347
|
+
this._recording = false;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
private _tick() {
|
|
351
|
+
if (this._cancelled) return;
|
|
352
|
+
if (this._events.length > 0) {
|
|
353
|
+
runAsynchronously(() => this._flush({ keepalive: false }));
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
|
|
2
|
+
//===========================================
|
|
3
|
+
// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
|
|
4
|
+
//===========================================
|
|
5
|
+
export {
|
|
6
|
+
HexclaveClientApp,
|
|
7
|
+
StackClientApp
|
|
8
|
+
} from "./interfaces/client-app";
|
|
9
|
+
// HexclaveClientApp / StackClientApp are exported above as classes (TS treats classes as
|
|
10
|
+
// both value + type), so only the helper types need a separate type-only re-export here.
|
|
11
|
+
export type {
|
|
12
|
+
HexclaveClientAppConstructor,
|
|
13
|
+
HexclaveClientAppConstructorOptions,
|
|
14
|
+
HexclaveClientAppJson,
|
|
15
|
+
StackClientAppConstructor,
|
|
16
|
+
StackClientAppConstructorOptions,
|
|
17
|
+
StackClientAppJson
|
|
18
|
+
} from "./interfaces/client-app";
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
HexclaveServerApp,
|
|
22
|
+
StackServerApp
|
|
23
|
+
} from "./interfaces/server-app";
|
|
24
|
+
export type {
|
|
25
|
+
HexclaveServerAppConstructor,
|
|
26
|
+
HexclaveServerAppConstructorOptions,
|
|
27
|
+
StackServerAppConstructor,
|
|
28
|
+
StackServerAppConstructorOptions
|
|
29
|
+
} from "./interfaces/server-app";
|
|
30
|
+
|
|
31
|
+
export {
|
|
32
|
+
HexclaveAdminApp,
|
|
33
|
+
StackAdminApp
|
|
34
|
+
} from "./interfaces/admin-app";
|
|
35
|
+
export type {
|
|
36
|
+
HexclaveAdminAppConstructor,
|
|
37
|
+
HexclaveAdminAppConstructorOptions,
|
|
38
|
+
StackAdminAppConstructor,
|
|
39
|
+
StackAdminAppConstructorOptions,
|
|
40
|
+
} from "./interfaces/admin-app";
|