@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
|
@@ -116,7 +116,8 @@ function CountrySelect({
|
|
|
116
116
|
placeholder = "Seleccionar pa\xEDs...",
|
|
117
117
|
disabled = false,
|
|
118
118
|
className,
|
|
119
|
-
clearable = true
|
|
119
|
+
clearable = true,
|
|
120
|
+
id
|
|
120
121
|
}) {
|
|
121
122
|
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
122
123
|
/* @__PURE__ */ jsx(Globe2, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground z-10" }),
|
|
@@ -131,6 +132,7 @@ function CountrySelect({
|
|
|
131
132
|
emptyMessage: "No se encontraron pa\xEDses.",
|
|
132
133
|
disabled,
|
|
133
134
|
clearable,
|
|
135
|
+
id,
|
|
134
136
|
className: cn("pl-10", className)
|
|
135
137
|
}
|
|
136
138
|
)
|
|
@@ -5,7 +5,9 @@ interface CurrencySelectProps {
|
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
className?: string;
|
|
7
7
|
clearable?: boolean;
|
|
8
|
+
/** Forwarded to the combobox trigger so `<label for>` resolves (see #90) */
|
|
9
|
+
id?: string;
|
|
8
10
|
}
|
|
9
|
-
export declare function CurrencySelect({ value, onChange, placeholder, disabled, className, clearable, }: CurrencySelectProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function CurrencySelect({ value, onChange, placeholder, disabled, className, clearable, id, }: CurrencySelectProps): import("react/jsx-runtime").JSX.Element;
|
|
10
12
|
export {};
|
|
11
13
|
//# sourceMappingURL=currency-select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currency-select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/currency-select.tsx"],"names":[],"mappings":"AA6CA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"currency-select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/currency-select.tsx"],"names":[],"mappings":"AA6CA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAAqC,EACrC,QAAgB,EAChB,SAAS,EACT,SAAgB,EAChB,EAAE,GACH,EAAE,mBAAmB,2CAkBrB"}
|
|
@@ -45,7 +45,8 @@ function CurrencySelect({
|
|
|
45
45
|
placeholder = "Seleccionar moneda...",
|
|
46
46
|
disabled = false,
|
|
47
47
|
className,
|
|
48
|
-
clearable = true
|
|
48
|
+
clearable = true,
|
|
49
|
+
id
|
|
49
50
|
}) {
|
|
50
51
|
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
51
52
|
/* @__PURE__ */ jsx(DollarSign, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground z-10" }),
|
|
@@ -60,6 +61,7 @@ function CurrencySelect({
|
|
|
60
61
|
emptyMessage: "No se encontraron monedas.",
|
|
61
62
|
disabled,
|
|
62
63
|
clearable,
|
|
64
|
+
id,
|
|
63
65
|
className: cn("pl-10", className)
|
|
64
66
|
}
|
|
65
67
|
)
|
|
@@ -10,6 +10,11 @@ declare const sheetVariants: (props?: {
|
|
|
10
10
|
side?: "left" | "right" | "top" | "bottom";
|
|
11
11
|
} & import("class-variance-authority/types").ClassProp) => string;
|
|
12
12
|
interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
|
|
13
|
+
/**
|
|
14
|
+
* Extra classes merged onto the built-in close button (position, size,
|
|
15
|
+
* colors...). The default already meets the 44x44px touch target.
|
|
16
|
+
*/
|
|
17
|
+
closeButtonClassName?: string;
|
|
13
18
|
}
|
|
14
19
|
declare const SheetContent: React.ForwardRefExoticComponent<SheetContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
15
20
|
declare const SheetHeader: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,KAAK,sCAAsB,CAAA;AAEjC,QAAA,MAAM,YAAY,6GAAyB,CAAA;AAE3C,QAAA,MAAM,UAAU,2GAAuB,CAAA;AAEvC,QAAA,MAAM,WAAW,4CAAwB,CAAA;AAEzC,QAAA,MAAM,YAAY,6JAYhB,CAAA;AAGF,QAAA,MAAM,aAAa;;iEAiBlB,CAAA;
|
|
1
|
+
{"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../../src/components/ui/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,KAAK,sCAAsB,CAAA;AAEjC,QAAA,MAAM,YAAY,6GAAyB,CAAA;AAE3C,QAAA,MAAM,UAAU,2GAAuB,CAAA;AAEvC,QAAA,MAAM,WAAW,4CAAwB,CAAA;AAEzC,QAAA,MAAM,YAAY,6JAYhB,CAAA;AAGF,QAAA,MAAM,aAAa;;iEAiBlB,CAAA;AA2BD,UAAU,iBACR,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,EACnE,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,QAAA,MAAM,YAAY,0FAwChB,CAAA;AAGF,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,UAAU,mKASd,CAAA;AAGF,QAAA,MAAM,gBAAgB,6KAiBpB,CAAA;AAGF,OAAO,EACL,KAAK,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAA"}
|
|
@@ -37,24 +37,40 @@ const sheetVariants = cva(
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
);
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
40
|
+
const SheetDescriptionContext = React.createContext(null);
|
|
41
|
+
const useIsomorphicLayoutEffect = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
|
|
42
|
+
const sheetCloseButtonClassName = "absolute right-0.5 top-0.5 inline-flex h-11 w-11 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent";
|
|
43
|
+
const SheetContent = React.forwardRef(({ side = "right", className, closeButtonClassName, children, ...props }, ref) => {
|
|
44
|
+
const [hasDescription, setHasDescription] = React.useState(false);
|
|
45
|
+
const descriptionCount = React.useRef(0);
|
|
46
|
+
const registerDescription = React.useCallback(() => {
|
|
47
|
+
descriptionCount.current += 1;
|
|
48
|
+
setHasDescription(true);
|
|
49
|
+
return () => {
|
|
50
|
+
descriptionCount.current -= 1;
|
|
51
|
+
if (descriptionCount.current === 0) setHasDescription(false);
|
|
52
|
+
};
|
|
53
|
+
}, []);
|
|
54
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
55
|
+
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
SheetPrimitive.Content,
|
|
58
|
+
{
|
|
59
|
+
ref,
|
|
60
|
+
className: cn(sheetVariants({ side }), className),
|
|
61
|
+
...props,
|
|
62
|
+
children: /* @__PURE__ */ jsxs(SheetDescriptionContext.Provider, { value: registerDescription, children: [
|
|
63
|
+
/* @__PURE__ */ jsxs(SheetPrimitive.Close, { className: cn(sheetCloseButtonClassName, closeButtonClassName), children: [
|
|
64
|
+
/* @__PURE__ */ jsx(Cross2Icon, { className: "h-4 w-4", "aria-hidden": "true" }),
|
|
65
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
66
|
+
] }),
|
|
67
|
+
children,
|
|
68
|
+
!hasDescription && /* @__PURE__ */ jsx(SheetPrimitive.Description, { className: "sr-only" })
|
|
69
|
+
] })
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
] });
|
|
73
|
+
});
|
|
58
74
|
SheetContent.displayName = SheetPrimitive.Content.displayName;
|
|
59
75
|
const SheetHeader = ({
|
|
60
76
|
className,
|
|
@@ -93,14 +109,18 @@ const SheetTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
93
109
|
}
|
|
94
110
|
));
|
|
95
111
|
SheetTitle.displayName = SheetPrimitive.Title.displayName;
|
|
96
|
-
const SheetDescription = React.forwardRef(({ className, ...props }, ref) =>
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
)
|
|
112
|
+
const SheetDescription = React.forwardRef(({ className, ...props }, ref) => {
|
|
113
|
+
const registerDescription = React.useContext(SheetDescriptionContext);
|
|
114
|
+
useIsomorphicLayoutEffect(() => registerDescription == null ? void 0 : registerDescription(), [registerDescription]);
|
|
115
|
+
return /* @__PURE__ */ jsx(
|
|
116
|
+
SheetPrimitive.Description,
|
|
117
|
+
{
|
|
118
|
+
ref,
|
|
119
|
+
className: cn("text-sm text-muted-foreground", className),
|
|
120
|
+
...props
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
});
|
|
104
124
|
SheetDescription.displayName = SheetPrimitive.Description.displayName;
|
|
105
125
|
export {
|
|
106
126
|
Sheet,
|
|
@@ -5,7 +5,9 @@ interface TimezoneSelectProps {
|
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
className?: string;
|
|
7
7
|
clearable?: boolean;
|
|
8
|
+
/** Forwarded to the combobox trigger so `<label for>` resolves (see #90) */
|
|
9
|
+
id?: string;
|
|
8
10
|
}
|
|
9
|
-
export declare function TimezoneSelect({ value, onChange, placeholder, disabled, className, clearable, }: TimezoneSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function TimezoneSelect({ value, onChange, placeholder, disabled, className, clearable, id, }: TimezoneSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
10
12
|
export {};
|
|
11
13
|
//# sourceMappingURL=timezone-select.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timezone-select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/timezone-select.tsx"],"names":[],"mappings":"AAwCA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"timezone-select.d.ts","sourceRoot":"","sources":["../../../src/components/ui/timezone-select.tsx"],"names":[],"mappings":"AAwCA,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAA;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,4EAA4E;IAC5E,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,WAA2C,EAC3C,QAAgB,EAChB,SAAS,EACT,SAAgB,EAChB,EAAE,GACH,EAAE,mBAAmB,2CAkBrB"}
|
|
@@ -40,7 +40,8 @@ function TimezoneSelect({
|
|
|
40
40
|
placeholder = "Seleccionar zona horaria...",
|
|
41
41
|
disabled = false,
|
|
42
42
|
className,
|
|
43
|
-
clearable = true
|
|
43
|
+
clearable = true,
|
|
44
|
+
id
|
|
44
45
|
}) {
|
|
45
46
|
return /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
46
47
|
/* @__PURE__ */ jsx(Globe, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground z-10" }),
|
|
@@ -55,6 +56,7 @@ function TimezoneSelect({
|
|
|
55
56
|
emptyMessage: "No se encontraron zonas horarias.",
|
|
56
57
|
disabled,
|
|
57
58
|
clearable,
|
|
59
|
+
id,
|
|
58
60
|
className: cn("pl-10", className)
|
|
59
61
|
}
|
|
60
62
|
)
|
|
@@ -15,5 +15,11 @@ export declare function TeamProvider({ children }: {
|
|
|
15
15
|
children: ReactNode;
|
|
16
16
|
}): import("react/jsx-runtime").JSX.Element;
|
|
17
17
|
export declare function useTeamContext(): TeamContextValue;
|
|
18
|
+
/**
|
|
19
|
+
* Like useTeamContext(), but returns undefined instead of throwing when no
|
|
20
|
+
* TeamProvider is mounted above. Lets wrappers such as DashboardProviders skip
|
|
21
|
+
* mounting a second TeamProvider when the root layout already provides one.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useOptionalTeamContext(): TeamContextValue | undefined;
|
|
18
24
|
export {};
|
|
19
25
|
//# sourceMappingURL=TeamContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamContext.d.ts","sourceRoot":"","sources":["../../src/contexts/TeamContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGvG,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,UAAU,gBAAgB;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,EAAE,OAAO,CAAA;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAKD,eAAO,MAAM,eAAe,yBAA0B,CAAA;AAGtD,wBAAsB,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBpE;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"TeamContext.d.ts","sourceRoot":"","sources":["../../src/contexts/TeamContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGvG,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAM7D,UAAU,gBAAgB;IACxB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,wBAAwB,EAAE,OAAO,CAAA;IACjC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAClC;AAKD,eAAO,MAAM,eAAe,yBAA0B,CAAA;AAGtD,wBAAsB,cAAc,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBpE;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAqOjE;AAED,wBAAgB,cAAc,qBAM7B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,GAAG,SAAS,CAErE"}
|
|
@@ -82,7 +82,10 @@ function TeamProvider({ children }) {
|
|
|
82
82
|
if (currentTeam && userTeams.some((t) => t.team.id === currentTeam.id)) return;
|
|
83
83
|
const storedTeamId = typeof window !== "undefined" ? localStorage.getItem("activeTeamId") : null;
|
|
84
84
|
const storedTeam = storedTeamId ? userTeams.find((t) => t.team.id === storedTeamId) : null;
|
|
85
|
-
const
|
|
85
|
+
const defaultTeam = storedTeam ? void 0 : [...userTeams].sort(
|
|
86
|
+
(a, b) => new Date(a.joinedAt).getTime() - new Date(b.joinedAt).getTime()
|
|
87
|
+
)[0];
|
|
88
|
+
const activeTeam = storedTeam || defaultTeam;
|
|
86
89
|
if (activeTeam) {
|
|
87
90
|
setCurrentTeam(activeTeam.team);
|
|
88
91
|
if (typeof window !== "undefined") {
|
|
@@ -181,9 +184,13 @@ function useTeamContext() {
|
|
|
181
184
|
}
|
|
182
185
|
return context;
|
|
183
186
|
}
|
|
187
|
+
function useOptionalTeamContext() {
|
|
188
|
+
return useContext(TeamContext);
|
|
189
|
+
}
|
|
184
190
|
export {
|
|
185
191
|
TEAMS_QUERY_KEY,
|
|
186
192
|
TeamProvider,
|
|
187
193
|
fetchUserTeams,
|
|
194
|
+
useOptionalTeamContext,
|
|
188
195
|
useTeamContext
|
|
189
196
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otp-verification.d.ts","sourceRoot":"","sources":["../../src/emails/otp-verification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAKjF,wBAA8B,eAAe,CAC3C,IAAI,EAAE,wBAAwB,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"otp-verification.d.ts","sourceRoot":"","sources":["../../src/emails/otp-verification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAKjF,wBAA8B,eAAe,CAC3C,IAAI,EAAE,wBAAwB,EAC9B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAmEvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["../../src/emails/reset-password.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAI/E,wBAA8B,aAAa,CACzC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["../../src/emails/reset-password.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAI/E,wBAA8B,aAAa,CACzC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CA2FvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-invitation.d.ts","sourceRoot":"","sources":["../../src/emails/team-invitation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"team-invitation.d.ts","sourceRoot":"","sources":["../../src/emails/team-invitation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAKhF,wBAA8B,cAAc,CAC1C,IAAI,EAAE,uBAAuB,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAyFvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getTranslations } from "next-intl/server";
|
|
2
|
+
import { escapeHtml } from "../lib/auth/security-notifications/templates/shared.js";
|
|
2
3
|
const APP_NAME_FALLBACK = process.env.NEXT_PUBLIC_APP_NAME || "Your App";
|
|
3
4
|
async function teamInvitation(data, locale) {
|
|
4
5
|
const t = await getTranslations({ locale, namespace: "email.teamInvitation" });
|
|
@@ -32,7 +33,7 @@ async function teamInvitation(data, locale) {
|
|
|
32
33
|
<h2 style="color: #333333; font-size: 24px; margin: 0 0 20px 0; font-weight: 600;">${t("title")}</h2>
|
|
33
34
|
|
|
34
35
|
<p style="color: #666666; font-size: 16px; line-height: 1.6; margin: 0 0 20px 0;">
|
|
35
|
-
${t("bodyIntro", { inviterName: data.inviterName, teamName: data.teamName, role: data.role })}
|
|
36
|
+
${t("bodyIntro", { inviterName: escapeHtml(data.inviterName), teamName: escapeHtml(data.teamName), role: data.role })}
|
|
36
37
|
</p>
|
|
37
38
|
|
|
38
39
|
<p style="color: #666666; font-size: 16px; line-height: 1.6; margin: 0 0 30px 0;">
|
|
@@ -74,7 +75,7 @@ async function teamInvitation(data, locale) {
|
|
|
74
75
|
${t("copyright", { year, appName })}
|
|
75
76
|
</p>
|
|
76
77
|
<p style="color: #999999; font-size: 12px; margin: 0;">
|
|
77
|
-
${t("footerSentTo", { inviteeEmail: data.inviteeEmail })}<br>
|
|
78
|
+
${t("footerSentTo", { inviteeEmail: escapeHtml(data.inviteeEmail) })}<br>
|
|
78
79
|
${t("footerUnexpected")}
|
|
79
80
|
</p>
|
|
80
81
|
</td>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["../../src/emails/verify-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAI9E,wBAA8B,WAAW,CACvC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"verify-email.d.ts","sourceRoot":"","sources":["../../src/emails/verify-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAI9E,wBAA8B,WAAW,CACvC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,CAAC,CAgFvB"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from './useFeature';
|
|
|
17
17
|
export * from './useInvoice';
|
|
18
18
|
export * from './useInvoices';
|
|
19
19
|
export * from './useLastAuthMethod';
|
|
20
|
+
export * from './useSessionCookieRefresh';
|
|
20
21
|
export * from './useLocale';
|
|
21
22
|
export * from './useMedia';
|
|
22
23
|
export * from './useMediaUpload';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAGA,cAAc,4BAA4B,CAAA;AAC1C,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAGA,cAAc,4BAA4B,CAAA;AAC1C,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,+BAA+B,CAAA;AAC7C,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA;AACvC,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,0BAA0B,CAAA;AACxC,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,WAAW,CAAA;AACzB,cAAc,sBAAsB,CAAA;AACpC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,wBAAwB,CAAA"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -17,6 +17,7 @@ export * from "./useFeature.js";
|
|
|
17
17
|
export * from "./useInvoice.js";
|
|
18
18
|
export * from "./useInvoices.js";
|
|
19
19
|
export * from "./useLastAuthMethod.js";
|
|
20
|
+
export * from "./useSessionCookieRefresh.js";
|
|
20
21
|
export * from "./useLocale.js";
|
|
21
22
|
export * from "./useMedia.js";
|
|
22
23
|
export * from "./useMediaUpload.js";
|
package/dist/hooks/useAuth.d.ts
CHANGED
|
@@ -102,6 +102,35 @@ export declare function useAuth(): {
|
|
|
102
102
|
})>;
|
|
103
103
|
signOut: () => Promise<void>;
|
|
104
104
|
googleSignIn: (redirectTo?: string) => Promise<void>;
|
|
105
|
+
sendOtp: (email: string) => Promise<{
|
|
106
|
+
success: boolean;
|
|
107
|
+
}>;
|
|
108
|
+
signInWithOtp: ({ email, otp, redirectTo }: {
|
|
109
|
+
email: string;
|
|
110
|
+
otp: string;
|
|
111
|
+
redirectTo?: string;
|
|
112
|
+
}) => Promise<Omit<{
|
|
113
|
+
token: string;
|
|
114
|
+
user: {
|
|
115
|
+
id: string;
|
|
116
|
+
createdAt: Date;
|
|
117
|
+
updatedAt: Date;
|
|
118
|
+
email: string;
|
|
119
|
+
emailVerified: boolean;
|
|
120
|
+
name: string;
|
|
121
|
+
image?: string | null | undefined;
|
|
122
|
+
};
|
|
123
|
+
}, "user"> & {
|
|
124
|
+
user: import("better-auth").StripEmptyObjects<{
|
|
125
|
+
id: string;
|
|
126
|
+
createdAt: Date;
|
|
127
|
+
updatedAt: Date;
|
|
128
|
+
emailVerified: boolean;
|
|
129
|
+
name: string;
|
|
130
|
+
email?: string;
|
|
131
|
+
image?: string;
|
|
132
|
+
} & {} & {}>;
|
|
133
|
+
}>;
|
|
105
134
|
resetPassword: (email: string) => Promise<{
|
|
106
135
|
success: boolean;
|
|
107
136
|
data: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAS9C,wBAAgB,OAAO;
|
|
1
|
+
{"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/hooks/useAuth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAS9C,wBAAgB,OAAO;UA4OS,WAAW,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;8CAtOa;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;+DAmBvC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAuE1H,MAAM;qBAhCjB,MAAM;;;gDAgBiB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;iBA8Kyf,CAAC;;;;;;;;;;;;;2BAlJ9jB,MAAM;;;;;;;;;;;;kCA6BC,MAAM,UAAU,MAAM;;;;;;;;;;;sCAwClB,MAAM,eAAe,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCA8B5B,MAAM;;;;;;;;;;;;;;;EA+C3D"}
|
package/dist/hooks/useAuth.js
CHANGED
|
@@ -29,6 +29,7 @@ function useAuth() {
|
|
|
29
29
|
email,
|
|
30
30
|
password,
|
|
31
31
|
name: `${firstName || ""} ${lastName || ""}`.trim() || email.split("@")[0],
|
|
32
|
+
// @ts-expect-error — pre-existing type error, tracked in https://github.com/NextSpark-js/nextspark/issues/131
|
|
32
33
|
firstName,
|
|
33
34
|
lastName
|
|
34
35
|
},
|
|
@@ -48,6 +49,27 @@ function useAuth() {
|
|
|
48
49
|
await authClient.signOut();
|
|
49
50
|
router.push("/login");
|
|
50
51
|
};
|
|
52
|
+
const handleSendOtp = async (email) => {
|
|
53
|
+
const { data, error } = await authClient.emailOtp.sendVerificationOtp({
|
|
54
|
+
email,
|
|
55
|
+
type: "sign-in"
|
|
56
|
+
});
|
|
57
|
+
if (error) {
|
|
58
|
+
throw new Error(error.message || "Failed to send the sign-in code");
|
|
59
|
+
}
|
|
60
|
+
return data;
|
|
61
|
+
};
|
|
62
|
+
const handleOtpSignIn = async ({ email, otp, redirectTo }) => {
|
|
63
|
+
const { data, error } = await authClient.signIn.emailOtp({ email, otp });
|
|
64
|
+
if (error) {
|
|
65
|
+
throw new Error(error.message || "Invalid or expired code");
|
|
66
|
+
}
|
|
67
|
+
if (data) {
|
|
68
|
+
saveAuthMethod("email");
|
|
69
|
+
router.push(redirectTo || "/dashboard");
|
|
70
|
+
}
|
|
71
|
+
return data;
|
|
72
|
+
};
|
|
51
73
|
const handleGoogleSignIn = async (redirectTo) => {
|
|
52
74
|
const callbackURL = redirectTo ? `${redirectTo}${redirectTo.includes("?") ? "&" : "?"}auth_method=google` : "/dashboard?auth_method=google";
|
|
53
75
|
await authClient.signIn.social({
|
|
@@ -174,6 +196,8 @@ function useAuth() {
|
|
|
174
196
|
signUp: handleSignUp,
|
|
175
197
|
signOut: handleSignOut,
|
|
176
198
|
googleSignIn: handleGoogleSignIn,
|
|
199
|
+
sendOtp: handleSendOtp,
|
|
200
|
+
signInWithOtp: handleOtpSignIn,
|
|
177
201
|
resetPassword: handleResetPassword,
|
|
178
202
|
updatePassword: handleUpdatePassword,
|
|
179
203
|
changePassword: handleChangePassword,
|
|
@@ -1,6 +1,28 @@
|
|
|
1
|
+
interface UserMetadata {
|
|
2
|
+
uiPreferences?: {
|
|
3
|
+
theme?: string;
|
|
4
|
+
sidebarCollapsed?: boolean;
|
|
5
|
+
};
|
|
6
|
+
securityPreferences?: {
|
|
7
|
+
loginAlertsEnabled?: boolean;
|
|
8
|
+
};
|
|
9
|
+
notificationsPreferences?: Record<string, boolean>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Returns the default blocks (uiPreferences, securityPreferences,
|
|
13
|
+
* notificationsPreferences) that are still missing from the user's meta.
|
|
14
|
+
*
|
|
15
|
+
* Each block is checked independently: other flows (onboarding progress, tours,
|
|
16
|
+
* active team pointer, ...) write their own keys into `meta` early, so an
|
|
17
|
+
* "is meta empty?" guard would almost never fire for real users (see #119).
|
|
18
|
+
* Only the missing blocks are returned so existing preferences are never
|
|
19
|
+
* overwritten.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getMissingMetadataDefaults(meta: UserMetadata | null | undefined): Partial<UserMetadata>;
|
|
1
22
|
/**
|
|
2
23
|
* Hook to ensure user has default metadata
|
|
3
24
|
* Uses TanStack Query for proper caching and deduplication
|
|
4
25
|
*/
|
|
5
26
|
export declare function useEnsureUserMetadata(): void;
|
|
27
|
+
export {};
|
|
6
28
|
//# sourceMappingURL=useEnsureUserMetadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useEnsureUserMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useEnsureUserMetadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useEnsureUserMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useEnsureUserMetadata.ts"],"names":[],"mappings":"AAOA,UAAU,YAAY;IACpB,aAAa,CAAC,EAAE;QACd,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAC3B,CAAA;IACD,mBAAmB,CAAC,EAAE;QACpB,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAC7B,CAAA;IACD,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnD;AA0CD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GACpC,OAAO,CAAC,YAAY,CAAC,CASvB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,SAgEpC"}
|
|
@@ -33,6 +33,17 @@ const DEFAULT_METADATA = {
|
|
|
33
33
|
featureAnnouncementsPush: false
|
|
34
34
|
}
|
|
35
35
|
};
|
|
36
|
+
const METADATA_BLOCKS = Object.keys(DEFAULT_METADATA);
|
|
37
|
+
function getMissingMetadataDefaults(meta) {
|
|
38
|
+
const missing = {};
|
|
39
|
+
for (const block of METADATA_BLOCKS) {
|
|
40
|
+
const current = meta == null ? void 0 : meta[block];
|
|
41
|
+
if (current === null || current === void 0) {
|
|
42
|
+
missing[block] = DEFAULT_METADATA[block];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return missing;
|
|
46
|
+
}
|
|
36
47
|
function useEnsureUserMetadata() {
|
|
37
48
|
var _a, _b;
|
|
38
49
|
const session = authClient.useSession();
|
|
@@ -57,7 +68,7 @@ function useEnsureUserMetadata() {
|
|
|
57
68
|
// 30 minutes cache
|
|
58
69
|
});
|
|
59
70
|
const createMetadataMutation = useMutation({
|
|
60
|
-
mutationFn: async () => {
|
|
71
|
+
mutationFn: async (metadata) => {
|
|
61
72
|
const response = await fetch("/api/internal/user-metadata", {
|
|
62
73
|
method: "POST",
|
|
63
74
|
headers: {
|
|
@@ -65,7 +76,7 @@ function useEnsureUserMetadata() {
|
|
|
65
76
|
},
|
|
66
77
|
body: JSON.stringify({
|
|
67
78
|
userId,
|
|
68
|
-
metadata
|
|
79
|
+
metadata
|
|
69
80
|
})
|
|
70
81
|
});
|
|
71
82
|
if (!response.ok) {
|
|
@@ -82,14 +93,16 @@ function useEnsureUserMetadata() {
|
|
|
82
93
|
});
|
|
83
94
|
useEffect(() => {
|
|
84
95
|
if (!isFetched || !userData || hasCreatedMetadata.current) return;
|
|
85
|
-
const
|
|
96
|
+
const missingDefaults = getMissingMetadataDefaults(userData.meta);
|
|
97
|
+
const needsMetadata = Object.keys(missingDefaults).length > 0;
|
|
86
98
|
if (needsMetadata && !createMetadataMutation.isPending) {
|
|
87
99
|
hasCreatedMetadata.current = true;
|
|
88
|
-
console.log("Creating default metadata for user:", userId);
|
|
89
|
-
createMetadataMutation.mutate();
|
|
100
|
+
console.log("Creating default metadata for user:", userId, Object.keys(missingDefaults));
|
|
101
|
+
createMetadataMutation.mutate(missingDefaults);
|
|
90
102
|
}
|
|
91
103
|
}, [isFetched, userData, userId, createMetadataMutation]);
|
|
92
104
|
}
|
|
93
105
|
export {
|
|
106
|
+
getMissingMetadataDefaults,
|
|
94
107
|
useEnsureUserMetadata
|
|
95
108
|
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface UseSessionCookieRefreshOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Minimum time between two refresh calls, in milliseconds. Every trigger
|
|
4
|
+
* inside this window is ignored. Default: 5 minutes (matches the default
|
|
5
|
+
* session cookie cache, so at most one extra DB read per 5 minutes).
|
|
6
|
+
*/
|
|
7
|
+
minIntervalMs?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Also refresh once right after mount — i.e. every time the app is opened
|
|
10
|
+
* (PWA cold start, full reload). Default: true.
|
|
11
|
+
*/
|
|
12
|
+
refreshOnMount?: boolean;
|
|
13
|
+
/** Set to false to turn the hook off (e.g. on public/auth pages). Default: true. */
|
|
14
|
+
enabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_SESSION_REFRESH_INTERVAL_MS: number;
|
|
17
|
+
/**
|
|
18
|
+
* Keep the session cookie alive for installed PWAs / long-lived tabs.
|
|
19
|
+
*
|
|
20
|
+
* Server Component renders read the session with `disableRefresh`, so they
|
|
21
|
+
* never renew the cookie (Next.js cannot write cookies during render). This
|
|
22
|
+
* hook triggers the real renewal through Better Auth's `get-session` Route
|
|
23
|
+
* Handler — where `Set-Cookie` works — whenever the app is (re)opened:
|
|
24
|
+
*
|
|
25
|
+
* - on mount (app open / reload), unless `refreshOnMount: false`
|
|
26
|
+
* - when the document becomes visible again (`visibilitychange`, `focus`,
|
|
27
|
+
* `pageshow` for bfcache restores)
|
|
28
|
+
* - when connectivity comes back (`online`)
|
|
29
|
+
*
|
|
30
|
+
* Calls are throttled by `minIntervalMs`; a failed call (offline, server
|
|
31
|
+
* down) does not count towards the throttle, so the next trigger retries.
|
|
32
|
+
* Anonymous visitors just get a cheap `null` session response.
|
|
33
|
+
*/
|
|
34
|
+
export declare function useSessionCookieRefresh(options?: UseSessionCookieRefreshOptions): void;
|
|
35
|
+
//# sourceMappingURL=useSessionCookieRefresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSessionCookieRefresh.d.ts","sourceRoot":"","sources":["../../src/hooks/useSessionCookieRefresh.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,mCAAmC,QAAgB,CAAA;AAEhE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,8BAAmC,QAmDnF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { refreshSessionCookie } from "../lib/auth-client.js";
|
|
4
|
+
const DEFAULT_SESSION_REFRESH_INTERVAL_MS = 5 * 60 * 1e3;
|
|
5
|
+
function useSessionCookieRefresh(options = {}) {
|
|
6
|
+
const {
|
|
7
|
+
minIntervalMs = DEFAULT_SESSION_REFRESH_INTERVAL_MS,
|
|
8
|
+
refreshOnMount = true,
|
|
9
|
+
enabled = true
|
|
10
|
+
} = options;
|
|
11
|
+
const lastRefreshAtRef = useRef(0);
|
|
12
|
+
const inFlightRef = useRef(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!enabled || typeof window === "undefined") return;
|
|
15
|
+
const refresh = async () => {
|
|
16
|
+
if (inFlightRef.current) return;
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
if (now - lastRefreshAtRef.current < minIntervalMs) return;
|
|
19
|
+
inFlightRef.current = true;
|
|
20
|
+
lastRefreshAtRef.current = now;
|
|
21
|
+
try {
|
|
22
|
+
await refreshSessionCookie();
|
|
23
|
+
} catch {
|
|
24
|
+
lastRefreshAtRef.current = 0;
|
|
25
|
+
} finally {
|
|
26
|
+
inFlightRef.current = false;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const onVisibilityChange = () => {
|
|
30
|
+
if (document.visibilityState === "visible") void refresh();
|
|
31
|
+
};
|
|
32
|
+
const onWake = () => void refresh();
|
|
33
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
34
|
+
window.addEventListener("focus", onWake);
|
|
35
|
+
window.addEventListener("pageshow", onWake);
|
|
36
|
+
window.addEventListener("online", onWake);
|
|
37
|
+
if (refreshOnMount) void refresh();
|
|
38
|
+
return () => {
|
|
39
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
40
|
+
window.removeEventListener("focus", onWake);
|
|
41
|
+
window.removeEventListener("pageshow", onWake);
|
|
42
|
+
window.removeEventListener("online", onWake);
|
|
43
|
+
};
|
|
44
|
+
}, [enabled, minIntervalMs, refreshOnMount]);
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
DEFAULT_SESSION_REFRESH_INTERVAL_MS,
|
|
48
|
+
useSessionCookieRefresh
|
|
49
|
+
};
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
export declare const API_ERROR_CODES: {
|
|
8
8
|
/** Role-based permission check failed (checkPermission) */
|
|
9
9
|
readonly PERMISSION_DENIED: "PERMISSION_DENIED";
|
|
10
|
-
/** API key scope
|
|
10
|
+
/** API key lacks the scope the route declared (authenticateRequest / hasRequiredScope) */
|
|
11
11
|
readonly INSUFFICIENT_SCOPE: "INSUFFICIENT_SCOPE";
|
|
12
|
+
/** Route declared no required API key scope, so API keys are rejected (fail closed, #93) */
|
|
13
|
+
readonly SCOPE_NOT_DECLARED: "SCOPE_NOT_DECLARED";
|
|
12
14
|
};
|
|
13
15
|
export type ApiErrorCode = typeof API_ERROR_CODES[keyof typeof API_ERROR_CODES];
|
|
14
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,2DAA2D;;IAE3D,
|
|
1
|
+
{"version":3,"file":"api-error.d.ts","sourceRoot":"","sources":["../../../src/lib/api/api-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;IAC1B,2DAA2D;;IAE3D,0FAA0F;;IAE1F,4FAA4F;;CAEpF,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAA;AAE/E;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;gBAEL,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;IAa5F;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;;;;OAKG;WACU,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;CAqC1F"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
const API_ERROR_CODES = {
|
|
2
2
|
/** Role-based permission check failed (checkPermission) */
|
|
3
3
|
PERMISSION_DENIED: "PERMISSION_DENIED",
|
|
4
|
-
/** API key scope
|
|
5
|
-
INSUFFICIENT_SCOPE: "INSUFFICIENT_SCOPE"
|
|
4
|
+
/** API key lacks the scope the route declared (authenticateRequest / hasRequiredScope) */
|
|
5
|
+
INSUFFICIENT_SCOPE: "INSUFFICIENT_SCOPE",
|
|
6
|
+
/** Route declared no required API key scope, so API keys are rejected (fail closed, #93) */
|
|
7
|
+
SCOPE_NOT_DECLARED: "SCOPE_NOT_DECLARED"
|
|
6
8
|
};
|
|
7
9
|
class ApiError extends Error {
|
|
8
10
|
code;
|