@hexclave/next 1.0.73 → 1.0.74

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.
Files changed (141) hide show
  1. package/dist/{admin-app-impl-D867jXHk.d.ts → admin-app-impl-FZdANO62.d.ts} +10 -4
  2. package/dist/admin-app-impl-FZdANO62.d.ts.map +1 -0
  3. package/dist/clickmap/clickmap-core.d.ts +1 -1
  4. package/dist/clickmap/index.d.ts +1 -1
  5. package/dist/{client-app-B931IBrx.d.ts → client-app-BCT5p_70.d.ts} +11 -3
  6. package/dist/{client-app-B931IBrx.d.ts.map → client-app-BCT5p_70.d.ts.map} +1 -1
  7. package/dist/components/elements/sidebar-layout.js +1 -1
  8. package/dist/components/selected-team-switcher.d.ts +1 -1
  9. package/dist/components/team-icon.d.ts +1 -1
  10. package/dist/components/team-switcher.d.ts +1 -1
  11. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  12. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  13. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  14. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  15. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  16. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  17. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  18. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  19. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  20. package/dist/components-page/hexclave-handler-client.d.ts +1 -1
  21. package/dist/components-page/hexclave-handler.d.ts +1 -1
  22. package/dist/components-page/oauth-callback.js +3 -18
  23. package/dist/components-page/oauth-callback.js.map +1 -1
  24. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  25. package/dist/dev-tool/index.d.ts +1 -1
  26. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  27. package/dist/esm/components-page/oauth-callback.d.ts.map +1 -1
  28. package/dist/esm/components-page/oauth-callback.js +4 -19
  29. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  30. package/dist/esm/lib/auth.d.ts.map +1 -1
  31. package/dist/esm/lib/auth.js +1 -1
  32. package/dist/esm/lib/auth.js.map +1 -1
  33. package/dist/esm/lib/auth.test.js +2 -2
  34. package/dist/esm/lib/auth.test.js.map +1 -1
  35. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +3 -0
  36. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  37. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.d.ts +1 -0
  38. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +102 -0
  39. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -0
  40. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +57 -1
  41. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
  42. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +5 -2
  43. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  44. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +44 -12
  45. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  46. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
  47. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.d.ts +13 -1
  48. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.d.ts.map +1 -1
  49. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.js +15 -1
  50. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.js.map +1 -1
  51. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.test.js +25 -1
  52. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-back-state.test.js.map +1 -1
  53. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +1 -0
  54. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  55. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js +67 -12
  56. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
  57. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.d.ts +1 -0
  58. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +87 -0
  59. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -0
  60. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +9 -1
  61. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  62. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  63. package/dist/esm/utils/url.js +10 -2
  64. package/dist/esm/utils/url.js.map +1 -1
  65. package/dist/esm/utils/url.test.d.ts +1 -0
  66. package/dist/esm/utils/url.test.js +28 -0
  67. package/dist/esm/utils/url.test.js.map +1 -0
  68. package/dist/{hexclave-provider-DkFUT3Fa.d.ts → hexclave-provider-BKxi3Vy-.d.ts} +2 -2
  69. package/dist/{hexclave-provider-DkFUT3Fa.d.ts.map → hexclave-provider-BKxi3Vy-.d.ts.map} +1 -1
  70. package/dist/{hooks-4PMrTtJr.d.ts → hooks-CUe5bc3s.d.ts} +2 -2
  71. package/dist/{hooks-4PMrTtJr.d.ts.map → hooks-CUe5bc3s.d.ts.map} +1 -1
  72. package/dist/{index-C9bAeWRr.d.ts → index-CvB7XacB.d.ts} +2 -2
  73. package/dist/{index-C9bAeWRr.d.ts.map → index-CvB7XacB.d.ts.map} +1 -1
  74. package/dist/index.d.ts +4 -4
  75. package/dist/lib/auth.d.ts.map +1 -1
  76. package/dist/lib/auth.js +1 -1
  77. package/dist/lib/auth.js.map +1 -1
  78. package/dist/lib/auth.test.js +2 -2
  79. package/dist/lib/auth.test.js.map +1 -1
  80. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  81. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.d.ts +1 -0
  82. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +101 -0
  83. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -0
  84. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +57 -1
  85. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
  86. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  87. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +43 -11
  88. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  89. package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
  90. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  91. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.d.ts +13 -1
  92. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.d.ts.map +1 -1
  93. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.js +15 -0
  94. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.js.map +1 -1
  95. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.test.js +24 -0
  96. package/dist/lib/hexclave-app/apps/implementations/redirect-back-state.test.js.map +1 -1
  97. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +1 -1
  98. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js +67 -12
  99. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -1
  100. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.d.ts +1 -0
  101. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +86 -0
  102. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -0
  103. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  104. package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
  105. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
  106. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  107. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  108. package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
  109. package/dist/lib/hexclave-app/index.d.ts +1 -1
  110. package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
  111. package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
  112. package/dist/lib/hexclave-app/users/index.d.ts +1 -1
  113. package/dist/lib/hooks.d.ts +1 -1
  114. package/dist/oauth-callback-tCVTRbF2.d.ts.map +1 -1
  115. package/dist/providers/hexclave-context.d.ts +1 -1
  116. package/dist/providers/hexclave-provider-client.d.ts +1 -1
  117. package/dist/providers/hexclave-provider.d.ts +1 -1
  118. package/dist/pushed-config-error-overlay/index.d.ts +1 -1
  119. package/dist/{redirect-page-urls-NUHUchgR.d.ts → redirect-page-urls-BEWG0AtP.d.ts} +2 -1
  120. package/dist/redirect-page-urls-BEWG0AtP.d.ts.map +1 -0
  121. package/dist/utils/url.js +10 -2
  122. package/dist/utils/url.js.map +1 -1
  123. package/dist/utils/url.test.d.ts +1 -0
  124. package/dist/utils/url.test.js +27 -0
  125. package/dist/utils/url.test.js.map +1 -0
  126. package/package.json +4 -4
  127. package/src/components-page/oauth-callback.tsx +0 -16
  128. package/src/lib/auth.test.ts +2 -2
  129. package/src/lib/auth.ts +3 -1
  130. package/src/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.ts +126 -0
  131. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +75 -0
  132. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +73 -16
  133. package/src/lib/hexclave-app/apps/implementations/redirect-back-state.test.ts +29 -1
  134. package/src/lib/hexclave-app/apps/implementations/redirect-back-state.ts +17 -0
  135. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.test.ts +119 -0
  136. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +104 -12
  137. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +12 -2
  138. package/src/utils/url.test.ts +54 -0
  139. package/src/utils/url.ts +12 -3
  140. package/dist/admin-app-impl-D867jXHk.d.ts.map +0 -1
  141. package/dist/redirect-page-urls-NUHUchgR.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client-app-impl.cross-domain.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it, vi } from \"vitest\";\nimport { AccessToken } from \"@hexclave/shared/dist/sessions\";\nimport { Store } from \"@hexclave/shared/dist/utils/stores\";\nimport { hexclaveAppInternalsSymbol } from \"../../common\";\nimport { StackClientApp } from \"../interfaces/client-app\";\n\nfunction createAccessTokenString(refreshTokenId: string): string {\n const encode = (value: unknown) => Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n const nowSeconds = Math.floor(Date.now() / 1000);\n return [\n encode({ alg: \"none\", typ: \"JWT\" }),\n encode({\n sub: \"user-id\",\n exp: nowSeconds + 60,\n iat: nowSeconds,\n iss: \"https://api.example.test\",\n aud: \"project-id\",\n project_id: \"project-id\",\n branch_id: \"main\",\n refresh_token_id: refreshTokenId,\n role: \"authenticated\",\n name: null,\n email: null,\n email_verified: false,\n selected_team_id: null,\n signed_up_at: nowSeconds,\n is_anonymous: false,\n is_restricted: false,\n restricted_reason: null,\n requires_totp_mfa: false,\n }),\n \"\",\n ].join(\".\");\n}\n\nfunction createMockDocument(): Document {\n const cookieJar = new Map<string, string>();\n return {\n get cookie() {\n return [...cookieJar.entries()].map(([key, value]) => `${key}=${value}`).join(\"; \");\n },\n set cookie(str: string) {\n const [nameValue] = str.split(\";\");\n const eqIndex = nameValue.indexOf(\"=\");\n if (eqIndex < 0) return;\n cookieJar.set(nameValue.slice(0, eqIndex).trim(), nameValue.slice(eqIndex + 1).trim());\n },\n createElement: () => ({}),\n } as any;\n}\n\ndescribe(\"StackClientApp cross-domain auth\", () => {\n it(\"exposes redirect-back-aware handler URLs for devtool previews\", async () => {\n const previousWindow = Reflect.get(globalThis, \"window\");\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n Reflect.set(globalThis, \"window\", {\n location: {\n href: \"http://localhost/music?track=1#song\",\n },\n });\n\n try {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n urls: {\n signIn: \"/handler/sign-in\",\n },\n noAutomaticPrefetch: true,\n });\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"signIn\");\n\n const resolved = new URL(redirectUrl, \"http://localhost\");\n expect(resolved.pathname).toBe(\"/handler/sign-in\");\n expect(resolved.searchParams.get(\"after_auth_return_to\")).toBe(\"/music?track=1#song\");\n } finally {\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"uses the fresh post-auth refresh token when minting a cross-domain handoff\", async () => {\n const freshAccessToken = createAccessTokenString(\"fresh-refresh-token-id\");\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: {\n accessToken: createAccessTokenString(\"stale-refresh-token-id\"),\n refreshToken: \"stale-refresh-token\",\n },\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalSendClientRequest = Reflect.get(clientInterface, \"sendClientRequest\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n const capturedRefreshTokens: string[] = [];\n const capturedAccessTokenRefreshTokenIds: string[] = [];\n const refreshedRawRefreshTokens: string[] = [];\n\n Reflect.set(clientInterface, \"sendClientRequest\", async (_path: unknown, _requestOptions: unknown, session: unknown) => {\n const getRefreshToken = Reflect.get(session ?? {}, \"getRefreshToken\");\n const getOrFetchLikelyValidTokens = Reflect.get(session ?? {}, \"getOrFetchLikelyValidTokens\");\n if (typeof getRefreshToken !== \"function\") {\n throw new Error(\"Expected cross-domain auth to pass a session to the client interface.\");\n }\n if (typeof getOrFetchLikelyValidTokens !== \"function\") {\n throw new Error(\"Expected cross-domain auth to pass a session with token accessors.\");\n }\n const refreshToken = getRefreshToken.call(session);\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected cross-domain auth to pass a refresh-token-backed session.\");\n }\n capturedRefreshTokens.push(refreshTokenString);\n const tokens = await getOrFetchLikelyValidTokens.call(session, 0, null);\n capturedAccessTokenRefreshTokenIds.push(tokens.accessToken.payload.refresh_token_id);\n return {\n ok: true,\n json: async () => ({ redirect_url: \"https://example.com/handler/oauth-callback?code=handoff-code&state=handoff-state\" }),\n };\n });\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async (refreshToken: unknown) => {\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected refresh token while fetching a new access token.\");\n }\n refreshedRawRefreshTokens.push(refreshTokenString);\n return AccessToken.createIfValid(freshAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n try {\n const createCrossDomainAuthRedirectUrl = Reflect.get(clientApp, \"_createCrossDomainAuthRedirectUrl\");\n if (typeof createCrossDomainAuthRedirectUrl !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _createCrossDomainAuthRedirectUrl in tests.\");\n }\n\n await expect(createCrossDomainAuthRedirectUrl.call(clientApp, {\n redirectUri: \"https://example.com/handler/oauth-callback\",\n state: \"handoff-state\",\n codeChallenge: \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\",\n afterCallbackRedirectUrl: \"https://example.com/account-settings\",\n overrideTokenStoreInit: {\n accessToken: createAccessTokenString(\"fresh-stale-refresh-token-id\"),\n refreshToken: \"fresh-refresh-token\",\n },\n })).resolves.toBe(\"https://example.com/handler/oauth-callback?code=handoff-code&state=handoff-state\");\n } finally {\n Reflect.set(clientInterface, \"sendClientRequest\", originalSendClientRequest);\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n }\n\n expect(refreshedRawRefreshTokens).toEqual([\"fresh-refresh-token\"]);\n expect(capturedRefreshTokens).toEqual([\"fresh-refresh-token\"]);\n expect(capturedAccessTokenRefreshTokenIds).toEqual([\"fresh-refresh-token-id\"]);\n });\n\n it(\"uses a fresh nested OAuth state while preserving the outer cross-domain return state\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000002\";\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const outerState = \"outer-cross-domain-state\";\n const outerCodeChallenge = \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\";\n const currentUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n currentUrl.searchParams.set(\"after_auth_return_to\", `https://demo.stack-auth.com/?hexclave_cross_domain_auth=1&hexclave_cross_domain_state=${outerState}`);\n currentUrl.searchParams.set(\"hexclave_cross_domain_state\", outerState);\n currentUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", outerCodeChallenge);\n currentUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", \"https://demo.stack-auth.com/\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-session\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/\");\n\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n vi.spyOn(clientApp as any, \"_fetchCurrentRefreshTokenIdIfSignedIn\").mockResolvedValue(null);\n vi.spyOn(clientApp as any, \"_getCrossDomainHandoffParamsForRedirect\").mockResolvedValue({\n state: \"fresh-nested-state\",\n codeChallenge: \"fresh-nested-code-challenge\",\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentUrl.toString(),\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n const redirectUrl = new URL(redirectedUrl);\n expect(redirectUrl.searchParams.get(\"state\")).toBe(\"fresh-nested-state\");\n expect(redirectUrl.searchParams.get(\"code_challenge\")).toBe(\"fresh-nested-code-challenge\");\n const redirectUri = new URL(redirectUrl.searchParams.get(\"redirect_uri\") ?? \"\");\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_state\")).toBe(outerState);\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_code_challenge\")).toBe(outerCodeChallenge);\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_after_callback_redirect_url\")).toBe(\"https://demo.stack-auth.com/\");\n });\n\n it(\"clears a stale target-domain session before deferring to the source-domain session\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000006\";\n const hostedAccessToken = createAccessTokenString(\"hosted-old-refresh-token-id\");\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const tokenStore = Reflect.get(clientApp, \"_memoryTokenStore\");\n if (!(tokenStore instanceof Store)) {\n throw new Error(\"Expected StackClientApp to use a memory token store in this test.\");\n }\n tokenStore.set({\n refreshToken: \"hosted-old-refresh-token\",\n accessToken: hostedAccessToken,\n });\n\n const currentUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-anonymous-refresh-token-id\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/handler/oauth-callback\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_state\", \"outer-state\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", \"outer-code-challenge\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", \"https://demo.stack-auth.com/app\");\n\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async () => {\n return AccessToken.createIfValid(hostedAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentUrl.toString(),\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(tokenStore.get()).toEqual({\n refreshToken: null,\n accessToken: null,\n });\n expect(new URL(redirectedUrl).origin).toBe(\"https://demo.stack-auth.com\");\n });\n\n it(\"uses the latest browser refresh cookie before computing nested cross-domain session IDs\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000007\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: \"https://demo.stack-auth.com/\",\n protocol: \"https:\",\n hostname: \"demo.stack-auth.com\",\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n } as any;\n\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"cookie\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n const refreshedRawRefreshTokens: string[] = [];\n\n // Cookie-store writes queue a background trusted-parent-domain lookup. Without this stub, that\n // lookup fetches the (unreachable) baseUrl with retries while holding the global store lock,\n // which starves any later test that needs the write lock (e.g. signOut). Not restored on\n // purpose: queued tasks can still run after this test body finishes.\n vi.spyOn(clientApp as any, \"_getTrustedParentDomain\").mockResolvedValue(null);\n\n try {\n const getBrowserCookieTokenStore = Reflect.get(clientApp, \"_getBrowserCookieTokenStore\");\n if (typeof getBrowserCookieTokenStore !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _getBrowserCookieTokenStore in tests.\");\n }\n const tokenStore = getBrowserCookieTokenStore.call(clientApp);\n tokenStore.set({\n refreshToken: \"old-refresh-token\",\n accessToken: createAccessTokenString(\"old-refresh-token-id\"),\n });\n\n document.cookie = `__Host-hexclave-refresh-${projectId}--default=${JSON.stringify({\n refresh_token: \"new-refresh-token\",\n updated_at_millis: 1,\n })}`;\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async (refreshToken: unknown) => {\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected refresh token while fetching a new access token.\");\n }\n refreshedRawRefreshTokens.push(refreshTokenString);\n return AccessToken.createIfValid(createAccessTokenString(\"new-refresh-token-id\")) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n const fetchCurrentRefreshTokenIdIfSignedIn = Reflect.get(clientApp, \"_fetchCurrentRefreshTokenIdIfSignedIn\");\n if (typeof fetchCurrentRefreshTokenIdIfSignedIn !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _fetchCurrentRefreshTokenIdIfSignedIn in tests.\");\n }\n await expect(fetchCurrentRefreshTokenIdIfSignedIn.call(clientApp, {\n awaitPendingAuthResolutions: false,\n })).resolves.toBe(\"new-refresh-token-id\");\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(refreshedRawRefreshTokens).toEqual([\"new-refresh-token\"]);\n });\n\n it(\"does not re-bounce nested cross-domain auth after the OAuth callback consumed code+state from the URL\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000008\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n const strippedUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n strippedUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-refresh-token-id\");\n strippedUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/\");\n const urlAtConstructionTime = new URL(strippedUrl);\n urlAtConstructionTime.searchParams.set(\"code\", \"one-time-code\");\n urlAtConstructionTime.searchParams.set(\"state\", \"nested-oauth-state\");\n\n // Construct before installing the window mock so the constructor does not schedule its own\n // nested-auth resolution; the assertions below drive the handler explicitly.\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: strippedUrl.toString(),\n replace: () => {\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n vi.spyOn(clientApp as any, \"_fetchCurrentRefreshTokenIdIfSignedIn\").mockResolvedValue(null);\n vi.spyOn(clientApp as any, \"_getCrossDomainHandoffParamsForRedirect\").mockResolvedValue({\n state: \"fresh-nested-state\",\n codeChallenge: \"fresh-nested-code-challenge\",\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n try {\n // Without the construction-time URL, the handler re-bounces (location.replace aborts).\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n // With it, the in-flight OAuth callback wins and the handler stands down.\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth(urlAtConstructionTime)).resolves.toBe(false);\n // The live-URL guard must also stand down on its own when code+state are still present.\n (globalThis.window as any).location.href = urlAtConstructionTime.toString();\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).resolves.toBe(false);\n } finally {\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n });\n\n it(\"passes the construction-time URL to the nested cross-domain auth handler\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000009\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n const callbackUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n callbackUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-refresh-token-id\");\n callbackUrl.searchParams.set(\"code\", \"one-time-code\");\n callbackUrl.searchParams.set(\"state\", \"nested-oauth-state\");\n const strippedUrl = new URL(callbackUrl);\n strippedUrl.searchParams.delete(\"code\");\n strippedUrl.searchParams.delete(\"state\");\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: callbackUrl.toString(),\n },\n } as any;\n\n const nestedAuthSpy = vi.spyOn(StackClientApp.prototype as any, \"_maybeHandleNestedCrossDomainAuth\").mockResolvedValue(false);\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n // Simulate consumeOAuthCallbackQueryParams stripping code+state before microtasks run.\n (globalThis.window as any).location.href = strippedUrl.toString();\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n expect(nestedAuthSpy).toHaveBeenCalledTimes(1);\n const urlArgument = nestedAuthSpy.mock.calls[0][0] as URL;\n expect(urlArgument).toBeInstanceOf(URL);\n expect(urlArgument.searchParams.get(\"code\")).toBe(\"one-time-code\");\n expect(urlArgument.searchParams.get(\"state\")).toBe(\"nested-oauth-state\");\n } finally {\n nestedAuthSpy.mockRestore();\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n });\n\n it(\"redirects hosted current-page OAuth callback errors to the hosted error handler during startup\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000010\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n const callbackUrl = new URL(\"https://demo.stack-auth.com/dashboard\");\n callbackUrl.searchParams.set(\"errorCode\", \"SIGN_UP_REJECTED\");\n callbackUrl.searchParams.set(\"message\", \"Your sign up was rejected by an administrator's sign-up rule.\");\n callbackUrl.searchParams.set(\"details\", JSON.stringify({\n message: \"Your sign up was rejected by an administrator's sign-up rule.\",\n }));\n let currentHref = callbackUrl.toString();\n let redirectedUrl = \"\";\n const redirectSpy = vi.spyOn(StackClientApp.prototype as any, \"_redirectTo\").mockImplementation(async (...args: unknown[]) => {\n const options = args[0] as { url: string | URL };\n redirectedUrl = options.url.toString();\n });\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n get href() {\n return currentHref;\n },\n set href(value: string) {\n currentHref = value;\n },\n origin: callbackUrl.origin,\n },\n history: {\n replaceState: (_state: unknown, _title: string, url: string) => {\n currentHref = new URL(url, currentHref).toString();\n },\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n } as any;\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n } finally {\n redirectSpy.mockRestore();\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n const errorUrl = new URL(redirectedUrl);\n expect(errorUrl.origin).toBe(`https://${projectId}.built-with-hexclave.com`);\n expect(errorUrl.pathname).toBe(\"/handler/error\");\n expect(errorUrl.searchParams.get(\"errorCode\")).toBe(\"SIGN_UP_REJECTED\");\n expect(errorUrl.searchParams.get(\"message\")).toBe(\"Your sign up was rejected by an administrator's sign-up rule.\");\n expect(new URL(currentHref).searchParams.has(\"errorCode\")).toBe(false);\n });\n\n it(\"uses direct sign-out instead of hosted sign-out redirects when code execution is available\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n handler: \"/handler\",\n signOut: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const signOutSpy = vi.spyOn(clientApp, \"signOut\").mockRejectedValue(new Error(\"INTENTIONAL_TEST_ABORT\"));\n\n try {\n await expect(clientApp.redirectToSignOut()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n expect(signOutSpy).toHaveBeenCalledWith();\n } finally {\n signOutSpy.mockRestore();\n }\n });\n\n it(\"throws when public app.urls reads would return hosted component URLs\", () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n\n expect(() => clientApp.urls.signIn).toThrowError(/app\\.urls\\.signIn cannot be used when this app is configured to use hosted components.*Use app\\.redirectToSignIn\\(\\) instead/s);\n expect(() => clientApp.urls.signOut).toThrowError(/app\\.urls\\.signOut cannot be used when this app is configured to use hosted components.*Use app\\.redirectToSignOut\\(\\) instead/s);\n expect(clientApp.urls.afterSignIn).toBe(\"/\");\n });\n\n it(\"keeps public app.urls reads available for non-hosted targets\", () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n handler: \"/custom-handler\",\n },\n noAutomaticPrefetch: true,\n });\n\n expect(clientApp.urls.signIn).toBe(\"/custom-handler/sign-in\");\n });\n\n it(\"keeps default hosted signOut() on the source domain when afterSignOut is not configured\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000004\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const currentHref = \"https://demo.stack-auth.com/settings?tab=profile\";\n\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalSignOut = Reflect.get(clientInterface, \"signOut\");\n Reflect.set(clientInterface, \"signOut\", async () => {});\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentHref,\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n const signOut = Reflect.get(clientApp, \"_signOut\");\n if (typeof signOut !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _signOut in tests.\");\n }\n await expect(signOut.call(clientApp, Reflect.get(clientInterface, \"createSession\").call(clientInterface, {\n refreshToken: null,\n }))).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n Reflect.set(clientInterface, \"signOut\", originalSignOut);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(redirectedUrl).toBe(\"/settings?tab=profile\");\n });\n\n it(\"restores a dropped after_auth_return_to from the sessionStorage mirror when redirecting after sign-in\", async () => {\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const sessionStorageMap = new Map<string, string>();\n const windowMock = {\n location: {\n href: \"https://demo.example.test/handler/sign-in?after_auth_return_to=%2Fmusic%3Ftrack%3D1\",\n },\n sessionStorage: {\n getItem: (key: string) => sessionStorageMap.get(key) ?? null,\n setItem: (key: string, value: string) => {\n sessionStorageMap.set(key, value);\n },\n removeItem: (key: string) => {\n sessionStorageMap.delete(key);\n },\n },\n };\n Reflect.set(globalThis, \"window\", windowMock);\n globalThis.document = createMockDocument();\n\n try {\n // The constructor mirrors the redirect-back state from the arrival URL into sessionStorage.\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000011\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n // Intermediate hops (MFA, magic link, OAuth round-trips, ...) dropped the query params.\n windowMock.location.href = \"https://demo.example.test/handler/mfa\";\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\");\n expect(redirectUrl).toBe(\"/music?track=1\");\n\n // noRedirectBack opts out of the mirror just like it opts out of the query param.\n const noRedirectBackUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\", { noRedirectBack: true });\n expect(new URL(noRedirectBackUrl, \"https://demo.example.test\").pathname).toBe(\"/\");\n } finally {\n globalThis.document = previousDocument;\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"restores dropped cross-domain handoff state from the sessionStorage mirror when redirecting after sign-in\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000012\";\n const previousWindow = globalThis.window;\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const sessionStorageMap = new Map<string, string>();\n\n const handoffState = \"mirror-handoff-state\";\n const handoffCodeChallenge = \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\";\n const handoffAfterCallbackRedirect = \"https://demo.example.test/dashboard\";\n const redirectBackUrl = new URL(\"https://demo.example.test/handler/oauth-callback\");\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_auth\", \"1\");\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_state\", handoffState);\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", handoffCodeChallenge);\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", handoffAfterCallbackRedirect);\n\n const arrivalUrl = new URL(`https://${projectId}.built-with-hexclave.com/handler/sign-in`);\n arrivalUrl.searchParams.set(\"after_auth_return_to\", redirectBackUrl.toString());\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_state\", handoffState);\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", handoffCodeChallenge);\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", handoffAfterCallbackRedirect);\n\n const previousDocument = globalThis.document;\n const windowMock = {\n location: {\n href: arrivalUrl.toString(),\n },\n sessionStorage: {\n getItem: (key: string) => sessionStorageMap.get(key) ?? null,\n setItem: (key: string, value: string) => {\n sessionStorageMap.set(key, value);\n },\n removeItem: (key: string) => {\n sessionStorageMap.delete(key);\n },\n },\n };\n Reflect.set(globalThis, \"window\", windowMock);\n globalThis.document = createMockDocument();\n\n try {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n const crossDomainAuthorizeRedirect = \"https://demo.example.test/handler/oauth-callback?code=minted-code&state=mirror-handoff-state\";\n const createCrossDomainAuthRedirectUrlSpy = vi\n .spyOn(clientApp as any, \"_createCrossDomainAuthRedirectUrl\")\n .mockResolvedValue(crossDomainAuthorizeRedirect);\n\n // All redirect-back query params were dropped before the after-sign-in redirect.\n windowMock.location.href = `https://${projectId}.built-with-hexclave.com/handler/sign-in`;\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\");\n\n expect(createCrossDomainAuthRedirectUrlSpy).toHaveBeenCalledWith(expect.objectContaining({\n redirectUri: redirectBackUrl.toString(),\n state: handoffState,\n codeChallenge: handoffCodeChallenge,\n afterCallbackRedirectUrl: handoffAfterCallbackRedirect,\n }));\n expect(redirectUrl).toBe(crossDomainAuthorizeRedirect);\n } finally {\n globalThis.document = previousDocument;\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"ignores stale session callbacks after a newer refresh token owns the token store\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000005\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n const oldAccessToken = createAccessTokenString(\"old-refresh-token-id\");\n const refreshedOldAccessToken = createAccessTokenString(\"refreshed-old-refresh-token-id\");\n const newAccessToken = createAccessTokenString(\"new-refresh-token-id\");\n const tokenStore = new Store({\n refreshToken: \"old-refresh-token\",\n accessToken: oldAccessToken,\n });\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async () => {\n return AccessToken.createIfValid(refreshedOldAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n try {\n const getSessionFromTokenStore = Reflect.get(clientApp, \"_getSessionFromTokenStore\");\n if (typeof getSessionFromTokenStore !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _getSessionFromTokenStore in tests.\");\n }\n const oldSession = getSessionFromTokenStore.call(clientApp, tokenStore);\n tokenStore.set({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n\n await oldSession.fetchNewTokens();\n expect(tokenStore.get()).toEqual({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n\n oldSession.markInvalid();\n expect(tokenStore.get()).toEqual({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n }\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"client-app-impl.cross-domain.test.js","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it, vi } from \"vitest\";\nimport { AccessToken } from \"@hexclave/shared/dist/sessions\";\nimport { Store } from \"@hexclave/shared/dist/utils/stores\";\nimport { hexclaveAppInternalsSymbol } from \"../../common\";\nimport { StackClientApp } from \"../interfaces/client-app\";\nimport { planRedirectToHandler } from \"./redirect-page-urls\";\n\nfunction createAccessTokenString(refreshTokenId: string): string {\n const encode = (value: unknown) => Buffer.from(JSON.stringify(value)).toString(\"base64url\");\n const nowSeconds = Math.floor(Date.now() / 1000);\n return [\n encode({ alg: \"none\", typ: \"JWT\" }),\n encode({\n sub: \"user-id\",\n exp: nowSeconds + 60,\n iat: nowSeconds,\n iss: \"https://api.example.test\",\n aud: \"project-id\",\n project_id: \"project-id\",\n branch_id: \"main\",\n refresh_token_id: refreshTokenId,\n role: \"authenticated\",\n name: null,\n email: null,\n email_verified: false,\n selected_team_id: null,\n signed_up_at: nowSeconds,\n is_anonymous: false,\n is_restricted: false,\n restricted_reason: null,\n requires_totp_mfa: false,\n }),\n \"\",\n ].join(\".\");\n}\n\nfunction createMockDocument(): Document {\n const cookieJar = new Map<string, string>();\n return {\n get cookie() {\n return [...cookieJar.entries()].map(([key, value]) => `${key}=${value}`).join(\"; \");\n },\n set cookie(str: string) {\n const [nameValue] = str.split(\";\");\n const eqIndex = nameValue.indexOf(\"=\");\n if (eqIndex < 0) return;\n cookieJar.set(nameValue.slice(0, eqIndex).trim(), nameValue.slice(eqIndex + 1).trim());\n },\n createElement: () => ({}),\n } as any;\n}\n\ndescribe(\"StackClientApp cross-domain auth\", () => {\n it(\"keeps noRedirectBack same-domain redirects free of redirect-back state\", async () => {\n const redirectPlan = await planRedirectToHandler({\n handlerName: \"signIn\",\n rawHandlerUrl: \"/handler/sign-in\",\n noRedirectBack: true,\n currentUrl: new URL(\"https://app.example.test/settings?tab=profile\"),\n localOAuthCallbackUrl: \"/handler/oauth-callback\",\n rawHomeUrl: \"/home\",\n getCrossDomainHandoffParams: async () => {\n throw new Error(\"Same-domain redirects must not create cross-domain handoff parameters.\");\n },\n });\n\n expect(redirectPlan).toEqual({\n type: \"redirect\",\n url: \"/handler/sign-in\",\n });\n });\n\n it(\"returns noRedirectBack cross-domain auth to the source app home\", async () => {\n const handoffState = \"no-redirect-back-state\";\n const handoffCodeChallenge = \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\";\n const currentUrl = new URL(\"https://app.example.test/settings?tab=profile\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_state\", handoffState);\n currentUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", handoffCodeChallenge);\n currentUrl.searchParams.set(\n \"hexclave_cross_domain_after_callback_redirect_url\",\n \"https://app.example.test/settings?tab=profile\",\n );\n\n const redirectPlan = await planRedirectToHandler({\n handlerName: \"signIn\",\n rawHandlerUrl: \"https://auth.example.test/handler/sign-in\",\n noRedirectBack: true,\n currentUrl,\n localOAuthCallbackUrl: \"/handler/oauth-callback\",\n rawHomeUrl: \"/home\",\n getCrossDomainHandoffParams: async () => {\n throw new Error(\"Existing cross-domain handoff parameters must be reused.\");\n },\n });\n\n expect(redirectPlan.type).toBe(\"redirect\");\n if (redirectPlan.type !== \"redirect\") {\n throw new Error(\"Expected noRedirectBack sign-in to produce a redirect URL.\");\n }\n\n const hostedUrl = new URL(redirectPlan.url);\n expect(hostedUrl.origin).toBe(\"https://auth.example.test\");\n expect(hostedUrl.pathname).toBe(\"/handler/sign-in\");\n expect(hostedUrl.searchParams.get(\"hexclave_cross_domain_after_callback_redirect_url\")).toBe(\n \"https://app.example.test/home\",\n );\n\n const rawSourceCallbackUrl = hostedUrl.searchParams.get(\"after_auth_return_to\");\n if (rawSourceCallbackUrl == null) {\n throw new Error(\"Expected cross-domain noRedirectBack to include its internal source callback URL.\");\n }\n const sourceCallbackUrl = new URL(rawSourceCallbackUrl);\n expect(sourceCallbackUrl.origin).toBe(\"https://app.example.test\");\n expect(sourceCallbackUrl.pathname).toBe(\"/handler/oauth-callback\");\n expect(sourceCallbackUrl.searchParams.get(\"hexclave_cross_domain_auth\")).toBe(\"1\");\n expect(sourceCallbackUrl.searchParams.get(\"hexclave_cross_domain_state\")).toBe(handoffState);\n expect(sourceCallbackUrl.searchParams.get(\"hexclave_cross_domain_code_challenge\")).toBe(handoffCodeChallenge);\n expect(sourceCallbackUrl.searchParams.get(\"hexclave_cross_domain_after_callback_redirect_url\")).toBe(\n \"https://app.example.test/home\",\n );\n expect(sourceCallbackUrl.toString()).not.toContain(\"/settings\");\n });\n\n it(\"exposes redirect-back-aware handler URLs for devtool previews\", async () => {\n const previousWindow = Reflect.get(globalThis, \"window\");\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n Reflect.set(globalThis, \"window\", {\n location: {\n href: \"http://localhost/music?track=1#song\",\n },\n });\n\n try {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n urls: {\n signIn: \"/handler/sign-in\",\n },\n noAutomaticPrefetch: true,\n });\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"signIn\");\n\n const resolved = new URL(redirectUrl, \"http://localhost\");\n expect(resolved.pathname).toBe(\"/handler/sign-in\");\n expect(resolved.searchParams.get(\"after_auth_return_to\")).toBe(\"/music?track=1#song\");\n } finally {\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"uses the fresh post-auth refresh token when minting a cross-domain handoff\", async () => {\n const freshAccessToken = createAccessTokenString(\"fresh-refresh-token-id\");\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: {\n accessToken: createAccessTokenString(\"stale-refresh-token-id\"),\n refreshToken: \"stale-refresh-token\",\n },\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalSendClientRequest = Reflect.get(clientInterface, \"sendClientRequest\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n const capturedRefreshTokens: string[] = [];\n const capturedAccessTokenRefreshTokenIds: string[] = [];\n const refreshedRawRefreshTokens: string[] = [];\n\n Reflect.set(clientInterface, \"sendClientRequest\", async (_path: unknown, _requestOptions: unknown, session: unknown) => {\n const getRefreshToken = Reflect.get(session ?? {}, \"getRefreshToken\");\n const getOrFetchLikelyValidTokens = Reflect.get(session ?? {}, \"getOrFetchLikelyValidTokens\");\n if (typeof getRefreshToken !== \"function\") {\n throw new Error(\"Expected cross-domain auth to pass a session to the client interface.\");\n }\n if (typeof getOrFetchLikelyValidTokens !== \"function\") {\n throw new Error(\"Expected cross-domain auth to pass a session with token accessors.\");\n }\n const refreshToken = getRefreshToken.call(session);\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected cross-domain auth to pass a refresh-token-backed session.\");\n }\n capturedRefreshTokens.push(refreshTokenString);\n const tokens = await getOrFetchLikelyValidTokens.call(session, 0, null);\n capturedAccessTokenRefreshTokenIds.push(tokens.accessToken.payload.refresh_token_id);\n return {\n ok: true,\n json: async () => ({ redirect_url: \"https://example.com/handler/oauth-callback?code=handoff-code&state=handoff-state\" }),\n };\n });\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async (refreshToken: unknown) => {\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected refresh token while fetching a new access token.\");\n }\n refreshedRawRefreshTokens.push(refreshTokenString);\n return AccessToken.createIfValid(freshAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n try {\n const createCrossDomainAuthRedirectUrl = Reflect.get(clientApp, \"_createCrossDomainAuthRedirectUrl\");\n if (typeof createCrossDomainAuthRedirectUrl !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _createCrossDomainAuthRedirectUrl in tests.\");\n }\n\n await expect(createCrossDomainAuthRedirectUrl.call(clientApp, {\n redirectUri: \"https://example.com/handler/oauth-callback\",\n state: \"handoff-state\",\n codeChallenge: \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\",\n afterCallbackRedirectUrl: \"https://example.com/account-settings\",\n overrideTokenStoreInit: {\n accessToken: createAccessTokenString(\"fresh-stale-refresh-token-id\"),\n refreshToken: \"fresh-refresh-token\",\n },\n })).resolves.toBe(\"https://example.com/handler/oauth-callback?code=handoff-code&state=handoff-state\");\n } finally {\n Reflect.set(clientInterface, \"sendClientRequest\", originalSendClientRequest);\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n }\n\n expect(refreshedRawRefreshTokens).toEqual([\"fresh-refresh-token\"]);\n expect(capturedRefreshTokens).toEqual([\"fresh-refresh-token\"]);\n expect(capturedAccessTokenRefreshTokenIds).toEqual([\"fresh-refresh-token-id\"]);\n });\n\n it(\"uses a fresh nested OAuth state while preserving the outer cross-domain return state\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000002\";\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const outerState = \"outer-cross-domain-state\";\n const outerCodeChallenge = \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\";\n const currentUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n currentUrl.searchParams.set(\"after_auth_return_to\", `https://demo.stack-auth.com/?hexclave_cross_domain_auth=1&hexclave_cross_domain_state=${outerState}`);\n currentUrl.searchParams.set(\"hexclave_cross_domain_state\", outerState);\n currentUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", outerCodeChallenge);\n currentUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", \"https://demo.stack-auth.com/\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-session\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/\");\n\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n vi.spyOn(clientApp as any, \"_fetchCurrentRefreshTokenIdIfSignedIn\").mockResolvedValue(null);\n vi.spyOn(clientApp as any, \"_getCrossDomainHandoffParamsForRedirect\").mockResolvedValue({\n state: \"fresh-nested-state\",\n codeChallenge: \"fresh-nested-code-challenge\",\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentUrl.toString(),\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n const redirectUrl = new URL(redirectedUrl);\n expect(redirectUrl.searchParams.get(\"state\")).toBe(\"fresh-nested-state\");\n expect(redirectUrl.searchParams.get(\"code_challenge\")).toBe(\"fresh-nested-code-challenge\");\n const redirectUri = new URL(redirectUrl.searchParams.get(\"redirect_uri\") ?? \"\");\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_state\")).toBe(outerState);\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_code_challenge\")).toBe(outerCodeChallenge);\n expect(redirectUri.searchParams.get(\"hexclave_cross_domain_after_callback_redirect_url\")).toBe(\"https://demo.stack-auth.com/\");\n });\n\n it(\"clears a stale target-domain session before deferring to the source-domain session\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000006\";\n const hostedAccessToken = createAccessTokenString(\"hosted-old-refresh-token-id\");\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const tokenStore = Reflect.get(clientApp, \"_memoryTokenStore\");\n if (!(tokenStore instanceof Store)) {\n throw new Error(\"Expected StackClientApp to use a memory token store in this test.\");\n }\n tokenStore.set({\n refreshToken: \"hosted-old-refresh-token\",\n accessToken: hostedAccessToken,\n });\n\n const currentUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-anonymous-refresh-token-id\");\n currentUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/handler/oauth-callback\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_state\", \"outer-state\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", \"outer-code-challenge\");\n currentUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", \"https://demo.stack-auth.com/app\");\n\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async () => {\n return AccessToken.createIfValid(hostedAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentUrl.toString(),\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(tokenStore.get()).toEqual({\n refreshToken: null,\n accessToken: null,\n });\n expect(new URL(redirectedUrl).origin).toBe(\"https://demo.stack-auth.com\");\n });\n\n it(\"uses the latest browser refresh cookie before computing nested cross-domain session IDs\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000007\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: \"https://demo.stack-auth.com/\",\n protocol: \"https:\",\n hostname: \"demo.stack-auth.com\",\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n } as any;\n\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"cookie\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n const refreshedRawRefreshTokens: string[] = [];\n\n // Cookie-store writes queue a background trusted-parent-domain lookup. Without this stub, that\n // lookup fetches the (unreachable) baseUrl with retries while holding the global store lock,\n // which starves any later test that needs the write lock (e.g. signOut). Not restored on\n // purpose: queued tasks can still run after this test body finishes.\n vi.spyOn(clientApp as any, \"_getTrustedParentDomain\").mockResolvedValue(null);\n\n try {\n const getBrowserCookieTokenStore = Reflect.get(clientApp, \"_getBrowserCookieTokenStore\");\n if (typeof getBrowserCookieTokenStore !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _getBrowserCookieTokenStore in tests.\");\n }\n const tokenStore = getBrowserCookieTokenStore.call(clientApp);\n tokenStore.set({\n refreshToken: \"old-refresh-token\",\n accessToken: createAccessTokenString(\"old-refresh-token-id\"),\n });\n\n document.cookie = `__Host-hexclave-refresh-${projectId}--default=${JSON.stringify({\n refresh_token: \"new-refresh-token\",\n updated_at_millis: 1,\n })}`;\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async (refreshToken: unknown) => {\n const refreshTokenString = Reflect.get(refreshToken ?? {}, \"token\");\n if (typeof refreshTokenString !== \"string\") {\n throw new Error(\"Expected refresh token while fetching a new access token.\");\n }\n refreshedRawRefreshTokens.push(refreshTokenString);\n return AccessToken.createIfValid(createAccessTokenString(\"new-refresh-token-id\")) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n const fetchCurrentRefreshTokenIdIfSignedIn = Reflect.get(clientApp, \"_fetchCurrentRefreshTokenIdIfSignedIn\");\n if (typeof fetchCurrentRefreshTokenIdIfSignedIn !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _fetchCurrentRefreshTokenIdIfSignedIn in tests.\");\n }\n await expect(fetchCurrentRefreshTokenIdIfSignedIn.call(clientApp, {\n awaitPendingAuthResolutions: false,\n })).resolves.toBe(\"new-refresh-token-id\");\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(refreshedRawRefreshTokens).toEqual([\"new-refresh-token\"]);\n });\n\n it(\"does not re-bounce nested cross-domain auth after the OAuth callback consumed code+state from the URL\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000008\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n const strippedUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n strippedUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-refresh-token-id\");\n strippedUrl.searchParams.set(\"stack_nested_cross_domain_auth_callback_url\", \"https://demo.stack-auth.com/\");\n const urlAtConstructionTime = new URL(strippedUrl);\n urlAtConstructionTime.searchParams.set(\"code\", \"one-time-code\");\n urlAtConstructionTime.searchParams.set(\"state\", \"nested-oauth-state\");\n\n // Construct before installing the window mock so the constructor does not schedule its own\n // nested-auth resolution; the assertions below drive the handler explicitly.\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: strippedUrl.toString(),\n replace: () => {\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n vi.spyOn(clientApp as any, \"_fetchCurrentRefreshTokenIdIfSignedIn\").mockResolvedValue(null);\n vi.spyOn(clientApp as any, \"_getCrossDomainHandoffParamsForRedirect\").mockResolvedValue({\n state: \"fresh-nested-state\",\n codeChallenge: \"fresh-nested-code-challenge\",\n });\n vi.spyOn(clientApp as any, \"_isTrusted\").mockResolvedValue(true);\n\n try {\n // Without the construction-time URL, the handler re-bounces (location.replace aborts).\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n // With it, the in-flight OAuth callback wins and the handler stands down.\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth(urlAtConstructionTime)).resolves.toBe(false);\n // The live-URL guard must also stand down on its own when code+state are still present.\n (globalThis.window as any).location.href = urlAtConstructionTime.toString();\n await expect((clientApp as any)._maybeHandleNestedCrossDomainAuth()).resolves.toBe(false);\n } finally {\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n });\n\n it(\"passes the construction-time URL to the nested cross-domain auth handler\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000009\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n\n const callbackUrl = new URL(`https://${projectId}.example-stack-hosted.test/handler/sign-in`);\n callbackUrl.searchParams.set(\"stack_nested_cross_domain_auth_refresh_token_id\", \"source-refresh-token-id\");\n callbackUrl.searchParams.set(\"code\", \"one-time-code\");\n callbackUrl.searchParams.set(\"state\", \"nested-oauth-state\");\n const strippedUrl = new URL(callbackUrl);\n strippedUrl.searchParams.delete(\"code\");\n strippedUrl.searchParams.delete(\"state\");\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: callbackUrl.toString(),\n },\n } as any;\n\n const nestedAuthSpy = vi.spyOn(StackClientApp.prototype as any, \"_maybeHandleNestedCrossDomainAuth\").mockResolvedValue(false);\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n // Simulate consumeOAuthCallbackQueryParams stripping code+state before microtasks run.\n (globalThis.window as any).location.href = strippedUrl.toString();\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n expect(nestedAuthSpy).toHaveBeenCalledTimes(1);\n const urlArgument = nestedAuthSpy.mock.calls[0][0] as URL;\n expect(urlArgument).toBeInstanceOf(URL);\n expect(urlArgument.searchParams.get(\"code\")).toBe(\"one-time-code\");\n expect(urlArgument.searchParams.get(\"state\")).toBe(\"nested-oauth-state\");\n } finally {\n nestedAuthSpy.mockRestore();\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n });\n\n it(\"redirects hosted current-page OAuth callback errors to the hosted error handler during startup\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000010\";\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n const callbackUrl = new URL(\"https://demo.stack-auth.com/dashboard\");\n callbackUrl.searchParams.set(\"errorCode\", \"SIGN_UP_REJECTED\");\n callbackUrl.searchParams.set(\"message\", \"Your sign up was rejected by an administrator's sign-up rule.\");\n callbackUrl.searchParams.set(\"details\", JSON.stringify({\n message: \"Your sign up was rejected by an administrator's sign-up rule.\",\n }));\n callbackUrl.searchParams.set(\"after_auth_return_to\", \"/dashboard\");\n callbackUrl.searchParams.set(\"after_callback_redirect_url\", \"https://customer.example.test/settings?tab=connected-accounts\");\n let currentHref = callbackUrl.toString();\n let redirectedUrl = \"\";\n const redirectSpy = vi.spyOn(StackClientApp.prototype as any, \"_redirectTo\").mockImplementation(async (...args: unknown[]) => {\n const options = args[0] as { url: string | URL };\n redirectedUrl = options.url.toString();\n });\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n get href() {\n return currentHref;\n },\n set href(value: string) {\n currentHref = value;\n },\n origin: callbackUrl.origin,\n },\n history: {\n replaceState: (_state: unknown, _title: string, url: string) => {\n currentHref = new URL(url, currentHref).toString();\n },\n },\n addEventListener: () => {},\n removeEventListener: () => {},\n } as any;\n\n try {\n new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n await new Promise((resolve) => setTimeout(resolve, 0));\n } finally {\n redirectSpy.mockRestore();\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n const errorUrl = new URL(redirectedUrl);\n expect(errorUrl.origin).toBe(`https://${projectId}.built-with-hexclave.com`);\n expect(errorUrl.pathname).toBe(\"/handler/error\");\n expect(errorUrl.searchParams.get(\"errorCode\")).toBe(\"SIGN_UP_REJECTED\");\n expect(errorUrl.searchParams.get(\"message\")).toBe(\"Your sign up was rejected by an administrator's sign-up rule.\");\n expect(errorUrl.searchParams.get(\"after_auth_return_to\")).toBe(\"/dashboard\");\n expect(errorUrl.searchParams.get(\"after_callback_redirect_url\")).toBe(\"https://customer.example.test/settings?tab=connected-accounts\");\n expect(new URL(currentHref).searchParams.has(\"errorCode\")).toBe(false);\n });\n\n it(\"uses direct sign-out instead of hosted sign-out redirects when code execution is available\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n handler: \"/handler\",\n signOut: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const signOutSpy = vi.spyOn(clientApp, \"signOut\").mockRejectedValue(new Error(\"INTENTIONAL_TEST_ABORT\"));\n\n try {\n await expect(clientApp.redirectToSignOut()).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n expect(signOutSpy).toHaveBeenCalledWith();\n } finally {\n signOutSpy.mockRestore();\n }\n });\n\n it(\"throws when public app.urls reads would return hosted component URLs\", () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n\n expect(() => clientApp.urls.signIn).toThrowError(/app\\.urls\\.signIn cannot be used when this app is configured to use hosted components.*Use app\\.redirectToSignIn\\(\\) instead/s);\n expect(() => clientApp.urls.signOut).toThrowError(/app\\.urls\\.signOut cannot be used when this app is configured to use hosted components.*Use app\\.redirectToSignOut\\(\\) instead/s);\n expect(clientApp.urls.afterSignIn).toBe(\"/\");\n });\n\n it(\"keeps public app.urls reads available for non-hosted targets\", () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000003\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n handler: \"/custom-handler\",\n },\n noAutomaticPrefetch: true,\n });\n\n expect(clientApp.urls.signIn).toBe(\"/custom-handler/sign-in\");\n });\n\n it(\"keeps default hosted signOut() on the source domain when afterSignOut is not configured\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000004\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n urls: {\n default: { type: \"hosted\" },\n },\n noAutomaticPrefetch: true,\n });\n const currentHref = \"https://demo.stack-auth.com/settings?tab=profile\";\n\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalSignOut = Reflect.get(clientInterface, \"signOut\");\n Reflect.set(clientInterface, \"signOut\", async () => {});\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n let redirectedUrl = \"\";\n\n globalThis.document = createMockDocument();\n globalThis.window = {\n location: {\n href: currentHref,\n replace: (url: string) => {\n redirectedUrl = url;\n throw new Error(\"INTENTIONAL_TEST_ABORT\");\n },\n },\n } as any;\n\n try {\n const signOut = Reflect.get(clientApp, \"_signOut\");\n if (typeof signOut !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _signOut in tests.\");\n }\n await expect(signOut.call(clientApp, Reflect.get(clientInterface, \"createSession\").call(clientInterface, {\n refreshToken: null,\n }))).rejects.toThrowError(\"INTENTIONAL_TEST_ABORT\");\n } finally {\n Reflect.set(clientInterface, \"signOut\", originalSignOut);\n globalThis.window = previousWindow;\n globalThis.document = previousDocument;\n }\n\n expect(redirectedUrl).toBe(\"/settings?tab=profile\");\n });\n\n it(\"restores a dropped after_auth_return_to from the sessionStorage mirror when redirecting after sign-in\", async () => {\n const previousWindow = globalThis.window;\n const previousDocument = globalThis.document;\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const sessionStorageMap = new Map<string, string>();\n const windowMock = {\n location: {\n href: \"https://demo.example.test/handler/sign-in?after_auth_return_to=%2Fmusic%3Ftrack%3D1\",\n },\n sessionStorage: {\n getItem: (key: string) => sessionStorageMap.get(key) ?? null,\n setItem: (key: string, value: string) => {\n sessionStorageMap.set(key, value);\n },\n removeItem: (key: string) => {\n sessionStorageMap.delete(key);\n },\n },\n };\n Reflect.set(globalThis, \"window\", windowMock);\n globalThis.document = createMockDocument();\n\n try {\n // The constructor mirrors the redirect-back state from the arrival URL into sessionStorage.\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000011\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n\n // Intermediate hops (MFA, magic link, OAuth round-trips, ...) dropped the query params.\n windowMock.location.href = \"https://demo.example.test/handler/mfa\";\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\");\n expect(redirectUrl).toBe(\"/music?track=1\");\n\n // noRedirectBack opts out of the mirror just like it opts out of the query param.\n const noRedirectBackUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\", { noRedirectBack: true });\n expect(new URL(noRedirectBackUrl, \"https://demo.example.test\").pathname).toBe(\"/\");\n } finally {\n globalThis.document = previousDocument;\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"restores dropped cross-domain handoff state from the sessionStorage mirror when redirecting after sign-in\", async () => {\n const projectId = \"00000000-0000-4000-8000-000000000012\";\n const previousWindow = globalThis.window;\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const sessionStorageMap = new Map<string, string>();\n\n const handoffState = \"mirror-handoff-state\";\n const handoffCodeChallenge = \"abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~\";\n const handoffAfterCallbackRedirect = \"https://demo.example.test/dashboard\";\n const redirectBackUrl = new URL(\"https://demo.example.test/handler/oauth-callback\");\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_auth\", \"1\");\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_state\", handoffState);\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", handoffCodeChallenge);\n redirectBackUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", handoffAfterCallbackRedirect);\n\n const arrivalUrl = new URL(`https://${projectId}.built-with-hexclave.com/handler/sign-in`);\n arrivalUrl.searchParams.set(\"after_auth_return_to\", redirectBackUrl.toString());\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_state\", handoffState);\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_code_challenge\", handoffCodeChallenge);\n arrivalUrl.searchParams.set(\"hexclave_cross_domain_after_callback_redirect_url\", handoffAfterCallbackRedirect);\n\n const previousDocument = globalThis.document;\n const windowMock = {\n location: {\n href: arrivalUrl.toString(),\n },\n sessionStorage: {\n getItem: (key: string) => sessionStorageMap.get(key) ?? null,\n setItem: (key: string, value: string) => {\n sessionStorageMap.set(key, value);\n },\n removeItem: (key: string) => {\n sessionStorageMap.delete(key);\n },\n },\n };\n Reflect.set(globalThis, \"window\", windowMock);\n globalThis.document = createMockDocument();\n\n try {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId,\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"window\",\n noAutomaticPrefetch: true,\n });\n const crossDomainAuthorizeRedirect = \"https://demo.example.test/handler/oauth-callback?code=minted-code&state=mirror-handoff-state\";\n const createCrossDomainAuthRedirectUrlSpy = vi\n .spyOn(clientApp as any, \"_createCrossDomainAuthRedirectUrl\")\n .mockResolvedValue(crossDomainAuthorizeRedirect);\n\n // All redirect-back query params were dropped before the after-sign-in redirect.\n windowMock.location.href = `https://${projectId}.built-with-hexclave.com/handler/sign-in`;\n\n const redirectUrl = await clientApp[hexclaveAppInternalsSymbol].getRedirectToHandlerUrl(\"afterSignIn\");\n\n expect(createCrossDomainAuthRedirectUrlSpy).toHaveBeenCalledWith(expect.objectContaining({\n redirectUri: redirectBackUrl.toString(),\n state: handoffState,\n codeChallenge: handoffCodeChallenge,\n afterCallbackRedirectUrl: handoffAfterCallbackRedirect,\n }));\n expect(redirectUrl).toBe(crossDomainAuthorizeRedirect);\n } finally {\n globalThis.document = previousDocument;\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n\n it(\"ignores stale session callbacks after a newer refresh token owns the token store\", async () => {\n const clientApp = new StackClientApp({\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000005\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n noAutomaticPrefetch: true,\n });\n const oldAccessToken = createAccessTokenString(\"old-refresh-token-id\");\n const refreshedOldAccessToken = createAccessTokenString(\"refreshed-old-refresh-token-id\");\n const newAccessToken = createAccessTokenString(\"new-refresh-token-id\");\n const tokenStore = new Store({\n refreshToken: \"old-refresh-token\",\n accessToken: oldAccessToken,\n });\n const clientInterface = Reflect.get(clientApp, \"_interface\");\n const originalFetchNewAccessToken = Reflect.get(clientInterface, \"fetchNewAccessToken\");\n Reflect.set(clientInterface, \"fetchNewAccessToken\", async () => {\n return AccessToken.createIfValid(refreshedOldAccessToken) ?? (() => {\n throw new Error(\"Expected test access token to be valid\");\n })();\n });\n\n try {\n const getSessionFromTokenStore = Reflect.get(clientApp, \"_getSessionFromTokenStore\");\n if (typeof getSessionFromTokenStore !== \"function\") {\n throw new Error(\"Expected StackClientApp to expose _getSessionFromTokenStore in tests.\");\n }\n const oldSession = getSessionFromTokenStore.call(clientApp, tokenStore);\n tokenStore.set({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n\n await oldSession.fetchNewTokens();\n expect(tokenStore.get()).toEqual({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n\n oldSession.markInvalid();\n expect(tokenStore.get()).toEqual({\n refreshToken: \"new-refresh-token\",\n accessToken: newAccessToken,\n });\n } finally {\n Reflect.set(clientInterface, \"fetchNewAccessToken\", originalFetchNewAccessToken);\n }\n });\n});\n"],"mappings":"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"}
@@ -5,16 +5,16 @@ import { TokenObject } from "./common.js";
5
5
  import { ConvexCtx, GetCurrentPartialUserOptions, GetCurrentUserOptions, HandlerUrlOptions as HandlerUrlOptions$1, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, RequestLike, ResolvedHandlerUrls as ResolvedHandlerUrls$1, TokenStoreInit, hexclaveAppInternalsSymbol } from "../../common.js";
6
6
  import { TeamPermission } from "../../permissions/index.js";
7
7
  import { AdminOwnedProject, AdminProjectUpdateOptions, Project } from "../../projects/index.js";
8
+ import { StackClientApp, StackClientAppConstructorOptions, StackClientAppJson } from "../interfaces/client-app.js";
8
9
  import { InternalSession } from "@hexclave/shared/dist/sessions";
9
10
  import { Store } from "@hexclave/shared/dist/utils/stores";
10
- import { StackClientApp, StackClientAppConstructorOptions, StackClientAppJson } from "../interfaces/client-app.js";
11
+ import { CrossDomainHandoffParams } from "./redirect-page-urls.js";
11
12
  import * as cookie from "cookie";
12
13
  import { CookieHelper } from "../../../cookie.js";
13
14
  import { ApiKey } from "../../api-keys/index.js";
14
15
  import { ContactChannel } from "../../contact-channels/index.js";
15
16
  import { EditableTeamMemberProfile, ReceivedTeamInvitation, SentTeamInvitation, Team, TeamUser } from "../../teams/index.js";
16
17
  import { ActiveSession, Auth, BaseUser, InternalUserExtra, OAuthProvider, ProjectCurrentUser, TokenPartialUser, UserExtra, UserUpdateOptions } from "../../users/index.js";
17
- import { CrossDomainHandoffParams } from "./redirect-page-urls.js";
18
18
  import { AnalyticsOptions } from "./session-replay.js";
19
19
  import { _HexclaveAdminAppImplIncomplete } from "./admin-app-impl.js";
20
20
  import { TeamApiKeysCrud, UserApiKeysCrud, teamApiKeysCreateOutputSchema, userApiKeysCreateOutputSchema } from "@hexclave/shared/dist/interface/crud/project-api-keys";
@@ -136,6 +136,7 @@ declare class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pr
136
136
  checkString?: string;
137
137
  interface?: HexclaveClientInterface;
138
138
  });
139
+ private _initializeAutomaticSideEffects;
139
140
  protected _initUniqueIdentifier(): void;
140
141
  protected _trackPendingAuthResolution(callback: () => Promise<unknown>): void;
141
142
  protected _awaitPendingAuthResolutions(overrideTokenStoreInit?: TokenStoreInit, options?: {
@@ -572,6 +573,7 @@ declare class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pr
572
573
  inheritsFrom?: StackClientApp<any, any>;
573
574
  devTool?: boolean | "auto";
574
575
  noAutomaticPrefetch?: boolean;
576
+ automaticSideEffects?: boolean;
575
577
  analytics?: AnalyticsOptions;
576
578
  } & {
577
579
  tokenStore: TokenStoreInit<HasTokenStore>;
@@ -602,6 +604,7 @@ declare class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pr
602
604
  }) => Promise<void>;
603
605
  getRedirectToHandlerUrl: (handlerName: keyof HandlerUrls, options?: RedirectToOptions) => Promise<string>;
604
606
  redirectToHandler: (handlerName: keyof HandlerUrls, options?: RedirectToOptions) => Promise<void>;
607
+ getRawAfterAuthReturnTo: () => string | null;
605
608
  refreshOwnedProjects: () => Promise<void>;
606
609
  signInWithTokens: (tokens: {
607
610
  accessToken: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client-app-impl.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.ts"],"mappings":"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"}
1
+ {"version":3,"file":"client-app-impl.d.ts","names":[],"sources":["../../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.ts"],"mappings":"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"}
@@ -16,6 +16,7 @@ import { hexclaveAppInternalsSymbol } from "../../common.js";
16
16
  import { adminProjectCreateOptionsToCrud } from "../../projects/index.js";
17
17
  import { InternalSession } from "@hexclave/shared/dist/sessions";
18
18
  import { Store, storeLock } from "@hexclave/shared/dist/utils/stores";
19
+ import { crossDomainAuthQueryParams, getCrossDomainHandoffParamsFromCurrentUrl, planRedirectToHandler } from "./redirect-page-urls.js";
19
20
  import { scrambleDuringCompileTime } from "@hexclave/shared/dist/utils/compile-time";
20
21
  import { parseJson } from "@hexclave/shared/dist/utils/json";
21
22
  import { DependenciesMap } from "@hexclave/shared/dist/utils/maps";
@@ -31,12 +32,11 @@ import { apiKeyCreationOptionsToCrud } from "../../api-keys/index.js";
31
32
  import { contactChannelCreateOptionsToCrud, contactChannelUpdateOptionsToCrud } from "../../contact-channels/index.js";
32
33
  import { teamCreateOptionsToCrud, teamUpdateOptionsToCrud } from "../../teams/index.js";
33
34
  import { buildCliAuthConfirmUrl, getHostedHandlerUrl, isHostedHandlerUrlForProject, resolveHandlerUrls } from "../../url-targets.js";
34
- import { augmentUrlWithPersistedRedirectBackState, saveRedirectBackStateFromUrl } from "./redirect-back-state.js";
35
+ import { augmentUrlWithPersistedRedirectBackState, getRawAfterAuthReturnTo, saveRedirectBackStateFromUrl } from "./redirect-back-state.js";
35
36
  import { recordRedirectAndThrowIfLoopDetected } from "./redirect-loop-breaker.js";
36
37
  import { scopePasskeyAuthenticationToHostname, scopePasskeyRegistrationToHostname } from "../../passkey-rp-id.js";
37
38
  import { userUpdateOptionsToCrud, withUserDestructureGuard } from "../../users/index.js";
38
39
  import { EventTracker } from "./event-tracker.js";
39
- import { crossDomainAuthQueryParams, getCrossDomainHandoffParamsFromCurrentUrl, planRedirectToHandler } from "./redirect-page-urls.js";
40
40
  import { subscribeSessionRefresh } from "./session-refresh-subscription.js";
41
41
  import { SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions } from "./session-replay.js";
42
42
  import { mountClickmapOverlay } from "../../../../clickmap/index.js";
@@ -49,6 +49,7 @@ let isReactServer = false;
49
49
  isReactServer = sc.isReactServer;
50
50
  const NextNavigation = scrambleDuringCompileTime(NextNavigationUnscrambled);
51
51
  const prefetchedCrossDomainHandoffTtlMs = 3300 * 1e3;
52
+ const oauthAfterCallbackRedirectUrlQueryParam = "after_callback_redirect_url";
52
53
  const nestedCrossDomainAuthQueryParams = {
53
54
  refreshTokenId: "stack_nested_cross_domain_auth_refresh_token_id",
54
55
  callbackUrl: "stack_nested_cross_domain_auth_callback_url",
@@ -56,7 +57,7 @@ const nestedCrossDomainAuthQueryParams = {
56
57
  state: "state",
57
58
  codeChallenge: "code_challenge",
58
59
  codeChallengeMethod: "code_challenge_method",
59
- afterCallbackRedirectUrl: "after_callback_redirect_url"
60
+ afterCallbackRedirectUrl: oauthAfterCallbackRedirectUrlQueryParam
60
61
  };
61
62
  function getRedirectHelperInstruction(handlerName) {
62
63
  if (handlerName === "handler") return "Use a page-specific redirect helper such as app.redirectToSignIn() instead.";
@@ -420,15 +421,17 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
420
421
  this._redirectMethod = resolvedOptions.redirectMethod || "nextjs";
421
422
  this._urlOptions = resolvedOptions.urls ?? {};
422
423
  this._oauthScopesOnSignIn = resolvedOptions.oauthScopesOnSignIn ?? {};
424
+ this._analyticsOptions = resolvedOptions.analytics;
425
+ if (extraOptions?.uniqueIdentifier !== void 0) this._uniqueIdentifier = extraOptions.uniqueIdentifier;
426
+ if (resolvedOptions.automaticSideEffects === false) return;
427
+ this._initializeAutomaticSideEffects(resolvedOptions);
428
+ }
429
+ _initializeAutomaticSideEffects(resolvedOptions) {
423
430
  if (isBrowserLike() && (resolvedOptions.tokenStore === "cookie" || resolvedOptions.tokenStore === "nextjs-cookie")) {
424
431
  runAsynchronously(this._trustedParentDomainCache.getOrWait([window.location.hostname], "write-only"));
425
432
  this._ensureCrossSubdomainCookieExists();
426
433
  }
427
- if (extraOptions && extraOptions.uniqueIdentifier) {
428
- this._uniqueIdentifier = extraOptions.uniqueIdentifier;
429
- this._initUniqueIdentifier();
430
- }
431
- this._analyticsOptions = resolvedOptions.analytics;
434
+ if (this._uniqueIdentifier !== void 0) this._initUniqueIdentifier();
432
435
  const getAnalyticsSession = async () => {
433
436
  this._ensurePersistentTokenStore();
434
437
  if (await this.getPartialUser({
@@ -543,9 +546,24 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
543
546
  }
544
547
  async _redirectToOAuthCallbackError(error) {
545
548
  const errorUrl = new URL(this._getUrls().error, window.location.href);
549
+ const callbackUrl = augmentUrlWithPersistedRedirectBackState({
550
+ currentUrl: new URL(window.location.href),
551
+ projectId: this.projectId
552
+ });
546
553
  errorUrl.searchParams.set("errorCode", error.errorCode);
547
554
  errorUrl.searchParams.set("message", error.message);
548
555
  errorUrl.searchParams.set("details", JSON.stringify(error.details ?? {}));
556
+ for (const paramName of [
557
+ "after_auth_return_to",
558
+ crossDomainAuthQueryParams.state,
559
+ crossDomainAuthQueryParams.codeChallenge,
560
+ crossDomainAuthQueryParams.afterCallbackRedirectUrl
561
+ ]) {
562
+ const value = callbackUrl.searchParams.get(paramName);
563
+ if (value != null) errorUrl.searchParams.set(paramName, value);
564
+ }
565
+ const afterCallbackRedirectUrl = callbackUrl.searchParams.get(oauthAfterCallbackRedirectUrlQueryParam);
566
+ if (afterCallbackRedirectUrl != null) errorUrl.searchParams.set(oauthAfterCallbackRedirectUrlQueryParam, afterCallbackRedirectUrl);
549
567
  await this._redirectIfTrusted(errorUrl.toString(), { replace: true });
550
568
  }
551
569
  async _handleHostedOAuthCallbackDuringStartup() {
@@ -1973,7 +1991,8 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
1973
1991
  projectId: forProjectId,
1974
1992
  tokenStore: null,
1975
1993
  projectOwnerSession: session,
1976
- noAutomaticPrefetch: true
1994
+ noAutomaticPrefetch: true,
1995
+ automaticSideEffects: false
1977
1996
  }));
1978
1997
  return this._ownedAdminApps.get([session, forProjectId]);
1979
1998
  }
@@ -2192,10 +2211,12 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
2192
2211
  });
2193
2212
  }
2194
2213
  async _getRedirectToHandlerUrl(handlerName, options, internalOptions) {
2195
- const rawHandlerUrl = getUrls(this._urlOptions, { projectId: this.projectId })[handlerName];
2214
+ const rawUrls = getUrls(this._urlOptions, { projectId: this.projectId });
2215
+ const rawHandlerUrl = rawUrls[handlerName];
2196
2216
  if (!rawHandlerUrl) throw new Error(`No URL for handler name ${handlerName}`);
2197
2217
  let currentUrl = isReactServer || typeof window === "undefined" ? null : new URL(window.location.href);
2198
- if (currentUrl != null && options?.noRedirectBack !== true && (handlerName === "afterSignIn" || handlerName === "afterSignUp")) currentUrl = augmentUrlWithPersistedRedirectBackState({
2218
+ const shouldRestorePersistedRedirectBackState = options?.noRedirectBack !== true && (handlerName === "afterSignIn" || handlerName === "afterSignUp") || handlerName === "forgotPassword" || handlerName === "passwordReset" || handlerName === "signIn" && options?.noRedirectBack === true;
2219
+ if (currentUrl != null && shouldRestorePersistedRedirectBackState) currentUrl = augmentUrlWithPersistedRedirectBackState({
2199
2220
  currentUrl,
2200
2221
  projectId: this.projectId
2201
2222
  });
@@ -2205,6 +2226,7 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
2205
2226
  noRedirectBack: options?.noRedirectBack === true,
2206
2227
  currentUrl,
2207
2228
  localOAuthCallbackUrl: this._getLocalOAuthCallbackHandlerUrl(),
2229
+ rawHomeUrl: rawUrls.home,
2208
2230
  getCrossDomainHandoffParams: async (href) => await this._getCrossDomainHandoffParamsForRedirect(href)
2209
2231
  });
2210
2232
  if (plan.type === "cross-domain-authorize") return await this._createCrossDomainAuthRedirectUrl({
@@ -2896,13 +2918,15 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
2896
2918
  return clientApp;
2897
2919
  }
2898
2920
  const { analytics, ...restJson } = omit(json, ["uniqueIdentifier"]);
2899
- return new _HexclaveClientAppImplIncomplete({
2921
+ const app = new _HexclaveClientAppImplIncomplete({
2900
2922
  ...restJson,
2901
2923
  analytics: analyticsOptionsFromJson(analytics)
2902
2924
  }, {
2903
2925
  uniqueIdentifier: json.uniqueIdentifier,
2904
2926
  checkString: providedCheckString
2905
2927
  });
2928
+ if (json.automaticSideEffects === false) app._initUniqueIdentifier();
2929
+ return app;
2906
2930
  } };
2907
2931
  }
2908
2932
  get [hexclaveAppInternalsSymbol]() {
@@ -2921,6 +2945,7 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
2921
2945
  redirectMethod: this._redirectMethod,
2922
2946
  extraRequestHeaders: this._options.extraRequestHeaders,
2923
2947
  devTool: this._options.devTool,
2948
+ automaticSideEffects: this._options.automaticSideEffects,
2924
2949
  analytics: analyticsOptionsToJson(this._analyticsOptions)
2925
2950
  };
2926
2951
  },
@@ -2956,6 +2981,13 @@ var _HexclaveClientAppImplIncomplete = class _HexclaveClientAppImplIncomplete {
2956
2981
  redirectToHandler: async (handlerName, options) => {
2957
2982
  await this._redirectToHandler(handlerName, options);
2958
2983
  },
2984
+ getRawAfterAuthReturnTo: () => {
2985
+ if (isReactServer || typeof window === "undefined") return null;
2986
+ return getRawAfterAuthReturnTo({
2987
+ currentUrl: new URL(window.location.href),
2988
+ projectId: this.projectId
2989
+ });
2990
+ },
2959
2991
  refreshOwnedProjects: async () => {
2960
2992
  await this._refreshOwnedProjects(await this._getSession());
2961
2993
  },