@nextsparkjs/core 0.1.0-beta.184 → 0.1.0-beta.186
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/SuperAdminGuard.d.ts.map +1 -1
- 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/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/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 +103 -25
- 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/hooks/useValidationSchemas.d.ts +7 -7
- 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 +45 -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 +35 -3
- package/dist/lib/api/auth.d.ts.map +1 -1
- package/dist/lib/api/auth.js +54 -23
- 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 -155
- 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/security-notifications/types.js +0 -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 +1489 -3445
- package/dist/lib/auth-client.d.ts.map +1 -1
- package/dist/lib/auth-client.js +4 -0
- package/dist/lib/auth.d.ts +1 -3057
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +21 -8
- 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/schema.d.ts +1 -1
- 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/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 +8 -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 +21 -0
- package/dist/lib/mcp/audit.d.ts.map +1 -0
- package/dist/lib/mcp/audit.js +48 -0
- package/dist/lib/mcp/engine.d.ts +28 -0
- package/dist/lib/mcp/engine.d.ts.map +1 -0
- package/dist/lib/mcp/engine.js +158 -0
- package/dist/lib/mcp/errors.d.ts +16 -0
- package/dist/lib/mcp/errors.d.ts.map +1 -0
- package/dist/lib/mcp/errors.js +66 -0
- package/dist/lib/mcp/executor.d.ts +15 -0
- package/dist/lib/mcp/executor.d.ts.map +1 -0
- package/dist/lib/mcp/executor.js +63 -0
- package/dist/lib/mcp/index.d.ts +9 -0
- package/dist/lib/mcp/index.d.ts.map +1 -0
- package/dist/lib/mcp/index.js +32 -0
- package/dist/lib/mcp/schema-builder.d.ts +45 -0
- package/dist/lib/mcp/schema-builder.d.ts.map +1 -0
- package/dist/lib/mcp/schema-builder.js +212 -0
- package/dist/lib/mcp/tool-generator.d.ts +31 -0
- package/dist/lib/mcp/tool-generator.d.ts.map +1 -0
- package/dist/lib/mcp/tool-generator.js +271 -0
- package/dist/lib/mcp/transport.d.ts +31 -0
- package/dist/lib/mcp/transport.d.ts.map +1 -0
- package/dist/lib/mcp/transport.js +58 -0
- package/dist/lib/mcp/types.d.ts +184 -0
- package/dist/lib/mcp/types.d.ts.map +1 -0
- package/dist/lib/mcp/types.js +11 -0
- 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/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/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/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/messages/de/auth.json +25 -2
- package/dist/messages/de/index.d.ts +81 -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/en/auth.json +25 -2
- package/dist/messages/en/index.d.ts +81 -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/es/auth.json +25 -2
- package/dist/messages/es/index.d.ts +81 -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/fr/auth.json +25 -2
- package/dist/messages/fr/index.d.ts +81 -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/it/auth.json +25 -2
- package/dist/messages/it/index.d.ts +81 -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/pt/auth.json +25 -2
- package/dist/messages/pt/index.d.ts +81 -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/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/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 +176 -0
- 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 +35 -45
- 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 +9 -14
- package/dist/templates/app/layout.tsx +39 -19
- 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 +20 -12
- package/scripts/build/registry/__tests__/mcp-registry.test.mjs +64 -0
- package/scripts/build/registry/__tests__/scope-registry.test.mjs +106 -0
- package/scripts/build/registry/discovery/mcp-overrides.mjs +72 -0
- package/scripts/build/registry/discovery/mcp-overrides.test.mjs +86 -0
- package/scripts/build/registry/generators/mcp-registry.mjs +61 -0
- package/scripts/build/registry/generators/scope-registry.mjs +140 -88
- package/scripts/build/registry.mjs +8 -4
- 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 +176 -0
- 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 +35 -45
- 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 +9 -14
- package/templates/app/layout.tsx +39 -19
- 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__/@nextsparkjs/registries/scope-registry.ts +56 -6
- package/tests/jest/__mocks__/next-server.js +24 -0
- package/dist/styles/classes.json +0 -1093
- package/dist/styles/ui.css +0 -2
- package/scripts/build/build-ui-css.mjs +0 -351
|
@@ -8,9 +8,15 @@ class TeamMemberService {
|
|
|
8
8
|
/**
|
|
9
9
|
* Get team member by team and user ID
|
|
10
10
|
*
|
|
11
|
+
* Only resolves memberships of active teams. Team deletion is a soft delete
|
|
12
|
+
* (UPDATE "teams" SET "deletedAt"), which never fires the ON DELETE CASCADE
|
|
13
|
+
* on team_members, so membership rows outlive the team. A member of a
|
|
14
|
+
* soft-deleted team is reported as "not a member" (null), the same shape
|
|
15
|
+
* callers already handle for users who were never on the team (issue #88).
|
|
16
|
+
*
|
|
11
17
|
* @param teamId - Team ID
|
|
12
18
|
* @param userId - User ID
|
|
13
|
-
* @returns Team member or null if not found
|
|
19
|
+
* @returns Team member or null if not found (or if the team is soft-deleted)
|
|
14
20
|
*
|
|
15
21
|
* @example
|
|
16
22
|
* const member = await TeamMemberService.getByTeamAndUser('team-123', 'user-456')
|
|
@@ -20,7 +26,10 @@ class TeamMemberService {
|
|
|
20
26
|
return null;
|
|
21
27
|
}
|
|
22
28
|
return queryOneWithRLS(
|
|
23
|
-
|
|
29
|
+
`SELECT tm.*
|
|
30
|
+
FROM "team_members" tm
|
|
31
|
+
INNER JOIN "teams" t ON t.id = tm."teamId"
|
|
32
|
+
WHERE tm."teamId" = $1 AND tm."userId" = $2 AND t."deletedAt" IS NULL`,
|
|
24
33
|
[teamId, userId],
|
|
25
34
|
userId
|
|
26
35
|
);
|
|
@@ -64,9 +73,12 @@ class TeamMemberService {
|
|
|
64
73
|
/**
|
|
65
74
|
* Get user's role in a team
|
|
66
75
|
*
|
|
76
|
+
* Only resolves roles in active teams: a member of a soft-deleted team
|
|
77
|
+
* (teams."deletedAt" set) is reported as not a member (issue #88).
|
|
78
|
+
*
|
|
67
79
|
* @param teamId - Team ID
|
|
68
80
|
* @param userId - User ID
|
|
69
|
-
* @returns The user's role or null if not a member
|
|
81
|
+
* @returns The user's role or null if not a member (or if the team is soft-deleted)
|
|
70
82
|
*
|
|
71
83
|
* @example
|
|
72
84
|
* const role = await TeamMemberService.getRole('team-123', 'user-456')
|
|
@@ -76,7 +88,10 @@ class TeamMemberService {
|
|
|
76
88
|
return null;
|
|
77
89
|
}
|
|
78
90
|
const member = await queryOneWithRLS(
|
|
79
|
-
|
|
91
|
+
`SELECT tm.role
|
|
92
|
+
FROM "team_members" tm
|
|
93
|
+
INNER JOIN "teams" t ON t.id = tm."teamId"
|
|
94
|
+
WHERE tm."teamId" = $1 AND tm."userId" = $2 AND t."deletedAt" IS NULL`,
|
|
80
95
|
[teamId, userId],
|
|
81
96
|
userId
|
|
82
97
|
);
|
|
@@ -281,9 +296,12 @@ class TeamMemberService {
|
|
|
281
296
|
/**
|
|
282
297
|
* Check if user is a member of a team
|
|
283
298
|
*
|
|
299
|
+
* Only counts membership in active teams: a member of a soft-deleted team
|
|
300
|
+
* (teams."deletedAt" set) is reported as not a member (issue #88).
|
|
301
|
+
*
|
|
284
302
|
* @param teamId - Team ID
|
|
285
303
|
* @param userId - User ID
|
|
286
|
-
* @returns True if user is a member
|
|
304
|
+
* @returns True if user is a member of an active team
|
|
287
305
|
*
|
|
288
306
|
* @example
|
|
289
307
|
* const isMember = await TeamMemberService.isMember('team-123', 'user-456')
|
|
@@ -293,7 +311,10 @@ class TeamMemberService {
|
|
|
293
311
|
return false;
|
|
294
312
|
}
|
|
295
313
|
const member = await queryOneWithRLS(
|
|
296
|
-
|
|
314
|
+
`SELECT tm.id
|
|
315
|
+
FROM "team_members" tm
|
|
316
|
+
INNER JOIN "teams" t ON t.id = tm."teamId"
|
|
317
|
+
WHERE tm."teamId" = $1 AND tm."userId" = $2 AND t."deletedAt" IS NULL`,
|
|
297
318
|
[teamId, userId],
|
|
298
319
|
userId
|
|
299
320
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/team.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAOpD,MAAM,WAAW,mBAAoB,SAAQ,IAAI;IAC/C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAMD,qBAAa,WAAW;IAKtB;;;;;;;;;OASG;WACU,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAY3E;;;;;;;;OAQG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW1D;;;;;;;;OAQG;WACU,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAO9C;;;;;;;;OAQG;WACU,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C;;;;;;;;OAQG;WACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"team.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/team.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAOpD,MAAM,WAAW,mBAAoB,SAAQ,IAAI;IAC/C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAMD,qBAAa,WAAW;IAKtB;;;;;;;;;OASG;WACU,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAY3E;;;;;;;;OAQG;WACU,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW1D;;;;;;;;OAQG;WACU,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAO9C;;;;;;;;OAQG;WACU,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAK1C;;;;;;;;OAQG;WACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA4CrE;;;;;;;;;OASG;WACU,kBAAkB,CAC7B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA2BtC;;;;;;;;OAQG;WACU,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,GAAG,IAAI,CAAC;IAmBT;;;;;;;;OAQG;WACU,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAgB1D;;;;;;;;;;OAUG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsEjE;;;;;;;;;;OAUG;WACU,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IA+DhB;;;;;;;;;OASG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoClE;;;;;;;;;OASG;WACU,eAAe,CAC1B,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC;IAoBnB;;;;;;;;;OASG;WACU,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmC5D;;;;;;;;;;OAUG;WACU,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0B3E;;;;;;;;OAQG;WACU,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAYtD"}
|
|
@@ -133,7 +133,9 @@ export declare function isInvitableRole(role: string): boolean;
|
|
|
133
133
|
export declare function getInvitableRoles(): string[];
|
|
134
134
|
/**
|
|
135
135
|
* Validate role transition
|
|
136
|
-
* Check if changing from one role to another is allowed
|
|
136
|
+
* Check if changing from one role to another is allowed.
|
|
137
|
+
*
|
|
138
|
+
* The actor must strictly outrank BOTH the current role and the new role.
|
|
137
139
|
*
|
|
138
140
|
* @param fromRole - Current role
|
|
139
141
|
* @param toRole - New role
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,WAAW,GACX,aAAa,GACb,mBAAmB,GACnB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,CAAA;AAEzB;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAYhD,CAAA;AAuCD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAgC,CAAA;AAM7F;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,EAC1B,aAAa,GAAE,OAAe,GAC7B,OAAO,CAWT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAC7B,cAAc,EAAE,CAQlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,cAAc,GACzB,OAAO,CAcT;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAExD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAKT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAIT;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAI5C;AAMD
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAA;AAE9C;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,WAAW,GACX,WAAW,GACX,aAAa,GACb,mBAAmB,GACnB,qBAAqB,GACrB,qBAAqB,GACrB,0BAA0B,GAC1B,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,CAAA;AAEzB;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAYhD,CAAA;AAuCD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAgC,CAAA;AAM7F;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,EAC1B,aAAa,GAAE,OAAe,GAC7B,OAAO,CAWT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,OAAe,GAC7B,cAAc,EAAE,CAQlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,cAAc,GACzB,OAAO,CAcT;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAExD;AAMD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAKT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAIT;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD;AAMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,EAAE,CAI5C;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCvC"}
|
|
@@ -97,6 +97,12 @@ function validateRoleTransition(fromRole, toRole, actorRole) {
|
|
|
97
97
|
reason: "You do not have permission to change this user's role."
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
+
if (!canManageRole(actorRole, toRole)) {
|
|
101
|
+
return {
|
|
102
|
+
allowed: false,
|
|
103
|
+
reason: "You cannot assign a role equal to or higher than your own."
|
|
104
|
+
};
|
|
105
|
+
}
|
|
100
106
|
return { allowed: true };
|
|
101
107
|
}
|
|
102
108
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/lib/teams/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,cAAc,aAI1B,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;EAAyD,CAAA;AAG5F,eAAO,MAAM,UAAU;;;;;;;;;;iBAerB,CAAA;AAGF,eAAO,MAAM,gBAAgB;;;;;;;;;iBAS3B,CAAA;AAGF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;iBAa/B,CAAA;AAGF,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAA;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;;iBAOhC,CAAA;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAA;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;;;;;iBAAqD,CAAA;AAElF,eAAO,MAAM,kBAAkB;;;iBAO7B,CAAA;AAEF,eAAO,MAAM,sBAAsB;;iBAMjC,CAAA;AAGF,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAA;AAGF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;iBAK9B,CAAA;AAEF,eAAO,MAAM,qBAAqB;;;;;iBAGhC,CAAA;AAEF,eAAO,MAAM,yBAAyB;;;;;;;;;iBAEpC,CAAA;AAGF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAA;AACnD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACvE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC/D,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACzE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACzE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AACnE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAC3E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AACrE,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AACzE,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA"}
|
package/dist/lib/teams/schema.js
CHANGED
|
@@ -3,6 +3,7 @@ import { AVAILABLE_ROLES } from "@nextsparkjs/registries/permissions-registry";
|
|
|
3
3
|
import { getInvitableRoles } from "./permissions.js";
|
|
4
4
|
const teamRoleSchema = z.string().refine(
|
|
5
5
|
(role) => AVAILABLE_ROLES.includes(role),
|
|
6
|
+
// @ts-expect-error — pre-existing type error, tracked in https://github.com/NextSpark-js/nextspark/issues/131
|
|
6
7
|
(role) => ({ message: `Invalid team role: ${role}. Must be one of: ${[...AVAILABLE_ROLES].join(", ")}` })
|
|
7
8
|
);
|
|
8
9
|
const invitationStatusSchema = z.enum(["pending", "accepted", "declined", "expired"]);
|
|
@@ -65,6 +66,7 @@ const inviteMemberSchema = z.object({
|
|
|
65
66
|
email: z.string().email("Invalid email address"),
|
|
66
67
|
role: z.string().refine(
|
|
67
68
|
(role) => getInvitableRoles().includes(role),
|
|
69
|
+
// @ts-expect-error — pre-existing type error, tracked in https://github.com/NextSpark-js/nextspark/issues/131
|
|
68
70
|
(role) => ({ message: `Role must be one of: ${getInvitableRoles().join(", ")}` })
|
|
69
71
|
)
|
|
70
72
|
// Cannot invite as owner
|
|
@@ -72,6 +74,7 @@ const inviteMemberSchema = z.object({
|
|
|
72
74
|
const updateMemberRoleSchema = z.object({
|
|
73
75
|
role: z.string().refine(
|
|
74
76
|
(role) => getInvitableRoles().includes(role),
|
|
77
|
+
// @ts-expect-error — pre-existing type error, tracked in https://github.com/NextSpark-js/nextspark/issues/131
|
|
75
78
|
(role) => ({ message: `Role must be one of: ${getInvitableRoles().join(", ")}` })
|
|
76
79
|
)
|
|
77
80
|
// Cannot promote to owner
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route-based forced theme
|
|
3
|
+
*
|
|
4
|
+
* Resolves the theme that must be forced for a given pathname from the
|
|
5
|
+
* `forcedThemeRoutes` map declared in `theme.config.ts`. The result is passed
|
|
6
|
+
* to next-themes' `forcedTheme` prop on the single root ThemeProvider, so the
|
|
7
|
+
* blocking script, SSR output and client hydration all agree from the very
|
|
8
|
+
* first paint (no flash, no post-hydration correction).
|
|
9
|
+
*
|
|
10
|
+
* Matching rules:
|
|
11
|
+
* - Keys are route prefixes matched at segment boundaries:
|
|
12
|
+
* `'/login'` matches `/login` and `/login/verify`, but not `/login-help`.
|
|
13
|
+
* - `'/'` matches every route.
|
|
14
|
+
* - When several prefixes match, the longest (most specific) one wins.
|
|
15
|
+
* - Query strings, hashes and trailing slashes are ignored.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* forcedThemeRoutes: { '/login': 'light', '/signup': 'light', '/embed': 'dark' }
|
|
19
|
+
*/
|
|
20
|
+
export type ForcedThemeMode = 'light' | 'dark';
|
|
21
|
+
/** Route prefix → theme to force on that route subtree */
|
|
22
|
+
export type ForcedThemeRoutes = Record<string, ForcedThemeMode>;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the forced theme for a pathname.
|
|
25
|
+
*
|
|
26
|
+
* Pure function (no Next.js imports) so it can run on the server, in client
|
|
27
|
+
* components and in unit tests.
|
|
28
|
+
*
|
|
29
|
+
* @param pathname - Current pathname (e.g. from `usePathname()` or the `x-pathname` header)
|
|
30
|
+
* @param routes - `forcedThemeRoutes` from the active theme config
|
|
31
|
+
* @returns The theme to force, or `undefined` when the route is not forced
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveForcedTheme(pathname: string | null | undefined, routes: ForcedThemeRoutes | null | undefined): ForcedThemeMode | undefined;
|
|
34
|
+
//# sourceMappingURL=forced-theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forced-theme.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/forced-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,MAAM,CAAA;AAE9C,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;AAmB/D;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,GAC3C,eAAe,GAAG,SAAS,CAkB7B"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const FORCED_THEME_MODES = ["light", "dark"];
|
|
2
|
+
function isForcedThemeMode(value) {
|
|
3
|
+
return typeof value === "string" && FORCED_THEME_MODES.includes(value);
|
|
4
|
+
}
|
|
5
|
+
function normalizePath(value) {
|
|
6
|
+
let path = value.split(/[?#]/)[0].trim();
|
|
7
|
+
if (!path.startsWith("/")) path = `/${path}`;
|
|
8
|
+
path = path.replace(/\/+$/, "");
|
|
9
|
+
return path === "" ? "/" : path;
|
|
10
|
+
}
|
|
11
|
+
function resolveForcedTheme(pathname, routes) {
|
|
12
|
+
if (!pathname || !routes) return void 0;
|
|
13
|
+
const path = normalizePath(pathname);
|
|
14
|
+
let best;
|
|
15
|
+
for (const [pattern, theme] of Object.entries(routes)) {
|
|
16
|
+
if (!isForcedThemeMode(theme)) continue;
|
|
17
|
+
const prefix = normalizePath(pattern);
|
|
18
|
+
const matches = prefix === "/" || path === prefix || path.startsWith(`${prefix}/`);
|
|
19
|
+
if (matches && (!best || prefix.length > best.length)) {
|
|
20
|
+
best = { length: prefix.length, theme };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return best == null ? void 0 : best.theme;
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
resolveForcedTheme
|
|
27
|
+
};
|
|
@@ -5,10 +5,13 @@
|
|
|
5
5
|
* 1. User logged in → use uiPreferences.theme from user meta
|
|
6
6
|
* 2. User not logged in → use defaultMode from theme.config
|
|
7
7
|
*/
|
|
8
|
+
import type { ForcedThemeRoutes } from './forced-theme';
|
|
8
9
|
type ThemeMode = 'light' | 'dark' | 'system';
|
|
9
10
|
export interface ThemeSettings {
|
|
10
11
|
defaultMode: ThemeMode;
|
|
11
12
|
allowUserToggle: boolean;
|
|
13
|
+
/** Route prefixes whose theme is forced (theme.config.ts → forcedThemeRoutes) */
|
|
14
|
+
forcedThemeRoutes?: ForcedThemeRoutes;
|
|
12
15
|
}
|
|
13
16
|
/**
|
|
14
17
|
* Get theme settings for the RootLayout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-default-theme-mode.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/get-default-theme-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"get-default-theme-mode.d.ts","sourceRoot":"","sources":["../../../src/lib/theme/get-default-theme-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,KAAK,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE5C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,SAAS,CAAA;IACtB,eAAe,EAAE,OAAO,CAAA;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAyB/D;AAiDD;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC,CAG9D"}
|
|
@@ -8,13 +8,14 @@ async function getThemeSettings() {
|
|
|
8
8
|
const appConfig = ThemeService.getAppConfig(activeThemeName);
|
|
9
9
|
const allowUserToggle = ((_b = (_a = appConfig == null ? void 0 : appConfig.ui) == null ? void 0 : _a.theme) == null ? void 0 : _b.allowUserToggle) ?? true;
|
|
10
10
|
const configDefaultMode = (themeConfig == null ? void 0 : themeConfig.defaultMode) || "system";
|
|
11
|
+
const forcedThemeRoutes = themeConfig == null ? void 0 : themeConfig.forcedThemeRoutes;
|
|
11
12
|
if (allowUserToggle) {
|
|
12
13
|
const userTheme = await getUserThemePreference();
|
|
13
14
|
if (userTheme) {
|
|
14
|
-
return { defaultMode: userTheme, allowUserToggle };
|
|
15
|
+
return { defaultMode: userTheme, allowUserToggle, forcedThemeRoutes };
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
|
-
return { defaultMode: configDefaultMode, allowUserToggle };
|
|
18
|
+
return { defaultMode: configDefaultMode, allowUserToggle, forcedThemeRoutes };
|
|
18
19
|
}
|
|
19
20
|
const VALID_THEME_MODES = ["light", "dark", "system"];
|
|
20
21
|
function isValidThemeMode(value) {
|
|
@@ -24,7 +25,8 @@ async function getUserThemePreference() {
|
|
|
24
25
|
var _a, _b, _c;
|
|
25
26
|
try {
|
|
26
27
|
const session = await auth.api.getSession({
|
|
27
|
-
headers: await headers()
|
|
28
|
+
headers: await headers(),
|
|
29
|
+
query: { disableRefresh: true }
|
|
28
30
|
});
|
|
29
31
|
if ((_a = session == null ? void 0 : session.user) == null ? void 0 : _a.id) {
|
|
30
32
|
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || "http://localhost:5173";
|
|
@@ -19,7 +19,21 @@
|
|
|
19
19
|
"submitHelp": "Druecken Sie Enter oder klicken Sie zum Anmelden",
|
|
20
20
|
"lastUsed": "Zuletzt verwendet",
|
|
21
21
|
"loginWithEmail": "Mit E-Mail anmelden",
|
|
22
|
-
"backToGoogle": "Zurueck zu Hauptoptionen"
|
|
22
|
+
"backToGoogle": "Zurueck zu Hauptoptionen",
|
|
23
|
+
"useOtp": "Lieber einen Einmalcode per E-Mail",
|
|
24
|
+
"usePassword": "Lieber mit Passwort anmelden",
|
|
25
|
+
"otp": {
|
|
26
|
+
"emailHelp": "Kein Passwort nötig – wir senden dir einen Einmalcode per E-Mail.",
|
|
27
|
+
"sendCode": "Anmeldecode per E-Mail senden",
|
|
28
|
+
"sendingCode": "Code wird gesendet...",
|
|
29
|
+
"codeSent": "Wir haben einen 6-stelligen Code an {email} gesendet. Er ist 5 Minuten gültig.",
|
|
30
|
+
"codeLabel": "Anmeldecode",
|
|
31
|
+
"codePlaceholder": "123456",
|
|
32
|
+
"verifyCode": "Mit Code anmelden",
|
|
33
|
+
"verifyingCode": "Code wird geprüft...",
|
|
34
|
+
"resendCode": "Code erneut senden",
|
|
35
|
+
"changeEmail": "Andere E-Mail verwenden"
|
|
36
|
+
}
|
|
23
37
|
},
|
|
24
38
|
"footer": {
|
|
25
39
|
"noAccount": "Noch kein Konto?",
|
|
@@ -34,7 +48,12 @@
|
|
|
34
48
|
"googleSigningIn": "Weiterleitung zu Google...",
|
|
35
49
|
"googleSignInSuccess": "Erfolgreich mit Google angemeldet",
|
|
36
50
|
"googleSignInFailed": "Google-Fehler",
|
|
37
|
-
"googleSignInError": "Google-Fehler: {error}"
|
|
51
|
+
"googleSignInError": "Google-Fehler: {error}",
|
|
52
|
+
"otpSending": "Anmeldecode wird gesendet...",
|
|
53
|
+
"otpSent": "Anmeldecode gesendet. Prüfe deinen Posteingang.",
|
|
54
|
+
"otpSendFailed": "Der Anmeldecode konnte nicht gesendet werden",
|
|
55
|
+
"otpVerifying": "Code wird geprüft...",
|
|
56
|
+
"otpVerifyFailed": "Der Code konnte nicht geprüft werden"
|
|
38
57
|
},
|
|
39
58
|
"errors": {
|
|
40
59
|
"invalidCredentials": "Ungueltige E-Mail oder Passwort",
|
|
@@ -46,6 +65,10 @@
|
|
|
46
65
|
"serverError": "Serverfehler. Bitte versuchen Sie es spaeter erneut",
|
|
47
66
|
"invalidEmail": "Ungueltige E-Mail-Adresse",
|
|
48
67
|
"passwordTooShort": "Das Passwort muss mindestens 6 Zeichen lang sein",
|
|
68
|
+
"otpInvalidCode": "Gib den 6-stelligen Code aus deiner E-Mail ein",
|
|
69
|
+
"otpInvalid": "Ungültiger Code. Bitte prüfen und erneut versuchen",
|
|
70
|
+
"otpExpired": "Dieser Code ist abgelaufen. Fordere einen neuen an",
|
|
71
|
+
"otpTooMany": "Zu viele Versuche. Fordere einen neuen Code an",
|
|
49
72
|
"google": {
|
|
50
73
|
"invalidCredentials": "Google-Authentifizierungsfehler",
|
|
51
74
|
"userNotFound": "Kein Konto fuer diesen Google-Benutzer gefunden",
|
|
@@ -248,6 +248,20 @@ declare const _default: {
|
|
|
248
248
|
lastUsed: string;
|
|
249
249
|
loginWithEmail: string;
|
|
250
250
|
backToGoogle: string;
|
|
251
|
+
useOtp: string;
|
|
252
|
+
usePassword: string;
|
|
253
|
+
otp: {
|
|
254
|
+
emailHelp: string;
|
|
255
|
+
sendCode: string;
|
|
256
|
+
sendingCode: string;
|
|
257
|
+
codeSent: string;
|
|
258
|
+
codeLabel: string;
|
|
259
|
+
codePlaceholder: string;
|
|
260
|
+
verifyCode: string;
|
|
261
|
+
verifyingCode: string;
|
|
262
|
+
resendCode: string;
|
|
263
|
+
changeEmail: string;
|
|
264
|
+
};
|
|
251
265
|
};
|
|
252
266
|
footer: {
|
|
253
267
|
noAccount: string;
|
|
@@ -263,6 +277,11 @@ declare const _default: {
|
|
|
263
277
|
googleSignInSuccess: string;
|
|
264
278
|
googleSignInFailed: string;
|
|
265
279
|
googleSignInError: string;
|
|
280
|
+
otpSending: string;
|
|
281
|
+
otpSent: string;
|
|
282
|
+
otpSendFailed: string;
|
|
283
|
+
otpVerifying: string;
|
|
284
|
+
otpVerifyFailed: string;
|
|
266
285
|
};
|
|
267
286
|
errors: {
|
|
268
287
|
invalidCredentials: string;
|
|
@@ -274,6 +293,10 @@ declare const _default: {
|
|
|
274
293
|
serverError: string;
|
|
275
294
|
invalidEmail: string;
|
|
276
295
|
passwordTooShort: string;
|
|
296
|
+
otpInvalidCode: string;
|
|
297
|
+
otpInvalid: string;
|
|
298
|
+
otpExpired: string;
|
|
299
|
+
otpTooMany: string;
|
|
277
300
|
google: {
|
|
278
301
|
invalidCredentials: string;
|
|
279
302
|
userNotFound: string;
|
|
@@ -1131,6 +1154,64 @@ declare const _default: {
|
|
|
1131
1154
|
description: string;
|
|
1132
1155
|
};
|
|
1133
1156
|
};
|
|
1157
|
+
readonly email: {
|
|
1158
|
+
verifyEmail: {
|
|
1159
|
+
subject: string;
|
|
1160
|
+
headerSubtitle: string;
|
|
1161
|
+
title: string;
|
|
1162
|
+
greetingPrefix: string;
|
|
1163
|
+
intro: string;
|
|
1164
|
+
buttonLabel: string;
|
|
1165
|
+
helpHeading: string;
|
|
1166
|
+
helpInstructions: string;
|
|
1167
|
+
copyright: string;
|
|
1168
|
+
footerLine1: string;
|
|
1169
|
+
footerLine2: string;
|
|
1170
|
+
};
|
|
1171
|
+
resetPassword: {
|
|
1172
|
+
subject: string;
|
|
1173
|
+
headerSubtitle: string;
|
|
1174
|
+
title: string;
|
|
1175
|
+
greetingPrefix: string;
|
|
1176
|
+
intro: string;
|
|
1177
|
+
buttonLabel: string;
|
|
1178
|
+
securityNoticeTitle: string;
|
|
1179
|
+
securityNoticeExpiry: string;
|
|
1180
|
+
securityNoticeIgnore: string;
|
|
1181
|
+
defaultExpiresIn: string;
|
|
1182
|
+
helpHeading: string;
|
|
1183
|
+
helpInstructions: string;
|
|
1184
|
+
copyright: string;
|
|
1185
|
+
footerLine1: string;
|
|
1186
|
+
footerLine2: string;
|
|
1187
|
+
};
|
|
1188
|
+
otpVerification: {
|
|
1189
|
+
subject: string;
|
|
1190
|
+
headerSubtitle: string;
|
|
1191
|
+
title: string;
|
|
1192
|
+
intro: string;
|
|
1193
|
+
expiresNotice: string;
|
|
1194
|
+
ignoreNotice: string;
|
|
1195
|
+
copyright: string;
|
|
1196
|
+
footerLine1: string;
|
|
1197
|
+
};
|
|
1198
|
+
teamInvitation: {
|
|
1199
|
+
subject: string;
|
|
1200
|
+
headerSubtitle: string;
|
|
1201
|
+
title: string;
|
|
1202
|
+
bodyIntro: string;
|
|
1203
|
+
bodyAction: string;
|
|
1204
|
+
buttonLabel: string;
|
|
1205
|
+
detailsTitle: string;
|
|
1206
|
+
detailsExpiry: string;
|
|
1207
|
+
detailsCreateAccount: string;
|
|
1208
|
+
helpHeading: string;
|
|
1209
|
+
helpInstructions: string;
|
|
1210
|
+
copyright: string;
|
|
1211
|
+
footerSentTo: string;
|
|
1212
|
+
footerUnexpected: string;
|
|
1213
|
+
};
|
|
1214
|
+
};
|
|
1134
1215
|
readonly entities: {
|
|
1135
1216
|
actions: {
|
|
1136
1217
|
create: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAqBU"}
|
|
@@ -6,6 +6,7 @@ import common from "./common.json";
|
|
|
6
6
|
import dashboard from "./dashboard.json";
|
|
7
7
|
import devtools from "./devtools.json";
|
|
8
8
|
import docs from "./docs.json";
|
|
9
|
+
import email from "./email.json";
|
|
9
10
|
import entities from "./entities.json";
|
|
10
11
|
import footer from "./footer.json";
|
|
11
12
|
import home from "./home.json";
|
|
@@ -26,6 +27,7 @@ var de_default = {
|
|
|
26
27
|
dashboard,
|
|
27
28
|
devtools,
|
|
28
29
|
docs,
|
|
30
|
+
email,
|
|
29
31
|
entities,
|
|
30
32
|
footer,
|
|
31
33
|
home,
|
|
@@ -6,6 +6,7 @@ import common from './common.json'
|
|
|
6
6
|
import dashboard from './dashboard.json'
|
|
7
7
|
import devtools from './devtools.json'
|
|
8
8
|
import docs from './docs.json'
|
|
9
|
+
import email from './email.json'
|
|
9
10
|
import entities from './entities.json'
|
|
10
11
|
import footer from './footer.json'
|
|
11
12
|
import home from './home.json'
|
|
@@ -27,6 +28,7 @@ export default {
|
|
|
27
28
|
dashboard,
|
|
28
29
|
devtools,
|
|
29
30
|
docs,
|
|
31
|
+
email,
|
|
30
32
|
entities,
|
|
31
33
|
footer,
|
|
32
34
|
home,
|
|
@@ -19,7 +19,21 @@
|
|
|
19
19
|
"submitHelp": "Press Enter or click to sign in",
|
|
20
20
|
"lastUsed": "Last Used",
|
|
21
21
|
"loginWithEmail": "Sign in with Email",
|
|
22
|
-
"backToGoogle": "Back to main options"
|
|
22
|
+
"backToGoogle": "Back to main options",
|
|
23
|
+
"useOtp": "Email me a one-time code instead",
|
|
24
|
+
"usePassword": "Sign in with a password instead",
|
|
25
|
+
"otp": {
|
|
26
|
+
"emailHelp": "No password needed — we'll email you a one-time code.",
|
|
27
|
+
"sendCode": "Email me a sign-in code",
|
|
28
|
+
"sendingCode": "Sending code...",
|
|
29
|
+
"codeSent": "We sent a 6-digit code to {email}. It expires in 5 minutes.",
|
|
30
|
+
"codeLabel": "Sign-in code",
|
|
31
|
+
"codePlaceholder": "123456",
|
|
32
|
+
"verifyCode": "Sign in with code",
|
|
33
|
+
"verifyingCode": "Verifying code...",
|
|
34
|
+
"resendCode": "Resend code",
|
|
35
|
+
"changeEmail": "Use a different email"
|
|
36
|
+
}
|
|
23
37
|
},
|
|
24
38
|
"footer": {
|
|
25
39
|
"noAccount": "Don't have an account?",
|
|
@@ -34,7 +48,12 @@
|
|
|
34
48
|
"googleSigningIn": "Redirecting to Google...",
|
|
35
49
|
"googleSignInSuccess": "Successfully signed in with Google",
|
|
36
50
|
"googleSignInFailed": "Google sign in failed",
|
|
37
|
-
"googleSignInError": "Google error: {error}"
|
|
51
|
+
"googleSignInError": "Google error: {error}",
|
|
52
|
+
"otpSending": "Sending sign-in code...",
|
|
53
|
+
"otpSent": "Sign-in code sent. Check your inbox.",
|
|
54
|
+
"otpSendFailed": "Could not send the sign-in code",
|
|
55
|
+
"otpVerifying": "Verifying code...",
|
|
56
|
+
"otpVerifyFailed": "Could not verify the code"
|
|
38
57
|
},
|
|
39
58
|
"errors": {
|
|
40
59
|
"invalidCredentials": "Invalid email or password",
|
|
@@ -46,6 +65,10 @@
|
|
|
46
65
|
"serverError": "Server error. Please try again later",
|
|
47
66
|
"invalidEmail": "Invalid email",
|
|
48
67
|
"passwordTooShort": "Password must be at least 6 characters",
|
|
68
|
+
"otpInvalidCode": "Enter the 6-digit code from your email",
|
|
69
|
+
"otpInvalid": "Invalid code. Check it and try again",
|
|
70
|
+
"otpExpired": "This code has expired. Request a new one",
|
|
71
|
+
"otpTooMany": "Too many attempts. Request a new code",
|
|
49
72
|
"google": {
|
|
50
73
|
"invalidCredentials": "Google authentication failed",
|
|
51
74
|
"userNotFound": "No account found for this Google account",
|
|
@@ -379,6 +379,20 @@ declare const _default: {
|
|
|
379
379
|
lastUsed: string;
|
|
380
380
|
loginWithEmail: string;
|
|
381
381
|
backToGoogle: string;
|
|
382
|
+
useOtp: string;
|
|
383
|
+
usePassword: string;
|
|
384
|
+
otp: {
|
|
385
|
+
emailHelp: string;
|
|
386
|
+
sendCode: string;
|
|
387
|
+
sendingCode: string;
|
|
388
|
+
codeSent: string;
|
|
389
|
+
codeLabel: string;
|
|
390
|
+
codePlaceholder: string;
|
|
391
|
+
verifyCode: string;
|
|
392
|
+
verifyingCode: string;
|
|
393
|
+
resendCode: string;
|
|
394
|
+
changeEmail: string;
|
|
395
|
+
};
|
|
382
396
|
};
|
|
383
397
|
footer: {
|
|
384
398
|
noAccount: string;
|
|
@@ -394,6 +408,11 @@ declare const _default: {
|
|
|
394
408
|
googleSignInSuccess: string;
|
|
395
409
|
googleSignInFailed: string;
|
|
396
410
|
googleSignInError: string;
|
|
411
|
+
otpSending: string;
|
|
412
|
+
otpSent: string;
|
|
413
|
+
otpSendFailed: string;
|
|
414
|
+
otpVerifying: string;
|
|
415
|
+
otpVerifyFailed: string;
|
|
397
416
|
};
|
|
398
417
|
errors: {
|
|
399
418
|
invalidCredentials: string;
|
|
@@ -405,6 +424,10 @@ declare const _default: {
|
|
|
405
424
|
serverError: string;
|
|
406
425
|
invalidEmail: string;
|
|
407
426
|
passwordTooShort: string;
|
|
427
|
+
otpInvalidCode: string;
|
|
428
|
+
otpInvalid: string;
|
|
429
|
+
otpExpired: string;
|
|
430
|
+
otpTooMany: string;
|
|
408
431
|
google: {
|
|
409
432
|
invalidCredentials: string;
|
|
410
433
|
userNotFound: string;
|
|
@@ -1342,6 +1365,64 @@ declare const _default: {
|
|
|
1342
1365
|
description: string;
|
|
1343
1366
|
};
|
|
1344
1367
|
};
|
|
1368
|
+
readonly email: {
|
|
1369
|
+
verifyEmail: {
|
|
1370
|
+
subject: string;
|
|
1371
|
+
headerSubtitle: string;
|
|
1372
|
+
title: string;
|
|
1373
|
+
greetingPrefix: string;
|
|
1374
|
+
intro: string;
|
|
1375
|
+
buttonLabel: string;
|
|
1376
|
+
helpHeading: string;
|
|
1377
|
+
helpInstructions: string;
|
|
1378
|
+
copyright: string;
|
|
1379
|
+
footerLine1: string;
|
|
1380
|
+
footerLine2: string;
|
|
1381
|
+
};
|
|
1382
|
+
resetPassword: {
|
|
1383
|
+
subject: string;
|
|
1384
|
+
headerSubtitle: string;
|
|
1385
|
+
title: string;
|
|
1386
|
+
greetingPrefix: string;
|
|
1387
|
+
intro: string;
|
|
1388
|
+
buttonLabel: string;
|
|
1389
|
+
securityNoticeTitle: string;
|
|
1390
|
+
securityNoticeExpiry: string;
|
|
1391
|
+
securityNoticeIgnore: string;
|
|
1392
|
+
defaultExpiresIn: string;
|
|
1393
|
+
helpHeading: string;
|
|
1394
|
+
helpInstructions: string;
|
|
1395
|
+
copyright: string;
|
|
1396
|
+
footerLine1: string;
|
|
1397
|
+
footerLine2: string;
|
|
1398
|
+
};
|
|
1399
|
+
otpVerification: {
|
|
1400
|
+
subject: string;
|
|
1401
|
+
headerSubtitle: string;
|
|
1402
|
+
title: string;
|
|
1403
|
+
intro: string;
|
|
1404
|
+
expiresNotice: string;
|
|
1405
|
+
ignoreNotice: string;
|
|
1406
|
+
copyright: string;
|
|
1407
|
+
footerLine1: string;
|
|
1408
|
+
};
|
|
1409
|
+
teamInvitation: {
|
|
1410
|
+
subject: string;
|
|
1411
|
+
headerSubtitle: string;
|
|
1412
|
+
title: string;
|
|
1413
|
+
bodyIntro: string;
|
|
1414
|
+
bodyAction: string;
|
|
1415
|
+
buttonLabel: string;
|
|
1416
|
+
detailsTitle: string;
|
|
1417
|
+
detailsExpiry: string;
|
|
1418
|
+
detailsCreateAccount: string;
|
|
1419
|
+
helpHeading: string;
|
|
1420
|
+
helpInstructions: string;
|
|
1421
|
+
copyright: string;
|
|
1422
|
+
footerSentTo: string;
|
|
1423
|
+
footerUnexpected: string;
|
|
1424
|
+
};
|
|
1425
|
+
};
|
|
1345
1426
|
readonly entities: {
|
|
1346
1427
|
actions: {
|
|
1347
1428
|
create: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,wBAsBU"}
|