@baseplate-dev/plugin-auth 0.6.18 → 0.6.19

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 (209) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/admin-crud-manage-roles-action.generator.d.ts +62 -0
  3. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/index.d.ts +62 -0
  4. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/template-renderers.d.ts +31 -0
  5. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/typed-templates.d.ts +31 -0
  6. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.js +1 -2
  7. package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.tsx +1 -1
  8. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/admin-crud-reset-password-action.generator.d.ts +62 -0
  9. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/index.d.ts +62 -0
  10. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/template-renderers.d.ts +31 -0
  11. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/typed-templates.d.ts +62 -0
  12. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.js +1 -2
  13. package/dist/better-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.tsx +1 -1
  14. package/dist/better-auth/admin/generators/admin-crud-roles-column/admin-crud-roles-column.generator.d.ts +31 -0
  15. package/dist/better-auth/core/node.js +7 -8
  16. package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/index.d.ts +1 -0
  17. package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/ts-import-providers.d.ts +1 -0
  18. package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/ts-import-providers.js +1 -0
  19. package/dist/better-auth/generators/fastify/better-auth-module/better-auth-module.generator.d.ts +20 -3
  20. package/dist/better-auth/generators/fastify/better-auth-module/better-auth-module.generator.js +5 -24
  21. package/dist/better-auth/generators/fastify/better-auth-module/generated/index.d.ts +40 -2
  22. package/dist/better-auth/generators/fastify/better-auth-module/generated/template-renderers.d.ts +19 -1
  23. package/dist/better-auth/generators/fastify/better-auth-module/generated/template-renderers.js +6 -2
  24. package/dist/better-auth/generators/fastify/better-auth-module/generated/ts-import-providers.d.ts +1 -0
  25. package/dist/better-auth/generators/fastify/better-auth-module/generated/ts-import-providers.js +1 -0
  26. package/dist/better-auth/generators/fastify/better-auth-module/generated/typed-templates.d.ts +20 -1
  27. package/dist/better-auth/generators/fastify/better-auth-module/generated/typed-templates.js +4 -1
  28. package/dist/better-auth/generators/fastify/better-auth-module/templates/module/services/auth.ts +16 -8
  29. package/dist/better-auth/generators/react/better-auth-hooks/better-auth-hooks.generator.d.ts +1 -1
  30. package/dist/better-auth/generators/react/better-auth-hooks/generated/index.d.ts +5 -4
  31. package/dist/better-auth/generators/react/better-auth-hooks/generated/template-paths.d.ts +1 -1
  32. package/dist/better-auth/generators/react/better-auth-hooks/generated/template-paths.js +1 -1
  33. package/dist/better-auth/generators/react/better-auth-hooks/generated/ts-import-providers.d.ts +2 -1
  34. package/dist/better-auth/generators/react/better-auth-hooks/generated/ts-import-providers.js +2 -1
  35. package/dist/better-auth/generators/react/better-auth-hooks/generated/typed-templates.d.ts +6 -6
  36. package/dist/better-auth/generators/react/better-auth-hooks/generated/typed-templates.js +13 -13
  37. package/dist/better-auth/generators/react/better-auth-hooks/templates/src/hooks/{use-required-user-id.ts → use-user-id-or-throw.ts} +1 -1
  38. package/dist/better-auth/generators/react/better-auth-pages/better-auth-pages.generator.d.ts +31 -0
  39. package/dist/better-auth/generators/react/better-auth-pages/generated/index.d.ts +186 -0
  40. package/dist/better-auth/generators/react/better-auth-pages/generated/template-renderers.d.ts +31 -0
  41. package/dist/better-auth/generators/react/better-auth-pages/generated/typed-templates.d.ts +310 -0
  42. package/dist/better-auth/generators/react/better-auth-pages/templates/routes/forgot-password.tsx +1 -4
  43. package/dist/better-auth/generators/react/react-better-auth/generated/index.d.ts +65 -2
  44. package/dist/better-auth/generators/react/react-better-auth/generated/template-renderers.d.ts +32 -1
  45. package/dist/better-auth/generators/react/react-better-auth/generated/ts-import-providers.d.ts +1 -0
  46. package/dist/better-auth/generators/react/react-better-auth/generated/ts-import-providers.js +1 -0
  47. package/dist/better-auth/generators/react/react-better-auth/generated/typed-templates.d.ts +32 -1
  48. package/dist/better-auth/generators/react/react-better-auth/react-better-auth.generator.d.ts +32 -1
  49. package/dist/better-auth/generators/react/react-better-auth/templates/src/app/auth-loaded-gate.tsx +12 -3
  50. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/admin-crud-invite-user-action.generator.d.ts +62 -0
  51. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/index.d.ts +62 -0
  52. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/template-renderers.d.ts +31 -0
  53. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/typed-templates.d.ts +31 -0
  54. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/templates/routes/-components/invite-user-dialog.js +1 -2
  55. package/dist/local-auth/admin/generators/admin-crud-invite-user-action/templates/routes/-components/invite-user-dialog.tsx +1 -1
  56. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/admin-crud-manage-roles-action.generator.d.ts +62 -0
  57. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/index.d.ts +62 -0
  58. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/template-renderers.d.ts +31 -0
  59. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/typed-templates.d.ts +31 -0
  60. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.js +1 -2
  61. package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.tsx +1 -1
  62. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/admin-crud-reset-password-action.generator.d.ts +62 -0
  63. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/index.d.ts +62 -0
  64. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/template-renderers.d.ts +31 -0
  65. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/typed-templates.d.ts +62 -0
  66. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.js +1 -2
  67. package/dist/local-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.tsx +1 -1
  68. package/dist/local-auth/admin/generators/admin-crud-roles-column/admin-crud-roles-column.generator.d.ts +31 -0
  69. package/dist/local-auth/core/generators/auth-email-password/auth-email-password.generator.d.ts +10 -7
  70. package/dist/local-auth/core/generators/auth-email-password/auth-email-password.generator.js +8 -11
  71. package/dist/local-auth/core/generators/auth-email-password/generated/index.d.ts +40 -13
  72. package/dist/local-auth/core/generators/auth-email-password/generated/template-renderers.d.ts +9 -0
  73. package/dist/local-auth/core/generators/auth-email-password/generated/template-renderers.js +6 -5
  74. package/dist/local-auth/core/generators/auth-email-password/generated/ts-import-providers.d.ts +1 -3
  75. package/dist/local-auth/core/generators/auth-email-password/generated/ts-import-providers.js +1 -2
  76. package/dist/local-auth/core/generators/auth-email-password/generated/typed-templates.d.ts +40 -16
  77. package/dist/local-auth/core/generators/auth-email-password/generated/typed-templates.js +11 -8
  78. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/email-verification.service.js +2 -3
  79. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/email-verification.service.ts +5 -3
  80. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/invite.service.js +17 -13
  81. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/invite.service.ts +25 -13
  82. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/password-reset.service.js +2 -3
  83. package/dist/local-auth/core/generators/auth-email-password/templates/module/services/password-reset.service.ts +5 -3
  84. package/dist/local-auth/core/generators/auth-hooks/auth-hooks.generator.d.ts +272 -1
  85. package/dist/local-auth/core/generators/auth-hooks/generated/index.d.ts +547 -4
  86. package/dist/local-auth/core/generators/auth-hooks/generated/template-paths.d.ts +1 -1
  87. package/dist/local-auth/core/generators/auth-hooks/generated/template-paths.js +1 -1
  88. package/dist/local-auth/core/generators/auth-hooks/generated/template-renderers.d.ts +271 -0
  89. package/dist/local-auth/core/generators/auth-hooks/generated/template-renderers.js +4 -2
  90. package/dist/local-auth/core/generators/auth-hooks/generated/ts-import-providers.d.ts +2 -1
  91. package/dist/local-auth/core/generators/auth-hooks/generated/ts-import-providers.js +2 -1
  92. package/dist/local-auth/core/generators/auth-hooks/generated/typed-templates.d.ts +548 -6
  93. package/dist/local-auth/core/generators/auth-hooks/generated/typed-templates.js +15 -14
  94. package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-log-out.js +1 -1
  95. package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-log-out.ts +1 -1
  96. package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-session.d.ts +7 -0
  97. package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-session.ts +7 -0
  98. package/dist/local-auth/core/generators/auth-module/auth-module.generator.d.ts +19 -7
  99. package/dist/local-auth/core/generators/auth-module/auth-module.generator.js +3 -26
  100. package/dist/local-auth/core/generators/auth-module/generated/index.d.ts +48 -7
  101. package/dist/local-auth/core/generators/auth-module/generated/template-paths.d.ts +0 -1
  102. package/dist/local-auth/core/generators/auth-module/generated/template-paths.js +0 -1
  103. package/dist/local-auth/core/generators/auth-module/generated/template-renderers.d.ts +19 -1
  104. package/dist/local-auth/core/generators/auth-module/generated/template-renderers.js +7 -3
  105. package/dist/local-auth/core/generators/auth-module/generated/ts-import-providers.d.ts +1 -0
  106. package/dist/local-auth/core/generators/auth-module/generated/ts-import-providers.js +1 -0
  107. package/dist/local-auth/core/generators/auth-module/generated/typed-templates.d.ts +28 -7
  108. package/dist/local-auth/core/generators/auth-module/generated/typed-templates.js +5 -14
  109. package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.d.ts +7 -6
  110. package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.js +23 -17
  111. package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.ts +25 -18
  112. package/dist/local-auth/core/generators/auth-module/templates/module/services/user-session.service.js +8 -9
  113. package/dist/local-auth/core/generators/auth-module/templates/module/services/user-session.service.ts +10 -11
  114. package/dist/local-auth/core/generators/auth-routes/auth-routes.generator.d.ts +31 -0
  115. package/dist/local-auth/core/generators/auth-routes/generated/index.d.ts +249 -0
  116. package/dist/local-auth/core/generators/auth-routes/generated/template-renderers.d.ts +31 -0
  117. package/dist/local-auth/core/generators/auth-routes/generated/ts-import-providers.d.ts +1 -0
  118. package/dist/local-auth/core/generators/auth-routes/generated/ts-import-providers.js +1 -0
  119. package/dist/local-auth/core/generators/auth-routes/generated/typed-templates.d.ts +310 -0
  120. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/accept-invite.js +12 -5
  121. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/accept-invite.tsx +14 -4
  122. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/forgot-password.js +1 -2
  123. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/forgot-password.tsx +1 -1
  124. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login-otp.js +4 -4
  125. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login-otp.tsx +4 -3
  126. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login.js +4 -4
  127. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login.tsx +4 -3
  128. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/register.js +4 -4
  129. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/register.tsx +4 -3
  130. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/reset-password.js +1 -2
  131. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/reset-password.tsx +1 -1
  132. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/verify-email.js +1 -2
  133. package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/verify-email.tsx +1 -1
  134. package/dist/local-auth/core/generators/react-session/generated/index.d.ts +78 -7
  135. package/dist/local-auth/core/generators/react-session/generated/template-renderers.d.ts +32 -1
  136. package/dist/local-auth/core/generators/react-session/generated/ts-import-providers.d.ts +1 -0
  137. package/dist/local-auth/core/generators/react-session/generated/ts-import-providers.js +1 -0
  138. package/dist/local-auth/core/generators/react-session/generated/typed-templates.d.ts +90 -12
  139. package/dist/local-auth/core/generators/react-session/generated/typed-templates.js +5 -2
  140. package/dist/local-auth/core/generators/react-session/react-session.generator.d.ts +48 -1
  141. package/dist/local-auth/core/generators/react-session/react-session.generator.js +35 -1
  142. package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.js +17 -44
  143. package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.tsx +21 -49
  144. package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.d.ts +43 -34
  145. package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.js +96 -80
  146. package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.ts +148 -82
  147. package/dist/local-auth/core/generators/seed-initial-user/generated/index.d.ts +0 -2
  148. package/dist/local-auth/core/generators/seed-initial-user/generated/template-renderers.d.ts +0 -1
  149. package/dist/local-auth/core/generators/seed-initial-user/generated/typed-templates.d.ts +0 -1
  150. package/dist/local-auth/core/generators/seed-initial-user/seed-initial-user.generator.d.ts +0 -1
  151. package/dist/local-auth/core/node.js +7 -7
  152. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/index.d.ts +4 -3
  153. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/template-paths.d.ts +1 -1
  154. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/template-paths.js +1 -1
  155. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/ts-import-providers.d.ts +2 -1
  156. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/ts-import-providers.js +2 -1
  157. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/typed-templates.d.ts +4 -4
  158. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/typed-templates.js +13 -13
  159. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/placeholder-auth-hooks.generator.d.ts +1 -1
  160. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/templates/src/hooks/use-session.d.ts +1 -0
  161. package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/templates/src/hooks/use-session.ts +2 -0
  162. package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/index.d.ts +1 -2
  163. package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/template-renderers.d.ts +0 -1
  164. package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/ts-import-providers.d.ts +1 -0
  165. package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/ts-import-providers.js +1 -0
  166. package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/typed-templates.d.ts +0 -1
  167. package/dist/placeholder-auth/core/generators/placeholder-auth-module/placeholder-auth-module.generator.d.ts +0 -1
  168. package/dist/web/assets/{_virtual_mf-localSharedImportMap___mfe_internal__plugin_mf_2_auth__mf_owner__1-CKKmnLep.js → _virtual_mf-localSharedImportMap___mfe_internal__plugin_mf_2_auth__mf_owner__1-DUupKqD4.js} +14 -14
  169. package/dist/web/assets/{_virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_project_mf_2_builder_mf_2_lib__loadShare__.js-Cx7TvZ_H.js → _virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_project_mf_2_builder_mf_2_lib__loadShare__.js-DE4rTqEA.js} +198 -66
  170. package/dist/web/assets/{_virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_project_mf_2_builder_mf_2_lib_mf_1_web__loadShare__.js-D3Nvasea.js → _virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_project_mf_2_builder_mf_2_lib_mf_1_web__loadShare__.js-mszeXpf-.js} +1 -1
  171. package/dist/web/assets/{_virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_ui_mf_2_components__loadShare__.js-C2GDE8Py.js → _virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_baseplate_mf_2_dev_mf_1_ui_mf_2_components__loadShare__.js-CtIleM_e.js} +2517 -1545
  172. package/dist/web/assets/{_virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_tanstack_mf_1_react_mf_2_router__loadShare__.js-CiccpWjh.js → _virtual_mf___mfe_internal__plugin_mf_2_auth__mf_owner__1__loadShare___mf_0_tanstack_mf_1_react_mf_2_router__loadShare__.js-BckLhSjF.js} +2 -2
  173. package/dist/web/assets/auth-DR6QxrAW.js +1 -0
  174. package/dist/web/assets/{common-CoLuMS7U.js → common-BsyRiQi3.js} +6 -6
  175. package/dist/web/assets/{common-N3skPbzk.js → common-CRwNlCMn.js} +10 -10
  176. package/dist/web/assets/{common-Co5lW_TK.js → common-CvqlRZC9.js} +12 -12
  177. package/dist/web/assets/{common-C8_sC5pp.js → common-D3atSs7O.js} +15 -15
  178. package/dist/web/assets/common-DuFyXa6l.js +36 -0
  179. package/dist/web/assets/common-islduJTj.js +43 -0
  180. package/dist/web/assets/{get-auth-plugin-definition-DyokUVjX.js → get-auth-plugin-definition-BgWWHl_Y.js} +3 -3
  181. package/dist/web/assets/{hostInit-BCYmw0H5.js → hostInit-DNA4kLRY.js} +1 -1
  182. package/dist/web/assets/{mf-entry-bootstrap-0-3ede9334.js → mf-entry-bootstrap-0-ea77c09b.js} +1 -1
  183. package/dist/web/assets/{mf-entry-bootstrap-1-3da85eea.js → mf-entry-bootstrap-1-9dee3d8d.js} +2 -2
  184. package/dist/web/assets/{mf-entry-bootstrap-2-32e24e11.js → mf-entry-bootstrap-2-3179040b.js} +1 -1
  185. package/dist/web/assets/{mf-entry-bootstrap-3-a3cfea9d.js → mf-entry-bootstrap-3-370d200d.js} +2 -2
  186. package/dist/web/assets/{models-BcPOQC5p.js → models-BOeSYfRn.js} +4 -4
  187. package/dist/web/assets/{models-BcUgOGGn.js → models-DF6DoXt6.js} +4 -4
  188. package/dist/web/assets/{plugin-definition-D1EImXIf.js → plugin-definition--k0VAeK3.js} +9 -9
  189. package/dist/web/assets/{plugin-definition-lw-gB4hU.js → plugin-definition-CMwSlxsJ.js} +3 -3
  190. package/dist/web/assets/{styles-EOyEbGA4.js → styles-BQEcQHoR.js} +8 -8
  191. package/dist/web/assets/{virtualExposes-DWORnjyA.js → virtualExposes-C7fDiAmS.js} +1 -1
  192. package/dist/web/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__plugin-auth__remoteEntry_js-t-KnBiUh.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__plugin-auth__remoteEntry_js-BZBRyml2.js} +3 -3
  193. package/dist/web/assets/{virtual_mf-exposes___mfe_internal__plugin-auth__remoteEntry_js-DZfE3QCR.js → virtual_mf-exposes___mfe_internal__plugin-auth__remoteEntry_js-6SjVUCs8.js} +13 -13
  194. package/dist/web/assets/{web-kaD9AzNS.js → web-8wz0ad-V.js} +8 -8
  195. package/dist/web/assets/{web-EDeSquSP.js → web-BGixH_gT.js} +19 -19
  196. package/dist/web/assets/{web-PqAcfBSy.js → web-BxIwkN3O.js} +7 -7
  197. package/dist/web/assets/{web-CBVepebK.js → web-CQMfABjr.js} +19 -19
  198. package/dist/web/assets/{web-RhChfBw_.js → web-CcNpItSu.js} +17 -17
  199. package/dist/web/assets/{web-xJ-GnSkC.js → web-CypPeiVv.js} +25 -25
  200. package/dist/web/assets/{web-Dgb85jhs.js → web-CzK_la2_.js} +41 -41
  201. package/dist/web/index.html +4 -4
  202. package/dist/web/remoteEntry.js +1 -1
  203. package/package.json +12 -12
  204. package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.d.ts +0 -38
  205. package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.js +0 -71
  206. package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.ts +0 -77
  207. package/dist/web/assets/auth-CsHp2bQi.js +0 -1
  208. package/dist/web/assets/common-BGTuTgx7.js +0 -43
  209. package/dist/web/assets/common-Dueu_1NG.js +0 -36
@@ -1,21 +1,29 @@
1
1
  export declare const mainGroup: {
2
2
  userSessionClient: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
3
- reactUtilsImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
4
- getSafeLocalStorage: {};
5
- }>>;
6
- }, Record<never, Record<never, never>>>;
7
- userSessionProvider: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
8
3
  authHooksImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
9
4
  SessionData: {
10
5
  isTypeOnly: true;
11
6
  };
12
7
  useLogOut: {};
13
- useRequiredUserId: {};
14
8
  useSession: {};
9
+ useUserIdOrThrow: {};
15
10
  AuthRole: {
16
11
  isTypeOnly: true;
17
12
  };
18
13
  }>>;
14
+ graphqlImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
15
+ '*': {};
16
+ graphql: {};
17
+ readFragment: {};
18
+ FragmentType: {
19
+ isTypeOnly: true;
20
+ };
21
+ }>>;
22
+ reactUtilsImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
23
+ getSafeLocalStorage: {};
24
+ }>>;
25
+ }, Record<never, Record<never, never>>>;
26
+ userSessionProvider: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
19
27
  graphqlImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
20
28
  '*': {};
21
29
  graphql: {};
@@ -32,6 +40,7 @@ export declare const mainGroup: {
32
40
  isTypeOnly: true;
33
41
  };
34
42
  Alert: {};
43
+ AlertAction: {};
35
44
  AlertDescription: {};
36
45
  AlertTitle: {};
37
46
  Autocomplete: {};
@@ -61,6 +70,7 @@ export declare const mainGroup: {
61
70
  buttonVariants: {};
62
71
  Calendar: {};
63
72
  Card: {};
73
+ CardAction: {};
64
74
  CardContent: {};
65
75
  CardDescription: {};
66
76
  CardFooter: {};
@@ -187,6 +197,10 @@ export declare const mainGroup: {
187
197
  NotFoundCard: {};
188
198
  NumberField: {};
189
199
  NumberFieldController: {};
200
+ PageHeader: {};
201
+ PageHeaderActions: {};
202
+ PageHeaderDescription: {};
203
+ PageHeaderTitle: {};
190
204
  Popover: {};
191
205
  PopoverContent: {};
192
206
  PopoverTrigger: {};
@@ -196,6 +210,11 @@ export declare const mainGroup: {
196
210
  isTypeOnly: true;
197
211
  };
198
212
  ScrollArea: {};
213
+ Section: {};
214
+ SectionActions: {};
215
+ SectionDescription: {};
216
+ SectionHeader: {};
217
+ SectionTitle: {};
199
218
  Select: {};
200
219
  SelectField: {};
201
220
  SelectFieldController: {};
@@ -251,7 +270,27 @@ export declare const mainGroup: {
251
270
  Textarea: {};
252
271
  TextareaField: {};
253
272
  TextareaFieldController: {};
273
+ Toast: {};
274
+ toast: {};
275
+ ToastAction: {};
276
+ ToastClose: {};
277
+ ToastContent: {};
278
+ ToastDescription: {};
254
279
  Toaster: {};
280
+ toastManager: {};
281
+ ToastOptions: {
282
+ isTypeOnly: true;
283
+ };
284
+ ToastPortal: {};
285
+ ToastProvider: {};
286
+ ToastTitle: {};
287
+ ToastType: {
288
+ isTypeOnly: true;
289
+ };
290
+ ToastUpdateOptions: {
291
+ isTypeOnly: true;
292
+ };
293
+ ToastViewport: {};
255
294
  Tooltip: {};
256
295
  TooltipContent: {};
257
296
  TooltipProvider: {};
@@ -279,22 +318,30 @@ export declare const mainGroup: {
279
318
  export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
280
319
  mainGroup: {
281
320
  userSessionClient: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
282
- reactUtilsImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
283
- getSafeLocalStorage: {};
284
- }>>;
285
- }, Record<never, Record<never, never>>>;
286
- userSessionProvider: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
287
321
  authHooksImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
288
322
  SessionData: {
289
323
  isTypeOnly: true;
290
324
  };
291
325
  useLogOut: {};
292
- useRequiredUserId: {};
293
326
  useSession: {};
327
+ useUserIdOrThrow: {};
294
328
  AuthRole: {
295
329
  isTypeOnly: true;
296
330
  };
297
331
  }>>;
332
+ graphqlImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
333
+ '*': {};
334
+ graphql: {};
335
+ readFragment: {};
336
+ FragmentType: {
337
+ isTypeOnly: true;
338
+ };
339
+ }>>;
340
+ reactUtilsImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
341
+ getSafeLocalStorage: {};
342
+ }>>;
343
+ }, Record<never, Record<never, never>>>;
344
+ userSessionProvider: import("@baseplate-dev/core-generators").TsTemplateFile<{}, {
298
345
  graphqlImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
299
346
  '*': {};
300
347
  graphql: {};
@@ -311,6 +358,7 @@ export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
311
358
  isTypeOnly: true;
312
359
  };
313
360
  Alert: {};
361
+ AlertAction: {};
314
362
  AlertDescription: {};
315
363
  AlertTitle: {};
316
364
  Autocomplete: {};
@@ -340,6 +388,7 @@ export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
340
388
  buttonVariants: {};
341
389
  Calendar: {};
342
390
  Card: {};
391
+ CardAction: {};
343
392
  CardContent: {};
344
393
  CardDescription: {};
345
394
  CardFooter: {};
@@ -466,6 +515,10 @@ export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
466
515
  NotFoundCard: {};
467
516
  NumberField: {};
468
517
  NumberFieldController: {};
518
+ PageHeader: {};
519
+ PageHeaderActions: {};
520
+ PageHeaderDescription: {};
521
+ PageHeaderTitle: {};
469
522
  Popover: {};
470
523
  PopoverContent: {};
471
524
  PopoverTrigger: {};
@@ -475,6 +528,11 @@ export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
475
528
  isTypeOnly: true;
476
529
  };
477
530
  ScrollArea: {};
531
+ Section: {};
532
+ SectionActions: {};
533
+ SectionDescription: {};
534
+ SectionHeader: {};
535
+ SectionTitle: {};
478
536
  Select: {};
479
537
  SelectField: {};
480
538
  SelectFieldController: {};
@@ -530,7 +588,27 @@ export declare const LOCAL_AUTH_CORE_REACT_SESSION_TEMPLATES: {
530
588
  Textarea: {};
531
589
  TextareaField: {};
532
590
  TextareaFieldController: {};
591
+ Toast: {};
592
+ toast: {};
593
+ ToastAction: {};
594
+ ToastClose: {};
595
+ ToastContent: {};
596
+ ToastDescription: {};
533
597
  Toaster: {};
598
+ toastManager: {};
599
+ ToastOptions: {
600
+ isTypeOnly: true;
601
+ };
602
+ ToastPortal: {};
603
+ ToastProvider: {};
604
+ ToastTitle: {};
605
+ ToastType: {
606
+ isTypeOnly: true;
607
+ };
608
+ ToastUpdateOptions: {
609
+ isTypeOnly: true;
610
+ };
611
+ ToastViewport: {};
534
612
  Tooltip: {};
535
613
  TooltipContent: {};
536
614
  TooltipProvider: {};
@@ -5,7 +5,11 @@ import { localAuthHooksImportsProvider } from '#src/local-auth/core/generators/a
5
5
  const userSessionClient = createTsTemplateFile({
6
6
  fileOptions: { kind: 'singleton' },
7
7
  group: 'main',
8
- importMapProviders: { reactUtilsImports: reactUtilsImportsProvider },
8
+ importMapProviders: {
9
+ authHooksImports: authHooksImportsProvider,
10
+ graphqlImports: graphqlImportsProvider,
11
+ reactUtilsImports: reactUtilsImportsProvider,
12
+ },
9
13
  name: 'user-session-client',
10
14
  projectExports: { UserSessionClient: {}, userSessionClient: {} },
11
15
  source: {
@@ -17,7 +21,6 @@ const userSessionProvider = createTsTemplateFile({
17
21
  fileOptions: { kind: 'singleton' },
18
22
  group: 'main',
19
23
  importMapProviders: {
20
- authHooksImports: authHooksImportsProvider,
21
24
  graphqlImports: graphqlImportsProvider,
22
25
  localAuthHooksImports: localAuthHooksImportsProvider,
23
26
  reactComponentsImports: reactComponentsImportsProvider,
@@ -23,8 +23,8 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
23
23
  isTypeOnly: true;
24
24
  };
25
25
  useLogOut: {};
26
- useRequiredUserId: {};
27
26
  useSession: {};
27
+ useUserIdOrThrow: {};
28
28
  AuthRole: {
29
29
  isTypeOnly: true;
30
30
  };
@@ -46,6 +46,7 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
46
46
  isTypeOnly: true;
47
47
  };
48
48
  Alert: {};
49
+ AlertAction: {};
49
50
  AlertDescription: {};
50
51
  AlertTitle: {};
51
52
  Autocomplete: {};
@@ -75,6 +76,7 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
75
76
  buttonVariants: {};
76
77
  Calendar: {};
77
78
  Card: {};
79
+ CardAction: {};
78
80
  CardContent: {};
79
81
  CardDescription: {};
80
82
  CardFooter: {};
@@ -201,6 +203,10 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
201
203
  NotFoundCard: {};
202
204
  NumberField: {};
203
205
  NumberFieldController: {};
206
+ PageHeader: {};
207
+ PageHeaderActions: {};
208
+ PageHeaderDescription: {};
209
+ PageHeaderTitle: {};
204
210
  Popover: {};
205
211
  PopoverContent: {};
206
212
  PopoverTrigger: {};
@@ -210,6 +216,11 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
210
216
  isTypeOnly: true;
211
217
  };
212
218
  ScrollArea: {};
219
+ Section: {};
220
+ SectionActions: {};
221
+ SectionDescription: {};
222
+ SectionHeader: {};
223
+ SectionTitle: {};
213
224
  Select: {};
214
225
  SelectField: {};
215
226
  SelectFieldController: {};
@@ -265,7 +276,27 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
265
276
  Textarea: {};
266
277
  TextareaField: {};
267
278
  TextareaFieldController: {};
279
+ Toast: {};
280
+ toast: {};
281
+ ToastAction: {};
282
+ ToastClose: {};
283
+ ToastContent: {};
284
+ ToastDescription: {};
268
285
  Toaster: {};
286
+ toastManager: {};
287
+ ToastOptions: {
288
+ isTypeOnly: true;
289
+ };
290
+ ToastPortal: {};
291
+ ToastProvider: {};
292
+ ToastTitle: {};
293
+ ToastType: {
294
+ isTypeOnly: true;
295
+ };
296
+ ToastUpdateOptions: {
297
+ isTypeOnly: true;
298
+ };
299
+ ToastViewport: {};
269
300
  Tooltip: {};
270
301
  TooltipContent: {};
271
302
  TooltipProvider: {};
@@ -300,6 +331,22 @@ export declare const reactSessionGenerator: import("@baseplate-dev/sync").Genera
300
331
  }>, "getValues">>;
301
332
  paths: import("@baseplate-dev/sync").ProviderType<import("./generated/template-paths.js").LocalAuthCoreReactSessionPaths>;
302
333
  }, any>;
334
+ reactRouterConfig: import("@baseplate-dev/sync").GeneratorTask<any, {
335
+ reactRouterConfig: import("@baseplate-dev/sync").ProviderType<Omit<import("@baseplate-dev/utils").FieldMap<{
336
+ routerSetupFragments: import("@baseplate-dev/utils").MapContainer<string, import("@baseplate-dev/core-generators").TsCodeFragment>;
337
+ routerBodyFragments: import("@baseplate-dev/utils").MapContainer<string, import("@baseplate-dev/core-generators").TsCodeFragment>;
338
+ rootLayoutComponent: import("@baseplate-dev/utils").ScalarContainer<import("@baseplate-dev/core-generators").TsCodeFragment | undefined>;
339
+ rootContextFields: import("@baseplate-dev/utils").NamedArrayFieldContainer<import("@baseplate-dev/react-generators").RootRouteContextField>;
340
+ errorComponentHeaderFragments: import("@baseplate-dev/utils").MapContainer<string, import("@baseplate-dev/core-generators").TsCodeFragment>;
341
+ errorComponentBodyFragments: import("@baseplate-dev/utils").MapContainer<string, import("@baseplate-dev/core-generators").TsCodeFragment>;
342
+ }>, "getValues">>;
343
+ reactRouterImports: import("@baseplate-dev/sync").ProviderType<import("@baseplate-dev/core-generators").InferTsImportMapFromSchema<{
344
+ AppRoutes: {};
345
+ ErrorComponent: {};
346
+ router: {};
347
+ }>>;
348
+ paths: import("@baseplate-dev/sync").ProviderType<import("./generated/template-paths.js").LocalAuthCoreReactSessionPaths>;
349
+ }, any>;
303
350
  main: import("@baseplate-dev/sync").GeneratorTask<any, {
304
351
  renderers: import("@baseplate-dev/sync").ProviderType<import("./generated/template-renderers.js").LocalAuthCoreReactSessionRenderers>;
305
352
  }, any>;
@@ -1,5 +1,5 @@
1
1
  import { TsCodeUtils, tsImportBuilder } from '@baseplate-dev/core-generators';
2
- import { reactAppConfigProvider } from '@baseplate-dev/react-generators';
2
+ import { reactAppConfigProvider, reactRouterConfigProvider, reactRouterImportsProvider, } from '@baseplate-dev/react-generators';
3
3
  import { createGenerator, createGeneratorTask } from '@baseplate-dev/sync';
4
4
  import { z } from 'zod';
5
5
  import { LOCAL_AUTH_CORE_REACT_SESSION_GENERATED as GENERATED_TEMPLATES } from './generated/index.js';
@@ -29,6 +29,40 @@ export const reactSessionGenerator = createGenerator({
29
29
  });
30
30
  },
31
31
  }),
32
+ reactRouterConfig: createGeneratorTask({
33
+ dependencies: {
34
+ reactRouterConfig: reactRouterConfigProvider,
35
+ reactRouterImports: reactRouterImportsProvider,
36
+ paths: GENERATED_TEMPLATES.paths.provider,
37
+ },
38
+ run({ reactRouterConfig, reactRouterImports, paths }) {
39
+ reactRouterConfig.routerSetupFragments.set('auth-session-router-sync', TsCodeUtils.templateWithImports([
40
+ tsImportBuilder(['useEffect']).from('react'),
41
+ tsImportBuilder(['userSessionClient']).from(paths.userSessionClient),
42
+ reactRouterImports.router.declaration(),
43
+ ]) `
44
+ // RouterProvider only copies the context into the router when it renders, so push
45
+ // the session in as soon as it changes. Otherwise a navigation triggered in the
46
+ // same tick as a sign in or sign out runs its guards against the old session.
47
+ useEffect(
48
+ () =>
49
+ userSessionClient.subscribe(() => {
50
+ const currentSession = userSessionClient.getSession();
51
+ if (!currentSession) return;
52
+ router.update({
53
+ ...router.options,
54
+ context: {
55
+ ...router.options.context,
56
+ session: currentSession,
57
+ userId: currentSession.userId,
58
+ },
59
+ });
60
+ }),
61
+ [],
62
+ );
63
+ `);
64
+ },
65
+ }),
32
66
  main: createGeneratorTask({
33
67
  dependencies: {
34
68
  renderers: GENERATED_TEMPLATES.renderers.provider,
@@ -5,7 +5,7 @@ import { AuthSessionContext } from '%localAuthHooksImports';
5
5
  import { ErrorableLoader } from '%reactComponentsImports';
6
6
  import { logError } from '%reactErrorImports';
7
7
  import { useApolloClient, useQuery } from '@apollo/client/react';
8
- import { useEffect, useMemo, useState } from 'react';
8
+ import { useEffect, useRef, useSyncExternalStore } from 'react';
9
9
  const getCurrentUserSessionQuery = graphql(`
10
10
  query CurrentUserSession {
11
11
  currentUserSession {
@@ -15,55 +15,28 @@ const getCurrentUserSessionQuery = graphql(`
15
15
  }
16
16
  `);
17
17
  export function UserSessionProvider({ children, }) {
18
- const [cachedUserId, setCachedUserId] = useState(userSessionClient.getUserId());
19
18
  const apolloClient = useApolloClient();
19
+ // The session comes from the session client rather than the query, since signing
20
+ // in clears the Apollo cache and would otherwise blank the session mid-transition.
21
+ const session = useSyncExternalStore(userSessionClient.subscribe, userSessionClient.getSession);
20
22
  const { data: sessionQueryData, error: sessionError } = useQuery(getCurrentUserSessionQuery, {
21
23
  notifyOnNetworkStatusChange: true,
22
24
  });
23
- const session = useMemo(() => {
24
- if (!sessionQueryData && cachedUserId) {
25
- // wait for server to fetch before loading session
26
- return undefined;
27
- }
28
- if (!sessionQueryData?.currentUserSession) {
29
- return {
30
- userId: undefined,
31
- isAuthenticated: false,
32
- roles: ['public'],
33
- };
34
- }
35
- return {
36
- userId: sessionQueryData.currentUserSession.userId,
37
- isAuthenticated: true,
38
- roles: sessionQueryData.currentUserSession.roles,
39
- };
40
- }, [sessionQueryData, cachedUserId]);
41
25
  useEffect(() => {
42
- const unsubscribe = userSessionClient.onUserIdChange((newUserId) => {
43
- if (newUserId !== cachedUserId) {
44
- setCachedUserId(newUserId);
45
- // Make sure to reset the Apollo client to clear any cached data
46
- apolloClient.resetStore().catch(logError);
47
- }
48
- });
49
- return unsubscribe;
50
- }, [cachedUserId, apolloClient]);
51
- useEffect(() => {
52
- // Once we have server session data, sync it with the client
53
- if (sessionQueryData) {
54
- const serverUserId = sessionQueryData.currentUserSession?.userId;
55
- const clientUserId = userSessionClient.getUserId();
56
- // If server says different user (or no user), update the client
57
- if (serverUserId !== clientUserId) {
58
- if (serverUserId) {
59
- userSessionClient.signIn(serverUserId);
60
- }
61
- else {
62
- userSessionClient.signOut();
63
- }
64
- }
65
- }
26
+ if (!sessionQueryData)
27
+ return;
28
+ userSessionClient.setServerSession(sessionQueryData.currentUserSession ?? undefined);
66
29
  }, [sessionQueryData]);
30
+ // The Apollo cache belongs to exactly one identity, so reset it whenever the
31
+ // identity changes and no data fetched for the previous user survives.
32
+ const cacheUserId = useRef(userSessionClient.getPersistedUserId());
33
+ useEffect(() => {
34
+ if (!session || session.userId === cacheUserId.current)
35
+ return;
36
+ cacheUserId.current = session.userId;
37
+ apolloClient.resetStore().catch(logError);
38
+ }, [session, apolloClient]);
39
+ // Only reachable before the first session is known, when nothing has mounted yet.
67
40
  if (!session) {
68
41
  return _jsx(ErrorableLoader, { error: sessionError });
69
42
  }
@@ -1,6 +1,5 @@
1
1
  // @ts-nocheck
2
2
 
3
- import type { SessionData } from '%authHooksImports';
4
3
  import type React from 'react';
5
4
 
6
5
  import { userSessionClient } from '$userSessionClient';
@@ -9,7 +8,7 @@ import { AuthSessionContext } from '%localAuthHooksImports';
9
8
  import { ErrorableLoader } from '%reactComponentsImports';
10
9
  import { logError } from '%reactErrorImports';
11
10
  import { useApolloClient, useQuery } from '@apollo/client/react';
12
- import { useEffect, useMemo, useState } from 'react';
11
+ import { useEffect, useRef, useSyncExternalStore } from 'react';
13
12
 
14
13
  interface UserSessionProviderProps {
15
14
  children: React.ReactNode;
@@ -27,11 +26,15 @@ const getCurrentUserSessionQuery = graphql(`
27
26
  export function UserSessionProvider({
28
27
  children,
29
28
  }: UserSessionProviderProps): React.JSX.Element {
30
- const [cachedUserId, setCachedUserId] = useState<string | undefined>(
31
- userSessionClient.getUserId(),
32
- );
33
29
  const apolloClient = useApolloClient();
34
30
 
31
+ // The session comes from the session client rather than the query, since signing
32
+ // in clears the Apollo cache and would otherwise blank the session mid-transition.
33
+ const session = useSyncExternalStore(
34
+ userSessionClient.subscribe,
35
+ userSessionClient.getSession,
36
+ );
37
+
35
38
  const { data: sessionQueryData, error: sessionError } = useQuery(
36
39
  getCurrentUserSessionQuery,
37
40
  {
@@ -39,54 +42,23 @@ export function UserSessionProvider({
39
42
  },
40
43
  );
41
44
 
42
- const session = useMemo((): SessionData | undefined => {
43
- if (!sessionQueryData && cachedUserId) {
44
- // wait for server to fetch before loading session
45
- return undefined;
46
- }
47
- if (!sessionQueryData?.currentUserSession) {
48
- return {
49
- userId: undefined,
50
- isAuthenticated: false,
51
- roles: ['public'],
52
- };
53
- }
54
- return {
55
- userId: sessionQueryData.currentUserSession.userId,
56
- isAuthenticated: true,
57
- roles: sessionQueryData.currentUserSession.roles,
58
- };
59
- }, [sessionQueryData, cachedUserId]);
60
-
61
45
  useEffect(() => {
62
- const unsubscribe = userSessionClient.onUserIdChange((newUserId) => {
63
- if (newUserId !== cachedUserId) {
64
- setCachedUserId(newUserId);
65
- // Make sure to reset the Apollo client to clear any cached data
66
- apolloClient.resetStore().catch(logError);
67
- }
68
- });
69
-
70
- return unsubscribe;
71
- }, [cachedUserId, apolloClient]);
46
+ if (!sessionQueryData) return;
47
+ userSessionClient.setServerSession(
48
+ sessionQueryData.currentUserSession ?? undefined,
49
+ );
50
+ }, [sessionQueryData]);
72
51
 
52
+ // The Apollo cache belongs to exactly one identity, so reset it whenever the
53
+ // identity changes and no data fetched for the previous user survives.
54
+ const cacheUserId = useRef(userSessionClient.getPersistedUserId());
73
55
  useEffect(() => {
74
- // Once we have server session data, sync it with the client
75
- if (sessionQueryData) {
76
- const serverUserId = sessionQueryData.currentUserSession?.userId;
77
- const clientUserId = userSessionClient.getUserId();
78
-
79
- // If server says different user (or no user), update the client
80
- if (serverUserId !== clientUserId) {
81
- if (serverUserId) {
82
- userSessionClient.signIn(serverUserId);
83
- } else {
84
- userSessionClient.signOut();
85
- }
86
- }
87
- }
88
- }, [sessionQueryData]);
56
+ if (!session || session.userId === cacheUserId.current) return;
57
+ cacheUserId.current = session.userId;
58
+ apolloClient.resetStore().catch(logError);
59
+ }, [session, apolloClient]);
89
60
 
61
+ // Only reachable before the first session is known, when nothing has mounted yet.
90
62
  if (!session) {
91
63
  return <ErrorableLoader error={sessionError} />;
92
64
  }
@@ -1,55 +1,64 @@
1
+ import type { SessionData } from '%authHooksImports';
2
+ import type { AuthRole } from '%graphqlImports';
1
3
  /**
2
- * Callback function for user ID change events
4
+ * Callback function for session change events
3
5
  */
4
- type UserIdChangeCallback = (userId: string | undefined) => void;
5
- /**
6
- * User session client for managing session persistence using localStorage
7
- * Handles session state persistence and cross-tab synchronization
8
- */
9
- export declare class UserSessionClient {
10
- private static readonly USER_ID_STORAGE_KEY;
11
- private readonly storage;
12
- private readonly callbacks;
13
- private cleanupListener?;
14
- constructor();
15
- /**
16
- * Sign in a user with the given user ID
17
- * @param userId - The user ID to sign in
18
- */
19
- signIn(userId: string): void;
6
+ type SessionChangeCallback = () => void;
7
+ export interface UserSessionClient {
20
8
  /**
21
- * Sign out the current user
9
+ * Get the current session, or `undefined` if it is not known yet.
10
+ *
11
+ * Returns a stable reference that only changes when the session itself changes,
12
+ * so it is safe to use as a `useSyncExternalStore` snapshot.
22
13
  */
23
- signOut(): void;
14
+ getSession: () => SessionData | undefined;
24
15
  /**
25
- * Subscribe to user ID changes
26
- * @param callback - Function to call when user ID changes
16
+ * Subscribe to session changes
17
+ * @param callback - Function to call when the session changes
27
18
  * @returns Cleanup function to unsubscribe
28
19
  */
29
- onUserIdChange(callback: UserIdChangeCallback): () => void;
20
+ subscribe: (callback: SessionChangeCallback) => () => void;
30
21
  /**
31
- * Clean up resources when the client is no longer needed
22
+ * Sign in a user with a session the server has already returned
23
+ * @param userId - The user ID to sign in
24
+ * @param roles - The roles the server issued alongside the session
32
25
  */
33
- destroy(): void;
26
+ signIn: (userId: string, roles: AuthRole[]) => void;
34
27
  /**
35
- * Get the current user ID from storage
36
- * @returns User ID or null if not authenticated
28
+ * Sign out the current user
37
29
  */
38
- getUserId(): string | undefined;
30
+ signOut: () => void;
39
31
  /**
40
- * Set the user ID in storage
41
- * @param userId - User ID to store, or null to clear
32
+ * Apply the session reported by the server, confirming or replacing whatever was
33
+ * published locally
34
+ * @param session - The session from the server, or undefined if signed out
42
35
  */
43
- private setUserId;
36
+ setServerSession: (session: {
37
+ userId: string;
38
+ roles: AuthRole[];
39
+ } | undefined) => void;
44
40
  /**
45
- * Set up storage listener for cross-tab synchronization
41
+ * Get the user ID persisted in storage, which may not be confirmed yet
42
+ * @returns User ID or undefined if not signed in
46
43
  */
47
- private setupStorageListener;
44
+ getPersistedUserId: () => string | undefined;
48
45
  /**
49
- * Notify all registered callbacks of session changes
46
+ * Clean up resources when the client is no longer needed
50
47
  */
51
- private notifyCallbacks;
48
+ destroy: () => void;
52
49
  }
50
+ /**
51
+ * Creates the client-side source of truth for the current user session.
52
+ *
53
+ * The session is published synchronously when it is known locally (sign in / sign
54
+ * out) and refined asynchronously when the server confirms it. It is deliberately
55
+ * not derived from the Apollo cache, since signing in clears that cache.
56
+ *
57
+ * The user ID is persisted to localStorage for cold starts and cross-tab
58
+ * synchronisation. Roles are never persisted — they are only ever trusted from the
59
+ * server, and are enforced there regardless.
60
+ */
61
+ export declare function createUserSessionClient(): UserSessionClient;
53
62
  /**
54
63
  * Global user session client instance
55
64
  */