@payez/next-mvp 4.0.1 → 4.0.3
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/api/auth-handler.d.ts +66 -0
- package/dist/api/auth-handler.js +397 -0
- package/dist/api/index.d.ts +10 -0
- package/dist/api/index.js +19 -0
- package/dist/api-handlers/account/change-password.d.ts +9 -0
- package/dist/api-handlers/account/change-password.js +110 -0
- package/dist/api-handlers/account/masked-info.d.ts +2 -0
- package/dist/api-handlers/account/masked-info.js +41 -0
- package/dist/api-handlers/account/profile.d.ts +3 -0
- package/dist/api-handlers/account/profile.js +63 -0
- package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
- package/dist/api-handlers/account/recovery/initiate.js +26 -0
- package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/send-code.js +28 -0
- package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
- package/dist/api-handlers/account/recovery/verify-code.js +28 -0
- package/dist/api-handlers/account/reset-password.d.ts +2 -0
- package/dist/api-handlers/account/reset-password.js +26 -0
- package/dist/api-handlers/account/send-code.d.ts +24 -0
- package/dist/api-handlers/account/send-code.js +60 -0
- package/dist/api-handlers/account/update-phone.d.ts +27 -0
- package/dist/api-handlers/account/update-phone.js +64 -0
- package/dist/api-handlers/account/validate-password.d.ts +17 -0
- package/dist/api-handlers/account/validate-password.js +81 -0
- package/dist/api-handlers/account/verify-email.d.ts +26 -0
- package/dist/api-handlers/account/verify-email.js +106 -0
- package/dist/api-handlers/account/verify-sms.d.ts +26 -0
- package/dist/api-handlers/account/verify-sms.js +106 -0
- package/dist/api-handlers/admin/analytics.d.ts +19 -0
- package/dist/api-handlers/admin/analytics.js +378 -0
- package/dist/api-handlers/admin/audit.d.ts +19 -0
- package/dist/api-handlers/admin/audit.js +213 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +42 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +35 -0
- package/dist/api-handlers/admin/redis-sessions.js +203 -0
- package/dist/api-handlers/admin/sessions.d.ts +20 -0
- package/dist/api-handlers/admin/sessions.js +283 -0
- package/dist/api-handlers/admin/site-logs.d.ts +45 -0
- package/dist/api-handlers/admin/site-logs.js +317 -0
- package/dist/api-handlers/admin/stats.d.ts +20 -0
- package/dist/api-handlers/admin/stats.js +239 -0
- package/dist/api-handlers/admin/users.d.ts +19 -0
- package/dist/api-handlers/admin/users.js +221 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +79 -0
- package/dist/api-handlers/admin/vibe-data.js +267 -0
- package/dist/api-handlers/anon/preferences.d.ts +37 -0
- package/dist/api-handlers/anon/preferences.js +96 -0
- package/dist/api-handlers/auth/jwks.d.ts +2 -0
- package/dist/api-handlers/auth/jwks.js +24 -0
- package/dist/api-handlers/auth/login.d.ts +42 -0
- package/dist/api-handlers/auth/login.js +178 -0
- package/dist/api-handlers/auth/refresh.d.ts +74 -0
- package/dist/api-handlers/auth/refresh.js +633 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +186 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +23 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +93 -0
- package/dist/api-handlers/auth/validate.d.ts +6 -0
- package/dist/api-handlers/auth/validate.js +43 -0
- package/dist/api-handlers/auth/verify-code.d.ts +43 -0
- package/dist/api-handlers/auth/verify-code.js +90 -0
- package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
- package/dist/api-handlers/session/refresh-viability.js +39 -0
- package/dist/api-handlers/session/viability.d.ts +13 -0
- package/dist/api-handlers/session/viability.js +114 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +59 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/better-auth.d.ts +79 -0
- package/dist/auth/better-auth.js +119 -0
- package/dist/auth/route-config.d.ts +66 -0
- package/dist/auth/route-config.js +190 -0
- package/dist/auth/types/auth-types.d.ts +417 -0
- package/dist/auth/types/auth-types.js +53 -0
- package/dist/auth/types/index.d.ts +6 -0
- package/dist/auth/types/index.js +22 -0
- package/dist/auth/unauthenticated-routes.d.ts +1 -0
- package/dist/auth/unauthenticated-routes.js +19 -0
- package/dist/auth/utils/idp-client.d.ts +94 -0
- package/dist/auth/utils/idp-client.js +384 -0
- package/dist/auth/utils/index.d.ts +5 -0
- package/dist/auth/utils/index.js +21 -0
- package/dist/auth/utils/token-utils.d.ts +83 -0
- package/dist/auth/utils/token-utils.js +218 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +115 -0
- package/dist/client/better-auth-client.d.ts +1020 -0
- package/dist/client/better-auth-client.js +68 -0
- package/dist/client/fetch-with-auth.d.ts +11 -0
- package/dist/client/fetch-with-auth.js +44 -0
- package/dist/client/fetchWithSession.d.ts +3 -0
- package/dist/client/fetchWithSession.js +24 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +20 -0
- package/dist/client/useAnonSession.d.ts +36 -0
- package/dist/client/useAnonSession.js +99 -0
- package/dist/components/SessionSync.d.ts +13 -0
- package/dist/components/SessionSync.js +121 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/MobileNavDrawer.d.ts +32 -0
- package/dist/components/account/MobileNavDrawer.js +81 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +91 -0
- package/dist/components/account/index.d.ts +9 -0
- package/dist/components/account/index.js +13 -0
- package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
- package/dist/components/admin/AlertSettingsTab.js +351 -0
- package/dist/components/admin/AnalyticsTab.d.ts +22 -0
- package/dist/components/admin/AnalyticsTab.js +167 -0
- package/dist/components/admin/DataBrowserTab.d.ts +19 -0
- package/dist/components/admin/DataBrowserTab.js +252 -0
- package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
- package/dist/components/admin/LoggingSettingsTab.js +339 -0
- package/dist/components/admin/SessionsTab.d.ts +37 -0
- package/dist/components/admin/SessionsTab.js +165 -0
- package/dist/components/admin/StatsTab.d.ts +53 -0
- package/dist/components/admin/StatsTab.js +161 -0
- package/dist/components/admin/VibeAdminContext.d.ts +32 -0
- package/dist/components/admin/VibeAdminContext.js +38 -0
- package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
- package/dist/components/admin/VibeAdminLayout.js +71 -0
- package/dist/components/admin/index.d.ts +29 -0
- package/dist/components/admin/index.js +44 -0
- package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
- package/dist/components/auth/FederatedAuthSection.js +45 -0
- package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
- package/dist/components/auth/ModeAwareLoginPage.js +42 -0
- package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
- package/dist/components/auth/ModeAwareSignupPage.js +78 -0
- package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
- package/dist/components/auth/TraditionalAuthSection.js +20 -0
- package/dist/components/recovery/CompleteStep.d.ts +5 -0
- package/dist/components/recovery/CompleteStep.js +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
- package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
- package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
- package/dist/components/recovery/SelectMethodStep.js +8 -0
- package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
- package/dist/components/recovery/SetPasswordStep.js +20 -0
- package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
- package/dist/components/recovery/VerifyCodeStep.js +24 -0
- package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
- package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
- package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
- package/dist/components/reserved/ReservedStatusBox.js +71 -0
- package/dist/components/ui/BetaBadge.d.ts +29 -0
- package/dist/components/ui/BetaBadge.js +38 -0
- package/dist/components/ui/Footer.d.ts +37 -0
- package/dist/components/ui/Footer.js +41 -0
- package/dist/config/env.d.ts +66 -0
- package/dist/config/env.js +57 -0
- package/dist/config/logger.d.ts +57 -0
- package/dist/config/logger.js +73 -0
- package/dist/config/logging-config.d.ts +30 -0
- package/dist/config/logging-config.js +122 -0
- package/dist/config/unauthenticated-routes.d.ts +17 -0
- package/dist/config/unauthenticated-routes.js +24 -0
- package/dist/config/vibe-log-transport.d.ts +81 -0
- package/dist/config/vibe-log-transport.js +212 -0
- package/dist/edge/internal-api-url.d.ts +53 -0
- package/dist/edge/internal-api-url.js +63 -0
- package/dist/edge/middleware.d.ts +14 -0
- package/dist/edge/middleware.js +32 -0
- package/dist/hooks/useAuth.d.ts +23 -0
- package/dist/hooks/useAuth.js +83 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +43 -0
- package/dist/hooks/useAvailableProviders.js +112 -0
- package/dist/hooks/usePasswordValidation.d.ts +27 -0
- package/dist/hooks/usePasswordValidation.js +102 -0
- package/dist/hooks/useProfile.d.ts +15 -0
- package/dist/hooks/useProfile.js +59 -0
- package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
- package/dist/hooks/usePublicAuthSettings.js +131 -0
- package/dist/hooks/useSessionExpiration.d.ts +56 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +269 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +53 -0
- package/dist/lib/anon-session.d.ts +74 -0
- package/dist/lib/anon-session.js +169 -0
- package/dist/lib/api-handler.d.ts +123 -0
- package/dist/lib/api-handler.js +478 -0
- package/dist/lib/app-slug.d.ts +95 -0
- package/dist/lib/app-slug.js +172 -0
- package/dist/lib/demo-mode.d.ts +6 -0
- package/dist/lib/demo-mode.js +16 -0
- package/dist/lib/geolocation.d.ts +64 -0
- package/dist/lib/geolocation.js +235 -0
- package/dist/lib/idp-client-config.d.ts +75 -0
- package/dist/lib/idp-client-config.js +425 -0
- package/dist/lib/idp-fetch.d.ts +14 -0
- package/dist/lib/idp-fetch.js +91 -0
- package/dist/lib/internal-api.d.ts +87 -0
- package/dist/lib/internal-api.js +122 -0
- package/dist/lib/jwt-decode-client.d.ts +10 -0
- package/dist/lib/jwt-decode-client.js +46 -0
- package/dist/lib/jwt-decode.d.ts +48 -0
- package/dist/lib/jwt-decode.js +57 -0
- package/dist/lib/rate-limit-service.d.ts +23 -0
- package/dist/lib/rate-limit-service.js +6 -0
- package/dist/lib/redis.d.ts +5 -0
- package/dist/lib/redis.js +28 -0
- package/dist/lib/refresh-token-validator.d.ts +13 -0
- package/dist/lib/refresh-token-validator.js +117 -0
- package/dist/lib/roles.d.ts +145 -0
- package/dist/lib/roles.js +168 -0
- package/dist/lib/secret-validation.d.ts +4 -0
- package/dist/lib/secret-validation.js +14 -0
- package/dist/lib/session-store.d.ts +170 -0
- package/dist/lib/session-store.js +545 -0
- package/dist/lib/session.d.ts +21 -0
- package/dist/lib/session.js +26 -0
- package/dist/lib/site-logger.d.ts +214 -0
- package/dist/lib/site-logger.js +210 -0
- package/dist/lib/standardized-client-api.d.ts +161 -0
- package/dist/lib/standardized-client-api.js +791 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +257 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +86 -0
- package/dist/lib/token-expiry.d.ts +14 -0
- package/dist/lib/token-expiry.js +39 -0
- package/dist/lib/token-lifecycle.d.ts +78 -0
- package/dist/lib/token-lifecycle.js +360 -0
- package/dist/lib/types/api-responses.d.ts +128 -0
- package/dist/lib/types/api-responses.js +171 -0
- package/dist/lib/user-agent-parser.d.ts +50 -0
- package/dist/lib/user-agent-parser.js +220 -0
- package/dist/logging/api/admin-analytics.d.ts +3 -0
- package/dist/logging/api/admin-analytics.js +45 -0
- package/dist/logging/api/audit-log.d.ts +3 -0
- package/dist/logging/api/audit-log.js +52 -0
- package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
- package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
- package/dist/logging/components/AuditLogViewer.d.ts +7 -0
- package/dist/logging/components/AuditLogViewer.js +51 -0
- package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
- package/dist/logging/components/ErrorMetricsCard.js +16 -0
- package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
- package/dist/logging/components/HealthMetricsCard.js +19 -0
- package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
- package/dist/logging/hooks/useAdminAnalytics.js +22 -0
- package/dist/logging/hooks/useAuditLog.d.ts +6 -0
- package/dist/logging/hooks/useAuditLog.js +25 -0
- package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
- package/dist/logging/hooks/useErrorMetrics.js +38 -0
- package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
- package/dist/logging/hooks/useHealthMetrics.js +41 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.js +40 -0
- package/dist/logging/types/analytics.d.ts +68 -0
- package/dist/logging/types/analytics.js +3 -0
- package/dist/logging/types/audit.d.ts +29 -0
- package/dist/logging/types/audit.js +2 -0
- package/dist/logging/types/index.d.ts +2 -0
- package/dist/logging/types/index.js +19 -0
- package/dist/middleware/auth-decision.d.ts +33 -0
- package/dist/middleware/auth-decision.js +65 -0
- package/dist/middleware/create-middleware.d.ts +102 -0
- package/dist/middleware/create-middleware.js +469 -0
- package/dist/middleware/rbac-check.d.ts +51 -0
- package/dist/middleware/rbac-check.js +219 -0
- package/dist/middleware/twofa-presets.d.ts +134 -0
- package/dist/middleware/twofa-presets.js +175 -0
- package/dist/models/DecodedAccessToken.d.ts +17 -0
- package/dist/models/DecodedAccessToken.js +2 -0
- package/dist/models/SessionModel.d.ts +122 -0
- package/dist/models/SessionModel.js +136 -0
- package/dist/pages/admin-login/page.d.ts +31 -0
- package/dist/pages/admin-login/page.js +73 -0
- package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +18 -0
- package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +276 -0
- package/dist/pages/admin-page-permissions/index.d.ts +6 -0
- package/dist/pages/admin-page-permissions/index.js +13 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +16 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +261 -0
- package/dist/pages/admin-roles/index.d.ts +8 -0
- package/dist/pages/admin-roles/index.js +15 -0
- package/dist/pages/admin-roles/modals.d.ts +72 -0
- package/dist/pages/admin-roles/modals.js +154 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
- package/dist/pages/client-admin/ClientSiteAdminPage.js +179 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/coming-soon/page.d.ts +8 -0
- package/dist/pages/coming-soon/page.js +28 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +230 -0
- package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
- package/dist/pages/profile/EnhancedProfilePage.js +150 -0
- package/dist/pages/profile/index.d.ts +8 -0
- package/dist/pages/profile/index.js +16 -0
- package/dist/pages/profile/page.d.ts +19 -0
- package/dist/pages/profile/page.js +47 -0
- package/dist/pages/recovery/page.d.ts +1 -0
- package/dist/pages/recovery/page.js +142 -0
- package/dist/pages/roles/MyRolesPage.d.ts +24 -0
- package/dist/pages/roles/MyRolesPage.js +71 -0
- package/dist/pages/roles/components.d.ts +63 -0
- package/dist/pages/roles/components.js +108 -0
- package/dist/pages/roles/index.d.ts +8 -0
- package/dist/pages/roles/index.js +19 -0
- package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
- package/dist/pages/security/EnhancedSecurityPage.js +248 -0
- package/dist/pages/security/index.d.ts +8 -0
- package/dist/pages/security/index.js +16 -0
- package/dist/pages/security/page.d.ts +21 -0
- package/dist/pages/security/page.js +212 -0
- package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
- package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
- package/dist/pages/settings/index.d.ts +8 -0
- package/dist/pages/settings/index.js +16 -0
- package/dist/pages/settings/page.d.ts +7 -0
- package/dist/pages/settings/page.js +26 -0
- package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
- package/dist/pages/showcase/ShowcasePage.js +142 -0
- package/dist/pages/showcase/index.d.ts +12 -0
- package/dist/pages/showcase/index.js +17 -0
- package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
- package/dist/pages/test-env/EmergencyLogoutPage.js +99 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +116 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +93 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +51 -0
- package/dist/pages/test-env/index.d.ts +24 -0
- package/dist/pages/test-env/index.js +32 -0
- package/dist/pages/verify-code/page.d.ts +30 -0
- package/dist/pages/verify-code/page.js +412 -0
- package/dist/routes/account/index.d.ts +28 -0
- package/dist/routes/account/index.js +71 -0
- package/dist/routes/account/masked-info.d.ts +33 -0
- package/dist/routes/account/masked-info.js +39 -0
- package/dist/routes/account/send-code.d.ts +37 -0
- package/dist/routes/account/send-code.js +42 -0
- package/dist/routes/account/update-phone.d.ts +13 -0
- package/dist/routes/account/update-phone.js +17 -0
- package/dist/routes/account/verify-email.d.ts +38 -0
- package/dist/routes/account/verify-email.js +43 -0
- package/dist/routes/account/verify-sms.d.ts +38 -0
- package/dist/routes/account/verify-sms.js +43 -0
- package/dist/routes/auth/index.d.ts +19 -0
- package/dist/routes/auth/index.js +64 -0
- package/dist/routes/auth/logout.d.ts +31 -0
- package/dist/routes/auth/logout.js +98 -0
- package/dist/routes/auth/nextauth.d.ts +22 -0
- package/dist/routes/auth/nextauth.js +40 -0
- package/dist/routes/auth/refresh.d.ts +30 -0
- package/dist/routes/auth/refresh.js +51 -0
- package/dist/routes/auth/session.d.ts +43 -0
- package/dist/routes/auth/session.js +157 -0
- package/dist/routes/auth/settings.d.ts +25 -0
- package/dist/routes/auth/settings.js +55 -0
- package/dist/routes/auth/viability.d.ts +52 -0
- package/dist/routes/auth/viability.js +190 -0
- package/dist/routes/index.d.ts +12 -0
- package/dist/routes/index.js +54 -0
- package/dist/routes/session/index.d.ts +6 -0
- package/dist/routes/session/index.js +10 -0
- package/dist/routes/session/refresh-viability.d.ts +16 -0
- package/dist/routes/session/refresh-viability.js +20 -0
- package/dist/server/auth-guard.d.ts +46 -0
- package/dist/server/auth-guard.js +128 -0
- package/dist/server/auth.d.ts +50 -0
- package/dist/server/auth.js +62 -0
- package/dist/server/decode-session.d.ts +30 -0
- package/dist/server/decode-session.js +78 -0
- package/dist/server/slim-middleware.d.ts +23 -0
- package/dist/server/slim-middleware.js +89 -0
- package/dist/server/with-auth.d.ts +33 -0
- package/dist/server/with-auth.js +59 -0
- package/dist/services/signalrActivityService.d.ts +44 -0
- package/dist/services/signalrActivityService.js +257 -0
- package/dist/stores/authStore.d.ts +154 -0
- package/dist/stores/authStore.js +1527 -0
- package/dist/theme/ThemeProvider.d.ts +14 -0
- package/dist/theme/ThemeProvider.js +28 -0
- package/dist/theme/default.d.ts +8 -0
- package/dist/theme/default.js +33 -0
- package/dist/theme/index.d.ts +15 -0
- package/dist/theme/index.js +25 -0
- package/dist/theme/types.d.ts +56 -0
- package/dist/theme/types.js +8 -0
- package/dist/theme/useTheme.d.ts +60 -0
- package/dist/theme/useTheme.js +63 -0
- package/dist/theme/utils.d.ts +13 -0
- package/dist/theme/utils.js +39 -0
- package/dist/types/api.d.ts +134 -0
- package/dist/types/api.js +44 -0
- package/dist/types/auth.d.ts +19 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/logging.d.ts +42 -0
- package/dist/types/logging.js +2 -0
- package/dist/types/recovery.d.ts +48 -0
- package/dist/types/recovery.js +2 -0
- package/dist/types/security.d.ts +1 -0
- package/dist/types/security.js +2 -0
- package/dist/utils/api.d.ts +85 -0
- package/dist/utils/api.js +287 -0
- package/dist/utils/circuitBreaker.d.ts +43 -0
- package/dist/utils/circuitBreaker.js +91 -0
- package/dist/utils/error-message.d.ts +1 -0
- package/dist/utils/error-message.js +103 -0
- package/dist/utils/layout/reservedSpace.d.ts +59 -0
- package/dist/utils/layout/reservedSpace.js +102 -0
- package/dist/utils/logout.d.ts +14 -0
- package/dist/utils/logout.js +32 -0
- package/dist/vibe/client.d.ts +261 -0
- package/dist/vibe/client.js +445 -0
- package/dist/vibe/enterprise-auth.d.ts +106 -0
- package/dist/vibe/enterprise-auth.js +173 -0
- package/dist/vibe/errors.d.ts +83 -0
- package/dist/vibe/errors.js +146 -0
- package/dist/vibe/generic.d.ts +234 -0
- package/dist/vibe/generic.js +369 -0
- package/dist/vibe/hooks/index.d.ts +169 -0
- package/dist/vibe/hooks/index.js +252 -0
- package/dist/vibe/index.d.ts +25 -0
- package/dist/vibe/index.js +72 -0
- package/dist/vibe/sessions.d.ts +161 -0
- package/dist/vibe/sessions.js +391 -0
- package/dist/vibe/types.d.ts +353 -0
- package/dist/vibe/types.js +315 -0
- package/package.json +1 -1
- package/src/auth/better-auth.ts +2 -2
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Session Model - Redis Session Data Structure
|
|
4
|
+
*
|
|
5
|
+
* This is the single source of truth for session data stored in Redis.
|
|
6
|
+
* The session contains all authentication state - the JWT cookie only
|
|
7
|
+
* stores the session ID (redisSessionId).
|
|
8
|
+
*
|
|
9
|
+
* FIELD NAMING CONVENTIONS:
|
|
10
|
+
* - idp* prefix: Tokens from PayEz IDP (identity provider)
|
|
11
|
+
* - oauth* prefix: Tokens from external OAuth providers (Google, etc.)
|
|
12
|
+
* - mfa* prefix: Multi-factor authentication related fields
|
|
13
|
+
*
|
|
14
|
+
* @version 2.0.0 - Normalized field names
|
|
15
|
+
* @since auth-refactor-2026-01
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.SessionModel = void 0;
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// SESSION MODEL CLASS
|
|
21
|
+
// ============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Session model class for working with session data.
|
|
24
|
+
*
|
|
25
|
+
* Provides typed access to session fields with normalized names.
|
|
26
|
+
*/
|
|
27
|
+
class SessionModel {
|
|
28
|
+
// Core Identity
|
|
29
|
+
userId;
|
|
30
|
+
email;
|
|
31
|
+
name;
|
|
32
|
+
roles;
|
|
33
|
+
// IDP Tokens
|
|
34
|
+
idpAccessToken;
|
|
35
|
+
idpRefreshToken;
|
|
36
|
+
idpAccessTokenExpires;
|
|
37
|
+
idpRefreshTokenExpires;
|
|
38
|
+
decodedAccessToken;
|
|
39
|
+
bearerKeyId;
|
|
40
|
+
// MFA State
|
|
41
|
+
mfaVerified;
|
|
42
|
+
mfaMethod;
|
|
43
|
+
mfaCompletedAt;
|
|
44
|
+
mfaExpiresAt;
|
|
45
|
+
mfaValidityHours;
|
|
46
|
+
authenticationMethods;
|
|
47
|
+
authenticationLevel;
|
|
48
|
+
// OAuth Provider
|
|
49
|
+
oauthProvider;
|
|
50
|
+
oauthProviderToken;
|
|
51
|
+
oauthProviderRefreshToken;
|
|
52
|
+
// Multi-Tenant
|
|
53
|
+
idpClientId;
|
|
54
|
+
merchantId;
|
|
55
|
+
constructor(data) {
|
|
56
|
+
// Core Identity
|
|
57
|
+
this.userId = data.userId;
|
|
58
|
+
this.email = data.email;
|
|
59
|
+
this.name = data.name;
|
|
60
|
+
this.roles = data.roles || [];
|
|
61
|
+
// IDP Tokens
|
|
62
|
+
this.idpAccessToken = data.idpAccessToken;
|
|
63
|
+
this.idpRefreshToken = data.idpRefreshToken;
|
|
64
|
+
this.idpAccessTokenExpires = data.idpAccessTokenExpires;
|
|
65
|
+
this.idpRefreshTokenExpires = data.idpRefreshTokenExpires;
|
|
66
|
+
this.decodedAccessToken = data.decodedAccessToken;
|
|
67
|
+
this.bearerKeyId = data.bearerKeyId;
|
|
68
|
+
// MFA State
|
|
69
|
+
this.mfaVerified = data.mfaVerified ?? false;
|
|
70
|
+
this.mfaMethod = data.mfaMethod;
|
|
71
|
+
this.mfaCompletedAt = data.mfaCompletedAt;
|
|
72
|
+
this.mfaExpiresAt = data.mfaExpiresAt;
|
|
73
|
+
this.mfaValidityHours = data.mfaValidityHours;
|
|
74
|
+
this.authenticationMethods = data.authenticationMethods;
|
|
75
|
+
this.authenticationLevel = data.authenticationLevel;
|
|
76
|
+
// OAuth Provider
|
|
77
|
+
this.oauthProvider = data.oauthProvider;
|
|
78
|
+
this.oauthProviderToken = data.oauthProviderToken;
|
|
79
|
+
this.oauthProviderRefreshToken = data.oauthProviderRefreshToken;
|
|
80
|
+
// Multi-Tenant
|
|
81
|
+
this.idpClientId = data.idpClientId;
|
|
82
|
+
this.merchantId = data.merchantId;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Check if the IDP access token has expired.
|
|
86
|
+
*/
|
|
87
|
+
isAccessTokenExpired() {
|
|
88
|
+
return Date.now() >= this.idpAccessTokenExpires;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if the IDP refresh token has expired.
|
|
92
|
+
*/
|
|
93
|
+
isRefreshTokenExpired() {
|
|
94
|
+
if (!this.idpRefreshTokenExpires)
|
|
95
|
+
return false;
|
|
96
|
+
return Date.now() >= this.idpRefreshTokenExpires;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Check if MFA has expired.
|
|
100
|
+
*/
|
|
101
|
+
isMfaExpired() {
|
|
102
|
+
if (!this.mfaExpiresAt)
|
|
103
|
+
return false;
|
|
104
|
+
return Date.now() > this.mfaExpiresAt;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Convert to plain object for storage.
|
|
108
|
+
*/
|
|
109
|
+
toJSON() {
|
|
110
|
+
return {
|
|
111
|
+
userId: this.userId,
|
|
112
|
+
email: this.email,
|
|
113
|
+
name: this.name,
|
|
114
|
+
roles: this.roles,
|
|
115
|
+
idpAccessToken: this.idpAccessToken,
|
|
116
|
+
idpRefreshToken: this.idpRefreshToken,
|
|
117
|
+
idpAccessTokenExpires: this.idpAccessTokenExpires,
|
|
118
|
+
idpRefreshTokenExpires: this.idpRefreshTokenExpires,
|
|
119
|
+
decodedAccessToken: this.decodedAccessToken,
|
|
120
|
+
bearerKeyId: this.bearerKeyId,
|
|
121
|
+
mfaVerified: this.mfaVerified,
|
|
122
|
+
mfaMethod: this.mfaMethod,
|
|
123
|
+
mfaCompletedAt: this.mfaCompletedAt,
|
|
124
|
+
mfaExpiresAt: this.mfaExpiresAt,
|
|
125
|
+
mfaValidityHours: this.mfaValidityHours,
|
|
126
|
+
authenticationMethods: this.authenticationMethods,
|
|
127
|
+
authenticationLevel: this.authenticationLevel,
|
|
128
|
+
oauthProvider: this.oauthProvider,
|
|
129
|
+
oauthProviderToken: this.oauthProviderToken,
|
|
130
|
+
oauthProviderRefreshToken: this.oauthProviderRefreshToken,
|
|
131
|
+
idpClientId: this.idpClientId,
|
|
132
|
+
merchantId: this.merchantId,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.SessionModel = SessionModel;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin Login Page for @payez/next-mvp
|
|
3
|
+
*
|
|
4
|
+
* A standalone username/password login page for admin access.
|
|
5
|
+
* NOT linked from any navigation - only accessible via direct URL.
|
|
6
|
+
*
|
|
7
|
+
* USAGE:
|
|
8
|
+
* 1. Create app/account-auth/admin-login/page.tsx in your Next.js app
|
|
9
|
+
* 2. Re-export this component:
|
|
10
|
+
* export { default } from '@payez/next-mvp/pages/admin-login';
|
|
11
|
+
*
|
|
12
|
+
* CUSTOMIZATION:
|
|
13
|
+
* - Override styles via CSS variables or wrap with your own component
|
|
14
|
+
* - Provide custom branding via ThemeProvider
|
|
15
|
+
*/
|
|
16
|
+
import React from 'react';
|
|
17
|
+
interface AdminLoginFormProps {
|
|
18
|
+
/** Optional custom title (default: "Admin Login") */
|
|
19
|
+
title?: string;
|
|
20
|
+
/** Optional custom subtitle (default: "Authorized personnel only") */
|
|
21
|
+
subtitle?: string;
|
|
22
|
+
/** Optional callback URL override */
|
|
23
|
+
callbackUrl?: string;
|
|
24
|
+
/** Optional logo component to render */
|
|
25
|
+
logo?: React.ReactNode;
|
|
26
|
+
}
|
|
27
|
+
declare function AdminLoginForm({ title, subtitle, callbackUrl: propCallbackUrl, logo, }: AdminLoginFormProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
declare function AdminLoginFallback(): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export default function AdminLoginPage(props: AdminLoginFormProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export { AdminLoginForm, AdminLoginFallback };
|
|
31
|
+
export type { AdminLoginFormProps };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Admin Login Page for @payez/next-mvp
|
|
4
|
+
*
|
|
5
|
+
* A standalone username/password login page for admin access.
|
|
6
|
+
* NOT linked from any navigation - only accessible via direct URL.
|
|
7
|
+
*
|
|
8
|
+
* USAGE:
|
|
9
|
+
* 1. Create app/account-auth/admin-login/page.tsx in your Next.js app
|
|
10
|
+
* 2. Re-export this component:
|
|
11
|
+
* export { default } from '@payez/next-mvp/pages/admin-login';
|
|
12
|
+
*
|
|
13
|
+
* CUSTOMIZATION:
|
|
14
|
+
* - Override styles via CSS variables or wrap with your own component
|
|
15
|
+
* - Provide custom branding via ThemeProvider
|
|
16
|
+
*/
|
|
17
|
+
'use client';
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.default = AdminLoginPage;
|
|
20
|
+
exports.AdminLoginForm = AdminLoginForm;
|
|
21
|
+
exports.AdminLoginFallback = AdminLoginFallback;
|
|
22
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
23
|
+
const react_1 = require("react");
|
|
24
|
+
const better_auth_client_1 = require("../../client/better-auth-client");
|
|
25
|
+
const navigation_1 = require("next/navigation");
|
|
26
|
+
const react_2 = require("react");
|
|
27
|
+
const useTheme_1 = require("../../theme/useTheme");
|
|
28
|
+
function AdminLoginForm({ title = 'Admin Login', subtitle = 'Authorized personnel only', callbackUrl: propCallbackUrl, logo, }) {
|
|
29
|
+
const searchParams = (0, navigation_1.useSearchParams)();
|
|
30
|
+
const callbackUrl = propCallbackUrl || searchParams?.get('callbackUrl') || '/dashboard';
|
|
31
|
+
const branding = (0, useTheme_1.useBranding)();
|
|
32
|
+
const colors = (0, useTheme_1.useColors)();
|
|
33
|
+
const [email, setEmail] = (0, react_1.useState)('');
|
|
34
|
+
const [password, setPassword] = (0, react_1.useState)('');
|
|
35
|
+
const [showPassword, setShowPassword] = (0, react_1.useState)(false);
|
|
36
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(false);
|
|
37
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
38
|
+
const handleSubmit = async (e) => {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
setIsLoading(true);
|
|
41
|
+
setError(null);
|
|
42
|
+
try {
|
|
43
|
+
const result = await better_auth_client_1.authClient.signIn.email({
|
|
44
|
+
email,
|
|
45
|
+
password,
|
|
46
|
+
callbackURL: callbackUrl,
|
|
47
|
+
});
|
|
48
|
+
if (result?.error) {
|
|
49
|
+
const errorMsg = typeof result.error === 'object'
|
|
50
|
+
? result.error.message || 'Invalid credentials'
|
|
51
|
+
: String(result.error);
|
|
52
|
+
setError(errorMsg);
|
|
53
|
+
}
|
|
54
|
+
else if (result?.data) {
|
|
55
|
+
// Redirect to verify-code for 2FA or directly to callback
|
|
56
|
+
window.location.href = `/account-auth/verify-code?callbackUrl=${encodeURIComponent(callbackUrl)}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
setError('An unexpected error occurred');
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
setIsLoading(false);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "min-h-screen flex items-center justify-center bg-gradient-to-br from-slate-700 via-slate-800 to-slate-900 p-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "bg-white rounded-2xl shadow-2xl p-8 max-w-md w-full", children: [logo && ((0, jsx_runtime_1.jsx)("div", { className: "flex justify-center mb-6", children: logo })), (0, jsx_runtime_1.jsx)("h1", { className: "text-2xl font-bold text-center mb-2 text-slate-900", children: title }), (0, jsx_runtime_1.jsx)("p", { className: "text-center mb-8 text-slate-600", children: subtitle }), error && ((0, jsx_runtime_1.jsx)("div", { className: "mb-6 px-4 py-3 rounded-lg bg-red-500 text-white text-center text-sm", children: error })), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "admin-email", className: "block text-sm font-medium mb-2 text-slate-700", children: "Email" }), (0, jsx_runtime_1.jsx)("input", { id: "admin-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: isLoading, autoComplete: "email", className: "w-full px-4 py-3 rounded-lg border border-slate-300 bg-white text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed", placeholder: "admin@example.com" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "admin-password", className: "block text-sm font-medium mb-2 text-slate-700", children: "Password" }), (0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsx)("input", { id: "admin-password", type: showPassword ? 'text' : 'password', value: password, onChange: (e) => setPassword(e.target.value), required: true, disabled: isLoading, autoComplete: "current-password", className: "w-full px-4 py-3 pr-12 rounded-lg border border-slate-300 bg-white text-slate-900 placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-slate-500 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed", placeholder: "Enter your password" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-slate-500 hover:text-slate-700", "aria-label": showPassword ? 'Hide password' : 'Show password', children: showPassword ? ((0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", className: "w-5 h-5", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.878 9.878L6.464 6.464m7.535 7.535l3.415 3.414M3 3l3.464 3.464M21 21l-3.415-3.414" }) })) : ((0, jsx_runtime_1.jsxs)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", className: "w-5 h-5", children: [(0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" }), (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" })] })) })] })] }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: isLoading, className: "w-full py-3 px-4 rounded-lg font-semibold text-white transition-colors bg-slate-700 hover:bg-slate-800 disabled:bg-slate-400 disabled:cursor-not-allowed", children: isLoading ? ((0, jsx_runtime_1.jsxs)("span", { className: "flex items-center justify-center", children: [(0, jsx_runtime_1.jsxs)("svg", { className: "animate-spin -ml-1 mr-3 h-5 w-5 text-white", fill: "none", viewBox: "0 0 24 24", children: [(0, jsx_runtime_1.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), (0, jsx_runtime_1.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Signing in..."] })) : ('Sign In') })] }), (0, jsx_runtime_1.jsxs)("p", { className: "mt-6 text-center text-xs text-slate-500", children: ["This login is for authorized administrators only.", (0, jsx_runtime_1.jsx)("br", {}), "All access attempts are logged."] })] }) }));
|
|
67
|
+
}
|
|
68
|
+
function AdminLoginFallback() {
|
|
69
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "min-h-screen flex items-center justify-center bg-gradient-to-br from-slate-700 via-slate-800 to-slate-900", children: (0, jsx_runtime_1.jsxs)("div", { className: "text-center", children: [(0, jsx_runtime_1.jsxs)("svg", { className: "animate-spin h-10 w-10 mx-auto text-white", fill: "none", viewBox: "0 0 24 24", children: [(0, jsx_runtime_1.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), (0, jsx_runtime_1.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), (0, jsx_runtime_1.jsx)("p", { className: "mt-4 text-slate-400", children: "Loading..." })] }) }));
|
|
70
|
+
}
|
|
71
|
+
function AdminLoginPage(props) {
|
|
72
|
+
return ((0, jsx_runtime_1.jsx)(react_2.Suspense, { fallback: (0, jsx_runtime_1.jsx)(AdminLoginFallback, {}), children: (0, jsx_runtime_1.jsx)(AdminLoginForm, { ...props }) }));
|
|
73
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page Permissions Admin Page (/admin/page-permissions)
|
|
3
|
+
*
|
|
4
|
+
* Design: Aurum (DESIGN_SPEC.md)
|
|
5
|
+
* Control which roles can access which pages
|
|
6
|
+
*
|
|
7
|
+
* Three sections:
|
|
8
|
+
* 1. Search & Filters — Find pages by route or category
|
|
9
|
+
* 2. Pages & Role Requirements — Table showing pages and their role assignments
|
|
10
|
+
* 3. Change History — Audit log of permission changes
|
|
11
|
+
*
|
|
12
|
+
* Design Principles:
|
|
13
|
+
* - No shadows, gradients, or animation
|
|
14
|
+
* - One accent color (blue #0066cc)
|
|
15
|
+
* - Inline interactions (no modals)
|
|
16
|
+
* - Scan-friendly tables and lists
|
|
17
|
+
*/
|
|
18
|
+
export default function PagePermissionsAdminPage(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page Permissions Admin Page (/admin/page-permissions)
|
|
4
|
+
*
|
|
5
|
+
* Design: Aurum (DESIGN_SPEC.md)
|
|
6
|
+
* Control which roles can access which pages
|
|
7
|
+
*
|
|
8
|
+
* Three sections:
|
|
9
|
+
* 1. Search & Filters — Find pages by route or category
|
|
10
|
+
* 2. Pages & Role Requirements — Table showing pages and their role assignments
|
|
11
|
+
* 3. Change History — Audit log of permission changes
|
|
12
|
+
*
|
|
13
|
+
* Design Principles:
|
|
14
|
+
* - No shadows, gradients, or animation
|
|
15
|
+
* - One accent color (blue #0066cc)
|
|
16
|
+
* - Inline interactions (no modals)
|
|
17
|
+
* - Scan-friendly tables and lists
|
|
18
|
+
*/
|
|
19
|
+
'use client';
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.default = PagePermissionsAdminPage;
|
|
22
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
23
|
+
const react_1 = require("react");
|
|
24
|
+
// Mock data
|
|
25
|
+
const MOCK_PAGES = [
|
|
26
|
+
{
|
|
27
|
+
id: 1,
|
|
28
|
+
route: '/dashboard',
|
|
29
|
+
displayName: 'Dashboard',
|
|
30
|
+
requires2fa: false,
|
|
31
|
+
roles: [],
|
|
32
|
+
category: 'user',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 2,
|
|
36
|
+
route: '/admin',
|
|
37
|
+
displayName: 'Admin Dashboard',
|
|
38
|
+
requires2fa: true,
|
|
39
|
+
roles: ['SiteAdmin', 'ClientAdmin'],
|
|
40
|
+
category: 'admin',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: 3,
|
|
44
|
+
route: '/admin/users',
|
|
45
|
+
displayName: 'User Management',
|
|
46
|
+
requires2fa: true,
|
|
47
|
+
roles: ['SiteAdmin'],
|
|
48
|
+
category: 'admin',
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: 4,
|
|
52
|
+
route: '/account/security',
|
|
53
|
+
displayName: 'Security Settings',
|
|
54
|
+
requires2fa: true,
|
|
55
|
+
roles: [],
|
|
56
|
+
category: 'account',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 5,
|
|
60
|
+
route: '/interview-practice',
|
|
61
|
+
displayName: 'Interview Practice',
|
|
62
|
+
requires2fa: false,
|
|
63
|
+
roles: ['ClientAdmin'],
|
|
64
|
+
category: 'user',
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
const MOCK_CHANGES = [
|
|
68
|
+
{
|
|
69
|
+
timestamp: '3/10/2026, 10:30 AM',
|
|
70
|
+
event: '/admin/users role requirement changed: Added ClientAdmin by Admin User',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
timestamp: '3/10/2026, 10:15 AM',
|
|
74
|
+
event: '/dashboard updated: 2FA requirement removed by Admin User',
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
timestamp: '3/9/2026, 3:45 PM',
|
|
78
|
+
event: '/interview-practice role requirement changed: Added SiteAdmin by Admin User',
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
const CATEGORIES = ['All Pages', 'Admin Pages', 'Account Pages', 'User Pages'];
|
|
82
|
+
const categoryMap = {
|
|
83
|
+
'All Pages': '',
|
|
84
|
+
'Admin Pages': 'admin',
|
|
85
|
+
'Account Pages': 'account',
|
|
86
|
+
'User Pages': 'user',
|
|
87
|
+
};
|
|
88
|
+
function PagePermissionsAdminPage() {
|
|
89
|
+
const [pages, setPages] = (0, react_1.useState)(MOCK_PAGES);
|
|
90
|
+
const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
|
|
91
|
+
const [activeFilter, setActiveFilter] = (0, react_1.useState)('All Pages');
|
|
92
|
+
const [message, setMessage] = (0, react_1.useState)(null);
|
|
93
|
+
const [editingPageId, setEditingPageId] = (0, react_1.useState)(null);
|
|
94
|
+
const [tempRoles, setTempRoles] = (0, react_1.useState)([]);
|
|
95
|
+
const filteredPages = pages.filter((page) => {
|
|
96
|
+
const matchesSearch = page.route.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
97
|
+
page.displayName.toLowerCase().includes(searchQuery.toLowerCase());
|
|
98
|
+
const categoryFilter = categoryMap[activeFilter];
|
|
99
|
+
const matchesCategory = !categoryFilter || page.category === categoryFilter;
|
|
100
|
+
return matchesSearch && matchesCategory;
|
|
101
|
+
});
|
|
102
|
+
const handleEditRoles = (pageId, currentRoles) => {
|
|
103
|
+
setEditingPageId(pageId);
|
|
104
|
+
setTempRoles([...currentRoles]);
|
|
105
|
+
};
|
|
106
|
+
const handleToggleRole = (role) => {
|
|
107
|
+
setTempRoles((prev) => prev.includes(role) ? prev.filter((r) => r !== role) : [...prev, role]);
|
|
108
|
+
};
|
|
109
|
+
const handleSaveRoles = (pageId) => {
|
|
110
|
+
setPages((prev) => prev.map((p) => (p.id === pageId ? { ...p, roles: tempRoles } : p)));
|
|
111
|
+
setMessage('Page updated');
|
|
112
|
+
setEditingPageId(null);
|
|
113
|
+
setTimeout(() => setMessage(null), 3000);
|
|
114
|
+
};
|
|
115
|
+
const handleRemoveRole = (pageId, role) => {
|
|
116
|
+
setPages((prev) => prev.map((p) => p.id === pageId ? { ...p, roles: p.roles.filter((r) => r !== role) } : p));
|
|
117
|
+
setMessage('Role removed');
|
|
118
|
+
setTimeout(() => setMessage(null), 3000);
|
|
119
|
+
};
|
|
120
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: { background: '#f8f8f8', minHeight: '100vh', padding: '40px 20px' }, children: (0, jsx_runtime_1.jsxs)("div", { style: { maxWidth: '1200px', margin: '0 auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { marginBottom: '40px' }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
|
|
121
|
+
fontSize: '32px',
|
|
122
|
+
fontWeight: 400,
|
|
123
|
+
color: '#333',
|
|
124
|
+
marginBottom: '8px',
|
|
125
|
+
}, children: "Page Permissions" }), (0, jsx_runtime_1.jsx)("p", { style: { fontSize: '16px', color: '#666', fontWeight: 400 }, children: "Control which roles can access which pages" })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '40px' }, children: [(0, jsx_runtime_1.jsx)("div", { style: { marginBottom: '16px' }, children: (0, jsx_runtime_1.jsx)("input", { type: "text", placeholder: "Search pages...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), style: {
|
|
126
|
+
width: '100%',
|
|
127
|
+
padding: '10px 14px',
|
|
128
|
+
fontSize: '14px',
|
|
129
|
+
border: '1px solid #e0e0e0',
|
|
130
|
+
borderRadius: '4px',
|
|
131
|
+
background: 'white',
|
|
132
|
+
boxSizing: 'border-box',
|
|
133
|
+
} }) }), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', gap: '8px', flexWrap: 'wrap' }, children: CATEGORIES.map((cat) => ((0, jsx_runtime_1.jsx)("button", { onClick: () => setActiveFilter(cat), style: {
|
|
134
|
+
padding: '8px 14px',
|
|
135
|
+
fontSize: '13px',
|
|
136
|
+
border: activeFilter === cat ? 'none' : '1px solid #e0e0e0',
|
|
137
|
+
borderRadius: '4px',
|
|
138
|
+
background: activeFilter === cat ? '#0066cc' : 'white',
|
|
139
|
+
color: activeFilter === cat ? 'white' : '#333',
|
|
140
|
+
cursor: 'pointer',
|
|
141
|
+
transition: 'all 0.2s',
|
|
142
|
+
}, onMouseEnter: (e) => {
|
|
143
|
+
if (activeFilter !== cat) {
|
|
144
|
+
e.currentTarget.style.background = '#f5f5f5';
|
|
145
|
+
}
|
|
146
|
+
}, onMouseLeave: (e) => {
|
|
147
|
+
if (activeFilter !== cat) {
|
|
148
|
+
e.currentTarget.style.background = 'white';
|
|
149
|
+
}
|
|
150
|
+
}, children: cat }, cat))) })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), message && ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
151
|
+
padding: '8px 12px',
|
|
152
|
+
background: '#e8f5e9',
|
|
153
|
+
color: '#2e7d32',
|
|
154
|
+
borderRadius: '4px',
|
|
155
|
+
marginBottom: '12px',
|
|
156
|
+
fontSize: '13px',
|
|
157
|
+
}, children: ["\u2713 ", message] })), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '60px' }, children: [(0, jsx_runtime_1.jsx)("h2", { style: {
|
|
158
|
+
fontSize: '18px',
|
|
159
|
+
fontWeight: 400,
|
|
160
|
+
color: '#666',
|
|
161
|
+
marginBottom: '24px',
|
|
162
|
+
textTransform: 'uppercase',
|
|
163
|
+
letterSpacing: '1px',
|
|
164
|
+
}, children: "Pages & Permissions" }), (0, jsx_runtime_1.jsxs)("table", { style: {
|
|
165
|
+
width: '100%',
|
|
166
|
+
borderCollapse: 'collapse',
|
|
167
|
+
background: 'white',
|
|
168
|
+
border: '1px solid #e0e0e0',
|
|
169
|
+
borderRadius: '4px',
|
|
170
|
+
overflow: 'hidden',
|
|
171
|
+
}, children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsxs)("tr", { style: { background: '#f8f8f8', borderBottom: '1px solid #e0e0e0' }, children: [(0, jsx_runtime_1.jsx)("th", { style: {
|
|
172
|
+
padding: '16px',
|
|
173
|
+
textAlign: 'left',
|
|
174
|
+
fontSize: '12px',
|
|
175
|
+
color: '#999',
|
|
176
|
+
textTransform: 'uppercase',
|
|
177
|
+
letterSpacing: '0.5px',
|
|
178
|
+
fontWeight: 'normal',
|
|
179
|
+
}, children: "Route" }), (0, jsx_runtime_1.jsx)("th", { style: {
|
|
180
|
+
padding: '16px',
|
|
181
|
+
textAlign: 'left',
|
|
182
|
+
fontSize: '12px',
|
|
183
|
+
color: '#999',
|
|
184
|
+
textTransform: 'uppercase',
|
|
185
|
+
letterSpacing: '0.5px',
|
|
186
|
+
fontWeight: 'normal',
|
|
187
|
+
}, children: "Display Name" }), (0, jsx_runtime_1.jsx)("th", { style: {
|
|
188
|
+
padding: '16px',
|
|
189
|
+
textAlign: 'center',
|
|
190
|
+
fontSize: '12px',
|
|
191
|
+
color: '#999',
|
|
192
|
+
textTransform: 'uppercase',
|
|
193
|
+
letterSpacing: '0.5px',
|
|
194
|
+
fontWeight: 'normal',
|
|
195
|
+
}, children: "2FA" }), (0, jsx_runtime_1.jsx)("th", { style: {
|
|
196
|
+
padding: '16px',
|
|
197
|
+
textAlign: 'left',
|
|
198
|
+
fontSize: '12px',
|
|
199
|
+
color: '#999',
|
|
200
|
+
textTransform: 'uppercase',
|
|
201
|
+
letterSpacing: '0.5px',
|
|
202
|
+
fontWeight: 'normal',
|
|
203
|
+
}, children: "Roles" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: filteredPages.map((page) => ((0, jsx_runtime_1.jsxs)("tr", { style: {
|
|
204
|
+
borderBottom: '1px solid #e0e0e0',
|
|
205
|
+
height: '48px',
|
|
206
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: [(0, jsx_runtime_1.jsx)("td", { style: {
|
|
207
|
+
padding: '16px',
|
|
208
|
+
fontSize: '12px',
|
|
209
|
+
fontFamily: 'Courier New, monospace',
|
|
210
|
+
color: '#333',
|
|
211
|
+
}, title: "Click to copy", children: page.route }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '14px', color: '#333' }, children: page.displayName }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', textAlign: 'center', fontSize: '14px' }, children: page.requires2fa ? '✓' : '✕' }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '13px' }, children: editingPageId === page.id ? ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '12px', alignItems: 'center' }, children: [(0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', gap: '12px' }, children: ['SiteAdmin', 'ClientAdmin'].map((role) => ((0, jsx_runtime_1.jsxs)("label", { style: {
|
|
212
|
+
display: 'flex',
|
|
213
|
+
alignItems: 'center',
|
|
214
|
+
gap: '6px',
|
|
215
|
+
cursor: 'pointer',
|
|
216
|
+
}, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: tempRoles.includes(role), onChange: () => handleToggleRole(role), style: { cursor: 'pointer' } }), (0, jsx_runtime_1.jsx)("span", { style: { fontSize: '12px', color: '#333' }, children: role })] }, role))) }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '6px' }, children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => handleSaveRoles(page.id), style: {
|
|
217
|
+
padding: '6px 10px',
|
|
218
|
+
background: '#0066cc',
|
|
219
|
+
color: 'white',
|
|
220
|
+
border: 'none',
|
|
221
|
+
borderRadius: '4px',
|
|
222
|
+
cursor: 'pointer',
|
|
223
|
+
fontSize: '11px',
|
|
224
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.background = '#0052a3'), onMouseLeave: (e) => (e.currentTarget.style.background = '#0066cc'), children: "Save" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setEditingPageId(null), style: {
|
|
225
|
+
padding: '6px 10px',
|
|
226
|
+
background: 'white',
|
|
227
|
+
color: '#333',
|
|
228
|
+
border: '1px solid #e0e0e0',
|
|
229
|
+
borderRadius: '4px',
|
|
230
|
+
cursor: 'pointer',
|
|
231
|
+
fontSize: '11px',
|
|
232
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "Cancel" })] })] })) : ((0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', gap: '6px', alignItems: 'center' }, children: page.roles.length > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [page.roles.map((role) => ((0, jsx_runtime_1.jsxs)("span", { style: {
|
|
233
|
+
background: '#e3f2fd',
|
|
234
|
+
color: '#0066cc',
|
|
235
|
+
padding: '4px 8px',
|
|
236
|
+
borderRadius: '3px',
|
|
237
|
+
fontSize: '12px',
|
|
238
|
+
display: 'inline-flex',
|
|
239
|
+
alignItems: 'center',
|
|
240
|
+
gap: '4px',
|
|
241
|
+
}, children: [role, (0, jsx_runtime_1.jsx)("button", { onClick: () => handleRemoveRole(page.id, role), style: {
|
|
242
|
+
background: 'none',
|
|
243
|
+
border: 'none',
|
|
244
|
+
color: '#0066cc',
|
|
245
|
+
cursor: 'pointer',
|
|
246
|
+
fontSize: '12px',
|
|
247
|
+
padding: '0',
|
|
248
|
+
lineHeight: '1',
|
|
249
|
+
}, children: "\u2715" })] }, role))), (0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRoles(page.id, page.roles), style: {
|
|
250
|
+
padding: '4px 8px',
|
|
251
|
+
background: 'white',
|
|
252
|
+
color: '#0066cc',
|
|
253
|
+
border: '1px solid #e0e0e0',
|
|
254
|
+
borderRadius: '3px',
|
|
255
|
+
cursor: 'pointer',
|
|
256
|
+
fontSize: '11px',
|
|
257
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "+" })] })) : ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRoles(page.id, []), style: {
|
|
258
|
+
padding: '4px 8px',
|
|
259
|
+
background: 'white',
|
|
260
|
+
color: '#0066cc',
|
|
261
|
+
border: '1px solid #e0e0e0',
|
|
262
|
+
borderRadius: '3px',
|
|
263
|
+
cursor: 'pointer',
|
|
264
|
+
fontSize: '11px',
|
|
265
|
+
}, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "+ Add Role" })) })) })] }, page.id))) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { marginTop: '12px', fontSize: '12px', color: '#999' }, children: [filteredPages.length, " of ", pages.length, " pages shown"] })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { children: [(0, jsx_runtime_1.jsx)("h2", { style: {
|
|
266
|
+
fontSize: '18px',
|
|
267
|
+
fontWeight: 400,
|
|
268
|
+
color: '#666',
|
|
269
|
+
marginBottom: '24px',
|
|
270
|
+
textTransform: 'uppercase',
|
|
271
|
+
letterSpacing: '1px',
|
|
272
|
+
}, children: "Recent Changes" }), (0, jsx_runtime_1.jsx)("div", { style: { background: 'white', border: '1px solid #e0e0e0', borderRadius: '4px' }, children: MOCK_CHANGES.map((change, idx) => ((0, jsx_runtime_1.jsxs)("div", { style: {
|
|
273
|
+
padding: '16px',
|
|
274
|
+
borderBottom: idx < MOCK_CHANGES.length - 1 ? '1px solid #e0e0e0' : 'none',
|
|
275
|
+
}, children: [(0, jsx_runtime_1.jsx)("div", { style: { fontSize: '12px', color: '#999', marginBottom: '4px' }, children: change.timestamp }), (0, jsx_runtime_1.jsx)("div", { style: { fontSize: '14px', color: '#333' }, children: change.event })] }, idx))) })] })] }) }));
|
|
276
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page Permissions Admin exports
|
|
4
|
+
*
|
|
5
|
+
* - PagePermissionsAdminPage: Admin interface for managing page permissions (/admin/page-permissions)
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.PagePermissionsAdminPage = void 0;
|
|
12
|
+
var PagePermissionsAdminPage_1 = require("./PagePermissionsAdminPage");
|
|
13
|
+
Object.defineProperty(exports, "PagePermissionsAdminPage", { enumerable: true, get: function () { return __importDefault(PagePermissionsAdminPage_1).default; } });
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role Management Admin Page (/admin/roles)
|
|
3
|
+
*
|
|
4
|
+
* Design: Aurum (DESIGN_SPEC.md)
|
|
5
|
+
* Three sections:
|
|
6
|
+
* 1. Available Roles — Cards showing SiteAdmin, ClientAdmin
|
|
7
|
+
* 2. User Assignments — Table with inline role dropdowns
|
|
8
|
+
* 3. Change History — Audit log of role changes
|
|
9
|
+
*
|
|
10
|
+
* Design Principles:
|
|
11
|
+
* - No shadows, gradients, or animation
|
|
12
|
+
* - One accent color (blue #0066cc)
|
|
13
|
+
* - Inline interactions (no modals)
|
|
14
|
+
* - Scan-friendly tables and lists
|
|
15
|
+
*/
|
|
16
|
+
export default function RolesAdminPage(): import("react/jsx-runtime").JSX.Element;
|