@hexclave/js 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +26 -0
- package/dist/chunk-BE-pF4vm.js +34 -0
- package/dist/dev-tool/dev-tool-core.d.ts +7 -0
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -0
- package/dist/dev-tool/dev-tool-core.js +2116 -0
- package/dist/dev-tool/dev-tool-core.js.map +1 -0
- package/dist/dev-tool/dev-tool-styles.d.ts +5 -0
- package/dist/dev-tool/dev-tool-styles.d.ts.map +1 -0
- package/dist/dev-tool/dev-tool-styles.js +2757 -0
- package/dist/dev-tool/dev-tool-styles.js.map +1 -0
- package/dist/dev-tool/dev-tool-trigger-position.d.ts +36 -0
- package/dist/dev-tool/dev-tool-trigger-position.d.ts.map +1 -0
- package/dist/dev-tool/dev-tool-trigger-position.js +70 -0
- package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -0
- package/dist/dev-tool/dev-tool-trigger-position.test.d.ts +1 -0
- package/dist/dev-tool/dev-tool-trigger-position.test.js +155 -0
- package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -0
- package/dist/dev-tool/index.d.ts +19 -0
- package/dist/dev-tool/index.d.ts.map +1 -0
- package/dist/dev-tool/index.js +119 -0
- package/dist/dev-tool/index.js.map +1 -0
- package/dist/esm/dev-tool/dev-tool-core.d.ts +7 -0
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -0
- package/dist/esm/dev-tool/dev-tool-core.js +2114 -0
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -0
- package/dist/esm/dev-tool/dev-tool-styles.d.ts +5 -0
- package/dist/esm/dev-tool/dev-tool-styles.d.ts.map +1 -0
- package/dist/esm/dev-tool/dev-tool-styles.js +2755 -0
- package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts +36 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.d.ts.map +1 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.js +65 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.d.ts +1 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +155 -0
- package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -0
- package/dist/esm/dev-tool/index.d.ts +19 -0
- package/dist/esm/dev-tool/index.d.ts.map +1 -0
- package/dist/esm/dev-tool/index.js +117 -0
- package/dist/esm/dev-tool/index.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/integrations/convex/component/convex.config.d.ts +7 -0
- package/dist/esm/integrations/convex/component/convex.config.d.ts.map +1 -0
- package/dist/esm/integrations/convex/component/convex.config.js +8 -0
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -0
- package/dist/esm/integrations/convex.d.ts +13 -0
- package/dist/esm/integrations/convex.d.ts.map +1 -0
- package/dist/esm/integrations/convex.js +23 -0
- package/dist/esm/integrations/convex.js.map +1 -0
- package/dist/esm/internal/deprecation-warning.d.ts +1 -0
- package/dist/esm/internal/deprecation-warning.js +24 -0
- package/dist/esm/internal/deprecation-warning.js.map +1 -0
- package/dist/esm/lib/auth.d.ts +31 -0
- package/dist/esm/lib/auth.d.ts.map +1 -0
- package/dist/esm/lib/auth.js +108 -0
- package/dist/esm/lib/auth.js.map +1 -0
- package/dist/esm/lib/auth.test.d.ts +1 -0
- package/dist/esm/lib/auth.test.js +60 -0
- package/dist/esm/lib/auth.test.js.map +1 -0
- package/dist/esm/lib/cookie.d.ts +42 -0
- package/dist/esm/lib/cookie.d.ts.map +1 -0
- package/dist/esm/lib/cookie.js +287 -0
- package/dist/esm/lib/cookie.js.map +1 -0
- package/dist/esm/lib/env.d.ts +42 -0
- package/dist/esm/lib/env.d.ts.map +1 -0
- package/dist/esm/lib/env.js +93 -0
- package/dist/esm/lib/env.js.map +1 -0
- package/dist/esm/lib/stack-app/api-keys/index.d.ts +53 -0
- package/dist/esm/lib/stack-app/api-keys/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/api-keys/index.js +22 -0
- package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts +364 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +924 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +55 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +542 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +2504 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +32 -0
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/common.d.ts +65 -0
- package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/common.js +127 -0
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.d.ts +42 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js +211 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js +87 -0
- package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +9 -0
- package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/index.js +27 -0
- package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.d.ts +35 -0
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js +197 -0
- package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.d.ts +203 -0
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +1094 -0
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts +28 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js +31 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js +82 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts +111 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.js +241 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js +29 -0
- package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/index.d.ts +4 -0
- package/dist/esm/lib/stack-app/apps/index.js +5 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts +244 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +9 -0
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts +208 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +9 -0
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts +116 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +9 -0
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
- package/dist/esm/lib/stack-app/common.d.ts +174 -0
- package/dist/esm/lib/stack-app/common.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/common.js +7 -0
- package/dist/esm/lib/stack-app/common.js.map +1 -0
- package/dist/esm/lib/stack-app/connected-accounts/index.d.ts +40 -0
- package/dist/esm/lib/stack-app/connected-accounts/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/connected-accounts/index.js +1 -0
- package/dist/esm/lib/stack-app/contact-channels/index.d.ts +43 -0
- package/dist/esm/lib/stack-app/contact-channels/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/contact-channels/index.js +39 -0
- package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -0
- package/dist/esm/lib/stack-app/customers/index.d.ts +129 -0
- package/dist/esm/lib/stack-app/customers/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/customers/index.js +1 -0
- package/dist/esm/lib/stack-app/data-vault/index.d.ts +14 -0
- package/dist/esm/lib/stack-app/data-vault/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/data-vault/index.js +1 -0
- package/dist/esm/lib/stack-app/email/index.d.ts +204 -0
- package/dist/esm/lib/stack-app/email/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/email/index.js +1 -0
- package/dist/esm/lib/stack-app/email-templates/index.d.ts +17 -0
- package/dist/esm/lib/stack-app/email-templates/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/email-templates/index.js +11 -0
- package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -0
- package/dist/esm/lib/stack-app/index.d.ts +14 -0
- package/dist/esm/lib/stack-app/index.js +5 -0
- package/dist/esm/lib/stack-app/internal-api-keys/index.d.ts +42 -0
- package/dist/esm/lib/stack-app/internal-api-keys/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/internal-api-keys/index.js +14 -0
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -0
- package/dist/esm/lib/stack-app/notification-categories/index.d.ts +11 -0
- package/dist/esm/lib/stack-app/notification-categories/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/notification-categories/index.js +1 -0
- package/dist/esm/lib/stack-app/permissions/index.d.ts +43 -0
- package/dist/esm/lib/stack-app/permissions/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/permissions/index.js +31 -0
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -0
- package/dist/esm/lib/stack-app/project-configs/index.d.ts +99 -0
- package/dist/esm/lib/stack-app/project-configs/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/project-configs/index.js +1 -0
- package/dist/esm/lib/stack-app/projects/index.d.ts +145 -0
- package/dist/esm/lib/stack-app/projects/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/projects/index.js +66 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -0
- package/dist/esm/lib/stack-app/session-replays/index.d.ts +66 -0
- package/dist/esm/lib/stack-app/session-replays/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/session-replays/index.js +1 -0
- package/dist/esm/lib/stack-app/teams/index.d.ts +160 -0
- package/dist/esm/lib/stack-app/teams/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/teams/index.js +35 -0
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -0
- package/dist/esm/lib/stack-app/url-targets.d.ts +39 -0
- package/dist/esm/lib/stack-app/url-targets.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/url-targets.js +266 -0
- package/dist/esm/lib/stack-app/url-targets.js.map +1 -0
- package/dist/esm/lib/stack-app/url-targets.test.d.ts +1 -0
- package/dist/esm/lib/stack-app/url-targets.test.js +213 -0
- package/dist/esm/lib/stack-app/url-targets.test.js.map +1 -0
- package/dist/esm/lib/stack-app/users/index.d.ts +357 -0
- package/dist/esm/lib/stack-app/users/index.d.ts.map +1 -0
- package/dist/esm/lib/stack-app/users/index.js +71 -0
- package/dist/esm/lib/stack-app/users/index.js.map +1 -0
- package/dist/esm/utils/url.d.ts +5 -0
- package/dist/esm/utils/url.d.ts.map +1 -0
- package/dist/esm/utils/url.js +16 -0
- package/dist/esm/utils/url.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +31 -0
- package/dist/integrations/convex/component/convex.config.d.ts +61 -0
- package/dist/integrations/convex/component/convex.config.d.ts.map +1 -0
- package/dist/integrations/convex/component/convex.config.js +9 -0
- package/dist/integrations/convex/component/convex.config.js.map +1 -0
- package/dist/integrations/convex.d.ts +13 -0
- package/dist/integrations/convex.d.ts.map +1 -0
- package/dist/integrations/convex.js +25 -0
- package/dist/integrations/convex.js.map +1 -0
- package/dist/internal/deprecation-warning.d.ts +1 -0
- package/dist/internal/deprecation-warning.js +24 -0
- package/dist/internal/deprecation-warning.js.map +1 -0
- package/dist/lib/auth.d.ts +31 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +111 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/auth.test.d.ts +1 -0
- package/dist/lib/auth.test.js +60 -0
- package/dist/lib/auth.test.js.map +1 -0
- package/dist/lib/cookie.d.ts +42 -0
- package/dist/lib/cookie.d.ts.map +1 -0
- package/dist/lib/cookie.js +305 -0
- package/dist/lib/cookie.js.map +1 -0
- package/dist/lib/env.d.ts +42 -0
- package/dist/lib/env.d.ts.map +1 -0
- package/dist/lib/env.js +95 -0
- package/dist/lib/env.js.map +1 -0
- package/dist/lib/stack-app/api-keys/index.d.ts +53 -0
- package/dist/lib/stack-app/api-keys/index.d.ts.map +1 -0
- package/dist/lib/stack-app/api-keys/index.js +25 -0
- package/dist/lib/stack-app/api-keys/index.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +362 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +926 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js +55 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +541 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +2507 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js +32 -0
- package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/common.d.ts +65 -0
- package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/common.js +144 -0
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts +42 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.js +213 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +87 -0
- package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/index.d.ts +9 -0
- package/dist/lib/stack-app/apps/implementations/index.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/index.js +31 -0
- package/dist/lib/stack-app/apps/implementations/index.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts +35 -0
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js +201 -0
- package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts +203 -0
- package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +1096 -0
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts +28 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js +33 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js +82 -0
- package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.d.ts +111 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.js +250 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.js.map +1 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.test.d.ts +1 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.test.js +29 -0
- package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +1 -0
- package/dist/lib/stack-app/apps/index.d.ts +4 -0
- package/dist/lib/stack-app/apps/index.js +42 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +244 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.js +12 -0
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +208 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.js +12 -0
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -0
- package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +116 -0
- package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -0
- package/dist/lib/stack-app/apps/interfaces/server-app.js +12 -0
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -0
- package/dist/lib/stack-app/common.d.ts +174 -0
- package/dist/lib/stack-app/common.d.ts.map +1 -0
- package/dist/lib/stack-app/common.js +9 -0
- package/dist/lib/stack-app/common.js.map +1 -0
- package/dist/lib/stack-app/connected-accounts/index.d.ts +40 -0
- package/dist/lib/stack-app/connected-accounts/index.d.ts.map +1 -0
- package/dist/lib/stack-app/connected-accounts/index.js +0 -0
- package/dist/lib/stack-app/contact-channels/index.d.ts +43 -0
- package/dist/lib/stack-app/contact-channels/index.d.ts.map +1 -0
- package/dist/lib/stack-app/contact-channels/index.js +44 -0
- package/dist/lib/stack-app/contact-channels/index.js.map +1 -0
- package/dist/lib/stack-app/customers/index.d.ts +129 -0
- package/dist/lib/stack-app/customers/index.d.ts.map +1 -0
- package/dist/lib/stack-app/customers/index.js +0 -0
- package/dist/lib/stack-app/data-vault/index.d.ts +14 -0
- package/dist/lib/stack-app/data-vault/index.d.ts.map +1 -0
- package/dist/lib/stack-app/data-vault/index.js +0 -0
- package/dist/lib/stack-app/email/index.d.ts +204 -0
- package/dist/lib/stack-app/email/index.d.ts.map +1 -0
- package/dist/lib/stack-app/email/index.js +0 -0
- package/dist/lib/stack-app/email-templates/index.d.ts +17 -0
- package/dist/lib/stack-app/email-templates/index.d.ts.map +1 -0
- package/dist/lib/stack-app/email-templates/index.js +13 -0
- package/dist/lib/stack-app/email-templates/index.js.map +1 -0
- package/dist/lib/stack-app/index.d.ts +15 -0
- package/dist/lib/stack-app/index.js +54 -0
- package/dist/lib/stack-app/internal-api-keys/index.d.ts +42 -0
- package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +1 -0
- package/dist/lib/stack-app/internal-api-keys/index.js +16 -0
- package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -0
- package/dist/lib/stack-app/notification-categories/index.d.ts +11 -0
- package/dist/lib/stack-app/notification-categories/index.d.ts.map +1 -0
- package/dist/lib/stack-app/notification-categories/index.js +0 -0
- package/dist/lib/stack-app/permissions/index.d.ts +43 -0
- package/dist/lib/stack-app/permissions/index.d.ts.map +1 -0
- package/dist/lib/stack-app/permissions/index.js +36 -0
- package/dist/lib/stack-app/permissions/index.js.map +1 -0
- package/dist/lib/stack-app/project-configs/index.d.ts +99 -0
- package/dist/lib/stack-app/project-configs/index.d.ts.map +1 -0
- package/dist/lib/stack-app/project-configs/index.js +0 -0
- package/dist/lib/stack-app/projects/index.d.ts +145 -0
- package/dist/lib/stack-app/projects/index.d.ts.map +1 -0
- package/dist/lib/stack-app/projects/index.js +69 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -0
- package/dist/lib/stack-app/session-replays/index.d.ts +66 -0
- package/dist/lib/stack-app/session-replays/index.d.ts.map +1 -0
- package/dist/lib/stack-app/session-replays/index.js +0 -0
- package/dist/lib/stack-app/teams/index.d.ts +160 -0
- package/dist/lib/stack-app/teams/index.d.ts.map +1 -0
- package/dist/lib/stack-app/teams/index.js +40 -0
- package/dist/lib/stack-app/teams/index.js.map +1 -0
- package/dist/lib/stack-app/url-targets.d.ts +39 -0
- package/dist/lib/stack-app/url-targets.d.ts.map +1 -0
- package/dist/lib/stack-app/url-targets.js +274 -0
- package/dist/lib/stack-app/url-targets.js.map +1 -0
- package/dist/lib/stack-app/url-targets.test.d.ts +1 -0
- package/dist/lib/stack-app/url-targets.test.js +213 -0
- package/dist/lib/stack-app/url-targets.test.js.map +1 -0
- package/dist/lib/stack-app/users/index.d.ts +357 -0
- package/dist/lib/stack-app/users/index.d.ts.map +1 -0
- package/dist/lib/stack-app/users/index.js +76 -0
- package/dist/lib/stack-app/users/index.js.map +1 -0
- package/dist/storage-CKsyME2q.d.ts +1912 -0
- package/dist/storage-CKsyME2q.d.ts.map +1 -0
- package/dist/utils/url.d.ts +5 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +18 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { HandlerUrlOptions, ResolvedHandlerUrls, stackAppInternalsSymbol } from "../../common.js";
|
|
2
|
+
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
3
|
+
import { InternalSession } from "@hexclave/shared/dist/sessions";
|
|
4
|
+
import { Store } from "@hexclave/shared/dist/utils/stores";
|
|
5
|
+
import { AsyncCache } from "@hexclave/shared/dist/utils/caches";
|
|
6
|
+
|
|
7
|
+
//#region src/lib/stack-app/apps/implementations/common.d.ts
|
|
8
|
+
declare const clientVersion = "STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL";
|
|
9
|
+
declare const createCache: <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => AsyncCache<D, Result<T>>;
|
|
10
|
+
declare const createCacheBySession: <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T>) => AsyncCache<[InternalSession, ...D], Result<T>>;
|
|
11
|
+
type AppLike = {
|
|
12
|
+
[stackAppInternalsSymbol]: {
|
|
13
|
+
getConstructorOptions: () => any;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
declare function resolveConstructorOptions<T extends {
|
|
17
|
+
inheritsFrom?: AppLike;
|
|
18
|
+
}>(options: T): T & {
|
|
19
|
+
inheritsFrom?: undefined;
|
|
20
|
+
};
|
|
21
|
+
declare function getUrls(partial: HandlerUrlOptions, options: {
|
|
22
|
+
projectId: string;
|
|
23
|
+
}): ResolvedHandlerUrls;
|
|
24
|
+
declare function getDefaultProjectId(): string;
|
|
25
|
+
declare function getDefaultPublishableClientKey(): string | undefined;
|
|
26
|
+
declare function getDefaultSecretServerKey(): string;
|
|
27
|
+
declare function getDefaultSuperSecretAdminKey(): string;
|
|
28
|
+
declare function getDefaultExtraRequestHeaders(): any;
|
|
29
|
+
/**
|
|
30
|
+
* Returns the base URL for the Stack API.
|
|
31
|
+
*
|
|
32
|
+
* The URL can be specified in several ways, in order of precedence:
|
|
33
|
+
* 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object
|
|
34
|
+
* 2. Through environment variables:
|
|
35
|
+
* - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL
|
|
36
|
+
* - Server: NEXT_PUBLIC_SERVER_STACK_API_URL
|
|
37
|
+
* - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL
|
|
38
|
+
* 3. Default base URL if none of the above are specified
|
|
39
|
+
*
|
|
40
|
+
* The function also ensures the URL doesn't end with a trailing slash
|
|
41
|
+
* by removing it if present.
|
|
42
|
+
*
|
|
43
|
+
* @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object
|
|
44
|
+
* @returns The configured base URL without trailing slash
|
|
45
|
+
|
|
46
|
+
*/
|
|
47
|
+
declare function getBaseUrl(userSpecifiedBaseUrl: string | {
|
|
48
|
+
browser: string;
|
|
49
|
+
server: string;
|
|
50
|
+
} | undefined): string;
|
|
51
|
+
declare const defaultBaseUrl = "https://api.hexclave.com";
|
|
52
|
+
declare const defaultAnalyticsBaseUrl = "https://r.hexclave.com";
|
|
53
|
+
declare function getAnalyticsBaseUrl(regularBaseUrl: string): string;
|
|
54
|
+
declare function resolveApiUrls(userExplicitBaseUrl: string | {
|
|
55
|
+
browser: string;
|
|
56
|
+
server: string;
|
|
57
|
+
} | undefined): () => string[];
|
|
58
|
+
type TokenObject = {
|
|
59
|
+
accessToken: string | null;
|
|
60
|
+
refreshToken: string | null;
|
|
61
|
+
};
|
|
62
|
+
declare function createEmptyTokenStore(): Store<TokenObject>;
|
|
63
|
+
//#endregion
|
|
64
|
+
export { TokenObject, clientVersion, createCache, createCacheBySession, createEmptyTokenStore, defaultAnalyticsBaseUrl, defaultBaseUrl, getAnalyticsBaseUrl, getBaseUrl, getDefaultExtraRequestHeaders, getDefaultProjectId, getDefaultPublishableClientKey, getDefaultSecretServerKey, getDefaultSuperSecretAdminKey, getUrls, resolveApiUrls, resolveConstructorOptions };
|
|
65
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"mappings":";;;;;;;cAmBa,aAAA;AAAA,cAYA,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,uBAAA;IAA4B,qBAAA;EAAA;AAAA;AAAA,iBAC9B,yBAAA;EAAsC,YAAA,GAAe,OAAA;AAAA,EAAA,CAAW,OAAA,EAAS,CAAA,GAAI,CAAA;EAAM,YAAA;AAAA;AAAA,iBAOnF,OAAA,CAAQ,OAAA,EAAS,iBAAA,EAAmB,OAAA;EAAW,SAAA;AAAA,IAAsB,mBAAA;AAAA,iBAOrE,mBAAA,CAAA;AAAA,iBAIA,8BAAA,CAAA;AAAA,iBAIA,yBAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;;;;;;;;;;;;AA5ChB;;;;;;;iBAkEgB,UAAA,CAAW,oBAAA;EAAiC,OAAA;EAAiB,MAAA;AAAA;AAAA,cAwBhE,cAAA;AAAA,cACA,uBAAA;AAAA,iBAOG,mBAAA,CAAoB,cAAA;AAAA,iBA0BpB,cAAA,CAAe,mBAAA;EAAgC,OAAA;EAAiB,MAAA;AAAA;AAAA,KAcpE,WAAA;EACV,WAAA;EACA,YAAA;AAAA;AAAA,iBAGc,qBAAA,CAAA,GAAqB,KAAA,CAAA,WAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_chunk = require('../../../../chunk-BE-pF4vm.js');
|
|
3
|
+
let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
4
|
+
let _stackframe_stack_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
|
|
5
|
+
let _stackframe_stack_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
6
|
+
let _stackframe_stack_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
|
|
7
|
+
let _stackframe_stack_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
|
|
8
|
+
let _stackframe_stack_shared_dist_utils_objects = require("@hexclave/shared/dist/utils/objects");
|
|
9
|
+
let ______common_js = require("../../common.js");
|
|
10
|
+
let _stackframe_stack_shared_dist_utils_stores = require("@hexclave/shared/dist/utils/stores");
|
|
11
|
+
let _________env_js = require("../../../env.js");
|
|
12
|
+
let ______url_targets_js = require("../../url-targets.js");
|
|
13
|
+
let _stackframe_stack_shared_dist_utils_caches = require("@hexclave/shared/dist/utils/caches");
|
|
14
|
+
let _stackframe_stack_shared_dist_utils_globals = require("@hexclave/shared/dist/utils/globals");
|
|
15
|
+
|
|
16
|
+
//#region src/lib/stack-app/apps/implementations/common.ts
|
|
17
|
+
const clientVersion = "js @hexclave/js@1.0.0";
|
|
18
|
+
if (clientVersion.startsWith("STACK_COMPILE_TIME")) throw new _stackframe_stack_shared_dist_utils_errors.HexclaveAssertionError("Client version was not replaced. Something went wrong during build!");
|
|
19
|
+
const replaceStackPortPrefix = (input) => {
|
|
20
|
+
if (!input) return input;
|
|
21
|
+
const prefix = _________env_js.envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX;
|
|
22
|
+
return prefix ? input.replace(/\$\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\}/g, prefix) : input;
|
|
23
|
+
};
|
|
24
|
+
const createCache = (fetcher) => {
|
|
25
|
+
return new _stackframe_stack_shared_dist_utils_caches.AsyncCache(async (dependencies) => await _stackframe_stack_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(dependencies)), {});
|
|
26
|
+
};
|
|
27
|
+
const createCacheBySession = (fetcher) => {
|
|
28
|
+
return new _stackframe_stack_shared_dist_utils_caches.AsyncCache(async ([session, ...extraDependencies]) => await _stackframe_stack_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)), { onSubscribe: ([session], refresh) => {
|
|
29
|
+
const handler = session.onInvalidate(() => refresh());
|
|
30
|
+
return () => handler.unsubscribe();
|
|
31
|
+
} });
|
|
32
|
+
};
|
|
33
|
+
function resolveConstructorOptions(options) {
|
|
34
|
+
return {
|
|
35
|
+
...options.inheritsFrom?.[______common_js.stackAppInternalsSymbol].getConstructorOptions() ?? {},
|
|
36
|
+
...(0, _stackframe_stack_shared_dist_utils_objects.filterUndefined)((0, _stackframe_stack_shared_dist_utils_objects.omit)(options, ["inheritsFrom"]))
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function getUrls(partial, options) {
|
|
40
|
+
return (0, ______url_targets_js.resolveHandlerUrls)({
|
|
41
|
+
urls: partial,
|
|
42
|
+
projectId: options.projectId
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function getDefaultProjectId() {
|
|
46
|
+
return _________env_js.envVars.NEXT_PUBLIC_STACK_PROJECT_ID || _________env_js.envVars.STACK_PROJECT_ID || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("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 NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
|
|
47
|
+
}
|
|
48
|
+
function getDefaultPublishableClientKey() {
|
|
49
|
+
return _________env_js.envVars.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || _________env_js.envVars.STACK_PUBLISHABLE_CLIENT_KEY;
|
|
50
|
+
}
|
|
51
|
+
function getDefaultSecretServerKey() {
|
|
52
|
+
return _________env_js.envVars.STACK_SECRET_SERVER_KEY || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable."));
|
|
53
|
+
}
|
|
54
|
+
function getDefaultSuperSecretAdminKey() {
|
|
55
|
+
return _________env_js.envVars.STACK_SUPER_SECRET_ADMIN_KEY || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable."));
|
|
56
|
+
}
|
|
57
|
+
function getDefaultExtraRequestHeaders() {
|
|
58
|
+
return JSON.parse(_________env_js.envVars.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || _________env_js.envVars.STACK_EXTRA_REQUEST_HEADERS || "{}");
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns the base URL for the Stack API.
|
|
62
|
+
*
|
|
63
|
+
* The URL can be specified in several ways, in order of precedence:
|
|
64
|
+
* 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object
|
|
65
|
+
* 2. Through environment variables:
|
|
66
|
+
* - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL
|
|
67
|
+
* - Server: NEXT_PUBLIC_SERVER_STACK_API_URL
|
|
68
|
+
* - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL
|
|
69
|
+
* 3. Default base URL if none of the above are specified
|
|
70
|
+
*
|
|
71
|
+
* The function also ensures the URL doesn't end with a trailing slash
|
|
72
|
+
* by removing it if present.
|
|
73
|
+
*
|
|
74
|
+
* @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object
|
|
75
|
+
* @returns The configured base URL without trailing slash
|
|
76
|
+
|
|
77
|
+
*/
|
|
78
|
+
function getBaseUrl(userSpecifiedBaseUrl) {
|
|
79
|
+
let url;
|
|
80
|
+
if (userSpecifiedBaseUrl) if (typeof userSpecifiedBaseUrl === "string") url = userSpecifiedBaseUrl;
|
|
81
|
+
else if ((0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) url = userSpecifiedBaseUrl.browser;
|
|
82
|
+
else url = userSpecifiedBaseUrl.server;
|
|
83
|
+
else {
|
|
84
|
+
if ((0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) url = _________env_js.envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || _________env_js.envVars.STACK_API_URL_BROWSER;
|
|
85
|
+
else url = _________env_js.envVars.NEXT_PUBLIC_SERVER_STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL_SERVER || _________env_js.envVars.STACK_API_URL_SERVER;
|
|
86
|
+
url = url || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL || _________env_js.envVars.STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
|
|
87
|
+
}
|
|
88
|
+
return replaceStackPortPrefix(url.endsWith("/") ? url.slice(0, -1) : url);
|
|
89
|
+
}
|
|
90
|
+
const defaultBaseUrl = "https://api.hexclave.com";
|
|
91
|
+
const defaultAnalyticsBaseUrl = "https://r.hexclave.com";
|
|
92
|
+
const analyticsBaseUrlsByApiBaseUrl = new Map([[defaultBaseUrl, defaultAnalyticsBaseUrl], ["https://api.stack-auth.com", "https://r.stack-auth.com"]]);
|
|
93
|
+
function getAnalyticsBaseUrl(regularBaseUrl) {
|
|
94
|
+
return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;
|
|
95
|
+
}
|
|
96
|
+
function fetchBackendUrlsInBackground(primaryBaseUrl) {
|
|
97
|
+
(0, _stackframe_stack_shared_dist_utils_globals.createGlobal)("__stack-fetch-backend-urls-started", () => {
|
|
98
|
+
(0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(async () => {
|
|
99
|
+
try {
|
|
100
|
+
const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);
|
|
101
|
+
if (!res.ok) return;
|
|
102
|
+
const data = await res.json();
|
|
103
|
+
if (!Array.isArray(data.urls) || !data.urls.every((u) => typeof u === "string")) return;
|
|
104
|
+
(0, _stackframe_stack_shared_dist_utils_globals.createGlobal)("__stack-fetched-backend-urls", () => data.urls);
|
|
105
|
+
} catch (e) {
|
|
106
|
+
(0, _stackframe_stack_shared_dist_utils_errors.captureError)("fetch-backend-urls-in-background", e);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return true;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function resolveApiUrls(userExplicitBaseUrl) {
|
|
113
|
+
return () => {
|
|
114
|
+
if (userExplicitBaseUrl != null) return [getBaseUrl(userExplicitBaseUrl)];
|
|
115
|
+
const primary = getBaseUrl(void 0);
|
|
116
|
+
fetchBackendUrlsInBackground(primary);
|
|
117
|
+
return (0, _stackframe_stack_shared_dist_utils_globals.getGlobal)("__stack-fetched-backend-urls") ?? (0, _stackframe_stack_shared_dist_utils_urls.getDefaultApiUrls)(primary);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function createEmptyTokenStore() {
|
|
121
|
+
return new _stackframe_stack_shared_dist_utils_stores.Store({
|
|
122
|
+
refreshToken: null,
|
|
123
|
+
accessToken: null
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//#endregion
|
|
128
|
+
exports.clientVersion = clientVersion;
|
|
129
|
+
exports.createCache = createCache;
|
|
130
|
+
exports.createCacheBySession = createCacheBySession;
|
|
131
|
+
exports.createEmptyTokenStore = createEmptyTokenStore;
|
|
132
|
+
exports.defaultAnalyticsBaseUrl = defaultAnalyticsBaseUrl;
|
|
133
|
+
exports.defaultBaseUrl = defaultBaseUrl;
|
|
134
|
+
exports.getAnalyticsBaseUrl = getAnalyticsBaseUrl;
|
|
135
|
+
exports.getBaseUrl = getBaseUrl;
|
|
136
|
+
exports.getDefaultExtraRequestHeaders = getDefaultExtraRequestHeaders;
|
|
137
|
+
exports.getDefaultProjectId = getDefaultProjectId;
|
|
138
|
+
exports.getDefaultPublishableClientKey = getDefaultPublishableClientKey;
|
|
139
|
+
exports.getDefaultSecretServerKey = getDefaultSecretServerKey;
|
|
140
|
+
exports.getDefaultSuperSecretAdminKey = getDefaultSuperSecretAdminKey;
|
|
141
|
+
exports.getUrls = getUrls;
|
|
142
|
+
exports.resolveApiUrls = resolveApiUrls;
|
|
143
|
+
exports.resolveConstructorOptions = resolveConstructorOptions;
|
|
144
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { HexclaveAssertionError, captureError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { createGlobal, getGlobal } from \"@stackframe/stack-shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise, runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr, use } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { getDefaultApiUrls } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { envVars } from \"../../../env\";\nimport { HandlerUrlOptions, ResolvedHandlerUrls, stackAppInternalsSymbol } 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 replaceStackPortPrefix = <T extends string | undefined>(input: T): T => {\n if (!input) return input;\n const prefix = envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX;\n return prefix ? input.replace(/\\$\\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\\}/g, prefix) as T : input;\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 = { [stackAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[stackAppInternalsSymbol].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.NEXT_PUBLIC_STACK_PROJECT_ID || envVars.STACK_PROJECT_ID || throwErr(new Error(\"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 NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return envVars.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || envVars.STACK_PUBLISHABLE_CLIENT_KEY;\n}\n\nexport function getDefaultSecretServerKey() {\n return envVars.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return envVars.STACK_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 STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(envVars.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || envVars.STACK_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_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_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 // note: NEXT_PUBLIC_BROWSER_STACK_API_URL was renamed to NEXT_PUBLIC_STACK_API_URL_BROWSER, and NEXT_PUBLIC_STACK_URL to NEXT_PUBLIC_STACK_API_URL\n if (isBrowserLike()) {\n url = envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || envVars.STACK_API_URL_BROWSER;\n } else {\n url = envVars.NEXT_PUBLIC_SERVER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_SERVER || envVars.STACK_API_URL_SERVER;\n }\n url = url || envVars.NEXT_PUBLIC_STACK_API_URL || envVars.STACK_API_URL || envVars.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return replaceStackPortPrefix(url.endsWith('/') ? url.slice(0, -1) : url);\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\"], // for legacy compatibility\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\n"],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/stack-app/apps/implementations/event-tracker.d.ts
|
|
4
|
+
type EventTrackerDeps = {
|
|
5
|
+
projectId: string;
|
|
6
|
+
sendBatch: (body: string, options: {
|
|
7
|
+
keepalive: boolean;
|
|
8
|
+
}) => Promise<Result<Response, Error>>;
|
|
9
|
+
};
|
|
10
|
+
declare class EventTracker {
|
|
11
|
+
private _started;
|
|
12
|
+
private _cancelled;
|
|
13
|
+
private _detachListeners;
|
|
14
|
+
private _flushTimer;
|
|
15
|
+
private _events;
|
|
16
|
+
private _approxBytes;
|
|
17
|
+
private _lastUrl;
|
|
18
|
+
private readonly _sessionReplaySegmentId;
|
|
19
|
+
private readonly _deps;
|
|
20
|
+
private _originalPushState;
|
|
21
|
+
private _originalReplaceState;
|
|
22
|
+
constructor(deps: EventTrackerDeps);
|
|
23
|
+
start(): void;
|
|
24
|
+
stop(): void;
|
|
25
|
+
clearBuffer(): void;
|
|
26
|
+
private _pushEvent;
|
|
27
|
+
private _capturePageView;
|
|
28
|
+
private _setupPageViewCapture;
|
|
29
|
+
private readonly _onPopState;
|
|
30
|
+
private _buildSelector;
|
|
31
|
+
private _findNearestAnchorHref;
|
|
32
|
+
private readonly _onClickCapture;
|
|
33
|
+
private _setupClickCapture;
|
|
34
|
+
private readonly _onPageHide;
|
|
35
|
+
private _setupPageHideListeners;
|
|
36
|
+
private _teardown;
|
|
37
|
+
private _flush;
|
|
38
|
+
private _tick;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { EventTracker, EventTrackerDeps };
|
|
42
|
+
//# sourceMappingURL=event-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-tracker.d.ts","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.ts"],"mappings":";;;KAiCY,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,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;cAEI,IAAA,EAAM,gBAAA;EAKlB,KAAA,CAAA;EAqBA,IAAA,CAAA;EAUA,WAAA,CAAA;EAAA,QAKQ,UAAA;EAAA,QAQA,gBAAA;EAAA,QA2BA,qBAAA;EAAA,iBA4BS,WAAA;EAAA,QAIT,cAAA;EAAA,QA0BA,sBAAA;EAAA,iBAWS,eAAA;EAAA,QAsBT,kBAAA;EAAA,iBAIS,WAAA;EAAA,QAIT,uBAAA;EAAA,QASA,SAAA;EAAA,QA0BM,MAAA;EAAA,QA+BN,KAAA;AAAA"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_chunk = require('../../../../chunk-BE-pF4vm.js');
|
|
3
|
+
let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
|
|
4
|
+
let _stackframe_stack_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
|
|
5
|
+
let __session_replay_js = require("./session-replay.js");
|
|
6
|
+
|
|
7
|
+
//#region src/lib/stack-app/apps/implementations/event-tracker.ts
|
|
8
|
+
const FLUSH_INTERVAL_MS = 1e4;
|
|
9
|
+
const MAX_EVENTS_PER_BATCH = 50;
|
|
10
|
+
const MAX_APPROX_BYTES_PER_BATCH = 64e3;
|
|
11
|
+
function hasScreenDimensions(value) {
|
|
12
|
+
if (value == null || typeof value !== "object") return false;
|
|
13
|
+
if (!("width" in value) || !("height" in value)) return false;
|
|
14
|
+
return typeof value.width === "number" && typeof value.height === "number";
|
|
15
|
+
}
|
|
16
|
+
function hasHistoryMethods(value) {
|
|
17
|
+
if (value == null || typeof value !== "object") return false;
|
|
18
|
+
if (!("pushState" in value) || !("replaceState" in value)) return false;
|
|
19
|
+
return typeof value.pushState === "function" && typeof value.replaceState === "function";
|
|
20
|
+
}
|
|
21
|
+
var EventTracker = class {
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
this._started = false;
|
|
24
|
+
this._cancelled = false;
|
|
25
|
+
this._detachListeners = null;
|
|
26
|
+
this._flushTimer = null;
|
|
27
|
+
this._events = [];
|
|
28
|
+
this._approxBytes = 0;
|
|
29
|
+
this._lastUrl = null;
|
|
30
|
+
this._originalPushState = null;
|
|
31
|
+
this._originalReplaceState = null;
|
|
32
|
+
this._onPopState = () => {
|
|
33
|
+
this._capturePageView("pop");
|
|
34
|
+
};
|
|
35
|
+
this._onClickCapture = (event) => {
|
|
36
|
+
const target = event.target;
|
|
37
|
+
if (!(target instanceof Element)) return;
|
|
38
|
+
this._pushEvent({
|
|
39
|
+
event_type: "$click",
|
|
40
|
+
event_at_ms: Date.now(),
|
|
41
|
+
data: {
|
|
42
|
+
tag_name: target.tagName.toLowerCase(),
|
|
43
|
+
text: target.textContent.trim().substring(0, 200),
|
|
44
|
+
href: this._findNearestAnchorHref(target),
|
|
45
|
+
selector: this._buildSelector(target),
|
|
46
|
+
x: event.clientX,
|
|
47
|
+
y: event.clientY,
|
|
48
|
+
page_x: event.pageX,
|
|
49
|
+
page_y: event.pageY,
|
|
50
|
+
viewport_width: window.innerWidth,
|
|
51
|
+
viewport_height: window.innerHeight
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
this._onPageHide = () => {
|
|
56
|
+
(0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
|
|
57
|
+
};
|
|
58
|
+
this._deps = deps;
|
|
59
|
+
this._sessionReplaySegmentId = (0, __session_replay_js.generateUuid)();
|
|
60
|
+
}
|
|
61
|
+
start() {
|
|
62
|
+
if (this._started) return;
|
|
63
|
+
if (!(0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) return;
|
|
64
|
+
if (typeof window.addEventListener !== "function" || typeof window.removeEventListener !== "function" || typeof document.addEventListener !== "function" || typeof document.removeEventListener !== "function" || !hasScreenDimensions(window.screen)) return;
|
|
65
|
+
this._started = true;
|
|
66
|
+
this._setupPageViewCapture();
|
|
67
|
+
this._setupClickCapture();
|
|
68
|
+
this._setupPageHideListeners();
|
|
69
|
+
this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);
|
|
70
|
+
}
|
|
71
|
+
stop() {
|
|
72
|
+
this._cancelled = true;
|
|
73
|
+
if (this._flushTimer !== null) {
|
|
74
|
+
clearInterval(this._flushTimer);
|
|
75
|
+
this._flushTimer = null;
|
|
76
|
+
}
|
|
77
|
+
(0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
|
|
78
|
+
this._teardown();
|
|
79
|
+
}
|
|
80
|
+
clearBuffer() {
|
|
81
|
+
this._events = [];
|
|
82
|
+
this._approxBytes = 0;
|
|
83
|
+
}
|
|
84
|
+
_pushEvent(event) {
|
|
85
|
+
this._events.push(event);
|
|
86
|
+
this._approxBytes += JSON.stringify(event).length;
|
|
87
|
+
if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
|
|
88
|
+
}
|
|
89
|
+
_capturePageView(entryType) {
|
|
90
|
+
const screenObject = window.screen;
|
|
91
|
+
if (!hasScreenDimensions(screenObject)) return;
|
|
92
|
+
const url = window.location.href;
|
|
93
|
+
if (url === this._lastUrl && entryType !== "initial") return;
|
|
94
|
+
this._lastUrl = url;
|
|
95
|
+
this._pushEvent({
|
|
96
|
+
event_type: "$page-view",
|
|
97
|
+
event_at_ms: Date.now(),
|
|
98
|
+
data: {
|
|
99
|
+
url,
|
|
100
|
+
path: window.location.pathname,
|
|
101
|
+
referrer: document.referrer,
|
|
102
|
+
title: document.title,
|
|
103
|
+
entry_type: entryType,
|
|
104
|
+
viewport_width: window.innerWidth,
|
|
105
|
+
viewport_height: window.innerHeight,
|
|
106
|
+
screen_width: screenObject.width,
|
|
107
|
+
screen_height: screenObject.height
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
_setupPageViewCapture() {
|
|
112
|
+
this._capturePageView("initial");
|
|
113
|
+
const historyObject = window.history;
|
|
114
|
+
if (!hasHistoryMethods(historyObject)) return;
|
|
115
|
+
const originalPushState = historyObject.pushState;
|
|
116
|
+
const originalReplaceState = historyObject.replaceState;
|
|
117
|
+
this._originalPushState = (...args) => originalPushState.apply(historyObject, args);
|
|
118
|
+
historyObject.pushState = (...args) => {
|
|
119
|
+
this._originalPushState(...args);
|
|
120
|
+
this._capturePageView("push");
|
|
121
|
+
};
|
|
122
|
+
this._originalReplaceState = (...args) => originalReplaceState.apply(historyObject, args);
|
|
123
|
+
historyObject.replaceState = (...args) => {
|
|
124
|
+
this._originalReplaceState(...args);
|
|
125
|
+
this._capturePageView("replace");
|
|
126
|
+
};
|
|
127
|
+
window.addEventListener("popstate", this._onPopState);
|
|
128
|
+
}
|
|
129
|
+
_buildSelector(element) {
|
|
130
|
+
const parts = [];
|
|
131
|
+
let current = element;
|
|
132
|
+
let depth = 0;
|
|
133
|
+
while (current && depth < 5) {
|
|
134
|
+
let part = current.tagName.toLowerCase();
|
|
135
|
+
if (current.id) {
|
|
136
|
+
part += `#${current.id}`;
|
|
137
|
+
parts.unshift(part);
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
if (current.className && typeof current.className === "string") {
|
|
141
|
+
const classes = current.className.trim().split(/\s+/).filter(Boolean);
|
|
142
|
+
if (classes.length > 0) part += `.${classes.join(".")}`;
|
|
143
|
+
}
|
|
144
|
+
parts.unshift(part);
|
|
145
|
+
current = current.parentElement;
|
|
146
|
+
depth++;
|
|
147
|
+
}
|
|
148
|
+
return parts.join(" > ");
|
|
149
|
+
}
|
|
150
|
+
_findNearestAnchorHref(element) {
|
|
151
|
+
let current = element;
|
|
152
|
+
while (current) {
|
|
153
|
+
if (current.tagName === "A" && current.hasAttribute("href")) return current.getAttribute("href");
|
|
154
|
+
current = current.parentElement;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
_setupClickCapture() {
|
|
159
|
+
document.addEventListener("click", this._onClickCapture, { capture: true });
|
|
160
|
+
}
|
|
161
|
+
_setupPageHideListeners() {
|
|
162
|
+
window.addEventListener("pagehide", this._onPageHide);
|
|
163
|
+
document.addEventListener("visibilitychange", this._onPageHide);
|
|
164
|
+
this._detachListeners = () => {
|
|
165
|
+
window.removeEventListener("pagehide", this._onPageHide);
|
|
166
|
+
document.removeEventListener("visibilitychange", this._onPageHide);
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
_teardown() {
|
|
170
|
+
if (this._detachListeners) {
|
|
171
|
+
this._detachListeners();
|
|
172
|
+
this._detachListeners = null;
|
|
173
|
+
}
|
|
174
|
+
const historyObject = window.history;
|
|
175
|
+
if (hasHistoryMethods(historyObject)) {
|
|
176
|
+
if (this._originalPushState) historyObject.pushState = this._originalPushState;
|
|
177
|
+
if (this._originalReplaceState) historyObject.replaceState = this._originalReplaceState;
|
|
178
|
+
}
|
|
179
|
+
this._originalPushState = null;
|
|
180
|
+
this._originalReplaceState = null;
|
|
181
|
+
window.removeEventListener("popstate", this._onPopState);
|
|
182
|
+
document.removeEventListener("click", this._onClickCapture, { capture: true });
|
|
183
|
+
this._events = [];
|
|
184
|
+
this._approxBytes = 0;
|
|
185
|
+
}
|
|
186
|
+
async _flush(options) {
|
|
187
|
+
if (this._events.length === 0) return;
|
|
188
|
+
const nowMs = Date.now();
|
|
189
|
+
const batchId = (0, __session_replay_js.generateUuid)();
|
|
190
|
+
const payload = {
|
|
191
|
+
session_replay_segment_id: this._sessionReplaySegmentId,
|
|
192
|
+
batch_id: batchId,
|
|
193
|
+
sent_at_ms: nowMs,
|
|
194
|
+
events: this._events
|
|
195
|
+
};
|
|
196
|
+
this._events = [];
|
|
197
|
+
this._approxBytes = 0;
|
|
198
|
+
const res = await this._deps.sendBatch(JSON.stringify(payload), { keepalive: options.keepalive });
|
|
199
|
+
if (res.status === "error") {
|
|
200
|
+
console.warn("EventTracker flush failed:", res.error);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!res.data.ok) console.warn("EventTracker flush failed:", res.data.status, await res.data.text());
|
|
204
|
+
}
|
|
205
|
+
_tick() {
|
|
206
|
+
if (this._cancelled) return;
|
|
207
|
+
if (this._events.length > 0) (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
//#endregion
|
|
212
|
+
exports.EventTracker = EventTracker;
|
|
213
|
+
//# sourceMappingURL=event-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-tracker.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { generateUuid } 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\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 _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 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._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 }\n\n private _pushEvent(event: TrackedEvent) {\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 },\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 < 5) {\n let part = current.tagName.toLowerCase();\n if (current.id) {\n part += `#${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);\n if (classes.length > 0) {\n part += `.${classes.join(\".\")}`;\n }\n }\n parts.unshift(part);\n current = current.parentElement;\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\n this._pushEvent({\n event_type: \"$click\",\n event_at_ms: Date.now(),\n data: {\n tag_name: target.tagName.toLowerCase(),\n text: target.textContent.trim().substring(0, 200),\n href: this._findNearestAnchorHref(target),\n selector: this._buildSelector(target),\n x: event.clientX,\n y: event.clientY,\n page_x: event.pageX,\n page_y: event.pageY,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n },\n });\n };\n\n private _setupClickCapture() {\n document.addEventListener(\"click\", this._onClickCapture, { capture: true });\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\n this._events = [];\n this._approxBytes = 0;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._events.length === 0) return;\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: this._events,\n };\n\n this._events = [];\n this._approxBytes = 0;\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\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 _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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const require_chunk = require('../../../../chunk-BE-pF4vm.js');
|
|
2
|
+
let vitest = require("vitest");
|
|
3
|
+
let _stackframe_stack_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
|
|
4
|
+
let __event_tracker_js = require("./event-tracker.js");
|
|
5
|
+
|
|
6
|
+
//#region src/lib/stack-app/apps/implementations/event-tracker.test.ts
|
|
7
|
+
// @vitest-environment jsdom
|
|
8
|
+
async function advancePastFlush() {
|
|
9
|
+
await vitest.vi.advanceTimersByTimeAsync(1e4);
|
|
10
|
+
await Promise.resolve();
|
|
11
|
+
}
|
|
12
|
+
function getSentEventTypes(sentBodies) {
|
|
13
|
+
const [body] = sentBodies;
|
|
14
|
+
const payload = JSON.parse(body);
|
|
15
|
+
if (typeof payload !== "object" || payload === null || !("events" in payload) || !Array.isArray(payload.events)) throw new Error("Expected analytics batch payload to include an events array.");
|
|
16
|
+
return payload.events.map((event) => event.event_type);
|
|
17
|
+
}
|
|
18
|
+
(0, vitest.describe)("EventTracker", () => {
|
|
19
|
+
(0, vitest.afterEach)(() => {
|
|
20
|
+
vitest.vi.useRealTimers();
|
|
21
|
+
});
|
|
22
|
+
(0, vitest.it)("captures events when browser globals are exposed as accessor descriptors", async () => {
|
|
23
|
+
vitest.vi.useFakeTimers();
|
|
24
|
+
document.body.innerHTML = "<button>Open project</button>";
|
|
25
|
+
const screenDescriptor = Object.getOwnPropertyDescriptor(window, "screen");
|
|
26
|
+
const historyDescriptor = Object.getOwnPropertyDescriptor(window, "history");
|
|
27
|
+
(0, vitest.expect)(screenDescriptor?.value).toBeUndefined();
|
|
28
|
+
(0, vitest.expect)(historyDescriptor?.value).toBeUndefined();
|
|
29
|
+
(0, vitest.expect)(screenDescriptor?.get).toBeTypeOf("function");
|
|
30
|
+
(0, vitest.expect)(historyDescriptor?.get).toBeTypeOf("function");
|
|
31
|
+
const sentBodies = [];
|
|
32
|
+
const tracker = new __event_tracker_js.EventTracker({
|
|
33
|
+
projectId: "internal",
|
|
34
|
+
sendBatch: async (body) => {
|
|
35
|
+
sentBodies.push(body);
|
|
36
|
+
return _stackframe_stack_shared_dist_utils_results.Result.ok(new Response());
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
tracker.start();
|
|
41
|
+
document.querySelector("button")?.dispatchEvent(new MouseEvent("click", {
|
|
42
|
+
bubbles: true,
|
|
43
|
+
clientX: 12,
|
|
44
|
+
clientY: 34
|
|
45
|
+
}));
|
|
46
|
+
await advancePastFlush();
|
|
47
|
+
(0, vitest.expect)(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`
|
|
48
|
+
[
|
|
49
|
+
"$page-view",
|
|
50
|
+
"$click",
|
|
51
|
+
]
|
|
52
|
+
`);
|
|
53
|
+
} finally {
|
|
54
|
+
tracker.stop();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
(0, vitest.it)("captures client-side navigations when history is exposed as an accessor descriptor", async () => {
|
|
58
|
+
vitest.vi.useFakeTimers();
|
|
59
|
+
const historyDescriptor = Object.getOwnPropertyDescriptor(window, "history");
|
|
60
|
+
(0, vitest.expect)(historyDescriptor?.value).toBeUndefined();
|
|
61
|
+
(0, vitest.expect)(historyDescriptor?.get).toBeTypeOf("function");
|
|
62
|
+
const sentBodies = [];
|
|
63
|
+
const tracker = new __event_tracker_js.EventTracker({
|
|
64
|
+
projectId: "internal",
|
|
65
|
+
sendBatch: async (body) => {
|
|
66
|
+
sentBodies.push(body);
|
|
67
|
+
return _stackframe_stack_shared_dist_utils_results.Result.ok(new Response());
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
tracker.start();
|
|
72
|
+
window.history.pushState({}, "", "/projects/test-project");
|
|
73
|
+
await advancePastFlush();
|
|
74
|
+
(0, vitest.expect)(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`
|
|
75
|
+
[
|
|
76
|
+
"$page-view",
|
|
77
|
+
"$page-view",
|
|
78
|
+
]
|
|
79
|
+
`);
|
|
80
|
+
} finally {
|
|
81
|
+
tracker.stop();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
//#endregion
|
|
87
|
+
//# sourceMappingURL=event-tracker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-tracker.test.js","names":["vi","EventTracker","Result"],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { Result } from \"@stackframe/stack-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 expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\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"],"mappings":";;;;;;;AAUA,eAAe,mBAAmB;AAChC,OAAMA,UAAG,yBAAyB,IAAO;AACzC,OAAM,QAAQ,SAAS;;AAGzB,SAAS,kBAAkB,YAAsB;CAC/C,MAAM,CAAC,QAAQ;CAEf,MAAM,UAAU,KAAK,MAAM,KAAK;AAChC,KAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,YAAY,YAAY,CAAC,MAAM,QAAQ,QAAQ,OAAO,CAC7G,OAAM,IAAI,MAAM,+DAA+D;AAGjF,QAAQ,QAAQ,OAAoC,KAAK,UAAU,MAAM,WAAW;;qBAG7E,sBAAsB;AAC7B,6BAAgB;AACd,YAAG,eAAe;GAClB;AAEF,gBAAG,4EAA4E,YAAY;AACzF,YAAG,eAAe;AAClB,WAAS,KAAK,YAAY;EAE1B,MAAM,mBAAmB,OAAO,yBAAyB,QAAQ,SAAS;EAC1E,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,kBAAkB,MAAM,CAAC,eAAe;AAC/C,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,kBAAkB,IAAI,CAAC,WAAW,WAAW;AACpD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAIC,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,mDAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,YAAS,cAAc,SAAS,EAAE,cAAc,IAAI,WAAW,SAAS;IACtE,SAAS;IACT,SAAS;IACT,SAAS;IACV,CAAC,CAAC;AAEH,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;AAEF,gBAAG,sFAAsF,YAAY;AACnG,YAAG,eAAe;EAElB,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAID,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,mDAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,UAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,yBAAyB;AAE1D,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;EACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { _StackClientAppImplIncomplete } from "./client-app-impl.js";
|
|
2
|
+
import { _StackServerAppImplIncomplete } from "./server-app-impl.js";
|
|
3
|
+
import { _StackAdminAppImplIncomplete } from "./admin-app-impl.js";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/stack-app/apps/implementations/index.d.ts
|
|
6
|
+
declare const _StackAdminAppImpl: typeof _StackAdminAppImplIncomplete, _StackClientAppImpl: typeof _StackClientAppImplIncomplete, _StackServerAppImpl: typeof _StackServerAppImplIncomplete;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { _StackAdminAppImpl, _StackClientAppImpl, _StackServerAppImpl };
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|