@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
|
@@ -25,8 +25,9 @@ class HookSystem {
|
|
|
25
25
|
* Apply filter hooks to data
|
|
26
26
|
*/
|
|
27
27
|
async applyFilters(hookName, data, ...args) {
|
|
28
|
+
const hooks2 = this.filters.get(hookName);
|
|
29
|
+
if (!hooks2 || hooks2.length === 0) return data;
|
|
28
30
|
const startTime = performance.now();
|
|
29
|
-
const hooks2 = this.filters.get(hookName) || [];
|
|
30
31
|
let result = data;
|
|
31
32
|
console.log(`[Hooks] Applying ${hooks2.length} filter hooks for: ${hookName}`);
|
|
32
33
|
for (const callback of hooks2) {
|
|
@@ -42,6 +43,32 @@ class HookSystem {
|
|
|
42
43
|
this.recordHookStats(hookName, startTime);
|
|
43
44
|
return result;
|
|
44
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Apply filter hooks to data, propagating callback errors instead of
|
|
48
|
+
* swallowing them.
|
|
49
|
+
*
|
|
50
|
+
* `applyFilters` isolates each registered callback so one misbehaving
|
|
51
|
+
* plugin can't break the others — the right default for cosmetic /
|
|
52
|
+
* best-effort filters. It is the wrong default for a *validation*
|
|
53
|
+
* filter: a callback that throws to reject a payload must actually stop
|
|
54
|
+
* the pipeline, or the hook can never reject anything. Use this variant
|
|
55
|
+
* for filters where a thrown error is meant to abort the caller.
|
|
56
|
+
*/
|
|
57
|
+
async applyFiltersStrict(hookName, data, ...args) {
|
|
58
|
+
const hooks2 = this.filters.get(hookName);
|
|
59
|
+
if (!hooks2 || hooks2.length === 0) return data;
|
|
60
|
+
const startTime = performance.now();
|
|
61
|
+
let result = data;
|
|
62
|
+
console.log(`[Hooks] Applying ${hooks2.length} filter hooks (strict) for: ${hookName}`);
|
|
63
|
+
for (const callback of hooks2) {
|
|
64
|
+
const hookResult = await callback(result, ...args);
|
|
65
|
+
if (hookResult !== void 0) {
|
|
66
|
+
result = hookResult;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.recordHookStats(hookName, startTime);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
45
72
|
/**
|
|
46
73
|
* Add an action hook
|
|
47
74
|
* Actions allow plugins to execute code at specific points
|
|
@@ -65,8 +92,9 @@ class HookSystem {
|
|
|
65
92
|
* Execute action hooks
|
|
66
93
|
*/
|
|
67
94
|
async doAction(hookName, data, ...args) {
|
|
95
|
+
const hooks2 = this.actions.get(hookName);
|
|
96
|
+
if (!hooks2 || hooks2.length === 0) return;
|
|
68
97
|
const startTime = performance.now();
|
|
69
|
-
const hooks2 = this.actions.get(hookName) || [];
|
|
70
98
|
console.log(`[Hooks] Executing ${hooks2.length} action hooks for: ${hookName}`);
|
|
71
99
|
const promises = hooks2.map(async (callback) => {
|
|
72
100
|
try {
|
|
@@ -187,6 +215,7 @@ function getGlobalHooks() {
|
|
|
187
215
|
const hooks = createHookSystem();
|
|
188
216
|
const addFilter = (hookName, callback, priority = 10) => hooks.addFilter(hookName, callback, priority);
|
|
189
217
|
const applyFilters = (hookName, data, ...args) => hooks.applyFilters(hookName, data, ...args);
|
|
218
|
+
const applyFiltersStrict = (hookName, data, ...args) => hooks.applyFiltersStrict(hookName, data, ...args);
|
|
190
219
|
const addAction = (hookName, callback, priority = 10) => hooks.addAction(hookName, callback, priority);
|
|
191
220
|
const doAction = (hookName, data, ...args) => hooks.doAction(hookName, data, ...args);
|
|
192
221
|
const emit = (eventName, data, ...args) => hooks.emit(eventName, data, ...args);
|
|
@@ -200,6 +229,7 @@ export {
|
|
|
200
229
|
addAction,
|
|
201
230
|
addFilter,
|
|
202
231
|
applyFilters,
|
|
232
|
+
applyFiltersStrict,
|
|
203
233
|
createHookSystem,
|
|
204
234
|
doAction,
|
|
205
235
|
emit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/scheduled-actions/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uCAAuC,EAAE,MAAM,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/scheduled-actions/handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,uCAAuC,EAAE,MAAM,4BAA4B,CAAA;AACpF,OAAO,EAAE,kCAAkC,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { registerPatternCacheInvalidationHandler } from "./invalidate-pattern-cache.js";
|
|
2
|
+
import { registerSecurityNotificationAction } from "./security-notification.js";
|
|
2
3
|
export {
|
|
3
|
-
registerPatternCacheInvalidationHandler
|
|
4
|
+
registerPatternCacheInvalidationHandler,
|
|
5
|
+
registerSecurityNotificationAction
|
|
4
6
|
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduled Action Handler: auth:security-notification
|
|
3
|
+
*
|
|
4
|
+
* Renders and sends one built-in security email (new-device login, password
|
|
5
|
+
* changed, or email changed — issue #75). Enqueued by the security-notifications
|
|
6
|
+
* dispatcher; executed asynchronously by the cron processor so a slow email
|
|
7
|
+
* provider never blocks the auth response.
|
|
8
|
+
*
|
|
9
|
+
* The handler:
|
|
10
|
+
* 1. reads the shared email provider (EmailFactory.getInstance())
|
|
11
|
+
* 2. resolves the template builder for (type, locale) — a theme override if
|
|
12
|
+
* registered, otherwise the core baseline (getSecurityEmailTemplate)
|
|
13
|
+
* 3. builds { subject, html } and sends to `payload.to`
|
|
14
|
+
*
|
|
15
|
+
* On any failure it THROWS, so the scheduled-actions processor records the error
|
|
16
|
+
* and retries per the action's maxRetries (email dispatch is worth retrying).
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Register the `auth:security-notification` handler.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent at the registry level (re-registering warns + overwrites). Safe to
|
|
22
|
+
* call from the dispatcher (lazily, on first use) and/or from theme/server
|
|
23
|
+
* bootstrap.
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerSecurityNotificationAction(): void;
|
|
26
|
+
//# sourceMappingURL=security-notification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-notification.d.ts","sourceRoot":"","sources":["../../../../src/lib/scheduled-actions/handlers/security-notification.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAaH;;;;;;GAMG;AACH,wBAAgB,kCAAkC,IAAI,IAAI,CAyDzD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { registerScheduledAction } from "../registry.js";
|
|
2
|
+
import { EmailFactory } from "../../email/index.js";
|
|
3
|
+
import { getSecurityEmailTemplate } from "../../auth/security-notifications/registry.js";
|
|
4
|
+
const ACTION_TYPE = "auth:security-notification";
|
|
5
|
+
function registerSecurityNotificationAction() {
|
|
6
|
+
registerScheduledAction(
|
|
7
|
+
ACTION_TYPE,
|
|
8
|
+
async (payload, action) => {
|
|
9
|
+
const data = payload;
|
|
10
|
+
if (!(data == null ? void 0 : data.to) || !(data == null ? void 0 : data.type)) {
|
|
11
|
+
console.warn(
|
|
12
|
+
`[auth:security-notification] Skipping action ${action.id}: missing "to" or "type"`
|
|
13
|
+
);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const ctx = {
|
|
17
|
+
type: data.type,
|
|
18
|
+
locale: data.locale,
|
|
19
|
+
appName: data.appName,
|
|
20
|
+
userName: data.userName,
|
|
21
|
+
email: data.to,
|
|
22
|
+
ipAddress: data.ipAddress,
|
|
23
|
+
userAgent: data.userAgent,
|
|
24
|
+
occurredAt: data.occurredAt,
|
|
25
|
+
newEmail: data.newEmail
|
|
26
|
+
};
|
|
27
|
+
const builder = getSecurityEmailTemplate(data.type, data.locale);
|
|
28
|
+
const { subject, html, text } = await builder(ctx);
|
|
29
|
+
const emailService = EmailFactory.getInstance();
|
|
30
|
+
const response = await emailService.send({
|
|
31
|
+
to: data.to,
|
|
32
|
+
subject,
|
|
33
|
+
html,
|
|
34
|
+
...text ? { text } : {}
|
|
35
|
+
});
|
|
36
|
+
if (!response.success) {
|
|
37
|
+
throw new Error(
|
|
38
|
+
`[auth:security-notification] Failed to send '${data.type}' email: ${response.error ?? "unknown error"}`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
console.log(
|
|
42
|
+
`[auth:security-notification] Sent '${data.type}' email (action ${action.id})`
|
|
43
|
+
);
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
description: "Send a built-in security email (new-device / password / email changed)",
|
|
47
|
+
timeout: 2e4
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
console.log("[ScheduledActions] Registered handler: auth:security-notification");
|
|
51
|
+
}
|
|
52
|
+
export {
|
|
53
|
+
registerSecurityNotificationAction
|
|
54
|
+
};
|
|
@@ -60,6 +60,18 @@ export declare const CORE_SELECTORS: {
|
|
|
60
60
|
readonly inviteBanner: "login-invite-banner";
|
|
61
61
|
readonly errorAlert: "login-error-alert";
|
|
62
62
|
readonly rememberCheckbox: "login-remember-checkbox";
|
|
63
|
+
readonly useOtp: "login-use-otp";
|
|
64
|
+
readonly usePassword: "login-use-password";
|
|
65
|
+
readonly otpForm: "login-otp-form";
|
|
66
|
+
readonly otpEmailInput: "login-otp-email-input";
|
|
67
|
+
readonly otpEmailError: "login-otp-email-error";
|
|
68
|
+
readonly otpSend: "login-otp-send";
|
|
69
|
+
readonly otpSentNotice: "login-otp-sent-notice";
|
|
70
|
+
readonly otpCodeInput: "login-otp-code-input";
|
|
71
|
+
readonly otpCodeError: "login-otp-code-error";
|
|
72
|
+
readonly otpSubmit: "login-otp-submit";
|
|
73
|
+
readonly otpResend: "login-otp-resend";
|
|
74
|
+
readonly otpChangeEmail: "login-otp-change-email";
|
|
63
75
|
};
|
|
64
76
|
readonly signup: {
|
|
65
77
|
readonly form: "signup-form";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/core-selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiBH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"core-selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/core-selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAiBH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAejB,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA;AAGrD,cAAc,WAAW,CAAA"}
|
|
@@ -28,6 +28,18 @@ export declare const AUTH_SELECTORS: {
|
|
|
28
28
|
readonly inviteBanner: "login-invite-banner";
|
|
29
29
|
readonly errorAlert: "login-error-alert";
|
|
30
30
|
readonly rememberCheckbox: "login-remember-checkbox";
|
|
31
|
+
readonly useOtp: "login-use-otp";
|
|
32
|
+
readonly usePassword: "login-use-password";
|
|
33
|
+
readonly otpForm: "login-otp-form";
|
|
34
|
+
readonly otpEmailInput: "login-otp-email-input";
|
|
35
|
+
readonly otpEmailError: "login-otp-email-error";
|
|
36
|
+
readonly otpSend: "login-otp-send";
|
|
37
|
+
readonly otpSentNotice: "login-otp-sent-notice";
|
|
38
|
+
readonly otpCodeInput: "login-otp-code-input";
|
|
39
|
+
readonly otpCodeError: "login-otp-code-error";
|
|
40
|
+
readonly otpSubmit: "login-otp-submit";
|
|
41
|
+
readonly otpResend: "login-otp-resend";
|
|
42
|
+
readonly otpChangeEmail: "login-otp-change-email";
|
|
31
43
|
};
|
|
32
44
|
readonly signup: {
|
|
33
45
|
readonly form: "signup-form";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/auth.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"auth.selectors.d.ts","sourceRoot":"","sources":["../../../../src/lib/selectors/domains/auth.selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFjB,CAAA;AAEV,MAAM,MAAM,iBAAiB,GAAG,OAAO,cAAc,CAAA"}
|
|
@@ -22,7 +22,20 @@ const AUTH_SELECTORS = {
|
|
|
22
22
|
// Misc
|
|
23
23
|
inviteBanner: "login-invite-banner",
|
|
24
24
|
errorAlert: "login-error-alert",
|
|
25
|
-
rememberCheckbox: "login-remember-checkbox"
|
|
25
|
+
rememberCheckbox: "login-remember-checkbox",
|
|
26
|
+
// Passwordless (email one-time code)
|
|
27
|
+
useOtp: "login-use-otp",
|
|
28
|
+
usePassword: "login-use-password",
|
|
29
|
+
otpForm: "login-otp-form",
|
|
30
|
+
otpEmailInput: "login-otp-email-input",
|
|
31
|
+
otpEmailError: "login-otp-email-error",
|
|
32
|
+
otpSend: "login-otp-send",
|
|
33
|
+
otpSentNotice: "login-otp-sent-notice",
|
|
34
|
+
otpCodeInput: "login-otp-code-input",
|
|
35
|
+
otpCodeError: "login-otp-code-error",
|
|
36
|
+
otpSubmit: "login-otp-submit",
|
|
37
|
+
otpResend: "login-otp-resend",
|
|
38
|
+
otpChangeEmail: "login-otp-change-email"
|
|
26
39
|
},
|
|
27
40
|
signup: {
|
|
28
41
|
form: "signup-form",
|
|
@@ -59,6 +59,18 @@ export declare const SELECTORS: {
|
|
|
59
59
|
readonly inviteBanner: "login-invite-banner";
|
|
60
60
|
readonly errorAlert: "login-error-alert";
|
|
61
61
|
readonly rememberCheckbox: "login-remember-checkbox";
|
|
62
|
+
readonly useOtp: "login-use-otp";
|
|
63
|
+
readonly usePassword: "login-use-password";
|
|
64
|
+
readonly otpForm: "login-otp-form";
|
|
65
|
+
readonly otpEmailInput: "login-otp-email-input";
|
|
66
|
+
readonly otpEmailError: "login-otp-email-error";
|
|
67
|
+
readonly otpSend: "login-otp-send";
|
|
68
|
+
readonly otpSentNotice: "login-otp-sent-notice";
|
|
69
|
+
readonly otpCodeInput: "login-otp-code-input";
|
|
70
|
+
readonly otpCodeError: "login-otp-code-error";
|
|
71
|
+
readonly otpSubmit: "login-otp-submit";
|
|
72
|
+
readonly otpResend: "login-otp-resend";
|
|
73
|
+
readonly otpChangeEmail: "login-otp-change-email";
|
|
62
74
|
};
|
|
63
75
|
readonly signup: {
|
|
64
76
|
readonly form: "signup-form";
|
|
@@ -1643,6 +1655,18 @@ declare const _default: {
|
|
|
1643
1655
|
readonly inviteBanner: "login-invite-banner";
|
|
1644
1656
|
readonly errorAlert: "login-error-alert";
|
|
1645
1657
|
readonly rememberCheckbox: "login-remember-checkbox";
|
|
1658
|
+
readonly useOtp: "login-use-otp";
|
|
1659
|
+
readonly usePassword: "login-use-password";
|
|
1660
|
+
readonly otpForm: "login-otp-form";
|
|
1661
|
+
readonly otpEmailInput: "login-otp-email-input";
|
|
1662
|
+
readonly otpEmailError: "login-otp-email-error";
|
|
1663
|
+
readonly otpSend: "login-otp-send";
|
|
1664
|
+
readonly otpSentNotice: "login-otp-sent-notice";
|
|
1665
|
+
readonly otpCodeInput: "login-otp-code-input";
|
|
1666
|
+
readonly otpCodeError: "login-otp-code-error";
|
|
1667
|
+
readonly otpSubmit: "login-otp-submit";
|
|
1668
|
+
readonly otpResend: "login-otp-resend";
|
|
1669
|
+
readonly otpChangeEmail: "login-otp-change-email";
|
|
1646
1670
|
};
|
|
1647
1671
|
readonly signup: {
|
|
1648
1672
|
readonly form: "signup-form";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAGH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAWzE;;GAEG;AACH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../src/lib/selectors/selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-entity.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/generic-entity.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"generic-entity.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/generic-entity.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { queryWithRLS, queryOneWithRLS, mutateWithRLS } from "../db.js";
|
|
2
2
|
import { entityRegistry } from "../entities/registry.js";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
beforeEntityCreate,
|
|
5
|
+
afterEntityCreate,
|
|
6
|
+
beforeEntityUpdate,
|
|
7
|
+
afterEntityUpdate,
|
|
8
|
+
beforeEntityDelete,
|
|
9
|
+
afterEntityDelete
|
|
10
|
+
} from "../entities/entity-hooks.js";
|
|
4
11
|
const SYSTEM_FIELDS = ["id", "userId", "teamId", "createdAt", "updatedAt"];
|
|
5
12
|
const DEFAULT_LIMIT = 20;
|
|
6
13
|
const DEFAULT_ORDER_BY = "createdAt";
|
|
@@ -173,15 +180,6 @@ function validateEntityData(entityConfig, data, isUpdate = false) {
|
|
|
173
180
|
}
|
|
174
181
|
return { valid: errors.length === 0, errors };
|
|
175
182
|
}
|
|
176
|
-
function createHookContext(entitySlug, operation, userId, data, previousData, role = "member") {
|
|
177
|
-
return {
|
|
178
|
-
entityName: entitySlug,
|
|
179
|
-
operation,
|
|
180
|
-
data,
|
|
181
|
-
previousData,
|
|
182
|
-
user: { id: userId, role }
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
183
|
class GenericEntityService {
|
|
186
184
|
/**
|
|
187
185
|
* Get entity by ID
|
|
@@ -307,12 +305,7 @@ class GenericEntityService {
|
|
|
307
305
|
if (!entityConfig) {
|
|
308
306
|
throw new Error(`Entity "${entitySlug}" not found in registry`);
|
|
309
307
|
}
|
|
310
|
-
const
|
|
311
|
-
const beforeResult = await executeBeforeHooks(entitySlug, "create", beforeContext);
|
|
312
|
-
if (!beforeResult.continue) {
|
|
313
|
-
throw new Error(beforeResult.error || "Operation cancelled by hook");
|
|
314
|
-
}
|
|
315
|
-
const finalData = beforeResult.data ?? data;
|
|
308
|
+
const finalData = await beforeEntityCreate(entitySlug, data, userId);
|
|
316
309
|
const validation = validateEntityData(entityConfig, finalData, false);
|
|
317
310
|
if (!validation.valid) {
|
|
318
311
|
throw new Error(`Validation failed: ${validation.errors.join(", ")}`);
|
|
@@ -344,8 +337,7 @@ class GenericEntityService {
|
|
|
344
337
|
throw new Error("Failed to create entity");
|
|
345
338
|
}
|
|
346
339
|
const createdEntity = mapRowToEntity(result.rows[0]);
|
|
347
|
-
|
|
348
|
-
executeAfterHooks(entitySlug, "create", afterContext).catch((err) => {
|
|
340
|
+
afterEntityCreate(entitySlug, createdEntity, userId).catch((err) => {
|
|
349
341
|
console.error(`[GenericEntityService] afterCreate hook error for ${entitySlug}:`, err);
|
|
350
342
|
});
|
|
351
343
|
return createdEntity;
|
|
@@ -384,12 +376,7 @@ class GenericEntityService {
|
|
|
384
376
|
if (!currentEntity) {
|
|
385
377
|
throw new Error("Entity not found or not authorized");
|
|
386
378
|
}
|
|
387
|
-
const
|
|
388
|
-
const beforeResult = await executeBeforeHooks(entitySlug, "update", beforeContext);
|
|
389
|
-
if (!beforeResult.continue) {
|
|
390
|
-
throw new Error(beforeResult.error || "Operation cancelled by hook");
|
|
391
|
-
}
|
|
392
|
-
const finalData = beforeResult.data ?? data;
|
|
379
|
+
const finalData = await beforeEntityUpdate(entitySlug, id, data, userId);
|
|
393
380
|
const validation = validateEntityData(entityConfig, finalData, true);
|
|
394
381
|
if (!validation.valid) {
|
|
395
382
|
throw new Error(`Validation failed: ${validation.errors.join(", ")}`);
|
|
@@ -428,8 +415,7 @@ class GenericEntityService {
|
|
|
428
415
|
throw new Error("Update failed");
|
|
429
416
|
}
|
|
430
417
|
const updatedEntity = mapRowToEntity(result.rows[0]);
|
|
431
|
-
|
|
432
|
-
executeAfterHooks(entitySlug, "update", afterContext).catch((err) => {
|
|
418
|
+
afterEntityUpdate(entitySlug, id, updatedEntity, data, userId).catch((err) => {
|
|
433
419
|
console.error(`[GenericEntityService] afterUpdate hook error for ${entitySlug}:`, err);
|
|
434
420
|
});
|
|
435
421
|
return updatedEntity;
|
|
@@ -467,10 +453,9 @@ class GenericEntityService {
|
|
|
467
453
|
if (!entityToDelete) {
|
|
468
454
|
return false;
|
|
469
455
|
}
|
|
470
|
-
const
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
throw new Error(beforeResult.error || "Operation cancelled by hook");
|
|
456
|
+
const allowDelete = await beforeEntityDelete(entitySlug, id, userId);
|
|
457
|
+
if (!allowDelete) {
|
|
458
|
+
throw new Error("Operation cancelled by hook");
|
|
474
459
|
}
|
|
475
460
|
const result = await mutateWithRLS(
|
|
476
461
|
`DELETE FROM ${tableName} ${whereClause}`,
|
|
@@ -479,8 +464,7 @@ class GenericEntityService {
|
|
|
479
464
|
);
|
|
480
465
|
const deleted = result.rowCount > 0;
|
|
481
466
|
if (deleted) {
|
|
482
|
-
|
|
483
|
-
executeAfterHooks(entitySlug, "delete", afterContext).catch((err) => {
|
|
467
|
+
afterEntityDelete(entitySlug, id, userId).catch((err) => {
|
|
484
468
|
console.error(`[GenericEntityService] afterDelete hook error for ${entitySlug}:`, err);
|
|
485
469
|
});
|
|
486
470
|
}
|
|
@@ -113,12 +113,20 @@ export declare class TeamMembership implements TeamMembershipData {
|
|
|
113
113
|
* 4. Quota is available
|
|
114
114
|
* 5. Subscription is active
|
|
115
115
|
*
|
|
116
|
-
*
|
|
116
|
+
* The action id IS the permission id as registered in the permissions
|
|
117
|
+
* registry (e.g. 'team.members.update_role', 'customers.create',
|
|
118
|
+
* 'page-builder.access'). Ids may have any number of dot-separated segments.
|
|
119
|
+
*
|
|
120
|
+
* Fails closed: an action whose id is not a registered permission is denied
|
|
121
|
+
* (and logged) instead of silently allowed, so a typo or a renamed permission
|
|
122
|
+
* surfaces as a visible 403 rather than an unguarded endpoint (issue #89).
|
|
123
|
+
*
|
|
124
|
+
* @param action - Action slug to check (must be a registered permission id)
|
|
117
125
|
* @param options - Options for quota increment
|
|
118
126
|
* @returns ActionResult with allowed status and details
|
|
119
127
|
*
|
|
120
128
|
* @example
|
|
121
|
-
* const result = membership.canPerformAction('
|
|
129
|
+
* const result = membership.canPerformAction('team.members.update_role')
|
|
122
130
|
* if (!result.allowed) {
|
|
123
131
|
* console.log(result.message, result.reason)
|
|
124
132
|
* }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membership.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/membership.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AAM7B;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAA;IAClC,QAAQ,CAAC,YAAY,EAAE,sBAAsB,GAAG,IAAI,CAAA;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;gBAE/B,IAAI,EAAE,kBAAkB;IAWpC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAKpC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAI9C;;;;;;;;;;OAUG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;;;;;;;;;OAYG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAU,GACpB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAmB1C
|
|
1
|
+
{"version":3,"file":"membership.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/membership.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EACnB,MAAM,sBAAsB,CAAA;AAM7B;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,kBAAkB;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAA;IAClC,QAAQ,CAAC,YAAY,EAAE,sBAAsB,GAAG,IAAI,CAAA;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;gBAE/B,IAAI,EAAE,kBAAkB;IAWpC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI9B;;;;;;;;;;OAUG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAKpC;;;;;;;;;;OAUG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAI9C;;;;;;;;;;OAUG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpC;;;;;;;;;;;;OAYG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,MAAU,GACpB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAmB1C;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,gBAAgB,CACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GACpC,YAAY;CA4FhB;AAMD,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;;;;;;;OAkBG;WACU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkEzE;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAiBlC;;;;;;;;OAQG;mBACkB,cAAc;CAyCpC"}
|
|
@@ -131,12 +131,20 @@ class TeamMembership {
|
|
|
131
131
|
* 4. Quota is available
|
|
132
132
|
* 5. Subscription is active
|
|
133
133
|
*
|
|
134
|
-
*
|
|
134
|
+
* The action id IS the permission id as registered in the permissions
|
|
135
|
+
* registry (e.g. 'team.members.update_role', 'customers.create',
|
|
136
|
+
* 'page-builder.access'). Ids may have any number of dot-separated segments.
|
|
137
|
+
*
|
|
138
|
+
* Fails closed: an action whose id is not a registered permission is denied
|
|
139
|
+
* (and logged) instead of silently allowed, so a typo or a renamed permission
|
|
140
|
+
* surfaces as a visible 403 rather than an unguarded endpoint (issue #89).
|
|
141
|
+
*
|
|
142
|
+
* @param action - Action slug to check (must be a registered permission id)
|
|
135
143
|
* @param options - Options for quota increment
|
|
136
144
|
* @returns ActionResult with allowed status and details
|
|
137
145
|
*
|
|
138
146
|
* @example
|
|
139
|
-
* const result = membership.canPerformAction('
|
|
147
|
+
* const result = membership.canPerformAction('team.members.update_role')
|
|
140
148
|
* if (!result.allowed) {
|
|
141
149
|
* console.log(result.message, result.reason)
|
|
142
150
|
* }
|
|
@@ -160,25 +168,38 @@ class TeamMembership {
|
|
|
160
168
|
}
|
|
161
169
|
};
|
|
162
170
|
}
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
171
|
+
const permission = action;
|
|
172
|
+
if (!PermissionService.isValid(permission)) {
|
|
173
|
+
console.warn(
|
|
174
|
+
`[MembershipService] canPerformAction('${action}') denied: '${permission}' is not a registered permission id`
|
|
175
|
+
);
|
|
176
|
+
return {
|
|
177
|
+
allowed: false,
|
|
178
|
+
reason: "permission_denied",
|
|
179
|
+
message: `Unknown permission: ${permission}`,
|
|
180
|
+
meta: {
|
|
181
|
+
requiredPermission: permission,
|
|
182
|
+
userRole: this.role,
|
|
183
|
+
unregistered: true
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (!this.hasPermission(permission)) {
|
|
188
|
+
return {
|
|
189
|
+
allowed: false,
|
|
190
|
+
reason: "permission_denied",
|
|
191
|
+
message: `You do not have permission: ${permission}`,
|
|
192
|
+
meta: {
|
|
193
|
+
requiredPermission: permission,
|
|
194
|
+
userRole: this.role
|
|
195
|
+
}
|
|
196
|
+
};
|
|
177
197
|
}
|
|
178
198
|
const requiredFeature = (_b = (_a = BILLING_REGISTRY.actionMappings) == null ? void 0 : _a.features) == null ? void 0 : _b[action];
|
|
179
199
|
if (requiredFeature && !this.hasFeature(requiredFeature)) {
|
|
180
200
|
return {
|
|
181
201
|
allowed: false,
|
|
202
|
+
// @ts-expect-error — pre-existing type error, tracked in https://github.com/NextSpark-js/nextspark/issues/131
|
|
182
203
|
reason: "feature_not_in_plan",
|
|
183
204
|
message: `Your plan does not include the required feature: ${requiredFeature}`,
|
|
184
205
|
meta: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/subscription.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAEV,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EAET,sBAAsB,EACtB,eAAe,EACf,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAMzB,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,oBAAoB,CAAA;IACnC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAMD,qBAAa,mBAAmB;IAK9B;;;;;;;;OAQG;WACU,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAW9D;;;;;;;;;OASG;WACU,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IA6B7F;;;;;OAKG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAI9E;;;;;;;;;OASG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAgC9E;;;;;;;;;;OAUG;WACU,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC;IA+ExB;;;;;;;;OAQG;WACU,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAejE;;;;;;;;;OASG;WACU,YAAY,CACvB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC;IA0CxB;;;;;;;;OAQG;WACU,MAAM,CACjB,cAAc,EAAE,MAAM,EACtB,iBAAiB,GAAE,OAAc,GAChC,OAAO,CAAC,YAAY,CAAC;IA4DxB;;;;;;;;;;;;;OAaG;WACU,UAAU,CACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,eAAe,GAAE,eAA2B,EAC5C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"subscription.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/subscription.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAEV,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,SAAS,EAET,sBAAsB,EACtB,eAAe,EACf,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAMzB,MAAM,WAAW,yBAAyB;IACxC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,CAAC,EAAE,oBAAoB,CAAA;IACnC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAMD,qBAAa,mBAAmB;IAK9B;;;;;;;;OAQG;WACU,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAW9D;;;;;;;;;OASG;WACU,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IA6B7F;;;;;OAKG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAI9E;;;;;;;;;OASG;WACU,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAgC9E;;;;;;;;;;OAUG;WACU,MAAM,CACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,YAAY,CAAC;IA+ExB;;;;;;;;OAQG;WACU,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAejE;;;;;;;;;OASG;WACU,YAAY,CACvB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,YAAY,CAAC;IA0CxB;;;;;;;;OAQG;WACU,MAAM,CACjB,cAAc,EAAE,MAAM,EACtB,iBAAiB,GAAE,OAAc,GAChC,OAAO,CAAC,YAAY,CAAC;IA4DxB;;;;;;;;;;;;;OAaG;WACU,UAAU,CACrB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,eAAe,GAAE,eAA2B,EAC5C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC;IAoI5B;;;;;;;;OAQG;WACU,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAcjE;;;;;;;;OAQG;WACU,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAclE;;;;;;;;;;OAUG;WACU,YAAY,CACvB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAChD,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAoBlC;;;;;;;;OAQG;WACU,gBAAgB,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAsBhF;;;;;;;;;;OAUG;WACU,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,kBAAkB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA8BlC;;;;;;;;OAQG;WACU,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAsBtF;;;;;;;;;OASG;WACU,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IA+BrF;;;;;;;;OAQG;WACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA4BxE;;;;;;;;;OASG;WACU,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB/F;;;;;;;;;;;;OAYG;WACU,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA2E/F;;;;;;;;;;;;;;;;;;OAkBG;WACU,gBAAgB,CAC3B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,CAAC;IA2ElC;;;;;;;;;OASG;WACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;CA+BrD"}
|
|
@@ -353,7 +353,8 @@ class SubscriptionService {
|
|
|
353
353
|
downgradeWarnings = downgradeCheck.warnings;
|
|
354
354
|
}
|
|
355
355
|
try {
|
|
356
|
-
await getBillingGateway()
|
|
356
|
+
const gateway = await getBillingGateway();
|
|
357
|
+
await gateway.updateSubscriptionPlan({
|
|
357
358
|
subscriptionId: currentSub.externalSubscriptionId,
|
|
358
359
|
newPriceId
|
|
359
360
|
});
|
|
@@ -19,9 +19,15 @@ export declare class TeamMemberService {
|
|
|
19
19
|
/**
|
|
20
20
|
* Get team member by team and user ID
|
|
21
21
|
*
|
|
22
|
+
* Only resolves memberships of active teams. Team deletion is a soft delete
|
|
23
|
+
* (UPDATE "teams" SET "deletedAt"), which never fires the ON DELETE CASCADE
|
|
24
|
+
* on team_members, so membership rows outlive the team. A member of a
|
|
25
|
+
* soft-deleted team is reported as "not a member" (null), the same shape
|
|
26
|
+
* callers already handle for users who were never on the team (issue #88).
|
|
27
|
+
*
|
|
22
28
|
* @param teamId - Team ID
|
|
23
29
|
* @param userId - User ID
|
|
24
|
-
* @returns Team member or null if not found
|
|
30
|
+
* @returns Team member or null if not found (or if the team is soft-deleted)
|
|
25
31
|
*
|
|
26
32
|
* @example
|
|
27
33
|
* const member = await TeamMemberService.getByTeamAndUser('team-123', 'user-456')
|
|
@@ -41,9 +47,12 @@ export declare class TeamMemberService {
|
|
|
41
47
|
/**
|
|
42
48
|
* Get user's role in a team
|
|
43
49
|
*
|
|
50
|
+
* Only resolves roles in active teams: a member of a soft-deleted team
|
|
51
|
+
* (teams."deletedAt" set) is reported as not a member (issue #88).
|
|
52
|
+
*
|
|
44
53
|
* @param teamId - Team ID
|
|
45
54
|
* @param userId - User ID
|
|
46
|
-
* @returns The user's role or null if not a member
|
|
55
|
+
* @returns The user's role or null if not a member (or if the team is soft-deleted)
|
|
47
56
|
*
|
|
48
57
|
* @example
|
|
49
58
|
* const role = await TeamMemberService.getRole('team-123', 'user-456')
|
|
@@ -115,9 +124,12 @@ export declare class TeamMemberService {
|
|
|
115
124
|
/**
|
|
116
125
|
* Check if user is a member of a team
|
|
117
126
|
*
|
|
127
|
+
* Only counts membership in active teams: a member of a soft-deleted team
|
|
128
|
+
* (teams."deletedAt" set) is reported as not a member (issue #88).
|
|
129
|
+
*
|
|
118
130
|
* @param teamId - Team ID
|
|
119
131
|
* @param userId - User ID
|
|
120
|
-
* @returns True if user is a member
|
|
132
|
+
* @returns True if user is a member of an active team
|
|
121
133
|
*
|
|
122
134
|
* @example
|
|
123
135
|
* const isMember = await TeamMemberService.isMember('team-123', 'user-456')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-member.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/team-member.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAM1D,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD,qBAAa,iBAAiB;IAK5B
|
|
1
|
+
{"version":3,"file":"team-member.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/team-member.service.ts"],"names":[],"mappings":"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"}
|