@hexclave/next 1.0.75 → 1.0.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/dist/{admin-app-impl-sTQD2d-3.d.ts → admin-app-impl-CxDpE89P.d.ts} +12 -10
  2. package/dist/admin-app-impl-CxDpE89P.d.ts.map +1 -0
  3. package/dist/clickmap/clickmap-core.d.ts +1 -1
  4. package/dist/clickmap/index.d.ts +1 -1
  5. package/dist/{client-app-BCT5p_70.d.ts → client-app-wFodsYml.d.ts} +4 -1
  6. package/dist/client-app-wFodsYml.d.ts.map +1 -0
  7. package/dist/common-BK_sydxF.d.ts.map +1 -1
  8. package/dist/components/elements/sidebar-layout.d.ts.map +1 -1
  9. package/dist/components/elements/sidebar-layout.js +12 -2
  10. package/dist/components/elements/sidebar-layout.js.map +1 -1
  11. package/dist/components/selected-team-switcher.d.ts +1 -1
  12. package/dist/components/team-icon.d.ts +1 -1
  13. package/dist/components/team-switcher.d.ts +1 -1
  14. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  15. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  16. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  17. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  18. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  19. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  20. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  21. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  22. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  23. package/dist/components-page/hexclave-handler-client.d.ts +1 -1
  24. package/dist/components-page/hexclave-handler.d.ts +1 -1
  25. package/dist/components-page/team-invitation-cache.d.ts +5 -0
  26. package/dist/components-page/team-invitation-cache.d.ts.map +1 -0
  27. package/dist/components-page/team-invitation-cache.js +12 -0
  28. package/dist/components-page/team-invitation-cache.js.map +1 -0
  29. package/dist/components-page/team-invitation-cache.test.d.ts +1 -0
  30. package/dist/components-page/team-invitation-cache.test.js +23 -0
  31. package/dist/components-page/team-invitation-cache.test.js.map +1 -0
  32. package/dist/components-page/team-invitation.js +8 -7
  33. package/dist/components-page/team-invitation.js.map +1 -1
  34. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  35. package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
  36. package/dist/dev-tool/dev-tool-core.js +2 -2
  37. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  38. package/dist/dev-tool/index.d.ts +1 -1
  39. package/dist/dev-tool/index.d.ts.map +1 -1
  40. package/dist/dev-tool/index.js +2 -8
  41. package/dist/dev-tool/index.js.map +1 -1
  42. package/dist/esm/components/elements/sidebar-layout.d.ts.map +1 -1
  43. package/dist/esm/components/elements/sidebar-layout.js +12 -2
  44. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  45. package/dist/esm/components-page/team-invitation-cache.d.ts +5 -0
  46. package/dist/esm/components-page/team-invitation-cache.d.ts.map +1 -0
  47. package/dist/esm/components-page/team-invitation-cache.js +11 -0
  48. package/dist/esm/components-page/team-invitation-cache.js.map +1 -0
  49. package/dist/esm/components-page/team-invitation-cache.test.d.ts +1 -0
  50. package/dist/esm/components-page/team-invitation-cache.test.js +24 -0
  51. package/dist/esm/components-page/team-invitation-cache.test.js.map +1 -0
  52. package/dist/esm/components-page/team-invitation.d.ts.map +1 -1
  53. package/dist/esm/components-page/team-invitation.js +8 -7
  54. package/dist/esm/components-page/team-invitation.js.map +1 -1
  55. package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
  56. package/dist/esm/dev-tool/dev-tool-core.js +1 -1
  57. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  58. package/dist/esm/dev-tool/index.d.ts.map +1 -1
  59. package/dist/esm/dev-tool/index.js +2 -8
  60. package/dist/esm/dev-tool/index.js.map +1 -1
  61. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  62. package/dist/esm/in-page-ui/dev-environment.d.ts +5 -0
  63. package/dist/esm/in-page-ui/dev-environment.d.ts.map +1 -0
  64. package/dist/esm/in-page-ui/dev-environment.js +18 -0
  65. package/dist/esm/in-page-ui/dev-environment.js.map +1 -0
  66. package/dist/esm/in-page-ui/issue-card.d.ts +52 -0
  67. package/dist/esm/in-page-ui/issue-card.d.ts.map +1 -0
  68. package/dist/esm/in-page-ui/issue-card.js +392 -0
  69. package/dist/esm/in-page-ui/issue-card.js.map +1 -0
  70. package/dist/esm/in-page-ui/issue-card.test.d.ts +1 -0
  71. package/dist/esm/in-page-ui/issue-card.test.js +60 -0
  72. package/dist/esm/in-page-ui/issue-card.test.js.map +1 -0
  73. package/dist/esm/in-page-ui/logo.d.ts +5 -0
  74. package/dist/esm/in-page-ui/logo.d.ts.map +1 -0
  75. package/dist/esm/in-page-ui/logo.js +6 -0
  76. package/dist/esm/in-page-ui/logo.js.map +1 -0
  77. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +4 -4
  78. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  79. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +30 -1
  80. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -1
  81. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +140 -15
  82. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
  83. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +5 -3
  84. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  85. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +184 -28
  86. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  87. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.d.ts +1 -0
  88. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js +83 -0
  89. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js.map +1 -0
  90. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.d.ts +1 -0
  91. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js +120 -0
  92. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js.map +1 -0
  93. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -1
  94. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +4 -3
  95. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -1
  96. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  97. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +1 -1
  98. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +1 -0
  99. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -1
  100. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +2 -2
  101. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
  102. package/dist/esm/lib/hexclave-app/teams/index.d.ts +3 -0
  103. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -1
  104. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -1
  105. package/dist/esm/pushed-config-error-overlay/index.d.ts.map +1 -1
  106. package/dist/esm/pushed-config-error-overlay/index.js +42 -343
  107. package/dist/esm/pushed-config-error-overlay/index.js.map +1 -1
  108. package/dist/esm/setup-error-overlay/index.d.ts +16 -0
  109. package/dist/esm/setup-error-overlay/index.d.ts.map +1 -0
  110. package/dist/esm/setup-error-overlay/index.js +106 -0
  111. package/dist/esm/setup-error-overlay/index.js.map +1 -0
  112. package/dist/esm/setup-error-overlay/index.test.d.ts +1 -0
  113. package/dist/esm/setup-error-overlay/index.test.js +125 -0
  114. package/dist/esm/setup-error-overlay/index.test.js.map +1 -0
  115. package/dist/esm/utils/monkey-patch.d.ts +7 -0
  116. package/dist/esm/utils/monkey-patch.d.ts.map +1 -0
  117. package/dist/esm/utils/monkey-patch.js +20 -0
  118. package/dist/esm/utils/monkey-patch.js.map +1 -0
  119. package/dist/esm/utils/react.d.ts +17 -0
  120. package/dist/esm/utils/react.d.ts.map +1 -0
  121. package/dist/esm/utils/react.js +60 -0
  122. package/dist/esm/utils/react.js.map +1 -0
  123. package/dist/generated/quetzal-translations.d.ts +1 -1
  124. package/dist/{hexclave-provider-BKxi3Vy-.d.ts → hexclave-provider-CMz2mt4I.d.ts} +3 -3
  125. package/dist/{hexclave-provider-BKxi3Vy-.d.ts.map → hexclave-provider-CMz2mt4I.d.ts.map} +1 -1
  126. package/dist/{hooks-CUe5bc3s.d.ts → hooks-CUHt4Y9C.d.ts} +2 -2
  127. package/dist/{hooks-CUe5bc3s.d.ts.map → hooks-CUHt4Y9C.d.ts.map} +1 -1
  128. package/dist/in-page-ui/dev-environment.d.ts +5 -0
  129. package/dist/in-page-ui/dev-environment.d.ts.map +1 -0
  130. package/dist/in-page-ui/dev-environment.js +19 -0
  131. package/dist/in-page-ui/dev-environment.js.map +1 -0
  132. package/dist/in-page-ui/issue-card.d.ts +52 -0
  133. package/dist/in-page-ui/issue-card.d.ts.map +1 -0
  134. package/dist/in-page-ui/issue-card.js +397 -0
  135. package/dist/in-page-ui/issue-card.js.map +1 -0
  136. package/dist/in-page-ui/issue-card.test.d.ts +1 -0
  137. package/dist/in-page-ui/issue-card.test.js +59 -0
  138. package/dist/in-page-ui/issue-card.test.js.map +1 -0
  139. package/dist/in-page-ui/logo.d.ts +5 -0
  140. package/dist/in-page-ui/logo.d.ts.map +1 -0
  141. package/dist/in-page-ui/logo.js +7 -0
  142. package/dist/in-page-ui/logo.js.map +1 -0
  143. package/dist/{index-CvB7XacB.d.ts → index-fR0LkUK7.d.ts} +2 -2
  144. package/dist/{index-CvB7XacB.d.ts.map → index-fR0LkUK7.d.ts.map} +1 -1
  145. package/dist/index.d.ts +4 -4
  146. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  147. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js +29 -0
  148. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.js.map +1 -1
  149. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js +140 -15
  150. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -1
  151. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +2 -2
  152. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +182 -25
  153. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  154. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.d.ts +1 -0
  155. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js +82 -0
  156. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.js.map +1 -0
  157. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.d.ts +1 -0
  158. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js +119 -0
  159. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.js.map +1 -0
  160. package/dist/lib/hexclave-app/apps/implementations/common.js +4 -3
  161. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -1
  162. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  163. package/dist/lib/hexclave-app/apps/implementations/index.js +1 -1
  164. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js +1 -0
  165. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.test.js.map +1 -1
  166. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  167. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js +1 -1
  168. package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
  169. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
  170. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  171. package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
  172. package/dist/lib/hexclave-app/index.d.ts +1 -1
  173. package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
  174. package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
  175. package/dist/lib/hexclave-app/teams/index.js.map +1 -1
  176. package/dist/lib/hexclave-app/users/index.d.ts +1 -1
  177. package/dist/lib/hooks.d.ts +1 -1
  178. package/dist/providers/hexclave-context.d.ts +1 -1
  179. package/dist/providers/hexclave-provider-client.d.ts +1 -1
  180. package/dist/providers/hexclave-provider.d.ts +1 -1
  181. package/dist/providers/translation-provider.d.ts +1 -1
  182. package/dist/pushed-config-error-overlay/index.d.ts +1 -1
  183. package/dist/pushed-config-error-overlay/index.d.ts.map +1 -1
  184. package/dist/pushed-config-error-overlay/index.js +41 -342
  185. package/dist/pushed-config-error-overlay/index.js.map +1 -1
  186. package/dist/{quetzal-translations-XeH3zQ9l.d.ts → quetzal-translations-B2jT2SWm.d.ts} +3 -3
  187. package/dist/{quetzal-translations-XeH3zQ9l.d.ts.map → quetzal-translations-B2jT2SWm.d.ts.map} +1 -1
  188. package/dist/setup-error-overlay/index.d.ts +16 -0
  189. package/dist/setup-error-overlay/index.d.ts.map +1 -0
  190. package/dist/setup-error-overlay/index.js +108 -0
  191. package/dist/setup-error-overlay/index.js.map +1 -0
  192. package/dist/setup-error-overlay/index.test.d.ts +1 -0
  193. package/dist/setup-error-overlay/index.test.js +124 -0
  194. package/dist/setup-error-overlay/index.test.js.map +1 -0
  195. package/dist/team-invitation-B5Ol7vdd.d.ts.map +1 -1
  196. package/dist/{translation-provider-WOaZXqAz.d.ts → translation-provider-6505O9P2.d.ts} +2 -2
  197. package/dist/{translation-provider-WOaZXqAz.d.ts.map → translation-provider-6505O9P2.d.ts.map} +1 -1
  198. package/dist/utils/monkey-patch.d.ts +7 -0
  199. package/dist/utils/monkey-patch.d.ts.map +1 -0
  200. package/dist/utils/monkey-patch.js +23 -0
  201. package/dist/utils/monkey-patch.js.map +1 -0
  202. package/dist/utils/react.d.ts +17 -0
  203. package/dist/utils/react.d.ts.map +1 -0
  204. package/dist/utils/react.js +63 -0
  205. package/dist/utils/react.js.map +1 -0
  206. package/package.json +4 -4
  207. package/src/components/elements/sidebar-layout.tsx +16 -1
  208. package/src/components-page/team-invitation-cache.test.ts +25 -0
  209. package/src/components-page/team-invitation-cache.ts +13 -0
  210. package/src/components-page/team-invitation.tsx +16 -7
  211. package/src/dev-tool/dev-tool-core.ts +1 -4
  212. package/src/dev-tool/index.ts +4 -15
  213. package/src/in-page-ui/dev-environment.ts +33 -0
  214. package/src/in-page-ui/issue-card.test.ts +67 -0
  215. package/src/in-page-ui/issue-card.ts +500 -0
  216. package/src/in-page-ui/logo.ts +8 -0
  217. package/src/lib/hexclave-app/apps/implementations/client-app-impl.automatic-side-effects.test.ts +38 -1
  218. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +157 -0
  219. package/src/lib/hexclave-app/apps/implementations/client-app-impl.sign-out.test.ts +96 -0
  220. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +255 -37
  221. package/src/lib/hexclave-app/apps/implementations/client-app-impl.untrusted-redirect-card.test.ts +146 -0
  222. package/src/lib/hexclave-app/apps/implementations/common.ts +2 -1
  223. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.test.ts +1 -0
  224. package/src/lib/hexclave-app/teams/index.ts +3 -0
  225. package/src/pushed-config-error-overlay/index.ts +45 -386
  226. package/src/setup-error-overlay/index.test.ts +133 -0
  227. package/src/setup-error-overlay/index.ts +150 -0
  228. package/src/utils/monkey-patch.tsx +31 -0
  229. package/src/utils/react.tsx +93 -0
  230. package/dist/admin-app-impl-sTQD2d-3.d.ts.map +0 -1
  231. package/dist/client-app-BCT5p_70.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as StackClientApp } from "../client-app-BCT5p_70.js";
1
+ import { a as StackClientApp } from "../client-app-wFodsYml.js";
2
2
  //#region src/dev-tool/index.d.ts
3
3
  /**
4
4
  * Mounts the Hexclave dev tool on the page.
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/dev-tool/index.ts"],"mappings":";;;;;AAgGA;;;;;;;;AAAwF;;iBAAxE,YAAA,CAAa,GAAA,EAAK,cAAc,QAAQ,aAAA"}
@@ -2,8 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
3
3
  let ___in_page_ui_dom_js = require("../in-page-ui/dom.js");
4
4
  let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
5
- let _hexclave_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
6
- let ___generated_env_js = require("../generated/env.js");
5
+ let ___in_page_ui_dev_environment_js = require("../in-page-ui/dev-environment.js");
7
6
  //#region src/dev-tool/index.ts
8
7
  const OVERRIDE_KEY = "__hexclave-dev-tool-override";
9
8
  function getOverride() {
@@ -22,12 +21,7 @@ function shouldShow() {
22
21
  if (!(0, ___in_page_ui_dom_js.canMountIntoDom)()) return false;
23
22
  if (activeDevToolOption === true) return true;
24
23
  if (activeProjectIsDevelopmentEnvironment) return true;
25
- const nodeEnv = ___generated_env_js.envVars.NODE_ENV;
26
- if (nodeEnv !== void 0) return nodeEnv === "development";
27
- try {
28
- if (new URL(window.location.href).protocol === "file:") return true;
29
- } catch {}
30
- return (0, _hexclave_shared_dist_utils_urls.isLocalhost)(window.location.href);
24
+ return (0, ___in_page_ui_dev_environment_js.isLikelyDevelopmentEnvironment)();
31
25
  }
32
26
  let activeCleanup = null;
33
27
  let activeApp = null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["envVars"],"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":"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"}
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 { isLikelyDevelopmentEnvironment } from \"../in-page-ui/dev-environment\";\nimport { canMountIntoDom } from \"../in-page-ui/dom\";\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): every in-page UI that is only appropriate while developing shares one heuristic, so\n // the dev tool and the error cards can never disagree about whether this looks like a development environment.\n return isLikelyDevelopmentEnvironment();\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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-layout.d.ts","names":[],"sources":["../../../../src/components/elements/sidebar-layout.tsx"],"mappings":";;;KAaY,WAAA;EACV,KAAA,EAAO,KAAA,CAAM,SAAA;EACb,IAAA;EACA,WAAA,GAAc,KAAA,CAAM,SAAA;EACpB,EAAA;EACA,IAAA,GAAO,KAAA,CAAM,SAAA;EACb,OAAA,GAAU,KAAA,CAAM,SAAA;EAChB,YAAA,GAAe,KAAA,CAAM,SAAA;AAAA;AAAA,iBAGP,aAAA,CAAc,KAAA;EAAS,KAAA,EAAO,WAAA;EAAe,KAAA,GAAQ,SAAS;EAAE,SAAA;AAAA,gCAAoB,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"sidebar-layout.d.ts","names":[],"sources":["../../../../src/components/elements/sidebar-layout.tsx"],"mappings":";;;KAaY,WAAA;EACV,KAAA,EAAO,KAAA,CAAM,SAAA;EACb,IAAA;EACA,WAAA,GAAc,KAAA,CAAM,SAAA;EACpB,EAAA;EACA,IAAA,GAAO,KAAA,CAAM,SAAA;EACb,OAAA,GAAU,KAAA,CAAM,SAAA;EAChB,YAAA,GAAe,KAAA,CAAM,SAAA;AAAA;AAAA,iBAkBP,aAAA,CAAc,KAAA;EAAS,KAAA,EAAO,WAAA;EAAe,KAAA,GAAQ,SAAS;EAAE,SAAA;AAAA,gCAAoB,GAAA,CAAA,OAAA"}
@@ -1,11 +1,21 @@
1
1
  "use client";
2
2
  import { Button, Typography, cn } from "@hexclave/ui";
3
- import "react";
3
+ import React from "react";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { XIcon } from "lucide-react";
6
6
  import { useStackApp } from "../../index.js";
7
- import { useHash } from "@hexclave/shared/dist/hooks/use-hash";
7
+ import { suspendIfSsr } from "../../utils/react.js";
8
8
  //#region src/components/elements/sidebar-layout.tsx
9
+ function normalizeHash(hash) {
10
+ return hash.startsWith("#") ? hash.slice(1) : hash;
11
+ }
12
+ function useHash() {
13
+ suspendIfSsr();
14
+ return React.useSyncExternalStore((onStoreChange) => {
15
+ window.addEventListener("hashchange", onStoreChange);
16
+ return () => window.removeEventListener("hashchange", onStoreChange);
17
+ }, () => normalizeHash(window.location.hash));
18
+ }
9
19
  function SidebarLayout(props) {
10
20
  const hash = useHash();
11
21
  const selectedIndex = props.items.findIndex((item) => item.id && item.id === hash);
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar-layout.js","names":[],"sources":["../../../../src/components/elements/sidebar-layout.tsx"],"sourcesContent":["'use client';\n\n\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 { useHash } from '@hexclave/shared/dist/hooks/use-hash';\nimport { Button, Typography, cn } from '@hexclave/ui';\nimport { XIcon } from 'lucide-react';\nimport React, { ReactNode } from 'react';\nimport { useStackApp } from '../..';\n\nexport type SidebarItem = {\n title: React.ReactNode,\n type: 'item' | 'divider',\n description?: React.ReactNode,\n id?: string,\n icon?: React.ReactNode,\n content?: React.ReactNode,\n contentTitle?: React.ReactNode,\n}\n\nexport function SidebarLayout(props: { items: SidebarItem[], title?: ReactNode, className?: string }) {\n const hash = useHash();\n const selectedIndex = props.items.findIndex(item => item.id && (item.id === hash));\n return (\n <>\n <div className={cn(\"hidden sm:flex stack-scope h-full\", props.className)}>\n <DesktopLayout items={props.items} title={props.title} selectedIndex={selectedIndex} />\n </div>\n <div className={cn(\"sm:hidden stack-scope h-full\", props.className)}>\n <MobileLayout items={props.items} title={props.title} selectedIndex={selectedIndex} />\n </div>\n </>\n );\n}\n\nfunction Items(props: { items: SidebarItem[], selectedIndex: number }) {\n const app = useStackApp();\n const navigate = app.useNavigate();\n\n\n const activeItemIndex = props.selectedIndex === -1 ? 0 : props.selectedIndex;\n\n return props.items.map((item, index) => (\n item.type === 'item' ?\n <Button\n key={index}\n variant='ghost'\n size='sm'\n className={cn(\n activeItemIndex === index && \"sm:bg-muted\",\n \"justify-start text-md text-zinc-800 dark:text-zinc-300 px-2 text-left\",\n )}\n onClick={() => {\n if (item.id) {\n navigate('#' + item.id);\n }\n }}\n >\n {item.icon}\n {item.title}\n </Button> :\n <Typography key={index}>\n {item.title}\n </Typography>\n ));\n\n}\n\nfunction DesktopLayout(props: { items: SidebarItem[], title?: ReactNode, selectedIndex: number }) {\n const selectedItem = props.items[props.selectedIndex === -1 ? 0 : props.selectedIndex];\n\n return (\n <div className=\"stack-scope flex w-full h-full max-w-full relative\">\n <div className=\"flex max-w-[200px] min-w-[200px] border-r flex-col items-stretch gap-2 p-2 overflow-y-auto\">\n {props.title && <div className='mb-2 ml-2'>\n <Typography type='h2' className=\"text-lg font-semibold text-zinc-800 dark:text-zinc-300\">{props.title}</Typography>\n </div>}\n\n <Items items={props.items} selectedIndex={props.selectedIndex} />\n </div>\n <div className=\"flex-1 w-0 flex justify-center gap-4 py-2 px-4\">\n <div className='flex flex-col max-w-[800px] w-[800px]'>\n <div className='mt-4 mb-6'>\n <Typography type='h4' className='font-semibold'>{selectedItem.title}</Typography>\n {selectedItem.description && <Typography variant='secondary' type='label'>{selectedItem.description}</Typography>}\n </div>\n <div className='flex-1'>\n {selectedItem.content}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MobileLayout(props: { items: SidebarItem[], title?: ReactNode, selectedIndex: number }) {\n const selectedItem = props.items[props.selectedIndex];\n const app = useStackApp();\n const navigate = app.useNavigate();\n\n if (props.selectedIndex === -1) {\n return (\n <div className=\"flex flex-col gap-2 p-2\">\n {props.title && <div className='mb-2 ml-2'>\n <Typography type='h2' className=\"text-lg font-semibold text-zinc-800 dark:text-zinc-300\">{props.title}</Typography>\n </div>}\n\n <Items items={props.items} selectedIndex={props.selectedIndex} />\n </div>\n );\n } else {\n return (\n <div className=\"flex-1 flex flex-col gap-4 py-2 px-4\">\n <div className='flex flex-col'>\n <div className='flex justify-between'>\n <Typography type='h4' className='font-semibold'>{selectedItem.title}</Typography>\n <Button\n variant='ghost'\n size='icon'\n onClick={() => { navigate('#'); }}\n >\n <XIcon className='h-5 w-5' />\n </Button>\n </div>\n {selectedItem.description && <Typography variant='secondary' type='label'>{selectedItem.description}</Typography>}\n </div>\n <div className='flex-1'>\n {selectedItem.content}\n </div>\n </div>\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sidebar-layout.js","names":[],"sources":["../../../../src/components/elements/sidebar-layout.tsx"],"sourcesContent":["'use client';\n\n\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 { Button, Typography, cn } from '@hexclave/ui';\nimport { XIcon } from 'lucide-react';\nimport React, { ReactNode } from 'react';\nimport { useStackApp } from '../..';\nimport { suspendIfSsr } from '../../utils/react';\n\nexport type SidebarItem = {\n title: React.ReactNode,\n type: 'item' | 'divider',\n description?: React.ReactNode,\n id?: string,\n icon?: React.ReactNode,\n content?: React.ReactNode,\n contentTitle?: React.ReactNode,\n}\n\nfunction normalizeHash(hash: string) {\n return hash.startsWith(\"#\") ? hash.slice(1) : hash;\n}\n\nfunction useHash() {\n suspendIfSsr();\n return React.useSyncExternalStore(\n (onStoreChange) => {\n window.addEventListener(\"hashchange\", onStoreChange);\n return () => window.removeEventListener(\"hashchange\", onStoreChange);\n },\n () => normalizeHash(window.location.hash),\n );\n}\n\nexport function SidebarLayout(props: { items: SidebarItem[], title?: ReactNode, className?: string }) {\n const hash = useHash();\n const selectedIndex = props.items.findIndex(item => item.id && (item.id === hash));\n return (\n <>\n <div className={cn(\"hidden sm:flex stack-scope h-full\", props.className)}>\n <DesktopLayout items={props.items} title={props.title} selectedIndex={selectedIndex} />\n </div>\n <div className={cn(\"sm:hidden stack-scope h-full\", props.className)}>\n <MobileLayout items={props.items} title={props.title} selectedIndex={selectedIndex} />\n </div>\n </>\n );\n}\n\nfunction Items(props: { items: SidebarItem[], selectedIndex: number }) {\n const app = useStackApp();\n const navigate = app.useNavigate();\n\n\n const activeItemIndex = props.selectedIndex === -1 ? 0 : props.selectedIndex;\n\n return props.items.map((item, index) => (\n item.type === 'item' ?\n <Button\n key={index}\n variant='ghost'\n size='sm'\n className={cn(\n activeItemIndex === index && \"sm:bg-muted\",\n \"justify-start text-md text-zinc-800 dark:text-zinc-300 px-2 text-left\",\n )}\n onClick={() => {\n if (item.id) {\n navigate('#' + item.id);\n }\n }}\n >\n {item.icon}\n {item.title}\n </Button> :\n <Typography key={index}>\n {item.title}\n </Typography>\n ));\n\n}\n\nfunction DesktopLayout(props: { items: SidebarItem[], title?: ReactNode, selectedIndex: number }) {\n const selectedItem = props.items[props.selectedIndex === -1 ? 0 : props.selectedIndex];\n\n return (\n <div className=\"stack-scope flex w-full h-full max-w-full relative\">\n <div className=\"flex max-w-[200px] min-w-[200px] border-r flex-col items-stretch gap-2 p-2 overflow-y-auto\">\n {props.title && <div className='mb-2 ml-2'>\n <Typography type='h2' className=\"text-lg font-semibold text-zinc-800 dark:text-zinc-300\">{props.title}</Typography>\n </div>}\n\n <Items items={props.items} selectedIndex={props.selectedIndex} />\n </div>\n <div className=\"flex-1 w-0 flex justify-center gap-4 py-2 px-4\">\n <div className='flex flex-col max-w-[800px] w-[800px]'>\n <div className='mt-4 mb-6'>\n <Typography type='h4' className='font-semibold'>{selectedItem.title}</Typography>\n {selectedItem.description && <Typography variant='secondary' type='label'>{selectedItem.description}</Typography>}\n </div>\n <div className='flex-1'>\n {selectedItem.content}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction MobileLayout(props: { items: SidebarItem[], title?: ReactNode, selectedIndex: number }) {\n const selectedItem = props.items[props.selectedIndex];\n const app = useStackApp();\n const navigate = app.useNavigate();\n\n if (props.selectedIndex === -1) {\n return (\n <div className=\"flex flex-col gap-2 p-2\">\n {props.title && <div className='mb-2 ml-2'>\n <Typography type='h2' className=\"text-lg font-semibold text-zinc-800 dark:text-zinc-300\">{props.title}</Typography>\n </div>}\n\n <Items items={props.items} selectedIndex={props.selectedIndex} />\n </div>\n );\n } else {\n return (\n <div className=\"flex-1 flex flex-col gap-4 py-2 px-4\">\n <div className='flex flex-col'>\n <div className='flex justify-between'>\n <Typography type='h4' className='font-semibold'>{selectedItem.title}</Typography>\n <Button\n variant='ghost'\n size='icon'\n onClick={() => { navigate('#'); }}\n >\n <XIcon className='h-5 w-5' />\n </Button>\n </div>\n {selectedItem.description && <Typography variant='secondary' type='label'>{selectedItem.description}</Typography>}\n </div>\n <div className='flex-1'>\n {selectedItem.content}\n </div>\n </div>\n );\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region src/components-page/team-invitation-cache.d.ts
2
+ declare function cacheTeamInvitationOperation<TApp extends object, TResult>(operation: (app: TApp, code: string) => Promise<TResult>): (app: TApp, session: object, code: string) => Promise<TResult>;
3
+ //#endregion
4
+ export { cacheTeamInvitationOperation };
5
+ //# sourceMappingURL=team-invitation-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-invitation-cache.d.ts","names":[],"sources":["../../../src/components-page/team-invitation-cache.ts"],"mappings":";iBAMgB,4BAAA,+BACd,SAAA,GAAY,GAAA,EAAK,IAAA,EAAM,IAAA,aAAiB,OAAA,CAAQ,OAAA,KAC9C,GAAA,EAAK,IAAA,EAAM,OAAA,UAAiB,IAAA,aAAiB,OAAA,CAAQ,OAAA"}
@@ -0,0 +1,11 @@
1
+ import { cacheFunction } from "@hexclave/shared/dist/utils/caches";
2
+ //#region src/components-page/team-invitation-cache.ts
3
+ function cacheTeamInvitationOperation(operation) {
4
+ return cacheFunction(async (app, _session, code) => {
5
+ return await operation(app, code);
6
+ });
7
+ }
8
+ //#endregion
9
+ export { cacheTeamInvitationOperation };
10
+
11
+ //# sourceMappingURL=team-invitation-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-invitation-cache.js","names":[],"sources":["../../../src/components-page/team-invitation-cache.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 { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\n\nexport function cacheTeamInvitationOperation<TApp extends object, TResult>(\n operation: (app: TApp, code: string) => Promise<TResult>,\n): (app: TApp, session: object, code: string) => Promise<TResult> {\n return cacheFunction(async (app: TApp, _session: object, code: string) => {\n return await operation(app, code);\n });\n}\n"],"mappings":";;AAMA,SAAgB,6BACd,WACgE;CAChE,OAAO,cAAc,OAAO,KAAW,UAAkB,SAAiB;EACxE,OAAO,MAAM,UAAU,KAAK,IAAI;CAClC,CAAC;AACH"}
@@ -0,0 +1,24 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { cacheTeamInvitationOperation } from "./team-invitation-cache.js";
3
+ //#region src/components-page/team-invitation-cache.test.ts
4
+ describe("cacheTeamInvitationOperation", () => {
5
+ it("reuses results within a session but not across sessions", async () => {
6
+ let resultNumber = 0;
7
+ const operation = vi.fn(async (_app, _code) => {
8
+ resultNumber += 1;
9
+ return resultNumber;
10
+ });
11
+ const cachedOperation = cacheTeamInvitationOperation(operation);
12
+ const app = {};
13
+ const firstSession = {};
14
+ const secondSession = {};
15
+ await expect(cachedOperation(app, firstSession, "shared-code")).resolves.toBe(1);
16
+ await expect(cachedOperation(app, firstSession, "shared-code")).resolves.toBe(1);
17
+ await expect(cachedOperation(app, secondSession, "shared-code")).resolves.toBe(2);
18
+ expect(operation).toHaveBeenCalledTimes(2);
19
+ });
20
+ });
21
+ //#endregion
22
+ export {};
23
+
24
+ //# sourceMappingURL=team-invitation-cache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-invitation-cache.test.js","names":[],"sources":["../../../src/components-page/team-invitation-cache.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { describe, expect, it, vi } from \"vitest\";\nimport { cacheTeamInvitationOperation } from \"./team-invitation-cache\";\n\ndescribe(\"cacheTeamInvitationOperation\", () => {\n it(\"reuses results within a session but not across sessions\", async () => {\n let resultNumber = 0;\n const operation = vi.fn(async (_app: object, _code: string) => {\n resultNumber += 1;\n return resultNumber;\n });\n const cachedOperation = cacheTeamInvitationOperation(operation);\n const app = {};\n const firstSession = {};\n const secondSession = {};\n\n await expect(cachedOperation(app, firstSession, \"shared-code\")).resolves.toBe(1);\n await expect(cachedOperation(app, firstSession, \"shared-code\")).resolves.toBe(1);\n await expect(cachedOperation(app, secondSession, \"shared-code\")).resolves.toBe(2);\n expect(operation).toHaveBeenCalledTimes(2);\n });\n});\n"],"mappings":";;;AAOA,SAAS,sCAAsC;CAC7C,GAAG,2DAA2D,YAAY;EACxE,IAAI,eAAe;EACnB,MAAM,YAAY,GAAG,GAAG,OAAO,MAAc,UAAkB;GAC7D,gBAAgB;GAChB,OAAO;EACT,CAAC;EACD,MAAM,kBAAkB,6BAA6B,SAAS;EAC9D,MAAM,MAAM,CAAC;EACb,MAAM,eAAe,CAAC;EACtB,MAAM,gBAAgB,CAAC;EAEvB,MAAM,OAAO,gBAAgB,KAAK,cAAc,aAAa,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC;EAC/E,MAAM,OAAO,gBAAgB,KAAK,cAAc,aAAa,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC;EAC/E,MAAM,OAAO,gBAAgB,KAAK,eAAe,aAAa,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC;EAChF,OAAO,SAAS,CAAC,CAAC,sBAAsB,CAAC;CAC3C,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"team-invitation.d.ts","names":[],"sources":["../../../src/components-page/team-invitation.tsx"],"mappings":";iBAyEgB,cAAA;EAAiB,QAAA;EAAgB;AAAA;EAAkB,QAAA;EAAoB,YAAA,EAAc,MAAA;AAAA,gCAAwB,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"team-invitation.d.ts","names":[],"sources":["../../../src/components-page/team-invitation.tsx"],"mappings":";iBA2EgB,cAAA;EAAiB,QAAA;EAAgB;AAAA;EAAkB,QAAA;EAAoB,YAAA,EAAc,MAAA;AAAA,gCAAwB,GAAA,CAAA,OAAA"}
@@ -8,12 +8,12 @@ import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import { KnownErrors } from "@hexclave/shared";
9
9
  import { use } from "@hexclave/shared/dist/utils/react";
10
10
  import { PredefinedMessageCard } from "../components/message-cards/predefined-message-card.js";
11
- import { cacheFunction } from "@hexclave/shared/dist/utils/caches";
11
+ import { cacheTeamInvitationOperation } from "./team-invitation-cache.js";
12
12
  //#region src/components-page/team-invitation.tsx
13
- const cachedVerifyInvitation = cacheFunction(async (hexclaveApp, code) => {
13
+ const cachedVerifyInvitation = cacheTeamInvitationOperation(async (hexclaveApp, code) => {
14
14
  return await hexclaveApp.verifyTeamInvitationCode(code);
15
15
  });
16
- const cachedGetInvitationDetails = cacheFunction(async (hexclaveApp, code) => {
16
+ const cachedGetInvitationDetails = cacheTeamInvitationOperation(async (hexclaveApp, code) => {
17
17
  return await hexclaveApp.getTeamInvitationDetails(code);
18
18
  });
19
19
  function TeamInvitationInner(props) {
@@ -21,7 +21,7 @@ function TeamInvitationInner(props) {
21
21
  const hexclaveApp = useStackApp();
22
22
  const [success, setSuccess] = React.useState(false);
23
23
  const [errorMessage, setErrorMessage] = React.useState(null);
24
- const details = use(cachedGetInvitationDetails(hexclaveApp, props.searchParams.code || ""));
24
+ const details = use(cachedGetInvitationDetails(hexclaveApp, props.session, props.searchParams.code || ""));
25
25
  if (errorMessage || details.status === "error") return /* @__PURE__ */ jsx(PredefinedMessageCard, {
26
26
  type: "unknownError",
27
27
  fullPage: props.fullPage
@@ -85,7 +85,7 @@ function TeamInvitation({ fullPage = false, searchParams }) {
85
85
  secondaryAction: () => hexclaveApp.redirectToHome(),
86
86
  children: /* @__PURE__ */ jsx(Typography, { children: t("Please complete your account setup before joining teams.") })
87
87
  });
88
- const verificationResult = use(cachedVerifyInvitation(hexclaveApp, searchParams.code || ""));
88
+ const verificationResult = use(cachedVerifyInvitation(hexclaveApp, user._internalSession, searchParams.code || ""));
89
89
  if (verificationResult.status === "error") {
90
90
  const error = verificationResult.error;
91
91
  if (KnownErrors.VerificationCodeNotFound.isInstance(error)) return invalidJsx;
@@ -95,8 +95,9 @@ function TeamInvitation({ fullPage = false, searchParams }) {
95
95
  }
96
96
  return /* @__PURE__ */ jsx(TeamInvitationInner, {
97
97
  fullPage,
98
- searchParams
99
- });
98
+ searchParams,
99
+ session: user._internalSession
100
+ }, user.id);
100
101
  }
101
102
  //#endregion
102
103
  export { TeamInvitation };
@@ -1 +1 @@
1
- {"version":3,"file":"team-invitation.js","names":[],"sources":["../../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\n\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 { KnownErrors } from \"@hexclave/shared\";\nimport { cacheFunction } from \"@hexclave/shared/dist/utils/caches\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { use } from \"@hexclave/shared/dist/utils/react\";\nimport { Typography } from \"@hexclave/ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\n\nconst cachedVerifyInvitation = cacheFunction(async (hexclaveApp: StackClientApp<true>, code: string) => {\n return await hexclaveApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheFunction(async (hexclaveApp: StackClientApp<true>, code: string) => {\n return await hexclaveApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = use(cachedGetInvitationDetails(hexclaveApp, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go home\"\n primaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>You have successfully joined {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n }\n\n\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText={t('Join')}\n primaryAction={() => runAsynchronouslyWithAlert(async () => {\n const result = await hexclaveApp.acceptTeamInvitation(props.searchParams.code || '');\n if (result.status === 'error') {\n setErrorMessage(result.error.message);\n } else {\n setSuccess(true);\n }\n })}\n secondaryButtonText={t('Ignore')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>You are invited to join {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n}\n\nexport function TeamInvitation({ fullPage=false, searchParams }: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n // Include restricted users to detect if user needs to complete onboarding\n const user = useUser({ includeRestricted: true });\n const hexclaveApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t('Invalid Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Please double check if you have the correct team invitation link.')}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t('Expired Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Your team invitation link has expired. Please request a new team invitation link ')}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t('Used Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('This team invitation link has already been used.')}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n if (!user) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={fullPage}\n primaryButtonText={t('Sign in')}\n primaryAction={() => hexclaveApp.redirectToSignIn()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>{t('Sign in or create an account to join the team.')}</Typography>\n </MessageCard>\n );\n }\n\n // User is restricted (needs to complete onboarding) - redirect to onboarding\n if (user.isRestricted) {\n return (\n <MessageCard\n title={t('Complete your account setup')}\n fullPage={fullPage}\n primaryButtonText={t('Complete setup')}\n primaryAction={() => hexclaveApp.redirectToOnboarding()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>{t('Please complete your account setup before joining teams.')}</Typography>\n </MessageCard>\n );\n }\n\n const verificationResult = use(cachedVerifyInvitation(hexclaveApp, searchParams.code || ''));\n\n if (verificationResult.status === 'error') {\n const error = verificationResult.error;\n if (KnownErrors.VerificationCodeNotFound.isInstance(error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(error)) {\n return usedJsx;\n } else {\n throw error;\n }\n }\n\n return <TeamInvitationInner fullPage={fullPage} searchParams={searchParams} />;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"team-invitation.js","names":[],"sources":["../../../src/components-page/team-invitation.tsx"],"sourcesContent":["'use client';\n\n\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 { KnownErrors } from \"@hexclave/shared\";\nimport { runAsynchronouslyWithAlert } from \"@hexclave/shared/dist/utils/promises\";\nimport { use } from \"@hexclave/shared/dist/utils/react\";\nimport { Typography } from \"@hexclave/ui\";\nimport React from \"react\";\nimport { MessageCard, StackClientApp, useStackApp, useUser } from \"..\";\nimport { PredefinedMessageCard } from \"../components/message-cards/predefined-message-card\";\nimport { useTranslation } from \"../lib/translations\";\nimport { cacheTeamInvitationOperation } from \"./team-invitation-cache\";\n\n// Both endpoints inspect the current account, so the session must participate in\n// the key even though the SDK app object and invitation code are otherwise stable.\nconst cachedVerifyInvitation = cacheTeamInvitationOperation(async (hexclaveApp: StackClientApp<true>, code: string) => {\n return await hexclaveApp.verifyTeamInvitationCode(code);\n});\n\nconst cachedGetInvitationDetails = cacheTeamInvitationOperation(async (hexclaveApp: StackClientApp<true>, code: string) => {\n return await hexclaveApp.getTeamInvitationDetails(code);\n});\n\nfunction TeamInvitationInner(props: { fullPage?: boolean, searchParams: Record<string, string>, session: object }) {\n const { t } = useTranslation();\n const hexclaveApp = useStackApp();\n const [success, setSuccess] = React.useState(false);\n const [errorMessage, setErrorMessage] = React.useState<string | null>(null);\n const details = use(cachedGetInvitationDetails(hexclaveApp, props.session, props.searchParams.code || ''));\n\n if (errorMessage || details.status === 'error') {\n return (\n <PredefinedMessageCard type=\"unknownError\" fullPage={props.fullPage} />\n );\n }\n\n if (success) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText=\"Go home\"\n primaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>You have successfully joined {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n }\n\n\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={props.fullPage}\n primaryButtonText={t('Join')}\n primaryAction={() => runAsynchronouslyWithAlert(async () => {\n const result = await hexclaveApp.acceptTeamInvitation(props.searchParams.code || '');\n if (result.status === 'error') {\n setErrorMessage(result.error.message);\n } else {\n setSuccess(true);\n }\n })}\n secondaryButtonText={t('Ignore')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>You are invited to join {details.data.teamDisplayName}</Typography>\n </MessageCard>\n );\n}\n\nexport function TeamInvitation({ fullPage=false, searchParams }: { fullPage?: boolean, searchParams: Record<string, string> }) {\n const { t } = useTranslation();\n // Include restricted users to detect if user needs to complete onboarding\n const user = useUser({ includeRestricted: true });\n const hexclaveApp = useStackApp();\n\n const invalidJsx = (\n <MessageCard title={t('Invalid Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Please double check if you have the correct team invitation link.')}</Typography>\n </MessageCard>\n );\n\n const expiredJsx = (\n <MessageCard title={t('Expired Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('Your team invitation link has expired. Please request a new team invitation link ')}</Typography>\n </MessageCard>\n );\n\n const usedJsx = (\n <MessageCard title={t('Used Team Invitation Link')} fullPage={fullPage}>\n <Typography>{t('This team invitation link has already been used.')}</Typography>\n </MessageCard>\n );\n\n const code = searchParams.code;\n if (!code) {\n return invalidJsx;\n }\n\n if (!user) {\n return (\n <MessageCard\n title={t('Team invitation')}\n fullPage={fullPage}\n primaryButtonText={t('Sign in')}\n primaryAction={() => hexclaveApp.redirectToSignIn()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>{t('Sign in or create an account to join the team.')}</Typography>\n </MessageCard>\n );\n }\n\n // User is restricted (needs to complete onboarding) - redirect to onboarding\n if (user.isRestricted) {\n return (\n <MessageCard\n title={t('Complete your account setup')}\n fullPage={fullPage}\n primaryButtonText={t('Complete setup')}\n primaryAction={() => hexclaveApp.redirectToOnboarding()}\n secondaryButtonText={t('Cancel')}\n secondaryAction={() => hexclaveApp.redirectToHome()}\n >\n <Typography>{t('Please complete your account setup before joining teams.')}</Typography>\n </MessageCard>\n );\n }\n\n const verificationResult = use(cachedVerifyInvitation(hexclaveApp, user._internalSession, searchParams.code || ''));\n\n if (verificationResult.status === 'error') {\n const error = verificationResult.error;\n if (KnownErrors.VerificationCodeNotFound.isInstance(error)) {\n return invalidJsx;\n } else if (KnownErrors.VerificationCodeExpired.isInstance(error)) {\n return expiredJsx;\n } else if (KnownErrors.VerificationCodeAlreadyUsed.isInstance(error)) {\n return usedJsx;\n } else {\n throw error;\n }\n }\n\n return (\n <TeamInvitationInner\n key={user.id}\n fullPage={fullPage}\n searchParams={searchParams}\n session={user._internalSession}\n />\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev-tool-core.d.ts","names":[],"sources":["../../../src/dev-tool/dev-tool-core.ts"],"mappings":";;;iBAkyEgB,aAAA,CAAc,GAAyB,EAApB,cAAc"}
1
+ {"version":3,"file":"dev-tool-core.d.ts","names":[],"sources":["../../../src/dev-tool/dev-tool-core.ts"],"mappings":";;;iBA+xEgB,aAAA,CAAc,GAAyB,EAApB,cAAc"}
@@ -4,6 +4,7 @@ import { getGlobalUiInstance, h, hasAppendChild, setGlobalUiInstance, setHtml }
4
4
  import { hexclaveAppInternalsSymbol } from "../lib/hexclave-app/common.js";
5
5
  import { isLocalhost } from "@hexclave/shared/dist/utils/urls";
6
6
  import { getPagePrompt } from "../lib/hexclave-app/url-targets.js";
7
+ import { HEXCLAVE_LOGO_SVG } from "../in-page-ui/logo.js";
7
8
  import { getBaseUrl } from "../lib/hexclave-app/apps/implementations/common.js";
8
9
  import { devToolCSS } from "./dev-tool-styles.js";
9
10
  import { clampTriggerPosition, getSnappedTriggerPlacement, resolveTriggerPosition } from "./dev-tool-trigger-position.js";
@@ -56,7 +57,6 @@ const DEFAULT_STATE = {
56
57
  panelWidth: 800,
57
58
  panelHeight: 520
58
59
  };
59
- const HEXCLAVE_LOGO_SVG = "<svg width=\"16\" height=\"16\" viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linejoin=\"miter\"><path d=\"M 24 4 L 41.32 14 L 41.32 34 L 24 44 L 6.68 34 L 6.68 14 Z\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(120 24 24)\"/><path d=\"M 11 16.87 L 14 15.13 L 14 32.87 L 11 31.13 Z\" fill=\"currentColor\" stroke=\"none\" transform=\"rotate(240 24 24)\"/></svg>";
60
60
  function loadState() {
61
61
  try {
62
62
  const stored = localStorage.getItem(STORAGE_KEY);