@hexclave/tanstack-start 1.0.22 → 1.0.24

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 (102) hide show
  1. package/dist/clickmap/clickmap-core.js +1 -1
  2. package/dist/clickmap/index.js +2 -2
  3. package/dist/components/api-key-dialogs.js +2 -2
  4. package/dist/components/credential-sign-in.js +1 -1
  5. package/dist/components/credential-sign-up.js +1 -1
  6. package/dist/components/elements/sidebar-layout.js +1 -1
  7. package/dist/components/magic-link-sign-in.js +1 -1
  8. package/dist/components/team-switcher.js +1 -1
  9. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  10. package/dist/components-page/account-settings/email-and-auth/emails-section.js +1 -1
  11. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  12. package/dist/components-page/account-settings/email-and-auth/password-section.js +1 -1
  13. package/dist/components-page/account-settings/profile-page/profile-page.js +1 -1
  14. package/dist/components-page/account-settings/teams/team-creation-page.js +1 -1
  15. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +1 -1
  16. package/dist/components-page/auth-page.js +1 -1
  17. package/dist/components-page/cli-auth-confirm.js +1 -1
  18. package/dist/components-page/cli-auth-confirm.test.js +1 -1
  19. package/dist/components-page/forgot-password.js +1 -1
  20. package/dist/components-page/oauth-callback.js +1 -1
  21. package/dist/components-page/onboarding.js +1 -1
  22. package/dist/components-page/password-reset.js +1 -1
  23. package/dist/components-page/team-creation.js +1 -1
  24. package/dist/dev-tool/dev-tool-core.js +1 -1
  25. package/dist/dev-tool/index.d.ts +6 -5
  26. package/dist/dev-tool/index.d.ts.map +1 -1
  27. package/dist/dev-tool/index.js +17 -7
  28. package/dist/dev-tool/index.js.map +1 -1
  29. package/dist/esm/clickmap/clickmap-core.js +1 -1
  30. package/dist/esm/clickmap/index.js +2 -2
  31. package/dist/esm/components/api-key-dialogs.js +2 -2
  32. package/dist/esm/components/credential-sign-in.js +1 -1
  33. package/dist/esm/components/credential-sign-up.js +1 -1
  34. package/dist/esm/components/elements/sidebar-layout.js +1 -1
  35. package/dist/esm/components/magic-link-sign-in.js +1 -1
  36. package/dist/esm/components/team-switcher.js +1 -1
  37. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js +1 -1
  38. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +1 -1
  39. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js +1 -1
  40. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +1 -1
  41. package/dist/esm/components-page/account-settings/profile-page/profile-page.js +1 -1
  42. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +1 -1
  43. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +1 -1
  44. package/dist/esm/components-page/auth-page.js +1 -1
  45. package/dist/esm/components-page/cli-auth-confirm.js +1 -1
  46. package/dist/esm/components-page/cli-auth-confirm.test.js +1 -1
  47. package/dist/esm/components-page/forgot-password.js +1 -1
  48. package/dist/esm/components-page/oauth-callback.js +1 -1
  49. package/dist/esm/components-page/onboarding.js +1 -1
  50. package/dist/esm/components-page/password-reset.js +1 -1
  51. package/dist/esm/components-page/team-creation.js +1 -1
  52. package/dist/esm/dev-tool/dev-tool-core.js +1 -1
  53. package/dist/esm/dev-tool/index.d.ts +6 -5
  54. package/dist/esm/dev-tool/index.d.ts.map +1 -1
  55. package/dist/esm/dev-tool/index.js +17 -7
  56. package/dist/esm/dev-tool/index.js.map +1 -1
  57. package/dist/esm/generated/env.js +20 -20
  58. package/dist/esm/generated/env.js.map +1 -1
  59. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  60. package/dist/esm/lib/auth.js +3 -3
  61. package/dist/esm/lib/auth.js.map +1 -1
  62. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +3 -3
  63. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  64. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  65. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +3 -3
  66. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  67. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
  68. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js +1 -1
  69. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
  70. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js +1 -1
  71. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +5 -3
  72. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  73. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  74. package/dist/esm/lib/hexclave-app/url-targets.test.js +7 -7
  75. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -1
  76. package/dist/esm/providers/theme-provider.js +1 -1
  77. package/dist/generated/env.js +20 -20
  78. package/dist/generated/env.js.map +1 -1
  79. package/dist/generated/quetzal-translations.d.ts +2 -2
  80. package/dist/lib/auth.js +3 -3
  81. package/dist/lib/auth.js.map +1 -1
  82. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +2 -2
  83. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  84. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  85. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +3 -3
  86. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  87. package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
  88. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js +1 -1
  89. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
  90. package/dist/lib/hexclave-app/apps/implementations/session-replay.js +1 -1
  91. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +5 -3
  92. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  93. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  94. package/dist/lib/hexclave-app/url-targets.test.js +7 -7
  95. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -1
  96. package/dist/providers/theme-provider.js +1 -1
  97. package/package.json +3 -3
  98. package/src/dev-tool/index.ts +27 -6
  99. package/src/lib/auth.ts +2 -2
  100. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +1 -1
  101. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +5 -3
  102. package/src/lib/hexclave-app/url-targets.test.ts +7 -7
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
3
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
5
5
  let react = require("react");
6
6
  react = require_chunk.__toESM(react);
7
7
  let _hexclave_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
@@ -17,7 +17,7 @@ let ____________generated_env_js = require("../../../../generated/env.js");
17
17
  let ______url_targets_js = require("../../url-targets.js");
18
18
 
19
19
  //#region src/lib/hexclave-app/apps/implementations/common.ts
20
- const clientVersion = "js @hexclave/tanstack-start@1.0.22";
20
+ const clientVersion = "js @hexclave/tanstack-start@1.0.24";
21
21
  if (clientVersion.startsWith("STACK_COMPILE_TIME")) throw new _hexclave_shared_dist_utils_errors.HexclaveAssertionError("Client version was not replaced. Something went wrong during build!");
22
22
  const replaceHexclavePortPrefix = (input) => {
23
23
  if (!input) return input;
@@ -1,9 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
3
  let _hexclave_shared_dist_utils_dev_tool = require("@hexclave/shared/dist/utils/dev-tool");
5
4
  let _hexclave_shared_dist_utils_dom = require("@hexclave/shared/dist/utils/dom");
6
5
  let _hexclave_shared_dist_utils_elements_chain = require("@hexclave/shared/dist/utils/elements-chain");
6
+ let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
7
7
  let _hexclave_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
8
8
  let __session_replay_js = require("./session-replay.js");
9
9
 
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
3
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
5
5
  let react = require("react");
6
6
  let _hexclave_shared = require("@hexclave/shared");
7
7
  let _hexclave_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
3
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
5
5
  let _hexclave_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
6
6
  let _hexclave_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
7
7
  let _hexclave_shared_dist_known_errors = require("@hexclave/shared/dist/known-errors");
@@ -24,11 +24,13 @@ type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId e
24
24
  redirectMethod?: RedirectMethod;
25
25
  inheritsFrom?: StackClientApp<any, any>;
26
26
  /**
27
- * Whether to show the Hexclave dev tool indicator in browser-like development environments.
27
+ * Whether to show the Hexclave dev tool indicator in browser-like environments.
28
28
  *
29
- * Defaults to true.
29
+ * - `true`: always show
30
+ * - `false`: never show
31
+ * - `"auto"` (default): show based on NODE_ENV or origin heuristics
30
32
  */
31
- devTool?: boolean;
33
+ devTool?: boolean | "auto";
32
34
  /**
33
35
  * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first
34
36
  * constructed. This improves the performance of your app, but will create network requests that are unnecessary if
@@ -1 +1 @@
1
- {"version":3,"file":"client-app.d.ts","names":[],"sources":["../../../../../src/lib/hexclave-app/apps/interfaces/client-app.ts"],"mappings":"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"}
1
+ {"version":3,"file":"client-app.d.ts","names":[],"sources":["../../../../../src/lib/hexclave-app/apps/interfaces/client-app.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client-app.js","names":["_HexclaveClientAppImpl"],"sources":["../../../../../src/lib/hexclave-app/apps/interfaces/client-app.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 { KnownErrors } from \"@hexclave/shared\";\nimport { CurrentUserCrud } from \"@hexclave/shared/dist/interface/crud/current-user\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { AsyncStoreProperty, AuthLike, GetCurrentPartialUserOptions, GetCurrentUserOptions, HandlerUrlOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol, TokenStoreInit } from \"../../common\";\nimport type { RequestListener } from \"@hexclave/shared/dist/interface/client-interface\";\nimport { CustomerInvoicesList, CustomerInvoicesRequestOptions, CustomerProductsList, CustomerProductsRequestOptions, Item } from \"../../customers\";\nimport { Project } from \"../../projects\";\nimport { ProjectCurrentUser, SyncedPartialUser, TokenPartialUser } from \"../../users\";\nimport { _HexclaveClientAppImpl } from \"../implementations\";\nimport { AnalyticsOptions } from \"../implementations/session-replay\";\n\n/** @deprecated Use `HexclaveClientAppConstructorOptions` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string | { browser: string, server: string },\n extraRequestHeaders?: Record<string, string>,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: HandlerUrlOptions,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn>,\n tokenStore?: TokenStoreInit<HasTokenStore>,\n redirectMethod?: RedirectMethod,\n inheritsFrom?: StackClientApp<any, any>,\n\n /**\n * Whether to show the Hexclave dev tool indicator in browser-like development environments.\n *\n * Defaults to true.\n */\n devTool?: boolean,\n\n /**\n * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first\n * constructed. This improves the performance of your app, but will create network requests that are unnecessary if\n * the app is never used or disposed of immediately. To disable this behavior, set this option to true.\n */\n noAutomaticPrefetch?: boolean,\n\n /**\n * Options for analytics and session recording. Replays are enabled by default;\n * set `{ replays: { enabled: false } }` to opt out.\n */\n analytics?: AnalyticsOptions,\n} & (\n { tokenStore: TokenStoreInit<HasTokenStore> } | { tokenStore?: undefined, inheritsFrom: StackClientApp<HasTokenStore, any> }\n) & (\n string extends ProjectId ? unknown : ({ projectId: ProjectId } | { inheritsFrom: StackClientApp<any, ProjectId> })\n);\n\n\n/** @deprecated Use `HexclaveClientAppJson` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & { inheritsFrom?: undefined } & {\n uniqueIdentifier: string,\n // note: if you add more fields here, make sure to ensure the checkString in the constructor has/doesn't have them\n};\n\n/** @deprecated Use `HexclaveClientApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n readonly projectId: ProjectId,\n\n /**\n * The version of the Hexclave SDK.\n */\n readonly version: string,\n\n /**\n * @deprecated Do not use `app.urls` for navigation. It is static and does not include runtime redirect-back,\n * cross-domain auth, or sign-out state. Use the matching `redirectToXyz()` method instead, for example\n * `redirectToSignIn()`, `redirectToSignUp()`, `redirectToSignOut()`, or `redirectToAccountSettings()`.\n */\n readonly urls: Readonly<ResolvedHandlerUrls>,\n\n signInWithOAuth(provider: string, options?: { returnTo?: string }): Promise<void>,\n signInWithCredential(options: { email: string, password: string, noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"EmailPasswordMismatch\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signUpWithCredential(options: {\n email: string,\n password: string,\n noRedirect?: boolean,\n } & ({ noVerificationCallback: true } | { noVerificationCallback?: false, verificationCallbackUrl?: string })): Promise<Result<undefined, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | KnownErrors[\"BotChallengeFailed\"]>>,\n signInWithPasskey(): Promise<Result<undefined, KnownErrors[\"PasskeyAuthenticationFailed\"] | KnownErrors[\"InvalidTotpCode\"] | KnownErrors[\"PasskeyWebAuthnError\"]>>,\n callOAuthCallback(): Promise<boolean>,\n promptCliLogin(options: { appUrl: string, expiresInMillis?: number, anonRefreshToken?: string, promptLink?: (url: string, loginCode: string) => void }): Promise<Result<string, KnownErrors[\"CliAuthError\"] | KnownErrors[\"CliAuthExpiredError\"] | KnownErrors[\"CliAuthUsedError\"]>>,\n sendForgotPasswordEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>>,\n sendMagicLinkEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"] | KnownErrors[\"BotChallengeFailed\"]>>,\n resetPassword(options: { code: string, password: string }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n getTeamInvitationDetails(code: string): Promise<Result<{ teamDisplayName: string }, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n signInWithMagicLink(code: string, options?: { noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signInWithMfa(otp: string, code: string, options?: { noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n\n redirectToOAuthCallback(): Promise<void>,\n\n getConvexClientAuth(options: HasTokenStore extends false ? { tokenStore: TokenStoreInit } : { tokenStore?: TokenStoreInit }): (args: { forceRefreshToken: boolean }) => Promise<string | null>,\n getConvexHttpClientAuth(options: { tokenStore: TokenStoreInit }): Promise<string>,\n\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetCurrentUserOptions<HasTokenStore>): ProjectCurrentUser<ProjectId> | null,\n\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'anonymous' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetCurrentUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>,\n\n cancelSubscription(options: { productId: string, subscriptionId?: string } | { productId: string, subscriptionId?: string, teamId: string }): Promise<void>,\n\n // note: we don't special-case 'anonymous' here to return non-null, see GetPartialUserOptions for more details\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'token' }): Promise<TokenPartialUser | null>,\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'convex' }): Promise<TokenPartialUser | null>,\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore>): Promise<SyncedPartialUser | TokenPartialUser | null>,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'token' }): TokenPartialUser | null,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'convex' }): TokenPartialUser | null,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore>): SyncedPartialUser | TokenPartialUser | null,\n useNavigate(): (to: string) => void, // THIS_LINE_PLATFORM react-like\n\n [hexclaveAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void,\n getConstructorOptions(): StackClientAppConstructorOptions<HasTokenStore, ProjectId> & { inheritsFrom?: undefined },\n sendSessionReplayBatch(body: string, options: { keepalive: boolean }): Promise<Result<Response, Error>>,\n sendAnalyticsEventBatch(body: string, options: { keepalive: boolean }): Promise<Result<Response, Error>>,\n addRequestListener(listener: RequestListener): () => void,\n sendRequest(path: string, requestOptions: RequestInit, requestType?: \"client\" | \"server\" | \"admin\"): Promise<Response>,\n getRedirectMethod(): RedirectMethod,\n redirectToUrl(url: string | URL, options?: { replace?: boolean }): Promise<void>,\n redirectToHandler(handlerName: keyof HandlerUrls, options?: RedirectToOptions): Promise<void>,\n signInWithTokens(tokens: { accessToken: string, refreshToken: string }): Promise<void>,\n },\n }\n & AsyncStoreProperty<\"project\", [], Project, false>\n & AsyncStoreProperty<\n \"item\",\n [{ itemId: string, userId: string } | { itemId: string, teamId: string } | { itemId: string, customCustomerId: string }],\n Item,\n false\n >\n & AsyncStoreProperty<\n \"products\",\n [options: CustomerProductsRequestOptions],\n CustomerProductsList,\n true\n >\n & AsyncStoreProperty<\n \"invoices\",\n [options: CustomerInvoicesRequestOptions],\n CustomerInvoicesList,\n true\n >\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void> }\n & AuthLike<HasTokenStore extends false ? { tokenStore: TokenStoreInit } : { tokenStore?: TokenStoreInit }>\n);\n/** @deprecated Use `HexclaveClientAppConstructor` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>,\n new(options: StackClientAppConstructorOptions<boolean, string>): StackClientApp<boolean, string>,\n\n [hexclaveAppInternalsSymbol]: {\n fromClientJson<HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId>,\n },\n};\nexport type HexclaveClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId>;\nexport type HexclaveClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppJson<HasTokenStore, ProjectId>;\nexport type HexclaveClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = StackClientApp<HasTokenStore, ProjectId>;\nexport type HexclaveClientAppConstructor = StackClientAppConstructor;\nexport const HexclaveClientApp: HexclaveClientAppConstructor = _HexclaveClientAppImpl;\n/** @deprecated Use `HexclaveClientApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport const StackClientApp: StackClientAppConstructor = HexclaveClientApp;\n"],"mappings":";;;;;AAkLA,MAAa,oBAAkDA;;AAE/D,MAAa,iBAA4C"}
1
+ {"version":3,"file":"client-app.js","names":["_HexclaveClientAppImpl"],"sources":["../../../../../src/lib/hexclave-app/apps/interfaces/client-app.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 { KnownErrors } from \"@hexclave/shared\";\nimport { CurrentUserCrud } from \"@hexclave/shared/dist/interface/crud/current-user\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { AsyncStoreProperty, AuthLike, GetCurrentPartialUserOptions, GetCurrentUserOptions, HandlerUrlOptions, HandlerUrls, OAuthScopesOnSignIn, RedirectMethod, RedirectToOptions, ResolvedHandlerUrls, hexclaveAppInternalsSymbol, TokenStoreInit } from \"../../common\";\nimport type { RequestListener } from \"@hexclave/shared/dist/interface/client-interface\";\nimport { CustomerInvoicesList, CustomerInvoicesRequestOptions, CustomerProductsList, CustomerProductsRequestOptions, Item } from \"../../customers\";\nimport { Project } from \"../../projects\";\nimport { ProjectCurrentUser, SyncedPartialUser, TokenPartialUser } from \"../../users\";\nimport { _HexclaveClientAppImpl } from \"../implementations\";\nimport { AnalyticsOptions } from \"../implementations/session-replay\";\n\n/** @deprecated Use `HexclaveClientAppConstructorOptions` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = {\n baseUrl?: string | { browser: string, server: string },\n extraRequestHeaders?: Record<string, string>,\n projectId?: ProjectId,\n publishableClientKey?: string,\n urls?: HandlerUrlOptions,\n oauthScopesOnSignIn?: Partial<OAuthScopesOnSignIn>,\n tokenStore?: TokenStoreInit<HasTokenStore>,\n redirectMethod?: RedirectMethod,\n inheritsFrom?: StackClientApp<any, any>,\n\n /**\n * Whether to show the Hexclave dev tool indicator in browser-like environments.\n *\n * - `true`: always show\n * - `false`: never show\n * - `\"auto\"` (default): show based on NODE_ENV or origin heuristics\n */\n devTool?: boolean | \"auto\",\n\n /**\n * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first\n * constructed. This improves the performance of your app, but will create network requests that are unnecessary if\n * the app is never used or disposed of immediately. To disable this behavior, set this option to true.\n */\n noAutomaticPrefetch?: boolean,\n\n /**\n * Options for analytics and session recording. Replays are enabled by default;\n * set `{ replays: { enabled: false } }` to opt out.\n */\n analytics?: AnalyticsOptions,\n} & (\n { tokenStore: TokenStoreInit<HasTokenStore> } | { tokenStore?: undefined, inheritsFrom: StackClientApp<HasTokenStore, any> }\n) & (\n string extends ProjectId ? unknown : ({ projectId: ProjectId } | { inheritsFrom: StackClientApp<any, ProjectId> })\n);\n\n\n/** @deprecated Use `HexclaveClientAppJson` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId> & { inheritsFrom?: undefined } & {\n uniqueIdentifier: string,\n // note: if you add more fields here, make sure to ensure the checkString in the constructor has/doesn't have them\n};\n\n/** @deprecated Use `HexclaveClientApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = (\n & {\n readonly projectId: ProjectId,\n\n /**\n * The version of the Hexclave SDK.\n */\n readonly version: string,\n\n /**\n * @deprecated Do not use `app.urls` for navigation. It is static and does not include runtime redirect-back,\n * cross-domain auth, or sign-out state. Use the matching `redirectToXyz()` method instead, for example\n * `redirectToSignIn()`, `redirectToSignUp()`, `redirectToSignOut()`, or `redirectToAccountSettings()`.\n */\n readonly urls: Readonly<ResolvedHandlerUrls>,\n\n signInWithOAuth(provider: string, options?: { returnTo?: string }): Promise<void>,\n signInWithCredential(options: { email: string, password: string, noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"EmailPasswordMismatch\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signUpWithCredential(options: {\n email: string,\n password: string,\n noRedirect?: boolean,\n } & ({ noVerificationCallback: true } | { noVerificationCallback?: false, verificationCallbackUrl?: string })): Promise<Result<undefined, KnownErrors[\"UserWithEmailAlreadyExists\"] | KnownErrors[\"PasswordRequirementsNotMet\"] | KnownErrors[\"BotChallengeFailed\"]>>,\n signInWithPasskey(): Promise<Result<undefined, KnownErrors[\"PasskeyAuthenticationFailed\"] | KnownErrors[\"InvalidTotpCode\"] | KnownErrors[\"PasskeyWebAuthnError\"]>>,\n callOAuthCallback(): Promise<boolean>,\n promptCliLogin(options: { appUrl: string, expiresInMillis?: number, anonRefreshToken?: string, promptLink?: (url: string, loginCode: string) => void }): Promise<Result<string, KnownErrors[\"CliAuthError\"] | KnownErrors[\"CliAuthExpiredError\"] | KnownErrors[\"CliAuthUsedError\"]>>,\n sendForgotPasswordEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<undefined, KnownErrors[\"UserNotFound\"]>>,\n sendMagicLinkEmail(email: string, options?: { callbackUrl?: string }): Promise<Result<{ nonce: string }, KnownErrors[\"RedirectUrlNotWhitelisted\"] | KnownErrors[\"BotChallengeFailed\"]>>,\n resetPassword(options: { code: string, password: string }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyPasswordResetCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n verifyTeamInvitationCode(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n acceptTeamInvitation(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n getTeamInvitationDetails(code: string): Promise<Result<{ teamDisplayName: string }, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"TeamInvitationEmailMismatch\"]>>,\n verifyEmail(code: string): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"]>>,\n signInWithMagicLink(code: string, options?: { noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n signInWithMfa(otp: string, code: string, options?: { noRedirect?: boolean }): Promise<Result<undefined, KnownErrors[\"VerificationCodeError\"] | KnownErrors[\"InvalidTotpCode\"]>>,\n\n redirectToOAuthCallback(): Promise<void>,\n\n getConvexClientAuth(options: HasTokenStore extends false ? { tokenStore: TokenStoreInit } : { tokenStore?: TokenStoreInit }): (args: { forceRefreshToken: boolean }) => Promise<string | null>,\n getConvexHttpClientAuth(options: { tokenStore: TokenStoreInit }): Promise<string>,\n\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentUser<ProjectId>,\n useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentUser<ProjectId>,\n useUser(options?: GetCurrentUserOptions<HasTokenStore>): ProjectCurrentUser<ProjectId> | null,\n\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'redirect' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'throw' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'anonymous' }): Promise<ProjectCurrentUser<ProjectId>>,\n getUser(options?: GetCurrentUserOptions<HasTokenStore>): Promise<ProjectCurrentUser<ProjectId> | null>,\n\n cancelSubscription(options: { productId: string, subscriptionId?: string } | { productId: string, subscriptionId?: string, teamId: string }): Promise<void>,\n\n // note: we don't special-case 'anonymous' here to return non-null, see GetPartialUserOptions for more details\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'token' }): Promise<TokenPartialUser | null>,\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'convex' }): Promise<TokenPartialUser | null>,\n getPartialUser(options: GetCurrentPartialUserOptions<HasTokenStore>): Promise<SyncedPartialUser | TokenPartialUser | null>,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'token' }): TokenPartialUser | null,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore> & { from: 'convex' }): TokenPartialUser | null,\n usePartialUser(options: GetCurrentPartialUserOptions<HasTokenStore>): SyncedPartialUser | TokenPartialUser | null,\n useNavigate(): (to: string) => void, // THIS_LINE_PLATFORM react-like\n\n [hexclaveAppInternalsSymbol]: {\n toClientJson(): StackClientAppJson<HasTokenStore, ProjectId>,\n setCurrentUser(userJsonPromise: Promise<CurrentUserCrud['Client']['Read'] | null>): void,\n getConstructorOptions(): StackClientAppConstructorOptions<HasTokenStore, ProjectId> & { inheritsFrom?: undefined },\n sendSessionReplayBatch(body: string, options: { keepalive: boolean }): Promise<Result<Response, Error>>,\n sendAnalyticsEventBatch(body: string, options: { keepalive: boolean }): Promise<Result<Response, Error>>,\n addRequestListener(listener: RequestListener): () => void,\n sendRequest(path: string, requestOptions: RequestInit, requestType?: \"client\" | \"server\" | \"admin\"): Promise<Response>,\n getRedirectMethod(): RedirectMethod,\n redirectToUrl(url: string | URL, options?: { replace?: boolean }): Promise<void>,\n redirectToHandler(handlerName: keyof HandlerUrls, options?: RedirectToOptions): Promise<void>,\n signInWithTokens(tokens: { accessToken: string, refreshToken: string }): Promise<void>,\n },\n }\n & AsyncStoreProperty<\"project\", [], Project, false>\n & AsyncStoreProperty<\n \"item\",\n [{ itemId: string, userId: string } | { itemId: string, teamId: string } | { itemId: string, customCustomerId: string }],\n Item,\n false\n >\n & AsyncStoreProperty<\n \"products\",\n [options: CustomerProductsRequestOptions],\n CustomerProductsList,\n true\n >\n & AsyncStoreProperty<\n \"invoices\",\n [options: CustomerInvoicesRequestOptions],\n CustomerInvoicesList,\n true\n >\n & { [K in `redirectTo${Capitalize<keyof Omit<HandlerUrls, 'handler' | 'oauthCallback'>>}`]: (options?: RedirectToOptions) => Promise<void> }\n & AuthLike<HasTokenStore extends false ? { tokenStore: TokenStoreInit } : { tokenStore?: TokenStoreInit }>\n);\n/** @deprecated Use `HexclaveClientAppConstructor` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport type StackClientAppConstructor = {\n new <\n TokenStoreType extends string,\n HasTokenStore extends (TokenStoreType extends {} ? true : boolean),\n ProjectId extends string\n >(options: StackClientAppConstructorOptions<HasTokenStore, ProjectId>): StackClientApp<HasTokenStore, ProjectId>,\n new(options: StackClientAppConstructorOptions<boolean, string>): StackClientApp<boolean, string>,\n\n [hexclaveAppInternalsSymbol]: {\n fromClientJson<HasTokenStore extends boolean, ProjectId extends string>(\n json: StackClientAppJson<HasTokenStore, ProjectId>\n ): StackClientApp<HasTokenStore, ProjectId>,\n },\n};\nexport type HexclaveClientAppConstructorOptions<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppConstructorOptions<HasTokenStore, ProjectId>;\nexport type HexclaveClientAppJson<HasTokenStore extends boolean, ProjectId extends string> = StackClientAppJson<HasTokenStore, ProjectId>;\nexport type HexclaveClientApp<HasTokenStore extends boolean = boolean, ProjectId extends string = string> = StackClientApp<HasTokenStore, ProjectId>;\nexport type HexclaveClientAppConstructor = StackClientAppConstructor;\nexport const HexclaveClientApp: HexclaveClientAppConstructor = _HexclaveClientAppImpl;\n/** @deprecated Use `HexclaveClientApp` from the `@hexclave/*` package instead — same symbol, new brand name. See https://docs.hexclave.com/migration. */\nexport const StackClientApp: StackClientAppConstructor = HexclaveClientApp;\n"],"mappings":";;;;;AAoLA,MAAa,oBAAkDA;;AAE/D,MAAa,iBAA4C"}
@@ -77,7 +77,7 @@ let __url_targets_js = require("./url-targets.js");
77
77
  })).toThrowError(/cannot be a custom page/);
78
78
  });
79
79
  (0, vitest.it)("uses hosted defaults for unspecified URLs", () => {
80
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
80
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
81
81
  const urls = (0, __url_targets_js.resolveHandlerUrls)({
82
82
  projectId: "project-id",
83
83
  urls: {
@@ -90,7 +90,7 @@ let __url_targets_js = require("./url-targets.js");
90
90
  (0, vitest.expect)(urls.cliAuthConfirm).toBe("https://project-id.example-stack-hosted.test/handler/cli-auth-confirm");
91
91
  });
92
92
  (0, vitest.it)("keeps redirect-only post-auth targets local even when the default target is hosted", () => {
93
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
93
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
94
94
  const urls = (0, __url_targets_js.resolveHandlerUrls)({
95
95
  projectId: "project-id",
96
96
  urls: { default: { type: "hosted" } }
@@ -127,7 +127,7 @@ let __url_targets_js = require("./url-targets.js");
127
127
  `);
128
128
  });
129
129
  (0, vitest.it)("inherits a hosted default target for the OAuth callback", () => {
130
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
130
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
131
131
  const urls = (0, __url_targets_js.resolveHandlerUrls)({
132
132
  projectId: "project-id",
133
133
  urls: { default: { type: "hosted" } }
@@ -155,7 +155,7 @@ let __url_targets_js = require("./url-targets.js");
155
155
  })).toBe("https://app.example.test/cli/authorize?login_code=login-code");
156
156
  });
157
157
  (0, vitest.it)("uses default target for unknown /handler/* pages", () => {
158
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
158
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
159
159
  (0, vitest.expect)((0, __url_targets_js.resolveUnknownHandlerPathFallbackUrl)({
160
160
  defaultTarget: { type: "hosted" },
161
161
  projectId: "project-id",
@@ -163,7 +163,7 @@ let __url_targets_js = require("./url-targets.js");
163
163
  })).toBe("https://project-id.example-stack-hosted.test/handler/custom-page");
164
164
  });
165
165
  (0, vitest.it)("uses the full hosted handler URL template when configured", () => {
166
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}");
166
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}");
167
167
  vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX", "93");
168
168
  const urls = (0, __url_targets_js.resolveHandlerUrls)({
169
169
  projectId: "project-id",
@@ -173,14 +173,14 @@ let __url_targets_js = require("./url-targets.js");
173
173
  (0, vitest.expect)(urls.accountSettings).toBe("http://project-id.localhost:9309/handler/account-settings");
174
174
  });
175
175
  (0, vitest.it)("validates the hosted handler URL template placeholders", () => {
176
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/handler");
176
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/handler");
177
177
  (0, vitest.expect)(() => (0, __url_targets_js.resolveHandlerUrls)({
178
178
  projectId: "project-id",
179
179
  urls: { default: { type: "hosted" } }
180
180
  })).toThrowError(/\{projectId\} and \{hostedPath\}/);
181
181
  });
182
182
  (0, vitest.it)("rejects hosted handler URL templates that put the project ID in the path", () => {
183
- vitest.vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/{hostedPath}");
183
+ vitest.vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/{hostedPath}");
184
184
  (0, vitest.expect)(() => (0, __url_targets_js.resolveHandlerUrls)({
185
185
  projectId: "project-id",
186
186
  urls: { default: { type: "hosted" } }
@@ -1 +1 @@
1
- {"version":3,"file":"url-targets.test.js","names":[],"sources":["../../../src/lib/hexclave-app/url-targets.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 { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { buildCliAuthConfirmUrl, getPagePrompt, isLocalHandlerUrlTarget, resolveHandlerUrls, resolveUnknownHandlerPathFallbackUrl } from \"./url-targets\";\n\ndescribe(\"handler URL targets\", () => {\n afterEach(() => {\n vi.unstubAllEnvs();\n });\n\n it(\"treats handler-component targets the same as omitted values\", () => {\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: \"/custom-handler\",\n signIn: { type: \"handler-component\" },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-handler/sign-in\");\n });\n\n it(\"treats custom v0 page targets like legacy string targets\", () => {\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: \"/custom-handler\",\n signIn: { type: \"handler-component\" },\n signUp: { type: \"custom\", url: \"/sign-up-explicit\", version: 0 },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-handler/sign-in\");\n expect(urls.signUp).toBe(\"/sign-up-explicit\");\n });\n\n it(\"throws on v0 custom target for handler page\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: { type: \"custom\", url: \"/custom-handler\", version: 0 },\n },\n })).toThrowError(/cannot be a custom page/);\n });\n\n it(\"supports the latest documented custom target version\", () => {\n const signInPrompt = getPagePrompt(\"signIn\");\n if (signInPrompt == null) {\n throw new Error(\"Expected signIn prompt metadata to exist\");\n }\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signIn: { type: \"custom\", url: \"/custom-sign-in\", version: signInPrompt.latestVersion },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-sign-in\");\n });\n\n it(\"throws on custom target versions newer than the latest supported version\", () => {\n const signInPrompt = getPagePrompt(\"signIn\");\n if (signInPrompt == null) {\n throw new Error(\"Expected signIn prompt metadata to exist\");\n }\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signIn: { type: \"custom\", url: \"/custom-sign-in\", version: signInPrompt.latestVersion + 1 },\n },\n })).toThrowError(/Unsupported custom page version/);\n });\n\n it(\"throws on non-zero custom version for handler page\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: { type: \"custom\", url: \"/custom-handler\", version: 1 },\n },\n })).toThrowError(/cannot be a custom page/);\n });\n\n it(\"uses hosted defaults for unspecified URLs\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signUp: \"/sign-up\",\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signUp).toBe(\"/sign-up\");\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.cliAuthConfirm).toBe(\"https://project-id.example-stack-hosted.test/handler/cli-auth-confirm\");\n });\n\n it(\"keeps redirect-only post-auth targets local even when the default target is hosted\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.signOut).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-out\");\n expect(urls.home).toBe(\"/\");\n expect(urls.afterSignIn).toBe(\"/\");\n expect(urls.afterSignUp).toBe(\"/\");\n expect(urls.afterSignOut).toBe(\"/\");\n });\n\n it(\"rejects absolute OAuth callback string targets\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n oauthCallback: \"https://app.example.test/oauth-callback\",\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: OAuth callback URLs must be relative.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n\n it(\"rejects absolute OAuth callback custom targets\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n oauthCallback: { type: \"custom\", url: \"https://app.example.test/oauth-callback\", version: 0 },\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: OAuth callback URLs must be relative.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n\n it(\"inherits a hosted default target for the OAuth callback\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.oauthCallback).toBe(\"https://project-id.example-stack-hosted.test/handler/oauth-callback\");\n });\n\n it(\"supports custom CLI auth confirmation targets\", () => {\n const cliAuthConfirmPrompt = getPagePrompt(\"cliAuthConfirm\");\n if (cliAuthConfirmPrompt == null) {\n throw new Error(\"Expected cliAuthConfirm prompt metadata to exist\");\n }\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n cliAuthConfirm: { type: \"custom\", url: \"/cli/authorize\", version: cliAuthConfirmPrompt.latestVersion },\n },\n });\n\n expect(urls.cliAuthConfirm).toBe(\"/cli/authorize\");\n });\n\n it(\"builds CLI auth login URLs from the resolved confirmation target\", () => {\n expect(buildCliAuthConfirmUrl({\n cliAuthConfirmUrl: \"/cli/authorize\",\n appUrl: \"https://app.example.test/base\",\n loginCode: \"login-code\",\n })).toBe(\"https://app.example.test/cli/authorize?login_code=login-code\");\n });\n\n it(\"uses default target for unknown /handler/* pages\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const url = resolveUnknownHandlerPathFallbackUrl({\n defaultTarget: { type: \"hosted\" },\n projectId: \"project-id\",\n unknownPath: \"custom-page\",\n });\n\n expect(url).toBe(\"https://project-id.example-stack-hosted.test/handler/custom-page\");\n });\n\n it(\"uses the full hosted handler URL template when configured\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE\", \"http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}\");\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX\", \"93\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"http://project-id.localhost:9309/handler/sign-in\");\n expect(urls.accountSettings).toBe(\"http://project-id.localhost:9309/handler/account-settings\");\n });\n\n it(\"validates the hosted handler URL template placeholders\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE\", \"http://localhost:9309/{projectId}/handler\");\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n })).toThrowError(/\\{projectId\\} and \\{hostedPath\\}/);\n });\n\n it(\"rejects hosted handler URL templates that put the project ID in the path\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE\", \"http://localhost:9309/{projectId}/{hostedPath}\");\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: The hosted handler URL template must put {projectId} in the hostname.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n});\n\ndescribe(\"isLocalHandlerUrlTarget\", () => {\n it(\"treats relative handler URLs as local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(true);\n });\n\n it(\"treats same-origin absolute handler URLs as local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"http://p91.localhost:9101/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(true);\n });\n\n it(\"treats cross-origin absolute handler URLs as non-local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"https://project-id.built-with-hexclave.com/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(false);\n });\n\n it(\"treats non-handler paths as non-local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"/projects\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(false);\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"url-targets.test.js","names":[],"sources":["../../../src/lib/hexclave-app/url-targets.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 { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { buildCliAuthConfirmUrl, getPagePrompt, isLocalHandlerUrlTarget, resolveHandlerUrls, resolveUnknownHandlerPathFallbackUrl } from \"./url-targets\";\n\ndescribe(\"handler URL targets\", () => {\n afterEach(() => {\n vi.unstubAllEnvs();\n });\n\n it(\"treats handler-component targets the same as omitted values\", () => {\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: \"/custom-handler\",\n signIn: { type: \"handler-component\" },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-handler/sign-in\");\n });\n\n it(\"treats custom v0 page targets like legacy string targets\", () => {\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: \"/custom-handler\",\n signIn: { type: \"handler-component\" },\n signUp: { type: \"custom\", url: \"/sign-up-explicit\", version: 0 },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-handler/sign-in\");\n expect(urls.signUp).toBe(\"/sign-up-explicit\");\n });\n\n it(\"throws on v0 custom target for handler page\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: { type: \"custom\", url: \"/custom-handler\", version: 0 },\n },\n })).toThrowError(/cannot be a custom page/);\n });\n\n it(\"supports the latest documented custom target version\", () => {\n const signInPrompt = getPagePrompt(\"signIn\");\n if (signInPrompt == null) {\n throw new Error(\"Expected signIn prompt metadata to exist\");\n }\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signIn: { type: \"custom\", url: \"/custom-sign-in\", version: signInPrompt.latestVersion },\n },\n });\n\n expect(urls.signIn).toBe(\"/custom-sign-in\");\n });\n\n it(\"throws on custom target versions newer than the latest supported version\", () => {\n const signInPrompt = getPagePrompt(\"signIn\");\n if (signInPrompt == null) {\n throw new Error(\"Expected signIn prompt metadata to exist\");\n }\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signIn: { type: \"custom\", url: \"/custom-sign-in\", version: signInPrompt.latestVersion + 1 },\n },\n })).toThrowError(/Unsupported custom page version/);\n });\n\n it(\"throws on non-zero custom version for handler page\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n handler: { type: \"custom\", url: \"/custom-handler\", version: 1 },\n },\n })).toThrowError(/cannot be a custom page/);\n });\n\n it(\"uses hosted defaults for unspecified URLs\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n signUp: \"/sign-up\",\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signUp).toBe(\"/sign-up\");\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.cliAuthConfirm).toBe(\"https://project-id.example-stack-hosted.test/handler/cli-auth-confirm\");\n });\n\n it(\"keeps redirect-only post-auth targets local even when the default target is hosted\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.signOut).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-out\");\n expect(urls.home).toBe(\"/\");\n expect(urls.afterSignIn).toBe(\"/\");\n expect(urls.afterSignUp).toBe(\"/\");\n expect(urls.afterSignOut).toBe(\"/\");\n });\n\n it(\"rejects absolute OAuth callback string targets\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n oauthCallback: \"https://app.example.test/oauth-callback\",\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: OAuth callback URLs must be relative.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n\n it(\"rejects absolute OAuth callback custom targets\", () => {\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n oauthCallback: { type: \"custom\", url: \"https://app.example.test/oauth-callback\", version: 0 },\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: OAuth callback URLs must be relative.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n\n it(\"inherits a hosted default target for the OAuth callback\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"https://project-id.example-stack-hosted.test/handler/sign-in\");\n expect(urls.oauthCallback).toBe(\"https://project-id.example-stack-hosted.test/handler/oauth-callback\");\n });\n\n it(\"supports custom CLI auth confirmation targets\", () => {\n const cliAuthConfirmPrompt = getPagePrompt(\"cliAuthConfirm\");\n if (cliAuthConfirmPrompt == null) {\n throw new Error(\"Expected cliAuthConfirm prompt metadata to exist\");\n }\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n cliAuthConfirm: { type: \"custom\", url: \"/cli/authorize\", version: cliAuthConfirmPrompt.latestVersion },\n },\n });\n\n expect(urls.cliAuthConfirm).toBe(\"/cli/authorize\");\n });\n\n it(\"builds CLI auth login URLs from the resolved confirmation target\", () => {\n expect(buildCliAuthConfirmUrl({\n cliAuthConfirmUrl: \"/cli/authorize\",\n appUrl: \"https://app.example.test/base\",\n loginCode: \"login-code\",\n })).toBe(\"https://app.example.test/cli/authorize?login_code=login-code\");\n });\n\n it(\"uses default target for unknown /handler/* pages\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX\", \".example-stack-hosted.test\");\n\n const url = resolveUnknownHandlerPathFallbackUrl({\n defaultTarget: { type: \"hosted\" },\n projectId: \"project-id\",\n unknownPath: \"custom-page\",\n });\n\n expect(url).toBe(\"https://project-id.example-stack-hosted.test/handler/custom-page\");\n });\n\n it(\"uses the full hosted handler URL template when configured\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE\", \"http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}\");\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX\", \"93\");\n\n const urls = resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n });\n\n expect(urls.signIn).toBe(\"http://project-id.localhost:9309/handler/sign-in\");\n expect(urls.accountSettings).toBe(\"http://project-id.localhost:9309/handler/account-settings\");\n });\n\n it(\"validates the hosted handler URL template placeholders\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE\", \"http://localhost:9309/{projectId}/handler\");\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n })).toThrowError(/\\{projectId\\} and \\{hostedPath\\}/);\n });\n\n it(\"rejects hosted handler URL templates that put the project ID in the path\", () => {\n vi.stubEnv(\"NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE\", \"http://localhost:9309/{projectId}/{hostedPath}\");\n\n expect(() => resolveHandlerUrls({\n projectId: \"project-id\",\n urls: {\n default: { type: \"hosted\" },\n },\n })).toThrowErrorMatchingInlineSnapshot(`\n [HexclaveAssertionError: The hosted handler URL template must put {projectId} in the hostname.\n\n This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]\n `);\n });\n});\n\ndescribe(\"isLocalHandlerUrlTarget\", () => {\n it(\"treats relative handler URLs as local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(true);\n });\n\n it(\"treats same-origin absolute handler URLs as local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"http://p91.localhost:9101/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(true);\n });\n\n it(\"treats cross-origin absolute handler URLs as non-local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"https://project-id.built-with-hexclave.com/handler/sign-in\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(false);\n });\n\n it(\"treats non-handler paths as non-local targets\", () => {\n expect(isLocalHandlerUrlTarget({\n targetUrl: \"/projects\",\n handlerPath: \"/handler\",\n currentOrigin: \"http://p91.localhost:9101\",\n })).toBe(false);\n });\n});\n"],"mappings":"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"}
@@ -2,13 +2,13 @@
2
2
 
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
  const require_chunk = require('../chunk-BE-pF4vm.js');
5
+ let _hexclave_shared_dist_utils_strings = require("@hexclave/shared/dist/utils/strings");
5
6
  let _hexclave_ui = require("@hexclave/ui");
6
7
  let react = require("react");
7
8
  react = require_chunk.__toESM(react);
8
9
  let react_jsx_runtime = require("react/jsx-runtime");
9
10
  let color = require("color");
10
11
  color = require_chunk.__toESM(color);
11
- let _hexclave_shared_dist_utils_strings = require("@hexclave/shared/dist/utils/strings");
12
12
  let ___generated_global_css_js = require("../generated/global-css.js");
13
13
  let ___utils_browser_script_js = require("../utils/browser-script.js");
14
14
  let ___utils_constants_js = require("../utils/constants.js");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "//": "THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template (FOR package.json FILES, PLEASE EDIT package-template.json)",
3
3
  "name": "@hexclave/tanstack-start",
4
- "version": "1.0.22",
4
+ "version": "1.0.24",
5
5
  "repository": "https://github.com/hexclave/hexclave",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
@@ -86,8 +86,8 @@
86
86
  "rrweb": "^1.1.3",
87
87
  "tsx": "^4.21.0",
88
88
  "yup": "^1.7.1",
89
- "@hexclave/shared": "1.0.22",
90
- "@hexclave/ui": "1.0.22"
89
+ "@hexclave/shared": "1.0.24",
90
+ "@hexclave/ui": "1.0.24"
91
91
  },
92
92
  "peerDependencies": {
93
93
  "@types/react": ">=18.0.0",
@@ -8,6 +8,7 @@ import { captureError } from "@hexclave/shared/dist/utils/errors";
8
8
  import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
9
9
  import { isLocalhost } from "@hexclave/shared/dist/utils/urls";
10
10
  import { canMountIntoDom } from "../in-page-ui/dom";
11
+ import { envVars } from "../generated/env";
11
12
  import type { createDevTool as CreateDevToolFn } from "./dev-tool-core";
12
13
 
13
14
  // Hexclave rebrand: UI-only local pref — straight rename (one-time reset is harmless)
@@ -22,10 +23,28 @@ function getOverride(): boolean | null {
22
23
  return null;
23
24
  }
24
25
 
26
+ let activeDevToolOption: true | "auto" | undefined = undefined;
27
+
25
28
  function shouldShow(): boolean {
26
29
  const override = getOverride();
27
30
  if (override !== null) return override;
28
31
  if (!canMountIntoDom()) return false;
32
+
33
+ // If devTool was explicitly set to true, always show
34
+ if (activeDevToolOption === true) return true;
35
+
36
+ // "auto" behavior (the default):
37
+ const nodeEnv = envVars.NODE_ENV;
38
+ if (nodeEnv !== undefined) {
39
+ // NODE_ENV is available (bundler/process env exists) — only show in development
40
+ return nodeEnv === "development";
41
+ }
42
+
43
+ // NODE_ENV not found (no process.env/import.meta) — show on localhost or file: protocol
44
+ try {
45
+ const url = new URL(window.location.href);
46
+ if (url.protocol === "file:") return true;
47
+ } catch {}
29
48
  return isLocalhost(window.location.href);
30
49
  }
31
50
 
@@ -71,17 +90,19 @@ function tryMount() {
71
90
  /**
72
91
  * Mounts the Hexclave dev tool on the page.
73
92
  *
74
- * - Only renders on localhost (or when overridden via console)
75
- * - Lazily loads the dev tool UI via dynamic import
76
- * - Returns a cleanup function to unmount
93
+ * Visibility is determined by the `devTool` option:
94
+ * - `true`: always show
95
+ * - `false`: never show (caller gates this — mountDevTool won't be called)
96
+ * - `"auto"` / `undefined`: show based on NODE_ENV or localhost/file: heuristics
77
97
  *
78
98
  * Console commands (also work in production):
79
99
  * HexclaveDevTool.enable() — force-show the dev tool
80
100
  * HexclaveDevTool.disable() — force-hide the dev tool
81
- * HexclaveDevTool.reset() — revert to default (localhost-only)
101
+ * HexclaveDevTool.reset() — revert to auto behavior
82
102
  */
83
- export function mountDevTool(app: StackClientApp<true>): () => void {
103
+ export function mountDevTool(app: StackClientApp<true>, devToolOption?: boolean | "auto"): () => void {
84
104
  activeApp = app;
105
+ activeDevToolOption = devToolOption === false ? undefined : devToolOption ?? undefined;
85
106
  tryMount();
86
107
 
87
108
  // Capture the cleanup created by THIS specific mount call so that React
@@ -129,7 +150,7 @@ if (typeof window !== 'undefined') {
129
150
  activeCleanup();
130
151
  activeCleanup = null;
131
152
  }
132
- console.log('[Stack DevTool] Reset to default (visible on localhost only).');
153
+ console.log('[Stack DevTool] Reset to default (auto-detect based on NODE_ENV or localhost/file: origin).');
133
154
  },
134
155
  };
135
156
  }
package/src/lib/auth.ts CHANGED
@@ -138,13 +138,13 @@ function consumeOAuthCallbackQueryParams(options?: {
138
138
  // If the state can't be found in the cookies, then the callback wasn't meant for us.
139
139
  // Maybe the website uses another OAuth library?
140
140
  console.warn(deindent`
141
- Stack found an outer OAuth callback state in the query parameters, but not in cookies.
141
+ Hexclave found an outer OAuth callback state in the query parameters, but not in cookies.
142
142
 
143
143
  This could have multiple reasons:
144
144
  - The cookie expired, because the OAuth flow took too long.
145
145
  - The user's browser deleted the cookie, either manually or because of a very strict cookie policy.
146
146
  - The cookie was already consumed by this page, and the user already logged in.
147
- - You are using another OAuth client library with the same callback URL as Stack.
147
+ - You are using another OAuth client library with the same callback URL as Hexclave.
148
148
  - The user opened the OAuth callback page from their history.
149
149
 
150
150
  Either way, it is probably safe to ignore this warning unless you are debugging an OAuth issue.
@@ -735,7 +735,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
735
735
  }
736
736
 
737
737
  if (isBrowserLike() && resolvedOptions.devTool !== false) {
738
- mountDevTool(this as any);
738
+ mountDevTool(this as any, resolvedOptions.devTool);
739
739
  }
740
740
  if (isBrowserLike()) {
741
741
  // Independent of the dev tool: the clickmap overlay only ever renders
@@ -26,11 +26,13 @@ export type StackClientAppConstructorOptions<HasTokenStore extends boolean, Proj
26
26
  inheritsFrom?: StackClientApp<any, any>,
27
27
 
28
28
  /**
29
- * Whether to show the Hexclave dev tool indicator in browser-like development environments.
29
+ * Whether to show the Hexclave dev tool indicator in browser-like environments.
30
30
  *
31
- * Defaults to true.
31
+ * - `true`: always show
32
+ * - `false`: never show
33
+ * - `"auto"` (default): show based on NODE_ENV or origin heuristics
32
34
  */
33
- devTool?: boolean,
35
+ devTool?: boolean | "auto",
34
36
 
35
37
  /**
36
38
  * By default, the Stack app will automatically prefetch some data from Stack's server when this app is first
@@ -85,7 +85,7 @@ describe("handler URL targets", () => {
85
85
  });
86
86
 
87
87
  it("uses hosted defaults for unspecified URLs", () => {
88
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
88
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
89
89
 
90
90
  const urls = resolveHandlerUrls({
91
91
  projectId: "project-id",
@@ -101,7 +101,7 @@ describe("handler URL targets", () => {
101
101
  });
102
102
 
103
103
  it("keeps redirect-only post-auth targets local even when the default target is hosted", () => {
104
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
104
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
105
105
 
106
106
  const urls = resolveHandlerUrls({
107
107
  projectId: "project-id",
@@ -145,7 +145,7 @@ describe("handler URL targets", () => {
145
145
  });
146
146
 
147
147
  it("inherits a hosted default target for the OAuth callback", () => {
148
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
148
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
149
149
 
150
150
  const urls = resolveHandlerUrls({
151
151
  projectId: "project-id",
@@ -183,7 +183,7 @@ describe("handler URL targets", () => {
183
183
  });
184
184
 
185
185
  it("uses default target for unknown /handler/* pages", () => {
186
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
186
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
187
187
 
188
188
  const url = resolveUnknownHandlerPathFallbackUrl({
189
189
  defaultTarget: { type: "hosted" },
@@ -195,7 +195,7 @@ describe("handler URL targets", () => {
195
195
  });
196
196
 
197
197
  it("uses the full hosted handler URL template when configured", () => {
198
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}");
198
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}");
199
199
  vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX", "93");
200
200
 
201
201
  const urls = resolveHandlerUrls({
@@ -210,7 +210,7 @@ describe("handler URL targets", () => {
210
210
  });
211
211
 
212
212
  it("validates the hosted handler URL template placeholders", () => {
213
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/handler");
213
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/handler");
214
214
 
215
215
  expect(() => resolveHandlerUrls({
216
216
  projectId: "project-id",
@@ -221,7 +221,7 @@ describe("handler URL targets", () => {
221
221
  });
222
222
 
223
223
  it("rejects hosted handler URL templates that put the project ID in the path", () => {
224
- vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/{hostedPath}");
224
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/{hostedPath}");
225
225
 
226
226
  expect(() => resolveHandlerUrls({
227
227
  projectId: "project-id",