@hexclave/next 1.0.75 → 1.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{admin-app-impl-sTQD2d-3.d.ts → admin-app-impl-CxDpE89P.d.ts} +12 -10
- package/dist/admin-app-impl-CxDpE89P.d.ts.map +1 -0
- package/dist/clickmap/clickmap-core.d.ts +1 -1
- package/dist/clickmap/index.d.ts +1 -1
- package/dist/{client-app-BCT5p_70.d.ts → client-app-wFodsYml.d.ts} +4 -1
- package/dist/client-app-wFodsYml.d.ts.map +1 -0
- package/dist/common-BK_sydxF.d.ts.map +1 -1
- package/dist/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/components/elements/sidebar-layout.js +12 -2
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/selected-team-switcher.d.ts +1 -1
- package/dist/components/team-icon.d.ts +1 -1
- package/dist/components/team-switcher.d.ts +1 -1
- package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
- package/dist/components-page/hexclave-handler-client.d.ts +1 -1
- package/dist/components-page/hexclave-handler.d.ts +1 -1
- package/dist/components-page/team-invitation-cache.d.ts +5 -0
- package/dist/components-page/team-invitation-cache.d.ts.map +1 -0
- package/dist/components-page/team-invitation-cache.js +12 -0
- package/dist/components-page/team-invitation-cache.js.map +1 -0
- package/dist/components-page/team-invitation-cache.test.d.ts +1 -0
- package/dist/components-page/team-invitation-cache.test.js +23 -0
- package/dist/components-page/team-invitation-cache.test.js.map +1 -0
- package/dist/components-page/team-invitation.js +8 -7
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/dev-tool/dev-tool-core.d.ts +1 -1
- package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/dev-tool/dev-tool-core.js +2 -2
- package/dist/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/dev-tool/index.d.ts +1 -1
- package/dist/dev-tool/index.d.ts.map +1 -1
- package/dist/dev-tool/index.js +2 -8
- package/dist/dev-tool/index.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.d.ts.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js +12 -2
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components-page/team-invitation-cache.d.ts +5 -0
- package/dist/esm/components-page/team-invitation-cache.d.ts.map +1 -0
- package/dist/esm/components-page/team-invitation-cache.js +11 -0
- package/dist/esm/components-page/team-invitation-cache.js.map +1 -0
- package/dist/esm/components-page/team-invitation-cache.test.d.ts +1 -0
- package/dist/esm/components-page/team-invitation-cache.test.js +24 -0
- package/dist/esm/components-page/team-invitation-cache.test.js.map +1 -0
- package/dist/esm/components-page/team-invitation.d.ts.map +1 -1
- package/dist/esm/components-page/team-invitation.js +8 -7
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js +1 -1
- package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
- package/dist/esm/dev-tool/index.d.ts.map +1 -1
- package/dist/esm/dev-tool/index.js +2 -8
- package/dist/esm/dev-tool/index.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.d.ts +2 -2
- package/dist/esm/in-page-ui/dev-environment.d.ts +5 -0
- package/dist/esm/in-page-ui/dev-environment.d.ts.map +1 -0
- package/dist/esm/in-page-ui/dev-environment.js +18 -0
- package/dist/esm/in-page-ui/dev-environment.js.map +1 -0
- package/dist/esm/in-page-ui/issue-card.d.ts +52 -0
- package/dist/esm/in-page-ui/issue-card.d.ts.map +1 -0
- package/dist/esm/in-page-ui/issue-card.js +392 -0
- package/dist/esm/in-page-ui/issue-card.js.map +1 -0
- package/dist/esm/in-page-ui/issue-card.test.d.ts +1 -0
- package/dist/esm/in-page-ui/issue-card.test.js +60 -0
- package/dist/esm/in-page-ui/issue-card.test.js.map +1 -0
- package/dist/esm/in-page-ui/logo.d.ts +5 -0
- package/dist/esm/in-page-ui/logo.d.ts.map +1 -0
- package/dist/esm/in-page-ui/logo.js +6 -0
- package/dist/esm/in-page-ui/logo.js.map +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +4 -4
- package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +30 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +140 -15
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +5 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +184 -28
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.d.ts +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js +83 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js.map +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.d.ts +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js +120 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js.map +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js +4 -3
- package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/index.js +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +1 -0
- package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -1
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +2 -2
- package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.d.ts +3 -0
- package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -1
- package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/esm/pushed-config-error-overlay/index.js +42 -343
- package/dist/esm/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/esm/setup-error-overlay/index.d.ts +16 -0
- package/dist/esm/setup-error-overlay/index.d.ts.map +1 -0
- package/dist/esm/setup-error-overlay/index.js +106 -0
- package/dist/esm/setup-error-overlay/index.js.map +1 -0
- package/dist/esm/setup-error-overlay/index.test.d.ts +1 -0
- package/dist/esm/setup-error-overlay/index.test.js +125 -0
- package/dist/esm/setup-error-overlay/index.test.js.map +1 -0
- package/dist/esm/utils/monkey-patch.d.ts +7 -0
- package/dist/esm/utils/monkey-patch.d.ts.map +1 -0
- package/dist/esm/utils/monkey-patch.js +20 -0
- package/dist/esm/utils/monkey-patch.js.map +1 -0
- package/dist/esm/utils/react.d.ts +17 -0
- package/dist/esm/utils/react.d.ts.map +1 -0
- package/dist/esm/utils/react.js +60 -0
- package/dist/esm/utils/react.js.map +1 -0
- package/dist/generated/quetzal-translations.d.ts +1 -1
- package/dist/{hexclave-provider-BKxi3Vy-.d.ts → hexclave-provider-CMz2mt4I.d.ts} +3 -3
- package/dist/{hexclave-provider-BKxi3Vy-.d.ts.map → hexclave-provider-CMz2mt4I.d.ts.map} +1 -1
- package/dist/{hooks-CUe5bc3s.d.ts → hooks-CUHt4Y9C.d.ts} +2 -2
- package/dist/{hooks-CUe5bc3s.d.ts.map → hooks-CUHt4Y9C.d.ts.map} +1 -1
- package/dist/in-page-ui/dev-environment.d.ts +5 -0
- package/dist/in-page-ui/dev-environment.d.ts.map +1 -0
- package/dist/in-page-ui/dev-environment.js +19 -0
- package/dist/in-page-ui/dev-environment.js.map +1 -0
- package/dist/in-page-ui/issue-card.d.ts +52 -0
- package/dist/in-page-ui/issue-card.d.ts.map +1 -0
- package/dist/in-page-ui/issue-card.js +397 -0
- package/dist/in-page-ui/issue-card.js.map +1 -0
- package/dist/in-page-ui/issue-card.test.d.ts +1 -0
- package/dist/in-page-ui/issue-card.test.js +59 -0
- package/dist/in-page-ui/issue-card.test.js.map +1 -0
- package/dist/in-page-ui/logo.d.ts +5 -0
- package/dist/in-page-ui/logo.d.ts.map +1 -0
- package/dist/in-page-ui/logo.js +7 -0
- package/dist/in-page-ui/logo.js.map +1 -0
- package/dist/{index-CvB7XacB.d.ts → index-fR0LkUK7.d.ts} +2 -2
- package/dist/{index-CvB7XacB.d.ts.map → index-fR0LkUK7.d.ts.map} +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +29 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +140 -15
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +2 -2
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +182 -25
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.d.ts +1 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js +82 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js.map +1 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.d.ts +1 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js +119 -0
- package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js.map +1 -0
- package/dist/lib/hexclave-app/apps/implementations/common.js +4 -3
- package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/implementations/index.js +1 -1
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +1 -0
- package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
- package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
- package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
- package/dist/lib/hexclave-app/index.d.ts +1 -1
- package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
- package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
- package/dist/lib/hexclave-app/teams/index.js.map +1 -1
- package/dist/lib/hexclave-app/users/index.d.ts +1 -1
- package/dist/lib/hooks.d.ts +1 -1
- package/dist/providers/hexclave-context.d.ts +1 -1
- package/dist/providers/hexclave-provider-client.d.ts +1 -1
- package/dist/providers/hexclave-provider.d.ts +1 -1
- package/dist/providers/translation-provider.d.ts +1 -1
- package/dist/pushed-config-error-overlay/index.d.ts +1 -1
- package/dist/pushed-config-error-overlay/index.d.ts.map +1 -1
- package/dist/pushed-config-error-overlay/index.js +41 -342
- package/dist/pushed-config-error-overlay/index.js.map +1 -1
- package/dist/{quetzal-translations-XeH3zQ9l.d.ts → quetzal-translations-B2jT2SWm.d.ts} +3 -3
- package/dist/{quetzal-translations-XeH3zQ9l.d.ts.map → quetzal-translations-B2jT2SWm.d.ts.map} +1 -1
- package/dist/setup-error-overlay/index.d.ts +16 -0
- package/dist/setup-error-overlay/index.d.ts.map +1 -0
- package/dist/setup-error-overlay/index.js +108 -0
- package/dist/setup-error-overlay/index.js.map +1 -0
- package/dist/setup-error-overlay/index.test.d.ts +1 -0
- package/dist/setup-error-overlay/index.test.js +124 -0
- package/dist/setup-error-overlay/index.test.js.map +1 -0
- package/dist/team-invitation-B5Ol7vdd.d.ts.map +1 -1
- package/dist/{translation-provider-WOaZXqAz.d.ts → translation-provider-6505O9P2.d.ts} +2 -2
- package/dist/{translation-provider-WOaZXqAz.d.ts.map → translation-provider-6505O9P2.d.ts.map} +1 -1
- package/dist/utils/monkey-patch.d.ts +7 -0
- package/dist/utils/monkey-patch.d.ts.map +1 -0
- package/dist/utils/monkey-patch.js +23 -0
- package/dist/utils/monkey-patch.js.map +1 -0
- package/dist/utils/react.d.ts +17 -0
- package/dist/utils/react.d.ts.map +1 -0
- package/dist/utils/react.js +63 -0
- package/dist/utils/react.js.map +1 -0
- package/package.json +4 -4
- package/src/components/elements/sidebar-layout.tsx +16 -1
- package/src/components-page/team-invitation-cache.test.ts +25 -0
- package/src/components-page/team-invitation-cache.ts +13 -0
- package/src/components-page/team-invitation.tsx +16 -7
- package/src/dev-tool/dev-tool-core.ts +1 -4
- package/src/dev-tool/index.ts +4 -15
- package/src/in-page-ui/dev-environment.ts +33 -0
- package/src/in-page-ui/issue-card.test.ts +67 -0
- package/src/in-page-ui/issue-card.ts +500 -0
- package/src/in-page-ui/logo.ts +8 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.ts +38 -1
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +157 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.ts +96 -0
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +255 -37
- package/src/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.ts +146 -0
- package/src/lib/hexclave-app/apps/implementations/common.ts +2 -1
- package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.test.ts +1 -0
- package/src/lib/hexclave-app/teams/index.ts +3 -0
- package/src/pushed-config-error-overlay/index.ts +45 -386
- package/src/setup-error-overlay/index.test.ts +133 -0
- package/src/setup-error-overlay/index.ts +150 -0
- package/src/utils/monkey-patch.tsx +31 -0
- package/src/utils/react.tsx +93 -0
- package/dist/admin-app-impl-sTQD2d-3.d.ts.map +0 -1
- package/dist/client-app-BCT5p_70.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-app-impl.automatic-side-effects.test.js","names":["HexclaveClientApp","hexclaveAppInternalsSymbol"],"sources":["../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it } from \"vitest\";\nimport { hexclaveAppInternalsSymbol } from \"../../common\";\nimport { HexclaveClientApp, HexclaveClientAppConstructorOptions, HexclaveClientAppJson } from \"../interfaces/client-app\";\n\nconst baseOptions = {\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n} satisfies HexclaveClientAppConstructorOptions<true, string>;\n\ndescribe(\"HexclaveClientApp automatic side effects\", () => {\n it(\"does not inspect browser state when disabled\", () => {\n const previousWindow = Reflect.get(globalThis, \"window\");\n const previousDocument = Reflect.get(globalThis, \"document\");\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const hadPreviousDocument = Reflect.has(globalThis, \"document\");\n const browserGlobal = {};\n Object.defineProperty(browserGlobal, \"location\", {\n get() {\n throw new Error(\"Construction must not inspect the current URL when automatic side effects are disabled\");\n },\n });\n\n Reflect.set(globalThis, \"window\", browserGlobal);\n Object.defineProperty(globalThis, \"document\", {\n configurable: true,\n get() {\n throw new Error(\"Construction must not access the document when automatic side effects are disabled\");\n },\n });\n\n try {\n expect(() => new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n })).not.toThrow();\n } finally {\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n if (hadPreviousDocument) {\n Object.defineProperty(globalThis, \"document\", {\n configurable: true,\n value: previousDocument,\n writable: true,\n });\n } else {\n Reflect.deleteProperty(globalThis, \"document\");\n }\n }\n });\n\n it(\"does not initialize automatic side effects when disabled\", () => {\n const methodName = \"_initializeAutomaticSideEffects\";\n const originalInitializer = Reflect.get(HexclaveClientApp.prototype, methodName);\n let initializationCalls = 0;\n Reflect.set(HexclaveClientApp.prototype, methodName, () => {\n initializationCalls += 1;\n });\n\n try {\n new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n });\n\n expect(initializationCalls).toBe(0);\n } finally {\n Reflect.set(HexclaveClientApp.prototype, methodName, originalInitializer);\n }\n });\n\n it.each([undefined, true])(\"retains automatic initialization when automaticSideEffects is %s\", (automaticSideEffects) => {\n const methodName = \"_initializeAutomaticSideEffects\";\n const originalInitializer = Reflect.get(HexclaveClientApp.prototype, methodName);\n let initializationCalls = 0;\n Reflect.set(HexclaveClientApp.prototype, methodName, () => {\n initializationCalls += 1;\n });\n\n try {\n new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects,\n });\n\n expect(initializationCalls).toBe(1);\n } finally {\n Reflect.set(HexclaveClientApp.prototype, methodName, originalInitializer);\n }\n });\n\n it(\"preserves the option through serialization\", () => {\n const app = new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n });\n\n expect(app[hexclaveAppInternalsSymbol].toClientJson().automaticSideEffects).toBe(false);\n });\n\n it(\"preserves stable identity when deserializing with automatic side effects disabled\", () => {\n const json: HexclaveClientAppJson<false, string> = {\n baseUrl: baseOptions.baseUrl,\n projectId: baseOptions.projectId,\n publishableClientKey: baseOptions.publishableClientKey,\n tokenStore: null,\n redirectMethod: baseOptions.redirectMethod,\n automaticSideEffects: false,\n uniqueIdentifier: \"00000000-0000-4000-8000-000000000001\",\n };\n\n const first = HexclaveClientApp[hexclaveAppInternalsSymbol].fromClientJson(json);\n const second = HexclaveClientApp[hexclaveAppInternalsSymbol].fromClientJson(json);\n\n expect(second).toBe(first);\n });\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"client-app-impl.automatic-side-effects.test.js","names":["HexclaveClientApp","hexclaveAppInternalsSymbol"],"sources":["../../../../../src/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.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 { hexclaveAppInternalsSymbol } from \"../../common\";\nimport { HexclaveClientApp, HexclaveClientAppConstructorOptions, HexclaveClientAppJson } from \"../interfaces/client-app\";\nimport { stripBrowserActionQueryParam } from \"./client-app-impl\";\n\nconst baseOptions = {\n baseUrl: \"http://localhost:12345\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n} satisfies HexclaveClientAppConstructorOptions<true, string>;\n\ndescribe(\"HexclaveClientApp automatic side effects\", () => {\n it(\"does not inspect browser state when disabled\", () => {\n const previousWindow = Reflect.get(globalThis, \"window\");\n const previousDocument = Reflect.get(globalThis, \"document\");\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n const hadPreviousDocument = Reflect.has(globalThis, \"document\");\n const browserGlobal = {};\n Object.defineProperty(browserGlobal, \"location\", {\n get() {\n throw new Error(\"Construction must not inspect the current URL when automatic side effects are disabled\");\n },\n });\n\n Reflect.set(globalThis, \"window\", browserGlobal);\n Object.defineProperty(globalThis, \"document\", {\n configurable: true,\n get() {\n throw new Error(\"Construction must not access the document when automatic side effects are disabled\");\n },\n });\n\n try {\n expect(() => new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n })).not.toThrow();\n } finally {\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n if (hadPreviousDocument) {\n Object.defineProperty(globalThis, \"document\", {\n configurable: true,\n value: previousDocument,\n writable: true,\n });\n } else {\n Reflect.deleteProperty(globalThis, \"document\");\n }\n }\n });\n\n it(\"does not initialize automatic side effects when disabled\", () => {\n const methodName = \"_initializeAutomaticSideEffects\";\n const originalInitializer = Reflect.get(HexclaveClientApp.prototype, methodName);\n let initializationCalls = 0;\n Reflect.set(HexclaveClientApp.prototype, methodName, () => {\n initializationCalls += 1;\n });\n\n try {\n new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n });\n\n expect(initializationCalls).toBe(0);\n } finally {\n Reflect.set(HexclaveClientApp.prototype, methodName, originalInitializer);\n }\n });\n\n it.each([undefined, true])(\"retains automatic initialization when automaticSideEffects is %s\", (automaticSideEffects) => {\n const methodName = \"_initializeAutomaticSideEffects\";\n const originalInitializer = Reflect.get(HexclaveClientApp.prototype, methodName);\n let initializationCalls = 0;\n Reflect.set(HexclaveClientApp.prototype, methodName, () => {\n initializationCalls += 1;\n });\n\n try {\n new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects,\n });\n\n expect(initializationCalls).toBe(1);\n } finally {\n Reflect.set(HexclaveClientApp.prototype, methodName, originalInitializer);\n }\n });\n\n it(\"preserves the option through serialization\", () => {\n const app = new HexclaveClientApp({\n ...baseOptions,\n automaticSideEffects: false,\n });\n\n expect(app[hexclaveAppInternalsSymbol].toClientJson().automaticSideEffects).toBe(false);\n });\n\n it(\"preserves stable identity when deserializing with automatic side effects disabled\", () => {\n const json: HexclaveClientAppJson<false, string> = {\n baseUrl: baseOptions.baseUrl,\n projectId: baseOptions.projectId,\n publishableClientKey: baseOptions.publishableClientKey,\n tokenStore: null,\n redirectMethod: baseOptions.redirectMethod,\n automaticSideEffects: false,\n uniqueIdentifier: \"00000000-0000-4000-8000-000000000001\",\n };\n\n const first = HexclaveClientApp[hexclaveAppInternalsSymbol].fromClientJson(json);\n const second = HexclaveClientApp[hexclaveAppInternalsSymbol].fromClientJson(json);\n\n expect(second).toBe(first);\n });\n\n it(\"keeps stripping the browser action parameter after a router restores it\", () => {\n vi.useFakeTimers();\n const previousWindow = Reflect.get(globalThis, \"window\");\n const hadPreviousWindow = Reflect.has(globalThis, \"window\");\n let currentHref = \"http://localhost:12345/?hexclave_action_id=action-id\";\n const browserGlobal = {\n location: {\n get href() {\n return currentHref;\n },\n },\n history: {\n state: null,\n replaceState: (_state: null, _title: string, url: string | URL) => {\n currentHref = String(url);\n },\n },\n setTimeout,\n };\n\n Reflect.set(globalThis, \"window\", browserGlobal);\n try {\n stripBrowserActionQueryParam();\n currentHref = \"http://localhost:12345/?hexclave_action_id=action-id\";\n vi.runAllTimers();\n expect(currentHref).toBe(\"http://localhost:12345/\");\n } finally {\n vi.useRealTimers();\n if (hadPreviousWindow) {\n Reflect.set(globalThis, \"window\", previousWindow);\n } else {\n Reflect.deleteProperty(globalThis, \"window\");\n }\n }\n });\n});\n"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
|
|
1
2
|
let vitest = require("vitest");
|
|
2
3
|
let ______common_js = require("../../common.js");
|
|
3
4
|
let ___interfaces_client_app_js = require("../interfaces/client-app.js");
|
|
@@ -51,6 +52,22 @@ function createMockDocument() {
|
|
|
51
52
|
createElement: () => ({})
|
|
52
53
|
};
|
|
53
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Installs a stand-in for `window` with only the parts the code under test touches. `globalThis.window` is typed as a
|
|
57
|
+
* full `Window`, which a hand-written stub can never be, so the assignment goes through `Reflect.set` — the stub's own
|
|
58
|
+
* shape stays checked, unlike with a cast on the object literal.
|
|
59
|
+
*/
|
|
60
|
+
function setMockWindow(mockWindow) {
|
|
61
|
+
Reflect.set(globalThis, "window", mockWindow);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Calls one of the app's `protected` methods, which are part of the flows under test but not of the public SDK surface.
|
|
65
|
+
*/
|
|
66
|
+
function callProtectedMethod(app, methodName, ...args) {
|
|
67
|
+
const method = Reflect.get(app, methodName);
|
|
68
|
+
if (typeof method !== "function") throw new Error(`Expected StackClientApp to have a ${methodName} method in tests.`);
|
|
69
|
+
return method.apply(app, args);
|
|
70
|
+
}
|
|
54
71
|
(0, vitest.describe)("StackClientApp cross-domain auth", () => {
|
|
55
72
|
(0, vitest.it)("keeps noRedirectBack same-domain redirects free of redirect-back state", async () => {
|
|
56
73
|
(0, vitest.expect)(await (0, __redirect_page_urls_js.planRedirectToHandler)({
|
|
@@ -115,7 +132,8 @@ function createMockDocument() {
|
|
|
115
132
|
tokenStore: "memory",
|
|
116
133
|
redirectMethod: "none",
|
|
117
134
|
urls: { signIn: "/handler/sign-in" },
|
|
118
|
-
noAutomaticPrefetch: true
|
|
135
|
+
noAutomaticPrefetch: true,
|
|
136
|
+
devTool: false
|
|
119
137
|
})[______common_js.hexclaveAppInternalsSymbol].getRedirectToHandlerUrl("signIn");
|
|
120
138
|
const resolved = new URL(redirectUrl, "http://localhost");
|
|
121
139
|
(0, vitest.expect)(resolved.pathname).toBe("/handler/sign-in");
|
|
@@ -136,7 +154,8 @@ function createMockDocument() {
|
|
|
136
154
|
refreshToken: "stale-refresh-token"
|
|
137
155
|
},
|
|
138
156
|
redirectMethod: "none",
|
|
139
|
-
noAutomaticPrefetch: true
|
|
157
|
+
noAutomaticPrefetch: true,
|
|
158
|
+
devTool: false
|
|
140
159
|
});
|
|
141
160
|
const clientInterface = Reflect.get(clientApp, "_interface");
|
|
142
161
|
const originalSendClientRequest = Reflect.get(clientInterface, "sendClientRequest");
|
|
@@ -198,7 +217,8 @@ function createMockDocument() {
|
|
|
198
217
|
tokenStore: "memory",
|
|
199
218
|
redirectMethod: "window",
|
|
200
219
|
urls: { default: { type: "hosted" } },
|
|
201
|
-
noAutomaticPrefetch: true
|
|
220
|
+
noAutomaticPrefetch: true,
|
|
221
|
+
devTool: false
|
|
202
222
|
});
|
|
203
223
|
const outerState = "outer-cross-domain-state";
|
|
204
224
|
const outerCodeChallenge = "abcdefghijklmnopqrstuvwxyzABCDEFG_0123456789-._~";
|
|
@@ -250,7 +270,8 @@ function createMockDocument() {
|
|
|
250
270
|
tokenStore: "memory",
|
|
251
271
|
redirectMethod: "window",
|
|
252
272
|
urls: { default: { type: "hosted" } },
|
|
253
|
-
noAutomaticPrefetch: true
|
|
273
|
+
noAutomaticPrefetch: true,
|
|
274
|
+
devTool: false
|
|
254
275
|
});
|
|
255
276
|
const tokenStore = Reflect.get(clientApp, "_memoryTokenStore");
|
|
256
277
|
if (!(tokenStore instanceof _hexclave_shared_dist_utils_stores.Store)) throw new Error("Expected StackClientApp to use a memory token store in this test.");
|
|
@@ -316,7 +337,8 @@ function createMockDocument() {
|
|
|
316
337
|
publishableClientKey: "stack-pk-test",
|
|
317
338
|
tokenStore: "cookie",
|
|
318
339
|
redirectMethod: "none",
|
|
319
|
-
noAutomaticPrefetch: true
|
|
340
|
+
noAutomaticPrefetch: true,
|
|
341
|
+
devTool: false
|
|
320
342
|
});
|
|
321
343
|
const clientInterface = Reflect.get(clientApp, "_interface");
|
|
322
344
|
const originalFetchNewAccessToken = Reflect.get(clientInterface, "fetchNewAccessToken");
|
|
@@ -367,7 +389,8 @@ function createMockDocument() {
|
|
|
367
389
|
publishableClientKey: "stack-pk-test",
|
|
368
390
|
tokenStore: "memory",
|
|
369
391
|
redirectMethod: "window",
|
|
370
|
-
noAutomaticPrefetch: true
|
|
392
|
+
noAutomaticPrefetch: true,
|
|
393
|
+
devTool: false
|
|
371
394
|
});
|
|
372
395
|
globalThis.document = createMockDocument();
|
|
373
396
|
globalThis.window = { location: {
|
|
@@ -392,6 +415,99 @@ function createMockDocument() {
|
|
|
392
415
|
globalThis.document = previousDocument;
|
|
393
416
|
}
|
|
394
417
|
});
|
|
418
|
+
(0, vitest.it)("reports malformed nested cross-domain auth URLs as setup errors", async () => {
|
|
419
|
+
const projectId = "00000000-0000-4000-8000-000000000012";
|
|
420
|
+
const previousWindow = globalThis.window;
|
|
421
|
+
const previousDocument = globalThis.document;
|
|
422
|
+
globalThis.document = createMockDocument();
|
|
423
|
+
const malformedCases = [
|
|
424
|
+
{
|
|
425
|
+
description: "redirect URI",
|
|
426
|
+
currentRefreshTokenId: "source-refresh-token-id",
|
|
427
|
+
params: {
|
|
428
|
+
redirect_uri: "not-a-url",
|
|
429
|
+
state: "nested-state",
|
|
430
|
+
code_challenge: "nested-code-challenge"
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
description: "after-callback redirect URL",
|
|
435
|
+
currentRefreshTokenId: "source-refresh-token-id",
|
|
436
|
+
params: {
|
|
437
|
+
redirect_uri: "https://source.example.test/handler/account-settings",
|
|
438
|
+
state: "nested-state",
|
|
439
|
+
code_challenge: "nested-code-challenge",
|
|
440
|
+
after_callback_redirect_url: "http://["
|
|
441
|
+
}
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
description: "callback URL",
|
|
445
|
+
currentRefreshTokenId: null,
|
|
446
|
+
params: { stack_nested_cross_domain_auth_callback_url: "http://[" }
|
|
447
|
+
}
|
|
448
|
+
];
|
|
449
|
+
try {
|
|
450
|
+
for (const malformedCase of malformedCases) {
|
|
451
|
+
const currentUrl = new URL("https://target.example.test/nested-provider");
|
|
452
|
+
currentUrl.searchParams.set("stack_nested_cross_domain_auth_refresh_token_id", "source-refresh-token-id");
|
|
453
|
+
for (const [key, value] of Object.entries(malformedCase.params)) currentUrl.searchParams.set(key, value);
|
|
454
|
+
globalThis.window = previousWindow;
|
|
455
|
+
const clientApp = new ___interfaces_client_app_js.StackClientApp({
|
|
456
|
+
baseUrl: "http://localhost:12345",
|
|
457
|
+
projectId,
|
|
458
|
+
publishableClientKey: "stack-pk-test",
|
|
459
|
+
tokenStore: "memory",
|
|
460
|
+
redirectMethod: "window",
|
|
461
|
+
noAutomaticPrefetch: true,
|
|
462
|
+
devTool: false
|
|
463
|
+
});
|
|
464
|
+
setMockWindow({ location: { href: currentUrl.toString() } });
|
|
465
|
+
Reflect.set(clientApp, "_fetchCurrentRefreshTokenIdIfSignedIn", async () => malformedCase.currentRefreshTokenId);
|
|
466
|
+
Reflect.set(clientApp, "_isTrusted", async () => true);
|
|
467
|
+
const nestedAuthPromise = callProtectedMethod(clientApp, "_maybeHandleNestedCrossDomainAuth");
|
|
468
|
+
await (0, vitest.expect)(nestedAuthPromise).rejects.toThrowError(new RegExp(`${malformedCase.description} .* is not a valid absolute URL`));
|
|
469
|
+
await (0, vitest.expect)(nestedAuthPromise).rejects.toSatisfy((error) => _hexclave_shared_dist_utils_errors.HexclaveSetupError.isSetupError(error));
|
|
470
|
+
}
|
|
471
|
+
} finally {
|
|
472
|
+
globalThis.window = previousWindow;
|
|
473
|
+
globalThis.document = previousDocument;
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
(0, vitest.it)("keeps nested cross-domain auth failures off the page for a handoff that does not own the session", async () => {
|
|
477
|
+
const projectId = "00000000-0000-4000-8000-000000000013";
|
|
478
|
+
const previousWindow = globalThis.window;
|
|
479
|
+
const previousDocument = globalThis.document;
|
|
480
|
+
globalThis.document = createMockDocument();
|
|
481
|
+
const craftedRedirectUris = ["https://evil.example.test/handler/account-settings", "not-a-url"];
|
|
482
|
+
try {
|
|
483
|
+
for (const craftedRedirectUri of craftedRedirectUris) {
|
|
484
|
+
const currentUrl = new URL("https://target.example.test/nested-provider");
|
|
485
|
+
currentUrl.searchParams.set("stack_nested_cross_domain_auth_refresh_token_id", "attacker-chosen-refresh-token-id");
|
|
486
|
+
currentUrl.searchParams.set("redirect_uri", craftedRedirectUri);
|
|
487
|
+
currentUrl.searchParams.set("state", "nested-state");
|
|
488
|
+
currentUrl.searchParams.set("code_challenge", "nested-code-challenge");
|
|
489
|
+
globalThis.window = previousWindow;
|
|
490
|
+
const clientApp = new ___interfaces_client_app_js.StackClientApp({
|
|
491
|
+
baseUrl: "http://localhost:12345",
|
|
492
|
+
projectId,
|
|
493
|
+
publishableClientKey: "stack-pk-test",
|
|
494
|
+
tokenStore: "memory",
|
|
495
|
+
redirectMethod: "window",
|
|
496
|
+
noAutomaticPrefetch: true,
|
|
497
|
+
devTool: false
|
|
498
|
+
});
|
|
499
|
+
setMockWindow({ location: { href: currentUrl.toString() } });
|
|
500
|
+
Reflect.set(clientApp, "_fetchCurrentRefreshTokenIdIfSignedIn", async () => "this-apps-refresh-token-id");
|
|
501
|
+
Reflect.set(clientApp, "_isTrusted", async () => false);
|
|
502
|
+
const nestedAuthPromise = callProtectedMethod(clientApp, "_maybeHandleNestedCrossDomainAuth");
|
|
503
|
+
await (0, vitest.expect)(nestedAuthPromise).rejects.toThrowError(/does not match the requested refresh token ID/);
|
|
504
|
+
await (0, vitest.expect)(nestedAuthPromise).rejects.toSatisfy((error) => !_hexclave_shared_dist_utils_errors.HexclaveSetupError.isSetupError(error));
|
|
505
|
+
}
|
|
506
|
+
} finally {
|
|
507
|
+
globalThis.window = previousWindow;
|
|
508
|
+
globalThis.document = previousDocument;
|
|
509
|
+
}
|
|
510
|
+
});
|
|
395
511
|
(0, vitest.it)("passes the construction-time URL to the nested cross-domain auth handler", async () => {
|
|
396
512
|
const projectId = "00000000-0000-4000-8000-000000000009";
|
|
397
513
|
const previousWindow = globalThis.window;
|
|
@@ -413,7 +529,8 @@ function createMockDocument() {
|
|
|
413
529
|
publishableClientKey: "stack-pk-test",
|
|
414
530
|
tokenStore: "memory",
|
|
415
531
|
redirectMethod: "window",
|
|
416
|
-
noAutomaticPrefetch: true
|
|
532
|
+
noAutomaticPrefetch: true,
|
|
533
|
+
devTool: false
|
|
417
534
|
});
|
|
418
535
|
globalThis.window.location.href = strippedUrl.toString();
|
|
419
536
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
@@ -468,7 +585,8 @@ function createMockDocument() {
|
|
|
468
585
|
tokenStore: "memory",
|
|
469
586
|
redirectMethod: "window",
|
|
470
587
|
urls: { default: { type: "hosted" } },
|
|
471
|
-
noAutomaticPrefetch: true
|
|
588
|
+
noAutomaticPrefetch: true,
|
|
589
|
+
devTool: false
|
|
472
590
|
});
|
|
473
591
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
474
592
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
@@ -497,7 +615,8 @@ function createMockDocument() {
|
|
|
497
615
|
handler: "/handler",
|
|
498
616
|
signOut: { type: "hosted" }
|
|
499
617
|
},
|
|
500
|
-
noAutomaticPrefetch: true
|
|
618
|
+
noAutomaticPrefetch: true,
|
|
619
|
+
devTool: false
|
|
501
620
|
});
|
|
502
621
|
const signOutSpy = vitest.vi.spyOn(clientApp, "signOut").mockRejectedValue(/* @__PURE__ */ new Error("INTENTIONAL_TEST_ABORT"));
|
|
503
622
|
try {
|
|
@@ -515,7 +634,8 @@ function createMockDocument() {
|
|
|
515
634
|
tokenStore: "memory",
|
|
516
635
|
redirectMethod: "window",
|
|
517
636
|
urls: { default: { type: "hosted" } },
|
|
518
|
-
noAutomaticPrefetch: true
|
|
637
|
+
noAutomaticPrefetch: true,
|
|
638
|
+
devTool: false
|
|
519
639
|
});
|
|
520
640
|
(0, vitest.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);
|
|
521
641
|
(0, vitest.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);
|
|
@@ -529,7 +649,8 @@ function createMockDocument() {
|
|
|
529
649
|
tokenStore: "memory",
|
|
530
650
|
redirectMethod: "window",
|
|
531
651
|
urls: { handler: "/custom-handler" },
|
|
532
|
-
noAutomaticPrefetch: true
|
|
652
|
+
noAutomaticPrefetch: true,
|
|
653
|
+
devTool: false
|
|
533
654
|
}).urls.signIn).toBe("/custom-handler/sign-in");
|
|
534
655
|
});
|
|
535
656
|
(0, vitest.it)("keeps default hosted signOut() on the source domain when afterSignOut is not configured", async () => {
|
|
@@ -540,7 +661,8 @@ function createMockDocument() {
|
|
|
540
661
|
tokenStore: "memory",
|
|
541
662
|
redirectMethod: "window",
|
|
542
663
|
urls: { default: { type: "hosted" } },
|
|
543
|
-
noAutomaticPrefetch: true
|
|
664
|
+
noAutomaticPrefetch: true,
|
|
665
|
+
devTool: false
|
|
544
666
|
});
|
|
545
667
|
const currentHref = "https://demo.stack-auth.com/settings?tab=profile";
|
|
546
668
|
const clientInterface = Reflect.get(clientApp, "_interface");
|
|
@@ -594,7 +716,8 @@ function createMockDocument() {
|
|
|
594
716
|
publishableClientKey: "stack-pk-test",
|
|
595
717
|
tokenStore: "memory",
|
|
596
718
|
redirectMethod: "window",
|
|
597
|
-
noAutomaticPrefetch: true
|
|
719
|
+
noAutomaticPrefetch: true,
|
|
720
|
+
devTool: false
|
|
598
721
|
});
|
|
599
722
|
windowMock.location.href = "https://demo.example.test/handler/mfa";
|
|
600
723
|
(0, vitest.expect)(await clientApp[______common_js.hexclaveAppInternalsSymbol].getRedirectToHandlerUrl("afterSignIn")).toBe("/music?track=1");
|
|
@@ -646,7 +769,8 @@ function createMockDocument() {
|
|
|
646
769
|
publishableClientKey: "stack-pk-test",
|
|
647
770
|
tokenStore: "memory",
|
|
648
771
|
redirectMethod: "window",
|
|
649
|
-
noAutomaticPrefetch: true
|
|
772
|
+
noAutomaticPrefetch: true,
|
|
773
|
+
devTool: false
|
|
650
774
|
});
|
|
651
775
|
const crossDomainAuthorizeRedirect = "https://demo.example.test/handler/oauth-callback?code=minted-code&state=mirror-handoff-state";
|
|
652
776
|
const createCrossDomainAuthRedirectUrlSpy = vitest.vi.spyOn(clientApp, "_createCrossDomainAuthRedirectUrl").mockResolvedValue(crossDomainAuthorizeRedirect);
|
|
@@ -672,7 +796,8 @@ function createMockDocument() {
|
|
|
672
796
|
publishableClientKey: "stack-pk-test",
|
|
673
797
|
tokenStore: "memory",
|
|
674
798
|
redirectMethod: "none",
|
|
675
|
-
noAutomaticPrefetch: true
|
|
799
|
+
noAutomaticPrefetch: true,
|
|
800
|
+
devTool: false
|
|
676
801
|
});
|
|
677
802
|
const oldAccessToken = createAccessTokenString("old-refresh-token-id");
|
|
678
803
|
const refreshedOldAccessToken = createAccessTokenString("refreshed-old-refresh-token-id");
|