@hexclave/next 1.0.56 → 1.0.58

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 (144) hide show
  1. package/dist/{admin-app-impl-0kL2lNog.d.ts → admin-app-impl-DdtuTIuJ.d.ts} +8 -8
  2. package/dist/{admin-app-impl-0kL2lNog.d.ts.map → admin-app-impl-DdtuTIuJ.d.ts.map} +1 -1
  3. package/dist/clickmap/clickmap-core.d.ts +1 -1
  4. package/dist/clickmap/index.d.ts +1 -1
  5. package/dist/{client-app-B0kBC67Z.d.ts → client-app-oSumAWx3.d.ts} +2 -1
  6. package/dist/{client-app-B0kBC67Z.d.ts.map → client-app-oSumAWx3.d.ts.map} +1 -1
  7. package/dist/components/api-key-dialogs.d.ts +1 -1
  8. package/dist/components/api-key-dialogs.js +4 -4
  9. package/dist/components/credential-sign-in.js +3 -3
  10. package/dist/components/credential-sign-up.js +5 -5
  11. package/dist/components/elements/sidebar-layout.js +2 -2
  12. package/dist/components/elements/user-avatar.js +1 -1
  13. package/dist/components/magic-link-sign-in.js +5 -5
  14. package/dist/components/message-cards/predefined-message-card.js +1 -1
  15. package/dist/components/passkey-button.js +1 -1
  16. package/dist/components/profile-image-editor.js +1 -1
  17. package/dist/components/selected-team-switcher.d.ts +1 -1
  18. package/dist/components/team-icon.d.ts +1 -1
  19. package/dist/components/team-icon.js +1 -1
  20. package/dist/components/team-switcher.d.ts +1 -1
  21. package/dist/components/team-switcher.js +1 -1
  22. package/dist/components/user-button.js +1 -1
  23. package/dist/components-page/account-settings/editable-text.js +1 -1
  24. package/dist/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  25. package/dist/components-page/account-settings/email-and-auth/password-section.js +3 -3
  26. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  27. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  28. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  29. package/dist/components-page/account-settings/teams/team-creation-page.js +3 -3
  30. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  31. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  32. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  33. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  34. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  35. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  36. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  37. package/dist/components-page/account-settings.js +3 -3
  38. package/dist/components-page/auth-page.js +1 -1
  39. package/dist/components-page/cli-auth-confirm.js +1 -1
  40. package/dist/components-page/forgot-password.js +5 -5
  41. package/dist/components-page/hexclave-handler-client.d.ts +1 -1
  42. package/dist/components-page/hexclave-handler-client.js +1 -1
  43. package/dist/components-page/hexclave-handler.d.ts +1 -1
  44. package/dist/components-page/mfa.js +3 -3
  45. package/dist/components-page/oauth-callback.js +1 -1
  46. package/dist/components-page/onboarding.js +4 -4
  47. package/dist/components-page/password-reset.js +8 -8
  48. package/dist/components-page/team-creation.js +5 -5
  49. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  50. package/dist/dev-tool/index.d.ts +1 -1
  51. package/dist/dev-tool/index.d.ts.map +1 -1
  52. package/dist/dev-tool/index.js +18 -1
  53. package/dist/dev-tool/index.js.map +1 -1
  54. package/dist/dev-tool/index.test.d.ts +1 -0
  55. package/dist/dev-tool/index.test.js +40 -0
  56. package/dist/dev-tool/index.test.js.map +1 -0
  57. package/dist/esm/components/api-key-dialogs.d.ts +1 -1
  58. package/dist/esm/components/api-key-dialogs.js +4 -4
  59. package/dist/esm/components/credential-sign-in.js +3 -3
  60. package/dist/esm/components/credential-sign-up.js +5 -5
  61. package/dist/esm/components/elements/sidebar-layout.js +2 -2
  62. package/dist/esm/components/elements/user-avatar.js +1 -1
  63. package/dist/esm/components/magic-link-sign-in.js +5 -5
  64. package/dist/esm/components/message-cards/predefined-message-card.js +1 -1
  65. package/dist/esm/components/passkey-button.js +1 -1
  66. package/dist/esm/components/profile-image-editor.js +1 -1
  67. package/dist/esm/components/team-icon.js +1 -1
  68. package/dist/esm/components/team-switcher.js +1 -1
  69. package/dist/esm/components/user-button.js +1 -1
  70. package/dist/esm/components-page/account-settings/editable-text.js +1 -1
  71. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +3 -3
  72. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js +3 -3
  73. package/dist/esm/components-page/account-settings/teams/team-creation-page.js +3 -3
  74. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js +4 -4
  75. package/dist/esm/components-page/account-settings.js +3 -3
  76. package/dist/esm/components-page/auth-page.js +1 -1
  77. package/dist/esm/components-page/cli-auth-confirm.js +1 -1
  78. package/dist/esm/components-page/forgot-password.js +5 -5
  79. package/dist/esm/components-page/hexclave-handler-client.js +1 -1
  80. package/dist/esm/components-page/mfa.js +3 -3
  81. package/dist/esm/components-page/oauth-callback.js +1 -1
  82. package/dist/esm/components-page/onboarding.js +4 -4
  83. package/dist/esm/components-page/password-reset.js +7 -7
  84. package/dist/esm/components-page/team-creation.js +5 -5
  85. package/dist/esm/dev-tool/index.d.ts.map +1 -1
  86. package/dist/esm/dev-tool/index.js +18 -1
  87. package/dist/esm/dev-tool/index.js.map +1 -1
  88. package/dist/esm/dev-tool/index.test.d.ts +1 -0
  89. package/dist/esm/dev-tool/index.test.js +41 -0
  90. package/dist/esm/dev-tool/index.test.js.map +1 -0
  91. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  92. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +5 -5
  93. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  94. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +3 -3
  95. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  96. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +1 -0
  97. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  98. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
  99. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  100. package/dist/esm/lib/hexclave-app/projects/index.d.ts +1 -0
  101. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -1
  102. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -1
  103. package/dist/esm/lib/hexclave-app/users/index.d.ts +1 -1
  104. package/dist/esm/pushed-config-error-overlay/index.test.js +1 -1
  105. package/dist/generated/quetzal-translations.d.ts +1 -1
  106. package/dist/{hexclave-provider-SQbs9rmZ.d.ts → hexclave-provider-DnIE6JQ7.d.ts} +3 -3
  107. package/dist/{hexclave-provider-SQbs9rmZ.d.ts.map → hexclave-provider-DnIE6JQ7.d.ts.map} +1 -1
  108. package/dist/{hooks-ykQ7Wsco.d.ts → hooks-Ds3yoNo-.d.ts} +2 -2
  109. package/dist/{hooks-ykQ7Wsco.d.ts.map → hooks-Ds3yoNo-.d.ts.map} +1 -1
  110. package/dist/{index-DwE1cNLH.d.ts → index-DE-_vkL4.d.ts} +2 -2
  111. package/dist/{index-DwE1cNLH.d.ts.map → index-DE-_vkL4.d.ts.map} +1 -1
  112. package/dist/index.d.ts +4 -4
  113. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  114. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  115. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +1 -0
  116. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  117. package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
  118. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  119. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  120. package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
  121. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
  122. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  123. package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
  124. package/dist/lib/hexclave-app/index.d.ts +1 -1
  125. package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
  126. package/dist/lib/hexclave-app/projects/index.js.map +1 -1
  127. package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
  128. package/dist/lib/hexclave-app/users/index.d.ts +1 -1
  129. package/dist/lib/hooks.d.ts +1 -1
  130. package/dist/providers/hexclave-context.d.ts +1 -1
  131. package/dist/providers/hexclave-provider-client.d.ts +1 -1
  132. package/dist/providers/hexclave-provider.d.ts +1 -1
  133. package/dist/providers/translation-provider.d.ts +1 -1
  134. package/dist/pushed-config-error-overlay/index.d.ts +1 -1
  135. package/dist/pushed-config-error-overlay/index.test.js +1 -1
  136. package/dist/{quetzal-translations-CK45_4Dm.d.ts → quetzal-translations-XeH3zQ9l.d.ts} +3 -3
  137. package/dist/{quetzal-translations-CK45_4Dm.d.ts.map → quetzal-translations-XeH3zQ9l.d.ts.map} +1 -1
  138. package/dist/{translation-provider-DQ3BJepJ.d.ts → translation-provider-WOaZXqAz.d.ts} +2 -2
  139. package/dist/{translation-provider-DQ3BJepJ.d.ts.map → translation-provider-WOaZXqAz.d.ts.map} +1 -1
  140. package/package.json +4 -4
  141. package/src/dev-tool/index.test.ts +58 -0
  142. package/src/dev-tool/index.ts +27 -1
  143. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +1 -0
  144. package/src/lib/hexclave-app/projects/index.ts +1 -0
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { Button } from "@hexclave/ui";
3
- import { KeyRound } from "lucide-react";
4
3
  import { useId } from "react";
5
4
  import { useStackApp } from "../index.js";
6
5
  import { useTranslation } from "../lib/translations.js";
7
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
+ import { KeyRound } from "lucide-react";
8
8
  //#region src/components/passkey-button.tsx
9
9
  function PasskeyButton({ type }) {
10
10
  const { t } = useTranslation();
@@ -1,9 +1,9 @@
1
1
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
2
2
  import { Button, Slider, Typography } from "@hexclave/ui";
3
- import { Upload } from "lucide-react";
4
3
  import { useCallback, useState } from "react";
5
4
  import { useTranslation } from "../lib/translations.js";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Upload } from "lucide-react";
7
7
  import { fileToBase64 } from "@hexclave/shared/dist/utils/base64";
8
8
  import imageCompression from "browser-image-compression";
9
9
  import Cropper from "react-easy-crop";
@@ -1,6 +1,6 @@
1
1
  import { Avatar, AvatarImage, Typography } from "@hexclave/ui";
2
- import { User2 } from "lucide-react";
3
2
  import { jsx } from "react/jsx-runtime";
3
+ import { User2 } from "lucide-react";
4
4
  //#region src/components/team-icon.tsx
5
5
  function TeamIcon(props) {
6
6
  if (props.team === "personal") return /* @__PURE__ */ jsx("div", {
@@ -2,11 +2,11 @@
2
2
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
3
  import { HexclaveAssertionError } from "@hexclave/shared/dist/utils/errors";
4
4
  import { Button, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Skeleton, Typography, cn } from "@hexclave/ui";
5
- import { PlusCircle, Settings } from "lucide-react";
6
5
  import { Suspense, useMemo } from "react";
7
6
  import { useStackApp, useUser } from "../index.js";
8
7
  import { useTranslation } from "../lib/translations.js";
9
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { PlusCircle, Settings } from "lucide-react";
10
10
  import { TeamIcon } from "./team-icon.js";
11
11
  //#region src/components/team-switcher.tsx
12
12
  function TeamSwitcher(props) {
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
3
  import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Skeleton, Typography } from "@hexclave/ui";
4
- import { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from "lucide-react";
5
4
  import { Suspense } from "react";
6
5
  import { useStackApp, useUser } from "../index.js";
7
6
  import { useTranslation } from "../lib/translations.js";
8
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { CircleUser, LogIn, LogOut, SunMoon, UserPlus } from "lucide-react";
9
9
  import { UserAvatar } from "./elements/user-avatar.js";
10
10
  //#region src/components/user-button.tsx
11
11
  function Item(props) {
@@ -1,7 +1,7 @@
1
1
  import { Button, Input, Typography } from "@hexclave/ui";
2
- import { Edit } from "lucide-react";
3
2
  import { useState } from "react";
4
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { Edit } from "lucide-react";
5
5
  import { useTranslation } from "../../lib/translations.js";
6
6
  //#region src/components-page/account-settings/editable-text.tsx
7
7
  function EditableText(props) {
@@ -1,10 +1,10 @@
1
1
  import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
2
- import { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from "@hexclave/ui";
3
- import { useEffect, useState } from "react";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
2
  import { yupResolver } from "@hookform/resolvers/yup";
6
3
  import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
4
+ import { ActionCell, Badge, Button, Input, Table, TableBody, TableCell, TableRow, Typography } from "@hexclave/ui";
5
+ import { useEffect, useState } from "react";
7
6
  import { useForm } from "react-hook-form";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { useUser } from "../../../lib/hooks.js";
9
9
  import { useTranslation } from "../../../lib/translations.js";
10
10
  import { KnownErrors } from "@hexclave/shared/dist/known-errors";
@@ -1,10 +1,10 @@
1
1
  import { runAsynchronously, runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
2
- import { Button, Input, Label, PasswordInput, Typography } from "@hexclave/ui";
3
- import { useState } from "react";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
2
  import { yupResolver } from "@hookform/resolvers/yup";
6
3
  import { passwordSchema, yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
4
+ import { Button, Input, Label, PasswordInput, Typography } from "@hexclave/ui";
5
+ import { useState } from "react";
7
6
  import { useForm } from "react-hook-form";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { getPasswordError } from "@hexclave/shared/dist/helpers/password";
9
9
  import * as yup from "yup";
10
10
  import { useUser } from "../../../lib/hooks.js";
@@ -1,10 +1,10 @@
1
1
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
2
- import { Button, Input } from "@hexclave/ui";
3
- import { useState } from "react";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
2
  import { yupResolver } from "@hookform/resolvers/yup";
6
3
  import { yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
4
+ import { Button, Input } from "@hexclave/ui";
5
+ import { useState } from "react";
7
6
  import { useForm } from "react-hook-form";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { useStackApp, useUser } from "../../../lib/hooks.js";
9
9
  import { useTranslation } from "../../../lib/translations.js";
10
10
  import { PageLayout } from "../page-layout.js";
@@ -1,11 +1,11 @@
1
1
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
2
- import { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@hexclave/ui";
3
- import { Trash } from "lucide-react";
4
- import { useEffect, useState } from "react";
5
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
2
  import { yupResolver } from "@hookform/resolvers/yup";
7
3
  import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
4
+ import { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, Typography } from "@hexclave/ui";
5
+ import { useEffect, useState } from "react";
8
6
  import { useForm } from "react-hook-form";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { Trash } from "lucide-react";
9
9
  import { useUser } from "../../../lib/hooks.js";
10
10
  import { useTranslation } from "../../../lib/translations.js";
11
11
  import { FormWarningText } from "../../../components/elements/form-warning.js";
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
3
  import { Skeleton, Typography } from "@hexclave/ui";
4
- import { Bell, CirclePlus, Contact, CreditCard, Key, Monitor, Settings, ShieldCheck } from "lucide-react";
5
4
  import { Suspense, useEffect, useMemo, useRef, useState } from "react";
6
5
  import { useStackApp, useUser } from "../index.js";
6
+ import { useTranslation } from "../lib/translations.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import { Bell, CirclePlus, Contact, CreditCard, Key, Monitor, Settings, ShieldCheck } from "lucide-react";
7
9
  import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
8
10
  import { SidebarLayout } from "../components/elements/sidebar-layout.js";
9
11
  import { TeamIcon } from "../components/team-icon.js";
10
- import { useTranslation } from "../lib/translations.js";
11
12
  import { ActiveSessionsPage } from "./account-settings/active-sessions/active-sessions-page.js";
12
13
  import { ApiKeysPage } from "./account-settings/api-keys/api-keys-page.js";
13
14
  import { EmailsAndAuthPage } from "./account-settings/email-and-auth/email-and-auth-page.js";
@@ -17,7 +18,6 @@ import { PaymentsPage } from "./account-settings/payments/payments-page.js";
17
18
  import { SettingsPage } from "./account-settings/settings/settings-page.js";
18
19
  import { TeamCreationPage } from "./account-settings/teams/team-creation-page.js";
19
20
  import { TeamPage } from "./account-settings/teams/team-page.js";
20
- import { jsx, jsxs } from "react/jsx-runtime";
21
21
  //#region src/components-page/account-settings.tsx
22
22
  const iconMap = {
23
23
  Contact,
@@ -4,10 +4,10 @@ import { captureError } from "@hexclave/shared/dist/utils/errors";
4
4
  import { Skeleton, Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from "@hexclave/ui";
5
5
  import { Suspense, useMemo } from "react";
6
6
  import { useStackApp, useUser } from "../index.js";
7
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
8
7
  import { useTranslation } from "../lib/translations.js";
9
8
  import { jsx, jsxs } from "react/jsx-runtime";
10
9
  import { KnownError } from "@hexclave/shared";
10
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
11
11
  import { use } from "@hexclave/shared/dist/utils/react";
12
12
  import { CredentialSignIn } from "../components/credential-sign-in.js";
13
13
  import { CredentialSignUp } from "../components/credential-sign-up.js";
@@ -5,8 +5,8 @@ import { Typography } from "@hexclave/ui";
5
5
  import { useCallback, useEffect, useRef, useState } from "react";
6
6
  import { useTranslation } from "../lib/translations.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
- import { MessageCard } from "../components/message-cards/message-card.js";
9
8
  import { useStackApp } from "../lib/hooks.js";
9
+ import { MessageCard } from "../components/message-cards/message-card.js";
10
10
  //#region src/components-page/cli-auth-confirm.tsx
11
11
  async function postCliAuthComplete(app, body) {
12
12
  return await app[hexclaveAppInternalsSymbol].sendRequest("/auth/cli/complete", {
@@ -1,17 +1,17 @@
1
1
  "use client";
2
2
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
+ import { yupResolver } from "@hookform/resolvers/yup";
4
+ import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
3
5
  import { Button, Input, Label, Typography, cn } from "@hexclave/ui";
4
6
  import { useState } from "react";
7
+ import { useForm } from "react-hook-form";
5
8
  import { useStackApp, useUser } from "../index.js";
6
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
+ import { FormWarningText } from "../components/elements/form-warning.js";
7
10
  import { useTranslation } from "../lib/translations.js";
8
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
13
  import { StyledLink } from "../components/link.js";
10
14
  import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
11
- import { yupResolver } from "@hookform/resolvers/yup";
12
- import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
13
- import { useForm } from "react-hook-form";
14
- import { FormWarningText } from "../components/elements/form-warning.js";
15
15
  //#region src/components-page/forgot-password.tsx
16
16
  function ForgotPasswordForm({ onSent }) {
17
17
  const { t } = useTranslation();
@@ -3,13 +3,13 @@ import { HexclaveAssertionError, captureError } from "@hexclave/shared/dist/util
3
3
  import { Suspense, useMemo, useSyncExternalStore } from "react";
4
4
  import { SignIn, SignUp } from "../index.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
+ import { useStackApp as useStackApp$1 } from "../lib/hooks.js";
6
7
  import { KnownError } from "@hexclave/shared";
7
8
  import { use } from "@hexclave/shared/dist/utils/react";
8
9
  import { KnownErrorMessageCard } from "../components/message-cards/known-error-message-card.js";
9
10
  import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
10
11
  import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
11
12
  import { CliAuthConfirmation } from "./cli-auth-confirm.js";
12
- import { useStackApp as useStackApp$1 } from "../lib/hooks.js";
13
13
  import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/index.js";
14
14
  import { filterUndefined } from "@hexclave/shared/dist/utils/objects";
15
15
  import { getRelativePart } from "@hexclave/shared/dist/utils/urls";
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { Button, InputOTP, InputOTPGroup, InputOTPSlot, Spinner, Typography, cn } from "@hexclave/ui";
3
- import { CheckIcon } from "lucide-react";
4
3
  import { useEffect, useMemo, useRef, useState } from "react";
5
4
  import { useStackApp } from "../index.js";
6
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
5
+ import { FormWarningText } from "../components/elements/form-warning.js";
7
6
  import { useTranslation } from "../lib/translations.js";
8
7
  import { jsx, jsxs } from "react/jsx-runtime";
9
8
  import { KnownErrors } from "@hexclave/shared";
10
- import { FormWarningText } from "../components/elements/form-warning.js";
9
+ import { CheckIcon } from "lucide-react";
10
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
11
11
  //#region src/components-page/mfa.tsx
12
12
  function MfaForm({ onSuccess, onCancel }) {
13
13
  const hexclaveApp = useStackApp();
@@ -5,10 +5,10 @@ import { captureError } from "@hexclave/shared/dist/utils/errors";
5
5
  import { Spinner, cn } from "@hexclave/ui";
6
6
  import { useEffect, useRef, useState } from "react";
7
7
  import { useStackApp } from "../index.js";
8
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
8
  import { useTranslation } from "../lib/translations.js";
10
9
  import { jsx, jsxs } from "react/jsx-runtime";
11
10
  import { KnownError } from "@hexclave/shared";
11
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
12
12
  import { StyledLink } from "../components/link.js";
13
13
  import { ErrorPage } from "./error-page.js";
14
14
  //#region src/components-page/oauth-callback.tsx
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
  import { runAsynchronously, runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
+ import { yupResolver } from "@hookform/resolvers/yup";
4
+ import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
3
5
  import { Button, Input, Typography } from "@hexclave/ui";
4
6
  import { useState } from "react";
7
+ import { useForm } from "react-hook-form";
5
8
  import { useStackApp, useUser } from "../index.js";
9
+ import { FormWarningText } from "../components/elements/form-warning.js";
6
10
  import { useTranslation } from "../lib/translations.js";
7
11
  import { jsx, jsxs } from "react/jsx-runtime";
8
12
  import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
9
- import { yupResolver } from "@hookform/resolvers/yup";
10
- import { strictEmailSchema, yupObject } from "@hexclave/shared/dist/schema-fields";
11
- import { useForm } from "react-hook-form";
12
- import { FormWarningText } from "../components/elements/form-warning.js";
13
13
  //#region src/components-page/onboarding.tsx
14
14
  function Onboarding(props) {
15
15
  const { t } = useTranslation();
@@ -1,22 +1,22 @@
1
1
  "use client";
2
2
  import { runAsynchronouslyWithAlert } from "@hexclave/shared/dist/utils/promises";
3
+ import { yupResolver } from "@hookform/resolvers/yup";
4
+ import { passwordSchema, yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
3
5
  import { Button, Label, PasswordInput, Typography, cn } from "@hexclave/ui";
4
6
  import { useState } from "react";
7
+ import { useForm } from "react-hook-form";
5
8
  import { useStackApp } from "../index.js";
6
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
+ import { FormWarningText } from "../components/elements/form-warning.js";
7
10
  import { useTranslation } from "../lib/translations.js";
8
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { getPasswordError } from "@hexclave/shared/dist/helpers/password";
13
+ import * as yup from "yup";
9
14
  import { KnownErrors } from "@hexclave/shared";
15
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
10
16
  import { use } from "@hexclave/shared/dist/utils/react";
11
17
  import { MessageCard as MessageCard$1 } from "../components/message-cards/message-card.js";
12
18
  import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
13
- import { yupResolver } from "@hookform/resolvers/yup";
14
- import { passwordSchema, yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
15
- import { useForm } from "react-hook-form";
16
- import { FormWarningText } from "../components/elements/form-warning.js";
17
19
  import { cacheFunction } from "@hexclave/shared/dist/utils/caches";
18
- import { getPasswordError } from "@hexclave/shared/dist/helpers/password";
19
- import * as yup from "yup";
20
20
  //#region src/components-page/password-reset.tsx
21
21
  function PasswordResetForm(props) {
22
22
  const { t } = useTranslation();
@@ -1,15 +1,15 @@
1
1
  "use client";
2
2
  import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
3
+ import { yupResolver } from "@hookform/resolvers/yup";
4
+ import { yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
3
5
  import { Button, Input, Label, Typography } from "@hexclave/ui";
4
6
  import { useState } from "react";
7
+ import { useForm } from "react-hook-form";
5
8
  import { MessageCard, useStackApp, useUser } from "../index.js";
6
- import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
9
+ import { FormWarningText } from "../components/elements/form-warning.js";
7
10
  import { useTranslation } from "../lib/translations.js";
8
11
  import { jsx, jsxs } from "react/jsx-runtime";
9
- import { yupResolver } from "@hookform/resolvers/yup";
10
- import { yupObject, yupString } from "@hexclave/shared/dist/schema-fields";
11
- import { useForm } from "react-hook-form";
12
- import { FormWarningText } from "../components/elements/form-warning.js";
12
+ import { MaybeFullPage } from "../components/elements/maybe-full-page.js";
13
13
  //#region src/components-page/team-creation.tsx
14
14
  function TeamCreation(props) {
15
15
  const { t } = useTranslation();
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/dev-tool/index.ts"],"mappings":";;;;;AAsGA;;;;;;;;AAAwF;;;iBAAxE,YAAA,CAAa,GAAA,EAAK,cAAc,QAAQ,aAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/dev-tool/index.ts"],"mappings":";;;;;AA2GA;;;;;;;;AAAwF;;;iBAAxE,YAAA,CAAa,GAAA,EAAK,cAAc,QAAQ,aAAA"}
@@ -14,11 +14,13 @@ function getOverride() {
14
14
  return null;
15
15
  }
16
16
  let activeDevToolOption = void 0;
17
+ let activeProjectIsDevelopmentEnvironment = false;
17
18
  function shouldShow() {
18
19
  const override = getOverride();
19
20
  if (override !== null) return override;
20
21
  if (!canMountIntoDom()) return false;
21
22
  if (activeDevToolOption === true) return true;
23
+ if (activeProjectIsDevelopmentEnvironment) return true;
22
24
  const nodeEnv = envVars.NODE_ENV;
23
25
  if (nodeEnv !== void 0) return nodeEnv === "development";
24
26
  try {
@@ -73,10 +75,25 @@ function tryMount() {
73
75
  function mountDevTool(app, devToolOption) {
74
76
  activeApp = app;
75
77
  activeDevToolOption = devToolOption === false ? void 0 : devToolOption ?? void 0;
78
+ activeProjectIsDevelopmentEnvironment = false;
76
79
  tryMount();
80
+ queueMicrotask(() => {
81
+ runAsynchronously(async () => {
82
+ const project = await app.getProject();
83
+ if (activeApp !== app) return;
84
+ activeProjectIsDevelopmentEnvironment = project.isDevelopmentEnvironment;
85
+ if (activeProjectIsDevelopmentEnvironment && activeCleanup === null) tryMount();
86
+ }, {
87
+ noErrorLogging: true,
88
+ onError: (error) => {
89
+ captureError("dev-tool-project-detection", error);
90
+ }
91
+ });
92
+ });
77
93
  const myCleanup = activeCleanup;
78
94
  return () => {
79
95
  activeApp = null;
96
+ activeProjectIsDevelopmentEnvironment = false;
80
97
  if (activeCleanup === myCleanup && myCleanup != null) {
81
98
  activeCleanup = null;
82
99
  myCleanup();
@@ -110,7 +127,7 @@ if (typeof window !== "undefined") window.HexclaveDevTool = window.HexclaveDevTo
110
127
  activeCleanup();
111
128
  activeCleanup = null;
112
129
  }
113
- console.log("[Stack DevTool] Reset to default (auto-detect based on NODE_ENV or localhost/file: origin).");
130
+ console.log("[Stack DevTool] Reset to default (auto-detect based on project, NODE_ENV, or localhost/file: origin).");
114
131
  }
115
132
  };
116
133
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/dev-tool/index.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//===========================================\n\nimport type { StackClientApp } from \"../lib/hexclave-app\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { isLocalhost } from \"@hexclave/shared/dist/utils/urls\";\nimport { canMountIntoDom } from \"../in-page-ui/dom\";\nimport { envVars } from \"../generated/env\";\nimport type { createDevTool as CreateDevToolFn } from \"./dev-tool-core\";\n\n// Hexclave rebrand: UI-only local pref — straight rename (one-time reset is harmless)\nconst OVERRIDE_KEY = '__hexclave-dev-tool-override';\n\nfunction getOverride(): boolean | null {\n try {\n const val = localStorage.getItem(OVERRIDE_KEY);\n if (val === 'true') return true;\n if (val === 'false') return false;\n } catch {}\n return null;\n}\n\nlet activeDevToolOption: true | \"auto\" | undefined = undefined;\n\nfunction shouldShow(): boolean {\n const override = getOverride();\n if (override !== null) return override;\n if (!canMountIntoDom()) return false;\n\n // If devTool was explicitly set to true, always show\n if (activeDevToolOption === true) return true;\n\n // \"auto\" behavior (the default):\n const nodeEnv = envVars.NODE_ENV;\n if (nodeEnv !== undefined) {\n // NODE_ENV is available (bundler/process env exists) — only show in development\n return nodeEnv === \"development\";\n }\n\n // NODE_ENV not found (no process.env/import.meta) — show on localhost or file: protocol\n try {\n const url = new URL(window.location.href);\n if (url.protocol === \"file:\") return true;\n } catch {}\n return isLocalhost(window.location.href);\n}\n\nlet activeCleanup: (() => void) | null = null;\nlet activeApp: StackClientApp<true> | null = null;\nlet mountGeneration = 0;\n\nlet createDevToolPromise: Promise<typeof CreateDevToolFn> | null = null;\nfunction loadCreateDevTool(): Promise<typeof CreateDevToolFn> {\n if (!createDevToolPromise) {\n createDevToolPromise = import(\"./dev-tool-core\").then(m => m.createDevTool).catch((err) => {\n createDevToolPromise = null;\n throw err;\n });\n }\n return createDevToolPromise;\n}\n\nfunction tryMount() {\n if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n\n if (!shouldShow() || !activeApp || !canMountIntoDom()) return;\n\n const generation = ++mountGeneration;\n const app = activeApp;\n\n runAsynchronously(async () => {\n const createDevTool = await loadCreateDevTool();\n if (generation !== mountGeneration) return;\n if (!shouldShow() || activeApp !== app || !canMountIntoDom()) return;\n activeCleanup = createDevTool(app);\n }, {\n noErrorLogging: true,\n onError: (error) => {\n captureError(\"dev-tool-mount\", error);\n },\n });\n}\n\n/**\n * Mounts the Hexclave dev tool on the page.\n *\n * Visibility is determined by the `devTool` option:\n * - `true`: always show\n * - `false`: never show (caller gates this — mountDevTool won't be called)\n * - `\"auto\"` / `undefined`: show based on NODE_ENV or localhost/file: heuristics\n *\n * Console commands (also work in production):\n * HexclaveDevTool.enable() — force-show the dev tool\n * HexclaveDevTool.disable() — force-hide the dev tool\n * HexclaveDevTool.reset() — revert to auto behavior\n */\nexport function mountDevTool(app: StackClientApp<true>, devToolOption?: boolean | \"auto\"): () => void {\n activeApp = app;\n activeDevToolOption = devToolOption === false ? undefined : devToolOption ?? undefined;\n tryMount();\n\n // Capture the cleanup created by THIS specific mount call so that React\n // StrictMode's double-invoke doesn't let the first effect's cleanup tear\n // down the second mount (which would cause the tool to disappear silently).\n const myCleanup = activeCleanup;\n\n return () => {\n activeApp = null;\n if (activeCleanup === myCleanup && myCleanup != null) {\n activeCleanup = null;\n myCleanup();\n }\n };\n}\n\n// Expose console commands: HexclaveDevTool.enable() / .disable() / .reset()\nif (typeof window !== 'undefined') {\n // Hexclave rebrand: expose under both the legacy and new global names.\n (window as any).HexclaveDevTool = (window as any).HexclaveDevTool = {\n enable() {\n try {\n localStorage.setItem(OVERRIDE_KEY, 'true');\n } catch {}\n tryMount();\n console.log('[Stack DevTool] Enabled. Refresh if the panel does not appear.');\n },\n disable() {\n try {\n localStorage.setItem(OVERRIDE_KEY, 'false');\n } catch {}\n if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n console.log('[Stack DevTool] Disabled.');\n },\n reset() {\n try {\n localStorage.removeItem(OVERRIDE_KEY);\n } catch {}\n if (shouldShow()) {\n tryMount();\n } else if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n console.log('[Stack DevTool] Reset to default (auto-detect based on NODE_ENV or localhost/file: origin).');\n },\n };\n}\n\n"],"mappings":";;;;;;AAcA,MAAM,eAAe;AAErB,SAAS,cAA8B;CACrC,IAAI;EACF,MAAM,MAAM,aAAa,QAAQ,YAAY;EAC7C,IAAI,QAAQ,QAAQ,OAAO;EAC3B,IAAI,QAAQ,SAAS,OAAO;CAC9B,QAAQ,CAAC;CACT,OAAO;AACT;AAEA,IAAI,sBAAiD,KAAA;AAErD,SAAS,aAAsB;CAC7B,MAAM,WAAW,YAAY;CAC7B,IAAI,aAAa,MAAM,OAAO;CAC9B,IAAI,CAAC,gBAAgB,GAAG,OAAO;CAG/B,IAAI,wBAAwB,MAAM,OAAO;CAGzC,MAAM,UAAU,QAAQ;CACxB,IAAI,YAAY,KAAA,GAEd,OAAO,YAAY;CAIrB,IAAI;EAEF,IAAI,IADY,IAAI,OAAO,SAAS,IAC9B,CAAC,CAAC,aAAa,SAAS,OAAO;CACvC,QAAQ,CAAC;CACT,OAAO,YAAY,OAAO,SAAS,IAAI;AACzC;AAEA,IAAI,gBAAqC;AACzC,IAAI,YAAyC;AAC7C,IAAI,kBAAkB;AAEtB,IAAI,uBAA+D;AACnE,SAAS,oBAAqD;CAC5D,IAAI,CAAC,sBACH,uBAAuB,OAAO,qBAAkB,CAAC,MAAK,MAAK,EAAE,aAAa,CAAC,CAAC,OAAO,QAAQ;EACzF,uBAAuB;EACvB,MAAM;CACR,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,WAAW;CAClB,IAAI,eAAe;EACjB,cAAc;EACd,gBAAgB;CAClB;CAEA,IAAI,CAAC,WAAW,KAAK,CAAC,aAAa,CAAC,gBAAgB,GAAG;CAEvD,MAAM,aAAa,EAAE;CACrB,MAAM,MAAM;CAEZ,kBAAkB,YAAY;EAC5B,MAAM,gBAAgB,MAAM,kBAAkB;EAC9C,IAAI,eAAe,iBAAiB;EACpC,IAAI,CAAC,WAAW,KAAK,cAAc,OAAO,CAAC,gBAAgB,GAAG;EAC9D,gBAAgB,cAAc,GAAG;CACnC,GAAG;EACD,gBAAgB;EAChB,UAAU,UAAU;GAClB,aAAa,kBAAkB,KAAK;EACtC;CACF,CAAC;AACH;;;;;;;;;;;;;;AAeA,SAAgB,aAAa,KAA2B,eAA8C;CACpG,YAAY;CACZ,sBAAsB,kBAAkB,QAAQ,KAAA,IAAY,iBAAiB,KAAA;CAC7E,SAAS;CAKT,MAAM,YAAY;CAElB,aAAa;EACX,YAAY;EACZ,IAAI,kBAAkB,aAAa,aAAa,MAAM;GACpD,gBAAgB;GAChB,UAAU;EACZ;CACF;AACF;AAGA,IAAI,OAAO,WAAW,aAEpB,OAAgB,kBAAkB,OAAgB,kBAAkB;CAClE,SAAS;EACP,IAAI;GACF,aAAa,QAAQ,cAAc,MAAM;EAC3C,QAAQ,CAAC;EACT,SAAS;EACT,QAAQ,IAAI,gEAAgE;CAC9E;CACA,UAAU;EACR,IAAI;GACF,aAAa,QAAQ,cAAc,OAAO;EAC5C,QAAQ,CAAC;EACT,IAAI,eAAe;GACjB,cAAc;GACd,gBAAgB;EAClB;EACA,QAAQ,IAAI,2BAA2B;CACzC;CACA,QAAQ;EACN,IAAI;GACF,aAAa,WAAW,YAAY;EACtC,QAAQ,CAAC;EACT,IAAI,WAAW,GACb,SAAS;OACJ,IAAI,eAAe;GACxB,cAAc;GACd,gBAAgB;EAClB;EACA,QAAQ,IAAI,6FAA6F;CAC3G;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/dev-tool/index.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//===========================================\n\nimport type { StackClientApp } from \"../lib/hexclave-app\";\nimport { captureError } from \"@hexclave/shared/dist/utils/errors\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { isLocalhost } from \"@hexclave/shared/dist/utils/urls\";\nimport { canMountIntoDom } from \"../in-page-ui/dom\";\nimport { envVars } from \"../generated/env\";\nimport type { createDevTool as CreateDevToolFn } from \"./dev-tool-core\";\n\n// Hexclave rebrand: UI-only local pref — straight rename (one-time reset is harmless)\nconst OVERRIDE_KEY = '__hexclave-dev-tool-override';\n\nfunction getOverride(): boolean | null {\n try {\n const val = localStorage.getItem(OVERRIDE_KEY);\n if (val === 'true') return true;\n if (val === 'false') return false;\n } catch {}\n return null;\n}\n\nlet activeDevToolOption: true | \"auto\" | undefined = undefined;\nlet activeProjectIsDevelopmentEnvironment = false;\n\nfunction shouldShow(): boolean {\n const override = getOverride();\n if (override !== null) return override;\n if (!canMountIntoDom()) return false;\n\n // If devTool was explicitly set to true, always show\n if (activeDevToolOption === true) return true;\n\n // Development environment projects should expose the tool even when the\n // consuming app itself was built or hosted as production.\n if (activeProjectIsDevelopmentEnvironment) return true;\n\n // \"auto\" behavior (the default):\n const nodeEnv = envVars.NODE_ENV;\n if (nodeEnv !== undefined) {\n // NODE_ENV is available (bundler/process env exists) — only show in development\n return nodeEnv === \"development\";\n }\n\n // NODE_ENV not found (no process.env/import.meta) — show on localhost or file: protocol\n try {\n const url = new URL(window.location.href);\n if (url.protocol === \"file:\") return true;\n } catch {}\n return isLocalhost(window.location.href);\n}\n\nlet activeCleanup: (() => void) | null = null;\nlet activeApp: StackClientApp<true> | null = null;\nlet mountGeneration = 0;\n\nlet createDevToolPromise: Promise<typeof CreateDevToolFn> | null = null;\nfunction loadCreateDevTool(): Promise<typeof CreateDevToolFn> {\n if (!createDevToolPromise) {\n createDevToolPromise = import(\"./dev-tool-core\").then(m => m.createDevTool).catch((err) => {\n createDevToolPromise = null;\n throw err;\n });\n }\n return createDevToolPromise;\n}\n\nfunction tryMount() {\n if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n\n if (!shouldShow() || !activeApp || !canMountIntoDom()) return;\n\n const generation = ++mountGeneration;\n const app = activeApp;\n\n runAsynchronously(async () => {\n const createDevTool = await loadCreateDevTool();\n if (generation !== mountGeneration) return;\n if (!shouldShow() || activeApp !== app || !canMountIntoDom()) return;\n activeCleanup = createDevTool(app);\n }, {\n noErrorLogging: true,\n onError: (error) => {\n captureError(\"dev-tool-mount\", error);\n },\n });\n}\n\n/**\n * Mounts the Hexclave dev tool on the page.\n *\n * Visibility is determined by the `devTool` option:\n * - `true`: always show\n * - `false`: never show (caller gates this — mountDevTool won't be called)\n * - `\"auto\"` / `undefined`: show based on NODE_ENV or localhost/file: heuristics\n *\n * Console commands (also work in production):\n * HexclaveDevTool.enable() — force-show the dev tool\n * HexclaveDevTool.disable() — force-hide the dev tool\n * HexclaveDevTool.reset() — revert to auto behavior\n */\nexport function mountDevTool(app: StackClientApp<true>, devToolOption?: boolean | \"auto\"): () => void {\n activeApp = app;\n activeDevToolOption = devToolOption === false ? undefined : devToolOption ?? undefined;\n activeProjectIsDevelopmentEnvironment = false;\n tryMount();\n\n // The project endpoint is also the source of config warnings, so this uses\n // the backend's development-environment flag instead of inferring it from\n // the SDK's build or the current page's origin.\n queueMicrotask(() => {\n runAsynchronously(async () => {\n const project = await app.getProject();\n if (activeApp !== app) return;\n activeProjectIsDevelopmentEnvironment = project.isDevelopmentEnvironment;\n if (activeProjectIsDevelopmentEnvironment && activeCleanup === null) {\n tryMount();\n }\n }, {\n noErrorLogging: true,\n onError: (error) => {\n captureError(\"dev-tool-project-detection\", error);\n },\n });\n });\n\n // Capture the cleanup created by THIS specific mount call so that React\n // StrictMode's double-invoke doesn't let the first effect's cleanup tear\n // down the second mount (which would cause the tool to disappear silently).\n const myCleanup = activeCleanup;\n\n return () => {\n activeApp = null;\n activeProjectIsDevelopmentEnvironment = false;\n if (activeCleanup === myCleanup && myCleanup != null) {\n activeCleanup = null;\n myCleanup();\n }\n };\n}\n\n// Expose console commands: HexclaveDevTool.enable() / .disable() / .reset()\nif (typeof window !== 'undefined') {\n // Hexclave rebrand: expose under both the legacy and new global names.\n (window as any).HexclaveDevTool = (window as any).HexclaveDevTool = {\n enable() {\n try {\n localStorage.setItem(OVERRIDE_KEY, 'true');\n } catch {}\n tryMount();\n console.log('[Stack DevTool] Enabled. Refresh if the panel does not appear.');\n },\n disable() {\n try {\n localStorage.setItem(OVERRIDE_KEY, 'false');\n } catch {}\n if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n console.log('[Stack DevTool] Disabled.');\n },\n reset() {\n try {\n localStorage.removeItem(OVERRIDE_KEY);\n } catch {}\n if (shouldShow()) {\n tryMount();\n } else if (activeCleanup) {\n activeCleanup();\n activeCleanup = null;\n }\n console.log('[Stack DevTool] Reset to default (auto-detect based on project, NODE_ENV, or localhost/file: origin).');\n },\n };\n}\n\n"],"mappings":";;;;;;AAcA,MAAM,eAAe;AAErB,SAAS,cAA8B;CACrC,IAAI;EACF,MAAM,MAAM,aAAa,QAAQ,YAAY;EAC7C,IAAI,QAAQ,QAAQ,OAAO;EAC3B,IAAI,QAAQ,SAAS,OAAO;CAC9B,QAAQ,CAAC;CACT,OAAO;AACT;AAEA,IAAI,sBAAiD,KAAA;AACrD,IAAI,wCAAwC;AAE5C,SAAS,aAAsB;CAC7B,MAAM,WAAW,YAAY;CAC7B,IAAI,aAAa,MAAM,OAAO;CAC9B,IAAI,CAAC,gBAAgB,GAAG,OAAO;CAG/B,IAAI,wBAAwB,MAAM,OAAO;CAIzC,IAAI,uCAAuC,OAAO;CAGlD,MAAM,UAAU,QAAQ;CACxB,IAAI,YAAY,KAAA,GAEd,OAAO,YAAY;CAIrB,IAAI;EAEF,IAAI,IADY,IAAI,OAAO,SAAS,IAC9B,CAAC,CAAC,aAAa,SAAS,OAAO;CACvC,QAAQ,CAAC;CACT,OAAO,YAAY,OAAO,SAAS,IAAI;AACzC;AAEA,IAAI,gBAAqC;AACzC,IAAI,YAAyC;AAC7C,IAAI,kBAAkB;AAEtB,IAAI,uBAA+D;AACnE,SAAS,oBAAqD;CAC5D,IAAI,CAAC,sBACH,uBAAuB,OAAO,qBAAkB,CAAC,MAAK,MAAK,EAAE,aAAa,CAAC,CAAC,OAAO,QAAQ;EACzF,uBAAuB;EACvB,MAAM;CACR,CAAC;CAEH,OAAO;AACT;AAEA,SAAS,WAAW;CAClB,IAAI,eAAe;EACjB,cAAc;EACd,gBAAgB;CAClB;CAEA,IAAI,CAAC,WAAW,KAAK,CAAC,aAAa,CAAC,gBAAgB,GAAG;CAEvD,MAAM,aAAa,EAAE;CACrB,MAAM,MAAM;CAEZ,kBAAkB,YAAY;EAC5B,MAAM,gBAAgB,MAAM,kBAAkB;EAC9C,IAAI,eAAe,iBAAiB;EACpC,IAAI,CAAC,WAAW,KAAK,cAAc,OAAO,CAAC,gBAAgB,GAAG;EAC9D,gBAAgB,cAAc,GAAG;CACnC,GAAG;EACD,gBAAgB;EAChB,UAAU,UAAU;GAClB,aAAa,kBAAkB,KAAK;EACtC;CACF,CAAC;AACH;;;;;;;;;;;;;;AAeA,SAAgB,aAAa,KAA2B,eAA8C;CACpG,YAAY;CACZ,sBAAsB,kBAAkB,QAAQ,KAAA,IAAY,iBAAiB,KAAA;CAC7E,wCAAwC;CACxC,SAAS;CAKT,qBAAqB;EACnB,kBAAkB,YAAY;GAC5B,MAAM,UAAU,MAAM,IAAI,WAAW;GACrC,IAAI,cAAc,KAAK;GACvB,wCAAwC,QAAQ;GAChD,IAAI,yCAAyC,kBAAkB,MAC7D,SAAS;EAEb,GAAG;GACD,gBAAgB;GAChB,UAAU,UAAU;IAClB,aAAa,8BAA8B,KAAK;GAClD;EACF,CAAC;CACH,CAAC;CAKD,MAAM,YAAY;CAElB,aAAa;EACX,YAAY;EACZ,wCAAwC;EACxC,IAAI,kBAAkB,aAAa,aAAa,MAAM;GACpD,gBAAgB;GAChB,UAAU;EACZ;CACF;AACF;AAGA,IAAI,OAAO,WAAW,aAEpB,OAAgB,kBAAkB,OAAgB,kBAAkB;CAClE,SAAS;EACP,IAAI;GACF,aAAa,QAAQ,cAAc,MAAM;EAC3C,QAAQ,CAAC;EACT,SAAS;EACT,QAAQ,IAAI,gEAAgE;CAC9E;CACA,UAAU;EACR,IAAI;GACF,aAAa,QAAQ,cAAc,OAAO;EAC5C,QAAQ,CAAC;EACT,IAAI,eAAe;GACjB,cAAc;GACd,gBAAgB;EAClB;EACA,QAAQ,IAAI,2BAA2B;CACzC;CACA,QAAQ;EACN,IAAI;GACF,aAAa,WAAW,YAAY;EACtC,QAAQ,CAAC;EACT,IAAI,WAAW,GACb,SAAS;OACJ,IAAI,eAAe;GACxB,cAAc;GACd,gBAAgB;EAClB;EACA,QAAQ,IAAI,uGAAuG;CACrH;AACF"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,41 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import { StackClientApp } from "../lib/hexclave-app/index.js";
3
+ import { createDevTool } from "./dev-tool-core.js";
4
+ import { mountDevTool } from "./index.js";
5
+ //#region src/dev-tool/index.test.ts
6
+ vi.mock("./dev-tool-core", () => ({ createDevTool: vi.fn(() => () => {}) }));
7
+ describe("dev tool visibility", () => {
8
+ afterEach(() => {
9
+ vi.unstubAllEnvs();
10
+ vi.unstubAllGlobals();
11
+ vi.clearAllMocks();
12
+ });
13
+ it("shows for a development environment project in a production-hosted app", async () => {
14
+ const app = new StackClientApp({
15
+ baseUrl: "https://api.example.com",
16
+ projectId: "00000000-0000-4000-8000-000000000000",
17
+ publishableClientKey: "stack-pk-test",
18
+ tokenStore: "memory",
19
+ redirectMethod: "none",
20
+ devTool: false
21
+ });
22
+ const getProject = vi.fn(async () => ({ isDevelopmentEnvironment: true }));
23
+ Reflect.set(app, "getProject", getProject);
24
+ vi.stubEnv("NODE_ENV", "production");
25
+ vi.stubGlobal("window", { location: { href: "https://example.com" } });
26
+ vi.stubGlobal("document", {
27
+ body: { appendChild: () => {} },
28
+ createElement: () => ({})
29
+ });
30
+ vi.stubGlobal("localStorage", { getItem: () => null });
31
+ mountDevTool(app);
32
+ await vi.waitFor(() => {
33
+ expect(getProject).toHaveBeenCalledOnce();
34
+ expect(createDevTool).toHaveBeenCalledOnce();
35
+ });
36
+ });
37
+ });
38
+ //#endregion
39
+ export {};
40
+
41
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","names":[],"sources":["../../../src/dev-tool/index.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 { StackClientApp } from \"../lib/hexclave-app\";\nimport { createDevTool } from \"./dev-tool-core\";\nimport { mountDevTool } from \".\";\n\nvi.mock(\"./dev-tool-core\", () => ({\n createDevTool: vi.fn(() => () => {}),\n}));\n\ndescribe(\"dev tool visibility\", () => {\n afterEach(() => {\n vi.unstubAllEnvs();\n vi.unstubAllGlobals();\n vi.clearAllMocks();\n });\n\n it(\"shows for a development environment project in a production-hosted app\", async () => {\n const app = new StackClientApp({\n baseUrl: \"https://api.example.com\",\n projectId: \"00000000-0000-4000-8000-000000000000\",\n publishableClientKey: \"stack-pk-test\",\n tokenStore: \"memory\",\n redirectMethod: \"none\",\n devTool: false,\n });\n const getProject = vi.fn(async () => ({\n isDevelopmentEnvironment: true,\n }));\n Reflect.set(app, \"getProject\", getProject);\n\n vi.stubEnv(\"NODE_ENV\", \"production\");\n vi.stubGlobal(\"window\", {\n location: {\n href: \"https://example.com\",\n },\n });\n vi.stubGlobal(\"document\", {\n body: {\n appendChild: () => {},\n },\n createElement: () => ({}),\n });\n vi.stubGlobal(\"localStorage\", {\n getItem: () => null,\n });\n\n mountDevTool(app);\n\n await vi.waitFor(() => {\n expect(getProject).toHaveBeenCalledOnce();\n expect(createDevTool).toHaveBeenCalledOnce();\n });\n });\n});\n"],"mappings":";;;;;AASA,GAAG,KAAK,0BAA0B,EAChC,eAAe,GAAG,eAAe,CAAC,CAAC,EACrC,EAAE;AAEF,SAAS,6BAA6B;CACpC,gBAAgB;EACd,GAAG,cAAc;EACjB,GAAG,iBAAiB;EACpB,GAAG,cAAc;CACnB,CAAC;CAED,GAAG,0EAA0E,YAAY;EACvF,MAAM,MAAM,IAAI,eAAe;GAC7B,SAAS;GACT,WAAW;GACX,sBAAsB;GACtB,YAAY;GACZ,gBAAgB;GAChB,SAAS;EACX,CAAC;EACD,MAAM,aAAa,GAAG,GAAG,aAAa,EACpC,0BAA0B,KAC5B,EAAE;EACF,QAAQ,IAAI,KAAK,cAAc,UAAU;EAEzC,GAAG,QAAQ,YAAY,YAAY;EACnC,GAAG,WAAW,UAAU,EACtB,UAAU,EACR,MAAM,sBACR,EACF,CAAC;EACD,GAAG,WAAW,YAAY;GACxB,MAAM,EACJ,mBAAmB,CAAC,EACtB;GACA,sBAAsB,CAAC;EACzB,CAAC;EACD,GAAG,WAAW,gBAAgB,EAC5B,eAAe,KACjB,CAAC;EAED,aAAa,GAAG;EAEhB,MAAM,GAAG,cAAc;GACrB,OAAO,UAAU,CAAC,CAAC,qBAAqB;GACxC,OAAO,aAAa,CAAC,CAAC,qBAAqB;EAC7C,CAAC;CACH,CAAC;AACH,CAAC"}