@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.
- package/CHANGELOG.md +34 -0
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/admin-crud-manage-roles-action.generator.d.ts +62 -0
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/index.d.ts +62 -0
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/template-renderers.d.ts +31 -0
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/generated/typed-templates.d.ts +31 -0
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.js +1 -2
- package/dist/better-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.tsx +1 -1
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/admin-crud-reset-password-action.generator.d.ts +62 -0
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/index.d.ts +62 -0
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/template-renderers.d.ts +31 -0
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/generated/typed-templates.d.ts +62 -0
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.js +1 -2
- package/dist/better-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.tsx +1 -1
- package/dist/better-auth/admin/generators/admin-crud-roles-column/admin-crud-roles-column.generator.d.ts +31 -0
- package/dist/better-auth/core/node.js +7 -8
- package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/index.d.ts +1 -0
- package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/ts-import-providers.d.ts +1 -0
- package/dist/better-auth/generators/fastify/better-auth-admin-module/generated/ts-import-providers.js +1 -0
- package/dist/better-auth/generators/fastify/better-auth-module/better-auth-module.generator.d.ts +20 -3
- package/dist/better-auth/generators/fastify/better-auth-module/better-auth-module.generator.js +5 -24
- package/dist/better-auth/generators/fastify/better-auth-module/generated/index.d.ts +40 -2
- package/dist/better-auth/generators/fastify/better-auth-module/generated/template-renderers.d.ts +19 -1
- package/dist/better-auth/generators/fastify/better-auth-module/generated/template-renderers.js +6 -2
- package/dist/better-auth/generators/fastify/better-auth-module/generated/ts-import-providers.d.ts +1 -0
- package/dist/better-auth/generators/fastify/better-auth-module/generated/ts-import-providers.js +1 -0
- package/dist/better-auth/generators/fastify/better-auth-module/generated/typed-templates.d.ts +20 -1
- package/dist/better-auth/generators/fastify/better-auth-module/generated/typed-templates.js +4 -1
- package/dist/better-auth/generators/fastify/better-auth-module/templates/module/services/auth.ts +16 -8
- package/dist/better-auth/generators/react/better-auth-hooks/better-auth-hooks.generator.d.ts +1 -1
- package/dist/better-auth/generators/react/better-auth-hooks/generated/index.d.ts +5 -4
- package/dist/better-auth/generators/react/better-auth-hooks/generated/template-paths.d.ts +1 -1
- package/dist/better-auth/generators/react/better-auth-hooks/generated/template-paths.js +1 -1
- package/dist/better-auth/generators/react/better-auth-hooks/generated/ts-import-providers.d.ts +2 -1
- package/dist/better-auth/generators/react/better-auth-hooks/generated/ts-import-providers.js +2 -1
- package/dist/better-auth/generators/react/better-auth-hooks/generated/typed-templates.d.ts +6 -6
- package/dist/better-auth/generators/react/better-auth-hooks/generated/typed-templates.js +13 -13
- 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
- package/dist/better-auth/generators/react/better-auth-pages/better-auth-pages.generator.d.ts +31 -0
- package/dist/better-auth/generators/react/better-auth-pages/generated/index.d.ts +186 -0
- package/dist/better-auth/generators/react/better-auth-pages/generated/template-renderers.d.ts +31 -0
- package/dist/better-auth/generators/react/better-auth-pages/generated/typed-templates.d.ts +310 -0
- package/dist/better-auth/generators/react/better-auth-pages/templates/routes/forgot-password.tsx +1 -4
- package/dist/better-auth/generators/react/react-better-auth/generated/index.d.ts +65 -2
- package/dist/better-auth/generators/react/react-better-auth/generated/template-renderers.d.ts +32 -1
- package/dist/better-auth/generators/react/react-better-auth/generated/ts-import-providers.d.ts +1 -0
- package/dist/better-auth/generators/react/react-better-auth/generated/ts-import-providers.js +1 -0
- package/dist/better-auth/generators/react/react-better-auth/generated/typed-templates.d.ts +32 -1
- package/dist/better-auth/generators/react/react-better-auth/react-better-auth.generator.d.ts +32 -1
- package/dist/better-auth/generators/react/react-better-auth/templates/src/app/auth-loaded-gate.tsx +12 -3
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/admin-crud-invite-user-action.generator.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/index.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/template-renderers.d.ts +31 -0
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/generated/typed-templates.d.ts +31 -0
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/templates/routes/-components/invite-user-dialog.js +1 -2
- package/dist/local-auth/admin/generators/admin-crud-invite-user-action/templates/routes/-components/invite-user-dialog.tsx +1 -1
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/admin-crud-manage-roles-action.generator.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/index.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/template-renderers.d.ts +31 -0
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/generated/typed-templates.d.ts +31 -0
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.js +1 -2
- package/dist/local-auth/admin/generators/admin-crud-manage-roles-action/templates/routes/-components/role-manager-dialog.tsx +1 -1
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/admin-crud-reset-password-action.generator.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/index.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/template-renderers.d.ts +31 -0
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/generated/typed-templates.d.ts +62 -0
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.js +1 -2
- package/dist/local-auth/admin/generators/admin-crud-reset-password-action/templates/routes/-components/password-reset-dialog.tsx +1 -1
- package/dist/local-auth/admin/generators/admin-crud-roles-column/admin-crud-roles-column.generator.d.ts +31 -0
- package/dist/local-auth/core/generators/auth-email-password/auth-email-password.generator.d.ts +10 -7
- package/dist/local-auth/core/generators/auth-email-password/auth-email-password.generator.js +8 -11
- package/dist/local-auth/core/generators/auth-email-password/generated/index.d.ts +40 -13
- package/dist/local-auth/core/generators/auth-email-password/generated/template-renderers.d.ts +9 -0
- package/dist/local-auth/core/generators/auth-email-password/generated/template-renderers.js +6 -5
- package/dist/local-auth/core/generators/auth-email-password/generated/ts-import-providers.d.ts +1 -3
- package/dist/local-auth/core/generators/auth-email-password/generated/ts-import-providers.js +1 -2
- package/dist/local-auth/core/generators/auth-email-password/generated/typed-templates.d.ts +40 -16
- package/dist/local-auth/core/generators/auth-email-password/generated/typed-templates.js +11 -8
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/email-verification.service.js +2 -3
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/email-verification.service.ts +5 -3
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/invite.service.js +17 -13
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/invite.service.ts +25 -13
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/password-reset.service.js +2 -3
- package/dist/local-auth/core/generators/auth-email-password/templates/module/services/password-reset.service.ts +5 -3
- package/dist/local-auth/core/generators/auth-hooks/auth-hooks.generator.d.ts +272 -1
- package/dist/local-auth/core/generators/auth-hooks/generated/index.d.ts +547 -4
- package/dist/local-auth/core/generators/auth-hooks/generated/template-paths.d.ts +1 -1
- package/dist/local-auth/core/generators/auth-hooks/generated/template-paths.js +1 -1
- package/dist/local-auth/core/generators/auth-hooks/generated/template-renderers.d.ts +271 -0
- package/dist/local-auth/core/generators/auth-hooks/generated/template-renderers.js +4 -2
- package/dist/local-auth/core/generators/auth-hooks/generated/ts-import-providers.d.ts +2 -1
- package/dist/local-auth/core/generators/auth-hooks/generated/ts-import-providers.js +2 -1
- package/dist/local-auth/core/generators/auth-hooks/generated/typed-templates.d.ts +548 -6
- package/dist/local-auth/core/generators/auth-hooks/generated/typed-templates.js +15 -14
- package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-log-out.js +1 -1
- package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-log-out.ts +1 -1
- package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-session.d.ts +7 -0
- package/dist/local-auth/core/generators/auth-hooks/templates/src/hooks/use-session.ts +7 -0
- package/dist/local-auth/core/generators/auth-module/auth-module.generator.d.ts +19 -7
- package/dist/local-auth/core/generators/auth-module/auth-module.generator.js +3 -26
- package/dist/local-auth/core/generators/auth-module/generated/index.d.ts +48 -7
- package/dist/local-auth/core/generators/auth-module/generated/template-paths.d.ts +0 -1
- package/dist/local-auth/core/generators/auth-module/generated/template-paths.js +0 -1
- package/dist/local-auth/core/generators/auth-module/generated/template-renderers.d.ts +19 -1
- package/dist/local-auth/core/generators/auth-module/generated/template-renderers.js +7 -3
- package/dist/local-auth/core/generators/auth-module/generated/ts-import-providers.d.ts +1 -0
- package/dist/local-auth/core/generators/auth-module/generated/ts-import-providers.js +1 -0
- package/dist/local-auth/core/generators/auth-module/generated/typed-templates.d.ts +28 -7
- package/dist/local-auth/core/generators/auth-module/generated/typed-templates.js +5 -14
- package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.d.ts +7 -6
- package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.js +23 -17
- package/dist/local-auth/core/generators/auth-module/templates/module/services/code-verification.service.ts +25 -18
- package/dist/local-auth/core/generators/auth-module/templates/module/services/user-session.service.js +8 -9
- package/dist/local-auth/core/generators/auth-module/templates/module/services/user-session.service.ts +10 -11
- package/dist/local-auth/core/generators/auth-routes/auth-routes.generator.d.ts +31 -0
- package/dist/local-auth/core/generators/auth-routes/generated/index.d.ts +249 -0
- package/dist/local-auth/core/generators/auth-routes/generated/template-renderers.d.ts +31 -0
- package/dist/local-auth/core/generators/auth-routes/generated/ts-import-providers.d.ts +1 -0
- package/dist/local-auth/core/generators/auth-routes/generated/ts-import-providers.js +1 -0
- package/dist/local-auth/core/generators/auth-routes/generated/typed-templates.d.ts +310 -0
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/accept-invite.js +12 -5
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/accept-invite.tsx +14 -4
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/forgot-password.js +1 -2
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/forgot-password.tsx +1 -1
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login-otp.js +4 -4
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login-otp.tsx +4 -3
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login.js +4 -4
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/login.tsx +4 -3
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/register.js +4 -4
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/register.tsx +4 -3
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/reset-password.js +1 -2
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/reset-password.tsx +1 -1
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/verify-email.js +1 -2
- package/dist/local-auth/core/generators/auth-routes/templates/routes/auth_/verify-email.tsx +1 -1
- package/dist/local-auth/core/generators/react-session/generated/index.d.ts +78 -7
- package/dist/local-auth/core/generators/react-session/generated/template-renderers.d.ts +32 -1
- package/dist/local-auth/core/generators/react-session/generated/ts-import-providers.d.ts +1 -0
- package/dist/local-auth/core/generators/react-session/generated/ts-import-providers.js +1 -0
- package/dist/local-auth/core/generators/react-session/generated/typed-templates.d.ts +90 -12
- package/dist/local-auth/core/generators/react-session/generated/typed-templates.js +5 -2
- package/dist/local-auth/core/generators/react-session/react-session.generator.d.ts +48 -1
- package/dist/local-auth/core/generators/react-session/react-session.generator.js +35 -1
- package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.js +17 -44
- package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.tsx +21 -49
- package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.d.ts +43 -34
- package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.js +96 -80
- package/dist/local-auth/core/generators/react-session/templates/src/services/user-session-client.ts +148 -82
- package/dist/local-auth/core/generators/seed-initial-user/generated/index.d.ts +0 -2
- package/dist/local-auth/core/generators/seed-initial-user/generated/template-renderers.d.ts +0 -1
- package/dist/local-auth/core/generators/seed-initial-user/generated/typed-templates.d.ts +0 -1
- package/dist/local-auth/core/generators/seed-initial-user/seed-initial-user.generator.d.ts +0 -1
- package/dist/local-auth/core/node.js +7 -7
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/index.d.ts +4 -3
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/template-paths.d.ts +1 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/template-paths.js +1 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/ts-import-providers.d.ts +2 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/ts-import-providers.js +2 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/typed-templates.d.ts +4 -4
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/generated/typed-templates.js +13 -13
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/placeholder-auth-hooks.generator.d.ts +1 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/templates/src/hooks/use-session.d.ts +1 -0
- package/dist/placeholder-auth/core/generators/placeholder-auth-hooks/templates/src/hooks/use-session.ts +2 -0
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/index.d.ts +1 -2
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/template-renderers.d.ts +0 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/ts-import-providers.d.ts +1 -0
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/ts-import-providers.js +1 -0
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/generated/typed-templates.d.ts +0 -1
- package/dist/placeholder-auth/core/generators/placeholder-auth-module/placeholder-auth-module.generator.d.ts +0 -1
- 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
- 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
- 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
- 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
- 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
- package/dist/web/assets/auth-DR6QxrAW.js +1 -0
- package/dist/web/assets/{common-CoLuMS7U.js → common-BsyRiQi3.js} +6 -6
- package/dist/web/assets/{common-N3skPbzk.js → common-CRwNlCMn.js} +10 -10
- package/dist/web/assets/{common-Co5lW_TK.js → common-CvqlRZC9.js} +12 -12
- package/dist/web/assets/{common-C8_sC5pp.js → common-D3atSs7O.js} +15 -15
- package/dist/web/assets/common-DuFyXa6l.js +36 -0
- package/dist/web/assets/common-islduJTj.js +43 -0
- package/dist/web/assets/{get-auth-plugin-definition-DyokUVjX.js → get-auth-plugin-definition-BgWWHl_Y.js} +3 -3
- package/dist/web/assets/{hostInit-BCYmw0H5.js → hostInit-DNA4kLRY.js} +1 -1
- package/dist/web/assets/{mf-entry-bootstrap-0-3ede9334.js → mf-entry-bootstrap-0-ea77c09b.js} +1 -1
- package/dist/web/assets/{mf-entry-bootstrap-1-3da85eea.js → mf-entry-bootstrap-1-9dee3d8d.js} +2 -2
- package/dist/web/assets/{mf-entry-bootstrap-2-32e24e11.js → mf-entry-bootstrap-2-3179040b.js} +1 -1
- package/dist/web/assets/{mf-entry-bootstrap-3-a3cfea9d.js → mf-entry-bootstrap-3-370d200d.js} +2 -2
- package/dist/web/assets/{models-BcPOQC5p.js → models-BOeSYfRn.js} +4 -4
- package/dist/web/assets/{models-BcUgOGGn.js → models-DF6DoXt6.js} +4 -4
- package/dist/web/assets/{plugin-definition-D1EImXIf.js → plugin-definition--k0VAeK3.js} +9 -9
- package/dist/web/assets/{plugin-definition-lw-gB4hU.js → plugin-definition-CMwSlxsJ.js} +3 -3
- package/dist/web/assets/{styles-EOyEbGA4.js → styles-BQEcQHoR.js} +8 -8
- package/dist/web/assets/{virtualExposes-DWORnjyA.js → virtualExposes-C7fDiAmS.js} +1 -1
- 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
- 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
- package/dist/web/assets/{web-kaD9AzNS.js → web-8wz0ad-V.js} +8 -8
- package/dist/web/assets/{web-EDeSquSP.js → web-BGixH_gT.js} +19 -19
- package/dist/web/assets/{web-PqAcfBSy.js → web-BxIwkN3O.js} +7 -7
- package/dist/web/assets/{web-CBVepebK.js → web-CQMfABjr.js} +19 -19
- package/dist/web/assets/{web-RhChfBw_.js → web-CcNpItSu.js} +17 -17
- package/dist/web/assets/{web-xJ-GnSkC.js → web-CypPeiVv.js} +25 -25
- package/dist/web/assets/{web-Dgb85jhs.js → web-CzK_la2_.js} +41 -41
- package/dist/web/index.html +4 -4
- package/dist/web/remoteEntry.js +1 -1
- package/package.json +12 -12
- package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.d.ts +0 -38
- package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.js +0 -71
- package/dist/local-auth/core/generators/auth-module/templates/module/utils/cookie-signer.ts +0 -77
- package/dist/web/assets/auth-CsHp2bQi.js +0 -1
- package/dist/web/assets/common-BGTuTgx7.js +0 -43
- 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: {
|
|
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,
|
package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.js
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
}
|
package/dist/local-auth/core/generators/react-session/templates/src/app/user-session-provider.tsx
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
4
|
+
* Callback function for session change events
|
|
3
5
|
*/
|
|
4
|
-
type
|
|
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
|
-
*
|
|
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
|
-
|
|
14
|
+
getSession: () => SessionData | undefined;
|
|
24
15
|
/**
|
|
25
|
-
* Subscribe to
|
|
26
|
-
* @param callback - Function to call when
|
|
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
|
-
|
|
20
|
+
subscribe: (callback: SessionChangeCallback) => () => void;
|
|
30
21
|
/**
|
|
31
|
-
*
|
|
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
|
-
|
|
26
|
+
signIn: (userId: string, roles: AuthRole[]) => void;
|
|
34
27
|
/**
|
|
35
|
-
*
|
|
36
|
-
* @returns User ID or null if not authenticated
|
|
28
|
+
* Sign out the current user
|
|
37
29
|
*/
|
|
38
|
-
|
|
30
|
+
signOut: () => void;
|
|
39
31
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
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
|
-
|
|
36
|
+
setServerSession: (session: {
|
|
37
|
+
userId: string;
|
|
38
|
+
roles: AuthRole[];
|
|
39
|
+
} | undefined) => void;
|
|
44
40
|
/**
|
|
45
|
-
*
|
|
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
|
-
|
|
44
|
+
getPersistedUserId: () => string | undefined;
|
|
48
45
|
/**
|
|
49
|
-
*
|
|
46
|
+
* Clean up resources when the client is no longer needed
|
|
50
47
|
*/
|
|
51
|
-
|
|
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
|
*/
|