@hexclave/js 1.0.2 → 1.0.5

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 (450) hide show
  1. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  2. package/dist/dev-tool/dev-tool-core.js +11 -11
  3. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  4. package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
  5. package/dist/dev-tool/dev-tool-styles.js +371 -371
  6. package/dist/dev-tool/dev-tool-styles.js.map +1 -1
  7. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
  8. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  9. package/dist/dev-tool/index.d.ts +4 -4
  10. package/dist/dev-tool/index.js +4 -4
  11. package/dist/dev-tool/index.js.map +1 -1
  12. package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
  13. package/dist/esm/dev-tool/dev-tool-core.js +10 -10
  14. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  15. package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
  16. package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
  17. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
  18. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
  19. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  20. package/dist/esm/dev-tool/index.d.ts +4 -4
  21. package/dist/esm/dev-tool/index.js +4 -4
  22. package/dist/esm/dev-tool/index.js.map +1 -1
  23. package/dist/esm/index.d.ts +1 -1
  24. package/dist/esm/index.js +1 -1
  25. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  26. package/dist/esm/integrations/convex.js +1 -1
  27. package/dist/esm/integrations/convex.js.map +1 -1
  28. package/dist/esm/lib/auth.js.map +1 -1
  29. package/dist/esm/lib/auth.test.js.map +1 -1
  30. package/dist/esm/lib/cookie.js.map +1 -1
  31. package/dist/esm/lib/env.js.map +1 -1
  32. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
  33. package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
  34. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  35. package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
  36. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  37. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  38. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +7 -7
  39. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  40. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  41. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  42. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
  43. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  44. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +23 -30
  45. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  46. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  47. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  48. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
  49. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  50. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +6 -6
  51. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  52. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  53. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
  54. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  55. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  56. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  57. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  58. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  59. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  60. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
  61. package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  62. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  63. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  64. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  65. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  66. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  67. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  68. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +5 -5
  69. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  70. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  71. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  72. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  73. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  74. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  75. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  76. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  77. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
  78. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  79. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  80. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  81. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  82. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  83. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
  84. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
  85. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  86. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  87. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
  88. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
  89. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  90. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  91. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
  92. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
  93. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  94. package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  95. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
  96. package/dist/esm/lib/hexclave-app/common.js +7 -0
  97. package/dist/esm/lib/hexclave-app/common.js.map +1 -0
  98. package/dist/{lib/stack-app → esm/lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
  99. package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
  100. package/dist/{lib/stack-app → esm/lib/hexclave-app}/contact-channels/index.d.ts +1 -1
  101. package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
  102. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  103. package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
  104. package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  105. package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
  106. package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  107. package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
  108. package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  109. package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
  110. package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
  111. package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
  112. package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  113. package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
  114. package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  115. package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
  116. package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  117. package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
  118. package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  119. package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  120. package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  121. package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
  122. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
  123. package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
  124. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  125. package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
  126. package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  127. package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
  128. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  129. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
  130. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  131. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
  132. package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
  133. package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
  134. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  135. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
  136. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  137. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
  138. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  139. package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
  140. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  141. package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
  142. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  143. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
  144. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  145. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
  146. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  147. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
  148. package/dist/esm/utils/url.js.map +1 -1
  149. package/dist/index.d.ts +15 -15
  150. package/dist/index.js +3 -3
  151. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  152. package/dist/integrations/convex.js +2 -2
  153. package/dist/integrations/convex.js.map +1 -1
  154. package/dist/lib/auth.js.map +1 -1
  155. package/dist/lib/auth.test.js.map +1 -1
  156. package/dist/lib/cookie.js.map +1 -1
  157. package/dist/lib/env.js.map +1 -1
  158. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
  159. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
  160. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  161. package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
  162. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  163. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  164. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +5 -5
  165. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  166. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  167. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  168. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
  169. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  170. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +22 -29
  171. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  172. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  173. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  174. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
  175. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts.map +1 -1
  176. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +5 -5
  177. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  178. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  179. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
  180. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  181. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  182. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  183. package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  184. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  185. package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  186. package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
  187. package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  188. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  189. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  190. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  191. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  192. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  193. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
  194. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +4 -4
  195. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  196. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  197. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
  198. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  199. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  200. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  201. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  202. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  203. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
  204. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  205. package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  206. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  207. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  208. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  209. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
  210. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
  211. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  212. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  213. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
  214. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
  215. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  216. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  217. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
  218. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
  219. package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  220. package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  221. package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
  222. package/dist/lib/hexclave-app/common.js +9 -0
  223. package/dist/lib/hexclave-app/common.js.map +1 -0
  224. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
  225. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
  226. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts +1 -1
  227. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
  228. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  229. package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
  230. package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  231. package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
  232. package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  233. package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
  234. package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  235. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
  236. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
  237. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
  238. package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  239. package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
  240. package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  241. package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
  242. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  243. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
  244. package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  245. package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  246. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  247. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
  248. package/dist/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
  249. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
  250. package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  251. package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
  252. package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  253. package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
  254. package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  255. package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
  256. package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  257. package/dist/lib/hexclave-app/projects/index.js.map +1 -0
  258. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
  259. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
  260. package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  261. package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
  262. package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  263. package/dist/lib/hexclave-app/teams/index.js.map +1 -0
  264. package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  265. package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
  266. package/dist/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  267. package/dist/lib/hexclave-app/url-targets.js.map +1 -0
  268. package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  269. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
  270. package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  271. package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
  272. package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  273. package/dist/lib/hexclave-app/users/index.js.map +1 -0
  274. package/dist/utils/url.js.map +1 -1
  275. package/package.json +4 -3
  276. package/src/dev-tool/dev-tool-core.ts +2460 -0
  277. package/src/dev-tool/dev-tool-styles.ts +2758 -0
  278. package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
  279. package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
  280. package/src/dev-tool/index.ts +149 -0
  281. package/src/index.ts +12 -0
  282. package/src/integrations/convex/component/README.md +74 -0
  283. package/src/integrations/convex/component/convex.config.ts +9 -0
  284. package/src/integrations/convex.ts +28 -0
  285. package/src/lib/auth.test.ts +67 -0
  286. package/src/lib/auth.ts +175 -0
  287. package/src/lib/cookie.ts +327 -0
  288. package/src/lib/env.ts +93 -0
  289. package/src/lib/hexclave-app/api-keys/index.ts +73 -0
  290. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1159 -0
  291. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +141 -0
  292. package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
  293. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3525 -0
  294. package/src/lib/hexclave-app/apps/implementations/common.ts +190 -0
  295. package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
  296. package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
  297. package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
  298. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
  299. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1322 -0
  300. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
  301. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
  302. package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
  303. package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
  304. package/src/lib/hexclave-app/apps/index.ts +40 -0
  305. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +189 -0
  306. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +172 -0
  307. package/src/lib/hexclave-app/apps/interfaces/server-app.ts +114 -0
  308. package/src/lib/hexclave-app/common.ts +209 -0
  309. package/src/lib/hexclave-app/connected-accounts/index.ts +47 -0
  310. package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
  311. package/src/lib/hexclave-app/customers/index.ts +158 -0
  312. package/src/lib/hexclave-app/data-vault/index.ts +12 -0
  313. package/src/lib/hexclave-app/email/index.ts +280 -0
  314. package/src/lib/hexclave-app/email-templates/index.ts +24 -0
  315. package/src/lib/hexclave-app/index.ts +146 -0
  316. package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
  317. package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
  318. package/src/lib/hexclave-app/permissions/index.ts +75 -0
  319. package/src/lib/hexclave-app/project-configs/index.ts +103 -0
  320. package/src/lib/hexclave-app/projects/index.ts +234 -0
  321. package/src/lib/hexclave-app/session-replays/index.ts +72 -0
  322. package/src/lib/hexclave-app/teams/index.ts +203 -0
  323. package/src/lib/hexclave-app/url-targets.test.ts +253 -0
  324. package/src/lib/hexclave-app/url-targets.ts +395 -0
  325. package/src/lib/hexclave-app/users/index.ts +495 -0
  326. package/src/utils/url.ts +24 -0
  327. package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
  328. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  329. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  330. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  331. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  332. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  333. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  334. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
  335. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  336. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  337. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
  338. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  339. package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
  340. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
  341. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  342. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  343. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  344. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  345. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  346. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  347. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  348. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  349. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  350. package/dist/esm/lib/stack-app/common.js +0 -7
  351. package/dist/esm/lib/stack-app/common.js.map +0 -1
  352. package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
  353. package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
  354. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
  355. package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
  356. package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
  357. package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
  358. package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
  359. package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
  360. package/dist/esm/lib/stack-app/users/index.js.map +0 -1
  361. package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
  362. package/dist/lib/stack-app/api-keys/index.js.map +0 -1
  363. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  364. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  365. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  366. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  367. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  368. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  369. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  370. package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
  371. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
  372. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  373. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  374. package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
  375. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  376. package/dist/lib/stack-app/apps/implementations/index.js +0 -31
  377. package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
  378. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
  379. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  380. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
  381. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  382. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
  383. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  384. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  385. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
  386. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  387. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  388. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
  389. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  390. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
  391. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  392. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
  393. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  394. package/dist/lib/stack-app/common.d.ts.map +0 -1
  395. package/dist/lib/stack-app/common.js +0 -9
  396. package/dist/lib/stack-app/common.js.map +0 -1
  397. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
  398. package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
  399. package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
  400. package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
  401. package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
  402. package/dist/lib/stack-app/email/index.d.ts.map +0 -1
  403. package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
  404. package/dist/lib/stack-app/email-templates/index.js.map +0 -1
  405. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
  406. package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
  407. package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
  408. package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
  409. package/dist/lib/stack-app/permissions/index.js.map +0 -1
  410. package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
  411. package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
  412. package/dist/lib/stack-app/projects/index.js.map +0 -1
  413. package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
  414. package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
  415. package/dist/lib/stack-app/teams/index.js.map +0 -1
  416. package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
  417. package/dist/lib/stack-app/url-targets.js.map +0 -1
  418. package/dist/lib/stack-app/url-targets.test.js.map +0 -1
  419. package/dist/lib/stack-app/users/index.d.ts.map +0 -1
  420. package/dist/lib/stack-app/users/index.js.map +0 -1
  421. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  422. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  423. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  424. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  425. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  426. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  427. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  428. /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  429. /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  430. /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  431. /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  432. /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  433. /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  434. /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  435. /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
  436. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  437. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  438. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  439. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  440. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  441. /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  442. /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  443. /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  444. /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  445. /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  446. /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  447. /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  448. /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  449. /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  450. /package/dist/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
@@ -0,0 +1,253 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { afterEach, describe, expect, it, vi } from "vitest";
6
+ import { buildCliAuthConfirmUrl, getPagePrompt, isLocalHandlerUrlTarget, resolveHandlerUrls, resolveUnknownHandlerPathFallbackUrl } from "./url-targets";
7
+
8
+ describe("handler URL targets", () => {
9
+ afterEach(() => {
10
+ vi.unstubAllEnvs();
11
+ });
12
+
13
+ it("treats handler-component targets the same as omitted values", () => {
14
+ const urls = resolveHandlerUrls({
15
+ projectId: "project-id",
16
+ urls: {
17
+ handler: "/custom-handler",
18
+ signIn: { type: "handler-component" },
19
+ },
20
+ });
21
+
22
+ expect(urls.signIn).toBe("/custom-handler/sign-in");
23
+ });
24
+
25
+ it("treats custom v0 page targets like legacy string targets", () => {
26
+ const urls = resolveHandlerUrls({
27
+ projectId: "project-id",
28
+ urls: {
29
+ handler: "/custom-handler",
30
+ signIn: { type: "handler-component" },
31
+ signUp: { type: "custom", url: "/sign-up-explicit", version: 0 },
32
+ },
33
+ });
34
+
35
+ expect(urls.signIn).toBe("/custom-handler/sign-in");
36
+ expect(urls.signUp).toBe("/sign-up-explicit");
37
+ });
38
+
39
+ it("throws on v0 custom target for handler page", () => {
40
+ expect(() => resolveHandlerUrls({
41
+ projectId: "project-id",
42
+ urls: {
43
+ handler: { type: "custom", url: "/custom-handler", version: 0 },
44
+ },
45
+ })).toThrowError(/cannot be a custom page/);
46
+ });
47
+
48
+ it("supports the latest documented custom target version", () => {
49
+ const signInPrompt = getPagePrompt("signIn");
50
+ if (signInPrompt == null) {
51
+ throw new Error("Expected signIn prompt metadata to exist");
52
+ }
53
+
54
+ const urls = resolveHandlerUrls({
55
+ projectId: "project-id",
56
+ urls: {
57
+ signIn: { type: "custom", url: "/custom-sign-in", version: signInPrompt.latestVersion },
58
+ },
59
+ });
60
+
61
+ expect(urls.signIn).toBe("/custom-sign-in");
62
+ });
63
+
64
+ it("throws on custom target versions newer than the latest supported version", () => {
65
+ const signInPrompt = getPagePrompt("signIn");
66
+ if (signInPrompt == null) {
67
+ throw new Error("Expected signIn prompt metadata to exist");
68
+ }
69
+
70
+ expect(() => resolveHandlerUrls({
71
+ projectId: "project-id",
72
+ urls: {
73
+ signIn: { type: "custom", url: "/custom-sign-in", version: signInPrompt.latestVersion + 1 },
74
+ },
75
+ })).toThrowError(/Unsupported custom page version/);
76
+ });
77
+
78
+ it("throws on non-zero custom version for handler page", () => {
79
+ expect(() => resolveHandlerUrls({
80
+ projectId: "project-id",
81
+ urls: {
82
+ handler: { type: "custom", url: "/custom-handler", version: 1 },
83
+ },
84
+ })).toThrowError(/cannot be a custom page/);
85
+ });
86
+
87
+ it("uses hosted defaults for unspecified URLs", () => {
88
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
89
+
90
+ const urls = resolveHandlerUrls({
91
+ projectId: "project-id",
92
+ urls: {
93
+ signUp: "/sign-up",
94
+ default: { type: "hosted" },
95
+ },
96
+ });
97
+
98
+ expect(urls.signUp).toBe("/sign-up");
99
+ expect(urls.signIn).toBe("https://project-id.example-stack-hosted.test/handler/sign-in");
100
+ expect(urls.cliAuthConfirm).toBe("https://project-id.example-stack-hosted.test/handler/cli-auth-confirm");
101
+ });
102
+
103
+ it("rejects absolute OAuth callback string targets", () => {
104
+ expect(() => resolveHandlerUrls({
105
+ projectId: "project-id",
106
+ urls: {
107
+ oauthCallback: "https://app.example.test/oauth-callback",
108
+ },
109
+ })).toThrowErrorMatchingInlineSnapshot(`
110
+ [HexclaveAssertionError: OAuth callback URLs must be relative.
111
+
112
+ This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]
113
+ `);
114
+ });
115
+
116
+ it("rejects absolute OAuth callback custom targets", () => {
117
+ expect(() => resolveHandlerUrls({
118
+ projectId: "project-id",
119
+ urls: {
120
+ oauthCallback: { type: "custom", url: "https://app.example.test/oauth-callback", version: 0 },
121
+ },
122
+ })).toThrowErrorMatchingInlineSnapshot(`
123
+ [HexclaveAssertionError: OAuth callback URLs must be relative.
124
+
125
+ This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]
126
+ `);
127
+ });
128
+
129
+ it("inherits a hosted default target for the OAuth callback", () => {
130
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
131
+
132
+ const urls = resolveHandlerUrls({
133
+ projectId: "project-id",
134
+ urls: {
135
+ default: { type: "hosted" },
136
+ },
137
+ });
138
+
139
+ expect(urls.signIn).toBe("https://project-id.example-stack-hosted.test/handler/sign-in");
140
+ expect(urls.oauthCallback).toBe("https://project-id.example-stack-hosted.test/handler/oauth-callback");
141
+ });
142
+
143
+ it("supports custom CLI auth confirmation targets", () => {
144
+ const cliAuthConfirmPrompt = getPagePrompt("cliAuthConfirm");
145
+ if (cliAuthConfirmPrompt == null) {
146
+ throw new Error("Expected cliAuthConfirm prompt metadata to exist");
147
+ }
148
+
149
+ const urls = resolveHandlerUrls({
150
+ projectId: "project-id",
151
+ urls: {
152
+ cliAuthConfirm: { type: "custom", url: "/cli/authorize", version: cliAuthConfirmPrompt.latestVersion },
153
+ },
154
+ });
155
+
156
+ expect(urls.cliAuthConfirm).toBe("/cli/authorize");
157
+ });
158
+
159
+ it("builds CLI auth login URLs from the resolved confirmation target", () => {
160
+ expect(buildCliAuthConfirmUrl({
161
+ cliAuthConfirmUrl: "/cli/authorize",
162
+ appUrl: "https://app.example.test/base",
163
+ loginCode: "login-code",
164
+ })).toBe("https://app.example.test/cli/authorize?login_code=login-code");
165
+ });
166
+
167
+ it("uses default target for unknown /handler/* pages", () => {
168
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX", ".example-stack-hosted.test");
169
+
170
+ const url = resolveUnknownHandlerPathFallbackUrl({
171
+ defaultTarget: { type: "hosted" },
172
+ projectId: "project-id",
173
+ unknownPath: "custom-page",
174
+ });
175
+
176
+ expect(url).toBe("https://project-id.example-stack-hosted.test/handler/custom-page");
177
+ });
178
+
179
+ it("uses the full hosted handler URL template when configured", () => {
180
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://{projectId}.localhost:${NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81}09/{hostedPath}");
181
+ vi.stubEnv("NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX", "93");
182
+
183
+ const urls = resolveHandlerUrls({
184
+ projectId: "project-id",
185
+ urls: {
186
+ default: { type: "hosted" },
187
+ },
188
+ });
189
+
190
+ expect(urls.signIn).toBe("http://project-id.localhost:9309/handler/sign-in");
191
+ expect(urls.accountSettings).toBe("http://project-id.localhost:9309/handler/account-settings");
192
+ });
193
+
194
+ it("validates the hosted handler URL template placeholders", () => {
195
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/handler");
196
+
197
+ expect(() => resolveHandlerUrls({
198
+ projectId: "project-id",
199
+ urls: {
200
+ default: { type: "hosted" },
201
+ },
202
+ })).toThrowError(/\{projectId\} and \{hostedPath\}/);
203
+ });
204
+
205
+ it("rejects hosted handler URL templates that put the project ID in the path", () => {
206
+ vi.stubEnv("NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE", "http://localhost:9309/{projectId}/{hostedPath}");
207
+
208
+ expect(() => resolveHandlerUrls({
209
+ projectId: "project-id",
210
+ urls: {
211
+ default: { type: "hosted" },
212
+ },
213
+ })).toThrowErrorMatchingInlineSnapshot(`
214
+ [HexclaveAssertionError: The hosted handler URL template must put {projectId} in the hostname.
215
+
216
+ This is likely an error in Hexclave. Please make sure you are running the newest version and report it.]
217
+ `);
218
+ });
219
+ });
220
+
221
+ describe("isLocalHandlerUrlTarget", () => {
222
+ it("treats relative handler URLs as local targets", () => {
223
+ expect(isLocalHandlerUrlTarget({
224
+ targetUrl: "/handler/sign-in",
225
+ handlerPath: "/handler",
226
+ currentOrigin: "http://p91.localhost:9101",
227
+ })).toBe(true);
228
+ });
229
+
230
+ it("treats same-origin absolute handler URLs as local targets", () => {
231
+ expect(isLocalHandlerUrlTarget({
232
+ targetUrl: "http://p91.localhost:9101/handler/sign-in",
233
+ handlerPath: "/handler",
234
+ currentOrigin: "http://p91.localhost:9101",
235
+ })).toBe(true);
236
+ });
237
+
238
+ it("treats cross-origin absolute handler URLs as non-local targets", () => {
239
+ expect(isLocalHandlerUrlTarget({
240
+ targetUrl: "https://project-id.built-with-hexclave.com/handler/sign-in",
241
+ handlerPath: "/handler",
242
+ currentOrigin: "http://p91.localhost:9101",
243
+ })).toBe(false);
244
+ });
245
+
246
+ it("treats non-handler paths as non-local targets", () => {
247
+ expect(isLocalHandlerUrlTarget({
248
+ targetUrl: "/projects",
249
+ handlerPath: "/handler",
250
+ currentOrigin: "http://p91.localhost:9101",
251
+ })).toBe(false);
252
+ });
253
+ });
@@ -0,0 +1,395 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { getCustomPagePrompts, type CustomPagePrompt } from "@hexclave/shared/dist/interface/handler-urls";
6
+ import { HexclaveAssertionError } from "@hexclave/shared/dist/utils/errors";
7
+ import { getHostedHandlerUrlFromConfig } from "@hexclave/shared/dist/utils/redirect-urls";
8
+ import { envVars } from "../env";
9
+ import { DefaultHandlerUrlTarget, HandlerPageUrls, HandlerUrlOptions, HandlerUrlTarget, HandlerUrls, ResolvedHandlerUrls } from "./common";
10
+
11
+ const localUrlPlaceholderOrigin = "http://example.com";
12
+ const schemePrefixRegex = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
13
+
14
+ const customPagePrompts: Record<keyof Omit<HandlerPageUrls, "handler">, CustomPagePrompt> = getCustomPagePrompts();
15
+
16
+ const joinHandlerComponentPath = (basePath: string, pagePath: string): string => {
17
+ const normalizedBasePath = basePath.endsWith("/") && basePath.length > 1
18
+ ? basePath.slice(0, -1)
19
+ : basePath;
20
+ if (pagePath.length === 0) {
21
+ return normalizedBasePath;
22
+ }
23
+ if (normalizedBasePath === "/") {
24
+ return `/${pagePath}`;
25
+ }
26
+ return `${normalizedBasePath}/${pagePath}`;
27
+ };
28
+
29
+ const getHostedPagePathForHandlerName = (handlerName: keyof HandlerUrls): string => {
30
+ switch (handlerName) {
31
+ case "handler": {
32
+ return "";
33
+ }
34
+ case "home": {
35
+ return "";
36
+ }
37
+ case "afterSignIn": {
38
+ return "";
39
+ }
40
+ case "afterSignUp": {
41
+ return "";
42
+ }
43
+ case "afterSignOut": {
44
+ return "";
45
+ }
46
+ case "signIn": {
47
+ return "sign-in";
48
+ }
49
+ case "signUp": {
50
+ return "sign-up";
51
+ }
52
+ case "signOut": {
53
+ return "sign-out";
54
+ }
55
+ case "emailVerification": {
56
+ return "email-verification";
57
+ }
58
+ case "passwordReset": {
59
+ return "password-reset";
60
+ }
61
+ case "forgotPassword": {
62
+ return "forgot-password";
63
+ }
64
+ case "oauthCallback": {
65
+ return "oauth-callback";
66
+ }
67
+ case "magicLinkCallback": {
68
+ return "magic-link-callback";
69
+ }
70
+ case "accountSettings": {
71
+ return "account-settings";
72
+ }
73
+ case "teamInvitation": {
74
+ return "team-invitation";
75
+ }
76
+ case "cliAuthConfirm": {
77
+ return "cli-auth-confirm";
78
+ }
79
+ case "mfa": {
80
+ return "mfa";
81
+ }
82
+ case "error": {
83
+ return "error";
84
+ }
85
+ case "onboarding": {
86
+ return "onboarding";
87
+ }
88
+ }
89
+ };
90
+
91
+ const resolveCustomTargetUrl = (options: {
92
+ target: { type: "custom", url: string, version: number },
93
+ handlerName: keyof HandlerUrls,
94
+ }): string => {
95
+ const handlerName = options.handlerName;
96
+ if (handlerName in customPagePrompts) {
97
+ const customPagePrompt = customPagePrompts[handlerName as keyof typeof customPagePrompts];
98
+ if (options.target.version === 0 || options.target.version in customPagePrompt.versions) {
99
+ return options.target.url;
100
+ }
101
+
102
+ throw new Error(`Unsupported custom page version ${options.target.version} for ${options.handlerName} page at ${options.target.url}. The latest supported version of this page is ${Math.max(0, ...Object.keys(customPagePrompt.versions).map(Number))}. Please upgrade your Hexclave SDK to a version that supports this version.`);
103
+ } else {
104
+ throw new Error(`URL target ${options.handlerName} cannot be a custom page. Please specify the URL as a string instead.`);
105
+ }
106
+ };
107
+
108
+ export const getHostedHandlerUrl = (options: { projectId: string, pagePath: string }): string => {
109
+ const normalizedPagePath = options.pagePath.replace(/^\/+/, "");
110
+ const hostedPath = normalizedPagePath.length > 0 ? `handler/${normalizedPagePath}` : "handler";
111
+ return getHostedHandlerUrlFromConfig({
112
+ projectId: options.projectId,
113
+ hostedPath,
114
+ hostedHandlerDomainSuffix: envVars.NEXT_PUBLIC_STACK_HOSTED_HANDLER_DOMAIN_SUFFIX,
115
+ hostedHandlerUrlTemplate: envVars.NEXT_PUBLIC_STACK_HOSTED_HANDLER_URL_TEMPLATE,
116
+ hexclavePortPrefix: envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX,
117
+ });
118
+ };
119
+
120
+ const isRelativeUrlString = (url: string): boolean => {
121
+ if (url.startsWith("//")) {
122
+ return false;
123
+ }
124
+ return !schemePrefixRegex.test(url);
125
+ };
126
+
127
+ export const isLocalHandlerUrlTarget = (options: {
128
+ targetUrl: string,
129
+ handlerPath: string,
130
+ currentOrigin?: string,
131
+ }): boolean => {
132
+ const urlObject = new URL(options.targetUrl, localUrlPlaceholderOrigin);
133
+ const isHandlerPathTarget = urlObject.pathname === options.handlerPath
134
+ || urlObject.pathname.startsWith(`${options.handlerPath}/`);
135
+ if (!isHandlerPathTarget) {
136
+ return false;
137
+ }
138
+
139
+ // On server we only have path information, so treat matching handler paths as local.
140
+ if (options.currentOrigin == null) {
141
+ return true;
142
+ }
143
+
144
+ return isRelativeUrlString(options.targetUrl) || urlObject.origin === options.currentOrigin;
145
+ };
146
+
147
+ const resolveUrlTarget = (options: {
148
+ target: HandlerUrlTarget,
149
+ fallbackPath: string,
150
+ handlerName: keyof HandlerUrls,
151
+ projectId: string,
152
+ }): string => {
153
+ if (typeof options.target === "string") {
154
+ return options.target;
155
+ }
156
+
157
+ switch (options.target.type) {
158
+ case "handler-component": {
159
+ return options.fallbackPath;
160
+ }
161
+ case "hosted": {
162
+ return getHostedHandlerUrl({
163
+ projectId: options.projectId,
164
+ pagePath: getHostedPagePathForHandlerName(options.handlerName),
165
+ });
166
+ }
167
+ case "custom": {
168
+ return resolveCustomTargetUrl({
169
+ target: options.target,
170
+ handlerName: options.handlerName,
171
+ });
172
+ }
173
+ }
174
+ };
175
+
176
+ const assertOAuthCallbackTargetIsRelative = (target: HandlerUrlTarget): void => {
177
+ const url = typeof target === "string"
178
+ ? target
179
+ : target.type === "custom"
180
+ ? target.url
181
+ : null;
182
+ if (url != null && !isRelativeUrlString(url)) {
183
+ throw new HexclaveAssertionError("OAuth callback URLs must be relative.", {
184
+ oauthCallbackUrl: url,
185
+ hint: "Use a relative URL like '/handler/oauth-callback', or use { type: 'hosted' } to let Stack use the current page for hosted callbacks.",
186
+ });
187
+ }
188
+ };
189
+
190
+ export const resolveHandlerUrls = (options: { urls: HandlerUrlOptions | undefined, projectId: string }): ResolvedHandlerUrls => {
191
+ const configuredUrls = options.urls;
192
+ const defaultTarget = configuredUrls?.default ?? { type: "handler-component" } as const;
193
+ const oauthCallbackTarget: HandlerUrlTarget = configuredUrls?.oauthCallback ?? (
194
+ defaultTarget.type === "hosted"
195
+ ? defaultTarget
196
+ : { type: "handler-component" }
197
+ );
198
+ assertOAuthCallbackTargetIsRelative(oauthCallbackTarget);
199
+ let handlerComponentBasePath = "/handler";
200
+ if (typeof configuredUrls?.handler === "string") {
201
+ handlerComponentBasePath = configuredUrls.handler;
202
+ } else if (configuredUrls?.handler != null && configuredUrls.handler.type === "custom") {
203
+ handlerComponentBasePath = resolveCustomTargetUrl({
204
+ target: configuredUrls.handler,
205
+ handlerName: "handler",
206
+ });
207
+ }
208
+
209
+ const home = resolveUrlTarget({
210
+ target: configuredUrls?.home ?? defaultTarget,
211
+ fallbackPath: "/",
212
+ handlerName: "home",
213
+ projectId: options.projectId,
214
+ });
215
+ const afterSignIn = resolveUrlTarget({
216
+ target: configuredUrls?.afterSignIn ?? defaultTarget,
217
+ fallbackPath: home,
218
+ handlerName: "afterSignIn",
219
+ projectId: options.projectId,
220
+ });
221
+
222
+ return {
223
+ handler: resolveUrlTarget({
224
+ target: configuredUrls?.handler ?? defaultTarget,
225
+ fallbackPath: handlerComponentBasePath,
226
+ handlerName: "handler",
227
+ projectId: options.projectId,
228
+ }),
229
+ signIn: resolveUrlTarget({
230
+ target: configuredUrls?.signIn ?? defaultTarget,
231
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "sign-in"),
232
+ handlerName: "signIn",
233
+ projectId: options.projectId,
234
+ }),
235
+ signUp: resolveUrlTarget({
236
+ target: configuredUrls?.signUp ?? defaultTarget,
237
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "sign-up"),
238
+ handlerName: "signUp",
239
+ projectId: options.projectId,
240
+ }),
241
+ afterSignIn,
242
+ afterSignUp: resolveUrlTarget({
243
+ target: configuredUrls?.afterSignUp ?? defaultTarget,
244
+ fallbackPath: afterSignIn,
245
+ handlerName: "afterSignUp",
246
+ projectId: options.projectId,
247
+ }),
248
+ signOut: resolveUrlTarget({
249
+ target: configuredUrls?.signOut ?? defaultTarget,
250
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "sign-out"),
251
+ handlerName: "signOut",
252
+ projectId: options.projectId,
253
+ }),
254
+ afterSignOut: resolveUrlTarget({
255
+ target: configuredUrls?.afterSignOut ?? defaultTarget,
256
+ fallbackPath: home,
257
+ handlerName: "afterSignOut",
258
+ projectId: options.projectId,
259
+ }),
260
+ emailVerification: resolveUrlTarget({
261
+ target: configuredUrls?.emailVerification ?? defaultTarget,
262
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "email-verification"),
263
+ handlerName: "emailVerification",
264
+ projectId: options.projectId,
265
+ }),
266
+ passwordReset: resolveUrlTarget({
267
+ target: configuredUrls?.passwordReset ?? defaultTarget,
268
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "password-reset"),
269
+ handlerName: "passwordReset",
270
+ projectId: options.projectId,
271
+ }),
272
+ forgotPassword: resolveUrlTarget({
273
+ target: configuredUrls?.forgotPassword ?? defaultTarget,
274
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "forgot-password"),
275
+ handlerName: "forgotPassword",
276
+ projectId: options.projectId,
277
+ }),
278
+ home,
279
+ oauthCallback: resolveUrlTarget({
280
+ target: oauthCallbackTarget,
281
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "oauth-callback"),
282
+ handlerName: "oauthCallback",
283
+ projectId: options.projectId,
284
+ }),
285
+ magicLinkCallback: resolveUrlTarget({
286
+ target: configuredUrls?.magicLinkCallback ?? defaultTarget,
287
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "magic-link-callback"),
288
+ handlerName: "magicLinkCallback",
289
+ projectId: options.projectId,
290
+ }),
291
+ accountSettings: resolveUrlTarget({
292
+ target: configuredUrls?.accountSettings ?? defaultTarget,
293
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "account-settings"),
294
+ handlerName: "accountSettings",
295
+ projectId: options.projectId,
296
+ }),
297
+ teamInvitation: resolveUrlTarget({
298
+ target: configuredUrls?.teamInvitation ?? defaultTarget,
299
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "team-invitation"),
300
+ handlerName: "teamInvitation",
301
+ projectId: options.projectId,
302
+ }),
303
+ cliAuthConfirm: resolveUrlTarget({
304
+ target: configuredUrls?.cliAuthConfirm ?? defaultTarget,
305
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "cli-auth-confirm"),
306
+ handlerName: "cliAuthConfirm",
307
+ projectId: options.projectId,
308
+ }),
309
+ mfa: resolveUrlTarget({
310
+ target: configuredUrls?.mfa ?? defaultTarget,
311
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "mfa"),
312
+ handlerName: "mfa",
313
+ projectId: options.projectId,
314
+ }),
315
+ error: resolveUrlTarget({
316
+ target: configuredUrls?.error ?? defaultTarget,
317
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "error"),
318
+ handlerName: "error",
319
+ projectId: options.projectId,
320
+ }),
321
+ onboarding: resolveUrlTarget({
322
+ target: configuredUrls?.onboarding ?? defaultTarget,
323
+ fallbackPath: joinHandlerComponentPath(handlerComponentBasePath, "onboarding"),
324
+ handlerName: "onboarding",
325
+ projectId: options.projectId,
326
+ }),
327
+ };
328
+ };
329
+
330
+ export const buildCliAuthConfirmUrl = (options: {
331
+ cliAuthConfirmUrl: string,
332
+ /** Used as the base URL only when cliAuthConfirmUrl is relative. */
333
+ appUrl: string,
334
+ loginCode: string,
335
+ }): string => {
336
+ const url = new URL(options.cliAuthConfirmUrl, options.appUrl);
337
+ url.searchParams.set("login_code", options.loginCode);
338
+ return url.toString();
339
+ };
340
+
341
+ export const resolveUnknownHandlerPathFallbackUrl = (options: {
342
+ defaultTarget: DefaultHandlerUrlTarget | undefined,
343
+ projectId: string,
344
+ unknownPath: string,
345
+ }): string | null => {
346
+ const defaultTarget = options.defaultTarget ?? { type: "handler-component" } satisfies DefaultHandlerUrlTarget;
347
+
348
+ switch (defaultTarget.type) {
349
+ case "handler-component": {
350
+ return null;
351
+ }
352
+ case "hosted": {
353
+ return getHostedHandlerUrl({
354
+ projectId: options.projectId,
355
+ pagePath: options.unknownPath,
356
+ });
357
+ }
358
+ }
359
+ };
360
+
361
+ export function getPagePrompt(pageName: string, currentVersion?: number): { title: string; fullPrompt: string; upgradePrompt: string | null; latestVersion: number } | null {
362
+ if (!(pageName in customPagePrompts)) return null;
363
+ const prompt = customPagePrompts[pageName as keyof typeof customPagePrompts];
364
+ const versionKeys = Object.keys(prompt.versions).map(Number);
365
+ const latestVersion = versionKeys.length > 0 ? Math.max(...versionKeys) : 0;
366
+
367
+ let upgradePrompt: string | null = null;
368
+ if (currentVersion != null) {
369
+ const relevantVersions = versionKeys
370
+ .filter(v => v > currentVersion)
371
+ .sort((a, b) => a - b);
372
+ const prompts = relevantVersions
373
+ .map(v => prompt.versions[v].upgradePrompt)
374
+ .filter(p => p.length > 0);
375
+ upgradePrompt = prompts.length > 0 ? prompts.join("\n\n") : null;
376
+ } else {
377
+ const upgradeEntry = latestVersion > 0 ? prompt.versions[latestVersion] : undefined;
378
+ upgradePrompt = upgradeEntry?.upgradePrompt ?? null;
379
+ }
380
+
381
+ return { title: prompt.title, fullPrompt: prompt.fullPrompt, upgradePrompt, latestVersion };
382
+ }
383
+
384
+ export const isHostedHandlerUrlForProject = (options: { url: string, projectId: string }): boolean => {
385
+ let parsedUrl: URL;
386
+ try {
387
+ parsedUrl = new URL(options.url);
388
+ } catch {
389
+ return false;
390
+ }
391
+
392
+ const hostedBaseUrl = new URL(getHostedHandlerUrl({ projectId: options.projectId, pagePath: "" }));
393
+ return parsedUrl.origin === hostedBaseUrl.origin
394
+ && (parsedUrl.pathname === hostedBaseUrl.pathname || parsedUrl.pathname.startsWith(`${hostedBaseUrl.pathname}/`));
395
+ };