@payez/next-mvp 3.0.0
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/README.md +782 -0
- package/dist/api/auth-handler.d.ts +67 -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 +112 -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 +20 -0
- package/dist/api-handlers/admin/analytics.js +379 -0
- package/dist/api-handlers/admin/audit.d.ts +20 -0
- package/dist/api-handlers/admin/audit.js +214 -0
- package/dist/api-handlers/admin/index.d.ts +21 -0
- package/dist/api-handlers/admin/index.js +41 -0
- package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
- package/dist/api-handlers/admin/redis-sessions.js +204 -0
- package/dist/api-handlers/admin/sessions.d.ts +21 -0
- package/dist/api-handlers/admin/sessions.js +284 -0
- package/dist/api-handlers/admin/site-logs.d.ts +46 -0
- package/dist/api-handlers/admin/site-logs.js +318 -0
- package/dist/api-handlers/admin/users.d.ts +20 -0
- package/dist/api-handlers/admin/users.js +222 -0
- package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
- package/dist/api-handlers/admin/vibe-data.js +268 -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 +635 -0
- package/dist/api-handlers/auth/signout.d.ts +37 -0
- package/dist/api-handlers/auth/signout.js +187 -0
- package/dist/api-handlers/auth/status.d.ts +8 -0
- package/dist/api-handlers/auth/status.js +26 -0
- package/dist/api-handlers/auth/update-session.d.ts +37 -0
- package/dist/api-handlers/auth/update-session.js +95 -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 +94 -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 +146 -0
- package/dist/api-handlers/test/force-expire.d.ts +23 -0
- package/dist/api-handlers/test/force-expire.js +65 -0
- package/dist/auth/auth-decision.d.ts +39 -0
- package/dist/auth/auth-decision.js +182 -0
- package/dist/auth/auth-options.d.ts +57 -0
- package/dist/auth/auth-options.js +213 -0
- package/dist/auth/callbacks/index.d.ts +6 -0
- package/dist/auth/callbacks/index.js +12 -0
- package/dist/auth/callbacks/jwt.d.ts +45 -0
- package/dist/auth/callbacks/jwt.js +305 -0
- package/dist/auth/callbacks/session.d.ts +60 -0
- package/dist/auth/callbacks/session.js +170 -0
- package/dist/auth/callbacks/signin.d.ts +23 -0
- package/dist/auth/callbacks/signin.js +44 -0
- package/dist/auth/events/index.d.ts +4 -0
- package/dist/auth/events/index.js +8 -0
- package/dist/auth/events/signout.d.ts +17 -0
- package/dist/auth/events/signout.js +32 -0
- package/dist/auth/providers/credentials.d.ts +32 -0
- package/dist/auth/providers/credentials.js +223 -0
- package/dist/auth/providers/index.d.ts +5 -0
- package/dist/auth/providers/index.js +21 -0
- package/dist/auth/providers/oauth.d.ts +26 -0
- package/dist/auth/providers/oauth.js +105 -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 +383 -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 +84 -0
- package/dist/auth/utils/token-utils.js +219 -0
- package/dist/client/AuthContext.d.ts +19 -0
- package/dist/client/AuthContext.js +112 -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 +119 -0
- package/dist/components/SignalRHealthCheck.d.ts +10 -0
- package/dist/components/SignalRHealthCheck.js +97 -0
- package/dist/components/account/UserAvatarMenu.d.ts +20 -0
- package/dist/components/account/UserAvatarMenu.js +80 -0
- package/dist/components/account/index.d.ts +7 -0
- package/dist/components/account/index.js +10 -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 +69 -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 +79 -0
- package/dist/config/vibe-log-transport.js +203 -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 +81 -0
- package/dist/hooks/useAuthSettings.d.ts +59 -0
- package/dist/hooks/useAuthSettings.js +93 -0
- package/dist/hooks/useAvailableProviders.d.ts +45 -0
- package/dist/hooks/useAvailableProviders.js +108 -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 +57 -0
- package/dist/hooks/useSessionExpiration.js +72 -0
- package/dist/hooks/useViabilitySession.d.ts +75 -0
- package/dist/hooks/useViabilitySession.js +268 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +54 -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 +351 -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/nextauth-secret.d.ts +10 -0
- package/dist/lib/nextauth-secret.js +104 -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 +166 -0
- package/dist/lib/session-store.js +537 -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 +786 -0
- package/dist/lib/startup-init.d.ts +40 -0
- package/dist/lib/startup-init.js +261 -0
- package/dist/lib/test-aware-get-token.d.ts +2 -0
- package/dist/lib/test-aware-get-token.js +81 -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 +52 -0
- package/dist/lib/token-lifecycle.js +398 -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 +100 -0
- package/dist/middleware/create-middleware.js +445 -0
- package/dist/middleware/rbac-check.d.ts +44 -0
- package/dist/middleware/rbac-check.js +191 -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 +83 -0
- package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
- package/dist/pages/admin-roles/RolesAdminPage.js +78 -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 +177 -0
- package/dist/pages/client-admin/index.d.ts +32 -0
- package/dist/pages/client-admin/index.js +37 -0
- package/dist/pages/login/page.d.ts +22 -0
- package/dist/pages/login/page.js +239 -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/profile/profile-patch.d.ts +1 -0
- package/dist/pages/profile/profile-patch.js +281 -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/security/security-patch.d.ts +1 -0
- package/dist/pages/security/security-patch.js +302 -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 +140 -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 +98 -0
- package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
- package/dist/pages/test-env/JwtInspectPage.js +114 -0
- package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
- package/dist/pages/test-env/RefreshTokenPage.js +91 -0
- package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
- package/dist/pages/test-env/TestEnvPage.js +49 -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 +408 -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 +113 -0
- package/dist/routes/auth/nextauth.d.ts +19 -0
- package/dist/routes/auth/nextauth.js +72 -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 +72 -0
- package/dist/routes/auth/session.js +180 -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 +201 -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/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 +1531 -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/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 +23 -0
- package/dist/vibe/index.js +67 -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 +855 -0
- package/scripts/check-internal-url-usage.sh +73 -0
- package/scripts/dev-broker.ps1 +35 -0
- package/scripts/dev-local.ps1 +45 -0
- package/src/api/auth-handler.ts +550 -0
- package/src/api/index.ts +18 -0
- package/src/api-handlers/account/change-password.ts +145 -0
- package/src/api-handlers/account/masked-info.ts +45 -0
- package/src/api-handlers/account/profile.ts +80 -0
- package/src/api-handlers/account/recovery/initiate.ts +23 -0
- package/src/api-handlers/account/recovery/send-code.ts +25 -0
- package/src/api-handlers/account/recovery/verify-code.ts +25 -0
- package/src/api-handlers/account/reset-password.ts +23 -0
- package/src/api-handlers/account/send-code.ts +76 -0
- package/src/api-handlers/account/update-phone.ts +79 -0
- package/src/api-handlers/account/validate-password.ts +118 -0
- package/src/api-handlers/account/verify-email.ts +125 -0
- package/src/api-handlers/account/verify-sms.ts +125 -0
- package/src/api-handlers/admin/analytics.ts +445 -0
- package/src/api-handlers/admin/audit.ts +225 -0
- package/src/api-handlers/admin/index.ts +59 -0
- package/src/api-handlers/admin/redis-sessions.ts +253 -0
- package/src/api-handlers/admin/sessions.ts +320 -0
- package/src/api-handlers/admin/site-logs.ts +367 -0
- package/src/api-handlers/admin/users.ts +244 -0
- package/src/api-handlers/admin/vibe-data.ts +326 -0
- package/src/api-handlers/anon/preferences.ts +123 -0
- package/src/api-handlers/auth/jwks.ts +20 -0
- package/src/api-handlers/auth/login.ts +240 -0
- package/src/api-handlers/auth/refresh.ts +687 -0
- package/src/api-handlers/auth/signout.ts +212 -0
- package/src/api-handlers/auth/status.ts +23 -0
- package/src/api-handlers/auth/update-session.ts +125 -0
- package/src/api-handlers/auth/validate.ts +44 -0
- package/src/api-handlers/auth/verify-code.ts +129 -0
- package/src/api-handlers/session/refresh-viability.ts +36 -0
- package/src/api-handlers/session/viability.ts +166 -0
- package/src/api-handlers/test/force-expire.ts +67 -0
- package/src/auth/auth-decision.ts +230 -0
- package/src/auth/auth-options.ts +237 -0
- package/src/auth/callbacks/index.ts +7 -0
- package/src/auth/callbacks/jwt.ts +382 -0
- package/src/auth/callbacks/session.ts +243 -0
- package/src/auth/callbacks/signin.ts +56 -0
- package/src/auth/events/index.ts +5 -0
- package/src/auth/events/signout.ts +33 -0
- package/src/auth/providers/credentials.ts +256 -0
- package/src/auth/providers/index.ts +6 -0
- package/src/auth/providers/oauth.ts +114 -0
- package/src/auth/route-config.ts +220 -0
- package/src/auth/types/auth-types.ts +555 -0
- package/src/auth/types/index.ts +7 -0
- package/src/auth/unauthenticated-routes.ts +3 -0
- package/src/auth/utils/idp-client.ts +444 -0
- package/src/auth/utils/index.ts +6 -0
- package/src/auth/utils/token-utils.ts +244 -0
- package/src/client/AuthContext.tsx +140 -0
- package/src/client/fetch-with-auth.ts +48 -0
- package/src/client/fetchWithSession.ts +21 -0
- package/src/client/index.ts +13 -0
- package/src/client/useAnonSession.ts +131 -0
- package/src/components/SessionSync.tsx +137 -0
- package/src/components/SignalRHealthCheck.tsx +131 -0
- package/src/components/account/UserAvatarMenu.tsx +217 -0
- package/src/components/account/index.ts +8 -0
- package/src/components/admin/AlertSettingsTab.tsx +728 -0
- package/src/components/admin/AnalyticsTab.tsx +703 -0
- package/src/components/admin/DataBrowserTab.tsx +505 -0
- package/src/components/admin/LoggingSettingsTab.tsx +665 -0
- package/src/components/admin/SessionsTab.tsx +414 -0
- package/src/components/admin/StatsTab.tsx +379 -0
- package/src/components/admin/VibeAdminContext.tsx +87 -0
- package/src/components/admin/VibeAdminLayout.tsx +185 -0
- package/src/components/admin/index.ts +59 -0
- package/src/components/auth/FederatedAuthSection.tsx +95 -0
- package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
- package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
- package/src/components/auth/TraditionalAuthSection.tsx +99 -0
- package/src/components/recovery/CompleteStep.tsx +36 -0
- package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
- package/src/components/recovery/SelectMethodStep.tsx +73 -0
- package/src/components/recovery/SetPasswordStep.tsx +97 -0
- package/src/components/recovery/VerifyCodeStep.tsx +90 -0
- package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
- package/src/components/reserved/ReservedStatusBox.tsx +118 -0
- package/src/components/ui/BetaBadge.tsx +58 -0
- package/src/components/ui/Footer.tsx +93 -0
- package/src/config/env.ts +57 -0
- package/src/config/logger.ts +62 -0
- package/src/config/logging-config.ts +82 -0
- package/src/config/unauthenticated-routes.ts +19 -0
- package/src/config/vibe-log-transport.ts +250 -0
- package/src/edge/internal-api-url.ts +65 -0
- package/src/edge/middleware.ts +42 -0
- package/src/hooks/useAuth.ts +115 -0
- package/src/hooks/useAuthSettings.ts +97 -0
- package/src/hooks/useAvailableProviders.ts +118 -0
- package/src/hooks/usePasswordValidation.ts +127 -0
- package/src/hooks/useProfile.ts +75 -0
- package/src/hooks/usePublicAuthSettings.ts +149 -0
- package/src/hooks/useSessionExpiration.ts +102 -0
- package/src/hooks/useViabilitySession.ts +335 -0
- package/src/index.ts +63 -0
- package/src/lib/anon-session.ts +213 -0
- package/src/lib/api-handler.ts +625 -0
- package/src/lib/app-slug.ts +178 -0
- package/src/lib/demo-mode.ts +13 -0
- package/src/lib/geolocation.ts +265 -0
- package/src/lib/idp-client-config.ts +442 -0
- package/src/lib/idp-fetch.ts +101 -0
- package/src/lib/internal-api.ts +171 -0
- package/src/lib/jwt-decode-client.ts +45 -0
- package/src/lib/jwt-decode.ts +83 -0
- package/src/lib/nextauth-secret.ts +126 -0
- package/src/lib/rate-limit-service.ts +9 -0
- package/src/lib/redis.ts +27 -0
- package/src/lib/refresh-token-validator.ts +64 -0
- package/src/lib/roles.ts +177 -0
- package/src/lib/secret-validation.ts +8 -0
- package/src/lib/session-store.ts +637 -0
- package/src/lib/session.ts +34 -0
- package/src/lib/site-logger.ts +245 -0
- package/src/lib/standardized-client-api.ts +896 -0
- package/src/lib/startup-init.ts +247 -0
- package/src/lib/test-aware-get-token.ts +30 -0
- package/src/lib/token-expiry.ts +40 -0
- package/src/lib/token-lifecycle.ts +477 -0
- package/src/lib/types/api-responses.ts +336 -0
- package/src/lib/user-agent-parser.ts +252 -0
- package/src/logging/api/admin-analytics.ts +51 -0
- package/src/logging/api/audit-log.ts +53 -0
- package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
- package/src/logging/components/AuditLogViewer.tsx +125 -0
- package/src/logging/components/ErrorMetricsCard.tsx +98 -0
- package/src/logging/components/HealthMetricsCard.tsx +70 -0
- package/src/logging/hooks/useAdminAnalytics.ts +22 -0
- package/src/logging/hooks/useAuditLog.ts +24 -0
- package/src/logging/hooks/useErrorMetrics.ts +40 -0
- package/src/logging/hooks/useHealthMetrics.ts +44 -0
- package/src/logging/index.ts +18 -0
- package/src/logging/types/analytics.ts +81 -0
- package/src/logging/types/audit.ts +31 -0
- package/src/logging/types/index.ts +3 -0
- package/src/middleware/auth-decision.ts +43 -0
- package/src/middleware/create-middleware.ts +626 -0
- package/src/middleware/rbac-check.ts +244 -0
- package/src/middleware/twofa-presets.ts +224 -0
- package/src/models/DecodedAccessToken.ts +17 -0
- package/src/models/SessionModel.ts +258 -0
- package/src/pages/admin-login/page.tsx +229 -0
- package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
- package/src/pages/admin-roles/index.ts +9 -0
- package/src/pages/admin-roles/modals.tsx +469 -0
- package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
- package/src/pages/client-admin/index.ts +33 -0
- package/src/pages/login/page.tsx +463 -0
- package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
- package/src/pages/profile/index.ts +9 -0
- package/src/pages/profile/page.tsx +166 -0
- package/src/pages/recovery/page.tsx +234 -0
- package/src/pages/roles/MyRolesPage.tsx +211 -0
- package/src/pages/roles/components.tsx +294 -0
- package/src/pages/roles/index.ts +17 -0
- package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
- package/src/pages/security/index.ts +9 -0
- package/src/pages/security/page.tsx +507 -0
- package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
- package/src/pages/settings/index.ts +9 -0
- package/src/pages/settings/page.tsx +47 -0
- package/src/pages/showcase/ShowcasePage.tsx +530 -0
- package/src/pages/showcase/index.ts +13 -0
- package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
- package/src/pages/test-env/JwtInspectPage.tsx +418 -0
- package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
- package/src/pages/test-env/TestEnvPage.tsx +116 -0
- package/src/pages/test-env/index.ts +25 -0
- package/src/pages/verify-code/page.tsx +648 -0
- package/src/routes/account/index.ts +32 -0
- package/src/routes/account/masked-info.ts +37 -0
- package/src/routes/account/send-code.ts +40 -0
- package/src/routes/account/update-phone.ts +13 -0
- package/src/routes/account/verify-email.ts +41 -0
- package/src/routes/account/verify-sms.ts +41 -0
- package/src/routes/auth/index.ts +23 -0
- package/src/routes/auth/logout.ts +127 -0
- package/src/routes/auth/nextauth.ts +71 -0
- package/src/routes/auth/refresh.ts +54 -0
- package/src/routes/auth/session.ts +193 -0
- package/src/routes/auth/settings.ts +75 -0
- package/src/routes/auth/viability.ts +220 -0
- package/src/routes/index.ts +18 -0
- package/src/routes/session/index.ts +7 -0
- package/src/routes/session/refresh-viability.ts +17 -0
- package/src/services/signalrActivityService.ts +258 -0
- package/src/stores/authStore.ts +1904 -0
- package/src/templates/instrumentation.ts +41 -0
- package/src/theme/ThemeProvider.tsx +39 -0
- package/src/theme/default.ts +33 -0
- package/src/theme/index.ts +31 -0
- package/src/theme/types.ts +69 -0
- package/src/theme/useTheme.ts +57 -0
- package/src/theme/utils.ts +40 -0
- package/src/types/api.ts +13 -0
- package/src/types/auth.d.ts +15 -0
- package/src/types/auth.ts +22 -0
- package/src/types/logging.ts +11 -0
- package/src/types/next-auth.d.ts +15 -0
- package/src/types/recovery.ts +54 -0
- package/src/types/security.ts +1 -0
- package/src/utils/api.ts +353 -0
- package/src/utils/circuitBreaker.ts +40 -0
- package/src/utils/error-message.ts +108 -0
- package/src/utils/layout/reservedSpace.ts +124 -0
- package/src/utils/logout.ts +30 -0
- package/src/vibe/client.ts +590 -0
- package/src/vibe/errors.ts +185 -0
- package/src/vibe/generic.ts +429 -0
- package/src/vibe/hooks/index.ts +367 -0
- package/src/vibe/index.ts +121 -0
- package/src/vibe/sessions.ts +551 -0
- package/src/vibe/types.ts +577 -0
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* =============================================================================
|
|
4
|
+
* VIBE CLIENT - PRISMA-STYLE QUERY BUILDER
|
|
5
|
+
* =============================================================================
|
|
6
|
+
*
|
|
7
|
+
* A typed query builder for the Vibe App API.
|
|
8
|
+
* Provides Prisma-like DX for CRUD operations on Vibe tables.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* import { vibe } from '@payez/next-mvp/vibe'
|
|
12
|
+
*
|
|
13
|
+
* // Find many with filters
|
|
14
|
+
* const users = await vibe.users.findMany({
|
|
15
|
+
* where: { status: 'active' },
|
|
16
|
+
* take: 10,
|
|
17
|
+
* skip: 0,
|
|
18
|
+
* orderBy: { created_at: 'desc' }
|
|
19
|
+
* })
|
|
20
|
+
*
|
|
21
|
+
* // Find one by ID
|
|
22
|
+
* const user = await vibe.users.findUnique({ where: { id: 123 } })
|
|
23
|
+
*
|
|
24
|
+
* // Create
|
|
25
|
+
* const newUser = await vibe.users.create({
|
|
26
|
+
* data: { email: 'test@example.com', name: 'Test' }
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* // Update
|
|
30
|
+
* const updated = await vibe.users.update({
|
|
31
|
+
* where: { id: 123 },
|
|
32
|
+
* data: { name: 'Updated' }
|
|
33
|
+
* })
|
|
34
|
+
*
|
|
35
|
+
* // Delete (soft delete)
|
|
36
|
+
* await vibe.users.delete({ where: { id: 123 } })
|
|
37
|
+
*
|
|
38
|
+
* =============================================================================
|
|
39
|
+
*/
|
|
40
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
41
|
+
if (k2 === undefined) k2 = k;
|
|
42
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
43
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
44
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
45
|
+
}
|
|
46
|
+
Object.defineProperty(o, k2, desc);
|
|
47
|
+
}) : (function(o, m, k, k2) {
|
|
48
|
+
if (k2 === undefined) k2 = k;
|
|
49
|
+
o[k2] = m[k];
|
|
50
|
+
}));
|
|
51
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
52
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
53
|
+
}) : function(o, v) {
|
|
54
|
+
o["default"] = v;
|
|
55
|
+
});
|
|
56
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
57
|
+
var ownKeys = function(o) {
|
|
58
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
59
|
+
var ar = [];
|
|
60
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
61
|
+
return ar;
|
|
62
|
+
};
|
|
63
|
+
return ownKeys(o);
|
|
64
|
+
};
|
|
65
|
+
return function (mod) {
|
|
66
|
+
if (mod && mod.__esModule) return mod;
|
|
67
|
+
var result = {};
|
|
68
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
69
|
+
__setModuleDefault(result, mod);
|
|
70
|
+
return result;
|
|
71
|
+
};
|
|
72
|
+
})();
|
|
73
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
74
|
+
exports.vibe = exports.VibeClient = exports.VibeTableDelegate = void 0;
|
|
75
|
+
exports.createVibeClient = createVibeClient;
|
|
76
|
+
const errors_1 = require("./errors");
|
|
77
|
+
// -----------------------------------------------------------------------------
|
|
78
|
+
// RETRY HELPERS
|
|
79
|
+
// -----------------------------------------------------------------------------
|
|
80
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
81
|
+
maxRetries: 3,
|
|
82
|
+
baseDelay: 1000,
|
|
83
|
+
maxDelay: 10000,
|
|
84
|
+
retryOnRateLimit: true,
|
|
85
|
+
};
|
|
86
|
+
/** Sleep for a given number of milliseconds */
|
|
87
|
+
function sleep(ms) {
|
|
88
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
89
|
+
}
|
|
90
|
+
/** Calculate exponential backoff delay with jitter */
|
|
91
|
+
function getBackoffDelay(attempt, baseDelay, maxDelay) {
|
|
92
|
+
// Exponential backoff: baseDelay * 2^attempt
|
|
93
|
+
const exponentialDelay = baseDelay * Math.pow(2, attempt);
|
|
94
|
+
// Add jitter (±25%) to prevent thundering herd
|
|
95
|
+
const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);
|
|
96
|
+
return Math.min(exponentialDelay + jitter, maxDelay);
|
|
97
|
+
}
|
|
98
|
+
// -----------------------------------------------------------------------------
|
|
99
|
+
// TABLE DELEGATE
|
|
100
|
+
// -----------------------------------------------------------------------------
|
|
101
|
+
/**
|
|
102
|
+
* Delegate class for table operations.
|
|
103
|
+
* Provides Prisma-style methods for a specific table.
|
|
104
|
+
*/
|
|
105
|
+
class VibeTableDelegate {
|
|
106
|
+
tableName;
|
|
107
|
+
client;
|
|
108
|
+
constructor(tableName, client) {
|
|
109
|
+
this.tableName = tableName;
|
|
110
|
+
this.client = client;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Find multiple records with optional filtering and pagination.
|
|
114
|
+
*/
|
|
115
|
+
async findMany(options) {
|
|
116
|
+
const params = new URLSearchParams();
|
|
117
|
+
// Build filter params
|
|
118
|
+
if (options?.where) {
|
|
119
|
+
for (const [key, value] of Object.entries(options.where)) {
|
|
120
|
+
if (value !== undefined) {
|
|
121
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
122
|
+
// Handle operator objects (e.g., { gt: 5 }, { in: [1,2,3] })
|
|
123
|
+
for (const [op, val] of Object.entries(value)) {
|
|
124
|
+
if (Array.isArray(val)) {
|
|
125
|
+
// Handle array values for in/nin operators
|
|
126
|
+
val.forEach(v => params.append(`filter[${key}][${op}][]`, String(v)));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
params.append(`filter[${key}][${op}]`, String(val));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (Array.isArray(value)) {
|
|
134
|
+
// Handle direct array values
|
|
135
|
+
value.forEach(v => params.append(`filter[${key}][]`, String(v)));
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
params.append(`filter[${key}]`, String(value));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Pagination
|
|
144
|
+
if (options?.take !== undefined) {
|
|
145
|
+
params.append('limit', String(options.take));
|
|
146
|
+
}
|
|
147
|
+
if (options?.skip !== undefined) {
|
|
148
|
+
params.append('offset', String(options.skip));
|
|
149
|
+
}
|
|
150
|
+
// Sorting
|
|
151
|
+
if (options?.orderBy) {
|
|
152
|
+
const sortParts = [];
|
|
153
|
+
for (const [key, dir] of Object.entries(options.orderBy)) {
|
|
154
|
+
sortParts.push(dir === 'desc' ? `-${key}` : key);
|
|
155
|
+
}
|
|
156
|
+
if (sortParts.length > 0) {
|
|
157
|
+
params.append('sort', sortParts.join(','));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const queryString = params.toString();
|
|
161
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/${this.tableName}${queryString ? `?${queryString}` : ''}`;
|
|
162
|
+
const response = await this.client.request(url, 'GET');
|
|
163
|
+
return {
|
|
164
|
+
data: response.data,
|
|
165
|
+
meta: response.meta || { total: response.data.length, limit: options?.take || 50, offset: options?.skip || 0 },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Find a single record by ID.
|
|
170
|
+
* Throws VibeNotFoundError if not found.
|
|
171
|
+
*/
|
|
172
|
+
async findUnique(options) {
|
|
173
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/${this.tableName}/${options.where.id}`;
|
|
174
|
+
const response = await this.client.request(url, 'GET');
|
|
175
|
+
return response.data;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Find a single record by ID.
|
|
179
|
+
* Returns null if not found (instead of throwing).
|
|
180
|
+
*/
|
|
181
|
+
async findUniqueOrNull(options) {
|
|
182
|
+
try {
|
|
183
|
+
return await this.findUnique(options);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (error instanceof errors_1.VibeNotFoundError) {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Find the first record matching the filter.
|
|
194
|
+
* Returns null if none found.
|
|
195
|
+
*/
|
|
196
|
+
async findFirst(options) {
|
|
197
|
+
const result = await this.findMany({ ...options, take: 1 });
|
|
198
|
+
return result.data[0] || null;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create a new record.
|
|
202
|
+
*/
|
|
203
|
+
async create(options) {
|
|
204
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/${this.tableName}`;
|
|
205
|
+
const response = await this.client.request(url, 'POST', options.data);
|
|
206
|
+
return response.data;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Update an existing record by ID.
|
|
210
|
+
* Throws VibeNotFoundError if not found.
|
|
211
|
+
*/
|
|
212
|
+
async update(options) {
|
|
213
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/${this.tableName}/${options.where.id}`;
|
|
214
|
+
const response = await this.client.request(url, 'PUT', options.data);
|
|
215
|
+
return response.data;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Delete a record by ID (soft delete).
|
|
219
|
+
* Throws VibeNotFoundError if not found.
|
|
220
|
+
*/
|
|
221
|
+
async delete(options) {
|
|
222
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/${this.tableName}/${options.where.id}`;
|
|
223
|
+
const response = await this.client.request(url, 'DELETE');
|
|
224
|
+
return response.data;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Count records matching the filter.
|
|
228
|
+
*/
|
|
229
|
+
async count(options) {
|
|
230
|
+
// Use findMany with limit 0 to get just the count
|
|
231
|
+
const result = await this.findMany({ ...options, take: 0 });
|
|
232
|
+
return result.meta.total;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Create multiple records in a batch.
|
|
236
|
+
*/
|
|
237
|
+
async createMany(options) {
|
|
238
|
+
const url = `${this.client.getBaseUrl()}/api/v1/vibe_app/batch`;
|
|
239
|
+
const response = await this.client.request(url, 'POST', {
|
|
240
|
+
operations: options.data.map(item => ({
|
|
241
|
+
table: this.tableName,
|
|
242
|
+
operation: 'create',
|
|
243
|
+
data: item,
|
|
244
|
+
})),
|
|
245
|
+
});
|
|
246
|
+
return response.data;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.VibeTableDelegate = VibeTableDelegate;
|
|
250
|
+
// -----------------------------------------------------------------------------
|
|
251
|
+
// VIBE CLIENT
|
|
252
|
+
// -----------------------------------------------------------------------------
|
|
253
|
+
/**
|
|
254
|
+
* Main Vibe client class.
|
|
255
|
+
* Provides access to all Vibe App tables via table delegates.
|
|
256
|
+
*/
|
|
257
|
+
class VibeClient {
|
|
258
|
+
config;
|
|
259
|
+
// Table delegates
|
|
260
|
+
users;
|
|
261
|
+
login_sessions;
|
|
262
|
+
profiles;
|
|
263
|
+
settings;
|
|
264
|
+
files;
|
|
265
|
+
notifications;
|
|
266
|
+
activity_log;
|
|
267
|
+
tags;
|
|
268
|
+
comments;
|
|
269
|
+
site_logs;
|
|
270
|
+
constructor(config = {}) {
|
|
271
|
+
this.config = {
|
|
272
|
+
baseUrl: config.baseUrl || process.env.VIBE_API_URL || '',
|
|
273
|
+
clientId: config.clientId || process.env.VIBE_CLIENT_ID || '',
|
|
274
|
+
idpUrl: config.idpUrl || process.env.IDP_URL || '',
|
|
275
|
+
appSigningKey: config.appSigningKey || process.env.VIBE_HMAC_KEY || '',
|
|
276
|
+
fetch: config.fetch || globalThis.fetch,
|
|
277
|
+
retry: { ...DEFAULT_RETRY_CONFIG, ...config.retry },
|
|
278
|
+
};
|
|
279
|
+
// Initialize table delegates
|
|
280
|
+
this.users = new VibeTableDelegate('users', this);
|
|
281
|
+
this.login_sessions = new VibeTableDelegate('login_sessions', this);
|
|
282
|
+
this.profiles = new VibeTableDelegate('profiles', this);
|
|
283
|
+
this.settings = new VibeTableDelegate('settings', this);
|
|
284
|
+
this.files = new VibeTableDelegate('files', this);
|
|
285
|
+
this.notifications = new VibeTableDelegate('notifications', this);
|
|
286
|
+
this.activity_log = new VibeTableDelegate('activity_log', this);
|
|
287
|
+
this.tags = new VibeTableDelegate('tags', this);
|
|
288
|
+
this.comments = new VibeTableDelegate('comments', this);
|
|
289
|
+
this.site_logs = new VibeTableDelegate('site_logs', this);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if the client is configured to use proxy mode (IDP proxy).
|
|
293
|
+
* MVP always uses proxy mode - direct Vibe access is not supported.
|
|
294
|
+
*/
|
|
295
|
+
useProxyMode() {
|
|
296
|
+
return !!this.config.appSigningKey && !!this.config.idpUrl;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Generate HMAC-SHA256 signature for IDP proxy authentication.
|
|
300
|
+
* Message format: {timestamp}|{method}|{endpoint}
|
|
301
|
+
*/
|
|
302
|
+
async generateProxySignature(timestamp, method, endpoint) {
|
|
303
|
+
const message = `${timestamp}|${method}|${endpoint}`;
|
|
304
|
+
const keyBuffer = Buffer.from(this.config.appSigningKey, 'base64');
|
|
305
|
+
// Use Web Crypto API for browser/edge compatibility, fall back to Node crypto
|
|
306
|
+
if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.subtle) {
|
|
307
|
+
const encoder = new TextEncoder();
|
|
308
|
+
const key = await globalThis.crypto.subtle.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
|
|
309
|
+
const signature = await globalThis.crypto.subtle.sign('HMAC', key, encoder.encode(message));
|
|
310
|
+
return Buffer.from(signature).toString('base64');
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
// Node.js fallback
|
|
314
|
+
const crypto = await Promise.resolve().then(() => __importStar(require('crypto')));
|
|
315
|
+
return crypto.createHmac('sha256', keyBuffer).update(message).digest('base64');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Make a request through the IDP Vibe proxy.
|
|
320
|
+
* The proxy handles credential injection securely.
|
|
321
|
+
*/
|
|
322
|
+
async requestViaProxy(url, method, body, authToken) {
|
|
323
|
+
// Extract the endpoint path from the full URL
|
|
324
|
+
const urlObj = new URL(url);
|
|
325
|
+
const endpoint = urlObj.pathname + urlObj.search;
|
|
326
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
327
|
+
const signature = await this.generateProxySignature(timestamp, method, endpoint);
|
|
328
|
+
const proxyUrl = `${this.config.idpUrl}/api/vibe/proxy`;
|
|
329
|
+
const headers = {
|
|
330
|
+
'Content-Type': 'application/json',
|
|
331
|
+
'X-Vibe-Client-Id': this.config.clientId,
|
|
332
|
+
'X-Vibe-Timestamp': String(timestamp),
|
|
333
|
+
'X-Vibe-Signature': signature,
|
|
334
|
+
};
|
|
335
|
+
// Pass through auth token if provided (for user context)
|
|
336
|
+
if (authToken) {
|
|
337
|
+
headers['Authorization'] = `Bearer ${authToken}`;
|
|
338
|
+
}
|
|
339
|
+
const proxyBody = {
|
|
340
|
+
method,
|
|
341
|
+
endpoint,
|
|
342
|
+
...(body !== undefined && { body }),
|
|
343
|
+
};
|
|
344
|
+
const response = await this.config.fetch(proxyUrl, {
|
|
345
|
+
method: 'POST',
|
|
346
|
+
headers,
|
|
347
|
+
body: JSON.stringify(proxyBody),
|
|
348
|
+
});
|
|
349
|
+
if (!response.ok) {
|
|
350
|
+
const errorBody = await this.parseErrorResponse(response);
|
|
351
|
+
throw errors_1.VibeError.fromResponse(errorBody, response.status);
|
|
352
|
+
}
|
|
353
|
+
const responseData = await response.json();
|
|
354
|
+
if (!responseData.success) {
|
|
355
|
+
throw errors_1.VibeError.fromResponse(responseData, response.status);
|
|
356
|
+
}
|
|
357
|
+
return responseData;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get the configured base URL.
|
|
361
|
+
*/
|
|
362
|
+
getBaseUrl() {
|
|
363
|
+
return this.config.baseUrl;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Make an authenticated request to the Vibe API with smart retry logic.
|
|
367
|
+
*
|
|
368
|
+
* Routing:
|
|
369
|
+
* - All requests route through the IDP proxy (requires VIBE_HMAC_KEY + IDP_URL)
|
|
370
|
+
*
|
|
371
|
+
* Retry behavior:
|
|
372
|
+
* - 5xx errors: Retry up to maxRetries times with exponential backoff
|
|
373
|
+
* - 429 errors: Retry once after Retry-After delay (if retryOnRateLimit enabled)
|
|
374
|
+
* - 401/403 errors: No retry (auth errors)
|
|
375
|
+
* - Network errors: Retry with backoff
|
|
376
|
+
*/
|
|
377
|
+
async request(url, method, body, authToken) {
|
|
378
|
+
if (!this.config.clientId) {
|
|
379
|
+
throw new errors_1.VibeServiceError('VIBE_CLIENT_ID is not configured');
|
|
380
|
+
}
|
|
381
|
+
// Check if we should use proxy mode
|
|
382
|
+
if (this.useProxyMode()) {
|
|
383
|
+
if (!this.config.idpUrl) {
|
|
384
|
+
throw new errors_1.VibeServiceError('IDP_URL is not configured (required for proxy mode)');
|
|
385
|
+
}
|
|
386
|
+
if (!this.config.appSigningKey) {
|
|
387
|
+
throw new errors_1.VibeServiceError('VIBE_HMAC_KEY is not configured (required for proxy mode)');
|
|
388
|
+
}
|
|
389
|
+
// Route through IDP proxy
|
|
390
|
+
return this.requestViaProxy(url, method, body, authToken);
|
|
391
|
+
}
|
|
392
|
+
// MVP requires proxy mode - direct Vibe access is not supported
|
|
393
|
+
throw new errors_1.VibeServiceError('Vibe proxy not configured. Set VIBE_HMAC_KEY + IDP_URL for proxy mode.');
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Parse error response body, handling non-JSON responses gracefully.
|
|
397
|
+
*/
|
|
398
|
+
async parseErrorResponse(response) {
|
|
399
|
+
try {
|
|
400
|
+
return await response.json();
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
// Non-JSON error response
|
|
404
|
+
const text = await response.text().catch(() => 'Unknown error');
|
|
405
|
+
return {
|
|
406
|
+
success: false,
|
|
407
|
+
error: {
|
|
408
|
+
code: `HTTP_${response.status}`,
|
|
409
|
+
message: text || response.statusText,
|
|
410
|
+
},
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Fetch the schema for type generation.
|
|
416
|
+
*/
|
|
417
|
+
async getSchema() {
|
|
418
|
+
const url = `${this.config.baseUrl}/api/v1/vibe_app/schema`;
|
|
419
|
+
const response = await this.request(url, 'GET');
|
|
420
|
+
return response.data;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
exports.VibeClient = VibeClient;
|
|
424
|
+
// -----------------------------------------------------------------------------
|
|
425
|
+
// SINGLETON INSTANCE
|
|
426
|
+
// -----------------------------------------------------------------------------
|
|
427
|
+
/**
|
|
428
|
+
* Default Vibe client instance.
|
|
429
|
+
* Uses environment variables for configuration.
|
|
430
|
+
*
|
|
431
|
+
* Usage:
|
|
432
|
+
* import { vibe } from '@payez/next-mvp/vibe'
|
|
433
|
+
* const users = await vibe.users.findMany()
|
|
434
|
+
*/
|
|
435
|
+
exports.vibe = new VibeClient();
|
|
436
|
+
/**
|
|
437
|
+
* Create a new Vibe client with custom configuration.
|
|
438
|
+
*
|
|
439
|
+
* Usage:
|
|
440
|
+
* import { createVibeClient } from '@payez/next-mvp/vibe'
|
|
441
|
+
* const customVibe = createVibeClient({ baseUrl: 'https://custom-api.example.com' })
|
|
442
|
+
*/
|
|
443
|
+
function createVibeClient(config) {
|
|
444
|
+
return new VibeClient(config);
|
|
445
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* VIBE API ERROR CLASSES
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* Typed error classes for Vibe API operations.
|
|
7
|
+
* These provide specific error handling for different failure scenarios.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* try {
|
|
11
|
+
* await vibe.users.findUnique({ where: { id: 123 } })
|
|
12
|
+
* } catch (error) {
|
|
13
|
+
* if (error instanceof VibeNotFoundError) {
|
|
14
|
+
* // Handle 404
|
|
15
|
+
* } else if (error instanceof VibeValidationError) {
|
|
16
|
+
* // Handle validation errors
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* =============================================================================
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Base error class for all Vibe API errors
|
|
24
|
+
*/
|
|
25
|
+
export declare class VibeError extends Error {
|
|
26
|
+
readonly code: string;
|
|
27
|
+
readonly status: number;
|
|
28
|
+
readonly details?: Record<string, unknown>;
|
|
29
|
+
constructor(message: string, code: string, status: number, details?: Record<string, unknown>);
|
|
30
|
+
toJSON(): {
|
|
31
|
+
name: string;
|
|
32
|
+
message: string;
|
|
33
|
+
code: string;
|
|
34
|
+
status: number;
|
|
35
|
+
details: Record<string, unknown> | undefined;
|
|
36
|
+
};
|
|
37
|
+
static fromResponse(response: {
|
|
38
|
+
success: false;
|
|
39
|
+
error: {
|
|
40
|
+
code: string;
|
|
41
|
+
message: string;
|
|
42
|
+
details?: Record<string, unknown>;
|
|
43
|
+
};
|
|
44
|
+
}, status: number): VibeError;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Thrown when a requested resource is not found (404)
|
|
48
|
+
*/
|
|
49
|
+
export declare class VibeNotFoundError extends VibeError {
|
|
50
|
+
constructor(message?: string, code?: string, details?: Record<string, unknown>);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Thrown when input validation fails (400)
|
|
54
|
+
*/
|
|
55
|
+
export declare class VibeValidationError extends VibeError {
|
|
56
|
+
readonly fieldErrors?: Record<string, string[]>;
|
|
57
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Thrown when authentication/authorization fails (401/403)
|
|
61
|
+
*/
|
|
62
|
+
export declare class VibeAuthError extends VibeError {
|
|
63
|
+
constructor(message?: string, code?: string, details?: Record<string, unknown>);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Thrown when rate limit is exceeded (429)
|
|
67
|
+
*/
|
|
68
|
+
export declare class VibeRateLimitError extends VibeError {
|
|
69
|
+
readonly retryAfter?: number;
|
|
70
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Thrown when there's a conflict (e.g., duplicate entry) (409)
|
|
74
|
+
*/
|
|
75
|
+
export declare class VibeConflictError extends VibeError {
|
|
76
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Thrown when the Vibe API is unavailable (503)
|
|
80
|
+
*/
|
|
81
|
+
export declare class VibeServiceError extends VibeError {
|
|
82
|
+
constructor(message?: string, details?: Record<string, unknown>);
|
|
83
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* =============================================================================
|
|
4
|
+
* VIBE API ERROR CLASSES
|
|
5
|
+
* =============================================================================
|
|
6
|
+
*
|
|
7
|
+
* Typed error classes for Vibe API operations.
|
|
8
|
+
* These provide specific error handling for different failure scenarios.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* try {
|
|
12
|
+
* await vibe.users.findUnique({ where: { id: 123 } })
|
|
13
|
+
* } catch (error) {
|
|
14
|
+
* if (error instanceof VibeNotFoundError) {
|
|
15
|
+
* // Handle 404
|
|
16
|
+
* } else if (error instanceof VibeValidationError) {
|
|
17
|
+
* // Handle validation errors
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* =============================================================================
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.VibeServiceError = exports.VibeConflictError = exports.VibeRateLimitError = exports.VibeAuthError = exports.VibeValidationError = exports.VibeNotFoundError = exports.VibeError = void 0;
|
|
25
|
+
/**
|
|
26
|
+
* Base error class for all Vibe API errors
|
|
27
|
+
*/
|
|
28
|
+
class VibeError extends Error {
|
|
29
|
+
code;
|
|
30
|
+
status;
|
|
31
|
+
details;
|
|
32
|
+
constructor(message, code, status, details) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'VibeError';
|
|
35
|
+
this.code = code;
|
|
36
|
+
this.status = status;
|
|
37
|
+
this.details = details;
|
|
38
|
+
// Maintains proper stack trace for where our error was thrown
|
|
39
|
+
if (Error.captureStackTrace) {
|
|
40
|
+
Error.captureStackTrace(this, VibeError);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
toJSON() {
|
|
44
|
+
return {
|
|
45
|
+
name: this.name,
|
|
46
|
+
message: this.message,
|
|
47
|
+
code: this.code,
|
|
48
|
+
status: this.status,
|
|
49
|
+
details: this.details,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static fromResponse(response, status) {
|
|
53
|
+
const { code, message, details } = response.error;
|
|
54
|
+
switch (code) {
|
|
55
|
+
case 'NOT_FOUND':
|
|
56
|
+
case 'DOCUMENT_NOT_FOUND':
|
|
57
|
+
case 'TABLE_NOT_FOUND':
|
|
58
|
+
return new VibeNotFoundError(message, code, details);
|
|
59
|
+
case 'VALIDATION_ERROR':
|
|
60
|
+
case 'INVALID_INPUT':
|
|
61
|
+
return new VibeValidationError(message, details);
|
|
62
|
+
case 'UNAUTHORIZED':
|
|
63
|
+
case 'INVALID_CREDENTIALS':
|
|
64
|
+
case 'INVALID_CLIENT_ID':
|
|
65
|
+
return new VibeAuthError(message, code, details);
|
|
66
|
+
case 'RATE_LIMITED':
|
|
67
|
+
return new VibeRateLimitError(message, details);
|
|
68
|
+
case 'CONFLICT':
|
|
69
|
+
case 'DUPLICATE_ENTRY':
|
|
70
|
+
return new VibeConflictError(message, details);
|
|
71
|
+
default:
|
|
72
|
+
return new VibeError(message, code, status, details);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.VibeError = VibeError;
|
|
77
|
+
/**
|
|
78
|
+
* Thrown when a requested resource is not found (404)
|
|
79
|
+
*/
|
|
80
|
+
class VibeNotFoundError extends VibeError {
|
|
81
|
+
constructor(message = 'Resource not found', code = 'NOT_FOUND', details) {
|
|
82
|
+
super(message, code, 404, details);
|
|
83
|
+
this.name = 'VibeNotFoundError';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.VibeNotFoundError = VibeNotFoundError;
|
|
87
|
+
/**
|
|
88
|
+
* Thrown when input validation fails (400)
|
|
89
|
+
*/
|
|
90
|
+
class VibeValidationError extends VibeError {
|
|
91
|
+
fieldErrors;
|
|
92
|
+
constructor(message = 'Validation failed', details) {
|
|
93
|
+
super(message, 'VALIDATION_ERROR', 400, details);
|
|
94
|
+
this.name = 'VibeValidationError';
|
|
95
|
+
// Extract field-level errors if present
|
|
96
|
+
if (details?.fieldErrors) {
|
|
97
|
+
this.fieldErrors = details.fieldErrors;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.VibeValidationError = VibeValidationError;
|
|
102
|
+
/**
|
|
103
|
+
* Thrown when authentication/authorization fails (401/403)
|
|
104
|
+
*/
|
|
105
|
+
class VibeAuthError extends VibeError {
|
|
106
|
+
constructor(message = 'Authentication required', code = 'UNAUTHORIZED', details) {
|
|
107
|
+
super(message, code, 401, details);
|
|
108
|
+
this.name = 'VibeAuthError';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.VibeAuthError = VibeAuthError;
|
|
112
|
+
/**
|
|
113
|
+
* Thrown when rate limit is exceeded (429)
|
|
114
|
+
*/
|
|
115
|
+
class VibeRateLimitError extends VibeError {
|
|
116
|
+
retryAfter;
|
|
117
|
+
constructor(message = 'Rate limit exceeded', details) {
|
|
118
|
+
super(message, 'RATE_LIMITED', 429, details);
|
|
119
|
+
this.name = 'VibeRateLimitError';
|
|
120
|
+
// Extract retry-after if present
|
|
121
|
+
if (details?.retryAfter) {
|
|
122
|
+
this.retryAfter = details.retryAfter;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.VibeRateLimitError = VibeRateLimitError;
|
|
127
|
+
/**
|
|
128
|
+
* Thrown when there's a conflict (e.g., duplicate entry) (409)
|
|
129
|
+
*/
|
|
130
|
+
class VibeConflictError extends VibeError {
|
|
131
|
+
constructor(message = 'Resource conflict', details) {
|
|
132
|
+
super(message, 'CONFLICT', 409, details);
|
|
133
|
+
this.name = 'VibeConflictError';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.VibeConflictError = VibeConflictError;
|
|
137
|
+
/**
|
|
138
|
+
* Thrown when the Vibe API is unavailable (503)
|
|
139
|
+
*/
|
|
140
|
+
class VibeServiceError extends VibeError {
|
|
141
|
+
constructor(message = 'Vibe service unavailable', details) {
|
|
142
|
+
super(message, 'SERVICE_UNAVAILABLE', 503, details);
|
|
143
|
+
this.name = 'VibeServiceError';
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.VibeServiceError = VibeServiceError;
|