@nextsparkjs/core 0.1.0-beta.185 → 0.1.0-beta.187
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/app/guards/DeveloperGuard.d.ts.map +1 -1
- package/dist/components/app/guards/DeveloperGuard.js +8 -4
- package/dist/components/app/guards/SuperAdminGuard.d.ts.map +1 -1
- package/dist/components/app/guards/SuperAdminGuard.js +8 -4
- package/dist/components/app/layouts/PublicFooter.d.ts.map +1 -1
- package/dist/components/app/layouts/PublicFooter.js +2 -2
- package/dist/components/app/layouts/PublicNavbar.d.ts.map +1 -1
- package/dist/components/app/layouts/PublicNavbar.js +2 -2
- package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
- package/dist/components/app/misc/ThemeToggle.js +4 -1
- package/dist/components/auth/DevKeyring.d.ts.map +1 -1
- package/dist/components/auth/DevKeyring.js +10 -2
- package/dist/components/auth/SessionCookieRefresher.d.ts +21 -0
- package/dist/components/auth/SessionCookieRefresher.d.ts.map +1 -0
- package/dist/components/auth/SessionCookieRefresher.js +11 -0
- package/dist/components/auth/forms/LoginForm.d.ts.map +1 -1
- package/dist/components/auth/forms/LoginForm.js +300 -6
- package/dist/components/auth/index.d.ts +1 -0
- package/dist/components/auth/index.d.ts.map +1 -1
- package/dist/components/auth/index.js +2 -0
- package/dist/components/billing/InvoicesTable.d.ts.map +1 -1
- package/dist/components/billing/InvoicesTable.js +4 -3
- package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/AuthGuard.js +2 -2
- package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/DashboardAuthLayout.js +2 -2
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +17 -0
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts.map +1 -0
- package/dist/components/dashboard/layouts/DashboardAuthSkeleton.js +52 -0
- package/dist/components/dashboard/layouts/Sidebar.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/Sidebar.js +2 -3
- package/dist/components/dashboard/layouts/TopNavbar.js +2 -2
- package/dist/components/dashboard/layouts/index.d.ts +1 -0
- package/dist/components/dashboard/layouts/index.d.ts.map +1 -1
- package/dist/components/dashboard/layouts/index.js +2 -0
- package/dist/components/devtools/api-explorer/ApiExplorer.js +4 -4
- package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
- package/dist/components/entities/EntityFieldRenderer.js +3 -0
- package/dist/components/entities/EntityTable.d.ts.map +1 -1
- package/dist/components/entities/EntityTable.js +2 -1
- package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityFormWrapper.js +7 -2
- package/dist/components/patterns/pages/PatternEditPage.d.ts +5 -1
- package/dist/components/patterns/pages/PatternEditPage.d.ts.map +1 -1
- package/dist/components/patterns/pages/PatternEditPage.js +16 -5
- package/dist/components/patterns/pages/PatternsCreatePage.d.ts +2 -1
- package/dist/components/patterns/pages/PatternsCreatePage.d.ts.map +1 -1
- package/dist/components/patterns/pages/PatternsCreatePage.js +17 -5
- package/dist/components/ui/combobox.d.ts +8 -1
- package/dist/components/ui/combobox.d.ts.map +1 -1
- package/dist/components/ui/combobox.js +37 -44
- package/dist/components/ui/country-select.d.ts +3 -1
- package/dist/components/ui/country-select.d.ts.map +1 -1
- package/dist/components/ui/country-select.js +3 -1
- package/dist/components/ui/currency-select.d.ts +3 -1
- package/dist/components/ui/currency-select.d.ts.map +1 -1
- package/dist/components/ui/currency-select.js +3 -1
- package/dist/components/ui/sheet.d.ts +5 -0
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet.js +46 -26
- package/dist/components/ui/timezone-select.d.ts +3 -1
- package/dist/components/ui/timezone-select.d.ts.map +1 -1
- package/dist/components/ui/timezone-select.js +3 -1
- package/dist/contexts/TeamContext.d.ts +6 -0
- package/dist/contexts/TeamContext.d.ts.map +1 -1
- package/dist/contexts/TeamContext.js +8 -1
- package/dist/emails/otp-verification.d.ts.map +1 -1
- package/dist/emails/reset-password.d.ts.map +1 -1
- package/dist/emails/team-invitation.d.ts.map +1 -1
- package/dist/emails/team-invitation.js +3 -2
- package/dist/emails/verify-email.d.ts.map +1 -1
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useAuth.d.ts +29 -0
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +24 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts +22 -0
- package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
- package/dist/hooks/useEnsureUserMetadata.js +18 -5
- package/dist/hooks/useSessionCookieRefresh.d.ts +35 -0
- package/dist/hooks/useSessionCookieRefresh.d.ts.map +1 -0
- package/dist/hooks/useSessionCookieRefresh.js +49 -0
- package/dist/lib/api/api-error.d.ts +3 -1
- package/dist/lib/api/api-error.d.ts.map +1 -1
- package/dist/lib/api/api-error.js +4 -2
- package/dist/lib/api/auth/dual-auth.d.ts +38 -3
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +42 -7
- package/dist/lib/api/auth/permissions.d.ts +7 -2
- package/dist/lib/api/auth/permissions.d.ts.map +1 -1
- package/dist/lib/api/auth/permissions.js +2 -2
- package/dist/lib/api/auth/scope-policy.d.ts +71 -0
- package/dist/lib/api/auth/scope-policy.d.ts.map +1 -0
- package/dist/lib/api/auth/scope-policy.js +53 -0
- package/dist/lib/api/auth.d.ts +15 -0
- package/dist/lib/api/auth.d.ts.map +1 -1
- package/dist/lib/api/auth.js +17 -4
- package/dist/lib/api/entities.js +2 -1
- package/dist/lib/api/entity/audit-log.d.ts +35 -0
- package/dist/lib/api/entity/audit-log.d.ts.map +1 -0
- package/dist/lib/api/entity/audit-log.js +35 -0
- package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
- package/dist/lib/api/entity/generic-handler.js +333 -138
- package/dist/lib/api/entity-handler.js +2 -2
- package/dist/lib/api/helpers.d.ts +29 -4
- package/dist/lib/api/helpers.d.ts.map +1 -1
- package/dist/lib/api/helpers.js +30 -6
- package/dist/lib/api/keys.d.ts +16 -0
- package/dist/lib/api/keys.d.ts.map +1 -1
- package/dist/lib/api/keys.js +19 -1
- package/dist/lib/api/routes/patterns-usages.d.ts.map +1 -1
- package/dist/lib/api/routes/patterns-usages.js +3 -11
- package/dist/lib/auth/auth-methods.d.ts +52 -0
- package/dist/lib/auth/auth-methods.d.ts.map +1 -0
- package/dist/lib/auth/auth-methods.js +63 -0
- package/dist/lib/auth/registration-guard-plugin.d.ts.map +1 -1
- package/dist/lib/auth/registration-helpers.d.ts +9 -0
- package/dist/lib/auth/registration-helpers.d.ts.map +1 -1
- package/dist/lib/auth/registration-helpers.js +8 -2
- package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +52 -0
- package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/device-fingerprint.js +42 -0
- package/dist/lib/auth/security-notifications/dispatcher.d.ts +37 -0
- package/dist/lib/auth/security-notifications/dispatcher.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/dispatcher.js +157 -0
- package/dist/lib/auth/security-notifications/index.d.ts +20 -0
- package/dist/lib/auth/security-notifications/index.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/index.js +22 -0
- package/dist/lib/auth/security-notifications/registry.d.ts +36 -0
- package/dist/lib/auth/security-notifications/registry.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/registry.js +26 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.d.ts +12 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/email-changed.js +43 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts +7 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/new-device-login.js +46 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.d.ts +7 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/password-changed.js +35 -0
- package/dist/lib/auth/security-notifications/templates/shared.d.ts +36 -0
- package/dist/lib/auth/security-notifications/templates/shared.d.ts.map +1 -0
- package/dist/lib/auth/security-notifications/templates/shared.js +68 -0
- package/dist/lib/auth/security-notifications/types.d.ts +74 -0
- package/dist/lib/auth/security-notifications/types.d.ts.map +1 -0
- package/dist/lib/auth/session-config.d.ts +37 -0
- package/dist/lib/auth/session-config.d.ts.map +1 -0
- package/dist/lib/auth/session-config.js +59 -0
- package/dist/lib/auth/session-refresh.d.ts +46 -0
- package/dist/lib/auth/session-refresh.d.ts.map +1 -0
- package/dist/lib/auth/session-refresh.js +11 -0
- package/dist/lib/auth-client.d.ts +1639 -0
- package/dist/lib/auth-client.d.ts.map +1 -0
- package/dist/lib/auth-client.js +13 -1
- package/dist/lib/auth.d.ts.map +1 -1
- package/dist/lib/auth.js +45 -11
- package/dist/lib/billing/gateways/factory.d.ts +8 -3
- package/dist/lib/billing/gateways/factory.d.ts.map +1 -1
- package/dist/lib/billing/gateways/factory.js +37 -23
- package/dist/lib/billing/stripe-webhook.d.ts.map +1 -1
- package/dist/lib/billing/stripe-webhook.js +2 -1
- package/dist/lib/config/app.config.d.ts.map +1 -1
- package/dist/lib/config/app.config.js +71 -0
- package/dist/lib/config/config-sync.d.ts +1 -4
- package/dist/lib/config/config-sync.d.ts.map +1 -1
- package/dist/lib/config/config-sync.js +6 -2
- package/dist/lib/config/types.d.ts +130 -0
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/email/templates.d.ts +3 -3
- package/dist/lib/email/templates.d.ts.map +1 -1
- package/dist/lib/entities/api-generator.js +5 -5
- package/dist/lib/entities/entity-hooks.d.ts +9 -1
- package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
- package/dist/lib/entities/entity-hooks.js +77 -4
- package/dist/lib/entities/schema-generator.d.ts.map +1 -1
- package/dist/lib/entities/schema-generator.js +20 -4
- package/dist/lib/entities/serialization.d.ts +2 -2
- package/dist/lib/entities/serialization.d.ts.map +1 -1
- package/dist/lib/entities/serialization.js +3 -2
- package/dist/lib/entities/types.d.ts +20 -0
- package/dist/lib/entities/types.d.ts.map +1 -1
- package/dist/lib/locale.d.ts.map +1 -1
- package/dist/lib/locale.js +4 -1
- package/dist/lib/mcp/audit.d.ts +8 -4
- package/dist/lib/mcp/audit.d.ts.map +1 -1
- package/dist/lib/plugins/hook-system.d.ts +13 -0
- package/dist/lib/plugins/hook-system.d.ts.map +1 -1
- package/dist/lib/plugins/hook-system.js +32 -2
- package/dist/lib/scheduled-actions/handlers/index.d.ts +1 -0
- package/dist/lib/scheduled-actions/handlers/index.d.ts.map +1 -1
- package/dist/lib/scheduled-actions/handlers/index.js +3 -1
- package/dist/lib/scheduled-actions/handlers/security-notification.d.ts +26 -0
- package/dist/lib/scheduled-actions/handlers/security-notification.d.ts.map +1 -0
- package/dist/lib/scheduled-actions/handlers/security-notification.js +54 -0
- package/dist/lib/selectors/core-selectors.d.ts +12 -0
- package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/auth.selectors.d.ts +12 -0
- package/dist/lib/selectors/domains/auth.selectors.d.ts.map +1 -1
- package/dist/lib/selectors/domains/auth.selectors.js +14 -1
- package/dist/lib/selectors/selectors.d.ts +24 -0
- package/dist/lib/selectors/selectors.d.ts.map +1 -1
- package/dist/lib/services/api-docs.service.d.ts +5 -1
- package/dist/lib/services/api-docs.service.d.ts.map +1 -1
- package/dist/lib/services/api-presets.service.d.ts +6 -1
- package/dist/lib/services/api-presets.service.d.ts.map +1 -1
- package/dist/lib/services/feature.service.d.ts +58 -4
- package/dist/lib/services/feature.service.d.ts.map +1 -1
- package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
- package/dist/lib/services/generic-entity.service.js +16 -32
- package/dist/lib/services/membership.service.d.ts +10 -2
- package/dist/lib/services/membership.service.d.ts.map +1 -1
- package/dist/lib/services/membership.service.js +37 -16
- package/dist/lib/services/permission.service.d.ts +10 -4
- package/dist/lib/services/permission.service.d.ts.map +1 -1
- package/dist/lib/services/plugin.service.d.ts +1 -1
- package/dist/lib/services/plugin.service.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.d.ts.map +1 -1
- package/dist/lib/services/subscription.service.js +2 -1
- package/dist/lib/services/team-member.service.d.ts +15 -3
- package/dist/lib/services/team-member.service.d.ts.map +1 -1
- package/dist/lib/services/team-member.service.js +27 -6
- package/dist/lib/services/team.service.d.ts.map +1 -1
- package/dist/lib/teams/permissions.d.ts +3 -1
- package/dist/lib/teams/permissions.d.ts.map +1 -1
- package/dist/lib/teams/permissions.js +6 -0
- package/dist/lib/teams/schema.d.ts.map +1 -1
- package/dist/lib/teams/schema.js +3 -0
- package/dist/lib/template-resolver.d.ts +3 -3
- package/dist/lib/theme/forced-theme.d.ts +34 -0
- package/dist/lib/theme/forced-theme.d.ts.map +1 -0
- package/dist/lib/theme/forced-theme.js +27 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts +3 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
- package/dist/lib/theme/get-default-theme-mode.js +5 -3
- package/dist/lib/utils/cors.d.ts +13 -0
- package/dist/lib/utils/cors.d.ts.map +1 -1
- package/dist/lib/utils/cors.js +20 -0
- package/dist/messages/de/auth.json +25 -2
- package/dist/messages/de/index.d.ts +83 -0
- package/dist/messages/de/index.d.ts.map +1 -1
- package/dist/messages/de/index.js +2 -0
- package/dist/messages/de/index.ts +2 -0
- package/dist/messages/de/navigation.json +3 -1
- package/dist/messages/en/auth.json +25 -2
- package/dist/messages/en/index.d.ts +83 -0
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/en/index.js +2 -0
- package/dist/messages/en/index.ts +2 -0
- package/dist/messages/en/navigation.json +3 -1
- package/dist/messages/es/auth.json +25 -2
- package/dist/messages/es/index.d.ts +83 -0
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/es/index.js +2 -0
- package/dist/messages/es/index.ts +2 -0
- package/dist/messages/es/navigation.json +3 -1
- package/dist/messages/fr/auth.json +25 -2
- package/dist/messages/fr/index.d.ts +83 -0
- package/dist/messages/fr/index.d.ts.map +1 -1
- package/dist/messages/fr/index.js +2 -0
- package/dist/messages/fr/index.ts +2 -0
- package/dist/messages/fr/navigation.json +3 -1
- package/dist/messages/it/auth.json +25 -2
- package/dist/messages/it/index.d.ts +83 -0
- package/dist/messages/it/index.d.ts.map +1 -1
- package/dist/messages/it/index.js +2 -0
- package/dist/messages/it/index.ts +2 -0
- package/dist/messages/it/navigation.json +3 -1
- package/dist/messages/pt/auth.json +25 -2
- package/dist/messages/pt/index.d.ts +83 -0
- package/dist/messages/pt/index.d.ts.map +1 -1
- package/dist/messages/pt/index.js +2 -0
- package/dist/messages/pt/index.ts +2 -0
- package/dist/messages/pt/navigation.json +3 -1
- package/dist/migrations/005_api_audit_log.sql +2 -1
- package/dist/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
- package/dist/migrations/026_login_events.sql +91 -0
- package/dist/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
- package/dist/nextspark-registries.d.ts +580 -236
- package/dist/providers/DashboardProviders.d.ts +12 -3
- package/dist/providers/DashboardProviders.d.ts.map +1 -1
- package/dist/providers/DashboardProviders.js +6 -2
- package/dist/providers/theme-provider.d.ts +19 -2
- package/dist/providers/theme-provider.d.ts.map +1 -1
- package/dist/providers/theme-provider.js +6 -2
- package/dist/templates/app/(auth)/signup/page.tsx +8 -0
- package/dist/templates/app/(public)/[...slug]/page.tsx +9 -14
- package/dist/templates/app/api/auth/[...all]/route.ts +23 -1
- package/dist/templates/app/api/health/route.ts +4 -2
- package/dist/templates/app/api/internal/user-metadata/route.ts +5 -3
- package/dist/templates/app/api/mcp/route.ts +4 -1
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +2 -1
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
- package/dist/templates/app/api/v1/api-keys/route.ts +21 -43
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
- package/dist/templates/app/api/v1/billing/cancel/route.ts +7 -6
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +5 -4
- package/dist/templates/app/api/v1/billing/check-action/route.ts +6 -4
- package/dist/templates/app/api/v1/billing/checkout/route.ts +7 -5
- package/dist/templates/app/api/v1/billing/plans/route.ts +8 -12
- package/dist/templates/app/api/v1/billing/portal/route.ts +7 -5
- package/dist/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/features/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/flows/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
- package/dist/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
- package/dist/templates/app/api/v1/devtools/testing/route.ts +5 -4
- package/dist/templates/app/api/v1/media/[id]/route.ts +13 -25
- package/dist/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
- package/dist/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
- package/dist/templates/app/api/v1/media/route.ts +5 -9
- package/dist/templates/app/api/v1/media/upload/route.ts +9 -21
- package/dist/templates/app/api/v1/media-tags/route.ts +9 -13
- package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
- package/dist/templates/app/api/v1/post-categories/route.ts +5 -4
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
- package/dist/templates/app/api/v1/team-invitations/route.ts +9 -11
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
- package/dist/templates/app/api/v1/teams/route.ts +33 -27
- package/dist/templates/app/api/v1/teams/switch/route.ts +11 -13
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +23 -2
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
- package/dist/templates/app/api/v1/users/[id]/route.ts +35 -68
- package/dist/templates/app/api/v1/users/route.ts +21 -25
- package/dist/templates/app/dashboard/layout.tsx +2 -6
- package/dist/templates/app/layout.ppr.tsx +15 -15
- package/dist/templates/app/layout.tsx +46 -20
- package/dist/templates/contents/themes/starter/config/app.config.ts +19 -0
- package/dist/templates/contents/themes/starter/config/theme.config.ts +6 -0
- package/dist/templates/contents/themes/starter/styles/globals.css +6 -2
- package/dist/templates/proxy.ts +46 -10
- package/dist/templates/tsconfig.json +4 -0
- package/dist/types/theme.d.ts +9 -0
- package/dist/types/theme.d.ts.map +1 -1
- package/migrations/005_api_audit_log.sql +2 -1
- package/migrations/025_api_audit_log_nullable_api_key.sql +12 -0
- package/migrations/026_login_events.sql +91 -0
- package/migrations/027_rls_bypass_developer_and_system_admin_team.sql +197 -0
- package/package.json +14 -11
- package/scripts/build/registry/__tests__/scope-registry.test.mjs +18 -0
- package/scripts/build/registry/generators/scope-registry.mjs +9 -2
- package/templates/app/(auth)/signup/page.tsx +8 -0
- package/templates/app/(public)/[...slug]/page.tsx +9 -14
- package/templates/app/api/auth/[...all]/route.ts +23 -1
- package/templates/app/api/health/route.ts +4 -2
- package/templates/app/api/internal/user-metadata/route.ts +5 -3
- package/templates/app/api/mcp/route.ts +4 -1
- package/templates/app/api/superadmin/subscriptions/route.ts +2 -1
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +4 -3
- package/templates/app/api/superadmin/users/[userId]/route.ts +10 -3
- package/templates/app/api/v1/api-keys/[id]/route.ts +50 -71
- package/templates/app/api/v1/api-keys/route.ts +21 -43
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +14 -14
- package/templates/app/api/v1/billing/cancel/route.ts +7 -6
- package/templates/app/api/v1/billing/change-plan/route.ts +5 -4
- package/templates/app/api/v1/billing/check-action/route.ts +6 -4
- package/templates/app/api/v1/billing/checkout/route.ts +7 -5
- package/templates/app/api/v1/billing/plans/route.ts +8 -12
- package/templates/app/api/v1/billing/portal/route.ts +7 -5
- package/templates/app/api/v1/billing/webhooks/polar/route.ts +1 -1
- package/templates/app/api/v1/devtools/blocks/route.ts +5 -4
- package/templates/app/api/v1/devtools/features/route.ts +5 -4
- package/templates/app/api/v1/devtools/flows/route.ts +5 -4
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +9 -7
- package/templates/app/api/v1/devtools/scheduled-actions/run/route.ts +5 -4
- package/templates/app/api/v1/devtools/testing/route.ts +5 -4
- package/templates/app/api/v1/media/[id]/route.ts +13 -25
- package/templates/app/api/v1/media/[id]/tags/route.ts +17 -25
- package/templates/app/api/v1/media/check-duplicates/route.ts +5 -7
- package/templates/app/api/v1/media/route.ts +5 -9
- package/templates/app/api/v1/media/upload/route.ts +9 -21
- package/templates/app/api/v1/media-tags/route.ts +9 -13
- package/templates/app/api/v1/patterns/[id]/usages/route.ts +11 -19
- package/templates/app/api/v1/post-categories/[id]/route.ts +9 -7
- package/templates/app/api/v1/post-categories/route.ts +5 -4
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +16 -18
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +15 -17
- package/templates/app/api/v1/team-invitations/[token]/route.ts +8 -8
- package/templates/app/api/v1/team-invitations/route.ts +9 -11
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +41 -32
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +15 -16
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +14 -15
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +32 -36
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +33 -33
- package/templates/app/api/v1/teams/[teamId]/route.ts +35 -41
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +5 -3
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +10 -6
- package/templates/app/api/v1/teams/route.ts +33 -27
- package/templates/app/api/v1/teams/switch/route.ts +11 -13
- package/templates/app/api/v1/theme/[...path]/route.ts +23 -2
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +32 -77
- package/templates/app/api/v1/users/[id]/route.ts +35 -68
- package/templates/app/api/v1/users/route.ts +21 -25
- package/templates/app/dashboard/layout.tsx +2 -6
- package/templates/app/layout.ppr.tsx +15 -15
- package/templates/app/layout.tsx +46 -20
- package/templates/contents/themes/starter/config/app.config.ts +19 -0
- package/templates/contents/themes/starter/config/theme.config.ts +6 -0
- package/templates/contents/themes/starter/styles/globals.css +6 -2
- package/templates/proxy.ts +46 -10
- package/templates/tsconfig.json +4 -0
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +23 -0
- package/tests/jest/__mocks__/next-server.js +24 -0
- package/dist/components/teams/TeamSwitchModal.d.js +0 -0
- package/dist/components/ui/accordion.d.js +0 -0
- package/dist/components/ui/avatar.d.js +0 -0
- package/dist/components/ui/badge.d.js +0 -0
- package/dist/components/ui/button.d.js +0 -0
- package/dist/components/ui/card.d.js +0 -0
- package/dist/components/ui/dialog.d.js +0 -0
- package/dist/components/ui/dropdown-menu.d.js +0 -0
- package/dist/components/ui/input.d.js +0 -0
- package/dist/components/ui/progress.d.js +0 -0
- package/dist/components/ui/scroll-area.d.js +0 -0
- package/dist/components/ui/select.d.js +0 -0
- package/dist/components/ui/separator.d.js +0 -0
- package/dist/components/ui/table.d.js +0 -0
- package/dist/components/ui/textarea.d.js +0 -0
- package/dist/contexts/TeamContext.d.js +0 -0
- package/dist/hooks/useAuth.d.js +0 -0
- package/dist/hooks/useLastAuthMethod.d.js +0 -0
- package/dist/hooks/useOrigin.d.js +0 -0
- package/dist/lib/api/auth/dual-auth.d.js +0 -0
- package/dist/lib/api/auth.d.js +0 -0
- package/dist/lib/api/cache.d.js +0 -0
- package/dist/lib/api/keys.d.js +0 -0
- package/dist/lib/auth-client.d.js +0 -0
- package/dist/lib/auth-context.d.js +0 -0
- package/dist/lib/auth.d.js +0 -0
- package/dist/lib/billing/config-types.d.js +0 -0
- package/dist/lib/billing/enforcement.d.js +0 -0
- package/dist/lib/billing/helpers.d.js +0 -0
- package/dist/lib/billing/jobs.d.js +0 -0
- package/dist/lib/billing/types.d.js +0 -0
- package/dist/lib/blocks/loader.d.js +0 -0
- package/dist/lib/config/app.config.d.js +0 -0
- package/dist/lib/config/config-loader.d.js +0 -0
- package/dist/lib/config/config-sync.d.js +0 -0
- package/dist/lib/config/config-types.d.js +0 -0
- package/dist/lib/config/config-utils.d.js +0 -0
- package/dist/lib/config/dashboard-types.d.js +0 -0
- package/dist/lib/config/dashboard.config.d.js +0 -0
- package/dist/lib/config/icon-map.d.js +0 -0
- package/dist/lib/config/index.d.js +0 -7
- package/dist/lib/config/nextspark-types.d.js +0 -0
- package/dist/lib/config/roles-merge.d.js +0 -0
- package/dist/lib/config/types.d.js +0 -0
- package/dist/lib/db.d.js +0 -0
- package/dist/lib/email/factory.d.js +0 -0
- package/dist/lib/email/index.d.js +0 -3
- package/dist/lib/email/providers/console.d.js +0 -0
- package/dist/lib/email/providers/resend.d.js +0 -0
- package/dist/lib/email/templates.d.js +0 -0
- package/dist/lib/email/types.d.js +0 -0
- package/dist/lib/entities/types.d.js +0 -0
- package/dist/lib/permissions/system.d.js +0 -0
- package/dist/lib/permissions/types.d.js +0 -0
- package/dist/lib/plugins/hook-system.d.js +0 -0
- package/dist/lib/scheduled-actions/cleanup.d.js +0 -0
- package/dist/lib/scheduled-actions/index.d.js +0 -19
- package/dist/lib/scheduled-actions/initializer.d.js +0 -1
- package/dist/lib/scheduled-actions/processor.d.js +0 -0
- package/dist/lib/scheduled-actions/registry.d.js +0 -0
- package/dist/lib/scheduled-actions/scheduler.d.js +0 -0
- package/dist/lib/scheduled-actions/types.d.js +0 -0
- package/dist/lib/services/api-routes.service.d.js +0 -0
- package/dist/lib/services/entity-type.service.d.js +0 -0
- package/dist/lib/services/index.d.js +0 -40
- package/dist/lib/services/invoice.service.d.js +0 -0
- package/dist/lib/services/membership.service.d.js +0 -0
- package/dist/lib/services/meta.service.d.js +0 -0
- package/dist/lib/services/middleware.service.d.js +0 -0
- package/dist/lib/services/namespace.service.d.js +0 -0
- package/dist/lib/services/permission.service.d.js +0 -0
- package/dist/lib/services/plan.service.d.js +0 -0
- package/dist/lib/services/plugin.service.d.js +0 -0
- package/dist/lib/services/route-handler.service.d.js +0 -0
- package/dist/lib/services/scope.service.d.js +0 -0
- package/dist/lib/services/subscription.service.d.js +0 -0
- package/dist/lib/services/team-member.service.d.js +0 -0
- package/dist/lib/services/team.service.d.js +0 -0
- package/dist/lib/services/theme.service.d.js +0 -0
- package/dist/lib/services/usage.service.d.js +0 -0
- package/dist/lib/services/user-flags.service.d.js +0 -0
- package/dist/lib/services/user.service.d.js +0 -0
- package/dist/lib/teams/helpers.d.js +0 -0
- package/dist/lib/teams/permissions.d.js +0 -0
- package/dist/lib/teams/types.d.js +0 -0
- package/dist/lib/utils/config-merge.d.js +0 -0
- package/dist/lib/utils/file-logger.d.js +0 -0
- package/dist/lib/utils.d.js +0 -0
- package/dist/styles/classes.json +0 -1093
- package/dist/styles/ui.css +0 -2
- package/dist/types/auth.d.js +0 -0
- package/dist/types/blocks.d.js +0 -0
- package/dist/types/meta.types.d.js +0 -0
- package/dist/types/plugin.d.js +0 -0
- package/dist/types/testing.types.d.js +0 -0
- package/dist/types/theme.d.js +0 -0
- package/dist/types/user.types.d.js +0 -0
- package/scripts/build/build-ui-css.mjs +0 -351
- /package/dist/{components/app/layouts/PublicFooter.d.js → lib/auth/security-notifications/types.js} +0 -0
- /package/dist/{components/app/layouts/PublicNavbar.d.js → nextspark-registries.d.js} +0 -0
- /package/dist/{components/app/misc/ThemeToggle.d.js → types/use-intl-react-shim.d.js} +0 -0
|
@@ -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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"}
|
|
@@ -53,7 +53,11 @@ export declare class ApiDocsService {
|
|
|
53
53
|
*
|
|
54
54
|
* @returns Object with totalDocs, generatedAt, themeName
|
|
55
55
|
*/
|
|
56
|
-
static getMeta():
|
|
56
|
+
static getMeta(): {
|
|
57
|
+
totalDocs: number;
|
|
58
|
+
generatedAt: string;
|
|
59
|
+
themeName: string;
|
|
60
|
+
};
|
|
57
61
|
/**
|
|
58
62
|
* Get total count of documented endpoints
|
|
59
63
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-docs.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/api-docs.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,2CAA2C,CAAA;AAGlD,YAAY,EAAE,WAAW,EAAE,CAAA;AAE3B;;;;;GAKG;AACH,qBAAa,cAAc;IAGzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/D;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;OAIG;IACH,MAAM,CAAC,eAAe,IAAI,MAAM,EAAE;IAMlC;;;;OAIG;IACH,MAAM,CAAC,OAAO
|
|
1
|
+
{"version":3,"file":"api-docs.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/api-docs.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,2CAA2C,CAAA;AAGlD,YAAY,EAAE,WAAW,EAAE,CAAA;AAE3B;;;;;GAKG;AACH,qBAAa,cAAc;IAGzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/D;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;OAIG;IACH,MAAM,CAAC,eAAe,IAAI,MAAM,EAAE;IAMlC;;;;OAIG;IACH,MAAM,CAAC,OAAO;;;;;IAId;;;;OAIG;IACH,MAAM,CAAC,YAAY,IAAI,MAAM;IAM7B;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKvD;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAIzD"}
|
|
@@ -64,7 +64,12 @@ export declare class ApiPresetsService {
|
|
|
64
64
|
*
|
|
65
65
|
* @returns Object with totalEndpoints, totalPresets, generatedAt, themeName
|
|
66
66
|
*/
|
|
67
|
-
static getMeta():
|
|
67
|
+
static getMeta(): {
|
|
68
|
+
totalEndpoints: number;
|
|
69
|
+
totalPresets: number;
|
|
70
|
+
generatedAt: string;
|
|
71
|
+
themeName: string;
|
|
72
|
+
};
|
|
68
73
|
/**
|
|
69
74
|
* Get total count of presets
|
|
70
75
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-presets.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/api-presets.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAA;AAGrD,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAA;AAE7C;;;;;GAKG;AACH,qBAAa,iBAAiB;IAG5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAItE;;;;;;;;;OASG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAI5E;;;;OAIG;IACH,MAAM,CAAC,MAAM,IAAI,kBAAkB,EAAE;IAIrC;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM5C;;;;OAIG;IACH,MAAM,CAAC,OAAO
|
|
1
|
+
{"version":3,"file":"api-presets.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/api-presets.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,8CAA8C,CAAA;AAGrD,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAA;AAE7C;;;;;GAKG;AACH,qBAAa,iBAAiB;IAG5B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAItE;;;;;;;;;OASG;IACH,MAAM,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAI5E;;;;OAIG;IACH,MAAM,CAAC,MAAM,IAAI,kBAAkB,EAAE;IAIrC;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAM5C;;;;OAIG;IACH,MAAM,CAAC,OAAO;;;;;;IAId;;;;OAIG;IACH,MAAM,CAAC,eAAe,IAAI,MAAM;IAIhC;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,IAAI,MAAM;IAMlC;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE;IAezC;;;;OAIG;IACH,MAAM,CAAC,UAAU,IAAI,MAAM,EAAE;CAc9B"}
|
|
@@ -75,19 +75,73 @@ export declare class FeatureService {
|
|
|
75
75
|
/**
|
|
76
76
|
* Get all tags in a category
|
|
77
77
|
*/
|
|
78
|
-
static getTagsByCategory(category: keyof typeof TAGS_REGISTRY):
|
|
78
|
+
static getTagsByCategory(category: keyof typeof TAGS_REGISTRY): Record<string, {
|
|
79
|
+
tag: string;
|
|
80
|
+
testCount: number;
|
|
81
|
+
files: string[];
|
|
82
|
+
}> | Record<string, {
|
|
83
|
+
tag: string;
|
|
84
|
+
testCount: number;
|
|
85
|
+
files: string[];
|
|
86
|
+
}> | Record<string, {
|
|
87
|
+
tag: string;
|
|
88
|
+
testCount: number;
|
|
89
|
+
files: string[];
|
|
90
|
+
}> | Record<string, {
|
|
91
|
+
tag: string;
|
|
92
|
+
testCount: number;
|
|
93
|
+
files: string[];
|
|
94
|
+
}> | Record<string, {
|
|
95
|
+
tag: string;
|
|
96
|
+
testCount: number;
|
|
97
|
+
files: string[];
|
|
98
|
+
}> | Record<string, {
|
|
99
|
+
tag: string;
|
|
100
|
+
testCount: number;
|
|
101
|
+
files: string[];
|
|
102
|
+
}> | Record<string, {
|
|
103
|
+
tag: string;
|
|
104
|
+
testCount: number;
|
|
105
|
+
files: string[];
|
|
106
|
+
}> | Record<string, {
|
|
107
|
+
tag: string;
|
|
108
|
+
testCount: number;
|
|
109
|
+
files: string[];
|
|
110
|
+
}>;
|
|
79
111
|
/**
|
|
80
112
|
* Get all feature tags
|
|
81
113
|
*/
|
|
82
|
-
static getFeatureTags():
|
|
114
|
+
static getFeatureTags(): Record<string, {
|
|
115
|
+
tag: string;
|
|
116
|
+
testCount: number;
|
|
117
|
+
files: string[];
|
|
118
|
+
}>;
|
|
83
119
|
/**
|
|
84
120
|
* Get all flow tags
|
|
85
121
|
*/
|
|
86
|
-
static getFlowTags():
|
|
122
|
+
static getFlowTags(): Record<string, {
|
|
123
|
+
tag: string;
|
|
124
|
+
testCount: number;
|
|
125
|
+
files: string[];
|
|
126
|
+
}>;
|
|
87
127
|
/**
|
|
88
128
|
* Get coverage summary
|
|
89
129
|
*/
|
|
90
|
-
static getCoverageSummary():
|
|
130
|
+
static getCoverageSummary(): {
|
|
131
|
+
features: {
|
|
132
|
+
total: number;
|
|
133
|
+
withTests: number;
|
|
134
|
+
withoutTests: number;
|
|
135
|
+
};
|
|
136
|
+
flows: {
|
|
137
|
+
total: number;
|
|
138
|
+
withTests: number;
|
|
139
|
+
withoutTests: number;
|
|
140
|
+
};
|
|
141
|
+
tags: {
|
|
142
|
+
testFiles: number;
|
|
143
|
+
};
|
|
144
|
+
};
|
|
91
145
|
/**
|
|
92
146
|
* Get feature coverage percentage
|
|
93
147
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/feature.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAGL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,0CAA0C,CAAA;AAEjD;;;;;;;GAOG;AACH,qBAAa,cAAc;IAKzB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIxD;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE;IAIvC;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,EAAE;IAIvE;;OAEG;IACH,MAAM,CAAC,uBAAuB,IAAI,YAAY,EAAE;IAIhD;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,YAAY,EAAE;IAI7C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIlD;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,SAAS,EAAE;IAIjC;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAAE;IAI9D;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,SAAS,EAAE;IAItC;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,SAAS,EAAE;IAI1C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQtC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,OAAO,aAAa
|
|
1
|
+
{"version":3,"file":"feature.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/feature.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAGL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,KAAK,YAAY,EAClB,MAAM,0CAA0C,CAAA;AAEjD;;;;;;;GAOG;AACH,qBAAa,cAAc;IAKzB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIxD;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE;IAIvC;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,YAAY,EAAE;IAIvE;;OAEG;IACH,MAAM,CAAC,uBAAuB,IAAI,YAAY,EAAE;IAIhD;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,YAAY,EAAE;IAI7C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQzC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIlD;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,SAAS,EAAE;IAIjC;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAAE;IAI9D;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,SAAS,EAAE;IAItC;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,SAAS,EAAE;IAI1C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQtC;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,OAAO,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAI7D;;OAEG;IACH,MAAM,CAAC,cAAc;;;;;IAIrB;;OAEG;IACH,MAAM,CAAC,WAAW;;;;;IAQlB;;OAEG;IACH,MAAM,CAAC,kBAAkB;;;;;;;;;;;;;;;IAIzB;;OAEG;IACH,MAAM,CAAC,yBAAyB,IAAI,MAAM;IAK1C;;OAEG;IACH,MAAM,CAAC,sBAAsB,IAAI,MAAM;CAIxC"}
|
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAYH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAA;AAMlE,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAiBD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AA8MD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,GAAE,OAAe,GACxB,gBAAgB,CAuClB;AAMD,qBAAa,oBAAoB;IAC/B;;;;;;;;OAQG;WACU,OAAO,CAAC,CAAC,GAAG,OAAO,EAC9B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAgCpB;;;;;;;OAOG;WACU,IAAI,CAAC,CAAC,GAAG,OAAO,EAC3B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAiFhC;;;;;;;;OAQG;WACU,MAAM,CAAC,CAAC,GAAG,OAAO,EAC7B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC;IAiEb;;;;;;;;;OASG;WACU,MAAM,CAAC,CAAC,GAAG,OAAO,EAC7B,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC;IAiGb;;;;;;;;OAQG;WACU,MAAM,CACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA0DnB;;;;;;;;OAQG;WACU,MAAM,CACjB,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC;IA2BnB;;;;;;;OAOG;WACU,KAAK,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAClC,OAAO,CAAC,MAAM,CAAC;IA0BlB;;;;;;;;;;;;;;;;OAgBG;WACU,UAAU,CACrB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GACxD,OAAO,CAAC,MAAM,CAAC;CAyCnB"}
|
|
@@ -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: {
|
|
@@ -86,10 +86,16 @@ export declare class PermissionService {
|
|
|
86
86
|
* // Use in Admin Panel permissions UI
|
|
87
87
|
*/
|
|
88
88
|
static getMatrix(): {
|
|
89
|
-
permissions:
|
|
90
|
-
matrix:
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
permissions: import("@nextsparkjs/registries/permissions-registry").ResolvedPermission[];
|
|
90
|
+
matrix: {
|
|
91
|
+
[x: string]: Record<string, boolean>;
|
|
92
|
+
};
|
|
93
|
+
sections: {
|
|
94
|
+
key: string;
|
|
95
|
+
label: string;
|
|
96
|
+
permissions: import("@nextsparkjs/registries/permissions-registry").Permission[];
|
|
97
|
+
}[];
|
|
98
|
+
roles: string[];
|
|
93
99
|
};
|
|
94
100
|
/**
|
|
95
101
|
* Check if a permission ID is valid - O(1)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/permission.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,qBAAa,iBAAiB;IAC5B;;;;;;;;;OASG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO;IAKnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAazD;;;;;;;;OAQG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;IAKrD;;;;;;;;OAQG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAI5D;;;;;;;OAOG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;IAIhC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS
|
|
1
|
+
{"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/permission.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,qBAAa,iBAAiB;IAC5B;;;;;;;;;OASG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO;IAKnE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAazD;;;;;;;;OAQG;IACH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;IAKrD;;;;;;;;OAQG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAI5D;;;;;;;OAOG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;IAIhC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS;;;;;;;;;;;;IAUhB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAI/C;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS;IAIxE;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,IAAI,UAAU,EAAE;IAI7B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO;IAIzE;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO;CAG3E;AAMD;;;GAGG;AACH,eAAO,MAAM,aAAa,wCAAkC,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,WAAW,sCAAgC,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,6CAAuC,CAAA;AAEtE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,wCAAkC,CAAA;AAEvE;;;GAGG;AACH,eAAO,MAAM,aAAa,wCAAkC,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,aAAa,oCAA8B,CAAA;AAExD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,kCAA4B,CAAA;AAE1D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,oCAA8B,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;CAS9B,CAAA"}
|
|
@@ -404,7 +404,7 @@ export declare const getAllRouteEndpoints: typeof PluginService.getAllRouteEndpo
|
|
|
404
404
|
/**
|
|
405
405
|
* @deprecated Use PluginService.findRouteEndpoint() instead
|
|
406
406
|
*/
|
|
407
|
-
export declare const findRouteEndpoint: (path: string) =>
|
|
407
|
+
export declare const findRouteEndpoint: (path: string) => RouteFileEndpoint;
|
|
408
408
|
/**
|
|
409
409
|
* @deprecated Use PluginService.getPluginRouteEndpoints() instead
|
|
410
410
|
*/
|