@nextsparkjs/core 0.1.0-beta.185 → 0.1.0-beta.187
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/dist/components/app/guards/DeveloperGuard.d.ts.map +1 -1
- package/dist/components/app/guards/DeveloperGuard.js +8 -4
- package/dist/components/app/guards/SuperAdminGuard.d.ts.map +1 -1
- package/dist/components/app/guards/SuperAdminGuard.js +8 -4
- package/dist/components/app/layouts/PublicFooter.d.ts.map +1 -1
- package/dist/components/app/layouts/PublicFooter.js +2 -2
- package/dist/components/app/layouts/PublicNavbar.d.ts.map +1 -1
- package/dist/components/app/layouts/PublicNavbar.js +2 -2
- package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
- package/dist/components/app/misc/ThemeToggle.js +4 -1
- package/dist/components/auth/DevKeyring.d.ts.map +1 -1
- package/dist/components/auth/DevKeyring.js +10 -2
- package/dist/components/auth/SessionCookieRefresher.d.ts +21 -0
- package/dist/components/auth/SessionCookieRefresher.d.ts.map +1 -0
- package/dist/components/auth/SessionCookieRefresher.js +11 -0
- package/dist/components/auth/forms/LoginForm.d.ts.map +1 -1
- package/dist/components/auth/forms/LoginForm.js +300 -6
- package/dist/components/auth/index.d.ts +1 -0
- package/dist/components/auth/index.d.ts.map +1 -1
- package/dist/components/auth/index.js +2 -0
- package/dist/components/billing/InvoicesTable.d.ts.map +1 -1
- package/dist/components/billing/InvoicesTable.js +4 -3
- package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/AuthGuard.js +2 -2
- package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/DashboardAuthLayout.js +2 -2
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +17 -0
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts.map +1 -0
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.js +52 -0
- package/dist/components/dashboard/layouts/Sidebar.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/Sidebar.js +2 -3
- package/dist/components/dashboard/layouts/TopNavbar.js +2 -2
- package/dist/components/dashboard/layouts/index.d.ts +1 -0
- package/dist/components/dashboard/layouts/index.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/index.js +2 -0
- package/dist/components/devtools/api-explorer/ApiExplorer.js +4 -4
- package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
- package/dist/components/entities/EntityFieldRenderer.js +3 -0
- package/dist/components/entities/EntityTable.d.ts.map +1 -1
- package/dist/components/entities/EntityTable.js +2 -1
- package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityFormWrapper.js +7 -2
- package/dist/components/patterns/pages/PatternEditPage.d.ts +5 -1
- package/dist/components/patterns/pages/PatternEditPage.d.ts.map +1 -1
- package/dist/components/patterns/pages/PatternEditPage.js +16 -5
- package/dist/components/patterns/pages/PatternsCreatePage.d.ts +2 -1
- package/dist/components/patterns/pages/PatternsCreatePage.d.ts.map +1 -1
- package/dist/components/patterns/pages/PatternsCreatePage.js +17 -5
- package/dist/components/ui/combobox.d.ts +8 -1
- package/dist/components/ui/combobox.d.ts.map +1 -1
- package/dist/components/ui/combobox.js +37 -44
- package/dist/components/ui/country-select.d.ts +3 -1
- package/dist/components/ui/country-select.d.ts.map +1 -1
- package/dist/components/ui/country-select.js +3 -1
- package/dist/components/ui/currency-select.d.ts +3 -1
- package/dist/components/ui/currency-select.d.ts.map +1 -1
- package/dist/components/ui/currency-select.js +3 -1
- package/dist/components/ui/sheet.d.ts +5 -0
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet.js +46 -26
- package/dist/components/ui/timezone-select.d.ts +3 -1
- package/dist/components/ui/timezone-select.d.ts.map +1 -1
- package/dist/components/ui/timezone-select.js +3 -1
- package/dist/contexts/TeamContext.d.ts +6 -0
- package/dist/contexts/TeamContext.d.ts.map +1 -1
- package/dist/contexts/TeamContext.js +8 -1
- package/dist/emails/otp-verification.d.ts.map +1 -1
- package/dist/emails/reset-password.d.ts.map +1 -1
- package/dist/emails/team-invitation.d.ts.map +1 -1
- package/dist/emails/team-invitation.js +3 -2
- package/dist/emails/verify-email.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAuth.d.ts +29 -0
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +24 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts +22 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
- package/dist/hooks/useEnsureUserMetadata.js +18 -5
- package/dist/hooks/useSessionCookieRefresh.d.ts +35 -0
- package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -0
- package/dist/hooks/useSessionCookieRefresh.js +49 -0
- package/dist/lib/api/api-error.d.ts +3 -1
- package/dist/lib/api/api-error.d.ts.map +1 -1
- package/dist/lib/api/api-error.js +4 -2
- package/dist/lib/api/auth/dual-auth.d.ts +38 -3
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +42 -7
- package/dist/lib/api/auth/permissions.d.ts +7 -2
- package/dist/lib/api/auth/permissions.d.ts.map +1 -1
- package/dist/lib/api/auth/permissions.js +2 -2
- package/dist/lib/api/auth/scope-policy.d.ts +71 -0
- package/dist/lib/api/auth/scope-policy.d.ts.map +1 -0
- package/dist/lib/api/auth/scope-policy.js +53 -0
- package/dist/lib/api/auth.d.ts +15 -0
- package/dist/lib/api/auth.d.ts.map +1 -1
- package/dist/lib/api/auth.js +17 -4
- package/dist/lib/api/entities.js +2 -1
- package/dist/lib/api/entity/audit-log.d.ts +35 -0
- package/dist/lib/api/entity/audit-log.d.ts.map +1 -0
- package/dist/lib/api/entity/audit-log.js +35 -0
- package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
- package/dist/lib/api/entity/generic-handler.js +333 -138
- package/dist/lib/api/entity-handler.js +2 -2
- package/dist/lib/api/helpers.d.ts +29 -4
- package/dist/lib/api/helpers.d.ts.map +1 -1
- package/dist/lib/api/helpers.js +30 -6
- package/dist/lib/api/keys.d.ts +16 -0
- package/dist/lib/api/keys.d.ts.map +1 -1
- package/dist/lib/api/keys.js +19 -1
- package/dist/lib/api/routes/patterns-usages.d.ts.map +1 -1
- package/dist/lib/api/routes/patterns-usages.js +3 -11
- package/dist/lib/auth/auth-methods.d.ts +52 -0
- package/dist/lib/auth/auth-methods.d.ts.map +1 -0
- package/dist/lib/auth/auth-methods.js +63 -0
- package/dist/lib/auth/registration-guard-plugin.d.ts.map +1 -1
- package/dist/lib/auth/registration-helpers.d.ts +9 -0
- package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
- package/dist/lib/auth/registration-helpers.js +8 -2
- package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +52 -0
- package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/device-fingerprint.js +42 -0
- package/dist/lib/auth/security-notifications/dispatcher.d.ts +37 -0
- package/dist/lib/auth/security-notifications/dispatcher.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/dispatcher.js +157 -0
- package/dist/lib/auth/security-notifications/index.d.ts +20 -0
- package/dist/lib/auth/security-notifications/index.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/index.js +22 -0
- package/dist/lib/auth/security-notifications/registry.d.ts +36 -0
- package/dist/lib/auth/security-notifications/registry.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/registry.js +26 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.d.ts +12 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.js +43 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts +7 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.js +46 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.d.ts +7 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.js +35 -0
- package/dist/lib/auth/security-notifications/templates/shared.d.ts +36 -0
- package/dist/lib/auth/security-notifications/templates/shared.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/shared.js +68 -0
- package/dist/lib/auth/security-notifications/types.d.ts +74 -0
- package/dist/lib/auth/security-notifications/types.d.ts.map +1 -0
- package/dist/lib/auth/session-config.d.ts +37 -0
- package/dist/lib/auth/session-config.d.ts.map +1 -0
- package/dist/lib/auth/session-config.js +59 -0
- package/dist/lib/auth/session-refresh.d.ts +46 -0
- package/dist/lib/auth/session-refresh.d.ts.map +1 -0
- package/dist/lib/auth/session-refresh.js +11 -0
- package/dist/lib/auth-client.d.ts +1639 -0
- package/dist/lib/auth-client.d.ts.map +1 -0
- package/dist/lib/auth-client.js +13 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +45 -11
- package/dist/lib/billing/gateways/factory.d.ts +8 -3
- package/dist/lib/billing/gateways/factory.d.ts.map +1 -1
- package/dist/lib/billing/gateways/factory.js +37 -23
- package/dist/lib/billing/stripe-webhook.d.ts.map +1 -1
- package/dist/lib/billing/stripe-webhook.js +2 -1
- package/dist/lib/config/app.config.d.ts.map +1 -1
- package/dist/lib/config/app.config.js +71 -0
- package/dist/lib/config/config-sync.d.ts +1 -4
- package/dist/lib/config/config-sync.d.ts.map +1 -1
- package/dist/lib/config/config-sync.js +6 -2
- package/dist/lib/config/types.d.ts +130 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/email/templates.d.ts +3 -3
- package/dist/lib/email/templates.d.ts.map +1 -1
- package/dist/lib/entities/api-generator.js +5 -5
- package/dist/lib/entities/entity-hooks.d.ts +9 -1
- package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
- package/dist/lib/entities/entity-hooks.js +77 -4
- package/dist/lib/entities/schema-generator.d.ts.map +1 -1
- package/dist/lib/entities/schema-generator.js +20 -4
- package/dist/lib/entities/serialization.d.ts +2 -2
- package/dist/lib/entities/serialization.d.ts.map +1 -1
- package/dist/lib/entities/serialization.js +3 -2
- package/dist/lib/entities/types.d.ts +20 -0
- package/dist/lib/entities/types.d.ts.map +1 -1
- package/dist/lib/locale.d.ts.map +1 -1
- package/dist/lib/locale.js +4 -1
- package/dist/lib/mcp/audit.d.ts +8 -4
- package/dist/lib/mcp/audit.d.ts.map +1 -1
- package/dist/lib/plugins/hook-system.d.ts +13 -0
- package/dist/lib/plugins/hook-system.d.ts.map +1 -1
- package/dist/lib/plugins/hook-system.js +32 -2
- package/dist/lib/scheduled-actions/handlers/index.d.ts +1 -0
- package/dist/lib/scheduled-actions/handlers/index.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/handlers/index.js +3 -1
- package/dist/lib/scheduled-actions/handlers/security-notification.d.ts +26 -0
- package/dist/lib/scheduled-actions/handlers/security-notification.d.ts.map +1 -0
- package/dist/lib/scheduled-actions/handlers/security-notification.js +54 -0
- package/dist/lib/selectors/core-selectors.d.ts +12 -0
- package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/auth.selectors.d.ts +12 -0
- package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/auth.selectors.js +14 -1
- package/dist/lib/selectors/selectors.d.ts +24 -0
- package/dist/lib/selectors/selectors.d.ts.map +1 -1
- package/dist/lib/services/api-docs.service.d.ts +5 -1
- package/dist/lib/services/api-docs.service.d.ts.map +1 -1
- package/dist/lib/services/api-presets.service.d.ts +6 -1
- package/dist/lib/services/api-presets.service.d.ts.map +1 -1
- package/dist/lib/services/feature.service.d.ts +58 -4
- package/dist/lib/services/feature.service.d.ts.map +1 -1
- package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
- package/dist/lib/services/generic-entity.service.js +16 -32
- package/dist/lib/services/membership.service.d.ts +10 -2
- package/dist/lib/services/membership.service.d.ts.map +1 -1
- package/dist/lib/services/membership.service.js +37 -16
- package/dist/lib/services/permission.service.d.ts +10 -4
- package/dist/lib/services/permission.service.d.ts.map +1 -1
- package/dist/lib/services/plugin.service.d.ts +1 -1
- package/dist/lib/services/plugin.service.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.js +2 -1
- package/dist/lib/services/team-member.service.d.ts +15 -3
- package/dist/lib/services/team-member.service.d.ts.map +1 -1
- package/dist/lib/services/team-member.service.js +27 -6
- package/dist/lib/services/team.service.d.ts.map +1 -1
- package/dist/lib/teams/permissions.d.ts +3 -1
- package/dist/lib/teams/permissions.d.ts.map +1 -1
- package/dist/lib/teams/permissions.js +6 -0
- package/dist/lib/teams/schema.d.ts.map +1 -1
- package/dist/lib/teams/schema.js +3 -0
- package/dist/lib/template-resolver.d.ts +3 -3
- package/dist/lib/theme/forced-theme.d.ts +34 -0
- package/dist/lib/theme/forced-theme.d.ts.map +1 -0
- package/dist/lib/theme/forced-theme.js +27 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts +3 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
- package/dist/lib/theme/get-default-theme-mode.js +5 -3
- package/dist/lib/utils/cors.d.ts +13 -0
- package/dist/lib/utils/cors.d.ts.map +1 -1
- package/dist/lib/utils/cors.js +20 -0
- package/dist/messages/de/auth.json +25 -2
- package/dist/messages/de/index.d.ts +83 -0
- package/dist/messages/de/index.d.ts.map +1 -1
- package/dist/messages/de/index.js +2 -0
- package/dist/messages/de/index.ts +2 -0
- package/dist/messages/de/navigation.json +3 -1
- package/dist/messages/en/auth.json +25 -2
- package/dist/messages/en/index.d.ts +83 -0
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/en/index.js +2 -0
- package/dist/messages/en/index.ts +2 -0
- package/dist/messages/en/navigation.json +3 -1
- package/dist/messages/es/auth.json +25 -2
- package/dist/messages/es/index.d.ts +83 -0
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/es/index.js +2 -0
- package/dist/messages/es/index.ts +2 -0
- package/dist/messages/es/navigation.json +3 -1
- package/dist/messages/fr/auth.json +25 -2
- package/dist/messages/fr/index.d.ts +83 -0
- package/dist/messages/fr/index.d.ts.map +1 -1
- package/dist/messages/fr/index.js +2 -0
- package/dist/messages/fr/index.ts +2 -0
- package/dist/messages/fr/navigation.json +3 -1
- package/dist/messages/it/auth.json +25 -2
- package/dist/messages/it/index.d.ts +83 -0
- package/dist/messages/it/index.d.ts.map +1 -1
- package/dist/messages/it/index.js +2 -0
- package/dist/messages/it/index.ts +2 -0
- package/dist/messages/it/navigation.json +3 -1
- package/dist/messages/pt/auth.json +25 -2
- package/dist/messages/pt/index.d.ts +83 -0
- package/dist/messages/pt/index.d.ts.map +1 -1
- package/dist/messages/pt/index.js +2 -0
- package/dist/messages/pt/index.ts +2 -0
- package/dist/messages/pt/navigation.json +3 -1
- package/dist/migrations/005_api_audit_log.sql +2 -1
- package/dist/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
- package/dist/migrations/026_login_events.sql +91 -0
- package/dist/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
- package/dist/nextspark-registries.d.ts +580 -236
- package/dist/providers/DashboardProviders.d.ts +12 -3
- package/dist/providers/DashboardProviders.d.ts.map +1 -1
- package/dist/providers/DashboardProviders.js +6 -2
- package/dist/providers/theme-provider.d.ts +19 -2
- package/dist/providers/theme-provider.d.ts.map +1 -1
- package/dist/providers/theme-provider.js +6 -2
- package/dist/templates/app/(auth)/signup/page.tsx +8 -0
- package/dist/templates/app/(public)/[...slug]/page.tsx +9 -14
- package/dist/templates/app/api/auth/[...all]/route.ts +23 -1
- package/dist/templates/app/api/health/route.ts +4 -2
- package/dist/templates/app/api/internal/user-metadata/route.ts +5 -3
- package/dist/templates/app/api/mcp/route.ts +4 -1
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +2 -1
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
- package/dist/templates/app/api/v1/api-keys/route.ts +21 -43
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
- package/dist/templates/app/api/v1/billing/cancel/route.ts +7 -6
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +5 -4
- package/dist/templates/app/api/v1/billing/check-action/route.ts +6 -4
- package/dist/templates/app/api/v1/billing/checkout/route.ts +7 -5
- package/dist/templates/app/api/v1/billing/plans/route.ts +8 -12
- package/dist/templates/app/api/v1/billing/portal/route.ts +7 -5
- package/dist/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/features/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/flows/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
- package/dist/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/testing/route.ts +5 -4
- package/dist/templates/app/api/v1/media/[id]/route.ts +13 -25
- package/dist/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
- package/dist/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
- package/dist/templates/app/api/v1/media/route.ts +5 -9
- package/dist/templates/app/api/v1/media/upload/route.ts +9 -21
- package/dist/templates/app/api/v1/media-tags/route.ts +9 -13
- package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
- package/dist/templates/app/api/v1/post-categories/route.ts +5 -4
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
- package/dist/templates/app/api/v1/team-invitations/route.ts +9 -11
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
- package/dist/templates/app/api/v1/teams/route.ts +33 -27
- package/dist/templates/app/api/v1/teams/switch/route.ts +11 -13
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +23 -2
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
- package/dist/templates/app/api/v1/users/[id]/route.ts +35 -68
- package/dist/templates/app/api/v1/users/route.ts +21 -25
- package/dist/templates/app/dashboard/layout.tsx +2 -6
- package/dist/templates/app/layout.ppr.tsx +15 -15
- package/dist/templates/app/layout.tsx +46 -20
- package/dist/templates/contents/themes/starter/config/app.config.ts +19 -0
- package/dist/templates/contents/themes/starter/config/theme.config.ts +6 -0
- package/dist/templates/contents/themes/starter/styles/globals.css +6 -2
- package/dist/templates/proxy.ts +46 -10
- package/dist/templates/tsconfig.json +4 -0
- package/dist/types/theme.d.ts +9 -0
- package/dist/types/theme.d.ts.map +1 -1
- package/migrations/005_api_audit_log.sql +2 -1
- package/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
- package/migrations/026_login_events.sql +91 -0
- package/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
- package/package.json +14 -11
- package/scripts/build/registry/__tests__/scope-registry.test.mjs +18 -0
- package/scripts/build/registry/generators/scope-registry.mjs +9 -2
- package/templates/app/(auth)/signup/page.tsx +8 -0
- package/templates/app/(public)/[...slug]/page.tsx +9 -14
- package/templates/app/api/auth/[...all]/route.ts +23 -1
- package/templates/app/api/health/route.ts +4 -2
- package/templates/app/api/internal/user-metadata/route.ts +5 -3
- package/templates/app/api/mcp/route.ts +4 -1
- package/templates/app/api/superadmin/subscriptions/route.ts +2 -1
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
- package/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
- package/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
- package/templates/app/api/v1/api-keys/route.ts +21 -43
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
- package/templates/app/api/v1/billing/cancel/route.ts +7 -6
- package/templates/app/api/v1/billing/change-plan/route.ts +5 -4
- package/templates/app/api/v1/billing/check-action/route.ts +6 -4
- package/templates/app/api/v1/billing/checkout/route.ts +7 -5
- package/templates/app/api/v1/billing/plans/route.ts +8 -12
- package/templates/app/api/v1/billing/portal/route.ts +7 -5
- package/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
- package/templates/app/api/v1/devtools/blocks/route.ts +5 -4
- package/templates/app/api/v1/devtools/features/route.ts +5 -4
- package/templates/app/api/v1/devtools/flows/route.ts +5 -4
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
- package/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
- package/templates/app/api/v1/devtools/testing/route.ts +5 -4
- package/templates/app/api/v1/media/[id]/route.ts +13 -25
- package/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
- package/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
- package/templates/app/api/v1/media/route.ts +5 -9
- package/templates/app/api/v1/media/upload/route.ts +9 -21
- package/templates/app/api/v1/media-tags/route.ts +9 -13
- package/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
- package/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
- package/templates/app/api/v1/post-categories/route.ts +5 -4
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
- package/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
- package/templates/app/api/v1/team-invitations/route.ts +9 -11
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
- package/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
- package/templates/app/api/v1/teams/route.ts +33 -27
- package/templates/app/api/v1/teams/switch/route.ts +11 -13
- package/templates/app/api/v1/theme/[...path]/route.ts +23 -2
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
- package/templates/app/api/v1/users/[id]/route.ts +35 -68
- package/templates/app/api/v1/users/route.ts +21 -25
- package/templates/app/dashboard/layout.tsx +2 -6
- package/templates/app/layout.ppr.tsx +15 -15
- package/templates/app/layout.tsx +46 -20
- package/templates/contents/themes/starter/config/app.config.ts +19 -0
- package/templates/contents/themes/starter/config/theme.config.ts +6 -0
- package/templates/contents/themes/starter/styles/globals.css +6 -2
- package/templates/proxy.ts +46 -10
- package/templates/tsconfig.json +4 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +23 -0
- package/tests/jest/__mocks__/next-server.js +24 -0
- package/dist/components/teams/TeamSwitchModal.d.js +0 -0
- package/dist/components/ui/accordion.d.js +0 -0
- package/dist/components/ui/avatar.d.js +0 -0
- package/dist/components/ui/badge.d.js +0 -0
- package/dist/components/ui/button.d.js +0 -0
- package/dist/components/ui/card.d.js +0 -0
- package/dist/components/ui/dialog.d.js +0 -0
- package/dist/components/ui/dropdown-menu.d.js +0 -0
- package/dist/components/ui/input.d.js +0 -0
- package/dist/components/ui/progress.d.js +0 -0
- package/dist/components/ui/scroll-area.d.js +0 -0
- package/dist/components/ui/select.d.js +0 -0
- package/dist/components/ui/separator.d.js +0 -0
- package/dist/components/ui/table.d.js +0 -0
- package/dist/components/ui/textarea.d.js +0 -0
- package/dist/contexts/TeamContext.d.js +0 -0
- package/dist/hooks/useAuth.d.js +0 -0
- package/dist/hooks/useLastAuthMethod.d.js +0 -0
- package/dist/hooks/useOrigin.d.js +0 -0
- package/dist/lib/api/auth/dual-auth.d.js +0 -0
- package/dist/lib/api/auth.d.js +0 -0
- package/dist/lib/api/cache.d.js +0 -0
- package/dist/lib/api/keys.d.js +0 -0
- package/dist/lib/auth-client.d.js +0 -0
- package/dist/lib/auth-context.d.js +0 -0
- package/dist/lib/auth.d.js +0 -0
- package/dist/lib/billing/config-types.d.js +0 -0
- package/dist/lib/billing/enforcement.d.js +0 -0
- package/dist/lib/billing/helpers.d.js +0 -0
- package/dist/lib/billing/jobs.d.js +0 -0
- package/dist/lib/billing/types.d.js +0 -0
- package/dist/lib/blocks/loader.d.js +0 -0
- package/dist/lib/config/app.config.d.js +0 -0
- package/dist/lib/config/config-loader.d.js +0 -0
- package/dist/lib/config/config-sync.d.js +0 -0
- package/dist/lib/config/config-types.d.js +0 -0
- package/dist/lib/config/config-utils.d.js +0 -0
- package/dist/lib/config/dashboard-types.d.js +0 -0
- package/dist/lib/config/dashboard.config.d.js +0 -0
- package/dist/lib/config/icon-map.d.js +0 -0
- package/dist/lib/config/index.d.js +0 -7
- package/dist/lib/config/nextspark-types.d.js +0 -0
- package/dist/lib/config/roles-merge.d.js +0 -0
- package/dist/lib/config/types.d.js +0 -0
- package/dist/lib/db.d.js +0 -0
- package/dist/lib/email/factory.d.js +0 -0
- package/dist/lib/email/index.d.js +0 -3
- package/dist/lib/email/providers/console.d.js +0 -0
- package/dist/lib/email/providers/resend.d.js +0 -0
- package/dist/lib/email/templates.d.js +0 -0
- package/dist/lib/email/types.d.js +0 -0
- package/dist/lib/entities/types.d.js +0 -0
- package/dist/lib/permissions/system.d.js +0 -0
- package/dist/lib/permissions/types.d.js +0 -0
- package/dist/lib/plugins/hook-system.d.js +0 -0
- package/dist/lib/scheduled-actions/cleanup.d.js +0 -0
- package/dist/lib/scheduled-actions/index.d.js +0 -19
- package/dist/lib/scheduled-actions/initializer.d.js +0 -1
- package/dist/lib/scheduled-actions/processor.d.js +0 -0
- package/dist/lib/scheduled-actions/registry.d.js +0 -0
- package/dist/lib/scheduled-actions/scheduler.d.js +0 -0
- package/dist/lib/scheduled-actions/types.d.js +0 -0
- package/dist/lib/services/api-routes.service.d.js +0 -0
- package/dist/lib/services/entity-type.service.d.js +0 -0
- package/dist/lib/services/index.d.js +0 -40
- package/dist/lib/services/invoice.service.d.js +0 -0
- package/dist/lib/services/membership.service.d.js +0 -0
- package/dist/lib/services/meta.service.d.js +0 -0
- package/dist/lib/services/middleware.service.d.js +0 -0
- package/dist/lib/services/namespace.service.d.js +0 -0
- package/dist/lib/services/permission.service.d.js +0 -0
- package/dist/lib/services/plan.service.d.js +0 -0
- package/dist/lib/services/plugin.service.d.js +0 -0
- package/dist/lib/services/route-handler.service.d.js +0 -0
- package/dist/lib/services/scope.service.d.js +0 -0
- package/dist/lib/services/subscription.service.d.js +0 -0
- package/dist/lib/services/team-member.service.d.js +0 -0
- package/dist/lib/services/team.service.d.js +0 -0
- package/dist/lib/services/theme.service.d.js +0 -0
- package/dist/lib/services/usage.service.d.js +0 -0
- package/dist/lib/services/user-flags.service.d.js +0 -0
- package/dist/lib/services/user.service.d.js +0 -0
- package/dist/lib/teams/helpers.d.js +0 -0
- package/dist/lib/teams/permissions.d.js +0 -0
- package/dist/lib/teams/types.d.js +0 -0
- package/dist/lib/utils/config-merge.d.js +0 -0
- package/dist/lib/utils/file-logger.d.js +0 -0
- package/dist/lib/utils.d.js +0 -0
- package/dist/styles/classes.json +0 -1093
- package/dist/styles/ui.css +0 -2
- package/dist/types/auth.d.js +0 -0
- package/dist/types/blocks.d.js +0 -0
- package/dist/types/meta.types.d.js +0 -0
- package/dist/types/plugin.d.js +0 -0
- package/dist/types/testing.types.d.js +0 -0
- package/dist/types/theme.d.js +0 -0
- package/dist/types/user.types.d.js +0 -0
- package/scripts/build/build-ui-css.mjs +0 -351
- /package/dist/{components/app/layouts/PublicFooter.d.js → lib/auth/security-notifications/types.js} +0 -0
- /package/dist/{components/app/layouts/PublicNavbar.d.js → nextspark-registries.d.js} +0 -0
- /package/dist/{components/app/misc/ThemeToggle.d.js → types/use-intl-react-shim.d.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAgHzE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useSession } from "../../../lib/auth-client.js";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
|
-
import { useEffect } from "react";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
6
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../../ui/card.js";
|
|
7
7
|
import { AlertTriangle, ArrowLeft } from "lucide-react";
|
|
8
8
|
import { Button } from "../../ui/button.js";
|
|
@@ -12,13 +12,17 @@ function DeveloperGuard({ children, fallback }) {
|
|
|
12
12
|
const { data: session, isPending } = useSession();
|
|
13
13
|
const router = useRouter();
|
|
14
14
|
const t = useTranslations();
|
|
15
|
+
const [mounted, setMounted] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setMounted(true);
|
|
18
|
+
}, []);
|
|
15
19
|
useEffect(() => {
|
|
16
20
|
var _a2;
|
|
17
|
-
if (!isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "developer") {
|
|
21
|
+
if (mounted && !isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "developer") {
|
|
18
22
|
router.push("/dashboard?error=access_denied");
|
|
19
23
|
}
|
|
20
|
-
}, [session, isPending, router]);
|
|
21
|
-
if (isPending) {
|
|
24
|
+
}, [mounted, session, isPending, router]);
|
|
25
|
+
if (!mounted || isPending) {
|
|
22
26
|
return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
|
|
23
27
|
/* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
|
|
24
28
|
/* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAyG3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useSession } from "../../../lib/auth-client.js";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
|
-
import { useEffect } from "react";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
6
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../../ui/card.js";
|
|
7
7
|
import { AlertTriangle, ArrowLeft } from "lucide-react";
|
|
8
8
|
import { Button } from "../../ui/button.js";
|
|
@@ -12,13 +12,17 @@ function SuperAdminGuard({ children, fallback }) {
|
|
|
12
12
|
const { data: session, isPending } = useSession();
|
|
13
13
|
const router = useRouter();
|
|
14
14
|
const t = useTranslations();
|
|
15
|
+
const [mounted, setMounted] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setMounted(true);
|
|
18
|
+
}, []);
|
|
15
19
|
useEffect(() => {
|
|
16
20
|
var _a2, _b2;
|
|
17
|
-
if (!isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "superadmin" && ((_b2 = session.user) == null ? void 0 : _b2.role) !== "developer") {
|
|
21
|
+
if (mounted && !isPending && session && ((_a2 = session.user) == null ? void 0 : _a2.role) !== "superadmin" && ((_b2 = session.user) == null ? void 0 : _b2.role) !== "developer") {
|
|
18
22
|
router.push("/dashboard?error=access_denied");
|
|
19
23
|
}
|
|
20
|
-
}, [session, isPending, router]);
|
|
21
|
-
if (isPending) {
|
|
24
|
+
}, [mounted, session, isPending, router]);
|
|
25
|
+
if (!mounted || isPending) {
|
|
22
26
|
return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
|
|
23
27
|
/* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
|
|
24
28
|
/* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicFooter.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicFooter.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PublicFooter.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicFooter.tsx"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,4CAyJ3B"}
|
|
@@ -3,11 +3,11 @@ import Link from "next/link";
|
|
|
3
3
|
import { Separator } from "../../ui/separator.js";
|
|
4
4
|
import { useTranslations } from "next-intl";
|
|
5
5
|
import { sel } from "../../../lib/test/index.js";
|
|
6
|
+
import { APP_NAME } from "../../../lib/config/index.js";
|
|
6
7
|
function PublicFooter() {
|
|
7
8
|
const currentYear = (/* @__PURE__ */ new Date()).getFullYear();
|
|
8
9
|
const t = useTranslations("footer");
|
|
9
|
-
const
|
|
10
|
-
const appName = tCommon("appName");
|
|
10
|
+
const appName = APP_NAME;
|
|
11
11
|
const footerLinks = {
|
|
12
12
|
product: [
|
|
13
13
|
{ name: "features", href: "/features" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublicNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicNavbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PublicNavbar.d.ts","sourceRoot":"","sources":["../../../../src/components/app/layouts/PublicNavbar.tsx"],"names":[],"mappings":"AAaA,wBAAgB,YAAY,4CAyJ3B"}
|
|
@@ -8,13 +8,13 @@ import { Menu, X } from "lucide-react";
|
|
|
8
8
|
import { useState } from "react";
|
|
9
9
|
import { sel } from "../../../lib/test/index.js";
|
|
10
10
|
import { useTranslations } from "next-intl";
|
|
11
|
+
import { APP_NAME } from "../../../lib/config/index.js";
|
|
11
12
|
function PublicNavbar() {
|
|
12
13
|
const { user, isLoading } = useAuth();
|
|
13
14
|
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
14
15
|
const tNav = useTranslations("navigation");
|
|
15
16
|
const tHome = useTranslations("home");
|
|
16
|
-
const
|
|
17
|
-
const appName = tCommon("appName");
|
|
17
|
+
const appName = APP_NAME;
|
|
18
18
|
const navigationItems = [
|
|
19
19
|
{ name: "features", href: "/features" },
|
|
20
20
|
{ name: "pricing", href: "/pricing" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeToggle.d.ts","sourceRoot":"","sources":["../../../../src/components/app/misc/ThemeToggle.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,
|
|
1
|
+
{"version":3,"file":"ThemeToggle.d.ts","sourceRoot":"","sources":["../../../../src/components/app/misc/ThemeToggle.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,WAAW,4CA4H1B"}
|
|
@@ -14,7 +14,7 @@ import { createAriaLabel, sel } from "../../../lib/test/index.js";
|
|
|
14
14
|
import { useTranslations } from "next-intl";
|
|
15
15
|
import { useAuth } from "../../../hooks/useAuth.js";
|
|
16
16
|
function ThemeToggle() {
|
|
17
|
-
const { setTheme, theme } = useTheme();
|
|
17
|
+
const { setTheme, theme, forcedTheme } = useTheme();
|
|
18
18
|
const { user } = useAuth();
|
|
19
19
|
const [mounted, setMounted] = useState(false);
|
|
20
20
|
const [statusMessage, setStatusMessage] = useState("");
|
|
@@ -50,6 +50,9 @@ function ThemeToggle() {
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
}, [setTheme, t, user]);
|
|
53
|
+
if (forcedTheme) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
53
56
|
if (!mounted) {
|
|
54
57
|
return /* @__PURE__ */ jsxs(
|
|
55
58
|
Button,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevKeyring.d.ts","sourceRoot":"","sources":["../../../src/components/auth/DevKeyring.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAA;AAE9E,UAAU,eAAe;IACvB,0CAA0C;IAC1C,MAAM,EAAE,gBAAgB,CAAA;CACzB;AA2GD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"DevKeyring.d.ts","sourceRoot":"","sources":["../../../src/components/auth/DevKeyring.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,wBAAwB,CAAA;AAE9E,UAAU,eAAe;IACvB,0CAA0C;IAC1C,MAAM,EAAE,gBAAgB,CAAA;CACzB;AA2GD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,eAAe,2CAwIrD"}
|
|
@@ -88,11 +88,19 @@ function DevKeyring({ config }) {
|
|
|
88
88
|
if (!(config == null ? void 0 : config.enabled) || !((_a = config.users) == null ? void 0 : _a.length)) return null;
|
|
89
89
|
const fillForm = useCallback((email, password) => {
|
|
90
90
|
const showEmailButton = document.querySelector('[data-cy="login-show-email"]');
|
|
91
|
+
const usePasswordToggle = () => {
|
|
92
|
+
var _a2;
|
|
93
|
+
return (_a2 = document.querySelector('[data-cy="login-use-password"]')) == null ? void 0 : _a2.click();
|
|
94
|
+
};
|
|
91
95
|
if (showEmailButton) {
|
|
92
96
|
showEmailButton.click();
|
|
93
|
-
setTimeout(() =>
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
usePasswordToggle();
|
|
99
|
+
setTimeout(() => fillInputs(email, password), 50);
|
|
100
|
+
}, 100);
|
|
94
101
|
} else {
|
|
95
|
-
|
|
102
|
+
usePasswordToggle();
|
|
103
|
+
setTimeout(() => fillInputs(email, password), 50);
|
|
96
104
|
}
|
|
97
105
|
setIsOpen(false);
|
|
98
106
|
}, []);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type UseSessionCookieRefreshOptions } from '../../hooks/useSessionCookieRefresh';
|
|
2
|
+
/**
|
|
3
|
+
* Drop-in client component that keeps the session cookie renewed for
|
|
4
|
+
* installed PWAs / long-lived tabs. Renders nothing.
|
|
5
|
+
*
|
|
6
|
+
* The root layout template mounts it once; it re-issues the session cookie
|
|
7
|
+
* through Better Auth's `get-session` Route Handler on app open, when the tab
|
|
8
|
+
* becomes visible again and when the device comes back online. See
|
|
9
|
+
* `useSessionCookieRefresh` for the options and `lib/auth/session-refresh.ts`
|
|
10
|
+
* for why render-time session reads cannot do this themselves.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* // app/layout.tsx
|
|
15
|
+
* <SessionCookieRefresher />
|
|
16
|
+
* // or, for a theme with 90-day sessions that only wants a daily check:
|
|
17
|
+
* <SessionCookieRefresher minIntervalMs={24 * 60 * 60 * 1000} />
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function SessionCookieRefresher(props?: UseSessionCookieRefreshOptions): any;
|
|
21
|
+
//# sourceMappingURL=SessionCookieRefresher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionCookieRefresher.d.ts","sourceRoot":"","sources":["../../../src/components/auth/SessionCookieRefresher.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,qCAAqC,CAAA;AAE5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,GAAE,8BAAmC,OAGhF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/LoginForm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LoginForm.d.ts","sourceRoot":"","sources":["../../../../src/components/auth/forms/LoginForm.tsx"],"names":[],"mappings":"AAmIA,wBAAgB,SAAS,4CAisBxB"}
|
|
@@ -16,16 +16,28 @@ import { Checkbox } from "../../ui/checkbox.js";
|
|
|
16
16
|
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "../../ui/card.js";
|
|
17
17
|
import { Separator } from "../../ui/separator.js";
|
|
18
18
|
import { LastUsedBadge } from "../../ui/last-used-badge.js";
|
|
19
|
-
import { Mail, Lock, Loader2, AlertCircle, Users } from "lucide-react";
|
|
19
|
+
import { Mail, Lock, Loader2, AlertCircle, Users, KeyRound } from "lucide-react";
|
|
20
20
|
import { GoogleIcon } from "../../ui/google-icon.js";
|
|
21
21
|
import { sel } from "../../../lib/test/index.js";
|
|
22
22
|
import { useTranslations } from "next-intl";
|
|
23
23
|
import { AuthTranslationPreloader } from "../../../lib/i18n/AuthTranslationPreloader.js";
|
|
24
24
|
import { DevKeyring } from "../DevKeyring.js";
|
|
25
25
|
import { DEV_CONFIG, PUBLIC_AUTH_CONFIG } from "../../../lib/config/config-sync.js";
|
|
26
|
+
import { getPrimaryEmailMethod } from "../../../lib/auth/auth-methods.js";
|
|
26
27
|
function getErrorMessageFromCode(error, t, context) {
|
|
27
28
|
const authError = error;
|
|
28
29
|
const errorCode = authError.code || getErrorCodeFromMessage(error.message);
|
|
30
|
+
if (context === "otp") {
|
|
31
|
+
const lower = (error.message || "").toLowerCase();
|
|
32
|
+
if (lower.includes("expired")) return t("login.errors.otpExpired", { defaultValue: error.message });
|
|
33
|
+
if (lower.includes("too many") || lower.includes("rate") || lower.includes("attempts")) {
|
|
34
|
+
return t("login.errors.otpTooMany", { defaultValue: error.message });
|
|
35
|
+
}
|
|
36
|
+
if (lower.includes("invalid") || lower.includes("otp") || lower.includes("code")) {
|
|
37
|
+
return t("login.errors.otpInvalid", { defaultValue: error.message });
|
|
38
|
+
}
|
|
39
|
+
return error.message || t("login.messages.otpVerifyFailed");
|
|
40
|
+
}
|
|
29
41
|
const baseKey = context === "email" ? "login.errors" : "login.errors.google";
|
|
30
42
|
switch (errorCode) {
|
|
31
43
|
case "INVALID_CREDENTIALS":
|
|
@@ -82,22 +94,48 @@ function buildLoginSchema(t) {
|
|
|
82
94
|
password: z.string().min(6, t("login.errors.passwordTooShort", { defaultValue: "Password must be at least 6 characters" }))
|
|
83
95
|
});
|
|
84
96
|
}
|
|
97
|
+
const OTP_CODE_LENGTH = 6;
|
|
98
|
+
function buildOtpEmailSchema(t) {
|
|
99
|
+
return z.string().trim().email({ message: t("login.errors.invalidEmail", { defaultValue: "Invalid email" }) });
|
|
100
|
+
}
|
|
101
|
+
function buildOtpCodeSchema(t) {
|
|
102
|
+
return z.string().trim().regex(new RegExp(`^\\d{${OTP_CODE_LENGTH}}$`), {
|
|
103
|
+
message: t("login.errors.otpInvalidCode", { defaultValue: `Enter the ${OTP_CODE_LENGTH}-digit code` })
|
|
104
|
+
});
|
|
105
|
+
}
|
|
85
106
|
function LoginForm() {
|
|
86
107
|
var _a, _b, _c;
|
|
87
108
|
const registrationMode = PUBLIC_AUTH_CONFIG.registration.mode;
|
|
88
109
|
const googleEnabled = PUBLIC_AUTH_CONFIG.providers.google.enabled;
|
|
89
|
-
const
|
|
110
|
+
const methods = PUBLIC_AUTH_CONFIG.methods;
|
|
111
|
+
const otpEnabled = methods.includes("email-otp");
|
|
90
112
|
const devKeyringActive = process.env.NODE_ENV !== "production" && !!((_b = (_a = DEV_CONFIG) == null ? void 0 : _a.devKeyring) == null ? void 0 : _b.enabled);
|
|
91
|
-
const
|
|
113
|
+
const passwordEnabled = methods.includes("email-password") || devKeyringActive;
|
|
114
|
+
const signupVisible = (registrationMode === "open" || registrationMode === "domain-open") && methods.includes("email-password");
|
|
115
|
+
const emailLoginAllowed = (registrationMode !== "domain-restricted" || devKeyringActive) && (otpEnabled || passwordEnabled);
|
|
116
|
+
const primaryEmailMode = (() => {
|
|
117
|
+
const primary = getPrimaryEmailMethod(methods);
|
|
118
|
+
if (primary === "email-otp" && otpEnabled) return "otp";
|
|
119
|
+
if (primary === "email-password") return "password";
|
|
120
|
+
return otpEnabled ? "otp" : "password";
|
|
121
|
+
})();
|
|
92
122
|
const [loadingProvider, setLoadingProvider] = useState(null);
|
|
93
123
|
const [error, setError] = useState(null);
|
|
94
124
|
const [statusMessage, setStatusMessage] = useState("");
|
|
95
125
|
const [showEmailForm, setShowEmailForm] = useState(!googleEnabled);
|
|
126
|
+
const [emailMode, setEmailMode] = useState(primaryEmailMode);
|
|
127
|
+
const [otpStep, setOtpStep] = useState("email");
|
|
128
|
+
const [otpEmail, setOtpEmail] = useState("");
|
|
129
|
+
const [otpCode, setOtpCode] = useState("");
|
|
130
|
+
const [otpEmailError, setOtpEmailError] = useState(null);
|
|
131
|
+
const [otpCodeError, setOtpCodeError] = useState(null);
|
|
96
132
|
const isProcessingRef = useRef(false);
|
|
97
|
-
const { signIn, googleSignIn } = useAuth();
|
|
133
|
+
const { signIn, googleSignIn, sendOtp, signInWithOtp } = useAuth();
|
|
98
134
|
const { lastMethod, isReady } = useLastAuthMethod();
|
|
99
135
|
const t = useTranslations("auth");
|
|
100
136
|
const loginSchema = useMemo(() => buildLoginSchema(t), [t]);
|
|
137
|
+
const otpEmailSchema = useMemo(() => buildOtpEmailSchema(t), [t]);
|
|
138
|
+
const otpCodeSchema = useMemo(() => buildOtpCodeSchema(t), [t]);
|
|
101
139
|
const searchParams = useSearchParams();
|
|
102
140
|
const inviteEmail = searchParams.get("email");
|
|
103
141
|
const fromInvite = searchParams.get("fromInvite") === "true";
|
|
@@ -105,8 +143,75 @@ function LoginForm() {
|
|
|
105
143
|
useEffect(() => {
|
|
106
144
|
if (fromInvite && inviteEmail) {
|
|
107
145
|
setShowEmailForm(true);
|
|
146
|
+
setOtpEmail(inviteEmail);
|
|
108
147
|
}
|
|
109
148
|
}, [fromInvite, inviteEmail]);
|
|
149
|
+
const switchEmailMode = useCallback((mode) => {
|
|
150
|
+
setEmailMode(mode);
|
|
151
|
+
setError(null);
|
|
152
|
+
setOtpEmailError(null);
|
|
153
|
+
setOtpCodeError(null);
|
|
154
|
+
setOtpStep("email");
|
|
155
|
+
setOtpCode("");
|
|
156
|
+
}, []);
|
|
157
|
+
const handleSendOtp = useCallback(async (event) => {
|
|
158
|
+
var _a2;
|
|
159
|
+
event == null ? void 0 : event.preventDefault();
|
|
160
|
+
if (loadingProvider) return;
|
|
161
|
+
const parsed = otpEmailSchema.safeParse(otpEmail);
|
|
162
|
+
if (!parsed.success) {
|
|
163
|
+
setOtpEmailError(((_a2 = parsed.error.issues[0]) == null ? void 0 : _a2.message) ?? t("login.errors.invalidEmail"));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
setOtpEmailError(null);
|
|
167
|
+
setOtpCodeError(null);
|
|
168
|
+
setError(null);
|
|
169
|
+
setLoadingProvider("email");
|
|
170
|
+
setStatusMessage(t("login.messages.otpSending"));
|
|
171
|
+
try {
|
|
172
|
+
await sendOtp(parsed.data);
|
|
173
|
+
setOtpEmail(parsed.data);
|
|
174
|
+
setOtpCode("");
|
|
175
|
+
setOtpStep("code");
|
|
176
|
+
setStatusMessage(t("login.messages.otpSent"));
|
|
177
|
+
} catch (err) {
|
|
178
|
+
const error2 = err instanceof Error ? err : new Error(t("login.messages.otpSendFailed"));
|
|
179
|
+
const errorMessage = error2.message || t("login.messages.otpSendFailed");
|
|
180
|
+
setError(errorMessage);
|
|
181
|
+
setStatusMessage(t("login.messages.signInError", { error: errorMessage }));
|
|
182
|
+
} finally {
|
|
183
|
+
setLoadingProvider(null);
|
|
184
|
+
}
|
|
185
|
+
}, [loadingProvider, otpEmail, otpEmailSchema, sendOtp, t]);
|
|
186
|
+
const handleVerifyOtp = useCallback(async (event) => {
|
|
187
|
+
var _a2;
|
|
188
|
+
event == null ? void 0 : event.preventDefault();
|
|
189
|
+
if (loadingProvider) return;
|
|
190
|
+
const parsed = otpCodeSchema.safeParse(otpCode);
|
|
191
|
+
if (!parsed.success) {
|
|
192
|
+
setOtpCodeError(((_a2 = parsed.error.issues[0]) == null ? void 0 : _a2.message) ?? t("login.errors.otpInvalidCode"));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
setOtpCodeError(null);
|
|
196
|
+
setError(null);
|
|
197
|
+
setLoadingProvider("email");
|
|
198
|
+
setStatusMessage(t("login.messages.otpVerifying"));
|
|
199
|
+
try {
|
|
200
|
+
await signInWithOtp({
|
|
201
|
+
email: otpEmail,
|
|
202
|
+
otp: parsed.data,
|
|
203
|
+
redirectTo: callbackUrl || void 0
|
|
204
|
+
});
|
|
205
|
+
setStatusMessage(t("login.messages.signInSuccess"));
|
|
206
|
+
} catch (err) {
|
|
207
|
+
const error2 = err instanceof Error ? err : new Error(t("login.messages.otpVerifyFailed"));
|
|
208
|
+
const errorMessage = getErrorMessageFromCode(error2, t, "otp");
|
|
209
|
+
setError(errorMessage);
|
|
210
|
+
setStatusMessage(t("login.messages.signInError", { error: errorMessage }));
|
|
211
|
+
} finally {
|
|
212
|
+
setLoadingProvider(null);
|
|
213
|
+
}
|
|
214
|
+
}, [loadingProvider, otpCode, otpCodeSchema, otpEmail, signInWithOtp, callbackUrl, t]);
|
|
110
215
|
const {
|
|
111
216
|
register,
|
|
112
217
|
handleSubmit,
|
|
@@ -258,11 +363,189 @@ function LoginForm() {
|
|
|
258
363
|
}
|
|
259
364
|
) }),
|
|
260
365
|
showEmailForm && emailLoginAllowed && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
261
|
-
/* @__PURE__ */ jsxs("div", { className: "relative my-6", children: [
|
|
366
|
+
googleEnabled && /* @__PURE__ */ jsxs("div", { className: "relative my-6", children: [
|
|
262
367
|
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx(Separator, { className: "w-full" }) }),
|
|
263
368
|
/* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs uppercase", children: /* @__PURE__ */ jsx("span", { className: "bg-background px-2 text-muted-foreground", children: t("login.form.orContinueWith") }) })
|
|
264
369
|
] }),
|
|
265
|
-
/* @__PURE__ */ jsxs(
|
|
370
|
+
emailMode === "otp" && otpEnabled && /* @__PURE__ */ jsxs(
|
|
371
|
+
"form",
|
|
372
|
+
{
|
|
373
|
+
onSubmit: otpStep === "email" ? handleSendOtp : handleVerifyOtp,
|
|
374
|
+
className: "space-y-4",
|
|
375
|
+
"aria-labelledby": "login-heading",
|
|
376
|
+
noValidate: true,
|
|
377
|
+
"data-cy": sel("auth.login.otpForm"),
|
|
378
|
+
children: [
|
|
379
|
+
otpStep === "email" ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
380
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "otp-email", children: t("login.form.email") }),
|
|
381
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
382
|
+
/* @__PURE__ */ jsx(Mail, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground", "aria-hidden": "true" }),
|
|
383
|
+
/* @__PURE__ */ jsx(
|
|
384
|
+
Input,
|
|
385
|
+
{
|
|
386
|
+
id: "otp-email",
|
|
387
|
+
type: "email",
|
|
388
|
+
autoComplete: "email",
|
|
389
|
+
inputMode: "email",
|
|
390
|
+
value: otpEmail,
|
|
391
|
+
onChange: (e) => setOtpEmail(e.target.value),
|
|
392
|
+
placeholder: t("login.form.emailPlaceholder"),
|
|
393
|
+
className: `pl-9 ${fromInvite ? "bg-muted cursor-not-allowed" : ""}`,
|
|
394
|
+
readOnly: fromInvite,
|
|
395
|
+
"aria-required": "true",
|
|
396
|
+
"aria-describedby": otpEmailError ? "otp-email-error" : "otp-email-help",
|
|
397
|
+
"aria-invalid": otpEmailError ? "true" : "false",
|
|
398
|
+
"data-cy": sel("auth.login.otpEmailInput")
|
|
399
|
+
}
|
|
400
|
+
)
|
|
401
|
+
] }),
|
|
402
|
+
/* @__PURE__ */ jsx("p", { id: "otp-email-help", className: "text-xs text-muted-foreground", children: t("login.form.otp.emailHelp") }),
|
|
403
|
+
otpEmailError && /* @__PURE__ */ jsx(
|
|
404
|
+
"p",
|
|
405
|
+
{
|
|
406
|
+
id: "otp-email-error",
|
|
407
|
+
className: "text-sm text-destructive",
|
|
408
|
+
role: "alert",
|
|
409
|
+
"aria-live": "assertive",
|
|
410
|
+
"data-cy": sel("auth.login.otpEmailError"),
|
|
411
|
+
children: otpEmailError
|
|
412
|
+
}
|
|
413
|
+
)
|
|
414
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
415
|
+
/* @__PURE__ */ jsxs(Alert, { "data-cy": sel("auth.login.otpSentNotice"), children: [
|
|
416
|
+
/* @__PURE__ */ jsx(Mail, { className: "h-4 w-4", "aria-hidden": "true" }),
|
|
417
|
+
/* @__PURE__ */ jsx(AlertDescription, { children: t("login.form.otp.codeSent", { email: otpEmail }) })
|
|
418
|
+
] }),
|
|
419
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: "otp-code", children: t("login.form.otp.codeLabel") }),
|
|
420
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
421
|
+
/* @__PURE__ */ jsx(KeyRound, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground", "aria-hidden": "true" }),
|
|
422
|
+
/* @__PURE__ */ jsx(
|
|
423
|
+
Input,
|
|
424
|
+
{
|
|
425
|
+
id: "otp-code",
|
|
426
|
+
type: "text",
|
|
427
|
+
inputMode: "numeric",
|
|
428
|
+
autoComplete: "one-time-code",
|
|
429
|
+
pattern: "[0-9]*",
|
|
430
|
+
maxLength: OTP_CODE_LENGTH,
|
|
431
|
+
value: otpCode,
|
|
432
|
+
onChange: (e) => setOtpCode(e.target.value.replace(/\D/g, "").slice(0, OTP_CODE_LENGTH)),
|
|
433
|
+
placeholder: t("login.form.otp.codePlaceholder"),
|
|
434
|
+
className: "pl-9 tracking-widest",
|
|
435
|
+
autoFocus: true,
|
|
436
|
+
"aria-required": "true",
|
|
437
|
+
"aria-describedby": otpCodeError ? "otp-code-error" : void 0,
|
|
438
|
+
"aria-invalid": otpCodeError ? "true" : "false",
|
|
439
|
+
"data-cy": sel("auth.login.otpCodeInput")
|
|
440
|
+
}
|
|
441
|
+
)
|
|
442
|
+
] }),
|
|
443
|
+
otpCodeError && /* @__PURE__ */ jsx(
|
|
444
|
+
"p",
|
|
445
|
+
{
|
|
446
|
+
id: "otp-code-error",
|
|
447
|
+
className: "text-sm text-destructive",
|
|
448
|
+
role: "alert",
|
|
449
|
+
"aria-live": "assertive",
|
|
450
|
+
"data-cy": sel("auth.login.otpCodeError"),
|
|
451
|
+
children: otpCodeError
|
|
452
|
+
}
|
|
453
|
+
)
|
|
454
|
+
] }),
|
|
455
|
+
error && /* @__PURE__ */ jsxs(
|
|
456
|
+
Alert,
|
|
457
|
+
{
|
|
458
|
+
variant: "destructive",
|
|
459
|
+
role: "alert",
|
|
460
|
+
"aria-live": "assertive",
|
|
461
|
+
"data-cy": sel("auth.login.errorAlert"),
|
|
462
|
+
children: [
|
|
463
|
+
/* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4", "aria-hidden": "true" }),
|
|
464
|
+
/* @__PURE__ */ jsx(AlertDescription, { children: error })
|
|
465
|
+
]
|
|
466
|
+
}
|
|
467
|
+
),
|
|
468
|
+
otpStep === "email" ? /* @__PURE__ */ jsx(
|
|
469
|
+
Button,
|
|
470
|
+
{
|
|
471
|
+
type: "submit",
|
|
472
|
+
disabled: !!loadingProvider,
|
|
473
|
+
className: "w-full",
|
|
474
|
+
"data-cy": sel("auth.login.otpSend"),
|
|
475
|
+
children: loadingProvider === "email" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
476
|
+
/* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin", "aria-hidden": "true" }),
|
|
477
|
+
t("login.form.otp.sendingCode")
|
|
478
|
+
] }) : t("login.form.otp.sendCode")
|
|
479
|
+
}
|
|
480
|
+
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
481
|
+
/* @__PURE__ */ jsx(
|
|
482
|
+
Button,
|
|
483
|
+
{
|
|
484
|
+
type: "submit",
|
|
485
|
+
disabled: !!loadingProvider,
|
|
486
|
+
className: "w-full",
|
|
487
|
+
"data-cy": sel("auth.login.otpSubmit"),
|
|
488
|
+
children: loadingProvider === "email" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
489
|
+
/* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin", "aria-hidden": "true" }),
|
|
490
|
+
t("login.form.otp.verifyingCode")
|
|
491
|
+
] }) : t("login.form.otp.verifyCode")
|
|
492
|
+
}
|
|
493
|
+
),
|
|
494
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-sm", children: [
|
|
495
|
+
/* @__PURE__ */ jsx(
|
|
496
|
+
"button",
|
|
497
|
+
{
|
|
498
|
+
type: "button",
|
|
499
|
+
onClick: () => void handleSendOtp(),
|
|
500
|
+
disabled: !!loadingProvider,
|
|
501
|
+
className: "text-primary hover:underline focus:outline-none focus:ring-2 focus:ring-accent disabled:opacity-50 min-h-[44px] inline-flex items-center",
|
|
502
|
+
"data-cy": sel("auth.login.otpResend"),
|
|
503
|
+
children: t("login.form.otp.resendCode")
|
|
504
|
+
}
|
|
505
|
+
),
|
|
506
|
+
/* @__PURE__ */ jsx(
|
|
507
|
+
"button",
|
|
508
|
+
{
|
|
509
|
+
type: "button",
|
|
510
|
+
onClick: () => {
|
|
511
|
+
setOtpStep("email");
|
|
512
|
+
setOtpCode("");
|
|
513
|
+
setOtpCodeError(null);
|
|
514
|
+
setError(null);
|
|
515
|
+
},
|
|
516
|
+
disabled: !!loadingProvider,
|
|
517
|
+
className: "text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent disabled:opacity-50 min-h-[44px] inline-flex items-center",
|
|
518
|
+
"data-cy": sel("auth.login.otpChangeEmail"),
|
|
519
|
+
children: t("login.form.otp.changeEmail")
|
|
520
|
+
}
|
|
521
|
+
)
|
|
522
|
+
] })
|
|
523
|
+
] }),
|
|
524
|
+
passwordEnabled && /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(
|
|
525
|
+
"button",
|
|
526
|
+
{
|
|
527
|
+
type: "button",
|
|
528
|
+
onClick: () => switchEmailMode("password"),
|
|
529
|
+
disabled: !!loadingProvider,
|
|
530
|
+
className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
|
|
531
|
+
"data-cy": sel("auth.login.usePassword"),
|
|
532
|
+
children: t("login.form.usePassword")
|
|
533
|
+
}
|
|
534
|
+
) }),
|
|
535
|
+
googleEnabled && /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(
|
|
536
|
+
"button",
|
|
537
|
+
{
|
|
538
|
+
type: "button",
|
|
539
|
+
onClick: () => setShowEmailForm(false),
|
|
540
|
+
className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
|
|
541
|
+
"data-cy": sel("auth.login.hideEmail"),
|
|
542
|
+
children: t("login.form.backToGoogle", { defaultValue: "Back to main options" })
|
|
543
|
+
}
|
|
544
|
+
) })
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
),
|
|
548
|
+
(emailMode === "password" || !otpEnabled) && passwordEnabled && /* @__PURE__ */ jsxs(
|
|
266
549
|
"form",
|
|
267
550
|
{
|
|
268
551
|
onSubmit: handleSubmit(onSubmit),
|
|
@@ -411,6 +694,17 @@ function LoginForm() {
|
|
|
411
694
|
}
|
|
412
695
|
),
|
|
413
696
|
/* @__PURE__ */ jsx("div", { id: "submit-help", className: "sr-only", children: t("login.form.submitHelp") }),
|
|
697
|
+
otpEnabled && /* @__PURE__ */ jsx("div", { className: "text-center mt-4", children: /* @__PURE__ */ jsx(
|
|
698
|
+
"button",
|
|
699
|
+
{
|
|
700
|
+
type: "button",
|
|
701
|
+
onClick: () => switchEmailMode("otp"),
|
|
702
|
+
disabled: !!loadingProvider,
|
|
703
|
+
className: "text-sm text-muted-foreground hover:text-primary focus:outline-none focus:ring-2 focus:ring-accent min-h-[44px] inline-flex items-center",
|
|
704
|
+
"data-cy": sel("auth.login.useOtp"),
|
|
705
|
+
children: t("login.form.useOtp")
|
|
706
|
+
}
|
|
707
|
+
) }),
|
|
414
708
|
googleEnabled && /* @__PURE__ */ jsx("div", { className: "text-center mt-4", children: /* @__PURE__ */ jsx(
|
|
415
709
|
"button",
|
|
416
710
|
{
|
|
@@ -7,5 +7,6 @@ export { LoginForm } from './forms/LoginForm';
|
|
|
7
7
|
export { SignupForm } from './forms/SignupForm';
|
|
8
8
|
export { AuthWrapper } from './layouts/AuthWrapper';
|
|
9
9
|
export { AuthWrapperWithPreload } from './layouts/AuthWrapperWithPreload';
|
|
10
|
+
export { SessionCookieRefresher } from './SessionCookieRefresher';
|
|
10
11
|
export { DevKeyring } from './DevKeyring';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAGzE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/auth/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGjE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -2,11 +2,13 @@ import { LoginForm } from "./forms/LoginForm.js";
|
|
|
2
2
|
import { SignupForm } from "./forms/SignupForm.js";
|
|
3
3
|
import { AuthWrapper } from "./layouts/AuthWrapper.js";
|
|
4
4
|
import { AuthWrapperWithPreload } from "./layouts/AuthWrapperWithPreload.js";
|
|
5
|
+
import { SessionCookieRefresher } from "./SessionCookieRefresher.js";
|
|
5
6
|
import { DevKeyring } from "./DevKeyring.js";
|
|
6
7
|
export {
|
|
7
8
|
AuthWrapper,
|
|
8
9
|
AuthWrapperWithPreload,
|
|
9
10
|
DevKeyring,
|
|
10
11
|
LoginForm,
|
|
12
|
+
SessionCookieRefresher,
|
|
11
13
|
SignupForm
|
|
12
14
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvoicesTable.d.ts","sourceRoot":"","sources":["../../../src/components/billing/InvoicesTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAI7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAiB,EACjB,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"InvoicesTable.d.ts","sourceRoot":"","sources":["../../../src/components/billing/InvoicesTable.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAI7E,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,aAAa,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAiB,EACjB,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,GACb,EAAE,kBAAkB,2CAiIpB"}
|