@hexclave/next 1.0.0 → 1.0.1

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 (365) hide show
  1. package/README.md +7 -23
  2. package/dist/components/api-key-dialogs.js +18 -18
  3. package/dist/components/api-key-dialogs.js.map +1 -1
  4. package/dist/components/api-key-table.js +19 -19
  5. package/dist/components/api-key-table.js.map +1 -1
  6. package/dist/components/credential-sign-in.js +12 -12
  7. package/dist/components/credential-sign-in.js.map +1 -1
  8. package/dist/components/credential-sign-up.js +19 -19
  9. package/dist/components/credential-sign-up.js.map +1 -1
  10. package/dist/components/elements/separator-with-text.js +3 -3
  11. package/dist/components/elements/separator-with-text.js.map +1 -1
  12. package/dist/components/elements/sidebar-layout.js +15 -15
  13. package/dist/components/elements/sidebar-layout.js.map +1 -1
  14. package/dist/components/elements/user-avatar.js +3 -3
  15. package/dist/components/elements/user-avatar.js.map +1 -1
  16. package/dist/components/link.js +2 -2
  17. package/dist/components/link.js.map +1 -1
  18. package/dist/components/magic-link-sign-in.js +17 -17
  19. package/dist/components/magic-link-sign-in.js.map +1 -1
  20. package/dist/components/message-cards/known-error-message-card.js +2 -2
  21. package/dist/components/message-cards/known-error-message-card.js.map +1 -1
  22. package/dist/components/message-cards/message-card.js +4 -4
  23. package/dist/components/message-cards/message-card.js.map +1 -1
  24. package/dist/components/message-cards/predefined-message-card.js +2 -2
  25. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  26. package/dist/components/oauth-button.js +15 -15
  27. package/dist/components/oauth-button.js.map +1 -1
  28. package/dist/components/passkey-button.js +2 -2
  29. package/dist/components/passkey-button.js.map +1 -1
  30. package/dist/components/profile-image-editor.js +9 -9
  31. package/dist/components/profile-image-editor.js.map +1 -1
  32. package/dist/components/selected-team-switcher.js +4 -4
  33. package/dist/components/selected-team-switcher.js.map +1 -1
  34. package/dist/components/team-icon.js +4 -4
  35. package/dist/components/team-icon.js.map +1 -1
  36. package/dist/components/team-switcher.js +21 -21
  37. package/dist/components/team-switcher.js.map +1 -1
  38. package/dist/components/user-button.js +13 -13
  39. package/dist/components/user-button.js.map +1 -1
  40. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js +32 -32
  41. package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  42. package/dist/components-page/account-settings/api-keys/api-keys-page.js +2 -2
  43. package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  44. package/dist/components-page/account-settings/editable-text.js +5 -5
  45. package/dist/components-page/account-settings/editable-text.js.map +1 -1
  46. package/dist/components-page/account-settings/email-and-auth/emails-section.js +22 -22
  47. package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  48. package/dist/components-page/account-settings/email-and-auth/mfa-section.js +17 -17
  49. package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  50. package/dist/components-page/account-settings/email-and-auth/otp-section.js +9 -9
  51. package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  52. package/dist/components-page/account-settings/email-and-auth/passkey-section.js +9 -9
  53. package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  54. package/dist/components-page/account-settings/email-and-auth/password-section.js +23 -23
  55. package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  56. package/dist/components-page/account-settings/notifications/notifications-page.js +6 -6
  57. package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  58. package/dist/components-page/account-settings/payments/payments-panel.js +52 -52
  59. package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -1
  60. package/dist/components-page/account-settings/section.js +4 -4
  61. package/dist/components-page/account-settings/section.js.map +1 -1
  62. package/dist/components-page/account-settings/settings/delete-account-section.js +7 -7
  63. package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  64. package/dist/components-page/account-settings/settings/sign-out-section.js +2 -2
  65. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  66. package/dist/components-page/account-settings/teams/leave-team-section.js +5 -5
  67. package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  68. package/dist/components-page/account-settings/teams/team-api-keys-section.js +5 -5
  69. package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  70. package/dist/components-page/account-settings/teams/team-creation-page.js +7 -7
  71. package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  72. package/dist/components-page/account-settings/teams/team-member-invitation-section.js +20 -20
  73. package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  74. package/dist/components-page/account-settings/teams/team-member-list-section.js +5 -5
  75. package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  76. package/dist/components-page/account-settings.js +22 -22
  77. package/dist/components-page/account-settings.js.map +1 -1
  78. package/dist/components-page/auth-page.js +23 -23
  79. package/dist/components-page/auth-page.js.map +1 -1
  80. package/dist/components-page/cli-auth-confirm.js +9 -9
  81. package/dist/components-page/cli-auth-confirm.js.map +1 -1
  82. package/dist/components-page/cli-auth-confirm.test.js +4 -4
  83. package/dist/components-page/cli-auth-confirm.test.js.map +1 -1
  84. package/dist/components-page/email-verification.js +6 -6
  85. package/dist/components-page/email-verification.js.map +1 -1
  86. package/dist/components-page/error-page.js +11 -11
  87. package/dist/components-page/error-page.js.map +1 -1
  88. package/dist/components-page/forgot-password.js +11 -11
  89. package/dist/components-page/forgot-password.js.map +1 -1
  90. package/dist/components-page/magic-link-callback.js +8 -8
  91. package/dist/components-page/magic-link-callback.js.map +1 -1
  92. package/dist/components-page/mfa.js +13 -13
  93. package/dist/components-page/mfa.js.map +1 -1
  94. package/dist/components-page/oauth-callback.js +9 -9
  95. package/dist/components-page/oauth-callback.js.map +1 -1
  96. package/dist/components-page/onboarding.js +11 -11
  97. package/dist/components-page/onboarding.js.map +1 -1
  98. package/dist/components-page/password-reset.js +27 -27
  99. package/dist/components-page/password-reset.js.map +1 -1
  100. package/dist/components-page/section.js +1 -1
  101. package/dist/components-page/sign-out.js +4 -4
  102. package/dist/components-page/sign-out.js.map +1 -1
  103. package/dist/components-page/stack-handler-client.js +9 -9
  104. package/dist/components-page/stack-handler-client.js.map +1 -1
  105. package/dist/components-page/stack-handler.d.ts +14 -9
  106. package/dist/components-page/stack-handler.d.ts.map +1 -1
  107. package/dist/components-page/stack-handler.js +8 -2
  108. package/dist/components-page/stack-handler.js.map +1 -1
  109. package/dist/components-page/team-creation.js +9 -9
  110. package/dist/components-page/team-creation.js.map +1 -1
  111. package/dist/components-page/team-invitation.js +20 -20
  112. package/dist/components-page/team-invitation.js.map +1 -1
  113. package/dist/dev-tool/dev-tool-core.d.ts.map +1 -1
  114. package/dist/dev-tool/dev-tool-core.js +25 -25
  115. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  116. package/dist/dev-tool/dev-tool-trigger-position.test.js +1 -1
  117. package/dist/dev-tool/index.js +6 -6
  118. package/dist/dev-tool/index.js.map +1 -1
  119. package/dist/esm/components/api-key-dialogs.js.map +1 -1
  120. package/dist/esm/components/api-key-table.js.map +1 -1
  121. package/dist/esm/components/credential-sign-in.js.map +1 -1
  122. package/dist/esm/components/credential-sign-up.js.map +1 -1
  123. package/dist/esm/components/elements/separator-with-text.js.map +1 -1
  124. package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
  125. package/dist/esm/components/elements/user-avatar.js.map +1 -1
  126. package/dist/esm/components/link.js.map +1 -1
  127. package/dist/esm/components/magic-link-sign-in.js.map +1 -1
  128. package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
  129. package/dist/esm/components/message-cards/message-card.js.map +1 -1
  130. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  131. package/dist/esm/components/oauth-button.js.map +1 -1
  132. package/dist/esm/components/passkey-button.js.map +1 -1
  133. package/dist/esm/components/profile-image-editor.js.map +1 -1
  134. package/dist/esm/components/selected-team-switcher.js.map +1 -1
  135. package/dist/esm/components/team-icon.js.map +1 -1
  136. package/dist/esm/components/team-switcher.js.map +1 -1
  137. package/dist/esm/components/user-button.js.map +1 -1
  138. package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
  139. package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
  140. package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
  141. package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
  142. package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
  143. package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
  144. package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
  145. package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
  146. package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
  147. package/dist/esm/components-page/account-settings/payments/payments-panel.js +1 -1
  148. package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -1
  149. package/dist/esm/components-page/account-settings/section.js.map +1 -1
  150. package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
  151. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  152. package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
  153. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js +1 -1
  154. package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
  155. package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
  156. package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
  157. package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
  158. package/dist/esm/components-page/account-settings.js.map +1 -1
  159. package/dist/esm/components-page/auth-page.js.map +1 -1
  160. package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
  161. package/dist/esm/components-page/cli-auth-confirm.test.js +2 -2
  162. package/dist/esm/components-page/cli-auth-confirm.test.js.map +1 -1
  163. package/dist/esm/components-page/email-verification.js.map +1 -1
  164. package/dist/esm/components-page/error-page.js.map +1 -1
  165. package/dist/esm/components-page/forgot-password.js.map +1 -1
  166. package/dist/esm/components-page/magic-link-callback.js.map +1 -1
  167. package/dist/esm/components-page/mfa.js.map +1 -1
  168. package/dist/esm/components-page/oauth-callback.js.map +1 -1
  169. package/dist/esm/components-page/onboarding.js.map +1 -1
  170. package/dist/esm/components-page/password-reset.js.map +1 -1
  171. package/dist/esm/components-page/sign-out.js.map +1 -1
  172. package/dist/esm/components-page/stack-handler-client.js +2 -2
  173. package/dist/esm/components-page/stack-handler-client.js.map +1 -1
  174. package/dist/esm/components-page/stack-handler.d.ts +13 -9
  175. package/dist/esm/components-page/stack-handler.d.ts.map +1 -1
  176. package/dist/esm/components-page/stack-handler.js +5 -2
  177. package/dist/esm/components-page/stack-handler.js.map +1 -1
  178. package/dist/esm/components-page/team-creation.js.map +1 -1
  179. package/dist/esm/components-page/team-invitation.js.map +1 -1
  180. package/dist/esm/dev-tool/dev-tool-core.d.ts.map +1 -1
  181. package/dist/esm/dev-tool/dev-tool-core.js +4 -4
  182. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  183. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js +1 -1
  184. package/dist/esm/dev-tool/index.js.map +1 -1
  185. package/dist/esm/generated/global-css.d.ts +1 -1
  186. package/dist/esm/generated/global-css.js +1 -1
  187. package/dist/esm/generated/global-css.js.map +1 -1
  188. package/dist/esm/generated/quetzal-translations.js.map +1 -1
  189. package/dist/esm/index.d.ts +5 -5
  190. package/dist/esm/index.js +5 -6
  191. package/dist/esm/integrations/convex.js.map +1 -1
  192. package/dist/esm/lib/auth.js +1 -1
  193. package/dist/esm/lib/auth.js.map +1 -1
  194. package/dist/esm/lib/auth.test.js.map +1 -1
  195. package/dist/esm/lib/cookie.js.map +1 -1
  196. package/dist/esm/lib/hooks.d.ts +11 -1
  197. package/dist/esm/lib/hooks.d.ts.map +1 -1
  198. package/dist/esm/lib/hooks.js +19 -9
  199. package/dist/esm/lib/hooks.js.map +1 -1
  200. package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
  201. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
  202. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  203. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +3 -1
  204. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  205. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts +3 -3
  206. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  207. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +2 -2
  208. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  209. package/dist/esm/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
  210. package/dist/esm/lib/stack-app/apps/implementations/common.js +3 -3
  211. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
  212. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
  213. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
  214. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
  215. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
  216. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  217. package/dist/esm/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
  218. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js +3 -2
  219. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
  220. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
  221. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
  222. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js +1 -0
  223. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  224. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
  225. package/dist/esm/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
  226. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js +1 -0
  227. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  228. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts +4 -0
  229. package/dist/esm/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
  230. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js +1 -0
  231. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  232. package/dist/esm/lib/stack-app/common.d.ts +1 -1
  233. package/dist/esm/lib/stack-app/common.js.map +1 -1
  234. package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
  235. package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
  236. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
  237. package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
  238. package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
  239. package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
  240. package/dist/esm/lib/stack-app/url-targets.js.map +1 -1
  241. package/dist/esm/lib/stack-app/url-targets.test.js +1 -1
  242. package/dist/esm/lib/stack-app/url-targets.test.js.map +1 -1
  243. package/dist/esm/lib/stack-app/users/index.js.map +1 -1
  244. package/dist/esm/providers/stack-context.d.ts +3 -2
  245. package/dist/esm/providers/stack-context.d.ts.map +1 -1
  246. package/dist/esm/providers/stack-context.js +3 -1
  247. package/dist/esm/providers/stack-context.js.map +1 -1
  248. package/dist/esm/providers/stack-provider-client.js.map +1 -1
  249. package/dist/esm/providers/stack-provider.d.ts +5 -1
  250. package/dist/esm/providers/stack-provider.d.ts.map +1 -1
  251. package/dist/esm/providers/stack-provider.js +5 -1
  252. package/dist/esm/providers/stack-provider.js.map +1 -1
  253. package/dist/esm/providers/theme-provider.d.ts +6 -2
  254. package/dist/esm/providers/theme-provider.d.ts.map +1 -1
  255. package/dist/esm/providers/theme-provider.js +6 -2
  256. package/dist/esm/providers/theme-provider.js.map +1 -1
  257. package/dist/esm/providers/translation-provider-client.d.ts +4 -3
  258. package/dist/esm/providers/translation-provider-client.d.ts.map +1 -1
  259. package/dist/esm/providers/translation-provider-client.js +4 -2
  260. package/dist/esm/providers/translation-provider-client.js.map +1 -1
  261. package/dist/esm/providers/translation-provider.js.map +1 -1
  262. package/dist/esm/utils/url.js.map +1 -1
  263. package/dist/generated/global-css.d.ts +1 -1
  264. package/dist/generated/global-css.js +1 -1
  265. package/dist/generated/global-css.js.map +1 -1
  266. package/dist/generated/quetzal-translations.js +16 -16
  267. package/dist/generated/quetzal-translations.js.map +1 -1
  268. package/dist/index.d.ts +6 -6
  269. package/dist/index.js +9 -12
  270. package/dist/integrations/convex/component/convex.config.d.ts +1 -1
  271. package/dist/integrations/convex.js +5 -5
  272. package/dist/integrations/convex.js.map +1 -1
  273. package/dist/lib/auth.js +12 -12
  274. package/dist/lib/auth.js.map +1 -1
  275. package/dist/lib/auth.test.js +2 -2
  276. package/dist/lib/auth.test.js.map +1 -1
  277. package/dist/lib/cookie.js +13 -13
  278. package/dist/lib/cookie.js.map +1 -1
  279. package/dist/lib/hooks.d.ts +11 -1
  280. package/dist/lib/hooks.d.ts.map +1 -1
  281. package/dist/lib/hooks.js +19 -8
  282. package/dist/lib/hooks.js.map +1 -1
  283. package/dist/lib/stack-app/api-keys/index.js +2 -2
  284. package/dist/lib/stack-app/api-keys/index.js.map +1 -1
  285. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts +11 -11
  286. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  287. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +39 -37
  288. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
  289. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts +3 -3
  290. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  291. package/dist/lib/stack-app/apps/implementations/client-app-impl.js +213 -213
  292. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
  293. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +1 -1
  294. package/dist/lib/stack-app/apps/implementations/common.js +30 -30
  295. package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
  296. package/dist/lib/stack-app/apps/implementations/event-tracker.js +7 -7
  297. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +1 -1
  298. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js +3 -3
  299. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +1 -1
  300. package/dist/lib/stack-app/apps/implementations/index.js +4 -4
  301. package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
  302. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js +8 -8
  303. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +1 -1
  304. package/dist/lib/stack-app/apps/implementations/server-app-impl.js +70 -70
  305. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
  306. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +1 -1
  307. package/dist/lib/stack-app/apps/implementations/session-replay.js +13 -12
  308. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +1 -1
  309. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts +4 -0
  310. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +1 -1
  311. package/dist/lib/stack-app/apps/interfaces/admin-app.js +1 -0
  312. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
  313. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts +5 -0
  314. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +1 -1
  315. package/dist/lib/stack-app/apps/interfaces/client-app.js +1 -0
  316. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
  317. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts +5 -1
  318. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +1 -1
  319. package/dist/lib/stack-app/apps/interfaces/server-app.js +1 -0
  320. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
  321. package/dist/lib/stack-app/common.d.ts +1 -1
  322. package/dist/lib/stack-app/common.js.map +1 -1
  323. package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
  324. package/dist/lib/stack-app/email-templates/index.js.map +1 -1
  325. package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
  326. package/dist/lib/stack-app/permissions/index.js.map +1 -1
  327. package/dist/lib/stack-app/projects/index.js.map +1 -1
  328. package/dist/lib/stack-app/teams/index.js.map +1 -1
  329. package/dist/lib/stack-app/url-targets.js +6 -6
  330. package/dist/lib/stack-app/url-targets.js.map +1 -1
  331. package/dist/lib/stack-app/url-targets.test.js +1 -1
  332. package/dist/lib/stack-app/url-targets.test.js.map +1 -1
  333. package/dist/lib/stack-app/users/index.js +3 -3
  334. package/dist/lib/stack-app/users/index.js.map +1 -1
  335. package/dist/providers/stack-context.d.ts +3 -2
  336. package/dist/providers/stack-context.d.ts.map +1 -1
  337. package/dist/providers/stack-context.js +3 -1
  338. package/dist/providers/stack-context.js.map +1 -1
  339. package/dist/providers/stack-provider-client.js +2 -2
  340. package/dist/providers/stack-provider-client.js.map +1 -1
  341. package/dist/providers/stack-provider.d.ts +6 -1
  342. package/dist/providers/stack-provider.d.ts.map +1 -1
  343. package/dist/providers/stack-provider.js +8 -1
  344. package/dist/providers/stack-provider.js.map +1 -1
  345. package/dist/providers/theme-provider.d.ts +6 -2
  346. package/dist/providers/theme-provider.d.ts.map +1 -1
  347. package/dist/providers/theme-provider.js +10 -5
  348. package/dist/providers/theme-provider.js.map +1 -1
  349. package/dist/providers/translation-provider-client.d.ts +4 -3
  350. package/dist/providers/translation-provider-client.d.ts.map +1 -1
  351. package/dist/providers/translation-provider-client.js +4 -1
  352. package/dist/providers/translation-provider-client.js.map +1 -1
  353. package/dist/providers/translation-provider.js +2 -2
  354. package/dist/providers/translation-provider.js.map +1 -1
  355. package/dist/{storage-DxMLntUt.d.ts → storage-kTmOAWHW.d.ts} +1 -1
  356. package/dist/{storage-DxMLntUt.d.ts.map → storage-kTmOAWHW.d.ts.map} +1 -1
  357. package/dist/utils/url.js +2 -2
  358. package/dist/utils/url.js.map +1 -1
  359. package/package.json +5 -5
  360. package/dist/esm/internal/deprecation-warning.d.ts +0 -1
  361. package/dist/esm/internal/deprecation-warning.js +0 -24
  362. package/dist/esm/internal/deprecation-warning.js.map +0 -1
  363. package/dist/internal/deprecation-warning.d.ts +0 -1
  364. package/dist/internal/deprecation-warning.js +0 -24
  365. package/dist/internal/deprecation-warning.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"mappings":";;;;;;;cAoBa,aAAA;AAAA,cAYA,WAAA,uBAAmC,OAAA,GAAU,YAAA,EAAc,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA;AAAA,cAO3E,oBAAA,uBAA4C,OAAA,GAAU,OAAA,EAAS,eAAA,EAAiB,iBAAA,EAAmB,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,EAAA,eAAA,KAAA,CAAA,GAAA,MAAA,CAAA,CAAA;AAAA,KAa3H,OAAA;EAAA,CAAa,uBAAA;IAA4B,qBAAA;EAAA;AAAA;AAAA,iBAC9B,yBAAA;EAAsC,YAAA,GAAe,OAAA;AAAA,EAAA,CAAW,OAAA,EAAS,CAAA,GAAI,CAAA;EAAM,YAAA;AAAA;AAAA,iBAOnF,OAAA,CAAQ,OAAA,EAAS,iBAAA,EAAmB,OAAA;EAAW,SAAA;AAAA,IAAsB,mBAAA;AAAA,iBAOrE,mBAAA,CAAA;AAAA,iBAIA,8BAAA,CAAA;AAAA,iBAIA,yBAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;;;;;;;;;;;;AA5ChB;;;;;;;iBAkEgB,UAAA,CAAW,oBAAA;EAAiC,OAAA;EAAiB,MAAA;AAAA;AAAA,cAwBhE,cAAA;AAAA,cACA,uBAAA;AAAA,iBAOG,mBAAA,CAAoB,cAAA;AAAA,iBA0BpB,cAAA,CAAe,mBAAA;EAAgC,OAAA;EAAiB,MAAA;AAAA;AAAA,KAcpE,WAAA;EACV,WAAA;EACA,YAAA;AAAA;AAAA,iBAGc,qBAAA,CAAA,GAAqB,KAAA,CAAA,WAAA;AAAA,iBASrB,aAAA,oBAAA,CAAkC,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,MAAA,CAAO,CAAA,IAAK,YAAA,EAAc,CAAA,EAAG,MAAA,WAAiB,CAAA"}
1
+ {"version":3,"file":"common.d.ts","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"mappings":";;;;;;;cAoBa,aAAA;AAAA,cAYA,WAAA,uBAAmC,OAAA,GAAU,YAAA,EAAc,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,CAAA,CAAA,EAAA,MAAA,CAAA,CAAA;AAAA,cAO3E,oBAAA,uBAA4C,OAAA,GAAU,OAAA,EAAS,eAAA,EAAiB,iBAAA,EAAmB,CAAA,KAAM,OAAA,CAAQ,CAAA,MAAE,UAAA,EAAA,eAAA,KAAA,CAAA,GAAA,MAAA,CAAA,CAAA;AAAA,KAa3H,OAAA;EAAA,CAAa,uBAAA;IAA4B,qBAAA;EAAA;AAAA;AAAA,iBAC9B,yBAAA;EAAsC,YAAA,GAAe,OAAA;AAAA,EAAA,CAAW,OAAA,EAAS,CAAA,GAAI,CAAA;EAAM,YAAA;AAAA;AAAA,iBAOnF,OAAA,CAAQ,OAAA,EAAS,iBAAA,EAAmB,OAAA;EAAW,SAAA;AAAA,IAAsB,mBAAA;AAAA,iBAOrE,mBAAA,CAAA;AAAA,iBAIA,8BAAA,CAAA;AAAA,iBAIA,yBAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;AAAA,iBAIA,6BAAA,CAAA;;;;;;;;;;;;AA5ChB;;;;;;;iBAkEgB,UAAA,CAAW,oBAAA;EAAiC,OAAA;EAAiB,MAAA;AAAA;AAAA,cAyBhE,cAAA;AAAA,cACA,uBAAA;AAAA,iBAOG,mBAAA,CAAoB,cAAA;AAAA,iBA0BpB,cAAA,CAAe,mBAAA;EAAgC,OAAA;EAAiB,MAAA;AAAA;AAAA,KAcpE,WAAA;EACV,WAAA;EACA,YAAA;AAAA;AAAA,iBAGc,qBAAA,CAAA,GAAqB,KAAA,CAAA,WAAA;AAAA,iBASrB,aAAA,oBAAA,CAAkC,KAAA,EAAO,UAAA,CAAW,CAAA,EAAG,MAAA,CAAO,CAAA,IAAK,YAAA,EAAc,CAAA,EAAG,MAAA,WAAiB,CAAA"}
@@ -1,34 +1,34 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
- let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
3
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
+ let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
5
5
  let react = require("react");
6
6
  react = require_chunk.__toESM(react);
7
- let _stackframe_stack_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
8
- let _stackframe_stack_shared_dist_utils_caches = require("@hexclave/shared/dist/utils/caches");
9
- let _stackframe_stack_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
10
- let _stackframe_stack_shared_dist_utils_objects = require("@hexclave/shared/dist/utils/objects");
11
- let _stackframe_stack_shared_dist_utils_globals = require("@hexclave/shared/dist/utils/globals");
12
- let _stackframe_stack_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
13
- let _stackframe_stack_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
7
+ let _hexclave_shared_dist_utils_caches = require("@hexclave/shared/dist/utils/caches");
8
+ let _hexclave_shared_dist_utils_react = require("@hexclave/shared/dist/utils/react");
9
+ let _hexclave_shared_dist_utils_objects = require("@hexclave/shared/dist/utils/objects");
10
+ let _hexclave_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
11
+ let _hexclave_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
12
+ let _hexclave_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
13
+ let _hexclave_shared_dist_utils_globals = require("@hexclave/shared/dist/utils/globals");
14
14
  let ______common_js = require("../../common.js");
15
- let _stackframe_stack_shared_dist_utils_stores = require("@hexclave/shared/dist/utils/stores");
15
+ let _hexclave_shared_dist_utils_stores = require("@hexclave/shared/dist/utils/stores");
16
16
  let _________env_js = require("../../../env.js");
17
17
  let ______url_targets_js = require("../../url-targets.js");
18
18
 
19
19
  //#region src/lib/stack-app/apps/implementations/common.ts
20
- const clientVersion = "js @hexclave/next@1.0.0";
21
- if (clientVersion.startsWith("STACK_COMPILE_TIME")) throw new _stackframe_stack_shared_dist_utils_errors.HexclaveAssertionError("Client version was not replaced. Something went wrong during build!");
20
+ const clientVersion = "js @hexclave/next@1.0.1";
21
+ if (clientVersion.startsWith("STACK_COMPILE_TIME")) throw new _hexclave_shared_dist_utils_errors.HexclaveAssertionError("Client version was not replaced. Something went wrong during build!");
22
22
  const replaceStackPortPrefix = (input) => {
23
23
  if (!input) return input;
24
24
  const prefix = _________env_js.envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX;
25
25
  return prefix ? input.replace(/\$\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\}/g, prefix) : input;
26
26
  };
27
27
  const createCache = (fetcher) => {
28
- return new _stackframe_stack_shared_dist_utils_caches.AsyncCache(async (dependencies) => await _stackframe_stack_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(dependencies)), {});
28
+ return new _hexclave_shared_dist_utils_caches.AsyncCache(async (dependencies) => await _hexclave_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(dependencies)), {});
29
29
  };
30
30
  const createCacheBySession = (fetcher) => {
31
- return new _stackframe_stack_shared_dist_utils_caches.AsyncCache(async ([session, ...extraDependencies]) => await _stackframe_stack_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)), { onSubscribe: ([session], refresh) => {
31
+ return new _hexclave_shared_dist_utils_caches.AsyncCache(async ([session, ...extraDependencies]) => await _hexclave_shared_dist_utils_results.Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)), { onSubscribe: ([session], refresh) => {
32
32
  const handler = session.onInvalidate(() => refresh());
33
33
  return () => handler.unsubscribe();
34
34
  } });
@@ -36,7 +36,7 @@ const createCacheBySession = (fetcher) => {
36
36
  function resolveConstructorOptions(options) {
37
37
  return {
38
38
  ...options.inheritsFrom?.[______common_js.stackAppInternalsSymbol].getConstructorOptions() ?? {},
39
- ...(0, _stackframe_stack_shared_dist_utils_objects.filterUndefined)((0, _stackframe_stack_shared_dist_utils_objects.omit)(options, ["inheritsFrom"]))
39
+ ...(0, _hexclave_shared_dist_utils_objects.filterUndefined)((0, _hexclave_shared_dist_utils_objects.omit)(options, ["inheritsFrom"]))
40
40
  };
41
41
  }
42
42
  function getUrls(partial, options) {
@@ -46,16 +46,16 @@ function getUrls(partial, options) {
46
46
  });
47
47
  }
48
48
  function getDefaultProjectId() {
49
- return _________env_js.envVars.NEXT_PUBLIC_STACK_PROJECT_ID || _________env_js.envVars.STACK_PROJECT_ID || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
49
+ return _________env_js.envVars.NEXT_PUBLIC_STACK_PROJECT_ID || _________env_js.envVars.STACK_PROJECT_ID || (0, _hexclave_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable."));
50
50
  }
51
51
  function getDefaultPublishableClientKey() {
52
52
  return _________env_js.envVars.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || _________env_js.envVars.STACK_PUBLISHABLE_CLIENT_KEY;
53
53
  }
54
54
  function getDefaultSecretServerKey() {
55
- return _________env_js.envVars.STACK_SECRET_SERVER_KEY || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable."));
55
+ return _________env_js.envVars.STACK_SECRET_SERVER_KEY || (0, _hexclave_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable."));
56
56
  }
57
57
  function getDefaultSuperSecretAdminKey() {
58
- return _________env_js.envVars.STACK_SUPER_SECRET_ADMIN_KEY || (0, _stackframe_stack_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable."));
58
+ return _________env_js.envVars.STACK_SUPER_SECRET_ADMIN_KEY || (0, _hexclave_shared_dist_utils_errors.throwErr)(/* @__PURE__ */ new Error("No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable."));
59
59
  }
60
60
  function getDefaultExtraRequestHeaders() {
61
61
  return JSON.parse(_________env_js.envVars.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || _________env_js.envVars.STACK_EXTRA_REQUEST_HEADERS || "{}");
@@ -81,10 +81,10 @@ function getDefaultExtraRequestHeaders() {
81
81
  function getBaseUrl(userSpecifiedBaseUrl) {
82
82
  let url;
83
83
  if (userSpecifiedBaseUrl) if (typeof userSpecifiedBaseUrl === "string") url = userSpecifiedBaseUrl;
84
- else if ((0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) url = userSpecifiedBaseUrl.browser;
84
+ else if ((0, _hexclave_shared_dist_utils_env.isBrowserLike)()) url = userSpecifiedBaseUrl.browser;
85
85
  else url = userSpecifiedBaseUrl.server;
86
86
  else {
87
- if ((0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) url = _________env_js.envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || _________env_js.envVars.STACK_API_URL_BROWSER;
87
+ if ((0, _hexclave_shared_dist_utils_env.isBrowserLike)()) url = _________env_js.envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || _________env_js.envVars.STACK_API_URL_BROWSER;
88
88
  else url = _________env_js.envVars.NEXT_PUBLIC_SERVER_STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL_SERVER || _________env_js.envVars.STACK_API_URL_SERVER;
89
89
  url = url || _________env_js.envVars.NEXT_PUBLIC_STACK_API_URL || _________env_js.envVars.STACK_API_URL || _________env_js.envVars.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;
90
90
  }
@@ -97,16 +97,16 @@ function getAnalyticsBaseUrl(regularBaseUrl) {
97
97
  return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;
98
98
  }
99
99
  function fetchBackendUrlsInBackground(primaryBaseUrl) {
100
- (0, _stackframe_stack_shared_dist_utils_globals.createGlobal)("__stack-fetch-backend-urls-started", () => {
101
- (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(async () => {
100
+ (0, _hexclave_shared_dist_utils_globals.createGlobal)("__stack-fetch-backend-urls-started", () => {
101
+ (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(async () => {
102
102
  try {
103
103
  const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);
104
104
  if (!res.ok) return;
105
105
  const data = await res.json();
106
106
  if (!Array.isArray(data.urls) || !data.urls.every((u) => typeof u === "string")) return;
107
- (0, _stackframe_stack_shared_dist_utils_globals.createGlobal)("__stack-fetched-backend-urls", () => data.urls);
107
+ (0, _hexclave_shared_dist_utils_globals.createGlobal)("__stack-fetched-backend-urls", () => data.urls);
108
108
  } catch (e) {
109
- (0, _stackframe_stack_shared_dist_utils_errors.captureError)("fetch-backend-urls-in-background", e);
109
+ (0, _hexclave_shared_dist_utils_errors.captureError)("fetch-backend-urls-in-background", e);
110
110
  }
111
111
  });
112
112
  return true;
@@ -117,19 +117,19 @@ function resolveApiUrls(userExplicitBaseUrl) {
117
117
  if (userExplicitBaseUrl != null) return [getBaseUrl(userExplicitBaseUrl)];
118
118
  const primary = getBaseUrl(void 0);
119
119
  fetchBackendUrlsInBackground(primary);
120
- return (0, _stackframe_stack_shared_dist_utils_globals.getGlobal)("__stack-fetched-backend-urls") ?? (0, _stackframe_stack_shared_dist_utils_urls.getDefaultApiUrls)(primary);
120
+ return (0, _hexclave_shared_dist_utils_globals.getGlobal)("__stack-fetched-backend-urls") ?? (0, _hexclave_shared_dist_utils_urls.getDefaultApiUrls)(primary);
121
121
  };
122
122
  }
123
123
  function createEmptyTokenStore() {
124
- return new _stackframe_stack_shared_dist_utils_stores.Store({
124
+ return new _hexclave_shared_dist_utils_stores.Store({
125
125
  refreshToken: null,
126
126
  accessToken: null
127
127
  });
128
128
  }
129
129
  const cachePromiseByHookId = /* @__PURE__ */ new Map();
130
130
  function useAsyncCache(cache, dependencies, caller) {
131
- (0, _stackframe_stack_shared_dist_utils_react.suspendIfSsr)(caller);
132
- const asyncCacheHooks = (0, _stackframe_stack_shared_dist_utils_globals.getGlobal)("use-async-cache-execution-hooks") ?? [];
131
+ (0, _hexclave_shared_dist_utils_react.suspendIfSsr)(caller);
132
+ const asyncCacheHooks = (0, _hexclave_shared_dist_utils_globals.getGlobal)("use-async-cache-execution-hooks") ?? [];
133
133
  for (const hook of asyncCacheHooks) hook({
134
134
  cache,
135
135
  caller,
@@ -150,11 +150,11 @@ function useAsyncCache(cache, dependencies, caller) {
150
150
  if (!cachePromiseByHookId.has(id)) cachePromiseByHookId.set(id, cache.getOrWait(dependencies, "read-write"));
151
151
  return cachePromiseByHookId.get(id);
152
152
  }, [cache, ...dependencies]);
153
- const result = (0, _stackframe_stack_shared_dist_utils_react.use)(react.default.useSyncExternalStore(subscribe, getSnapshot, getSnapshot));
153
+ const result = (0, _hexclave_shared_dist_utils_react.use)(react.default.useSyncExternalStore(subscribe, getSnapshot, getSnapshot));
154
154
  if (result.status === "error") {
155
155
  const error = result.error;
156
156
  if (error instanceof Error && !error.__stackHasConcatenatedStacktraces) {
157
- (0, _stackframe_stack_shared_dist_utils_errors.concatStacktraces)(error, /* @__PURE__ */ new Error());
157
+ (0, _hexclave_shared_dist_utils_errors.concatStacktraces)(error, /* @__PURE__ */ new Error());
158
158
  error.__stackHasConcatenatedStacktraces = true;
159
159
  }
160
160
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { InternalSession } from \"@stackframe/stack-shared/dist/sessions\";\nimport { AsyncCache } from \"@stackframe/stack-shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { HexclaveAssertionError, captureError, concatStacktraces, throwErr } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { createGlobal, getGlobal } from \"@stackframe/stack-shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@stackframe/stack-shared/dist/utils/objects\";\nimport { ReactPromise, runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { suspendIfSsr, use } from \"@stackframe/stack-shared/dist/utils/react\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { Store } from \"@stackframe/stack-shared/dist/utils/stores\";\nimport { getDefaultApiUrls } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { envVars } from \"../../../env\";\nimport { HandlerUrlOptions, ResolvedHandlerUrls, stackAppInternalsSymbol } from \"../../common\";\nimport { resolveHandlerUrls } from \"../../url-targets\";\n\nexport const clientVersion = \"STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new HexclaveAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\nconst replaceStackPortPrefix = <T extends string | undefined>(input: T): T => {\n if (!input) return input;\n const prefix = envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX;\n return prefix ? input.replace(/\\$\\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\\}/g, prefix) as T : input;\n};\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\n\ntype AppLike = { [stackAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[stackAppInternalsSymbol].getConstructorOptions() ?? {},\n ...filterUndefined(omit(options, [\"inheritsFrom\"])),\n };\n}\n\nexport function getUrls(partial: HandlerUrlOptions, options: { projectId: string }): ResolvedHandlerUrls {\n return resolveHandlerUrls({\n urls: partial,\n projectId: options.projectId,\n });\n}\n\nexport function getDefaultProjectId() {\n return envVars.NEXT_PUBLIC_STACK_PROJECT_ID || envVars.STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return envVars.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || envVars.STACK_PUBLISHABLE_CLIENT_KEY;\n}\n\nexport function getDefaultSecretServerKey() {\n return envVars.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return envVars.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(envVars.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || envVars.STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n // note: NEXT_PUBLIC_BROWSER_STACK_API_URL was renamed to NEXT_PUBLIC_STACK_API_URL_BROWSER, and NEXT_PUBLIC_STACK_URL to NEXT_PUBLIC_STACK_API_URL\n if (isBrowserLike()) {\n url = envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || envVars.STACK_API_URL_BROWSER;\n } else {\n url = envVars.NEXT_PUBLIC_SERVER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_SERVER || envVars.STACK_API_URL_SERVER;\n }\n url = url || envVars.NEXT_PUBLIC_STACK_API_URL || envVars.STACK_API_URL || envVars.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return replaceStackPortPrefix(url.endsWith('/') ? url.slice(0, -1) : url);\n}\nexport const defaultBaseUrl = \"https://api.hexclave.com\";\nexport const defaultAnalyticsBaseUrl = \"https://r.hexclave.com\";\n\nconst analyticsBaseUrlsByApiBaseUrl = new Map<string, string>([\n [defaultBaseUrl, defaultAnalyticsBaseUrl],\n [\"https://api.stack-auth.com\", \"https://r.stack-auth.com\"], // for legacy compatibility\n]);\n\nexport function getAnalyticsBaseUrl(regularBaseUrl: string): string {\n return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;\n}\n\n\nfunction fetchBackendUrlsInBackground(primaryBaseUrl: string): void {\n createGlobal('__stack-fetch-backend-urls-started', () => {\n runAsynchronously(async () => {\n try {\n const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);\n if (!res.ok) {\n return;\n }\n const data = await res.json();\n if (!Array.isArray(data.urls) || !data.urls.every((u: unknown) => typeof u === 'string')) {\n return;\n }\n createGlobal('__stack-fetched-backend-urls', () => data.urls as string[]);\n } catch (e) {\n captureError('fetch-backend-urls-in-background', e);\n }\n });\n return true;\n });\n}\n\nexport function resolveApiUrls(userExplicitBaseUrl: string | { browser: string, server: string } | undefined): () => string[] {\n return () => {\n if (userExplicitBaseUrl != null) {\n return [getBaseUrl(userExplicitBaseUrl)];\n }\n const primary = getBaseUrl(undefined);\n // Always try to fetch server-configured URLs (supports custom domains via\n // STACK_BACKEND_URLS_CONFIG). Hardcoded fallbacks are used as a default\n // until the background fetch completes.\n fetchBackendUrlsInBackground(primary);\n return getGlobal('__stack-fetched-backend-urls') ?? getDefaultApiUrls(primary);\n };\n}\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByHookId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n // on the dashboard, we do some perf monitoring for pre-fetching which should hook right in here\n const asyncCacheHooks: any[] = getGlobal(\"use-async-cache-execution-hooks\") ?? [];\n for (const hook of asyncCacheHooks) {\n hook({ cache, caller, dependencies });\n }\n\n const id = React.useId();\n\n // whenever the dependencies change, we need to refresh the promise cache\n React.useEffect(() => {\n cachePromiseByHookId.delete(id);\n }, [...dependencies, id]);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByHookId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByHookId.has(id)) {\n cachePromiseByHookId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByHookId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error on Next.js (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n const result = use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"common.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/common.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { InternalSession } from \"@hexclave/shared/dist/sessions\";\nimport { AsyncCache } from \"@hexclave/shared/dist/utils/caches\";\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { HexclaveAssertionError, captureError, concatStacktraces, throwErr } from \"@hexclave/shared/dist/utils/errors\";\nimport { createGlobal, getGlobal } from \"@hexclave/shared/dist/utils/globals\";\nimport { filterUndefined, omit } from \"@hexclave/shared/dist/utils/objects\";\nimport { ReactPromise, runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { suspendIfSsr, use } from \"@hexclave/shared/dist/utils/react\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { Store } from \"@hexclave/shared/dist/utils/stores\";\nimport { getDefaultApiUrls } from \"@hexclave/shared/dist/utils/urls\";\nimport React, { useCallback } from \"react\"; // THIS_LINE_PLATFORM react-like\nimport { envVars } from \"../../../env\";\nimport { HandlerUrlOptions, ResolvedHandlerUrls, stackAppInternalsSymbol } from \"../../common\";\nimport { resolveHandlerUrls } from \"../../url-targets\";\n\nexport const clientVersion = \"STACK_COMPILE_TIME_CLIENT_PACKAGE_VERSION_SENTINEL\";\nif (clientVersion.startsWith(\"STACK_COMPILE_TIME\")) {\n throw new HexclaveAssertionError(\"Client version was not replaced. Something went wrong during build!\");\n}\n\nconst replaceStackPortPrefix = <T extends string | undefined>(input: T): T => {\n if (!input) return input;\n const prefix = envVars.NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX;\n return prefix ? input.replace(/\\$\\{NEXT_PUBLIC_HEXCLAVE_PORT_PREFIX:-81\\}/g, prefix) as T : input;\n};\n\n\nexport const createCache = <D extends any[], T>(fetcher: (dependencies: D) => Promise<T>) => {\n return new AsyncCache<D, Result<T>>(\n async (dependencies) => await Result.fromThrowingAsync(async () => await fetcher(dependencies)),\n {},\n );\n};\n\nexport const createCacheBySession = <D extends any[], T>(fetcher: (session: InternalSession, extraDependencies: D) => Promise<T> ) => {\n return new AsyncCache<[InternalSession, ...D], Result<T>>(\n async ([session, ...extraDependencies]) => await Result.fromThrowingAsync(async () => await fetcher(session, extraDependencies)),\n {\n onSubscribe: ([session], refresh) => {\n const handler = session.onInvalidate(() => refresh());\n return () => handler.unsubscribe();\n },\n },\n );\n};\n\n\ntype AppLike = { [stackAppInternalsSymbol]: { getConstructorOptions: () => any } };\nexport function resolveConstructorOptions<T extends { inheritsFrom?: AppLike }>(options: T): T & { inheritsFrom?: undefined } {\n return {\n ...options.inheritsFrom?.[stackAppInternalsSymbol].getConstructorOptions() ?? {},\n ...filterUndefined(omit(options, [\"inheritsFrom\"])),\n };\n}\n\nexport function getUrls(partial: HandlerUrlOptions, options: { projectId: string }): ResolvedHandlerUrls {\n return resolveHandlerUrls({\n urls: partial,\n projectId: options.projectId,\n });\n}\n\nexport function getDefaultProjectId() {\n return envVars.NEXT_PUBLIC_STACK_PROJECT_ID || envVars.STACK_PROJECT_ID || throwErr(new Error(\"Welcome to Hexclave! It seems that you haven't provided a project ID. Please create a project on the Hexclave dashboard at https://app.hexclave.com and put it in the NEXT_PUBLIC_STACK_PROJECT_ID environment variable.\"));\n}\n\nexport function getDefaultPublishableClientKey() {\n return envVars.NEXT_PUBLIC_STACK_PUBLISHABLE_CLIENT_KEY || envVars.STACK_PUBLISHABLE_CLIENT_KEY;\n}\n\nexport function getDefaultSecretServerKey() {\n return envVars.STACK_SECRET_SERVER_KEY || throwErr(new Error(\"No secret server key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SECRET_SERVER_KEY environment variable.\"));\n}\n\nexport function getDefaultSuperSecretAdminKey() {\n return envVars.STACK_SUPER_SECRET_ADMIN_KEY || throwErr(new Error(\"No super secret admin key provided. Please copy your key from the Hexclave dashboard and put it in the STACK_SUPER_SECRET_ADMIN_KEY environment variable.\"));\n}\n\nexport function getDefaultExtraRequestHeaders() {\n return JSON.parse(envVars.NEXT_PUBLIC_STACK_EXTRA_REQUEST_HEADERS || envVars.STACK_EXTRA_REQUEST_HEADERS || '{}');\n}\n\n/**\n * Returns the base URL for the Stack API.\n *\n * The URL can be specified in several ways, in order of precedence:\n * 1. Directly through userSpecifiedBaseUrl parameter as string or browser/server object\n * 2. Through environment variables:\n * - Browser: NEXT_PUBLIC_BROWSER_STACK_API_URL\n * - Server: NEXT_PUBLIC_SERVER_STACK_API_URL\n * - Fallback: NEXT_PUBLIC_STACK_API_URL or NEXT_PUBLIC_STACK_URL\n * 3. Default base URL if none of the above are specified\n *\n * The function also ensures the URL doesn't end with a trailing slash\n * by removing it if present.\n *\n * @param userSpecifiedBaseUrl - Optional URL override as string or {browser, server} object\n * @returns The configured base URL without trailing slash\n\n */\nexport function getBaseUrl(userSpecifiedBaseUrl: string | { browser: string, server: string } | undefined) {\n let url;\n if (userSpecifiedBaseUrl) {\n if (typeof userSpecifiedBaseUrl === \"string\") {\n url = userSpecifiedBaseUrl;\n } else {\n if (isBrowserLike()) {\n url = userSpecifiedBaseUrl.browser;\n } else {\n url = userSpecifiedBaseUrl.server;\n }\n }\n } else {\n // note: NEXT_PUBLIC_BROWSER_STACK_API_URL was renamed to NEXT_PUBLIC_STACK_API_URL_BROWSER, and NEXT_PUBLIC_STACK_URL to NEXT_PUBLIC_STACK_API_URL\n if (isBrowserLike()) {\n url = envVars.NEXT_PUBLIC_BROWSER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_BROWSER || envVars.STACK_API_URL_BROWSER;\n } else {\n url = envVars.NEXT_PUBLIC_SERVER_STACK_API_URL || envVars.NEXT_PUBLIC_STACK_API_URL_SERVER || envVars.STACK_API_URL_SERVER;\n }\n url = url || envVars.NEXT_PUBLIC_STACK_API_URL || envVars.STACK_API_URL || envVars.NEXT_PUBLIC_STACK_URL || defaultBaseUrl;\n }\n\n return replaceStackPortPrefix(url.endsWith('/') ? url.slice(0, -1) : url);\n}\n\nexport const defaultBaseUrl = \"https://api.hexclave.com\";\nexport const defaultAnalyticsBaseUrl = \"https://r.hexclave.com\";\n\nconst analyticsBaseUrlsByApiBaseUrl = new Map<string, string>([\n [defaultBaseUrl, defaultAnalyticsBaseUrl],\n [\"https://api.stack-auth.com\", \"https://r.stack-auth.com\"],\n]);\n\nexport function getAnalyticsBaseUrl(regularBaseUrl: string): string {\n return analyticsBaseUrlsByApiBaseUrl.get(regularBaseUrl) ?? regularBaseUrl;\n}\n\n\nfunction fetchBackendUrlsInBackground(primaryBaseUrl: string): void {\n createGlobal('__stack-fetch-backend-urls-started', () => {\n runAsynchronously(async () => {\n try {\n const res = await fetch(`${primaryBaseUrl}/api/v1/internal/backend-urls`);\n if (!res.ok) {\n return;\n }\n const data = await res.json();\n if (!Array.isArray(data.urls) || !data.urls.every((u: unknown) => typeof u === 'string')) {\n return;\n }\n createGlobal('__stack-fetched-backend-urls', () => data.urls as string[]);\n } catch (e) {\n captureError('fetch-backend-urls-in-background', e);\n }\n });\n return true;\n });\n}\n\nexport function resolveApiUrls(userExplicitBaseUrl: string | { browser: string, server: string } | undefined): () => string[] {\n return () => {\n if (userExplicitBaseUrl != null) {\n return [getBaseUrl(userExplicitBaseUrl)];\n }\n const primary = getBaseUrl(undefined);\n // Always try to fetch server-configured URLs (supports custom domains via\n // STACK_BACKEND_URLS_CONFIG). Hardcoded fallbacks are used as a default\n // until the background fetch completes.\n fetchBackendUrlsInBackground(primary);\n return getGlobal('__stack-fetched-backend-urls') ?? getDefaultApiUrls(primary);\n };\n}\n\nexport type TokenObject = {\n accessToken: string | null,\n refreshToken: string | null,\n};\n\nexport function createEmptyTokenStore() {\n return new Store<TokenObject>({\n refreshToken: null,\n accessToken: null,\n });\n}\n\n\nconst cachePromiseByHookId = new Map<string, ReactPromise<Result<unknown>>>();\nexport function useAsyncCache<D extends any[], T>(cache: AsyncCache<D, Result<T>>, dependencies: D, caller: string): T {\n // we explicitly don't want to run this hook in SSR\n suspendIfSsr(caller);\n\n // on the dashboard, we do some perf monitoring for pre-fetching which should hook right in here\n const asyncCacheHooks: any[] = getGlobal(\"use-async-cache-execution-hooks\") ?? [];\n for (const hook of asyncCacheHooks) {\n hook({ cache, caller, dependencies });\n }\n\n const id = React.useId();\n\n // whenever the dependencies change, we need to refresh the promise cache\n React.useEffect(() => {\n cachePromiseByHookId.delete(id);\n }, [...dependencies, id]);\n\n const subscribe = useCallback((cb: () => void) => {\n const { unsubscribe } = cache.onStateChange(dependencies, () => {\n cachePromiseByHookId.delete(id);\n cb();\n });\n return unsubscribe;\n }, [cache, ...dependencies]);\n const getSnapshot = useCallback(() => {\n // React checks whether a promise passed to `use` is still the same as the previous one by comparing the reference.\n // If we didn't cache here, this wouldn't work because the promise would be recreated every time the value changes.\n if (!cachePromiseByHookId.has(id)) {\n cachePromiseByHookId.set(id, cache.getOrWait(dependencies, \"read-write\"));\n }\n return cachePromiseByHookId.get(id) as ReactPromise<Result<T>>;\n }, [cache, ...dependencies]);\n\n // note: we must use React.useSyncExternalStore instead of importing the function directly, as it will otherwise\n // throw an error on Next.js (\"can't import useSyncExternalStore from the server\")\n const promise = React.useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n );\n\n const result = use(promise);\n if (result.status === \"error\") {\n const error = result.error;\n if (error instanceof Error && !(error as any).__stackHasConcatenatedStacktraces) {\n concatStacktraces(error, new Error());\n (error as any).__stackHasConcatenatedStacktraces = true;\n }\n throw error;\n }\n return result.data;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAa,gBAAgB;AAC7B,IAAI,cAAc,WAAW,qBAAqB,CAChD,OAAM,IAAI,0DAAuB,sEAAsE;AAGzG,MAAM,0BAAwD,UAAgB;AAC5E,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,SAAS,wBAAQ;AACvB,QAAO,SAAS,MAAM,QAAQ,+CAA+C,OAAO,GAAQ;;AAI9F,MAAa,eAAmC,YAA6C;AAC3F,QAAO,IAAI,8CACT,OAAO,iBAAiB,MAAM,2CAAO,kBAAkB,YAAY,MAAM,QAAQ,aAAa,CAAC,EAC/F,EAAE,CACH;;AAGH,MAAa,wBAA4C,YAA6E;AACpI,QAAO,IAAI,8CACT,OAAO,CAAC,SAAS,GAAG,uBAAuB,MAAM,2CAAO,kBAAkB,YAAY,MAAM,QAAQ,SAAS,kBAAkB,CAAC,EAChI,EACE,cAAc,CAAC,UAAU,YAAY;EACnC,MAAM,UAAU,QAAQ,mBAAmB,SAAS,CAAC;AACrD,eAAa,QAAQ,aAAa;IAErC,CACF;;AAKH,SAAgB,0BAAgE,SAA8C;AAC5H,QAAO;EACL,GAAG,QAAQ,eAAe,yCAAyB,uBAAuB,IAAI,EAAE;EAChF,0GAAwB,SAAS,CAAC,eAAe,CAAC,CAAC;EACpD;;AAGH,SAAgB,QAAQ,SAA4B,SAAqD;AACvG,qDAA0B;EACxB,MAAM;EACN,WAAW,QAAQ;EACpB,CAAC;;AAGJ,SAAgB,sBAAsB;AACpC,QAAO,wBAAQ,gCAAgC,wBAAQ,qFAA6B,IAAI,MAAM,2NAA2N,CAAC;;AAG5T,SAAgB,iCAAiC;AAC/C,QAAO,wBAAQ,4CAA4C,wBAAQ;;AAGrE,SAAgB,4BAA4B;AAC1C,QAAO,wBAAQ,4FAAoC,IAAI,MAAM,kJAAkJ,CAAC;;AAGlN,SAAgB,gCAAgC;AAC9C,QAAO,wBAAQ,iGAAyC,IAAI,MAAM,4JAA4J,CAAC;;AAGjO,SAAgB,gCAAgC;AAC9C,QAAO,KAAK,MAAM,wBAAQ,2CAA2C,wBAAQ,+BAA+B,KAAK;;;;;;;;;;;;;;;;;;;;AAqBnH,SAAgB,WAAW,sBAAgF;CACzG,IAAI;AACJ,KAAI,qBACF,KAAI,OAAO,yBAAyB,SAClC,OAAM;8DAEa,CACjB,OAAM,qBAAqB;KAE3B,OAAM,qBAAqB;MAG1B;AAEL,0DAAmB,CACjB,OAAM,wBAAQ,qCAAqC,wBAAQ,qCAAqC,wBAAQ;MAExG,OAAM,wBAAQ,oCAAoC,wBAAQ,oCAAoC,wBAAQ;AAExG,QAAM,OAAO,wBAAQ,6BAA6B,wBAAQ,iBAAiB,wBAAQ,yBAAyB;;AAG9G,QAAO,uBAAuB,IAAI,SAAS,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI;;AAG3E,MAAa,iBAAiB;AAC9B,MAAa,0BAA0B;AAEvC,MAAM,gCAAgC,IAAI,IAAoB,CAC5D,CAAC,gBAAgB,wBAAwB,EACzC,CAAC,8BAA8B,2BAA2B,CAC3D,CAAC;AAEF,SAAgB,oBAAoB,gBAAgC;AAClE,QAAO,8BAA8B,IAAI,eAAe,IAAI;;AAI9D,SAAS,6BAA6B,gBAA8B;AAClE,uDAAa,4CAA4C;AACvD,8DAAkB,YAAY;AAC5B,OAAI;IACF,MAAM,MAAM,MAAM,MAAM,GAAG,eAAe,+BAA+B;AACzE,QAAI,CAAC,IAAI,GACP;IAEF,MAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,OAAO,MAAe,OAAO,MAAM,SAAS,CACtF;AAEF,0DAAa,sCAAsC,KAAK,KAAiB;YAClE,GAAG;AACV,yDAAa,oCAAoC,EAAE;;IAErD;AACF,SAAO;GACP;;AAGJ,SAAgB,eAAe,qBAA+F;AAC5H,cAAa;AACX,MAAI,uBAAuB,KACzB,QAAO,CAAC,WAAW,oBAAoB,CAAC;EAE1C,MAAM,UAAU,WAAW,OAAU;AAIrC,+BAA6B,QAAQ;AACrC,4DAAiB,+BAA+B,4DAAsB,QAAQ;;;AASlF,SAAgB,wBAAwB;AACtC,QAAO,IAAI,yCAAmB;EAC5B,cAAc;EACd,aAAa;EACd,CAAC;;AAIJ,MAAM,uCAAuB,IAAI,KAA4C;AAC7E,SAAgB,cAAkC,OAAiC,cAAiB,QAAmB;AAErH,qDAAa,OAAO;CAGpB,MAAM,qEAAmC,kCAAkC,IAAI,EAAE;AACjF,MAAK,MAAM,QAAQ,gBACjB,MAAK;EAAE;EAAO;EAAQ;EAAc,CAAC;CAGvC,MAAM,KAAK,cAAM,OAAO;AAGxB,eAAM,gBAAgB;AACpB,uBAAqB,OAAO,GAAG;IAC9B,CAAC,GAAG,cAAc,GAAG,CAAC;CAEzB,MAAM,oCAAyB,OAAmB;EAChD,MAAM,EAAE,gBAAgB,MAAM,cAAc,oBAAoB;AAC9D,wBAAqB,OAAO,GAAG;AAC/B,OAAI;IACJ;AACF,SAAO;IACN,CAAC,OAAO,GAAG,aAAa,CAAC;CAC5B,MAAM,2CAAgC;AAGpC,MAAI,CAAC,qBAAqB,IAAI,GAAG,CAC/B,sBAAqB,IAAI,IAAI,MAAM,UAAU,cAAc,aAAa,CAAC;AAE3E,SAAO,qBAAqB,IAAI,GAAG;IAClC,CAAC,OAAO,GAAG,aAAa,CAAC;CAU5B,MAAM,oDANU,cAAM,qBACpB,WACA,aACA,YACD,CAE0B;AAC3B,KAAI,OAAO,WAAW,SAAS;EAC7B,MAAM,QAAQ,OAAO;AACrB,MAAI,iBAAiB,SAAS,CAAE,MAAc,mCAAmC;AAC/E,6DAAkB,uBAAO,IAAI,OAAO,CAAC;AACrC,GAAC,MAAc,oCAAoC;;AAErD,QAAM;;AAER,QAAO,OAAO"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
- let _stackframe_stack_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
3
+ let _hexclave_shared_dist_utils_promises = require("@hexclave/shared/dist/utils/promises");
4
+ let _hexclave_shared_dist_utils_env = require("@hexclave/shared/dist/utils/env");
5
5
  let __session_replay_js = require("./session-replay.js");
6
6
 
7
7
  //#region src/lib/stack-app/apps/implementations/event-tracker.ts
@@ -53,14 +53,14 @@ var EventTracker = class {
53
53
  });
54
54
  };
55
55
  this._onPageHide = () => {
56
- (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
56
+ (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
57
57
  };
58
58
  this._deps = deps;
59
59
  this._sessionReplaySegmentId = (0, __session_replay_js.generateUuid)();
60
60
  }
61
61
  start() {
62
62
  if (this._started) return;
63
- if (!(0, _stackframe_stack_shared_dist_utils_env.isBrowserLike)()) return;
63
+ if (!(0, _hexclave_shared_dist_utils_env.isBrowserLike)()) return;
64
64
  if (typeof window.addEventListener !== "function" || typeof window.removeEventListener !== "function" || typeof document.addEventListener !== "function" || typeof document.removeEventListener !== "function" || !hasScreenDimensions(window.screen)) return;
65
65
  this._started = true;
66
66
  this._setupPageViewCapture();
@@ -74,7 +74,7 @@ var EventTracker = class {
74
74
  clearInterval(this._flushTimer);
75
75
  this._flushTimer = null;
76
76
  }
77
- (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
77
+ (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: true }));
78
78
  this._teardown();
79
79
  }
80
80
  clearBuffer() {
@@ -84,7 +84,7 @@ var EventTracker = class {
84
84
  _pushEvent(event) {
85
85
  this._events.push(event);
86
86
  this._approxBytes += JSON.stringify(event).length;
87
- if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
87
+ if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
88
88
  }
89
89
  _capturePageView(entryType) {
90
90
  const screenObject = window.screen;
@@ -204,7 +204,7 @@ var EventTracker = class {
204
204
  }
205
205
  _tick() {
206
206
  if (this._cancelled) return;
207
- if (this._events.length > 0) (0, _stackframe_stack_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
207
+ if (this._events.length > 0) (0, _hexclave_shared_dist_utils_promises.runAsynchronously)(() => this._flush({ keepalive: false }));
208
208
  }
209
209
  };
210
210
 
@@ -1 +1 @@
1
- {"version":3,"file":"event-tracker.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { isBrowserLike } from \"@stackframe/stack-shared/dist/utils/env\";\nimport { runAsynchronously } from \"@stackframe/stack-shared/dist/utils/promises\";\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { generateUuid } from \"./session-replay\";\n\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_EVENTS_PER_BATCH = 50;\nconst MAX_APPROX_BYTES_PER_BATCH = 64_000;\n\nfunction hasScreenDimensions(value: unknown): value is { width: number, height: number } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"width\" in value) || !(\"height\" in value)) {\n return false;\n }\n return typeof value.width === \"number\" && typeof value.height === \"number\";\n}\n\nfunction hasHistoryMethods(value: unknown): value is { pushState: History[\"pushState\"], replaceState: History[\"replaceState\"] } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"pushState\" in value) || !(\"replaceState\" in value)) {\n return false;\n }\n return typeof value.pushState === \"function\" && typeof value.replaceState === \"function\";\n}\n\nexport type EventTrackerDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\ntype TrackedEvent = {\n event_type: \"$page-view\" | \"$click\",\n event_at_ms: number,\n data: Record<string, unknown>,\n};\n\nexport class EventTracker {\n private _started = false;\n private _cancelled = false;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: TrackedEvent[] = [];\n private _approxBytes = 0;\n private _lastUrl: string | null = null;\n private readonly _sessionReplaySegmentId: string;\n private readonly _deps: EventTrackerDeps;\n\n private _originalPushState: History[\"pushState\"] | null = null;\n private _originalReplaceState: History[\"replaceState\"] | null = null;\n\n constructor(deps: EventTrackerDeps) {\n this._deps = deps;\n this._sessionReplaySegmentId = generateUuid();\n }\n\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n if (\n typeof window.addEventListener !== \"function\"\n || typeof window.removeEventListener !== \"function\"\n || typeof document.addEventListener !== \"function\"\n || typeof document.removeEventListener !== \"function\"\n || !hasScreenDimensions(window.screen)\n ) {\n return;\n }\n this._started = true;\n\n this._setupPageViewCapture();\n this._setupClickCapture();\n this._setupPageHideListeners();\n\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._teardown();\n }\n\n clearBuffer() {\n this._events = [];\n this._approxBytes = 0;\n }\n\n private _pushEvent(event: TrackedEvent) {\n this._events.push(event);\n this._approxBytes += JSON.stringify(event).length;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n\n private _capturePageView(entryType: \"initial\" | \"push\" | \"replace\" | \"pop\") {\n const screenObject = window.screen;\n if (!hasScreenDimensions(screenObject)) {\n return;\n }\n\n const url = window.location.href;\n if (url === this._lastUrl && entryType !== \"initial\") return;\n this._lastUrl = url;\n\n this._pushEvent({\n event_type: \"$page-view\",\n event_at_ms: Date.now(),\n data: {\n url,\n path: window.location.pathname,\n referrer: document.referrer,\n title: document.title,\n entry_type: entryType,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n screen_width: screenObject.width,\n screen_height: screenObject.height,\n },\n });\n }\n\n private _setupPageViewCapture() {\n // Fire initial page-view\n this._capturePageView(\"initial\");\n const historyObject = window.history;\n if (!hasHistoryMethods(historyObject)) {\n return;\n }\n const originalPushState = historyObject.pushState;\n const originalReplaceState = historyObject.replaceState;\n\n // Monkey-patch history.pushState\n this._originalPushState = (...args: Parameters<History[\"pushState\"]>) => originalPushState.apply(historyObject, args);\n historyObject.pushState = (...args: Parameters<History[\"pushState\"]>) => {\n this._originalPushState!(...args);\n this._capturePageView(\"push\");\n };\n\n // Monkey-patch history.replaceState\n this._originalReplaceState = (...args: Parameters<History[\"replaceState\"]>) => originalReplaceState.apply(historyObject, args);\n historyObject.replaceState = (...args: Parameters<History[\"replaceState\"]>) => {\n this._originalReplaceState!(...args);\n this._capturePageView(\"replace\");\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this._onPopState);\n }\n\n private readonly _onPopState = () => {\n this._capturePageView(\"pop\");\n };\n\n private _buildSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && depth < 5) {\n let part = current.tagName.toLowerCase();\n if (current.id) {\n part += `#${current.id}`;\n parts.unshift(part);\n break;\n }\n if (current.className && typeof current.className === \"string\") {\n const classes = current.className.trim().split(/\\s+/).filter(Boolean);\n if (classes.length > 0) {\n part += `.${classes.join(\".\")}`;\n }\n }\n parts.unshift(part);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(\" > \");\n }\n\n private _findNearestAnchorHref(element: Element): string | null {\n let current: Element | null = element;\n while (current) {\n if (current.tagName === \"A\" && current.hasAttribute(\"href\")) {\n return current.getAttribute(\"href\");\n }\n current = current.parentElement;\n }\n return null;\n }\n\n private readonly _onClickCapture = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n this._pushEvent({\n event_type: \"$click\",\n event_at_ms: Date.now(),\n data: {\n tag_name: target.tagName.toLowerCase(),\n text: target.textContent.trim().substring(0, 200),\n href: this._findNearestAnchorHref(target),\n selector: this._buildSelector(target),\n x: event.clientX,\n y: event.clientY,\n page_x: event.pageX,\n page_y: event.pageY,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n },\n });\n };\n\n private _setupClickCapture() {\n document.addEventListener(\"click\", this._onClickCapture, { capture: true });\n }\n\n private readonly _onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n\n private _setupPageHideListeners() {\n window.addEventListener(\"pagehide\", this._onPageHide);\n document.addEventListener(\"visibilitychange\", this._onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", this._onPageHide);\n document.removeEventListener(\"visibilitychange\", this._onPageHide);\n };\n }\n\n private _teardown() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n\n // Restore history methods\n const historyObject = window.history;\n if (hasHistoryMethods(historyObject)) {\n if (this._originalPushState) {\n historyObject.pushState = this._originalPushState;\n }\n if (this._originalReplaceState) {\n historyObject.replaceState = this._originalReplaceState;\n }\n }\n this._originalPushState = null;\n this._originalReplaceState = null;\n\n window.removeEventListener(\"popstate\", this._onPopState);\n document.removeEventListener(\"click\", this._onClickCapture, { capture: true });\n\n this._events = [];\n this._approxBytes = 0;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._events.length === 0) return;\n\n const nowMs = Date.now();\n\n const batchId = generateUuid();\n const payload = {\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n sent_at_ms: nowMs,\n events: this._events,\n };\n\n this._events = [];\n this._approxBytes = 0;\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n console.warn(\"EventTracker flush failed:\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n console.warn(\"EventTracker flush failed:\", res.data.status, await res.data.text());\n }\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"event-tracker.js","names":[],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { isBrowserLike } from \"@hexclave/shared/dist/utils/env\";\nimport { runAsynchronously } from \"@hexclave/shared/dist/utils/promises\";\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { generateUuid } from \"./session-replay\";\n\nconst FLUSH_INTERVAL_MS = 10_000;\nconst MAX_EVENTS_PER_BATCH = 50;\nconst MAX_APPROX_BYTES_PER_BATCH = 64_000;\n\nfunction hasScreenDimensions(value: unknown): value is { width: number, height: number } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"width\" in value) || !(\"height\" in value)) {\n return false;\n }\n return typeof value.width === \"number\" && typeof value.height === \"number\";\n}\n\nfunction hasHistoryMethods(value: unknown): value is { pushState: History[\"pushState\"], replaceState: History[\"replaceState\"] } {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n if (!(\"pushState\" in value) || !(\"replaceState\" in value)) {\n return false;\n }\n return typeof value.pushState === \"function\" && typeof value.replaceState === \"function\";\n}\n\nexport type EventTrackerDeps = {\n projectId: string,\n sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,\n};\n\ntype TrackedEvent = {\n event_type: \"$page-view\" | \"$click\",\n event_at_ms: number,\n data: Record<string, unknown>,\n};\n\nexport class EventTracker {\n private _started = false;\n private _cancelled = false;\n private _detachListeners: (() => void) | null = null;\n private _flushTimer: ReturnType<typeof setInterval> | null = null;\n private _events: TrackedEvent[] = [];\n private _approxBytes = 0;\n private _lastUrl: string | null = null;\n private readonly _sessionReplaySegmentId: string;\n private readonly _deps: EventTrackerDeps;\n\n private _originalPushState: History[\"pushState\"] | null = null;\n private _originalReplaceState: History[\"replaceState\"] | null = null;\n\n constructor(deps: EventTrackerDeps) {\n this._deps = deps;\n this._sessionReplaySegmentId = generateUuid();\n }\n\n start() {\n if (this._started) return;\n if (!isBrowserLike()) return;\n if (\n typeof window.addEventListener !== \"function\"\n || typeof window.removeEventListener !== \"function\"\n || typeof document.addEventListener !== \"function\"\n || typeof document.removeEventListener !== \"function\"\n || !hasScreenDimensions(window.screen)\n ) {\n return;\n }\n this._started = true;\n\n this._setupPageViewCapture();\n this._setupClickCapture();\n this._setupPageHideListeners();\n\n this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);\n }\n\n stop() {\n this._cancelled = true;\n if (this._flushTimer !== null) {\n clearInterval(this._flushTimer);\n this._flushTimer = null;\n }\n runAsynchronously(() => this._flush({ keepalive: true }));\n this._teardown();\n }\n\n clearBuffer() {\n this._events = [];\n this._approxBytes = 0;\n }\n\n private _pushEvent(event: TrackedEvent) {\n this._events.push(event);\n this._approxBytes += JSON.stringify(event).length;\n if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n\n private _capturePageView(entryType: \"initial\" | \"push\" | \"replace\" | \"pop\") {\n const screenObject = window.screen;\n if (!hasScreenDimensions(screenObject)) {\n return;\n }\n\n const url = window.location.href;\n if (url === this._lastUrl && entryType !== \"initial\") return;\n this._lastUrl = url;\n\n this._pushEvent({\n event_type: \"$page-view\",\n event_at_ms: Date.now(),\n data: {\n url,\n path: window.location.pathname,\n referrer: document.referrer,\n title: document.title,\n entry_type: entryType,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n screen_width: screenObject.width,\n screen_height: screenObject.height,\n },\n });\n }\n\n private _setupPageViewCapture() {\n // Fire initial page-view\n this._capturePageView(\"initial\");\n const historyObject = window.history;\n if (!hasHistoryMethods(historyObject)) {\n return;\n }\n const originalPushState = historyObject.pushState;\n const originalReplaceState = historyObject.replaceState;\n\n // Monkey-patch history.pushState\n this._originalPushState = (...args: Parameters<History[\"pushState\"]>) => originalPushState.apply(historyObject, args);\n historyObject.pushState = (...args: Parameters<History[\"pushState\"]>) => {\n this._originalPushState!(...args);\n this._capturePageView(\"push\");\n };\n\n // Monkey-patch history.replaceState\n this._originalReplaceState = (...args: Parameters<History[\"replaceState\"]>) => originalReplaceState.apply(historyObject, args);\n historyObject.replaceState = (...args: Parameters<History[\"replaceState\"]>) => {\n this._originalReplaceState!(...args);\n this._capturePageView(\"replace\");\n };\n\n // Listen for popstate (back/forward navigation)\n window.addEventListener(\"popstate\", this._onPopState);\n }\n\n private readonly _onPopState = () => {\n this._capturePageView(\"pop\");\n };\n\n private _buildSelector(element: Element): string {\n const parts: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n\n while (current && depth < 5) {\n let part = current.tagName.toLowerCase();\n if (current.id) {\n part += `#${current.id}`;\n parts.unshift(part);\n break;\n }\n if (current.className && typeof current.className === \"string\") {\n const classes = current.className.trim().split(/\\s+/).filter(Boolean);\n if (classes.length > 0) {\n part += `.${classes.join(\".\")}`;\n }\n }\n parts.unshift(part);\n current = current.parentElement;\n depth++;\n }\n\n return parts.join(\" > \");\n }\n\n private _findNearestAnchorHref(element: Element): string | null {\n let current: Element | null = element;\n while (current) {\n if (current.tagName === \"A\" && current.hasAttribute(\"href\")) {\n return current.getAttribute(\"href\");\n }\n current = current.parentElement;\n }\n return null;\n }\n\n private readonly _onClickCapture = (event: MouseEvent) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n this._pushEvent({\n event_type: \"$click\",\n event_at_ms: Date.now(),\n data: {\n tag_name: target.tagName.toLowerCase(),\n text: target.textContent.trim().substring(0, 200),\n href: this._findNearestAnchorHref(target),\n selector: this._buildSelector(target),\n x: event.clientX,\n y: event.clientY,\n page_x: event.pageX,\n page_y: event.pageY,\n viewport_width: window.innerWidth,\n viewport_height: window.innerHeight,\n },\n });\n };\n\n private _setupClickCapture() {\n document.addEventListener(\"click\", this._onClickCapture, { capture: true });\n }\n\n private readonly _onPageHide = () => {\n runAsynchronously(() => this._flush({ keepalive: true }));\n };\n\n private _setupPageHideListeners() {\n window.addEventListener(\"pagehide\", this._onPageHide);\n document.addEventListener(\"visibilitychange\", this._onPageHide);\n this._detachListeners = () => {\n window.removeEventListener(\"pagehide\", this._onPageHide);\n document.removeEventListener(\"visibilitychange\", this._onPageHide);\n };\n }\n\n private _teardown() {\n if (this._detachListeners) {\n this._detachListeners();\n this._detachListeners = null;\n }\n\n // Restore history methods\n const historyObject = window.history;\n if (hasHistoryMethods(historyObject)) {\n if (this._originalPushState) {\n historyObject.pushState = this._originalPushState;\n }\n if (this._originalReplaceState) {\n historyObject.replaceState = this._originalReplaceState;\n }\n }\n this._originalPushState = null;\n this._originalReplaceState = null;\n\n window.removeEventListener(\"popstate\", this._onPopState);\n document.removeEventListener(\"click\", this._onClickCapture, { capture: true });\n\n this._events = [];\n this._approxBytes = 0;\n }\n\n private async _flush(options: { keepalive: boolean }) {\n if (this._events.length === 0) return;\n\n const nowMs = Date.now();\n\n const batchId = generateUuid();\n const payload = {\n session_replay_segment_id: this._sessionReplaySegmentId,\n batch_id: batchId,\n sent_at_ms: nowMs,\n events: this._events,\n };\n\n this._events = [];\n this._approxBytes = 0;\n\n const res = await this._deps.sendBatch(\n JSON.stringify(payload),\n { keepalive: options.keepalive },\n );\n\n if (res.status === \"error\") {\n console.warn(\"EventTracker flush failed:\", res.error);\n return;\n }\n\n if (!res.data.ok) {\n console.warn(\"EventTracker flush failed:\", res.data.status, await res.data.text());\n }\n }\n\n private _tick() {\n if (this._cancelled) return;\n if (this._events.length > 0) {\n runAsynchronously(() => this._flush({ keepalive: false }));\n }\n }\n}\n"],"mappings":";;;;;;;AASA,MAAM,oBAAoB;AAC1B,MAAM,uBAAuB;AAC7B,MAAM,6BAA6B;AAEnC,SAAS,oBAAoB,OAA4D;AACvF,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AAET,KAAI,EAAE,WAAW,UAAU,EAAE,YAAY,OACvC,QAAO;AAET,QAAO,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,WAAW;;AAGpE,SAAS,kBAAkB,OAAqG;AAC9H,KAAI,SAAS,QAAQ,OAAO,UAAU,SACpC,QAAO;AAET,KAAI,EAAE,eAAe,UAAU,EAAE,kBAAkB,OACjD,QAAO;AAET,QAAO,OAAO,MAAM,cAAc,cAAc,OAAO,MAAM,iBAAiB;;AAchF,IAAa,eAAb,MAA0B;CAcxB,YAAY,MAAwB;kBAbjB;oBACE;0BAC2B;qBACa;iBAC3B,EAAE;sBACb;kBACW;4BAIwB;+BACM;2BA0G3B;AACnC,QAAK,iBAAiB,MAAM;;0BAwCM,UAAsB;GACxD,MAAM,SAAS,MAAM;AACrB,OAAI,EAAE,kBAAkB,SAAU;AAElC,QAAK,WAAW;IACd,YAAY;IACZ,aAAa,KAAK,KAAK;IACvB,MAAM;KACJ,UAAU,OAAO,QAAQ,aAAa;KACtC,MAAM,OAAO,YAAY,MAAM,CAAC,UAAU,GAAG,IAAI;KACjD,MAAM,KAAK,uBAAuB,OAAO;KACzC,UAAU,KAAK,eAAe,OAAO;KACrC,GAAG,MAAM;KACT,GAAG,MAAM;KACT,QAAQ,MAAM;KACd,QAAQ,MAAM;KACd,gBAAgB,OAAO;KACvB,iBAAiB,OAAO;KACzB;IACF,CAAC;;2BAOiC;AACnC,qEAAwB,KAAK,OAAO,EAAE,WAAW,MAAM,CAAC,CAAC;;AA3KzD,OAAK,QAAQ;AACb,OAAK,iEAAwC;;CAG/C,QAAQ;AACN,MAAI,KAAK,SAAU;AACnB,MAAI,qDAAgB,CAAE;AACtB,MACE,OAAO,OAAO,qBAAqB,cAChC,OAAO,OAAO,wBAAwB,cACtC,OAAO,SAAS,qBAAqB,cACrC,OAAO,SAAS,wBAAwB,cACxC,CAAC,oBAAoB,OAAO,OAAO,CAEtC;AAEF,OAAK,WAAW;AAEhB,OAAK,uBAAuB;AAC5B,OAAK,oBAAoB;AACzB,OAAK,yBAAyB;AAE9B,OAAK,cAAc,kBAAkB,KAAK,OAAO,EAAE,kBAAkB;;CAGvE,OAAO;AACL,OAAK,aAAa;AAClB,MAAI,KAAK,gBAAgB,MAAM;AAC7B,iBAAc,KAAK,YAAY;AAC/B,QAAK,cAAc;;AAErB,oEAAwB,KAAK,OAAO,EAAE,WAAW,MAAM,CAAC,CAAC;AACzD,OAAK,WAAW;;CAGlB,cAAc;AACZ,OAAK,UAAU,EAAE;AACjB,OAAK,eAAe;;CAGtB,AAAQ,WAAW,OAAqB;AACtC,OAAK,QAAQ,KAAK,MAAM;AACxB,OAAK,gBAAgB,KAAK,UAAU,MAAM,CAAC;AAC3C,MAAI,KAAK,QAAQ,UAAU,wBAAwB,KAAK,gBAAgB,2BACtE,mEAAwB,KAAK,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC;;CAI9D,AAAQ,iBAAiB,WAAmD;EAC1E,MAAM,eAAe,OAAO;AAC5B,MAAI,CAAC,oBAAoB,aAAa,CACpC;EAGF,MAAM,MAAM,OAAO,SAAS;AAC5B,MAAI,QAAQ,KAAK,YAAY,cAAc,UAAW;AACtD,OAAK,WAAW;AAEhB,OAAK,WAAW;GACd,YAAY;GACZ,aAAa,KAAK,KAAK;GACvB,MAAM;IACJ;IACA,MAAM,OAAO,SAAS;IACtB,UAAU,SAAS;IACnB,OAAO,SAAS;IAChB,YAAY;IACZ,gBAAgB,OAAO;IACvB,iBAAiB,OAAO;IACxB,cAAc,aAAa;IAC3B,eAAe,aAAa;IAC7B;GACF,CAAC;;CAGJ,AAAQ,wBAAwB;AAE9B,OAAK,iBAAiB,UAAU;EAChC,MAAM,gBAAgB,OAAO;AAC7B,MAAI,CAAC,kBAAkB,cAAc,CACnC;EAEF,MAAM,oBAAoB,cAAc;EACxC,MAAM,uBAAuB,cAAc;AAG3C,OAAK,sBAAsB,GAAG,SAA2C,kBAAkB,MAAM,eAAe,KAAK;AACrH,gBAAc,aAAa,GAAG,SAA2C;AACvE,QAAK,mBAAoB,GAAG,KAAK;AACjC,QAAK,iBAAiB,OAAO;;AAI/B,OAAK,yBAAyB,GAAG,SAA8C,qBAAqB,MAAM,eAAe,KAAK;AAC9H,gBAAc,gBAAgB,GAAG,SAA8C;AAC7E,QAAK,sBAAuB,GAAG,KAAK;AACpC,QAAK,iBAAiB,UAAU;;AAIlC,SAAO,iBAAiB,YAAY,KAAK,YAAY;;CAOvD,AAAQ,eAAe,SAA0B;EAC/C,MAAM,QAAkB,EAAE;EAC1B,IAAI,UAA0B;EAC9B,IAAI,QAAQ;AAEZ,SAAO,WAAW,QAAQ,GAAG;GAC3B,IAAI,OAAO,QAAQ,QAAQ,aAAa;AACxC,OAAI,QAAQ,IAAI;AACd,YAAQ,IAAI,QAAQ;AACpB,UAAM,QAAQ,KAAK;AACnB;;AAEF,OAAI,QAAQ,aAAa,OAAO,QAAQ,cAAc,UAAU;IAC9D,MAAM,UAAU,QAAQ,UAAU,MAAM,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ;AACrE,QAAI,QAAQ,SAAS,EACnB,SAAQ,IAAI,QAAQ,KAAK,IAAI;;AAGjC,SAAM,QAAQ,KAAK;AACnB,aAAU,QAAQ;AAClB;;AAGF,SAAO,MAAM,KAAK,MAAM;;CAG1B,AAAQ,uBAAuB,SAAiC;EAC9D,IAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,OAAI,QAAQ,YAAY,OAAO,QAAQ,aAAa,OAAO,CACzD,QAAO,QAAQ,aAAa,OAAO;AAErC,aAAU,QAAQ;;AAEpB,SAAO;;CAyBT,AAAQ,qBAAqB;AAC3B,WAAS,iBAAiB,SAAS,KAAK,iBAAiB,EAAE,SAAS,MAAM,CAAC;;CAO7E,AAAQ,0BAA0B;AAChC,SAAO,iBAAiB,YAAY,KAAK,YAAY;AACrD,WAAS,iBAAiB,oBAAoB,KAAK,YAAY;AAC/D,OAAK,yBAAyB;AAC5B,UAAO,oBAAoB,YAAY,KAAK,YAAY;AACxD,YAAS,oBAAoB,oBAAoB,KAAK,YAAY;;;CAItE,AAAQ,YAAY;AAClB,MAAI,KAAK,kBAAkB;AACzB,QAAK,kBAAkB;AACvB,QAAK,mBAAmB;;EAI1B,MAAM,gBAAgB,OAAO;AAC7B,MAAI,kBAAkB,cAAc,EAAE;AACpC,OAAI,KAAK,mBACP,eAAc,YAAY,KAAK;AAEjC,OAAI,KAAK,sBACP,eAAc,eAAe,KAAK;;AAGtC,OAAK,qBAAqB;AAC1B,OAAK,wBAAwB;AAE7B,SAAO,oBAAoB,YAAY,KAAK,YAAY;AACxD,WAAS,oBAAoB,SAAS,KAAK,iBAAiB,EAAE,SAAS,MAAM,CAAC;AAE9E,OAAK,UAAU,EAAE;AACjB,OAAK,eAAe;;CAGtB,MAAc,OAAO,SAAiC;AACpD,MAAI,KAAK,QAAQ,WAAW,EAAG;EAE/B,MAAM,QAAQ,KAAK,KAAK;EAExB,MAAM,iDAAwB;EAC9B,MAAM,UAAU;GACd,2BAA2B,KAAK;GAChC,UAAU;GACV,YAAY;GACZ,QAAQ,KAAK;GACd;AAED,OAAK,UAAU,EAAE;AACjB,OAAK,eAAe;EAEpB,MAAM,MAAM,MAAM,KAAK,MAAM,UAC3B,KAAK,UAAU,QAAQ,EACvB,EAAE,WAAW,QAAQ,WAAW,CACjC;AAED,MAAI,IAAI,WAAW,SAAS;AAC1B,WAAQ,KAAK,8BAA8B,IAAI,MAAM;AACrD;;AAGF,MAAI,CAAC,IAAI,KAAK,GACZ,SAAQ,KAAK,8BAA8B,IAAI,KAAK,QAAQ,MAAM,IAAI,KAAK,MAAM,CAAC;;CAItF,AAAQ,QAAQ;AACd,MAAI,KAAK,WAAY;AACrB,MAAI,KAAK,QAAQ,SAAS,EACxB,mEAAwB,KAAK,OAAO,EAAE,WAAW,OAAO,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
2
2
  let vitest = require("vitest");
3
- let _stackframe_stack_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
3
+ let _hexclave_shared_dist_utils_results = require("@hexclave/shared/dist/utils/results");
4
4
  let __event_tracker_js = require("./event-tracker.js");
5
5
 
6
6
  //#region src/lib/stack-app/apps/implementations/event-tracker.test.ts
@@ -33,7 +33,7 @@ function getSentEventTypes(sentBodies) {
33
33
  projectId: "internal",
34
34
  sendBatch: async (body) => {
35
35
  sentBodies.push(body);
36
- return _stackframe_stack_shared_dist_utils_results.Result.ok(new Response());
36
+ return _hexclave_shared_dist_utils_results.Result.ok(new Response());
37
37
  }
38
38
  });
39
39
  try {
@@ -64,7 +64,7 @@ function getSentEventTypes(sentBodies) {
64
64
  projectId: "internal",
65
65
  sendBatch: async (body) => {
66
66
  sentBodies.push(body);
67
- return _stackframe_stack_shared_dist_utils_results.Result.ok(new Response());
67
+ return _hexclave_shared_dist_utils_results.Result.ok(new Response());
68
68
  }
69
69
  });
70
70
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"event-tracker.test.js","names":["vi","EventTracker","Result"],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { Result } from \"@stackframe/stack-shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n});\n"],"mappings":";;;;;;;AAUA,eAAe,mBAAmB;AAChC,OAAMA,UAAG,yBAAyB,IAAO;AACzC,OAAM,QAAQ,SAAS;;AAGzB,SAAS,kBAAkB,YAAsB;CAC/C,MAAM,CAAC,QAAQ;CAEf,MAAM,UAAU,KAAK,MAAM,KAAK;AAChC,KAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,YAAY,YAAY,CAAC,MAAM,QAAQ,QAAQ,OAAO,CAC7G,OAAM,IAAI,MAAM,+DAA+D;AAGjF,QAAQ,QAAQ,OAAoC,KAAK,UAAU,MAAM,WAAW;;qBAG7E,sBAAsB;AAC7B,6BAAgB;AACd,YAAG,eAAe;GAClB;AAEF,gBAAG,4EAA4E,YAAY;AACzF,YAAG,eAAe;AAClB,WAAS,KAAK,YAAY;EAE1B,MAAM,mBAAmB,OAAO,yBAAyB,QAAQ,SAAS;EAC1E,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,kBAAkB,MAAM,CAAC,eAAe;AAC/C,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,kBAAkB,IAAI,CAAC,WAAW,WAAW;AACpD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAIC,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,mDAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,YAAS,cAAc,SAAS,EAAE,cAAc,IAAI,WAAW,SAAS;IACtE,SAAS;IACT,SAAS;IACT,SAAS;IACV,CAAC,CAAC;AAEH,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;AAEF,gBAAG,sFAAsF,YAAY;AACnG,YAAG,eAAe;EAElB,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAID,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,mDAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,UAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,yBAAyB;AAE1D,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;EACF"}
1
+ {"version":3,"file":"event-tracker.test.js","names":["vi","EventTracker","Result"],"sources":["../../../../../src/lib/stack-app/apps/implementations/event-tracker.test.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n// @vitest-environment jsdom\n\nimport { Result } from \"@hexclave/shared/dist/utils/results\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport { EventTracker } from \"./event-tracker\";\n\nasync function advancePastFlush() {\n await vi.advanceTimersByTimeAsync(10_000);\n await Promise.resolve();\n}\n\nfunction getSentEventTypes(sentBodies: string[]) {\n const [body] = sentBodies;\n\n const payload = JSON.parse(body);\n if (typeof payload !== \"object\" || payload === null || !(\"events\" in payload) || !Array.isArray(payload.events)) {\n throw new Error(\"Expected analytics batch payload to include an events array.\");\n }\n\n return (payload.events as { event_type: string }[]).map((event) => event.event_type);\n}\n\ndescribe(\"EventTracker\", () => {\n afterEach(() => {\n vi.useRealTimers();\n });\n\n it(\"captures events when browser globals are exposed as accessor descriptors\", async () => {\n vi.useFakeTimers();\n document.body.innerHTML = \"<button>Open project</button>\";\n\n const screenDescriptor = Object.getOwnPropertyDescriptor(window, \"screen\");\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(screenDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.value).toBeUndefined();\n expect(screenDescriptor?.get).toBeTypeOf(\"function\");\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n document.querySelector(\"button\")?.dispatchEvent(new MouseEvent(\"click\", {\n bubbles: true,\n clientX: 12,\n clientY: 34,\n }));\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$click\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n\n it(\"captures client-side navigations when history is exposed as an accessor descriptor\", async () => {\n vi.useFakeTimers();\n\n const historyDescriptor = Object.getOwnPropertyDescriptor(window, \"history\");\n expect(historyDescriptor?.value).toBeUndefined();\n expect(historyDescriptor?.get).toBeTypeOf(\"function\");\n\n const sentBodies: string[] = [];\n const tracker = new EventTracker({\n projectId: \"internal\",\n sendBatch: async (body) => {\n sentBodies.push(body);\n return Result.ok(new Response());\n },\n });\n\n try {\n tracker.start();\n window.history.pushState({}, \"\", \"/projects/test-project\");\n\n await advancePastFlush();\n\n expect(getSentEventTypes(sentBodies)).toMatchInlineSnapshot(`\n [\n \"$page-view\",\n \"$page-view\",\n ]\n `);\n } finally {\n tracker.stop();\n }\n });\n});\n"],"mappings":";;;;;;;AAUA,eAAe,mBAAmB;AAChC,OAAMA,UAAG,yBAAyB,IAAO;AACzC,OAAM,QAAQ,SAAS;;AAGzB,SAAS,kBAAkB,YAAsB;CAC/C,MAAM,CAAC,QAAQ;CAEf,MAAM,UAAU,KAAK,MAAM,KAAK;AAChC,KAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,EAAE,YAAY,YAAY,CAAC,MAAM,QAAQ,QAAQ,OAAO,CAC7G,OAAM,IAAI,MAAM,+DAA+D;AAGjF,QAAQ,QAAQ,OAAoC,KAAK,UAAU,MAAM,WAAW;;qBAG7E,sBAAsB;AAC7B,6BAAgB;AACd,YAAG,eAAe;GAClB;AAEF,gBAAG,4EAA4E,YAAY;AACzF,YAAG,eAAe;AAClB,WAAS,KAAK,YAAY;EAE1B,MAAM,mBAAmB,OAAO,yBAAyB,QAAQ,SAAS;EAC1E,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,kBAAkB,MAAM,CAAC,eAAe;AAC/C,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,kBAAkB,IAAI,CAAC,WAAW,WAAW;AACpD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAIC,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,2CAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,YAAS,cAAc,SAAS,EAAE,cAAc,IAAI,WAAW,SAAS;IACtE,SAAS;IACT,SAAS;IACT,SAAS;IACV,CAAC,CAAC;AAEH,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;AAEF,gBAAG,sFAAsF,YAAY;AACnG,YAAG,eAAe;EAElB,MAAM,oBAAoB,OAAO,yBAAyB,QAAQ,UAAU;AAC5E,qBAAO,mBAAmB,MAAM,CAAC,eAAe;AAChD,qBAAO,mBAAmB,IAAI,CAAC,WAAW,WAAW;EAErD,MAAM,aAAuB,EAAE;EAC/B,MAAM,UAAU,IAAID,gCAAa;GAC/B,WAAW;GACX,WAAW,OAAO,SAAS;AACzB,eAAW,KAAK,KAAK;AACrB,WAAOC,2CAAO,GAAG,IAAI,UAAU,CAAC;;GAEnC,CAAC;AAEF,MAAI;AACF,WAAQ,OAAO;AACf,UAAO,QAAQ,UAAU,EAAE,EAAE,IAAI,yBAAyB;AAE1D,SAAM,kBAAkB;AAExB,sBAAO,kBAAkB,WAAW,CAAC,CAAC,sBAAsB;;;;;QAK1D;YACM;AACR,WAAQ,MAAM;;GAEhB;EACF"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
3
  let __server_app_impl_js = require("./server-app-impl.js");
4
- let _stackframe_stack_shared_dist_utils_compile_time = require("@hexclave/shared/dist/utils/compile-time");
4
+ let _hexclave_shared_dist_utils_compile_time = require("@hexclave/shared/dist/utils/compile-time");
5
5
  let __admin_app_impl_js = require("./admin-app-impl.js");
6
6
  let __client_app_impl_js = require("./client-app-impl.js");
7
7
 
@@ -17,9 +17,9 @@ let __client_app_impl_js = require("./client-app-impl.js");
17
17
  function complete() {
18
18
  __client_app_impl_js._StackClientAppImplIncomplete.LazyStackAdminAppImpl.value = __admin_app_impl_js._StackAdminAppImplIncomplete;
19
19
  return {
20
- _StackAdminAppImpl: (0, _stackframe_stack_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__admin_app_impl_js._StackAdminAppImplIncomplete),
21
- _StackClientAppImpl: (0, _stackframe_stack_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__client_app_impl_js._StackClientAppImplIncomplete),
22
- _StackServerAppImpl: (0, _stackframe_stack_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__server_app_impl_js._StackServerAppImplIncomplete)
20
+ _StackAdminAppImpl: (0, _hexclave_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__admin_app_impl_js._StackAdminAppImplIncomplete),
21
+ _StackClientAppImpl: (0, _hexclave_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__client_app_impl_js._StackClientAppImplIncomplete),
22
+ _StackServerAppImpl: (0, _hexclave_shared_dist_utils_compile_time.scrambleDuringCompileTime)(__server_app_impl_js._StackServerAppImplIncomplete)
23
23
  };
24
24
  }
25
25
  const { _StackAdminAppImpl, _StackClientAppImpl, _StackServerAppImpl } = complete();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_StackAdminAppImplIncomplete","_StackClientAppImplIncomplete","_StackServerAppImplIncomplete"],"sources":["../../../../../src/lib/stack-app/apps/implementations/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { scrambleDuringCompileTime } from \"@stackframe/stack-shared/dist/utils/compile-time\";\nimport { _StackAdminAppImplIncomplete } from \"./admin-app-impl\";\nimport { _StackClientAppImplIncomplete } from \"./client-app-impl\";\nimport { _StackServerAppImplIncomplete } from \"./server-app-impl\";\n\n\n/**\n * Prevents a circular dependency between the client and admin apps. For more information, see the documentation comment\n * of `_StackClientAppImplIncomplete.LazyStackAdminAppImpl`.\n *\n * Note: This is an explicitly defined function that returns the new values (and not a barrel file with top-level side\n * effects) because we have `sideEffects: false` in the package.json, and so it would be tree-shaken away if we just\n * exported the values directly.\n */\nfunction complete() {\n _StackClientAppImplIncomplete.LazyStackAdminAppImpl.value = _StackAdminAppImplIncomplete;\n\n return {\n _StackAdminAppImpl: scrambleDuringCompileTime(_StackAdminAppImplIncomplete),\n _StackClientAppImpl: scrambleDuringCompileTime(_StackClientAppImplIncomplete),\n _StackServerAppImpl: scrambleDuringCompileTime(_StackServerAppImplIncomplete),\n };\n}\n\nexport const {\n _StackAdminAppImpl,\n _StackClientAppImpl,\n _StackServerAppImpl\n} = complete();\n\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAS,WAAW;AAClB,oDAA8B,sBAAsB,QAAQA;AAE5D,QAAO;EACL,oGAA8CA,iDAA6B;EAC3E,qGAA+CC,mDAA8B;EAC7E,qGAA+CC,mDAA8B;EAC9E;;AAGH,MAAa,EACX,oBACA,qBACA,wBACE,UAAU"}
1
+ {"version":3,"file":"index.js","names":["_StackAdminAppImplIncomplete","_StackClientAppImplIncomplete","_StackServerAppImplIncomplete"],"sources":["../../../../../src/lib/stack-app/apps/implementations/index.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\n\nimport { scrambleDuringCompileTime } from \"@hexclave/shared/dist/utils/compile-time\";\nimport { _StackAdminAppImplIncomplete } from \"./admin-app-impl\";\nimport { _StackClientAppImplIncomplete } from \"./client-app-impl\";\nimport { _StackServerAppImplIncomplete } from \"./server-app-impl\";\n\n\n/**\n * Prevents a circular dependency between the client and admin apps. For more information, see the documentation comment\n * of `_StackClientAppImplIncomplete.LazyStackAdminAppImpl`.\n *\n * Note: This is an explicitly defined function that returns the new values (and not a barrel file with top-level side\n * effects) because we have `sideEffects: false` in the package.json, and so it would be tree-shaken away if we just\n * exported the values directly.\n */\nfunction complete() {\n _StackClientAppImplIncomplete.LazyStackAdminAppImpl.value = _StackAdminAppImplIncomplete;\n\n return {\n _StackAdminAppImpl: scrambleDuringCompileTime(_StackAdminAppImplIncomplete),\n _StackClientAppImpl: scrambleDuringCompileTime(_StackClientAppImplIncomplete),\n _StackServerAppImpl: scrambleDuringCompileTime(_StackServerAppImplIncomplete),\n };\n}\n\nexport const {\n _StackAdminAppImpl,\n _StackClientAppImpl,\n _StackServerAppImpl\n} = complete();\n\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,SAAS,WAAW;AAClB,oDAA8B,sBAAsB,QAAQA;AAE5D,QAAO;EACL,4FAA8CA,iDAA6B;EAC3E,6FAA+CC,mDAA8B;EAC7E,6FAA+CC,mDAA8B;EAC9E;;AAGH,MAAa,EACX,oBACA,qBACA,wBACE,UAAU"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_chunk = require('../../../../chunk-BE-pF4vm.js');
3
- let _stackframe_stack_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
- let _stackframe_stack_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
3
+ let _hexclave_shared_dist_utils_errors = require("@hexclave/shared/dist/utils/errors");
4
+ let _hexclave_shared_dist_utils_urls = require("@hexclave/shared/dist/utils/urls");
5
5
 
6
6
  //#region src/lib/stack-app/apps/implementations/redirect-page-urls.ts
7
7
  const crossDomainAuthQueryParams = {
@@ -36,7 +36,7 @@ function hasCrossDomainHandoffParams(url) {
36
36
  }
37
37
  function buildCrossDomainAuthCallbackUrl(options) {
38
38
  const localOAuthCallbackUrl = new URL(options.localOAuthCallbackUrl, options.currentUrl);
39
- if (localOAuthCallbackUrl.origin !== options.currentUrl.origin) throw new _stackframe_stack_shared_dist_utils_errors.HexclaveAssertionError("Cross-domain auth callback URL must stay on the current origin", {
39
+ if (localOAuthCallbackUrl.origin !== options.currentUrl.origin) throw new _hexclave_shared_dist_utils_errors.HexclaveAssertionError("Cross-domain auth callback URL must stay on the current origin", {
40
40
  localOAuthCallbackUrl: localOAuthCallbackUrl.toString(),
41
41
  currentUrl: options.currentUrl.toString()
42
42
  });
@@ -59,9 +59,9 @@ function buildRedirectBackAwareHandlerUrl(options) {
59
59
  if (currentValue != null && !hasCrossDomainParam(nextUrl.searchParams, preservedParam)) setCrossDomainParam(nextUrl.searchParams, preservedParam, currentValue);
60
60
  }
61
61
  if (options.handlerName === "signOut") {
62
- if (!nextUrl.searchParams.has("after_auth_return_to")) if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host) nextUrl.searchParams.set("after_auth_return_to", (0, _stackframe_stack_shared_dist_utils_urls.getRelativePart)(options.currentUrl));
62
+ if (!nextUrl.searchParams.has("after_auth_return_to")) if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host) nextUrl.searchParams.set("after_auth_return_to", (0, _hexclave_shared_dist_utils_urls.getRelativePart)(options.currentUrl));
63
63
  else nextUrl.searchParams.set("after_auth_return_to", options.currentUrl.toString());
64
- return nextUrl.origin === options.currentUrl.origin ? (0, _stackframe_stack_shared_dist_utils_urls.getRelativePart)(nextUrl) : nextUrl.toString();
64
+ return nextUrl.origin === options.currentUrl.origin ? (0, _hexclave_shared_dist_utils_urls.getRelativePart)(nextUrl) : nextUrl.toString();
65
65
  }
66
66
  if (options.currentUrl.origin !== nextUrl.origin) {
67
67
  if (!hasCrossDomainHandoffParams(nextUrl)) {
@@ -81,8 +81,8 @@ function buildRedirectBackAwareHandlerUrl(options) {
81
81
  setCrossDomainParam(nextUrl.searchParams, "codeChallenge", options.crossDomainHandoffParams.codeChallenge);
82
82
  }
83
83
  }
84
- } else if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host && !nextUrl.searchParams.has("after_auth_return_to")) nextUrl.searchParams.set("after_auth_return_to", (0, _stackframe_stack_shared_dist_utils_urls.getRelativePart)(options.currentUrl));
85
- return nextUrl.origin === options.currentUrl.origin ? (0, _stackframe_stack_shared_dist_utils_urls.getRelativePart)(nextUrl) : nextUrl.toString();
84
+ } else if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host && !nextUrl.searchParams.has("after_auth_return_to")) nextUrl.searchParams.set("after_auth_return_to", (0, _hexclave_shared_dist_utils_urls.getRelativePart)(options.currentUrl));
85
+ return nextUrl.origin === options.currentUrl.origin ? (0, _hexclave_shared_dist_utils_urls.getRelativePart)(nextUrl) : nextUrl.toString();
86
86
  }
87
87
  function getHandlerRedirectPolicy(handlerName) {
88
88
  if (handlerName === "afterSignIn" || handlerName === "afterSignUp") return "after-auth-return";
@@ -151,7 +151,7 @@ async function planRedirectToHandler(options) {
151
151
  afterCallbackRedirectUrl
152
152
  };
153
153
  }
154
- if (options.handlerName !== "signIn" && options.handlerName !== "signUp" && options.handlerName !== "onboarding" && options.handlerName !== "signOut") throw new _stackframe_stack_shared_dist_utils_errors.HexclaveAssertionError("Unexpected redirect-back-aware handler policy mismatch", {
154
+ if (options.handlerName !== "signIn" && options.handlerName !== "signUp" && options.handlerName !== "onboarding" && options.handlerName !== "signOut") throw new _hexclave_shared_dist_utils_errors.HexclaveAssertionError("Unexpected redirect-back-aware handler policy mismatch", {
155
155
  handlerName: options.handlerName,
156
156
  policy
157
157
  });
@@ -1 +1 @@
1
- {"version":3,"file":"redirect-page-urls.js","names":["HexclaveAssertionError"],"sources":["../../../../../src/lib/stack-app/apps/implementations/redirect-page-urls.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { HexclaveAssertionError } from \"@stackframe/stack-shared/dist/utils/errors\";\nimport { getRelativePart } from \"@stackframe/stack-shared/dist/utils/urls\";\nimport { HandlerUrls } from \"../../common\";\n\nexport const crossDomainAuthQueryParams = {\n marker: \"hexclave_cross_domain_auth\",\n state: \"hexclave_cross_domain_state\",\n codeChallenge: \"hexclave_cross_domain_code_challenge\",\n afterCallbackRedirectUrl: \"hexclave_cross_domain_after_callback_redirect_url\",\n} as const;\n\ntype CrossDomainAuthQueryParamKey = keyof typeof crossDomainAuthQueryParams;\n\nfunction getCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey): string | null {\n return params.get(crossDomainAuthQueryParams[key]);\n}\n\nfunction hasCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey): boolean {\n return params.has(crossDomainAuthQueryParams[key]);\n}\n\nfunction setCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey, value: string): void {\n params.set(crossDomainAuthQueryParams[key], value);\n}\n\nexport type CrossDomainHandoffParams = {\n state: string,\n codeChallenge: string,\n};\n\nexport function getCrossDomainHandoffParamsFromCurrentUrl(currentUrl: URL): CrossDomainHandoffParams | null {\n const state = getCrossDomainParam(currentUrl.searchParams, \"state\");\n const codeChallenge = getCrossDomainParam(currentUrl.searchParams, \"codeChallenge\");\n if (state == null || codeChallenge == null) {\n return null;\n }\n return { state, codeChallenge };\n}\n\ntype RedirectBackAwareHandlerName = \"signIn\" | \"signUp\" | \"onboarding\" | \"signOut\";\ntype HandlerRedirectPolicy = \"none\" | \"redirect-back-aware\" | \"after-auth-return\";\n\ntype CrossDomainHandoffParamsMaybeMissing = {\n state: string | null,\n codeChallenge: string | null,\n afterCallbackRedirectUrl: string | null,\n};\n\nfunction isRedirectBackAwareHandlerName(handlerName: keyof HandlerUrls): handlerName is RedirectBackAwareHandlerName {\n return handlerName === \"signIn\"\n || handlerName === \"signUp\"\n || handlerName === \"onboarding\"\n || handlerName === \"signOut\";\n}\n\nfunction hasCrossDomainHandoffParams(url: URL): boolean {\n return (\n hasCrossDomainParam(url.searchParams, \"state\")\n && hasCrossDomainParam(url.searchParams, \"codeChallenge\")\n && hasCrossDomainParam(url.searchParams, \"afterCallbackRedirectUrl\")\n );\n}\n\nfunction buildCrossDomainAuthCallbackUrl(options: {\n currentUrl: URL,\n localOAuthCallbackUrl: string,\n state?: string,\n codeChallenge?: string,\n afterCallbackRedirectUrl?: string,\n}): URL {\n const localOAuthCallbackUrl = new URL(options.localOAuthCallbackUrl, options.currentUrl);\n if (localOAuthCallbackUrl.origin !== options.currentUrl.origin) {\n throw new HexclaveAssertionError(\"Cross-domain auth callback URL must stay on the current origin\", {\n localOAuthCallbackUrl: localOAuthCallbackUrl.toString(),\n currentUrl: options.currentUrl.toString(),\n });\n }\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"marker\", \"1\");\n if (options.state != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"state\", options.state);\n }\n if (options.codeChallenge != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"codeChallenge\", options.codeChallenge);\n }\n if (options.afterCallbackRedirectUrl != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"afterCallbackRedirectUrl\", options.afterCallbackRedirectUrl);\n }\n return localOAuthCallbackUrl;\n}\n\nfunction buildRedirectBackAwareHandlerUrl(options: {\n handlerName: RedirectBackAwareHandlerName,\n rawHandlerUrl: string,\n currentUrl: URL,\n crossDomainHandoffParams: CrossDomainHandoffParams | null,\n localOAuthCallbackUrl: string,\n}): string {\n const nextUrl = new URL(options.rawHandlerUrl, options.currentUrl);\n // Preserve after_auth_return_to verbatim (not a rebranded param).\n const currentAfterAuthReturnTo = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n if (currentAfterAuthReturnTo != null && !nextUrl.searchParams.has(\"after_auth_return_to\")) {\n nextUrl.searchParams.set(\"after_auth_return_to\", currentAfterAuthReturnTo);\n }\n for (const preservedParam of [\"state\", \"codeChallenge\", \"afterCallbackRedirectUrl\"] as const) {\n const currentValue = getCrossDomainParam(options.currentUrl.searchParams, preservedParam);\n if (currentValue != null && !hasCrossDomainParam(nextUrl.searchParams, preservedParam)) {\n setCrossDomainParam(nextUrl.searchParams, preservedParam, currentValue);\n }\n }\n\n if (options.handlerName === \"signOut\") {\n if (!nextUrl.searchParams.has(\"after_auth_return_to\")) {\n if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host) {\n nextUrl.searchParams.set(\"after_auth_return_to\", getRelativePart(options.currentUrl));\n } else {\n nextUrl.searchParams.set(\"after_auth_return_to\", options.currentUrl.toString());\n }\n }\n return nextUrl.origin === options.currentUrl.origin ? getRelativePart(nextUrl) : nextUrl.toString();\n }\n\n const isCrossDomainHandlerRedirect = options.currentUrl.origin !== nextUrl.origin;\n if (isCrossDomainHandlerRedirect) {\n if (!hasCrossDomainHandoffParams(nextUrl)) {\n const inheritedAfterAuthReturnTo = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n const afterCallbackRedirectUrl = inheritedAfterAuthReturnTo\n ? new URL(inheritedAfterAuthReturnTo, options.currentUrl).toString()\n : options.currentUrl.toString();\n const callbackUrl = buildCrossDomainAuthCallbackUrl({\n currentUrl: options.currentUrl,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n state: options.crossDomainHandoffParams?.state,\n codeChallenge: options.crossDomainHandoffParams?.codeChallenge,\n afterCallbackRedirectUrl,\n });\n\n nextUrl.searchParams.set(\"after_auth_return_to\", callbackUrl.toString());\n setCrossDomainParam(nextUrl.searchParams, \"afterCallbackRedirectUrl\", afterCallbackRedirectUrl);\n if (options.crossDomainHandoffParams != null) {\n setCrossDomainParam(nextUrl.searchParams, \"state\", options.crossDomainHandoffParams.state);\n setCrossDomainParam(nextUrl.searchParams, \"codeChallenge\", options.crossDomainHandoffParams.codeChallenge);\n }\n }\n } else if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host && !nextUrl.searchParams.has(\"after_auth_return_to\")) {\n nextUrl.searchParams.set(\"after_auth_return_to\", getRelativePart(options.currentUrl));\n }\n\n return nextUrl.origin === options.currentUrl.origin ? getRelativePart(nextUrl) : nextUrl.toString();\n}\n\nfunction getHandlerRedirectPolicy(handlerName: keyof HandlerUrls): HandlerRedirectPolicy {\n if (handlerName === \"afterSignIn\" || handlerName === \"afterSignUp\") {\n return \"after-auth-return\";\n }\n if (isRedirectBackAwareHandlerName(handlerName)) {\n return \"redirect-back-aware\";\n }\n return \"none\";\n}\n\ntype RedirectToHandlerPlan =\n | { type: \"redirect\", url: string }\n | {\n type: \"cross-domain-authorize\",\n redirectUri: string,\n state: string,\n codeChallenge: string,\n afterCallbackRedirectUrl: string,\n };\n\n\nasync function resolveRedirectBackAwareHandlerUrlForRedirect(options: {\n handlerName: RedirectBackAwareHandlerName,\n rawHandlerUrl: string,\n currentUrl: URL,\n localOAuthCallbackUrl: string,\n getCrossDomainHandoffParams: (currentUrl: URL) => Promise<CrossDomainHandoffParams>,\n}): Promise<string> {\n const initial = buildRedirectBackAwareHandlerUrl({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n crossDomainHandoffParams: null,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n });\n if (options.handlerName === \"signOut\") {\n return initial;\n }\n\n const initialTarget = new URL(initial, options.currentUrl);\n const isCrossDomainHandlerRedirect = options.currentUrl.origin !== initialTarget.origin;\n if (!isCrossDomainHandlerRedirect || hasCrossDomainHandoffParams(initialTarget)) {\n return initial;\n }\n\n const crossDomainHandoffParams = await options.getCrossDomainHandoffParams(options.currentUrl);\n return buildRedirectBackAwareHandlerUrl({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n crossDomainHandoffParams,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n });\n}\n\nexport async function planRedirectToHandler(options: {\n handlerName: keyof HandlerUrls,\n rawHandlerUrl: string,\n noRedirectBack: boolean,\n currentUrl: URL | null,\n localOAuthCallbackUrl: string,\n getCrossDomainHandoffParams: (currentUrl: URL) => Promise<CrossDomainHandoffParams>,\n}): Promise<RedirectToHandlerPlan> {\n if (options.noRedirectBack || options.currentUrl == null) {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n\n const policy = getHandlerRedirectPolicy(options.handlerName);\n if (policy === \"none\") {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n\n if (policy === \"after-auth-return\") {\n const redirectBackUrl = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n if (redirectBackUrl == null) {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n const redirectBackTarget = new URL(redirectBackUrl, options.currentUrl);\n const crossDomainHandoff = getCrossDomainHandoffForRedirect({\n currentUrl: options.currentUrl,\n redirectBackTarget,\n });\n if (crossDomainHandoff == null) {\n return { type: \"redirect\", url: redirectBackUrl };\n }\n let state = crossDomainHandoff.handoffParams.state;\n let codeChallenge = crossDomainHandoff.handoffParams.codeChallenge;\n let afterCallbackRedirectUrl = crossDomainHandoff.handoffParams.afterCallbackRedirectUrl;\n if (state == null || codeChallenge == null) {\n const generatedHandoffParams = await options.getCrossDomainHandoffParams(options.currentUrl);\n state ??= generatedHandoffParams.state;\n codeChallenge ??= generatedHandoffParams.codeChallenge;\n }\n afterCallbackRedirectUrl ??= options.currentUrl.toString();\n return {\n type: \"cross-domain-authorize\",\n redirectUri: crossDomainHandoff.redirectBackTarget.toString(),\n state,\n codeChallenge,\n afterCallbackRedirectUrl,\n };\n }\n\n if (\n options.handlerName !== \"signIn\"\n && options.handlerName !== \"signUp\"\n && options.handlerName !== \"onboarding\"\n && options.handlerName !== \"signOut\"\n ) {\n throw new HexclaveAssertionError(\"Unexpected redirect-back-aware handler policy mismatch\", {\n handlerName: options.handlerName,\n policy,\n });\n }\n\n return {\n type: \"redirect\",\n url: await resolveRedirectBackAwareHandlerUrlForRedirect({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n getCrossDomainHandoffParams: options.getCrossDomainHandoffParams,\n }),\n };\n}\n\nfunction readCrossDomainHandoffParams(currentUrl: URL, redirectBackTarget: URL): CrossDomainHandoffParamsMaybeMissing {\n // Hexclave rebrand: accept either param name from both URLs.\n const state = getCrossDomainParam(currentUrl.searchParams, \"state\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"state\");\n const codeChallenge = getCrossDomainParam(currentUrl.searchParams, \"codeChallenge\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"codeChallenge\");\n const afterCallbackRedirectUrl = getCrossDomainParam(currentUrl.searchParams, \"afterCallbackRedirectUrl\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"afterCallbackRedirectUrl\");\n return {\n state,\n codeChallenge,\n afterCallbackRedirectUrl,\n };\n}\n\nfunction resolveCrossDomainRedirectBackTarget(options: {\n currentUrl: URL,\n redirectBackTarget: URL,\n handoffParams: CrossDomainHandoffParamsMaybeMissing,\n}): URL | null {\n if (options.redirectBackTarget.origin !== options.currentUrl.origin) {\n return options.redirectBackTarget;\n }\n if (\n options.handoffParams.state == null\n || options.handoffParams.codeChallenge == null\n || options.handoffParams.afterCallbackRedirectUrl == null\n ) {\n return null;\n }\n const afterCallbackRedirectTarget = new URL(options.handoffParams.afterCallbackRedirectUrl, options.currentUrl);\n if (afterCallbackRedirectTarget.origin === options.currentUrl.origin) {\n return null;\n }\n return new URL(\n `${options.redirectBackTarget.pathname}${options.redirectBackTarget.search}${options.redirectBackTarget.hash}`,\n afterCallbackRedirectTarget.origin,\n );\n}\n\nfunction getCrossDomainHandoffForRedirect(options: {\n currentUrl: URL,\n redirectBackTarget: URL,\n}): {\n redirectBackTarget: URL,\n handoffParams: CrossDomainHandoffParamsMaybeMissing,\n} | null {\n const handoffParams = readCrossDomainHandoffParams(options.currentUrl, options.redirectBackTarget);\n const crossDomainRedirectBackTarget = resolveCrossDomainRedirectBackTarget({\n currentUrl: options.currentUrl,\n redirectBackTarget: options.redirectBackTarget,\n handoffParams,\n });\n if (crossDomainRedirectBackTarget == null) {\n return null;\n }\n return {\n redirectBackTarget: crossDomainRedirectBackTarget,\n handoffParams,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"redirect-page-urls.js","names":["HexclaveAssertionError"],"sources":["../../../../../src/lib/stack-app/apps/implementations/redirect-page-urls.ts"],"sourcesContent":["\n//===========================================\n// THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY, INSTEAD EDIT THE CORRESPONDING FILE IN packages/template\n//===========================================\nimport { HexclaveAssertionError } from \"@hexclave/shared/dist/utils/errors\";\nimport { getRelativePart } from \"@hexclave/shared/dist/utils/urls\";\nimport { HandlerUrls } from \"../../common\";\n\nexport const crossDomainAuthQueryParams = {\n marker: \"hexclave_cross_domain_auth\",\n state: \"hexclave_cross_domain_state\",\n codeChallenge: \"hexclave_cross_domain_code_challenge\",\n afterCallbackRedirectUrl: \"hexclave_cross_domain_after_callback_redirect_url\",\n} as const;\n\ntype CrossDomainAuthQueryParamKey = keyof typeof crossDomainAuthQueryParams;\n\nfunction getCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey): string | null {\n return params.get(crossDomainAuthQueryParams[key]);\n}\n\nfunction hasCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey): boolean {\n return params.has(crossDomainAuthQueryParams[key]);\n}\n\nfunction setCrossDomainParam(params: URLSearchParams, key: CrossDomainAuthQueryParamKey, value: string): void {\n params.set(crossDomainAuthQueryParams[key], value);\n}\n\nexport type CrossDomainHandoffParams = {\n state: string,\n codeChallenge: string,\n};\n\nexport function getCrossDomainHandoffParamsFromCurrentUrl(currentUrl: URL): CrossDomainHandoffParams | null {\n const state = getCrossDomainParam(currentUrl.searchParams, \"state\");\n const codeChallenge = getCrossDomainParam(currentUrl.searchParams, \"codeChallenge\");\n if (state == null || codeChallenge == null) {\n return null;\n }\n return { state, codeChallenge };\n}\n\ntype RedirectBackAwareHandlerName = \"signIn\" | \"signUp\" | \"onboarding\" | \"signOut\";\ntype HandlerRedirectPolicy = \"none\" | \"redirect-back-aware\" | \"after-auth-return\";\n\ntype CrossDomainHandoffParamsMaybeMissing = {\n state: string | null,\n codeChallenge: string | null,\n afterCallbackRedirectUrl: string | null,\n};\n\nfunction isRedirectBackAwareHandlerName(handlerName: keyof HandlerUrls): handlerName is RedirectBackAwareHandlerName {\n return handlerName === \"signIn\"\n || handlerName === \"signUp\"\n || handlerName === \"onboarding\"\n || handlerName === \"signOut\";\n}\n\nfunction hasCrossDomainHandoffParams(url: URL): boolean {\n return (\n hasCrossDomainParam(url.searchParams, \"state\")\n && hasCrossDomainParam(url.searchParams, \"codeChallenge\")\n && hasCrossDomainParam(url.searchParams, \"afterCallbackRedirectUrl\")\n );\n}\n\nfunction buildCrossDomainAuthCallbackUrl(options: {\n currentUrl: URL,\n localOAuthCallbackUrl: string,\n state?: string,\n codeChallenge?: string,\n afterCallbackRedirectUrl?: string,\n}): URL {\n const localOAuthCallbackUrl = new URL(options.localOAuthCallbackUrl, options.currentUrl);\n if (localOAuthCallbackUrl.origin !== options.currentUrl.origin) {\n throw new HexclaveAssertionError(\"Cross-domain auth callback URL must stay on the current origin\", {\n localOAuthCallbackUrl: localOAuthCallbackUrl.toString(),\n currentUrl: options.currentUrl.toString(),\n });\n }\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"marker\", \"1\");\n if (options.state != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"state\", options.state);\n }\n if (options.codeChallenge != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"codeChallenge\", options.codeChallenge);\n }\n if (options.afterCallbackRedirectUrl != null) {\n setCrossDomainParam(localOAuthCallbackUrl.searchParams, \"afterCallbackRedirectUrl\", options.afterCallbackRedirectUrl);\n }\n return localOAuthCallbackUrl;\n}\n\nfunction buildRedirectBackAwareHandlerUrl(options: {\n handlerName: RedirectBackAwareHandlerName,\n rawHandlerUrl: string,\n currentUrl: URL,\n crossDomainHandoffParams: CrossDomainHandoffParams | null,\n localOAuthCallbackUrl: string,\n}): string {\n const nextUrl = new URL(options.rawHandlerUrl, options.currentUrl);\n // Preserve after_auth_return_to verbatim (not a rebranded param).\n const currentAfterAuthReturnTo = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n if (currentAfterAuthReturnTo != null && !nextUrl.searchParams.has(\"after_auth_return_to\")) {\n nextUrl.searchParams.set(\"after_auth_return_to\", currentAfterAuthReturnTo);\n }\n for (const preservedParam of [\"state\", \"codeChallenge\", \"afterCallbackRedirectUrl\"] as const) {\n const currentValue = getCrossDomainParam(options.currentUrl.searchParams, preservedParam);\n if (currentValue != null && !hasCrossDomainParam(nextUrl.searchParams, preservedParam)) {\n setCrossDomainParam(nextUrl.searchParams, preservedParam, currentValue);\n }\n }\n\n if (options.handlerName === \"signOut\") {\n if (!nextUrl.searchParams.has(\"after_auth_return_to\")) {\n if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host) {\n nextUrl.searchParams.set(\"after_auth_return_to\", getRelativePart(options.currentUrl));\n } else {\n nextUrl.searchParams.set(\"after_auth_return_to\", options.currentUrl.toString());\n }\n }\n return nextUrl.origin === options.currentUrl.origin ? getRelativePart(nextUrl) : nextUrl.toString();\n }\n\n const isCrossDomainHandlerRedirect = options.currentUrl.origin !== nextUrl.origin;\n if (isCrossDomainHandlerRedirect) {\n if (!hasCrossDomainHandoffParams(nextUrl)) {\n const inheritedAfterAuthReturnTo = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n const afterCallbackRedirectUrl = inheritedAfterAuthReturnTo\n ? new URL(inheritedAfterAuthReturnTo, options.currentUrl).toString()\n : options.currentUrl.toString();\n const callbackUrl = buildCrossDomainAuthCallbackUrl({\n currentUrl: options.currentUrl,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n state: options.crossDomainHandoffParams?.state,\n codeChallenge: options.crossDomainHandoffParams?.codeChallenge,\n afterCallbackRedirectUrl,\n });\n\n nextUrl.searchParams.set(\"after_auth_return_to\", callbackUrl.toString());\n setCrossDomainParam(nextUrl.searchParams, \"afterCallbackRedirectUrl\", afterCallbackRedirectUrl);\n if (options.crossDomainHandoffParams != null) {\n setCrossDomainParam(nextUrl.searchParams, \"state\", options.crossDomainHandoffParams.state);\n setCrossDomainParam(nextUrl.searchParams, \"codeChallenge\", options.crossDomainHandoffParams.codeChallenge);\n }\n }\n } else if (options.currentUrl.protocol === nextUrl.protocol && options.currentUrl.host === nextUrl.host && !nextUrl.searchParams.has(\"after_auth_return_to\")) {\n nextUrl.searchParams.set(\"after_auth_return_to\", getRelativePart(options.currentUrl));\n }\n\n return nextUrl.origin === options.currentUrl.origin ? getRelativePart(nextUrl) : nextUrl.toString();\n}\n\nfunction getHandlerRedirectPolicy(handlerName: keyof HandlerUrls): HandlerRedirectPolicy {\n if (handlerName === \"afterSignIn\" || handlerName === \"afterSignUp\") {\n return \"after-auth-return\";\n }\n if (isRedirectBackAwareHandlerName(handlerName)) {\n return \"redirect-back-aware\";\n }\n return \"none\";\n}\n\ntype RedirectToHandlerPlan =\n | { type: \"redirect\", url: string }\n | {\n type: \"cross-domain-authorize\",\n redirectUri: string,\n state: string,\n codeChallenge: string,\n afterCallbackRedirectUrl: string,\n };\n\n\nasync function resolveRedirectBackAwareHandlerUrlForRedirect(options: {\n handlerName: RedirectBackAwareHandlerName,\n rawHandlerUrl: string,\n currentUrl: URL,\n localOAuthCallbackUrl: string,\n getCrossDomainHandoffParams: (currentUrl: URL) => Promise<CrossDomainHandoffParams>,\n}): Promise<string> {\n const initial = buildRedirectBackAwareHandlerUrl({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n crossDomainHandoffParams: null,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n });\n if (options.handlerName === \"signOut\") {\n return initial;\n }\n\n const initialTarget = new URL(initial, options.currentUrl);\n const isCrossDomainHandlerRedirect = options.currentUrl.origin !== initialTarget.origin;\n if (!isCrossDomainHandlerRedirect || hasCrossDomainHandoffParams(initialTarget)) {\n return initial;\n }\n\n const crossDomainHandoffParams = await options.getCrossDomainHandoffParams(options.currentUrl);\n return buildRedirectBackAwareHandlerUrl({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n crossDomainHandoffParams,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n });\n}\n\nexport async function planRedirectToHandler(options: {\n handlerName: keyof HandlerUrls,\n rawHandlerUrl: string,\n noRedirectBack: boolean,\n currentUrl: URL | null,\n localOAuthCallbackUrl: string,\n getCrossDomainHandoffParams: (currentUrl: URL) => Promise<CrossDomainHandoffParams>,\n}): Promise<RedirectToHandlerPlan> {\n if (options.noRedirectBack || options.currentUrl == null) {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n\n const policy = getHandlerRedirectPolicy(options.handlerName);\n if (policy === \"none\") {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n\n if (policy === \"after-auth-return\") {\n const redirectBackUrl = options.currentUrl.searchParams.get(\"after_auth_return_to\");\n if (redirectBackUrl == null) {\n return { type: \"redirect\", url: options.rawHandlerUrl };\n }\n const redirectBackTarget = new URL(redirectBackUrl, options.currentUrl);\n const crossDomainHandoff = getCrossDomainHandoffForRedirect({\n currentUrl: options.currentUrl,\n redirectBackTarget,\n });\n if (crossDomainHandoff == null) {\n return { type: \"redirect\", url: redirectBackUrl };\n }\n let state = crossDomainHandoff.handoffParams.state;\n let codeChallenge = crossDomainHandoff.handoffParams.codeChallenge;\n let afterCallbackRedirectUrl = crossDomainHandoff.handoffParams.afterCallbackRedirectUrl;\n if (state == null || codeChallenge == null) {\n const generatedHandoffParams = await options.getCrossDomainHandoffParams(options.currentUrl);\n state ??= generatedHandoffParams.state;\n codeChallenge ??= generatedHandoffParams.codeChallenge;\n }\n afterCallbackRedirectUrl ??= options.currentUrl.toString();\n return {\n type: \"cross-domain-authorize\",\n redirectUri: crossDomainHandoff.redirectBackTarget.toString(),\n state,\n codeChallenge,\n afterCallbackRedirectUrl,\n };\n }\n\n if (\n options.handlerName !== \"signIn\"\n && options.handlerName !== \"signUp\"\n && options.handlerName !== \"onboarding\"\n && options.handlerName !== \"signOut\"\n ) {\n throw new HexclaveAssertionError(\"Unexpected redirect-back-aware handler policy mismatch\", {\n handlerName: options.handlerName,\n policy,\n });\n }\n\n return {\n type: \"redirect\",\n url: await resolveRedirectBackAwareHandlerUrlForRedirect({\n handlerName: options.handlerName,\n rawHandlerUrl: options.rawHandlerUrl,\n currentUrl: options.currentUrl,\n localOAuthCallbackUrl: options.localOAuthCallbackUrl,\n getCrossDomainHandoffParams: options.getCrossDomainHandoffParams,\n }),\n };\n}\n\nfunction readCrossDomainHandoffParams(currentUrl: URL, redirectBackTarget: URL): CrossDomainHandoffParamsMaybeMissing {\n // Hexclave rebrand: accept either param name from both URLs.\n const state = getCrossDomainParam(currentUrl.searchParams, \"state\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"state\");\n const codeChallenge = getCrossDomainParam(currentUrl.searchParams, \"codeChallenge\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"codeChallenge\");\n const afterCallbackRedirectUrl = getCrossDomainParam(currentUrl.searchParams, \"afterCallbackRedirectUrl\")\n ?? getCrossDomainParam(redirectBackTarget.searchParams, \"afterCallbackRedirectUrl\");\n return {\n state,\n codeChallenge,\n afterCallbackRedirectUrl,\n };\n}\n\nfunction resolveCrossDomainRedirectBackTarget(options: {\n currentUrl: URL,\n redirectBackTarget: URL,\n handoffParams: CrossDomainHandoffParamsMaybeMissing,\n}): URL | null {\n if (options.redirectBackTarget.origin !== options.currentUrl.origin) {\n return options.redirectBackTarget;\n }\n if (\n options.handoffParams.state == null\n || options.handoffParams.codeChallenge == null\n || options.handoffParams.afterCallbackRedirectUrl == null\n ) {\n return null;\n }\n const afterCallbackRedirectTarget = new URL(options.handoffParams.afterCallbackRedirectUrl, options.currentUrl);\n if (afterCallbackRedirectTarget.origin === options.currentUrl.origin) {\n return null;\n }\n return new URL(\n `${options.redirectBackTarget.pathname}${options.redirectBackTarget.search}${options.redirectBackTarget.hash}`,\n afterCallbackRedirectTarget.origin,\n );\n}\n\nfunction getCrossDomainHandoffForRedirect(options: {\n currentUrl: URL,\n redirectBackTarget: URL,\n}): {\n redirectBackTarget: URL,\n handoffParams: CrossDomainHandoffParamsMaybeMissing,\n} | null {\n const handoffParams = readCrossDomainHandoffParams(options.currentUrl, options.redirectBackTarget);\n const crossDomainRedirectBackTarget = resolveCrossDomainRedirectBackTarget({\n currentUrl: options.currentUrl,\n redirectBackTarget: options.redirectBackTarget,\n handoffParams,\n });\n if (crossDomainRedirectBackTarget == null) {\n return null;\n }\n return {\n redirectBackTarget: crossDomainRedirectBackTarget,\n handoffParams,\n };\n}\n"],"mappings":"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"}