@hexclave/js 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (450) hide show
  1. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  2. package/dist/dev-tool/dev-tool-core.js +11 -11
  3. package/dist/dev-tool/dev-tool-core.js.map +1 -1
  4. package/dist/dev-tool/dev-tool-styles.d.ts +1 -1
  5. package/dist/dev-tool/dev-tool-styles.js +371 -371
  6. package/dist/dev-tool/dev-tool-styles.js.map +1 -1
  7. package/dist/dev-tool/dev-tool-trigger-position.js.map +1 -1
  8. package/dist/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  9. package/dist/dev-tool/index.d.ts +4 -4
  10. package/dist/dev-tool/index.js +4 -4
  11. package/dist/dev-tool/index.js.map +1 -1
  12. package/dist/esm/dev-tool/dev-tool-core.d.ts +1 -1
  13. package/dist/esm/dev-tool/dev-tool-core.js +10 -10
  14. package/dist/esm/dev-tool/dev-tool-core.js.map +1 -1
  15. package/dist/esm/dev-tool/dev-tool-styles.d.ts +1 -1
  16. package/dist/esm/dev-tool/dev-tool-styles.js +371 -371
  17. package/dist/esm/dev-tool/dev-tool-styles.js.map +1 -1
  18. package/dist/esm/dev-tool/dev-tool-trigger-position.js.map +1 -1
  19. package/dist/esm/dev-tool/dev-tool-trigger-position.test.js.map +1 -1
  20. package/dist/esm/dev-tool/index.d.ts +4 -4
  21. package/dist/esm/dev-tool/index.js +4 -4
  22. package/dist/esm/dev-tool/index.js.map +1 -1
  23. package/dist/esm/index.d.ts +1 -1
  24. package/dist/esm/index.js +1 -1
  25. package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
  26. package/dist/esm/integrations/convex.js +1 -1
  27. package/dist/esm/integrations/convex.js.map +1 -1
  28. package/dist/esm/lib/auth.js.map +1 -1
  29. package/dist/esm/lib/auth.test.js.map +1 -1
  30. package/dist/esm/lib/cookie.js.map +1 -1
  31. package/dist/esm/lib/env.js.map +1 -1
  32. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
  33. package/dist/esm/lib/hexclave-app/api-keys/index.d.ts.map +1 -0
  34. package/dist/esm/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  35. package/dist/esm/lib/hexclave-app/api-keys/index.js.map +1 -0
  36. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  37. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  38. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +7 -7
  39. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  40. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  41. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  42. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
  43. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  44. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +23 -30
  45. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  46. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  47. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  48. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
  49. package/dist/esm/lib/hexclave-app/apps/implementations/common.d.ts.map +1 -0
  50. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/common.js +6 -6
  51. package/dist/esm/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  52. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  53. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.d.ts.map +1 -0
  54. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  55. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  56. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  57. package/dist/esm/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  58. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  59. package/dist/esm/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  60. package/dist/esm/lib/hexclave-app/apps/implementations/index.js +27 -0
  61. package/dist/esm/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  62. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  63. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts.map +1 -0
  64. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  65. package/dist/esm/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  66. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  67. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.d.ts.map +1 -0
  68. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +5 -5
  69. package/dist/esm/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  70. package/dist/{lib/stack-app → esm/lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  71. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.d.ts.map +1 -0
  72. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  73. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  74. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  75. package/dist/esm/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  76. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  77. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.d.ts.map +1 -0
  78. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  79. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  80. package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  81. package/dist/esm/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  82. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  83. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.d.ts.map +1 -0
  84. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +3 -3
  85. package/dist/esm/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  86. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  87. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -0
  88. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +3 -3
  89. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  90. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  91. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.d.ts.map +1 -0
  92. package/dist/esm/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +3 -3
  93. package/dist/esm/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  94. package/dist/esm/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  95. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -0
  96. package/dist/esm/lib/hexclave-app/common.js +7 -0
  97. package/dist/esm/lib/hexclave-app/common.js.map +1 -0
  98. package/dist/{lib/stack-app → esm/lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
  99. package/dist/esm/lib/hexclave-app/connected-accounts/index.d.ts.map +1 -0
  100. package/dist/{lib/stack-app → esm/lib/hexclave-app}/contact-channels/index.d.ts +1 -1
  101. package/dist/esm/lib/hexclave-app/contact-channels/index.d.ts.map +1 -0
  102. package/dist/esm/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  103. package/dist/esm/lib/hexclave-app/contact-channels/index.js.map +1 -0
  104. package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  105. package/dist/esm/lib/hexclave-app/customers/index.d.ts.map +1 -0
  106. package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  107. package/dist/esm/lib/hexclave-app/data-vault/index.d.ts.map +1 -0
  108. package/dist/esm/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  109. package/dist/esm/lib/hexclave-app/email/index.d.ts.map +1 -0
  110. package/dist/{lib/stack-app → esm/lib/hexclave-app}/email-templates/index.d.ts +1 -1
  111. package/dist/esm/lib/hexclave-app/email-templates/index.d.ts.map +1 -0
  112. package/dist/esm/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  113. package/dist/esm/lib/hexclave-app/email-templates/index.js.map +1 -0
  114. package/dist/esm/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  115. package/dist/esm/lib/{stack-app → hexclave-app}/index.js +2 -2
  116. package/dist/{lib/stack-app → esm/lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  117. package/dist/esm/lib/hexclave-app/internal-api-keys/index.d.ts.map +1 -0
  118. package/dist/esm/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  119. package/dist/esm/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  120. package/dist/{lib/stack-app → esm/lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  121. package/dist/esm/lib/hexclave-app/notification-categories/index.d.ts.map +1 -0
  122. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
  123. package/dist/esm/lib/hexclave-app/permissions/index.d.ts.map +1 -0
  124. package/dist/esm/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  125. package/dist/esm/lib/hexclave-app/permissions/index.js.map +1 -0
  126. package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  127. package/dist/esm/lib/hexclave-app/project-configs/index.d.ts.map +1 -0
  128. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  129. package/dist/esm/lib/hexclave-app/projects/index.d.ts.map +1 -0
  130. package/dist/esm/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  131. package/dist/esm/lib/hexclave-app/projects/index.js.map +1 -0
  132. package/dist/{lib/stack-app → esm/lib/hexclave-app}/session-replays/index.d.ts +1 -1
  133. package/dist/esm/lib/hexclave-app/session-replays/index.d.ts.map +1 -0
  134. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  135. package/dist/esm/lib/hexclave-app/teams/index.d.ts.map +1 -0
  136. package/dist/esm/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  137. package/dist/esm/lib/hexclave-app/teams/index.js.map +1 -0
  138. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  139. package/dist/esm/lib/hexclave-app/url-targets.d.ts.map +1 -0
  140. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  141. package/dist/esm/lib/hexclave-app/url-targets.js.map +1 -0
  142. package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  143. package/dist/esm/lib/hexclave-app/url-targets.test.js.map +1 -0
  144. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  145. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -0
  146. package/dist/esm/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  147. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -0
  148. package/dist/esm/utils/url.js.map +1 -1
  149. package/dist/index.d.ts +15 -15
  150. package/dist/index.js +3 -3
  151. package/dist/integrations/convex/component/convex.config.js.map +1 -1
  152. package/dist/integrations/convex.js +2 -2
  153. package/dist/integrations/convex.js.map +1 -1
  154. package/dist/lib/auth.js.map +1 -1
  155. package/dist/lib/auth.test.js.map +1 -1
  156. package/dist/lib/cookie.js.map +1 -1
  157. package/dist/lib/env.js.map +1 -1
  158. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.d.ts +1 -1
  159. package/dist/{esm/lib/stack-app → lib/hexclave-app}/api-keys/index.d.ts.map +1 -1
  160. package/dist/lib/{stack-app → hexclave-app}/api-keys/index.js +1 -1
  161. package/dist/lib/hexclave-app/api-keys/index.js.map +1 -0
  162. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.d.ts +6 -6
  163. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -0
  164. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/admin-app-impl.js +5 -5
  165. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.js.map +1 -0
  166. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.js +2 -2
  167. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.js.map +1 -0
  168. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.d.ts +13 -13
  169. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -0
  170. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.js +22 -29
  171. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -0
  172. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.js +1 -1
  173. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +1 -0
  174. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts +3 -3
  175. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/common.d.ts.map +1 -1
  176. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/common.js +5 -5
  177. package/dist/lib/hexclave-app/apps/implementations/common.js.map +1 -0
  178. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.d.ts +1 -1
  179. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/event-tracker.d.ts.map +1 -1
  180. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.js +1 -1
  181. package/dist/lib/hexclave-app/apps/implementations/event-tracker.js.map +1 -0
  182. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.js +1 -1
  183. package/dist/lib/hexclave-app/apps/implementations/event-tracker.test.js.map +1 -0
  184. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +9 -0
  185. package/dist/lib/hexclave-app/apps/implementations/index.d.ts.map +1 -0
  186. package/dist/lib/hexclave-app/apps/implementations/index.js +31 -0
  187. package/dist/lib/hexclave-app/apps/implementations/index.js.map +1 -0
  188. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.d.ts +1 -1
  189. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/redirect-page-urls.d.ts.map +1 -1
  190. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/redirect-page-urls.js +1 -1
  191. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.js.map +1 -0
  192. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.d.ts +4 -4
  193. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/server-app-impl.d.ts.map +1 -1
  194. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/server-app-impl.js +4 -4
  195. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.js.map +1 -0
  196. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts +1 -1
  197. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-refresh-subscription.d.ts.map +1 -1
  198. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.js +1 -1
  199. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.js.map +1 -0
  200. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.js +1 -1
  201. package/dist/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.js.map +1 -0
  202. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.d.ts +1 -1
  203. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/implementations/session-replay.d.ts.map +1 -1
  204. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.js +1 -1
  205. package/dist/lib/hexclave-app/apps/implementations/session-replay.js.map +1 -0
  206. package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.js +1 -1
  207. package/dist/lib/hexclave-app/apps/implementations/session-replay.test.js.map +1 -0
  208. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.d.ts +1 -1
  209. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/admin-app.d.ts.map +1 -1
  210. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/admin-app.js +2 -2
  211. package/dist/lib/hexclave-app/apps/interfaces/admin-app.js.map +1 -0
  212. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.d.ts +4 -4
  213. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/client-app.d.ts.map +1 -1
  214. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/client-app.js +2 -2
  215. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -0
  216. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.d.ts +1 -1
  217. package/dist/{esm/lib/stack-app → lib/hexclave-app}/apps/interfaces/server-app.d.ts.map +1 -1
  218. package/dist/lib/{stack-app → hexclave-app}/apps/interfaces/server-app.js +2 -2
  219. package/dist/lib/hexclave-app/apps/interfaces/server-app.js.map +1 -0
  220. package/dist/lib/{stack-app → hexclave-app}/common.d.ts +7 -7
  221. package/dist/{esm/lib/stack-app → lib/hexclave-app}/common.d.ts.map +1 -1
  222. package/dist/lib/hexclave-app/common.js +9 -0
  223. package/dist/lib/hexclave-app/common.js.map +1 -0
  224. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts +1 -1
  225. package/dist/{esm/lib/stack-app → lib/hexclave-app}/connected-accounts/index.d.ts.map +1 -1
  226. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts +1 -1
  227. package/dist/{esm/lib/stack-app → lib/hexclave-app}/contact-channels/index.d.ts.map +1 -1
  228. package/dist/lib/{stack-app → hexclave-app}/contact-channels/index.js +1 -1
  229. package/dist/lib/hexclave-app/contact-channels/index.js.map +1 -0
  230. package/dist/lib/{stack-app → hexclave-app}/customers/index.d.ts +1 -1
  231. package/dist/{esm/lib/stack-app → lib/hexclave-app}/customers/index.d.ts.map +1 -1
  232. package/dist/lib/{stack-app → hexclave-app}/data-vault/index.d.ts +1 -1
  233. package/dist/{esm/lib/stack-app → lib/hexclave-app}/data-vault/index.d.ts.map +1 -1
  234. package/dist/lib/{stack-app → hexclave-app}/email/index.d.ts +1 -1
  235. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email/index.d.ts.map +1 -1
  236. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts +1 -1
  237. package/dist/{esm/lib/stack-app → lib/hexclave-app}/email-templates/index.d.ts.map +1 -1
  238. package/dist/lib/{stack-app → hexclave-app}/email-templates/index.js +1 -1
  239. package/dist/lib/hexclave-app/email-templates/index.js.map +1 -0
  240. package/dist/lib/{stack-app → hexclave-app}/index.d.ts +2 -2
  241. package/dist/lib/{stack-app → hexclave-app}/index.js +2 -2
  242. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts +1 -1
  243. package/dist/{esm/lib/stack-app → lib/hexclave-app}/internal-api-keys/index.d.ts.map +1 -1
  244. package/dist/lib/{stack-app → hexclave-app}/internal-api-keys/index.js +1 -1
  245. package/dist/lib/hexclave-app/internal-api-keys/index.js.map +1 -0
  246. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts +1 -1
  247. package/dist/{esm/lib/stack-app → lib/hexclave-app}/notification-categories/index.d.ts.map +1 -1
  248. package/dist/lib/{stack-app → hexclave-app}/permissions/index.d.ts +1 -1
  249. package/dist/{esm/lib/stack-app → lib/hexclave-app}/permissions/index.d.ts.map +1 -1
  250. package/dist/lib/{stack-app → hexclave-app}/permissions/index.js +1 -1
  251. package/dist/lib/hexclave-app/permissions/index.js.map +1 -0
  252. package/dist/lib/{stack-app → hexclave-app}/project-configs/index.d.ts +1 -1
  253. package/dist/{esm/lib/stack-app → lib/hexclave-app}/project-configs/index.d.ts.map +1 -1
  254. package/dist/lib/{stack-app → hexclave-app}/projects/index.d.ts +1 -1
  255. package/dist/{esm/lib/stack-app → lib/hexclave-app}/projects/index.d.ts.map +1 -1
  256. package/dist/lib/{stack-app → hexclave-app}/projects/index.js +1 -1
  257. package/dist/lib/hexclave-app/projects/index.js.map +1 -0
  258. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts +1 -1
  259. package/dist/{esm/lib/stack-app → lib/hexclave-app}/session-replays/index.d.ts.map +1 -1
  260. package/dist/lib/{stack-app → hexclave-app}/teams/index.d.ts +1 -1
  261. package/dist/{esm/lib/stack-app → lib/hexclave-app}/teams/index.d.ts.map +1 -1
  262. package/dist/lib/{stack-app → hexclave-app}/teams/index.js +1 -1
  263. package/dist/lib/hexclave-app/teams/index.js.map +1 -0
  264. package/dist/lib/{stack-app → hexclave-app}/url-targets.d.ts +1 -1
  265. package/dist/{esm/lib/stack-app → lib/hexclave-app}/url-targets.d.ts.map +1 -1
  266. package/dist/lib/{stack-app → hexclave-app}/url-targets.js +2 -2
  267. package/dist/lib/hexclave-app/url-targets.js.map +1 -0
  268. package/dist/lib/{stack-app → hexclave-app}/url-targets.test.js +1 -1
  269. package/dist/lib/hexclave-app/url-targets.test.js.map +1 -0
  270. package/dist/lib/{stack-app → hexclave-app}/users/index.d.ts +1 -1
  271. package/dist/{esm/lib/stack-app → lib/hexclave-app}/users/index.d.ts.map +1 -1
  272. package/dist/lib/{stack-app → hexclave-app}/users/index.js +1 -1
  273. package/dist/lib/hexclave-app/users/index.js.map +1 -0
  274. package/dist/utils/url.js.map +1 -1
  275. package/package.json +4 -3
  276. package/src/dev-tool/dev-tool-core.ts +2460 -0
  277. package/src/dev-tool/dev-tool-styles.ts +2758 -0
  278. package/src/dev-tool/dev-tool-trigger-position.test.ts +113 -0
  279. package/src/dev-tool/dev-tool-trigger-position.ts +109 -0
  280. package/src/dev-tool/index.ts +149 -0
  281. package/src/index.ts +12 -0
  282. package/src/integrations/convex/component/README.md +74 -0
  283. package/src/integrations/convex/component/convex.config.ts +9 -0
  284. package/src/integrations/convex.ts +28 -0
  285. package/src/lib/auth.test.ts +67 -0
  286. package/src/lib/auth.ts +175 -0
  287. package/src/lib/cookie.ts +327 -0
  288. package/src/lib/env.ts +93 -0
  289. package/src/lib/hexclave-app/api-keys/index.ts +73 -0
  290. package/src/lib/hexclave-app/apps/implementations/admin-app-impl.ts +1159 -0
  291. package/src/lib/hexclave-app/apps/implementations/client-app-impl.cross-domain.test.ts +141 -0
  292. package/src/lib/hexclave-app/apps/implementations/client-app-impl.oauth-prefetch.test.ts +36 -0
  293. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +3525 -0
  294. package/src/lib/hexclave-app/apps/implementations/common.ts +190 -0
  295. package/src/lib/hexclave-app/apps/implementations/event-tracker.test.ts +105 -0
  296. package/src/lib/hexclave-app/apps/implementations/event-tracker.ts +306 -0
  297. package/src/lib/hexclave-app/apps/implementations/index.ts +35 -0
  298. package/src/lib/hexclave-app/apps/implementations/redirect-page-urls.ts +342 -0
  299. package/src/lib/hexclave-app/apps/implementations/server-app-impl.ts +1322 -0
  300. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.test.ts +106 -0
  301. package/src/lib/hexclave-app/apps/implementations/session-refresh-subscription.ts +52 -0
  302. package/src/lib/hexclave-app/apps/implementations/session-replay.test.ts +33 -0
  303. package/src/lib/hexclave-app/apps/implementations/session-replay.ts +356 -0
  304. package/src/lib/hexclave-app/apps/index.ts +40 -0
  305. package/src/lib/hexclave-app/apps/interfaces/admin-app.ts +189 -0
  306. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +172 -0
  307. package/src/lib/hexclave-app/apps/interfaces/server-app.ts +114 -0
  308. package/src/lib/hexclave-app/common.ts +209 -0
  309. package/src/lib/hexclave-app/connected-accounts/index.ts +47 -0
  310. package/src/lib/hexclave-app/contact-channels/index.ts +80 -0
  311. package/src/lib/hexclave-app/customers/index.ts +158 -0
  312. package/src/lib/hexclave-app/data-vault/index.ts +12 -0
  313. package/src/lib/hexclave-app/email/index.ts +280 -0
  314. package/src/lib/hexclave-app/email-templates/index.ts +24 -0
  315. package/src/lib/hexclave-app/index.ts +146 -0
  316. package/src/lib/hexclave-app/internal-api-keys/index.ts +55 -0
  317. package/src/lib/hexclave-app/notification-categories/index.ts +12 -0
  318. package/src/lib/hexclave-app/permissions/index.ts +75 -0
  319. package/src/lib/hexclave-app/project-configs/index.ts +103 -0
  320. package/src/lib/hexclave-app/projects/index.ts +234 -0
  321. package/src/lib/hexclave-app/session-replays/index.ts +72 -0
  322. package/src/lib/hexclave-app/teams/index.ts +203 -0
  323. package/src/lib/hexclave-app/url-targets.test.ts +253 -0
  324. package/src/lib/hexclave-app/url-targets.ts +395 -0
  325. package/src/lib/hexclave-app/users/index.ts +495 -0
  326. package/src/utils/url.ts +24 -0
  327. package/dist/esm/lib/stack-app/api-keys/index.js.map +0 -1
  328. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  329. package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  330. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  331. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  332. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  333. package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  334. package/dist/esm/lib/stack-app/apps/implementations/common.js.map +0 -1
  335. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  336. package/dist/esm/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  337. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts +0 -9
  338. package/dist/esm/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  339. package/dist/esm/lib/stack-app/apps/implementations/index.js +0 -27
  340. package/dist/esm/lib/stack-app/apps/implementations/index.js.map +0 -1
  341. package/dist/esm/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  342. package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  343. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  344. package/dist/esm/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  345. package/dist/esm/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  346. package/dist/esm/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  347. package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  348. package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  349. package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  350. package/dist/esm/lib/stack-app/common.js +0 -7
  351. package/dist/esm/lib/stack-app/common.js.map +0 -1
  352. package/dist/esm/lib/stack-app/contact-channels/index.js.map +0 -1
  353. package/dist/esm/lib/stack-app/email-templates/index.js.map +0 -1
  354. package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +0 -1
  355. package/dist/esm/lib/stack-app/permissions/index.js.map +0 -1
  356. package/dist/esm/lib/stack-app/projects/index.js.map +0 -1
  357. package/dist/esm/lib/stack-app/teams/index.js.map +0 -1
  358. package/dist/esm/lib/stack-app/url-targets.js.map +0 -1
  359. package/dist/esm/lib/stack-app/url-targets.test.js.map +0 -1
  360. package/dist/esm/lib/stack-app/users/index.js.map +0 -1
  361. package/dist/lib/stack-app/api-keys/index.d.ts.map +0 -1
  362. package/dist/lib/stack-app/api-keys/index.js.map +0 -1
  363. package/dist/lib/stack-app/apps/implementations/admin-app-impl.d.ts.map +0 -1
  364. package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +0 -1
  365. package/dist/lib/stack-app/apps/implementations/client-app-impl.cross-domain.test.js.map +0 -1
  366. package/dist/lib/stack-app/apps/implementations/client-app-impl.d.ts.map +0 -1
  367. package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +0 -1
  368. package/dist/lib/stack-app/apps/implementations/client-app-impl.oauth-prefetch.test.js.map +0 -1
  369. package/dist/lib/stack-app/apps/implementations/common.d.ts.map +0 -1
  370. package/dist/lib/stack-app/apps/implementations/common.js.map +0 -1
  371. package/dist/lib/stack-app/apps/implementations/event-tracker.d.ts.map +0 -1
  372. package/dist/lib/stack-app/apps/implementations/event-tracker.js.map +0 -1
  373. package/dist/lib/stack-app/apps/implementations/event-tracker.test.js.map +0 -1
  374. package/dist/lib/stack-app/apps/implementations/index.d.ts +0 -9
  375. package/dist/lib/stack-app/apps/implementations/index.d.ts.map +0 -1
  376. package/dist/lib/stack-app/apps/implementations/index.js +0 -31
  377. package/dist/lib/stack-app/apps/implementations/index.js.map +0 -1
  378. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.d.ts.map +0 -1
  379. package/dist/lib/stack-app/apps/implementations/redirect-page-urls.js.map +0 -1
  380. package/dist/lib/stack-app/apps/implementations/server-app-impl.d.ts.map +0 -1
  381. package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +0 -1
  382. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.d.ts.map +0 -1
  383. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.js.map +0 -1
  384. package/dist/lib/stack-app/apps/implementations/session-refresh-subscription.test.js.map +0 -1
  385. package/dist/lib/stack-app/apps/implementations/session-replay.d.ts.map +0 -1
  386. package/dist/lib/stack-app/apps/implementations/session-replay.js.map +0 -1
  387. package/dist/lib/stack-app/apps/implementations/session-replay.test.js.map +0 -1
  388. package/dist/lib/stack-app/apps/interfaces/admin-app.d.ts.map +0 -1
  389. package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +0 -1
  390. package/dist/lib/stack-app/apps/interfaces/client-app.d.ts.map +0 -1
  391. package/dist/lib/stack-app/apps/interfaces/client-app.js.map +0 -1
  392. package/dist/lib/stack-app/apps/interfaces/server-app.d.ts.map +0 -1
  393. package/dist/lib/stack-app/apps/interfaces/server-app.js.map +0 -1
  394. package/dist/lib/stack-app/common.d.ts.map +0 -1
  395. package/dist/lib/stack-app/common.js +0 -9
  396. package/dist/lib/stack-app/common.js.map +0 -1
  397. package/dist/lib/stack-app/connected-accounts/index.d.ts.map +0 -1
  398. package/dist/lib/stack-app/contact-channels/index.d.ts.map +0 -1
  399. package/dist/lib/stack-app/contact-channels/index.js.map +0 -1
  400. package/dist/lib/stack-app/customers/index.d.ts.map +0 -1
  401. package/dist/lib/stack-app/data-vault/index.d.ts.map +0 -1
  402. package/dist/lib/stack-app/email/index.d.ts.map +0 -1
  403. package/dist/lib/stack-app/email-templates/index.d.ts.map +0 -1
  404. package/dist/lib/stack-app/email-templates/index.js.map +0 -1
  405. package/dist/lib/stack-app/internal-api-keys/index.d.ts.map +0 -1
  406. package/dist/lib/stack-app/internal-api-keys/index.js.map +0 -1
  407. package/dist/lib/stack-app/notification-categories/index.d.ts.map +0 -1
  408. package/dist/lib/stack-app/permissions/index.d.ts.map +0 -1
  409. package/dist/lib/stack-app/permissions/index.js.map +0 -1
  410. package/dist/lib/stack-app/project-configs/index.d.ts.map +0 -1
  411. package/dist/lib/stack-app/projects/index.d.ts.map +0 -1
  412. package/dist/lib/stack-app/projects/index.js.map +0 -1
  413. package/dist/lib/stack-app/session-replays/index.d.ts.map +0 -1
  414. package/dist/lib/stack-app/teams/index.d.ts.map +0 -1
  415. package/dist/lib/stack-app/teams/index.js.map +0 -1
  416. package/dist/lib/stack-app/url-targets.d.ts.map +0 -1
  417. package/dist/lib/stack-app/url-targets.js.map +0 -1
  418. package/dist/lib/stack-app/url-targets.test.js.map +0 -1
  419. package/dist/lib/stack-app/users/index.d.ts.map +0 -1
  420. package/dist/lib/stack-app/users/index.js.map +0 -1
  421. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  422. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  423. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  424. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  425. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  426. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  427. /package/dist/esm/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  428. /package/dist/esm/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  429. /package/dist/esm/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  430. /package/dist/esm/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  431. /package/dist/esm/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  432. /package/dist/esm/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  433. /package/dist/esm/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  434. /package/dist/esm/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  435. /package/dist/esm/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
  436. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.cross-domain.test.d.ts +0 -0
  437. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/client-app-impl.oauth-prefetch.test.d.ts +0 -0
  438. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/event-tracker.test.d.ts +0 -0
  439. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-refresh-subscription.test.d.ts +0 -0
  440. /package/dist/lib/{stack-app → hexclave-app}/apps/implementations/session-replay.test.d.ts +0 -0
  441. /package/dist/lib/{stack-app → hexclave-app}/apps/index.d.ts +0 -0
  442. /package/dist/lib/{stack-app → hexclave-app}/apps/index.js +0 -0
  443. /package/dist/lib/{stack-app → hexclave-app}/connected-accounts/index.js +0 -0
  444. /package/dist/lib/{stack-app → hexclave-app}/customers/index.js +0 -0
  445. /package/dist/lib/{stack-app → hexclave-app}/data-vault/index.js +0 -0
  446. /package/dist/lib/{stack-app → hexclave-app}/email/index.js +0 -0
  447. /package/dist/lib/{stack-app → hexclave-app}/notification-categories/index.js +0 -0
  448. /package/dist/lib/{stack-app → hexclave-app}/project-configs/index.js +0 -0
  449. /package/dist/lib/{stack-app → hexclave-app}/session-replays/index.js +0 -0
  450. /package/dist/lib/{stack-app → hexclave-app}/url-targets.test.d.ts +0 -0
@@ -0,0 +1,106 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { describe, expect, it, vi } from "vitest";
6
+ import { subscribeSessionRefresh } from "./session-refresh-subscription";
7
+
8
+ type Listener = () => void;
9
+
10
+ function createTokenStoreTestDouble() {
11
+ const listeners = new Set<Listener>();
12
+ const unsubscribe = vi.fn((listener: Listener) => {
13
+ listeners.delete(listener);
14
+ });
15
+
16
+ return {
17
+ tokenStore: {
18
+ onChange: vi.fn((listener: Listener) => {
19
+ listeners.add(listener);
20
+ return {
21
+ unsubscribe: () => unsubscribe(listener),
22
+ };
23
+ }),
24
+ },
25
+ emitChange: () => {
26
+ for (const listener of [...listeners]) {
27
+ listener();
28
+ }
29
+ },
30
+ unsubscribe,
31
+ };
32
+ }
33
+
34
+ function createSessionTestDouble(sessionKey: string) {
35
+ const refreshUnsubscribe = vi.fn();
36
+ return {
37
+ session: {
38
+ sessionKey,
39
+ startRefreshingAccessToken: vi.fn(() => ({
40
+ unsubscribe: refreshUnsubscribe,
41
+ })),
42
+ },
43
+ refreshUnsubscribe,
44
+ };
45
+ }
46
+
47
+ describe("subscribeSessionRefresh", () => {
48
+ it("starts token refresh while subscribed and stops it on unsubscribe", () => {
49
+ const tokenStore = createTokenStoreTestDouble();
50
+ const firstSession = createSessionTestDouble("refresh-token-1");
51
+ const onTokenStoreChange = vi.fn();
52
+
53
+ const unsubscribe = subscribeSessionRefresh({
54
+ tokenStore: tokenStore.tokenStore,
55
+ getSession: () => firstSession.session,
56
+ onTokenStoreChange,
57
+ });
58
+
59
+ expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);
60
+ expect(tokenStore.tokenStore.onChange).toHaveBeenCalledOnce();
61
+
62
+ unsubscribe();
63
+
64
+ expect(tokenStore.unsubscribe).toHaveBeenCalledOnce();
65
+ expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();
66
+ });
67
+
68
+ it("keeps the existing refresh loop when the token store changes within the same session", () => {
69
+ const tokenStore = createTokenStoreTestDouble();
70
+ const firstSession = createSessionTestDouble("refresh-token-1");
71
+ const onTokenStoreChange = vi.fn();
72
+
73
+ subscribeSessionRefresh({
74
+ tokenStore: tokenStore.tokenStore,
75
+ getSession: () => firstSession.session,
76
+ onTokenStoreChange,
77
+ });
78
+
79
+ tokenStore.emitChange();
80
+
81
+ expect(onTokenStoreChange).toHaveBeenCalledOnce();
82
+ expect(firstSession.session.startRefreshingAccessToken).toHaveBeenCalledOnce();
83
+ expect(firstSession.refreshUnsubscribe).not.toHaveBeenCalled();
84
+ });
85
+
86
+ it("moves the refresh loop when the token store changes to a different session", () => {
87
+ const tokenStore = createTokenStoreTestDouble();
88
+ const firstSession = createSessionTestDouble("refresh-token-1");
89
+ const secondSession = createSessionTestDouble("refresh-token-2");
90
+ const sessions = [firstSession.session, secondSession.session];
91
+ const onTokenStoreChange = vi.fn();
92
+
93
+ subscribeSessionRefresh({
94
+ tokenStore: tokenStore.tokenStore,
95
+ getSession: () => sessions[0] ?? secondSession.session,
96
+ onTokenStoreChange,
97
+ });
98
+
99
+ sessions.shift();
100
+ tokenStore.emitChange();
101
+
102
+ expect(onTokenStoreChange).toHaveBeenCalledOnce();
103
+ expect(firstSession.refreshUnsubscribe).toHaveBeenCalledOnce();
104
+ expect(secondSession.session.startRefreshingAccessToken).toHaveBeenCalledWith(30_000, 60_000);
105
+ });
106
+ });
@@ -0,0 +1,52 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ type TokenStoreSubscription = {
6
+ unsubscribe: () => void,
7
+ };
8
+
9
+ type TokenStoreLike = {
10
+ onChange: (callback: () => void) => TokenStoreSubscription,
11
+ };
12
+
13
+ type SessionRefreshLike = {
14
+ sessionKey: string,
15
+ startRefreshingAccessToken: (minMillisUntilExpiration: number, maxMillisSinceIssued: number | null) => TokenStoreSubscription,
16
+ };
17
+
18
+ /**
19
+ * Keeps the currently mounted React session fresh while `useSyncExternalStore`
20
+ * has an active subscriber. The token store owns which session is current; when
21
+ * it changes to a different session key, we stop refreshing the old session and
22
+ * start refreshing the new one. The caller still receives every token-store
23
+ * change through `onTokenStoreChange` so React can re-read the session snapshot.
24
+ */
25
+ export function subscribeSessionRefresh(options: {
26
+ tokenStore: TokenStoreLike,
27
+ getSession: () => SessionRefreshLike,
28
+ onTokenStoreChange: () => void,
29
+ minMillisUntilExpiration?: number,
30
+ maxMillisSinceIssued?: number | null,
31
+ }): () => void {
32
+ const minMillisUntilExpiration = options.minMillisUntilExpiration ?? 30_000;
33
+ const maxMillisSinceIssued = options.maxMillisSinceIssued ?? 60_000;
34
+
35
+ let refreshedSession = options.getSession();
36
+ let refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);
37
+
38
+ const tokenStoreSubscription = options.tokenStore.onChange(() => {
39
+ const nextSession = options.getSession();
40
+ if (nextSession.sessionKey !== refreshedSession.sessionKey) {
41
+ refreshSubscription.unsubscribe();
42
+ refreshedSession = nextSession;
43
+ refreshSubscription = refreshedSession.startRefreshingAccessToken(minMillisUntilExpiration, maxMillisSinceIssued);
44
+ }
45
+ options.onTokenStoreChange();
46
+ });
47
+
48
+ return () => {
49
+ tokenStoreSubscription.unsubscribe();
50
+ refreshSubscription.unsubscribe();
51
+ };
52
+ }
@@ -0,0 +1,33 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { describe, expect, it } from "vitest";
6
+ import { analyticsOptionsFromJson, analyticsOptionsToJson } from "./session-replay";
7
+
8
+ describe("analytics option JSON conversion", () => {
9
+ it("preserves top-level analytics options when serializing replay block classes", () => {
10
+ const json = analyticsOptionsToJson({
11
+ enabled: false,
12
+ replays: {
13
+ enabled: true,
14
+ blockClass: /stack-sensitive/u,
15
+ },
16
+ });
17
+
18
+ expect(json?.enabled).toBe(false);
19
+ expect(json?.replays?.enabled).toBe(true);
20
+ });
21
+
22
+ it("preserves top-level analytics options when deserializing replay block classes", () => {
23
+ const roundTripped = analyticsOptionsFromJson(analyticsOptionsToJson({
24
+ enabled: false,
25
+ replays: {
26
+ blockClass: /stack-sensitive/u,
27
+ },
28
+ }));
29
+
30
+ expect(roundTripped?.enabled).toBe(false);
31
+ expect(roundTripped?.replays?.blockClass).toEqual(/stack-sensitive/u);
32
+ });
33
+ });
@@ -0,0 +1,356 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { isBrowserLike } from "@hexclave/shared/dist/utils/env";
6
+ import { captureWarning } from "@hexclave/shared/dist/utils/errors";
7
+ import { runAsynchronously } from "@hexclave/shared/dist/utils/promises";
8
+ import { Result } from "@hexclave/shared/dist/utils/results";
9
+
10
+ export type AnalyticsReplayOptions = {
11
+ /**
12
+ * Whether session replays are enabled.
13
+ *
14
+ * @default false
15
+ */
16
+ enabled?: boolean,
17
+ /**
18
+ * Whether to mask the content of all `<input>` elements.
19
+ *
20
+ * @default true
21
+ */
22
+ maskAllInputs?: boolean,
23
+ /**
24
+ * A CSS class name or RegExp. Elements with a matching class will be blocked
25
+ * (replaced with a placeholder in the recording).
26
+ *
27
+ * @default undefined
28
+ */
29
+ blockClass?: string | RegExp,
30
+ /**
31
+ * A CSS selector string. Elements matching this selector will be blocked
32
+ * (replaced with a placeholder in the recording).
33
+ *
34
+ * @default undefined
35
+ */
36
+ blockSelector?: string,
37
+ };
38
+
39
+ export type AnalyticsOptions = {
40
+ /**
41
+ * Whether SDK-managed analytics capture is enabled.
42
+ *
43
+ * @default true
44
+ */
45
+ enabled?: boolean,
46
+ /**
47
+ * Options for session replay recording. Replays are disabled by default;
48
+ * set `enabled: true` to opt in.
49
+ */
50
+ replays?: AnalyticsReplayOptions,
51
+ };
52
+
53
+ /**
54
+ * Converts AnalyticsOptions to a JSON-safe representation.
55
+ * RegExp blockClass values are serialized as `{ __regexp, __flags }` objects.
56
+ * The return type is AnalyticsOptions to keep StackClientAppJson simple;
57
+ * the actual runtime value is JSON-safe.
58
+ */
59
+ export function analyticsOptionsToJson(options: AnalyticsOptions | undefined): AnalyticsOptions | undefined {
60
+ if (!options?.replays?.blockClass) return options;
61
+ const { blockClass, ...rest } = options.replays;
62
+ if (!(blockClass instanceof RegExp)) return options;
63
+ return {
64
+ ...options,
65
+ replays: {
66
+ ...rest,
67
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
68
+ blockClass: { __regexp: blockClass.source, __flags: blockClass.flags } as any,
69
+ },
70
+ };
71
+ }
72
+
73
+ /**
74
+ * Reconstructs AnalyticsOptions from a JSON-deserialized value.
75
+ * Converts `{ __regexp, __flags }` objects back to RegExp instances.
76
+ */
77
+ export function analyticsOptionsFromJson(json: AnalyticsOptions | undefined): AnalyticsOptions | undefined {
78
+ if (!json?.replays?.blockClass) return json;
79
+ const { blockClass, ...rest } = json.replays;
80
+ if (typeof blockClass === 'object' && '__regexp' in blockClass) {
81
+ const bc = blockClass as unknown as { __regexp: string, __flags: string };
82
+ return {
83
+ ...json,
84
+ replays: {
85
+ ...rest,
86
+ blockClass: new RegExp(bc.__regexp, bc.__flags),
87
+ },
88
+ };
89
+ }
90
+ return json;
91
+ }
92
+
93
+ // ---------- Recording internals ----------
94
+
95
+ // Hexclave rebrand: canonical localStorage prefix (colon delimiters preserved).
96
+ const LOCAL_STORAGE_PREFIX = "hexclave:session-replay:v1";
97
+ // Hexclave rebrand: legacy prefix — dual-read only, so a recording session active
98
+ // across an SDK upgrade is not orphaned. Never written.
99
+ const LEGACY_LOCAL_STORAGE_PREFIX = "stack:session-replay:v1";
100
+ const IDLE_TTL_MS = 3 * 60 * 1000;
101
+
102
+ const FLUSH_INTERVAL_MS = 5_000;
103
+ const MAX_EVENTS_PER_BATCH = 200;
104
+ const MAX_APPROX_BYTES_PER_BATCH = 512_000;
105
+
106
+ export type StoredSession = {
107
+ session_id: string,
108
+ created_at_ms: number,
109
+ last_activity_ms: number,
110
+ };
111
+
112
+ export function safeParseStoredSession(raw: string | null): StoredSession | null {
113
+ if (!raw) return null;
114
+ try {
115
+ const parsed = JSON.parse(raw);
116
+ if (typeof parsed !== "object" || parsed === null) return null;
117
+ if (typeof parsed.session_id !== "string") return null;
118
+ if (typeof parsed.created_at_ms !== "number") return null;
119
+ if (typeof parsed.last_activity_ms !== "number") return null;
120
+ return parsed as StoredSession;
121
+ } catch {
122
+ return null;
123
+ }
124
+ }
125
+
126
+ export function makeStorageKey(projectId: string) {
127
+ return `${LOCAL_STORAGE_PREFIX}:${projectId}`;
128
+ }
129
+
130
+ // Hexclave rebrand: legacy key, dual-read only (never written).
131
+ export function makeLegacyStorageKey(projectId: string) {
132
+ return `${LEGACY_LOCAL_STORAGE_PREFIX}:${projectId}`;
133
+ }
134
+
135
+ export function generateUuid() {
136
+ return crypto.randomUUID();
137
+ }
138
+
139
+ export function getOrRotateSession(options: { key: string, legacyKey?: string, nowMs: number }): StoredSession {
140
+ // Hexclave rebrand: prefer the new key; fall back to the legacy key so a
141
+ // recording session active across an SDK upgrade is not orphaned.
142
+ const existing = safeParseStoredSession(localStorage.getItem(options.key))
143
+ ?? (options.legacyKey ? safeParseStoredSession(localStorage.getItem(options.legacyKey)) : null);
144
+ if (existing && options.nowMs - existing.last_activity_ms <= IDLE_TTL_MS) {
145
+ return existing;
146
+ }
147
+ const next: StoredSession = {
148
+ session_id: generateUuid(),
149
+ created_at_ms: options.nowMs,
150
+ last_activity_ms: options.nowMs,
151
+ };
152
+ localStorage.setItem(options.key, JSON.stringify(next));
153
+ return next;
154
+ }
155
+
156
+ export type SessionRecorderDeps = {
157
+ projectId: string,
158
+ sendBatch: (body: string, options: { keepalive: boolean }) => Promise<Result<Response, Error>>,
159
+ };
160
+
161
+ export class SessionRecorder {
162
+ private _started = false;
163
+ private _cancelled = false;
164
+ private _stopRecording: (() => void) | null = null;
165
+ private _detachListeners: (() => void) | null = null;
166
+ private _flushTimer: ReturnType<typeof setInterval> | null = null;
167
+ private _events: unknown[] = [];
168
+ private _approxBytes = 0;
169
+ private _lastPersistActivity = 0;
170
+ private _recording = false;
171
+ private _rrwebModule: typeof import("rrweb") | null = null;
172
+ private _lastBrowserSessionId: string | null = null;
173
+ private _takingSnapshot = false;
174
+ private _flushInProgress = false;
175
+ private readonly _sessionReplaySegmentId: string;
176
+ private readonly _storageKey: string;
177
+ // Hexclave rebrand: legacy key used for dual-read fallback only.
178
+ private readonly _legacyStorageKey: string;
179
+ private readonly _deps: SessionRecorderDeps;
180
+ private readonly _replayOptions: AnalyticsReplayOptions;
181
+
182
+ constructor(deps: SessionRecorderDeps, replayOptions: AnalyticsReplayOptions) {
183
+ this._deps = deps;
184
+ this._replayOptions = replayOptions;
185
+ this._sessionReplaySegmentId = generateUuid();
186
+ this._storageKey = makeStorageKey(deps.projectId);
187
+ this._legacyStorageKey = makeLegacyStorageKey(deps.projectId);
188
+ }
189
+
190
+ /**
191
+ * Starts recording. Idempotent — calling multiple times is safe.
192
+ */
193
+ start() {
194
+ if (this._started) return;
195
+ if (!isBrowserLike()) return;
196
+ this._started = true;
197
+
198
+ // Kick off rrweb recording
199
+ runAsynchronously(() => this._startRecording(), { noErrorLogging: true });
200
+
201
+ // Periodic flush
202
+ this._flushTimer = setInterval(() => this._tick(), FLUSH_INTERVAL_MS);
203
+ }
204
+
205
+ stop() {
206
+ this._cancelled = true;
207
+ if (this._flushTimer !== null) {
208
+ clearInterval(this._flushTimer);
209
+ this._flushTimer = null;
210
+ }
211
+ // Flush remaining events before cleanup
212
+ runAsynchronously(() => this._flush({ keepalive: true }));
213
+ this._stopCurrentRecording();
214
+ }
215
+
216
+ clearBuffer() {
217
+ this._events = [];
218
+ this._approxBytes = 0;
219
+ }
220
+
221
+ private _persistActivity(nowMs: number): StoredSession {
222
+ const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });
223
+ if (nowMs - this._lastPersistActivity < 5_000) return stored;
224
+ this._lastPersistActivity = nowMs;
225
+ const updated: StoredSession = { ...stored, last_activity_ms: nowMs };
226
+ localStorage.setItem(this._storageKey, JSON.stringify(updated));
227
+ return stored;
228
+ }
229
+
230
+ private async _flush(options: { keepalive: boolean }) {
231
+ if (this._events.length === 0) return;
232
+ // Prevent concurrent in-flight HTTP requests. When a flush is already
233
+ // in-flight, a second batch could race on the server (both call
234
+ // findRecentSessionReplay before either upsert commits) and create
235
+ // duplicate SessionReplay records. Events stay in _events and will be
236
+ // picked up by the next tick or batch-size check.
237
+ if (this._flushInProgress) return;
238
+
239
+ const nowMs = Date.now();
240
+ const stored = getOrRotateSession({ key: this._storageKey, legacyKey: this._legacyStorageKey, nowMs });
241
+
242
+ const batchId = generateUuid();
243
+ const payload = {
244
+ browser_session_id: stored.session_id,
245
+ session_replay_segment_id: this._sessionReplaySegmentId,
246
+ batch_id: batchId,
247
+ started_at_ms: stored.created_at_ms,
248
+ sent_at_ms: nowMs,
249
+ events: this._events,
250
+ };
251
+
252
+ this._events = [];
253
+ this._approxBytes = 0;
254
+
255
+ this._flushInProgress = true;
256
+ try {
257
+ const res = await this._deps.sendBatch(
258
+ JSON.stringify(payload),
259
+ { keepalive: options.keepalive },
260
+ );
261
+
262
+ if (res.status === "error") {
263
+ captureWarning("SessionRecorder.flush", res.error);
264
+ return;
265
+ }
266
+
267
+ if (!res.data.ok) {
268
+ captureWarning("SessionRecorder.flush", new Error(`SessionRecorder flush failed: ${res.data.status} ${await res.data.text()}`));
269
+ }
270
+ } finally {
271
+ this._flushInProgress = false;
272
+ }
273
+ }
274
+
275
+ private async _startRecording() {
276
+ if (this._recording || this._cancelled) return;
277
+
278
+ if (!this._rrwebModule) {
279
+ const rrwebImport = await Result.fromPromise(import("rrweb"));
280
+ if (rrwebImport.status === "error") {
281
+ console.warn("SessionRecorder: rrweb import failed. Is rrweb installed?", rrwebImport.error);
282
+ return;
283
+ }
284
+ this._rrwebModule = rrwebImport.data;
285
+ }
286
+
287
+ // cancelled may change during the await above
288
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
289
+ if (this._cancelled) return;
290
+
291
+ this._stopRecording = this._rrwebModule.record({
292
+ emit: (event) => {
293
+ const nowMs = Date.now();
294
+ const stored = this._persistActivity(nowMs);
295
+
296
+ // Detect session rotation: after 3+ minutes idle, getOrRotateSession
297
+ // creates a new session ID. We need to inject a FullSnapshot so the
298
+ // new server-side SessionReplay record is playable.
299
+ if (this._lastBrowserSessionId === null) {
300
+ this._lastBrowserSessionId = stored.session_id;
301
+ } else if (stored.session_id !== this._lastBrowserSessionId && !this._takingSnapshot) {
302
+ this._lastBrowserSessionId = stored.session_id;
303
+ // Inject a FullSnapshot for the new session (calls emit synchronously)
304
+ this._takingSnapshot = true;
305
+ try {
306
+ this._rrwebModule!.record.takeFullSnapshot();
307
+ } finally {
308
+ this._takingSnapshot = false;
309
+ }
310
+ }
311
+
312
+ this._events.push(event);
313
+ this._approxBytes += JSON.stringify(event).length;
314
+ if (this._events.length >= MAX_EVENTS_PER_BATCH || this._approxBytes >= MAX_APPROX_BYTES_PER_BATCH) {
315
+ runAsynchronously(() => this._flush({ keepalive: false }));
316
+ }
317
+ },
318
+ maskAllInputs: this._replayOptions.maskAllInputs ?? true,
319
+ ...(this._replayOptions.blockClass !== undefined ? { blockClass: this._replayOptions.blockClass } : {}),
320
+ ...(this._replayOptions.blockSelector !== undefined ? { blockSelector: this._replayOptions.blockSelector } : {}),
321
+ }) ?? null;
322
+
323
+ this._recording = true;
324
+
325
+ const onPageHide = () => {
326
+ runAsynchronously(() => this._flush({ keepalive: true }));
327
+ };
328
+ window.addEventListener("pagehide", onPageHide);
329
+ document.addEventListener("visibilitychange", onPageHide);
330
+ this._detachListeners = () => {
331
+ window.removeEventListener("pagehide", onPageHide);
332
+ document.removeEventListener("visibilitychange", onPageHide);
333
+ };
334
+ }
335
+
336
+ private _stopCurrentRecording() {
337
+ if (this._detachListeners) {
338
+ this._detachListeners();
339
+ this._detachListeners = null;
340
+ }
341
+ if (this._stopRecording) {
342
+ this._stopRecording();
343
+ this._stopRecording = null;
344
+ }
345
+ this._events = [];
346
+ this._approxBytes = 0;
347
+ this._recording = false;
348
+ }
349
+
350
+ private _tick() {
351
+ if (this._cancelled) return;
352
+ if (this._events.length > 0) {
353
+ runAsynchronously(() => this._flush({ keepalive: false }));
354
+ }
355
+ }
356
+ }
@@ -0,0 +1,40 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ export {
6
+ HexclaveClientApp,
7
+ StackClientApp
8
+ } from "./interfaces/client-app";
9
+ // HexclaveClientApp / StackClientApp are exported above as classes (TS treats classes as
10
+ // both value + type), so only the helper types need a separate type-only re-export here.
11
+ export type {
12
+ HexclaveClientAppConstructor,
13
+ HexclaveClientAppConstructorOptions,
14
+ HexclaveClientAppJson,
15
+ StackClientAppConstructor,
16
+ StackClientAppConstructorOptions,
17
+ StackClientAppJson
18
+ } from "./interfaces/client-app";
19
+
20
+ export {
21
+ HexclaveServerApp,
22
+ StackServerApp
23
+ } from "./interfaces/server-app";
24
+ export type {
25
+ HexclaveServerAppConstructor,
26
+ HexclaveServerAppConstructorOptions,
27
+ StackServerAppConstructor,
28
+ StackServerAppConstructorOptions
29
+ } from "./interfaces/server-app";
30
+
31
+ export {
32
+ HexclaveAdminApp,
33
+ StackAdminApp
34
+ } from "./interfaces/admin-app";
35
+ export type {
36
+ HexclaveAdminAppConstructor,
37
+ HexclaveAdminAppConstructorOptions,
38
+ StackAdminAppConstructor,
39
+ StackAdminAppConstructorOptions,
40
+ } from "./interfaces/admin-app";