@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 @@
|
|
|
1
|
+
{"version":3,"file":"convex.config.js","names":[],"sources":["../../../../../src/integrations/convex/component/convex.config.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 { defineComponent } from \"convex/server\";\n\nconst component = defineComponent(\"stack_auth\");\n\nexport default component;\n"],"mappings":";;;AAMA,MAAM,YAAY,gBAAgB,aAAa"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/integrations/convex.d.ts
|
|
2
|
+
declare function getConvexProvidersConfig(options: {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
projectId: string;
|
|
5
|
+
}): {
|
|
6
|
+
type: string;
|
|
7
|
+
issuer: URL;
|
|
8
|
+
jwks: URL;
|
|
9
|
+
algorithm: string;
|
|
10
|
+
}[];
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getConvexProvidersConfig };
|
|
13
|
+
//# sourceMappingURL=convex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convex.d.ts","names":[],"sources":["../../../src/integrations/convex.ts"],"mappings":";iBAOgB,wBAAA,CAAyB,OAAA;EACvC,OAAA;EACA,SAAA;AAAA;;UAFsC,GAAA;QAAA,GAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { urlString } from "@hexclave/shared/dist/utils/urls";
|
|
2
|
+
import { defaultBaseUrl } from "../lib/stack-app/apps/implementations/common.js";
|
|
3
|
+
|
|
4
|
+
//#region src/integrations/convex.ts
|
|
5
|
+
function getConvexProvidersConfig(options) {
|
|
6
|
+
const baseUrl = options.baseUrl || defaultBaseUrl;
|
|
7
|
+
const projectId = options.projectId;
|
|
8
|
+
return [{
|
|
9
|
+
type: "customJwt",
|
|
10
|
+
issuer: new URL(urlString`/api/v1/projects/${projectId}`, baseUrl),
|
|
11
|
+
jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json`, baseUrl),
|
|
12
|
+
algorithm: "ES256"
|
|
13
|
+
}, {
|
|
14
|
+
type: "customJwt",
|
|
15
|
+
issuer: new URL(urlString`/api/v1/projects-anonymous-users/${projectId}`, baseUrl),
|
|
16
|
+
jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json?include_anonymous=true`, baseUrl),
|
|
17
|
+
algorithm: "ES256"
|
|
18
|
+
}];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getConvexProvidersConfig };
|
|
23
|
+
//# sourceMappingURL=convex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convex.js","names":[],"sources":["../../../src/integrations/convex.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 { urlString } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { defaultBaseUrl } from \"../lib/stack-app/apps/implementations/common\";\n\nexport function getConvexProvidersConfig(options: {\n baseUrl?: string,\n projectId: string,\n}) {\n const baseUrl = options.baseUrl || defaultBaseUrl;\n const projectId = options.projectId;\n return [\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json`, baseUrl),\n algorithm: \"ES256\",\n },\n {\n type: \"customJwt\",\n issuer: new URL(urlString`/api/v1/projects-anonymous-users/${projectId}`, baseUrl),\n jwks: new URL(urlString`/api/v1/projects/${projectId}/.well-known/jwks.json?include_anonymous=true`, baseUrl),\n algorithm: \"ES256\",\n },\n ];\n}\n"],"mappings":";;;;AAOA,SAAgB,yBAAyB,SAGtC;CACD,MAAM,UAAU,QAAQ,WAAW;CACnC,MAAM,YAAY,QAAQ;AAC1B,QAAO,CACL;EACE,MAAM;EACN,QAAQ,IAAI,IAAI,SAAS,oBAAoB,aAAa,QAAQ;EAClE,MAAM,IAAI,IAAI,SAAS,oBAAoB,UAAU,yBAAyB,QAAQ;EACtF,WAAW;EACZ,EACD;EACE,MAAM;EACN,QAAQ,IAAI,IAAI,SAAS,oCAAoC,aAAa,QAAQ;EAClF,MAAM,IAAI,IAAI,SAAS,oBAAoB,UAAU,gDAAgD,QAAQ;EAC7G,WAAW;EACZ,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { clientVersion } from "../lib/stack-app/apps/implementations/common.js";
|
|
2
|
+
|
|
3
|
+
//#region src/internal/deprecation-warning.ts
|
|
4
|
+
const WARNED_SYMBOL = Symbol.for("Hexclave--stackframe-package-deprecation-warned");
|
|
5
|
+
function shouldWarn() {
|
|
6
|
+
return /^js @stackframe\//.test(clientVersion);
|
|
7
|
+
}
|
|
8
|
+
function warnOnce() {
|
|
9
|
+
const g = globalThis;
|
|
10
|
+
if (g[WARNED_SYMBOL]) return;
|
|
11
|
+
g[WARNED_SYMBOL] = true;
|
|
12
|
+
try {
|
|
13
|
+
if (typeof console !== "undefined" && typeof console.warn === "function") console.warn(`[Hexclave] You are using the legacy ${extractPackageName()} package. Please migrate to the @hexclave/* equivalent — the API surface is identical and the @stackframe/* packages are deprecated. See https://docs.hexclave.com/migration.`);
|
|
14
|
+
} catch {}
|
|
15
|
+
}
|
|
16
|
+
function extractPackageName() {
|
|
17
|
+
const match = clientVersion.match(/^js (@stackframe\/[^@]+)@/);
|
|
18
|
+
return match ? match[1] : "@stackframe/*";
|
|
19
|
+
}
|
|
20
|
+
if (shouldWarn()) warnOnce();
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
export { };
|
|
24
|
+
//# sourceMappingURL=deprecation-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deprecation-warning.js","names":[],"sources":["../../../src/internal/deprecation-warning.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// PR 2 — Hexclave rebrand. When the SDK is loaded from a legacy `@stackframe/*`\n// package, emit a once-per-process console.warn pointing to the `@hexclave/*`\n// equivalent. The published `@hexclave/*` packages reuse the exact same built\n// artifacts, so we detect the package brand at runtime from `clientVersion`\n// (which the tsdown plugin stamps from package.json at build time).\n//\n// Repeated SDK imports within one process are de-duplicated via a Symbol on\n// globalThis — multiple bundlers / dynamic imports won't spam the console.\n\nimport { clientVersion } from \"../lib/stack-app/apps/implementations/common\";\n\nconst WARNED_SYMBOL = Symbol.for(\"Hexclave--stackframe-package-deprecation-warned\");\n\nfunction shouldWarn(): boolean {\n // clientVersion is \"js <package-name>@<version>\" once the build-time sentinel\n // is rewritten. In a built `@stackframe/*` artifact this looks like\n // \"js @stackframe/stack@2.8.92\"; in `@hexclave/*` artifacts it looks like\n // \"js @hexclave/next@1.0.0\". Anything else (template build, source mode) is\n // a no-op.\n return /^js @stackframe\\//.test(clientVersion);\n}\n\nfunction warnOnce() {\n const g = globalThis as Record<symbol, unknown>;\n if (g[WARNED_SYMBOL]) return;\n g[WARNED_SYMBOL] = true;\n // Best-effort advisory. Wrapped in try/catch because some sandboxed\n // runtimes (older Workers, embedded JS hosts) stub or omit `console`;\n // a throw here would break the consuming bundle on SDK import.\n try {\n if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[Hexclave] You are using the legacy ${extractPackageName()} package. ` +\n `Please migrate to the @hexclave/* equivalent — the API surface is identical ` +\n `and the @stackframe/* packages are deprecated. See https://docs.hexclave.com/migration.`,\n );\n }\n } catch {\n // swallow: the warning is best-effort, never load-bearing.\n }\n}\n\nfunction extractPackageName(): string {\n // \"js @stackframe/stack@2.8.92\" → \"@stackframe/stack\"\n const match = clientVersion.match(/^js (@stackframe\\/[^@]+)@/);\n return match ? match[1] : \"@stackframe/*\";\n}\n\nif (shouldWarn()) {\n warnOnce();\n}\n"],"mappings":";;;AAeA,MAAM,gBAAgB,OAAO,IAAI,kDAAkD;AAEnF,SAAS,aAAsB;AAM7B,QAAO,oBAAoB,KAAK,cAAc;;AAGhD,SAAS,WAAW;CAClB,MAAM,IAAI;AACV,KAAI,EAAE,eAAgB;AACtB,GAAE,iBAAiB;AAInB,KAAI;AACF,MAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,SAAS,WAE5D,SAAQ,KACN,uCAAuC,oBAAoB,CAAC,+KAG7D;SAEG;;AAKV,SAAS,qBAA6B;CAEpC,MAAM,QAAQ,cAAc,MAAM,4BAA4B;AAC9D,QAAO,QAAQ,MAAM,KAAK;;AAG5B,IAAI,YAAY,CACd,WAAU"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { HexclaveClientInterface } from "@hexclave/shared";
|
|
2
|
+
import { InternalSession } from "@hexclave/shared/dist/sessions";
|
|
3
|
+
|
|
4
|
+
//#region src/lib/auth.d.ts
|
|
5
|
+
declare function getNewOAuthProviderOrScopeUrl(iface: HexclaveClientInterface, options: {
|
|
6
|
+
provider: string;
|
|
7
|
+
redirectUrl: string;
|
|
8
|
+
errorRedirectUrl: string;
|
|
9
|
+
providerScope?: string;
|
|
10
|
+
}, session: InternalSession): Promise<string>;
|
|
11
|
+
declare function callOAuthCallback(iface: HexclaveClientInterface, redirectUrl: string, options?: {
|
|
12
|
+
dontWarnAboutMissingQueryParams?: boolean;
|
|
13
|
+
}): Promise<({
|
|
14
|
+
status: "ok";
|
|
15
|
+
data: undefined;
|
|
16
|
+
} & {
|
|
17
|
+
status: "ok";
|
|
18
|
+
}) | ({
|
|
19
|
+
status: "ok";
|
|
20
|
+
data: {
|
|
21
|
+
newUser: boolean;
|
|
22
|
+
afterCallbackRedirectUrl?: string;
|
|
23
|
+
accessToken: string;
|
|
24
|
+
refreshToken: string;
|
|
25
|
+
};
|
|
26
|
+
} & {
|
|
27
|
+
status: "ok";
|
|
28
|
+
})>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { callOAuthCallback, getNewOAuthProviderOrScopeUrl };
|
|
31
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","names":[],"sources":["../../../src/lib/auth.ts"],"mappings":";;;;iBAWsB,6BAAA,CACpB,KAAA,EAAO,uBAAA,EACP,OAAA;EACE,QAAA;EACA,WAAA;EACA,gBAAA;EACA,aAAA;AAAA,GAEF,OAAA,EAAS,eAAA,GACR,OAAA;AAAA,iBA0HmB,iBAAA,CACpB,KAAA,EAAO,uBAAA,EACP,WAAA,UACA,OAAA;EACE,+BAAA;AAAA,IACD,OAAA"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { HexclaveAssertionError, throwErr } from "@hexclave/shared/dist/utils/errors";
|
|
2
|
+
import { KnownError } from "@hexclave/shared";
|
|
3
|
+
import { Result } from "@hexclave/shared/dist/utils/results";
|
|
4
|
+
import { deindent } from "@hexclave/shared/dist/utils/strings";
|
|
5
|
+
import { constructRedirectUrl } from "../utils/url.js";
|
|
6
|
+
import { consumeVerifierAndStateCookie, saveVerifierAndState } from "./cookie.js";
|
|
7
|
+
|
|
8
|
+
//#region src/lib/auth.ts
|
|
9
|
+
async function getNewOAuthProviderOrScopeUrl(iface, options, session) {
|
|
10
|
+
const { codeChallenge, state } = await saveVerifierAndState();
|
|
11
|
+
return await iface.getOAuthUrl({
|
|
12
|
+
provider: options.provider,
|
|
13
|
+
redirectUrl: constructRedirectUrl(options.redirectUrl, "redirectUrl"),
|
|
14
|
+
errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, "errorRedirectUrl"),
|
|
15
|
+
afterCallbackRedirectUrl: constructRedirectUrl(window.location.href, "afterCallbackRedirectUrl"),
|
|
16
|
+
codeChallenge,
|
|
17
|
+
state,
|
|
18
|
+
type: "link",
|
|
19
|
+
session,
|
|
20
|
+
providerScope: options.providerScope
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function consumeOAuthCallbackQueryParams(options) {
|
|
24
|
+
const oauthErrorParams = [
|
|
25
|
+
"error",
|
|
26
|
+
"error_description",
|
|
27
|
+
"errorCode",
|
|
28
|
+
"message",
|
|
29
|
+
"details"
|
|
30
|
+
];
|
|
31
|
+
const requiredParams = ["code", "state"];
|
|
32
|
+
const originalUrl = new URL(window.location.href);
|
|
33
|
+
const knownErrorCode = originalUrl.searchParams.get("errorCode");
|
|
34
|
+
const knownErrorMessage = originalUrl.searchParams.get("message");
|
|
35
|
+
if (knownErrorCode && knownErrorMessage) {
|
|
36
|
+
const details = originalUrl.searchParams.get("details");
|
|
37
|
+
let detailsJson = {};
|
|
38
|
+
if (details) try {
|
|
39
|
+
detailsJson = JSON.parse(details);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
throw new HexclaveAssertionError("OAuth callback returned malformed known-error details", {
|
|
42
|
+
details,
|
|
43
|
+
cause: error
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const newUrl = new URL(originalUrl);
|
|
47
|
+
for (const param of oauthErrorParams) newUrl.searchParams.delete(param);
|
|
48
|
+
window.history.replaceState({}, "", newUrl.toString());
|
|
49
|
+
return {
|
|
50
|
+
type: "known-error",
|
|
51
|
+
error: KnownError.fromJson({
|
|
52
|
+
code: knownErrorCode,
|
|
53
|
+
message: knownErrorMessage,
|
|
54
|
+
details: detailsJson
|
|
55
|
+
})
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
for (const param of requiredParams) if (!originalUrl.searchParams.has(param)) {
|
|
59
|
+
if (!options?.dontWarnAboutMissingQueryParams) console.warn(/* @__PURE__ */ new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const expectedState = originalUrl.searchParams.get("state") ?? throwErr("This should never happen; isn't state required above?");
|
|
63
|
+
const cookieResult = consumeVerifierAndStateCookie(expectedState);
|
|
64
|
+
if (!cookieResult) {
|
|
65
|
+
console.warn(deindent`
|
|
66
|
+
Stack found an outer OAuth callback state in the query parameters, but not in cookies.
|
|
67
|
+
|
|
68
|
+
This could have multiple reasons:
|
|
69
|
+
- The cookie expired, because the OAuth flow took too long.
|
|
70
|
+
- The user's browser deleted the cookie, either manually or because of a very strict cookie policy.
|
|
71
|
+
- The cookie was already consumed by this page, and the user already logged in.
|
|
72
|
+
- You are using another OAuth client library with the same callback URL as Stack.
|
|
73
|
+
- The user opened the OAuth callback page from their history.
|
|
74
|
+
|
|
75
|
+
Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.
|
|
76
|
+
`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const newUrl = new URL(originalUrl);
|
|
80
|
+
for (const param of requiredParams) newUrl.searchParams.delete(param);
|
|
81
|
+
window.history.replaceState({}, "", newUrl.toString());
|
|
82
|
+
return {
|
|
83
|
+
type: "oauth-response",
|
|
84
|
+
originalUrl,
|
|
85
|
+
codeVerifier: cookieResult.codeVerifier,
|
|
86
|
+
state: expectedState
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function callOAuthCallback(iface, redirectUrl, options) {
|
|
90
|
+
const consumed = consumeOAuthCallbackQueryParams(options);
|
|
91
|
+
if (!consumed) return Result.ok(void 0);
|
|
92
|
+
if (consumed.type === "known-error") throw consumed.error;
|
|
93
|
+
try {
|
|
94
|
+
return Result.ok(await iface.callOAuthCallback({
|
|
95
|
+
oauthParams: consumed.originalUrl.searchParams,
|
|
96
|
+
redirectUri: constructRedirectUrl(redirectUrl, "redirectUri"),
|
|
97
|
+
codeVerifier: consumed.codeVerifier,
|
|
98
|
+
state: consumed.state
|
|
99
|
+
}));
|
|
100
|
+
} catch (e) {
|
|
101
|
+
if (KnownError.isKnownError(e)) throw e;
|
|
102
|
+
throw new HexclaveAssertionError("Error signing in during OAuth callback. Please try again.", { cause: e });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
//#endregion
|
|
107
|
+
export { callOAuthCallback, getNewOAuthProviderOrScopeUrl };
|
|
108
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","names":[],"sources":["../../../src/lib/auth.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 { KnownError, HexclaveClientInterface } from \"@stackframe/stack-shared\";\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { HexclaveAssertionError, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { deindent } from \"@stackframe/stack-shared/dist/utils/strings\";\nimport { constructRedirectUrl } from \"../utils/url\";\nimport { consumeVerifierAndStateCookie, saveVerifierAndState } from \"./cookie\";\nexport async function getNewOAuthProviderOrScopeUrl(\n iface: HexclaveClientInterface,\n options: {\n provider: string,\n redirectUrl: string,\n errorRedirectUrl: string,\n providerScope?: string,\n },\n session: InternalSession,\n): Promise<string> {\n const { codeChallenge, state } = await saveVerifierAndState();\n return await iface.getOAuthUrl({\n provider: options.provider,\n redirectUrl: constructRedirectUrl(options.redirectUrl, \"redirectUrl\"),\n errorRedirectUrl: constructRedirectUrl(options.errorRedirectUrl, \"errorRedirectUrl\"),\n afterCallbackRedirectUrl: constructRedirectUrl(window.location.href, \"afterCallbackRedirectUrl\"),\n codeChallenge,\n state,\n type: \"link\",\n session,\n providerScope: options.providerScope,\n });\n}\n\n/**\n * Checks if the current URL has the query parameters for an OAuth callback, and if so, removes them.\n *\n * Must be synchronous for the logic in callOAuthCallback to work without race conditions.\n */\ntype OAuthCallbackConsumptionResult =\n | {\n type: \"oauth-response\",\n originalUrl: URL,\n codeVerifier: string,\n state: string,\n }\n | {\n type: \"known-error\",\n error: KnownError,\n };\n\nfunction consumeOAuthCallbackQueryParams(options?: {\n dontWarnAboutMissingQueryParams?: boolean,\n}): OAuthCallbackConsumptionResult | null {\n const oauthErrorParams = [\"error\", \"error_description\", \"errorCode\", \"message\", \"details\"] as const;\n const requiredParams = [\"code\", \"state\"];\n const originalUrl = new URL(window.location.href);\n const knownErrorCode = originalUrl.searchParams.get(\"errorCode\");\n const knownErrorMessage = originalUrl.searchParams.get(\"message\");\n if (knownErrorCode && knownErrorMessage) {\n const details = originalUrl.searchParams.get(\"details\");\n let detailsJson = {};\n if (details) {\n try {\n detailsJson = JSON.parse(details);\n } catch (error) {\n throw new HexclaveAssertionError(\"OAuth callback returned malformed known-error details\", {\n details,\n cause: error,\n });\n }\n }\n\n const newUrl = new URL(originalUrl);\n for (const param of oauthErrorParams) {\n newUrl.searchParams.delete(param);\n }\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n type: \"known-error\",\n error: KnownError.fromJson({\n code: knownErrorCode,\n message: knownErrorMessage,\n details: detailsJson,\n }),\n };\n }\n\n for (const param of requiredParams) {\n if (!originalUrl.searchParams.has(param)) {\n if (!options?.dontWarnAboutMissingQueryParams) {\n console.warn(new Error(`Missing required query parameter on OAuth callback: ${param}. Maybe you opened or reloaded the oauth-callback page from your history?`));\n }\n return null;\n }\n }\n\n const expectedState = originalUrl.searchParams.get(\"state\") ?? throwErr(\"This should never happen; isn't state required above?\");\n const cookieResult = consumeVerifierAndStateCookie(expectedState);\n\n if (!cookieResult) {\n // If the state can't be found in the cookies, then the callback wasn't meant for us.\n // Maybe the website uses another OAuth library?\n console.warn(deindent`\n Stack found an outer OAuth callback state in the query parameters, but not in cookies.\n\n This could have multiple reasons:\n - The cookie expired, because the OAuth flow took too long.\n - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.\n - The cookie was already consumed by this page, and the user already logged in.\n - You are using another OAuth client library with the same callback URL as Stack.\n - The user opened the OAuth callback page from their history.\n\n Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.\n `);\n return null;\n }\n\n\n const newUrl = new URL(originalUrl);\n for (const param of requiredParams) {\n newUrl.searchParams.delete(param);\n }\n\n // let's get rid of the authorization code in the history as we\n // don't redirect to `redirectUrl` if there's a validation error\n // (as the redirectUrl might be malicious!).\n //\n // We use history.replaceState instead of location.assign(...) to\n // prevent an unnecessary reload\n window.history.replaceState({}, \"\", newUrl.toString());\n\n return {\n type: \"oauth-response\",\n originalUrl,\n codeVerifier: cookieResult.codeVerifier,\n state: expectedState,\n };\n}\n\nexport async function callOAuthCallback(\n iface: HexclaveClientInterface,\n redirectUrl: string,\n options?: {\n dontWarnAboutMissingQueryParams?: boolean,\n },\n) {\n // note: this part of the function (until the return) needs\n // to be synchronous, to prevent race conditions when\n // callOAuthCallback is called multiple times in parallel\n const consumed = consumeOAuthCallbackQueryParams(options);\n if (!consumed) return Result.ok(undefined);\n if (consumed.type === \"known-error\") {\n throw consumed.error;\n }\n\n // the rest can be asynchronous (we now know that we are the\n // intended recipient of the callback, and the only instance\n // of callOAuthCallback that's running)\n try {\n return Result.ok(await iface.callOAuthCallback({\n oauthParams: consumed.originalUrl.searchParams,\n redirectUri: constructRedirectUrl(redirectUrl, \"redirectUri\"),\n codeVerifier: consumed.codeVerifier,\n state: consumed.state,\n }));\n } catch (e) {\n if (KnownError.isKnownError(e)) {\n throw e;\n }\n throw new HexclaveAssertionError(\"Error signing in during OAuth callback. Please try again.\", { cause: e });\n }\n}\n"],"mappings":";;;;;;;;AAWA,eAAsB,8BACpB,OACA,SAMA,SACiB;CACjB,MAAM,EAAE,eAAe,UAAU,MAAM,sBAAsB;AAC7D,QAAO,MAAM,MAAM,YAAY;EAC7B,UAAU,QAAQ;EAClB,aAAa,qBAAqB,QAAQ,aAAa,cAAc;EACrE,kBAAkB,qBAAqB,QAAQ,kBAAkB,mBAAmB;EACpF,0BAA0B,qBAAqB,OAAO,SAAS,MAAM,2BAA2B;EAChG;EACA;EACA,MAAM;EACN;EACA,eAAe,QAAQ;EACxB,CAAC;;AAoBJ,SAAS,gCAAgC,SAEC;CACxC,MAAM,mBAAmB;EAAC;EAAS;EAAqB;EAAa;EAAW;EAAU;CAC1F,MAAM,iBAAiB,CAAC,QAAQ,QAAQ;CACxC,MAAM,cAAc,IAAI,IAAI,OAAO,SAAS,KAAK;CACjD,MAAM,iBAAiB,YAAY,aAAa,IAAI,YAAY;CAChE,MAAM,oBAAoB,YAAY,aAAa,IAAI,UAAU;AACjE,KAAI,kBAAkB,mBAAmB;EACvC,MAAM,UAAU,YAAY,aAAa,IAAI,UAAU;EACvD,IAAI,cAAc,EAAE;AACpB,MAAI,QACF,KAAI;AACF,iBAAc,KAAK,MAAM,QAAQ;WAC1B,OAAO;AACd,SAAM,IAAI,uBAAuB,yDAAyD;IACxF;IACA,OAAO;IACR,CAAC;;EAIN,MAAM,SAAS,IAAI,IAAI,YAAY;AACnC,OAAK,MAAM,SAAS,iBAClB,QAAO,aAAa,OAAO,MAAM;AAEnC,SAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,OAAO,UAAU,CAAC;AAEtD,SAAO;GACL,MAAM;GACN,OAAO,WAAW,SAAS;IACzB,MAAM;IACN,SAAS;IACT,SAAS;IACV,CAAC;GACH;;AAGH,MAAK,MAAM,SAAS,eAClB,KAAI,CAAC,YAAY,aAAa,IAAI,MAAM,EAAE;AACxC,MAAI,CAAC,SAAS,gCACZ,SAAQ,qBAAK,IAAI,MAAM,uDAAuD,MAAM,2EAA2E,CAAC;AAElK,SAAO;;CAIX,MAAM,gBAAgB,YAAY,aAAa,IAAI,QAAQ,IAAI,SAAS,wDAAwD;CAChI,MAAM,eAAe,8BAA8B,cAAc;AAEjE,KAAI,CAAC,cAAc;AAGjB,UAAQ,KAAK,QAAQ;;;;;;;;;;;MAWnB;AACF,SAAO;;CAIT,MAAM,SAAS,IAAI,IAAI,YAAY;AACnC,MAAK,MAAM,SAAS,eAClB,QAAO,aAAa,OAAO,MAAM;AASnC,QAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,OAAO,UAAU,CAAC;AAEtD,QAAO;EACL,MAAM;EACN;EACA,cAAc,aAAa;EAC3B,OAAO;EACR;;AAGH,eAAsB,kBACpB,OACA,aACA,SAGA;CAIA,MAAM,WAAW,gCAAgC,QAAQ;AACzD,KAAI,CAAC,SAAU,QAAO,OAAO,GAAG,OAAU;AAC1C,KAAI,SAAS,SAAS,cACpB,OAAM,SAAS;AAMjB,KAAI;AACF,SAAO,OAAO,GAAG,MAAM,MAAM,kBAAkB;GAC7C,aAAa,SAAS,YAAY;GAClC,aAAa,qBAAqB,aAAa,cAAc;GAC7D,cAAc,SAAS;GACvB,OAAO,SAAS;GACjB,CAAC,CAAC;UACI,GAAG;AACV,MAAI,WAAW,aAAa,EAAE,CAC5B,OAAM;AAER,QAAM,IAAI,uBAAuB,6DAA6D,EAAE,OAAO,GAAG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { HexclaveClientInterface } from "@hexclave/shared";
|
|
3
|
+
import { getNewOAuthProviderOrScopeUrl } from "./auth.js";
|
|
4
|
+
|
|
5
|
+
//#region src/lib/auth.test.ts
|
|
6
|
+
// @vitest-environment jsdom
|
|
7
|
+
vi.mock("./cookie", async (importOriginal) => {
|
|
8
|
+
return {
|
|
9
|
+
...await importOriginal(),
|
|
10
|
+
saveVerifierAndState: async () => ({
|
|
11
|
+
codeChallenge: "<stripped code challenge>",
|
|
12
|
+
state: "<stripped state>"
|
|
13
|
+
})
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
describe("getNewOAuthProviderOrScopeUrl", () => {
|
|
17
|
+
it("returns the OAuth URL without performing navigation", async () => {
|
|
18
|
+
window.history.replaceState({}, "", "/account?after_auth_return_to=%2Fsettings");
|
|
19
|
+
const iface = new HexclaveClientInterface({
|
|
20
|
+
clientVersion: "test",
|
|
21
|
+
getBaseUrl: () => "https://api.example.com",
|
|
22
|
+
getApiUrls: () => ["https://api.example.com"],
|
|
23
|
+
extraRequestHeaders: {},
|
|
24
|
+
projectId: "00000000-0000-4000-8000-000000000000",
|
|
25
|
+
publishableClientKey: "pck_test"
|
|
26
|
+
});
|
|
27
|
+
const location = await getNewOAuthProviderOrScopeUrl(iface, {
|
|
28
|
+
provider: "github",
|
|
29
|
+
redirectUrl: "/handler/oauth-callback",
|
|
30
|
+
errorRedirectUrl: "/handler/error",
|
|
31
|
+
providerScope: "repo user"
|
|
32
|
+
}, iface.createSession({
|
|
33
|
+
refreshToken: null,
|
|
34
|
+
accessToken: null
|
|
35
|
+
}));
|
|
36
|
+
const url = new URL(location);
|
|
37
|
+
expect(`${url.origin}${url.pathname}`).toBe("https://api.example.com/api/v1/auth/oauth/authorize/github");
|
|
38
|
+
expect(Object.fromEntries(url.searchParams.entries())).toMatchInlineSnapshot(`
|
|
39
|
+
{
|
|
40
|
+
"after_callback_redirect_url": "http://localhost:3000/account?after_auth_return_to=%2Fsettings",
|
|
41
|
+
"client_id": "00000000-0000-4000-8000-000000000000",
|
|
42
|
+
"client_secret": "pck_test",
|
|
43
|
+
"code_challenge": "<stripped code challenge>",
|
|
44
|
+
"code_challenge_method": "S256",
|
|
45
|
+
"error_redirect_url": "http://localhost:3000/handler/error?after_auth_return_to=%2Fsettings",
|
|
46
|
+
"grant_type": "authorization_code",
|
|
47
|
+
"provider_scope": "repo user",
|
|
48
|
+
"redirect_uri": "http://localhost:3000/handler/oauth-callback?after_auth_return_to=%2Fsettings",
|
|
49
|
+
"response_type": "code",
|
|
50
|
+
"scope": "legacy",
|
|
51
|
+
"state": "<stripped state>",
|
|
52
|
+
"type": "link",
|
|
53
|
+
}
|
|
54
|
+
`);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { };
|
|
60
|
+
//# sourceMappingURL=auth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.test.js","names":[],"sources":["../../../src/lib/auth.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 { HexclaveClientInterface } from \"@stackframe/stack-shared\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport { getNewOAuthProviderOrScopeUrl } from \"./auth\";\n\nvi.mock(\"./cookie\", async (importOriginal) => {\n const actual = await importOriginal<typeof import(\"./cookie\")>();\n return {\n ...actual,\n saveVerifierAndState: async () => ({\n codeChallenge: \"<stripped code challenge>\",\n state: \"<stripped state>\",\n }),\n };\n});\n\ndescribe(\"getNewOAuthProviderOrScopeUrl\", () => {\n it(\"returns the OAuth URL without performing navigation\", async () => {\n window.history.replaceState({}, \"\", \"/account?after_auth_return_to=%2Fsettings\");\n\n const iface = new HexclaveClientInterface({\n clientVersion: \"test\",\n getBaseUrl: () => \"https://api.example.com\",\n getApiUrls: () => [\"https://api.example.com\"],\n extraRequestHeaders: {},\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"pck_test\",\n });\n const session = iface.createSession({ refreshToken: null, accessToken: null });\n\n const location = await getNewOAuthProviderOrScopeUrl(\n iface,\n {\n provider: \"github\",\n redirectUrl: \"/handler/oauth-callback\",\n errorRedirectUrl: \"/handler/error\",\n providerScope: \"repo user\",\n },\n session,\n );\n\n const url = new URL(location);\n expect(`${url.origin}${url.pathname}`).toBe(\"https://api.example.com/api/v1/auth/oauth/authorize/github\");\n expect(Object.fromEntries(url.searchParams.entries())).toMatchInlineSnapshot(`\n {\n \"after_callback_redirect_url\": \"http://localhost:3000/account?after_auth_return_to=%2Fsettings\",\n \"client_id\": \"00000000-0000-4000-8000-000000000000\",\n \"client_secret\": \"pck_test\",\n \"code_challenge\": \"<stripped code challenge>\",\n \"code_challenge_method\": \"S256\",\n \"error_redirect_url\": \"http://localhost:3000/handler/error?after_auth_return_to=%2Fsettings\",\n \"grant_type\": \"authorization_code\",\n \"provider_scope\": \"repo user\",\n \"redirect_uri\": \"http://localhost:3000/handler/oauth-callback?after_auth_return_to=%2Fsettings\",\n \"response_type\": \"code\",\n \"scope\": \"legacy\",\n \"state\": \"<stripped state>\",\n \"type\": \"link\",\n }\n `);\n });\n});\n"],"mappings":";;;;;;AAUA,GAAG,KAAK,YAAY,OAAO,mBAAmB;AAE5C,QAAO;EACL,GAFa,MAAM,gBAA2C;EAG9D,sBAAsB,aAAa;GACjC,eAAe;GACf,OAAO;GACR;EACF;EACD;AAEF,SAAS,uCAAuC;AAC9C,IAAG,uDAAuD,YAAY;AACpE,SAAO,QAAQ,aAAa,EAAE,EAAE,IAAI,4CAA4C;EAEhF,MAAM,QAAQ,IAAI,wBAAwB;GACxC,eAAe;GACf,kBAAkB;GAClB,kBAAkB,CAAC,0BAA0B;GAC7C,qBAAqB,EAAE;GACvB,WAAW;GACX,sBAAsB;GACvB,CAAC;EAGF,MAAM,WAAW,MAAM,8BACrB,OACA;GACE,UAAU;GACV,aAAa;GACb,kBAAkB;GAClB,eAAe;GAChB,EATa,MAAM,cAAc;GAAE,cAAc;GAAM,aAAa;GAAM,CAAC,CAW7E;EAED,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,SAAO,GAAG,IAAI,SAAS,IAAI,WAAW,CAAC,KAAK,6DAA6D;AACzG,SAAO,OAAO,YAAY,IAAI,aAAa,SAAS,CAAC,CAAC,CAAC,sBAAsB;;;;;;;;;;;;;;;;MAgB3E;GACF;EACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
//#region src/lib/cookie.d.ts
|
|
2
|
+
type SetCookieOptions = {
|
|
3
|
+
maxAge: number | "session";
|
|
4
|
+
noOpIfServerComponent?: boolean;
|
|
5
|
+
domain?: string;
|
|
6
|
+
secure?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type DeleteCookieOptions = {
|
|
9
|
+
noOpIfServerComponent?: boolean;
|
|
10
|
+
domain?: string;
|
|
11
|
+
};
|
|
12
|
+
type CookieHelper = {
|
|
13
|
+
get: (name: string) => string | null;
|
|
14
|
+
getAll: () => Record<string, string>;
|
|
15
|
+
set: (name: string, value: string, options: SetCookieOptions) => void;
|
|
16
|
+
setOrDelete: (name: string, value: string | null, options: SetCookieOptions & DeleteCookieOptions) => void;
|
|
17
|
+
delete: (name: string, options: DeleteCookieOptions) => void;
|
|
18
|
+
};
|
|
19
|
+
declare function createPlaceholderCookieHelper(): Promise<CookieHelper>;
|
|
20
|
+
declare function createCookieHelper(): Promise<CookieHelper>;
|
|
21
|
+
declare function createCookieHelperSync(): CookieHelper;
|
|
22
|
+
declare function createBrowserCookieHelper(): CookieHelper;
|
|
23
|
+
declare function getCookieClient(name: string): string | null;
|
|
24
|
+
declare function getAllCookiesClient(): Record<string, string>;
|
|
25
|
+
declare function getCookie(name: string): Promise<string | null>;
|
|
26
|
+
declare function isSecure(): Promise<boolean>;
|
|
27
|
+
declare function setOrDeleteCookieClient(name: string, value: string | null, options: SetCookieOptions & DeleteCookieOptions): void;
|
|
28
|
+
declare function setOrDeleteCookie(name: string, value: string | null, options: SetCookieOptions & DeleteCookieOptions): Promise<void>;
|
|
29
|
+
declare function deleteCookieClient(name: string, options: DeleteCookieOptions): void;
|
|
30
|
+
declare function deleteCookie(name: string, options: DeleteCookieOptions): Promise<void>;
|
|
31
|
+
declare function setCookieClient(name: string, value: string, options: SetCookieOptions): void;
|
|
32
|
+
declare function setCookie(name: string, value: string, options: SetCookieOptions): Promise<void>;
|
|
33
|
+
declare function saveVerifierAndState(): Promise<{
|
|
34
|
+
codeChallenge: string;
|
|
35
|
+
state: string;
|
|
36
|
+
}>;
|
|
37
|
+
declare function consumeVerifierAndStateCookie(state: string): {
|
|
38
|
+
codeVerifier: string;
|
|
39
|
+
} | null;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { CookieHelper, consumeVerifierAndStateCookie, createBrowserCookieHelper, createCookieHelper, createCookieHelperSync, createPlaceholderCookieHelper, deleteCookie, deleteCookieClient, getAllCookiesClient, getCookie, getCookieClient, isSecure, saveVerifierAndState, setCookie, setCookieClient, setOrDeleteCookie, setOrDeleteCookieClient };
|
|
42
|
+
//# sourceMappingURL=cookie.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie.d.ts","names":[],"sources":["../../../src/lib/cookie.ts"],"mappings":";KAqEK,gBAAA;EAAqB,MAAA;EAA4B,qBAAA;EAAiC,MAAA;EAAiB,MAAA;AAAA;AAAA,KACnG,mBAAA;EAAwB,qBAAA;EAAiC,MAAA;AAAA;AAAA,KASlD,YAAA;EACV,GAAA,GAAM,IAAA;EACN,MAAA,QAAc,MAAA;EACd,GAAA,GAAM,IAAA,UAAc,KAAA,UAAe,OAAA,EAAS,gBAAA;EAC5C,WAAA,GAAc,IAAA,UAAc,KAAA,iBAAsB,OAAA,EAAS,gBAAA,GAAmB,mBAAA;EAC9E,MAAA,GAAS,IAAA,UAAc,OAAA,EAAS,mBAAA;AAAA;AAAA,iBAIZ,6BAAA,CAAA,GAAiC,OAAA,CAAQ,YAAA;AAAA,iBAuBzC,kBAAA,CAAA,GAAsB,OAAA,CAAQ,YAAA;AAAA,iBAQpC,sBAAA,CAAA,GAA0B,YAAA;AAAA,iBAiB1B,yBAAA,CAAA,GAA6B,YAAA;AAAA,iBAuB7B,eAAA,CAAgB,IAAA;AAAA,iBAKhB,mBAAA,CAAA,GAAuB,MAAA;AAAA,iBASjB,SAAA,CAAU,IAAA,WAAe,OAAA;AAAA,iBAKzB,QAAA,CAAA,GAAY,OAAA;AAAA,iBAqFlB,uBAAA,CAAwB,IAAA,UAAc,KAAA,iBAAsB,OAAA,EAAS,gBAAA,GAAmB,mBAAA;AAAA,iBASlF,iBAAA,CAAkB,IAAA,UAAc,KAAA,iBAAsB,OAAA,EAAS,gBAAA,GAAmB,mBAAA,GAAmB,OAAA;AAAA,iBAK3G,kBAAA,CAAmB,IAAA,UAAc,OAAA,EAAS,mBAAA;AAAA,iBAKpC,YAAA,CAAa,IAAA,UAAc,OAAA,EAAS,mBAAA,GAAmB,OAAA;AAAA,iBAK7D,eAAA,CAAgB,IAAA,UAAc,KAAA,UAAe,OAAA,EAAS,gBAAA;AAAA,iBAKhD,SAAA,CAAU,IAAA,UAAc,KAAA,UAAe,OAAA,EAAS,gBAAA,GAAgB,OAAA;AAAA,iBAKhE,oBAAA,CAAA,GAAoB,OAAA;;;;iBAe1B,6BAAA,CAA8B,KAAA;EAAA,YAAA;AAAA"}
|