@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.
Files changed (654) hide show
  1. package/README.md +782 -0
  2. package/dist/api/auth-handler.d.ts +67 -0
  3. package/dist/api/auth-handler.js +397 -0
  4. package/dist/api/index.d.ts +10 -0
  5. package/dist/api/index.js +19 -0
  6. package/dist/api-handlers/account/change-password.d.ts +9 -0
  7. package/dist/api-handlers/account/change-password.js +112 -0
  8. package/dist/api-handlers/account/masked-info.d.ts +2 -0
  9. package/dist/api-handlers/account/masked-info.js +41 -0
  10. package/dist/api-handlers/account/profile.d.ts +3 -0
  11. package/dist/api-handlers/account/profile.js +63 -0
  12. package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
  13. package/dist/api-handlers/account/recovery/initiate.js +26 -0
  14. package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
  15. package/dist/api-handlers/account/recovery/send-code.js +28 -0
  16. package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
  17. package/dist/api-handlers/account/recovery/verify-code.js +28 -0
  18. package/dist/api-handlers/account/reset-password.d.ts +2 -0
  19. package/dist/api-handlers/account/reset-password.js +26 -0
  20. package/dist/api-handlers/account/send-code.d.ts +24 -0
  21. package/dist/api-handlers/account/send-code.js +60 -0
  22. package/dist/api-handlers/account/update-phone.d.ts +27 -0
  23. package/dist/api-handlers/account/update-phone.js +64 -0
  24. package/dist/api-handlers/account/validate-password.d.ts +17 -0
  25. package/dist/api-handlers/account/validate-password.js +81 -0
  26. package/dist/api-handlers/account/verify-email.d.ts +26 -0
  27. package/dist/api-handlers/account/verify-email.js +106 -0
  28. package/dist/api-handlers/account/verify-sms.d.ts +26 -0
  29. package/dist/api-handlers/account/verify-sms.js +106 -0
  30. package/dist/api-handlers/admin/analytics.d.ts +20 -0
  31. package/dist/api-handlers/admin/analytics.js +379 -0
  32. package/dist/api-handlers/admin/audit.d.ts +20 -0
  33. package/dist/api-handlers/admin/audit.js +214 -0
  34. package/dist/api-handlers/admin/index.d.ts +21 -0
  35. package/dist/api-handlers/admin/index.js +41 -0
  36. package/dist/api-handlers/admin/redis-sessions.d.ts +36 -0
  37. package/dist/api-handlers/admin/redis-sessions.js +204 -0
  38. package/dist/api-handlers/admin/sessions.d.ts +21 -0
  39. package/dist/api-handlers/admin/sessions.js +284 -0
  40. package/dist/api-handlers/admin/site-logs.d.ts +46 -0
  41. package/dist/api-handlers/admin/site-logs.js +318 -0
  42. package/dist/api-handlers/admin/users.d.ts +20 -0
  43. package/dist/api-handlers/admin/users.js +222 -0
  44. package/dist/api-handlers/admin/vibe-data.d.ts +80 -0
  45. package/dist/api-handlers/admin/vibe-data.js +268 -0
  46. package/dist/api-handlers/anon/preferences.d.ts +37 -0
  47. package/dist/api-handlers/anon/preferences.js +96 -0
  48. package/dist/api-handlers/auth/jwks.d.ts +2 -0
  49. package/dist/api-handlers/auth/jwks.js +24 -0
  50. package/dist/api-handlers/auth/login.d.ts +42 -0
  51. package/dist/api-handlers/auth/login.js +178 -0
  52. package/dist/api-handlers/auth/refresh.d.ts +74 -0
  53. package/dist/api-handlers/auth/refresh.js +635 -0
  54. package/dist/api-handlers/auth/signout.d.ts +37 -0
  55. package/dist/api-handlers/auth/signout.js +187 -0
  56. package/dist/api-handlers/auth/status.d.ts +8 -0
  57. package/dist/api-handlers/auth/status.js +26 -0
  58. package/dist/api-handlers/auth/update-session.d.ts +37 -0
  59. package/dist/api-handlers/auth/update-session.js +95 -0
  60. package/dist/api-handlers/auth/validate.d.ts +6 -0
  61. package/dist/api-handlers/auth/validate.js +43 -0
  62. package/dist/api-handlers/auth/verify-code.d.ts +43 -0
  63. package/dist/api-handlers/auth/verify-code.js +94 -0
  64. package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
  65. package/dist/api-handlers/session/refresh-viability.js +39 -0
  66. package/dist/api-handlers/session/viability.d.ts +13 -0
  67. package/dist/api-handlers/session/viability.js +146 -0
  68. package/dist/api-handlers/test/force-expire.d.ts +23 -0
  69. package/dist/api-handlers/test/force-expire.js +65 -0
  70. package/dist/auth/auth-decision.d.ts +39 -0
  71. package/dist/auth/auth-decision.js +182 -0
  72. package/dist/auth/auth-options.d.ts +57 -0
  73. package/dist/auth/auth-options.js +213 -0
  74. package/dist/auth/callbacks/index.d.ts +6 -0
  75. package/dist/auth/callbacks/index.js +12 -0
  76. package/dist/auth/callbacks/jwt.d.ts +45 -0
  77. package/dist/auth/callbacks/jwt.js +305 -0
  78. package/dist/auth/callbacks/session.d.ts +60 -0
  79. package/dist/auth/callbacks/session.js +170 -0
  80. package/dist/auth/callbacks/signin.d.ts +23 -0
  81. package/dist/auth/callbacks/signin.js +44 -0
  82. package/dist/auth/events/index.d.ts +4 -0
  83. package/dist/auth/events/index.js +8 -0
  84. package/dist/auth/events/signout.d.ts +17 -0
  85. package/dist/auth/events/signout.js +32 -0
  86. package/dist/auth/providers/credentials.d.ts +32 -0
  87. package/dist/auth/providers/credentials.js +223 -0
  88. package/dist/auth/providers/index.d.ts +5 -0
  89. package/dist/auth/providers/index.js +21 -0
  90. package/dist/auth/providers/oauth.d.ts +26 -0
  91. package/dist/auth/providers/oauth.js +105 -0
  92. package/dist/auth/route-config.d.ts +66 -0
  93. package/dist/auth/route-config.js +190 -0
  94. package/dist/auth/types/auth-types.d.ts +417 -0
  95. package/dist/auth/types/auth-types.js +53 -0
  96. package/dist/auth/types/index.d.ts +6 -0
  97. package/dist/auth/types/index.js +22 -0
  98. package/dist/auth/unauthenticated-routes.d.ts +1 -0
  99. package/dist/auth/unauthenticated-routes.js +19 -0
  100. package/dist/auth/utils/idp-client.d.ts +94 -0
  101. package/dist/auth/utils/idp-client.js +383 -0
  102. package/dist/auth/utils/index.d.ts +5 -0
  103. package/dist/auth/utils/index.js +21 -0
  104. package/dist/auth/utils/token-utils.d.ts +84 -0
  105. package/dist/auth/utils/token-utils.js +219 -0
  106. package/dist/client/AuthContext.d.ts +19 -0
  107. package/dist/client/AuthContext.js +112 -0
  108. package/dist/client/fetch-with-auth.d.ts +11 -0
  109. package/dist/client/fetch-with-auth.js +44 -0
  110. package/dist/client/fetchWithSession.d.ts +3 -0
  111. package/dist/client/fetchWithSession.js +24 -0
  112. package/dist/client/index.d.ts +9 -0
  113. package/dist/client/index.js +20 -0
  114. package/dist/client/useAnonSession.d.ts +36 -0
  115. package/dist/client/useAnonSession.js +99 -0
  116. package/dist/components/SessionSync.d.ts +13 -0
  117. package/dist/components/SessionSync.js +119 -0
  118. package/dist/components/SignalRHealthCheck.d.ts +10 -0
  119. package/dist/components/SignalRHealthCheck.js +97 -0
  120. package/dist/components/account/UserAvatarMenu.d.ts +20 -0
  121. package/dist/components/account/UserAvatarMenu.js +80 -0
  122. package/dist/components/account/index.d.ts +7 -0
  123. package/dist/components/account/index.js +10 -0
  124. package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
  125. package/dist/components/admin/AlertSettingsTab.js +351 -0
  126. package/dist/components/admin/AnalyticsTab.d.ts +22 -0
  127. package/dist/components/admin/AnalyticsTab.js +167 -0
  128. package/dist/components/admin/DataBrowserTab.d.ts +19 -0
  129. package/dist/components/admin/DataBrowserTab.js +252 -0
  130. package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
  131. package/dist/components/admin/LoggingSettingsTab.js +339 -0
  132. package/dist/components/admin/SessionsTab.d.ts +37 -0
  133. package/dist/components/admin/SessionsTab.js +165 -0
  134. package/dist/components/admin/StatsTab.d.ts +53 -0
  135. package/dist/components/admin/StatsTab.js +161 -0
  136. package/dist/components/admin/VibeAdminContext.d.ts +32 -0
  137. package/dist/components/admin/VibeAdminContext.js +38 -0
  138. package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
  139. package/dist/components/admin/VibeAdminLayout.js +69 -0
  140. package/dist/components/admin/index.d.ts +29 -0
  141. package/dist/components/admin/index.js +44 -0
  142. package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
  143. package/dist/components/auth/FederatedAuthSection.js +45 -0
  144. package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
  145. package/dist/components/auth/ModeAwareLoginPage.js +42 -0
  146. package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
  147. package/dist/components/auth/ModeAwareSignupPage.js +78 -0
  148. package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
  149. package/dist/components/auth/TraditionalAuthSection.js +20 -0
  150. package/dist/components/recovery/CompleteStep.d.ts +5 -0
  151. package/dist/components/recovery/CompleteStep.js +8 -0
  152. package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
  153. package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
  154. package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
  155. package/dist/components/recovery/SelectMethodStep.js +8 -0
  156. package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
  157. package/dist/components/recovery/SetPasswordStep.js +20 -0
  158. package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
  159. package/dist/components/recovery/VerifyCodeStep.js +24 -0
  160. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
  161. package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
  162. package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
  163. package/dist/components/reserved/ReservedStatusBox.js +71 -0
  164. package/dist/components/ui/BetaBadge.d.ts +29 -0
  165. package/dist/components/ui/BetaBadge.js +38 -0
  166. package/dist/components/ui/Footer.d.ts +37 -0
  167. package/dist/components/ui/Footer.js +41 -0
  168. package/dist/config/env.d.ts +66 -0
  169. package/dist/config/env.js +57 -0
  170. package/dist/config/logger.d.ts +57 -0
  171. package/dist/config/logger.js +73 -0
  172. package/dist/config/logging-config.d.ts +30 -0
  173. package/dist/config/logging-config.js +122 -0
  174. package/dist/config/unauthenticated-routes.d.ts +17 -0
  175. package/dist/config/unauthenticated-routes.js +24 -0
  176. package/dist/config/vibe-log-transport.d.ts +79 -0
  177. package/dist/config/vibe-log-transport.js +203 -0
  178. package/dist/edge/internal-api-url.d.ts +53 -0
  179. package/dist/edge/internal-api-url.js +63 -0
  180. package/dist/edge/middleware.d.ts +14 -0
  181. package/dist/edge/middleware.js +32 -0
  182. package/dist/hooks/useAuth.d.ts +23 -0
  183. package/dist/hooks/useAuth.js +81 -0
  184. package/dist/hooks/useAuthSettings.d.ts +59 -0
  185. package/dist/hooks/useAuthSettings.js +93 -0
  186. package/dist/hooks/useAvailableProviders.d.ts +45 -0
  187. package/dist/hooks/useAvailableProviders.js +108 -0
  188. package/dist/hooks/usePasswordValidation.d.ts +27 -0
  189. package/dist/hooks/usePasswordValidation.js +102 -0
  190. package/dist/hooks/useProfile.d.ts +15 -0
  191. package/dist/hooks/useProfile.js +59 -0
  192. package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
  193. package/dist/hooks/usePublicAuthSettings.js +131 -0
  194. package/dist/hooks/useSessionExpiration.d.ts +57 -0
  195. package/dist/hooks/useSessionExpiration.js +72 -0
  196. package/dist/hooks/useViabilitySession.d.ts +75 -0
  197. package/dist/hooks/useViabilitySession.js +268 -0
  198. package/dist/index.d.ts +12 -0
  199. package/dist/index.js +54 -0
  200. package/dist/lib/anon-session.d.ts +74 -0
  201. package/dist/lib/anon-session.js +169 -0
  202. package/dist/lib/api-handler.d.ts +123 -0
  203. package/dist/lib/api-handler.js +478 -0
  204. package/dist/lib/app-slug.d.ts +95 -0
  205. package/dist/lib/app-slug.js +172 -0
  206. package/dist/lib/demo-mode.d.ts +6 -0
  207. package/dist/lib/demo-mode.js +16 -0
  208. package/dist/lib/geolocation.d.ts +64 -0
  209. package/dist/lib/geolocation.js +235 -0
  210. package/dist/lib/idp-client-config.d.ts +75 -0
  211. package/dist/lib/idp-client-config.js +351 -0
  212. package/dist/lib/idp-fetch.d.ts +14 -0
  213. package/dist/lib/idp-fetch.js +91 -0
  214. package/dist/lib/internal-api.d.ts +87 -0
  215. package/dist/lib/internal-api.js +122 -0
  216. package/dist/lib/jwt-decode-client.d.ts +10 -0
  217. package/dist/lib/jwt-decode-client.js +46 -0
  218. package/dist/lib/jwt-decode.d.ts +48 -0
  219. package/dist/lib/jwt-decode.js +57 -0
  220. package/dist/lib/nextauth-secret.d.ts +10 -0
  221. package/dist/lib/nextauth-secret.js +104 -0
  222. package/dist/lib/rate-limit-service.d.ts +23 -0
  223. package/dist/lib/rate-limit-service.js +6 -0
  224. package/dist/lib/redis.d.ts +5 -0
  225. package/dist/lib/redis.js +28 -0
  226. package/dist/lib/refresh-token-validator.d.ts +13 -0
  227. package/dist/lib/refresh-token-validator.js +117 -0
  228. package/dist/lib/roles.d.ts +145 -0
  229. package/dist/lib/roles.js +168 -0
  230. package/dist/lib/secret-validation.d.ts +4 -0
  231. package/dist/lib/secret-validation.js +14 -0
  232. package/dist/lib/session-store.d.ts +166 -0
  233. package/dist/lib/session-store.js +537 -0
  234. package/dist/lib/session.d.ts +21 -0
  235. package/dist/lib/session.js +26 -0
  236. package/dist/lib/site-logger.d.ts +214 -0
  237. package/dist/lib/site-logger.js +210 -0
  238. package/dist/lib/standardized-client-api.d.ts +161 -0
  239. package/dist/lib/standardized-client-api.js +786 -0
  240. package/dist/lib/startup-init.d.ts +40 -0
  241. package/dist/lib/startup-init.js +261 -0
  242. package/dist/lib/test-aware-get-token.d.ts +2 -0
  243. package/dist/lib/test-aware-get-token.js +81 -0
  244. package/dist/lib/token-expiry.d.ts +14 -0
  245. package/dist/lib/token-expiry.js +39 -0
  246. package/dist/lib/token-lifecycle.d.ts +52 -0
  247. package/dist/lib/token-lifecycle.js +398 -0
  248. package/dist/lib/types/api-responses.d.ts +128 -0
  249. package/dist/lib/types/api-responses.js +171 -0
  250. package/dist/lib/user-agent-parser.d.ts +50 -0
  251. package/dist/lib/user-agent-parser.js +220 -0
  252. package/dist/logging/api/admin-analytics.d.ts +3 -0
  253. package/dist/logging/api/admin-analytics.js +45 -0
  254. package/dist/logging/api/audit-log.d.ts +3 -0
  255. package/dist/logging/api/audit-log.js +52 -0
  256. package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
  257. package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
  258. package/dist/logging/components/AuditLogViewer.d.ts +7 -0
  259. package/dist/logging/components/AuditLogViewer.js +51 -0
  260. package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
  261. package/dist/logging/components/ErrorMetricsCard.js +16 -0
  262. package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
  263. package/dist/logging/components/HealthMetricsCard.js +19 -0
  264. package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
  265. package/dist/logging/hooks/useAdminAnalytics.js +22 -0
  266. package/dist/logging/hooks/useAuditLog.d.ts +6 -0
  267. package/dist/logging/hooks/useAuditLog.js +25 -0
  268. package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
  269. package/dist/logging/hooks/useErrorMetrics.js +38 -0
  270. package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
  271. package/dist/logging/hooks/useHealthMetrics.js +41 -0
  272. package/dist/logging/index.d.ts +11 -0
  273. package/dist/logging/index.js +40 -0
  274. package/dist/logging/types/analytics.d.ts +68 -0
  275. package/dist/logging/types/analytics.js +3 -0
  276. package/dist/logging/types/audit.d.ts +29 -0
  277. package/dist/logging/types/audit.js +2 -0
  278. package/dist/logging/types/index.d.ts +2 -0
  279. package/dist/logging/types/index.js +19 -0
  280. package/dist/middleware/auth-decision.d.ts +33 -0
  281. package/dist/middleware/auth-decision.js +65 -0
  282. package/dist/middleware/create-middleware.d.ts +100 -0
  283. package/dist/middleware/create-middleware.js +445 -0
  284. package/dist/middleware/rbac-check.d.ts +44 -0
  285. package/dist/middleware/rbac-check.js +191 -0
  286. package/dist/middleware/twofa-presets.d.ts +134 -0
  287. package/dist/middleware/twofa-presets.js +175 -0
  288. package/dist/models/DecodedAccessToken.d.ts +17 -0
  289. package/dist/models/DecodedAccessToken.js +2 -0
  290. package/dist/models/SessionModel.d.ts +122 -0
  291. package/dist/models/SessionModel.js +136 -0
  292. package/dist/pages/admin-login/page.d.ts +31 -0
  293. package/dist/pages/admin-login/page.js +83 -0
  294. package/dist/pages/admin-roles/RolesAdminPage.d.ts +15 -0
  295. package/dist/pages/admin-roles/RolesAdminPage.js +78 -0
  296. package/dist/pages/admin-roles/index.d.ts +8 -0
  297. package/dist/pages/admin-roles/index.js +15 -0
  298. package/dist/pages/admin-roles/modals.d.ts +72 -0
  299. package/dist/pages/admin-roles/modals.js +154 -0
  300. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
  301. package/dist/pages/client-admin/ClientSiteAdminPage.js +177 -0
  302. package/dist/pages/client-admin/index.d.ts +32 -0
  303. package/dist/pages/client-admin/index.js +37 -0
  304. package/dist/pages/login/page.d.ts +22 -0
  305. package/dist/pages/login/page.js +239 -0
  306. package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
  307. package/dist/pages/profile/EnhancedProfilePage.js +150 -0
  308. package/dist/pages/profile/index.d.ts +8 -0
  309. package/dist/pages/profile/index.js +16 -0
  310. package/dist/pages/profile/page.d.ts +19 -0
  311. package/dist/pages/profile/page.js +47 -0
  312. package/dist/pages/profile/profile-patch.d.ts +1 -0
  313. package/dist/pages/profile/profile-patch.js +281 -0
  314. package/dist/pages/recovery/page.d.ts +1 -0
  315. package/dist/pages/recovery/page.js +142 -0
  316. package/dist/pages/roles/MyRolesPage.d.ts +24 -0
  317. package/dist/pages/roles/MyRolesPage.js +71 -0
  318. package/dist/pages/roles/components.d.ts +63 -0
  319. package/dist/pages/roles/components.js +108 -0
  320. package/dist/pages/roles/index.d.ts +8 -0
  321. package/dist/pages/roles/index.js +19 -0
  322. package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
  323. package/dist/pages/security/EnhancedSecurityPage.js +248 -0
  324. package/dist/pages/security/index.d.ts +8 -0
  325. package/dist/pages/security/index.js +16 -0
  326. package/dist/pages/security/page.d.ts +21 -0
  327. package/dist/pages/security/page.js +212 -0
  328. package/dist/pages/security/security-patch.d.ts +1 -0
  329. package/dist/pages/security/security-patch.js +302 -0
  330. package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
  331. package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
  332. package/dist/pages/settings/index.d.ts +8 -0
  333. package/dist/pages/settings/index.js +16 -0
  334. package/dist/pages/settings/page.d.ts +7 -0
  335. package/dist/pages/settings/page.js +26 -0
  336. package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
  337. package/dist/pages/showcase/ShowcasePage.js +140 -0
  338. package/dist/pages/showcase/index.d.ts +12 -0
  339. package/dist/pages/showcase/index.js +17 -0
  340. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
  341. package/dist/pages/test-env/EmergencyLogoutPage.js +98 -0
  342. package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
  343. package/dist/pages/test-env/JwtInspectPage.js +114 -0
  344. package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
  345. package/dist/pages/test-env/RefreshTokenPage.js +91 -0
  346. package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
  347. package/dist/pages/test-env/TestEnvPage.js +49 -0
  348. package/dist/pages/test-env/index.d.ts +24 -0
  349. package/dist/pages/test-env/index.js +32 -0
  350. package/dist/pages/verify-code/page.d.ts +30 -0
  351. package/dist/pages/verify-code/page.js +408 -0
  352. package/dist/routes/account/index.d.ts +28 -0
  353. package/dist/routes/account/index.js +71 -0
  354. package/dist/routes/account/masked-info.d.ts +33 -0
  355. package/dist/routes/account/masked-info.js +39 -0
  356. package/dist/routes/account/send-code.d.ts +37 -0
  357. package/dist/routes/account/send-code.js +42 -0
  358. package/dist/routes/account/update-phone.d.ts +13 -0
  359. package/dist/routes/account/update-phone.js +17 -0
  360. package/dist/routes/account/verify-email.d.ts +38 -0
  361. package/dist/routes/account/verify-email.js +43 -0
  362. package/dist/routes/account/verify-sms.d.ts +38 -0
  363. package/dist/routes/account/verify-sms.js +43 -0
  364. package/dist/routes/auth/index.d.ts +19 -0
  365. package/dist/routes/auth/index.js +64 -0
  366. package/dist/routes/auth/logout.d.ts +31 -0
  367. package/dist/routes/auth/logout.js +113 -0
  368. package/dist/routes/auth/nextauth.d.ts +19 -0
  369. package/dist/routes/auth/nextauth.js +72 -0
  370. package/dist/routes/auth/refresh.d.ts +30 -0
  371. package/dist/routes/auth/refresh.js +51 -0
  372. package/dist/routes/auth/session.d.ts +72 -0
  373. package/dist/routes/auth/session.js +180 -0
  374. package/dist/routes/auth/settings.d.ts +25 -0
  375. package/dist/routes/auth/settings.js +55 -0
  376. package/dist/routes/auth/viability.d.ts +52 -0
  377. package/dist/routes/auth/viability.js +201 -0
  378. package/dist/routes/index.d.ts +12 -0
  379. package/dist/routes/index.js +54 -0
  380. package/dist/routes/session/index.d.ts +6 -0
  381. package/dist/routes/session/index.js +10 -0
  382. package/dist/routes/session/refresh-viability.d.ts +16 -0
  383. package/dist/routes/session/refresh-viability.js +20 -0
  384. package/dist/services/signalrActivityService.d.ts +44 -0
  385. package/dist/services/signalrActivityService.js +257 -0
  386. package/dist/stores/authStore.d.ts +154 -0
  387. package/dist/stores/authStore.js +1531 -0
  388. package/dist/theme/ThemeProvider.d.ts +14 -0
  389. package/dist/theme/ThemeProvider.js +28 -0
  390. package/dist/theme/default.d.ts +8 -0
  391. package/dist/theme/default.js +33 -0
  392. package/dist/theme/index.d.ts +15 -0
  393. package/dist/theme/index.js +25 -0
  394. package/dist/theme/types.d.ts +56 -0
  395. package/dist/theme/types.js +8 -0
  396. package/dist/theme/useTheme.d.ts +60 -0
  397. package/dist/theme/useTheme.js +63 -0
  398. package/dist/theme/utils.d.ts +13 -0
  399. package/dist/theme/utils.js +39 -0
  400. package/dist/types/api.d.ts +134 -0
  401. package/dist/types/api.js +44 -0
  402. package/dist/types/auth.d.ts +19 -0
  403. package/dist/types/auth.js +2 -0
  404. package/dist/types/logging.d.ts +42 -0
  405. package/dist/types/logging.js +2 -0
  406. package/dist/types/recovery.d.ts +48 -0
  407. package/dist/types/recovery.js +2 -0
  408. package/dist/types/security.d.ts +1 -0
  409. package/dist/types/security.js +2 -0
  410. package/dist/utils/api.d.ts +85 -0
  411. package/dist/utils/api.js +287 -0
  412. package/dist/utils/circuitBreaker.d.ts +43 -0
  413. package/dist/utils/circuitBreaker.js +91 -0
  414. package/dist/utils/error-message.d.ts +1 -0
  415. package/dist/utils/error-message.js +103 -0
  416. package/dist/utils/layout/reservedSpace.d.ts +59 -0
  417. package/dist/utils/layout/reservedSpace.js +102 -0
  418. package/dist/utils/logout.d.ts +14 -0
  419. package/dist/utils/logout.js +32 -0
  420. package/dist/vibe/client.d.ts +261 -0
  421. package/dist/vibe/client.js +445 -0
  422. package/dist/vibe/errors.d.ts +83 -0
  423. package/dist/vibe/errors.js +146 -0
  424. package/dist/vibe/generic.d.ts +234 -0
  425. package/dist/vibe/generic.js +369 -0
  426. package/dist/vibe/hooks/index.d.ts +169 -0
  427. package/dist/vibe/hooks/index.js +252 -0
  428. package/dist/vibe/index.d.ts +23 -0
  429. package/dist/vibe/index.js +67 -0
  430. package/dist/vibe/sessions.d.ts +161 -0
  431. package/dist/vibe/sessions.js +391 -0
  432. package/dist/vibe/types.d.ts +353 -0
  433. package/dist/vibe/types.js +315 -0
  434. package/package.json +855 -0
  435. package/scripts/check-internal-url-usage.sh +73 -0
  436. package/scripts/dev-broker.ps1 +35 -0
  437. package/scripts/dev-local.ps1 +45 -0
  438. package/src/api/auth-handler.ts +550 -0
  439. package/src/api/index.ts +18 -0
  440. package/src/api-handlers/account/change-password.ts +145 -0
  441. package/src/api-handlers/account/masked-info.ts +45 -0
  442. package/src/api-handlers/account/profile.ts +80 -0
  443. package/src/api-handlers/account/recovery/initiate.ts +23 -0
  444. package/src/api-handlers/account/recovery/send-code.ts +25 -0
  445. package/src/api-handlers/account/recovery/verify-code.ts +25 -0
  446. package/src/api-handlers/account/reset-password.ts +23 -0
  447. package/src/api-handlers/account/send-code.ts +76 -0
  448. package/src/api-handlers/account/update-phone.ts +79 -0
  449. package/src/api-handlers/account/validate-password.ts +118 -0
  450. package/src/api-handlers/account/verify-email.ts +125 -0
  451. package/src/api-handlers/account/verify-sms.ts +125 -0
  452. package/src/api-handlers/admin/analytics.ts +445 -0
  453. package/src/api-handlers/admin/audit.ts +225 -0
  454. package/src/api-handlers/admin/index.ts +59 -0
  455. package/src/api-handlers/admin/redis-sessions.ts +253 -0
  456. package/src/api-handlers/admin/sessions.ts +320 -0
  457. package/src/api-handlers/admin/site-logs.ts +367 -0
  458. package/src/api-handlers/admin/users.ts +244 -0
  459. package/src/api-handlers/admin/vibe-data.ts +326 -0
  460. package/src/api-handlers/anon/preferences.ts +123 -0
  461. package/src/api-handlers/auth/jwks.ts +20 -0
  462. package/src/api-handlers/auth/login.ts +240 -0
  463. package/src/api-handlers/auth/refresh.ts +687 -0
  464. package/src/api-handlers/auth/signout.ts +212 -0
  465. package/src/api-handlers/auth/status.ts +23 -0
  466. package/src/api-handlers/auth/update-session.ts +125 -0
  467. package/src/api-handlers/auth/validate.ts +44 -0
  468. package/src/api-handlers/auth/verify-code.ts +129 -0
  469. package/src/api-handlers/session/refresh-viability.ts +36 -0
  470. package/src/api-handlers/session/viability.ts +166 -0
  471. package/src/api-handlers/test/force-expire.ts +67 -0
  472. package/src/auth/auth-decision.ts +230 -0
  473. package/src/auth/auth-options.ts +237 -0
  474. package/src/auth/callbacks/index.ts +7 -0
  475. package/src/auth/callbacks/jwt.ts +382 -0
  476. package/src/auth/callbacks/session.ts +243 -0
  477. package/src/auth/callbacks/signin.ts +56 -0
  478. package/src/auth/events/index.ts +5 -0
  479. package/src/auth/events/signout.ts +33 -0
  480. package/src/auth/providers/credentials.ts +256 -0
  481. package/src/auth/providers/index.ts +6 -0
  482. package/src/auth/providers/oauth.ts +114 -0
  483. package/src/auth/route-config.ts +220 -0
  484. package/src/auth/types/auth-types.ts +555 -0
  485. package/src/auth/types/index.ts +7 -0
  486. package/src/auth/unauthenticated-routes.ts +3 -0
  487. package/src/auth/utils/idp-client.ts +444 -0
  488. package/src/auth/utils/index.ts +6 -0
  489. package/src/auth/utils/token-utils.ts +244 -0
  490. package/src/client/AuthContext.tsx +140 -0
  491. package/src/client/fetch-with-auth.ts +48 -0
  492. package/src/client/fetchWithSession.ts +21 -0
  493. package/src/client/index.ts +13 -0
  494. package/src/client/useAnonSession.ts +131 -0
  495. package/src/components/SessionSync.tsx +137 -0
  496. package/src/components/SignalRHealthCheck.tsx +131 -0
  497. package/src/components/account/UserAvatarMenu.tsx +217 -0
  498. package/src/components/account/index.ts +8 -0
  499. package/src/components/admin/AlertSettingsTab.tsx +728 -0
  500. package/src/components/admin/AnalyticsTab.tsx +703 -0
  501. package/src/components/admin/DataBrowserTab.tsx +505 -0
  502. package/src/components/admin/LoggingSettingsTab.tsx +665 -0
  503. package/src/components/admin/SessionsTab.tsx +414 -0
  504. package/src/components/admin/StatsTab.tsx +379 -0
  505. package/src/components/admin/VibeAdminContext.tsx +87 -0
  506. package/src/components/admin/VibeAdminLayout.tsx +185 -0
  507. package/src/components/admin/index.ts +59 -0
  508. package/src/components/auth/FederatedAuthSection.tsx +95 -0
  509. package/src/components/auth/ModeAwareLoginPage.tsx +135 -0
  510. package/src/components/auth/ModeAwareSignupPage.tsx +267 -0
  511. package/src/components/auth/TraditionalAuthSection.tsx +99 -0
  512. package/src/components/recovery/CompleteStep.tsx +36 -0
  513. package/src/components/recovery/InitiateRecoveryStep.tsx +68 -0
  514. package/src/components/recovery/SelectMethodStep.tsx +73 -0
  515. package/src/components/recovery/SetPasswordStep.tsx +97 -0
  516. package/src/components/recovery/VerifyCodeStep.tsx +90 -0
  517. package/src/components/reserved/ReservedRecoveryWarning.tsx +160 -0
  518. package/src/components/reserved/ReservedStatusBox.tsx +118 -0
  519. package/src/components/ui/BetaBadge.tsx +58 -0
  520. package/src/components/ui/Footer.tsx +93 -0
  521. package/src/config/env.ts +57 -0
  522. package/src/config/logger.ts +62 -0
  523. package/src/config/logging-config.ts +82 -0
  524. package/src/config/unauthenticated-routes.ts +19 -0
  525. package/src/config/vibe-log-transport.ts +250 -0
  526. package/src/edge/internal-api-url.ts +65 -0
  527. package/src/edge/middleware.ts +42 -0
  528. package/src/hooks/useAuth.ts +115 -0
  529. package/src/hooks/useAuthSettings.ts +97 -0
  530. package/src/hooks/useAvailableProviders.ts +118 -0
  531. package/src/hooks/usePasswordValidation.ts +127 -0
  532. package/src/hooks/useProfile.ts +75 -0
  533. package/src/hooks/usePublicAuthSettings.ts +149 -0
  534. package/src/hooks/useSessionExpiration.ts +102 -0
  535. package/src/hooks/useViabilitySession.ts +335 -0
  536. package/src/index.ts +63 -0
  537. package/src/lib/anon-session.ts +213 -0
  538. package/src/lib/api-handler.ts +625 -0
  539. package/src/lib/app-slug.ts +178 -0
  540. package/src/lib/demo-mode.ts +13 -0
  541. package/src/lib/geolocation.ts +265 -0
  542. package/src/lib/idp-client-config.ts +442 -0
  543. package/src/lib/idp-fetch.ts +101 -0
  544. package/src/lib/internal-api.ts +171 -0
  545. package/src/lib/jwt-decode-client.ts +45 -0
  546. package/src/lib/jwt-decode.ts +83 -0
  547. package/src/lib/nextauth-secret.ts +126 -0
  548. package/src/lib/rate-limit-service.ts +9 -0
  549. package/src/lib/redis.ts +27 -0
  550. package/src/lib/refresh-token-validator.ts +64 -0
  551. package/src/lib/roles.ts +177 -0
  552. package/src/lib/secret-validation.ts +8 -0
  553. package/src/lib/session-store.ts +637 -0
  554. package/src/lib/session.ts +34 -0
  555. package/src/lib/site-logger.ts +245 -0
  556. package/src/lib/standardized-client-api.ts +896 -0
  557. package/src/lib/startup-init.ts +247 -0
  558. package/src/lib/test-aware-get-token.ts +30 -0
  559. package/src/lib/token-expiry.ts +40 -0
  560. package/src/lib/token-lifecycle.ts +477 -0
  561. package/src/lib/types/api-responses.ts +336 -0
  562. package/src/lib/user-agent-parser.ts +252 -0
  563. package/src/logging/api/admin-analytics.ts +51 -0
  564. package/src/logging/api/audit-log.ts +53 -0
  565. package/src/logging/components/AdminAnalyticsLayout.tsx +49 -0
  566. package/src/logging/components/AuditLogViewer.tsx +125 -0
  567. package/src/logging/components/ErrorMetricsCard.tsx +98 -0
  568. package/src/logging/components/HealthMetricsCard.tsx +70 -0
  569. package/src/logging/hooks/useAdminAnalytics.ts +22 -0
  570. package/src/logging/hooks/useAuditLog.ts +24 -0
  571. package/src/logging/hooks/useErrorMetrics.ts +40 -0
  572. package/src/logging/hooks/useHealthMetrics.ts +44 -0
  573. package/src/logging/index.ts +18 -0
  574. package/src/logging/types/analytics.ts +81 -0
  575. package/src/logging/types/audit.ts +31 -0
  576. package/src/logging/types/index.ts +3 -0
  577. package/src/middleware/auth-decision.ts +43 -0
  578. package/src/middleware/create-middleware.ts +626 -0
  579. package/src/middleware/rbac-check.ts +244 -0
  580. package/src/middleware/twofa-presets.ts +224 -0
  581. package/src/models/DecodedAccessToken.ts +17 -0
  582. package/src/models/SessionModel.ts +258 -0
  583. package/src/pages/admin-login/page.tsx +229 -0
  584. package/src/pages/admin-roles/RolesAdminPage.tsx +357 -0
  585. package/src/pages/admin-roles/index.ts +9 -0
  586. package/src/pages/admin-roles/modals.tsx +469 -0
  587. package/src/pages/client-admin/ClientSiteAdminPage.tsx +380 -0
  588. package/src/pages/client-admin/index.ts +33 -0
  589. package/src/pages/login/page.tsx +463 -0
  590. package/src/pages/profile/EnhancedProfilePage.tsx +479 -0
  591. package/src/pages/profile/index.ts +9 -0
  592. package/src/pages/profile/page.tsx +166 -0
  593. package/src/pages/recovery/page.tsx +234 -0
  594. package/src/pages/roles/MyRolesPage.tsx +211 -0
  595. package/src/pages/roles/components.tsx +294 -0
  596. package/src/pages/roles/index.ts +17 -0
  597. package/src/pages/security/EnhancedSecurityPage.tsx +574 -0
  598. package/src/pages/security/index.ts +9 -0
  599. package/src/pages/security/page.tsx +507 -0
  600. package/src/pages/settings/EnhancedSettingsPage.tsx +642 -0
  601. package/src/pages/settings/index.ts +9 -0
  602. package/src/pages/settings/page.tsx +47 -0
  603. package/src/pages/showcase/ShowcasePage.tsx +530 -0
  604. package/src/pages/showcase/index.ts +13 -0
  605. package/src/pages/test-env/EmergencyLogoutPage.tsx +179 -0
  606. package/src/pages/test-env/JwtInspectPage.tsx +418 -0
  607. package/src/pages/test-env/RefreshTokenPage.tsx +155 -0
  608. package/src/pages/test-env/TestEnvPage.tsx +116 -0
  609. package/src/pages/test-env/index.ts +25 -0
  610. package/src/pages/verify-code/page.tsx +648 -0
  611. package/src/routes/account/index.ts +32 -0
  612. package/src/routes/account/masked-info.ts +37 -0
  613. package/src/routes/account/send-code.ts +40 -0
  614. package/src/routes/account/update-phone.ts +13 -0
  615. package/src/routes/account/verify-email.ts +41 -0
  616. package/src/routes/account/verify-sms.ts +41 -0
  617. package/src/routes/auth/index.ts +23 -0
  618. package/src/routes/auth/logout.ts +127 -0
  619. package/src/routes/auth/nextauth.ts +71 -0
  620. package/src/routes/auth/refresh.ts +54 -0
  621. package/src/routes/auth/session.ts +193 -0
  622. package/src/routes/auth/settings.ts +75 -0
  623. package/src/routes/auth/viability.ts +220 -0
  624. package/src/routes/index.ts +18 -0
  625. package/src/routes/session/index.ts +7 -0
  626. package/src/routes/session/refresh-viability.ts +17 -0
  627. package/src/services/signalrActivityService.ts +258 -0
  628. package/src/stores/authStore.ts +1904 -0
  629. package/src/templates/instrumentation.ts +41 -0
  630. package/src/theme/ThemeProvider.tsx +39 -0
  631. package/src/theme/default.ts +33 -0
  632. package/src/theme/index.ts +31 -0
  633. package/src/theme/types.ts +69 -0
  634. package/src/theme/useTheme.ts +57 -0
  635. package/src/theme/utils.ts +40 -0
  636. package/src/types/api.ts +13 -0
  637. package/src/types/auth.d.ts +15 -0
  638. package/src/types/auth.ts +22 -0
  639. package/src/types/logging.ts +11 -0
  640. package/src/types/next-auth.d.ts +15 -0
  641. package/src/types/recovery.ts +54 -0
  642. package/src/types/security.ts +1 -0
  643. package/src/utils/api.ts +353 -0
  644. package/src/utils/circuitBreaker.ts +40 -0
  645. package/src/utils/error-message.ts +108 -0
  646. package/src/utils/layout/reservedSpace.ts +124 -0
  647. package/src/utils/logout.ts +30 -0
  648. package/src/vibe/client.ts +590 -0
  649. package/src/vibe/errors.ts +185 -0
  650. package/src/vibe/generic.ts +429 -0
  651. package/src/vibe/hooks/index.ts +367 -0
  652. package/src/vibe/index.ts +121 -0
  653. package/src/vibe/sessions.ts +551 -0
  654. package/src/vibe/types.ts +577 -0
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ // ========================================================================================
3
+ // BULLETPROOF API RESPONSE TYPES - ENFORCES STANDARDIZED FORMAT
4
+ // ========================================================================================
5
+ // These types ENFORCE the standardized response format from our Identity API
6
+ // If the API doesn't return this exact structure, TypeScript will break the build
7
+ // NO MORE data.data.data.data NONSENSE - EVER!
8
+ // ========================================================================================
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.isSuccessResponse = isSuccessResponse;
11
+ exports.isPagedResponse = isPagedResponse;
12
+ exports.isErrorResponse = isErrorResponse;
13
+ exports.isValidationErrorResponse = isValidationErrorResponse;
14
+ exports.validateStandardizedResponse = validateStandardizedResponse;
15
+ // ========================================================================================
16
+ // TYPE GUARDS FOR RUNTIME VALIDATION
17
+ // ========================================================================================
18
+ /**
19
+ * Type guard to check if response is a success response
20
+ * THROWS if response doesn't match standardized format
21
+ */
22
+ function isSuccessResponse(response) {
23
+ if (!response || typeof response !== 'object') {
24
+ throw new Error('INVALID_API_RESPONSE: Response is not an object');
25
+ }
26
+ const r = response;
27
+ if (r.success !== true) {
28
+ return false; // This is an error response, not invalid format
29
+ }
30
+ // SUCCESS RESPONSE VALIDATION - BE STRICT!
31
+ if (!('data' in r)) {
32
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "data" field');
33
+ }
34
+ if (!('message' in r) || typeof r.message !== 'string') {
35
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "message" field');
36
+ }
37
+ if (!('operation_code' in r) || typeof r.operation_code !== 'string') {
38
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "operation_code" field');
39
+ }
40
+ return true;
41
+ }
42
+ /**
43
+ * Type guard to check if response is a paged success response
44
+ * THROWS if response doesn't match standardized format
45
+ */
46
+ function isPagedResponse(response) {
47
+ if (!isSuccessResponse(response)) {
48
+ return false;
49
+ }
50
+ const r = response;
51
+ // Check if it has pagination metadata
52
+ if (!('pagination' in r) || typeof r.pagination !== 'object') {
53
+ return false;
54
+ }
55
+ const pagination = r.pagination;
56
+ const requiredPaginationFields = [
57
+ 'current_page', 'total_pages', 'page_size', 'total_items',
58
+ 'has_next_page', 'has_previous_page'
59
+ ];
60
+ for (const field of requiredPaginationFields) {
61
+ if (!(field in pagination)) {
62
+ throw new Error(`INVALID_API_RESPONSE: Paged response missing required pagination.${field}`);
63
+ }
64
+ }
65
+ // Ensure data is an array for paged responses
66
+ if (!Array.isArray(r.data)) {
67
+ throw new Error('INVALID_API_RESPONSE: Paged response data must be an array');
68
+ }
69
+ return true;
70
+ }
71
+ /**
72
+ * Type guard to check if response is an error response
73
+ * THROWS if response doesn't match standardized format
74
+ */
75
+ function isErrorResponse(response) {
76
+ if (!response || typeof response !== 'object') {
77
+ throw new Error('INVALID_API_RESPONSE: Response is not an object');
78
+ }
79
+ const r = response;
80
+ if (r.success !== false) {
81
+ return false; // This is a success response, not invalid format
82
+ }
83
+ // ERROR RESPONSE VALIDATION - BE STRICT!
84
+ if (!('error_code' in r) || typeof r.error_code !== 'string') {
85
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "error_code" field');
86
+ }
87
+ if (!('message' in r) || typeof r.message !== 'string') {
88
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "message" field');
89
+ }
90
+ if (!('operation' in r) || typeof r.operation !== 'string') {
91
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "operation" field');
92
+ }
93
+ return true;
94
+ }
95
+ /**
96
+ * Type guard to check if response is a validation error
97
+ * THROWS if response doesn't match standardized format
98
+ */
99
+ function isValidationErrorResponse(response) {
100
+ if (!isErrorResponse(response)) {
101
+ return false;
102
+ }
103
+ const r = response;
104
+ if (r.error_code !== 'VALIDATION_ERROR') {
105
+ return false;
106
+ }
107
+ // VALIDATION ERROR RESPONSE VALIDATION - BE STRICT!
108
+ if (!('payload' in r) || typeof r.payload !== 'object') {
109
+ throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload" field');
110
+ }
111
+ if (!('validation_errors' in r.payload) || typeof r.payload.validation_errors !== 'object') {
112
+ throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload.validation_errors" field');
113
+ }
114
+ return true;
115
+ }
116
+ // ========================================================================================
117
+ // RESPONSE VALIDATOR - ENFORCES COMPLIANCE AT RUNTIME
118
+ // ========================================================================================
119
+ /**
120
+ * VALIDATES AND NORMALIZES API RESPONSES
121
+ * This function BREAKS THE BUILD if responses don't match our standard
122
+ * NO EXCEPTIONS - ZERO TOLERANCE FOR BAD RESPONSES
123
+ */
124
+ function validateStandardizedResponse(response, endpoint) {
125
+ const context = endpoint ? ` for endpoint: ${endpoint}` : '';
126
+ try {
127
+ // First, basic object validation
128
+ if (!response || typeof response !== 'object') {
129
+ throw new Error(`CRITICAL_API_ERROR: Invalid response object${context}`);
130
+ }
131
+ const r = response;
132
+ // Check for success field (REQUIRED)
133
+ if (!('success' in r) || typeof r.success !== 'boolean') {
134
+ throw new Error(`CRITICAL_API_ERROR: Response missing required boolean "success" field${context}`);
135
+ }
136
+ // Route to appropriate validator based on success status
137
+ if (r.success === true) {
138
+ // Check if it's a paged response
139
+ if ('pagination' in r) {
140
+ if (isPagedResponse(response)) {
141
+ return response;
142
+ }
143
+ }
144
+ else {
145
+ if (isSuccessResponse(response)) {
146
+ return response;
147
+ }
148
+ }
149
+ }
150
+ else if (r.success === false) {
151
+ // Check if it's a validation error
152
+ if (r.error_code === 'VALIDATION_ERROR') {
153
+ if (isValidationErrorResponse(response)) {
154
+ return response;
155
+ }
156
+ }
157
+ else {
158
+ if (isErrorResponse(response)) {
159
+ return response;
160
+ }
161
+ }
162
+ }
163
+ // If we reach here, the response format is invalid
164
+ throw new Error(`CRITICAL_API_ERROR: Response format validation failed${context}. Response: ${JSON.stringify(response, null, 2)}`);
165
+ }
166
+ catch (error) {
167
+ // Re-throw validation errors with context
168
+ const errorMessage = error instanceof Error ? error.message : 'Unknown validation error';
169
+ throw new Error(`${errorMessage}${context}`);
170
+ }
171
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * =============================================================================
3
+ * USER AGENT PARSER
4
+ * =============================================================================
5
+ *
6
+ * Lightweight user agent parsing without external dependencies.
7
+ * Extracts device type, browser, and OS information from user agent strings.
8
+ *
9
+ * USAGE:
10
+ * ------
11
+ * import { parseUserAgent, DeviceInfo } from '@payez/next-mvp/lib/user-agent-parser';
12
+ *
13
+ * const info = parseUserAgent(request.headers.get('user-agent'));
14
+ * console.log(info.browser); // 'Chrome'
15
+ * console.log(info.deviceType); // 'desktop'
16
+ *
17
+ * =============================================================================
18
+ */
19
+ export type DeviceType = 'desktop' | 'mobile' | 'tablet' | 'unknown';
20
+ export interface DeviceInfo {
21
+ deviceType: DeviceType;
22
+ browser: string;
23
+ browserVersion?: string;
24
+ os: string;
25
+ osVersion?: string;
26
+ isMobile: boolean;
27
+ isTablet: boolean;
28
+ isDesktop: boolean;
29
+ isBot: boolean;
30
+ raw: string;
31
+ }
32
+ /**
33
+ * Parse a user agent string to extract device, browser, and OS information.
34
+ *
35
+ * @param userAgent - The user agent string from request headers
36
+ * @returns Parsed device information
37
+ */
38
+ export declare function parseUserAgent(userAgent?: string | null): DeviceInfo;
39
+ /**
40
+ * Get a short, human-readable description of the device
41
+ */
42
+ export declare function getDeviceDescription(info: DeviceInfo): string;
43
+ /**
44
+ * Get device type icon (emoji)
45
+ */
46
+ export declare function getDeviceIcon(deviceType: DeviceType): string;
47
+ /**
48
+ * Get browser icon (emoji)
49
+ */
50
+ export declare function getBrowserIcon(browser: string): string;
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * =============================================================================
4
+ * USER AGENT PARSER
5
+ * =============================================================================
6
+ *
7
+ * Lightweight user agent parsing without external dependencies.
8
+ * Extracts device type, browser, and OS information from user agent strings.
9
+ *
10
+ * USAGE:
11
+ * ------
12
+ * import { parseUserAgent, DeviceInfo } from '@payez/next-mvp/lib/user-agent-parser';
13
+ *
14
+ * const info = parseUserAgent(request.headers.get('user-agent'));
15
+ * console.log(info.browser); // 'Chrome'
16
+ * console.log(info.deviceType); // 'desktop'
17
+ *
18
+ * =============================================================================
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.parseUserAgent = parseUserAgent;
22
+ exports.getDeviceDescription = getDeviceDescription;
23
+ exports.getDeviceIcon = getDeviceIcon;
24
+ exports.getBrowserIcon = getBrowserIcon;
25
+ // -----------------------------------------------------------------------------
26
+ // DETECTION PATTERNS
27
+ // -----------------------------------------------------------------------------
28
+ const MOBILE_KEYWORDS = [
29
+ 'Mobile',
30
+ 'Android',
31
+ 'iPhone',
32
+ 'iPod',
33
+ 'BlackBerry',
34
+ 'IEMobile',
35
+ 'Opera Mini',
36
+ 'Opera Mobi',
37
+ 'Windows Phone',
38
+ ];
39
+ const TABLET_KEYWORDS = [
40
+ 'iPad',
41
+ 'Tablet',
42
+ 'PlayBook',
43
+ 'Silk',
44
+ 'Kindle',
45
+ ];
46
+ const BOT_KEYWORDS = [
47
+ 'bot',
48
+ 'spider',
49
+ 'crawler',
50
+ 'slurp',
51
+ 'googlebot',
52
+ 'bingbot',
53
+ 'yandex',
54
+ 'baidu',
55
+ 'duckduckbot',
56
+ 'facebookexternalhit',
57
+ 'twitterbot',
58
+ 'linkedinbot',
59
+ 'pinterest',
60
+ 'semrush',
61
+ 'ahref',
62
+ ];
63
+ // Browser detection patterns (order matters - more specific first)
64
+ const BROWSER_PATTERNS = [
65
+ { name: 'Edge', pattern: /Edg(?:e|A|iOS)?\/(\d+(?:\.\d+)*)/ },
66
+ { name: 'Opera', pattern: /(?:OPR|Opera)\/(\d+(?:\.\d+)*)/ },
67
+ { name: 'Samsung Browser', pattern: /SamsungBrowser\/(\d+(?:\.\d+)*)/ },
68
+ { name: 'UC Browser', pattern: /UCBrowser\/(\d+(?:\.\d+)*)/ },
69
+ { name: 'Firefox', pattern: /Firefox\/(\d+(?:\.\d+)*)/ },
70
+ { name: 'Chrome', pattern: /Chrome\/(\d+(?:\.\d+)*)/ },
71
+ { name: 'Safari', pattern: /Version\/(\d+(?:\.\d+)*).*Safari/ },
72
+ { name: 'Safari', pattern: /Safari\/(\d+(?:\.\d+)*)/ },
73
+ { name: 'IE', pattern: /(?:MSIE |rv:)(\d+(?:\.\d+)*)/ },
74
+ ];
75
+ // OS detection patterns
76
+ const OS_PATTERNS = [
77
+ { name: 'iOS', pattern: /iPhone|iPad|iPod/, versionPattern: /OS (\d+[_\.]\d+(?:[_\.]\d+)?)/ },
78
+ { name: 'Android', pattern: /Android/, versionPattern: /Android (\d+(?:\.\d+)*)/ },
79
+ { name: 'Windows', pattern: /Windows/, versionPattern: /Windows NT (\d+(?:\.\d+)*)/ },
80
+ { name: 'macOS', pattern: /Mac OS X/, versionPattern: /Mac OS X (\d+[_\.]\d+(?:[_\.]\d+)?)/ },
81
+ { name: 'Linux', pattern: /Linux/, versionPattern: undefined },
82
+ { name: 'Chrome OS', pattern: /CrOS/, versionPattern: undefined },
83
+ ];
84
+ // Windows NT version mapping
85
+ const WINDOWS_VERSIONS = {
86
+ '10.0': '10/11',
87
+ '6.3': '8.1',
88
+ '6.2': '8',
89
+ '6.1': '7',
90
+ '6.0': 'Vista',
91
+ '5.1': 'XP',
92
+ };
93
+ // -----------------------------------------------------------------------------
94
+ // PARSER FUNCTION
95
+ // -----------------------------------------------------------------------------
96
+ /**
97
+ * Parse a user agent string to extract device, browser, and OS information.
98
+ *
99
+ * @param userAgent - The user agent string from request headers
100
+ * @returns Parsed device information
101
+ */
102
+ function parseUserAgent(userAgent) {
103
+ const ua = userAgent || '';
104
+ const uaLower = ua.toLowerCase();
105
+ // Default result
106
+ const result = {
107
+ deviceType: 'unknown',
108
+ browser: 'Unknown',
109
+ os: 'Unknown',
110
+ isMobile: false,
111
+ isTablet: false,
112
+ isDesktop: false,
113
+ isBot: false,
114
+ raw: ua,
115
+ };
116
+ if (!ua)
117
+ return result;
118
+ // Check for bots first
119
+ result.isBot = BOT_KEYWORDS.some(keyword => uaLower.includes(keyword));
120
+ // Detect device type
121
+ result.isTablet = TABLET_KEYWORDS.some(keyword => ua.includes(keyword));
122
+ result.isMobile = !result.isTablet && MOBILE_KEYWORDS.some(keyword => ua.includes(keyword));
123
+ result.isDesktop = !result.isMobile && !result.isTablet && !result.isBot;
124
+ if (result.isTablet) {
125
+ result.deviceType = 'tablet';
126
+ }
127
+ else if (result.isMobile) {
128
+ result.deviceType = 'mobile';
129
+ }
130
+ else if (result.isDesktop) {
131
+ result.deviceType = 'desktop';
132
+ }
133
+ // Detect browser
134
+ for (const { name, pattern } of BROWSER_PATTERNS) {
135
+ const match = ua.match(pattern);
136
+ if (match) {
137
+ result.browser = name;
138
+ result.browserVersion = match[1];
139
+ break;
140
+ }
141
+ }
142
+ // Detect OS
143
+ for (const { name, pattern, versionPattern } of OS_PATTERNS) {
144
+ if (pattern.test(ua)) {
145
+ result.os = name;
146
+ if (versionPattern) {
147
+ const versionMatch = ua.match(versionPattern);
148
+ if (versionMatch) {
149
+ let version = versionMatch[1].replace(/_/g, '.');
150
+ // Map Windows NT versions to friendly names
151
+ if (name === 'Windows' && WINDOWS_VERSIONS[version]) {
152
+ version = WINDOWS_VERSIONS[version];
153
+ }
154
+ result.osVersion = version;
155
+ }
156
+ }
157
+ break;
158
+ }
159
+ }
160
+ return result;
161
+ }
162
+ // -----------------------------------------------------------------------------
163
+ // HELPER FUNCTIONS
164
+ // -----------------------------------------------------------------------------
165
+ /**
166
+ * Get a short, human-readable description of the device
167
+ */
168
+ function getDeviceDescription(info) {
169
+ const parts = [];
170
+ if (info.browser !== 'Unknown') {
171
+ parts.push(info.browser);
172
+ }
173
+ if (info.os !== 'Unknown') {
174
+ let osDesc = info.os;
175
+ if (info.osVersion) {
176
+ osDesc += ` ${info.osVersion}`;
177
+ }
178
+ parts.push(osDesc);
179
+ }
180
+ if (parts.length === 0) {
181
+ if (info.isBot)
182
+ return 'Bot';
183
+ return info.deviceType.charAt(0).toUpperCase() + info.deviceType.slice(1);
184
+ }
185
+ return parts.join(' / ');
186
+ }
187
+ /**
188
+ * Get device type icon (emoji)
189
+ */
190
+ function getDeviceIcon(deviceType) {
191
+ switch (deviceType) {
192
+ case 'mobile':
193
+ return '📱';
194
+ case 'tablet':
195
+ return '📲';
196
+ case 'desktop':
197
+ return '💻';
198
+ default:
199
+ return '🔌';
200
+ }
201
+ }
202
+ /**
203
+ * Get browser icon (emoji)
204
+ */
205
+ function getBrowserIcon(browser) {
206
+ const browserLower = browser.toLowerCase();
207
+ if (browserLower.includes('chrome'))
208
+ return '🌐';
209
+ if (browserLower.includes('firefox'))
210
+ return '🦊';
211
+ if (browserLower.includes('safari'))
212
+ return '🧭';
213
+ if (browserLower.includes('edge'))
214
+ return '🌐';
215
+ if (browserLower.includes('opera'))
216
+ return '🔴';
217
+ if (browserLower.includes('ie') || browserLower.includes('internet explorer'))
218
+ return '🌐';
219
+ return '🌐';
220
+ }
@@ -0,0 +1,3 @@
1
+ import { TimeRange } from '../types';
2
+ export declare function getErrorMetrics(timeRange?: TimeRange): Promise<any>;
3
+ export declare function getHealthMetrics(timeRange?: TimeRange): Promise<any>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getErrorMetrics = getErrorMetrics;
4
+ exports.getHealthMetrics = getHealthMetrics;
5
+ const API_BASE = process.env.NEXT_PUBLIC_VIBE_API_URL || 'http://localhost:32786';
6
+ /**
7
+ * Get admin token from app's auth implementation
8
+ * Apps should override this via their own auth logic
9
+ */
10
+ function getAdminToken() {
11
+ if (typeof window !== 'undefined' && window.localStorage) {
12
+ return localStorage.getItem('admin_token') || '';
13
+ }
14
+ return '';
15
+ }
16
+ async function getErrorMetrics(timeRange = '24h') {
17
+ // Convert timeRange to hours for backend API
18
+ const hoursMap = {
19
+ '1h': 1,
20
+ '24h': 24,
21
+ '7d': 168,
22
+ '30d': 720
23
+ };
24
+ const hours = hoursMap[timeRange];
25
+ const res = await fetch(`${API_BASE}/v1/admin/analytics/errors?hours=${hours}`, {
26
+ headers: {
27
+ Authorization: `Bearer ${getAdminToken()}`
28
+ }
29
+ });
30
+ if (!res.ok) {
31
+ throw new Error(`Failed to fetch error metrics: ${res.statusText}`);
32
+ }
33
+ return res.json();
34
+ }
35
+ async function getHealthMetrics(timeRange = '1h') {
36
+ const res = await fetch(`${API_BASE}/v1/admin/analytics/health?timeRange=${timeRange}`, {
37
+ headers: {
38
+ Authorization: `Bearer ${getAdminToken()}`
39
+ }
40
+ });
41
+ if (!res.ok) {
42
+ throw new Error(`Failed to fetch health metrics: ${res.statusText}`);
43
+ }
44
+ return res.json();
45
+ }
@@ -0,0 +1,3 @@
1
+ import { AuditLogEntry, AuditLogQuery, AuditLogResponse } from '../types';
2
+ export declare function writeAuditLog(entry: Omit<AuditLogEntry, 'id' | 'timestamp'>): Promise<any>;
3
+ export declare function queryAuditLog(query: AuditLogQuery): Promise<AuditLogResponse>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.writeAuditLog = writeAuditLog;
4
+ exports.queryAuditLog = queryAuditLog;
5
+ const API_BASE = process.env.NEXT_PUBLIC_VIBE_API_URL || 'http://localhost:32786';
6
+ /**
7
+ * Get admin token from app's auth implementation
8
+ */
9
+ function getAdminToken() {
10
+ if (typeof window !== 'undefined' && window.localStorage) {
11
+ return localStorage.getItem('admin_token') || '';
12
+ }
13
+ return '';
14
+ }
15
+ async function writeAuditLog(entry) {
16
+ const res = await fetch(`${API_BASE}/v1/audit`, {
17
+ method: 'POST',
18
+ headers: {
19
+ 'Content-Type': 'application/json',
20
+ Authorization: `Bearer ${getAdminToken()}`
21
+ },
22
+ body: JSON.stringify(entry)
23
+ });
24
+ if (!res.ok) {
25
+ throw new Error(`Failed to write audit log: ${res.statusText}`);
26
+ }
27
+ return res.json();
28
+ }
29
+ async function queryAuditLog(query) {
30
+ const params = new URLSearchParams();
31
+ if (query.category)
32
+ params.append('category', query.category);
33
+ if (query.userId)
34
+ params.append('userId', query.userId.toString());
35
+ if (query.startDate)
36
+ params.append('startDate', query.startDate);
37
+ if (query.endDate)
38
+ params.append('endDate', query.endDate);
39
+ if (query.page)
40
+ params.append('page', query.page.toString());
41
+ if (query.pageSize)
42
+ params.append('pageSize', query.pageSize.toString());
43
+ const res = await fetch(`${API_BASE}/v1/audit?${params.toString()}`, {
44
+ headers: {
45
+ Authorization: `Bearer ${getAdminToken()}`
46
+ }
47
+ });
48
+ if (!res.ok) {
49
+ throw new Error(`Failed to query audit log: ${res.statusText}`);
50
+ }
51
+ return res.json();
52
+ }
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from 'react';
2
+ import { TimeRange } from '../types';
3
+ interface AdminAnalyticsLayoutProps {
4
+ title: string;
5
+ timeRange: TimeRange;
6
+ onTimeRangeChange: (range: TimeRange) => void;
7
+ children: ReactNode;
8
+ }
9
+ export declare function AdminAnalyticsLayout({ title, timeRange, onTimeRangeChange, children, }: AdminAnalyticsLayoutProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AdminAnalyticsLayout = AdminAnalyticsLayout;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ function AdminAnalyticsLayout({ title, timeRange, onTimeRangeChange, children, }) {
7
+ const timeRanges = ['1h', '24h', '7d', '30d'];
8
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "p-6", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center mb-6", children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-2xl font-bold", children: title }), (0, jsx_runtime_1.jsx)("div", { className: "flex gap-2", children: timeRanges.map(range => ((0, jsx_runtime_1.jsx)("button", { onClick: () => onTimeRangeChange(range), className: `px-3 py-1 rounded text-sm font-medium transition-colors ${timeRange === range
9
+ ? 'bg-blue-600 text-white'
10
+ : 'bg-gray-200 text-gray-700 hover:bg-gray-300'}`, children: range }, range))) })] }), (0, jsx_runtime_1.jsx)("div", { children: children })] }));
11
+ }
@@ -0,0 +1,7 @@
1
+ import { AuditLogQuery } from '../types';
2
+ interface AuditLogViewerProps {
3
+ query?: Partial<AuditLogQuery>;
4
+ className?: string;
5
+ }
6
+ export declare function AuditLogViewer({ query, className }: AuditLogViewerProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuditLogViewer = AuditLogViewer;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const audit_log_1 = require("../api/audit-log");
8
+ function AuditLogViewer({ query = {}, className }) {
9
+ const [logs, setLogs] = (0, react_1.useState)([]);
10
+ const [loading, setLoading] = (0, react_1.useState)(true);
11
+ const [error, setError] = (0, react_1.useState)(null);
12
+ const [page, setPage] = (0, react_1.useState)(1);
13
+ const [totalPages, setTotalPages] = (0, react_1.useState)(1);
14
+ (0, react_1.useEffect)(() => {
15
+ let mounted = true;
16
+ async function fetchLogs() {
17
+ try {
18
+ setLoading(true);
19
+ const result = await (0, audit_log_1.queryAuditLog)({
20
+ ...query,
21
+ page,
22
+ pageSize: 20,
23
+ });
24
+ if (mounted) {
25
+ setLogs(result.data);
26
+ setTotalPages(result.pagination?.totalPages || 1);
27
+ setError(null);
28
+ }
29
+ }
30
+ catch (err) {
31
+ if (mounted) {
32
+ setError(err instanceof Error ? err.message : 'Failed to fetch audit logs');
33
+ }
34
+ }
35
+ finally {
36
+ if (mounted) {
37
+ setLoading(false);
38
+ }
39
+ }
40
+ }
41
+ fetchLogs();
42
+ return () => {
43
+ mounted = false;
44
+ };
45
+ }, [query, page]);
46
+ if (loading)
47
+ return (0, jsx_runtime_1.jsx)("div", { className: className, children: "Loading audit logs..." });
48
+ if (error)
49
+ return (0, jsx_runtime_1.jsxs)("div", { className: className, children: ["Error: ", error] });
50
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsx)("h3", { className: "text-lg font-semibold mb-4", children: "Audit Log" }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-x-auto", children: (0, jsx_runtime_1.jsxs)("table", { className: "min-w-full divide-y divide-gray-200", children: [(0, jsx_runtime_1.jsx)("thead", { className: "bg-gray-50", children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase", children: "Timestamp" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase", children: "Category" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase", children: "Action" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase", children: "User ID" }), (0, jsx_runtime_1.jsx)("th", { className: "px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase", children: "Details" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { className: "bg-white divide-y divide-gray-200", children: logs.map(log => ((0, jsx_runtime_1.jsxs)("tr", { className: "hover:bg-gray-50", children: [(0, jsx_runtime_1.jsx)("td", { className: "px-4 py-2 text-sm text-gray-900 font-mono", children: log.timestamp ? new Date(log.timestamp).toLocaleString() : '-' }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-2 text-sm text-gray-900", children: log.category }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-2 text-sm text-gray-900 font-mono", children: log.action }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-2 text-sm text-gray-900", children: log.userId || '-' }), (0, jsx_runtime_1.jsx)("td", { className: "px-4 py-2 text-sm text-gray-500", children: log.details ? JSON.stringify(log.details).slice(0, 50) : '-' })] }, log.id))) })] }) }), totalPages > 1 && ((0, jsx_runtime_1.jsxs)("div", { className: "flex justify-center gap-2 mt-4", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => setPage(p => Math.max(1, p - 1)), disabled: page === 1, className: "px-3 py-1 rounded bg-gray-200 text-gray-700 disabled:opacity-50", children: "Previous" }), (0, jsx_runtime_1.jsxs)("span", { className: "px-3 py-1", children: ["Page ", page, " of ", totalPages] }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setPage(p => Math.min(totalPages, p + 1)), disabled: page === totalPages, className: "px-3 py-1 rounded bg-gray-200 text-gray-700 disabled:opacity-50", children: "Next" })] }))] }));
51
+ }
@@ -0,0 +1,7 @@
1
+ import { TimeRange } from '../types';
2
+ interface ErrorMetricsCardProps {
3
+ timeRange?: TimeRange;
4
+ className?: string;
5
+ }
6
+ export declare function ErrorMetricsCard({ timeRange, className }: ErrorMetricsCardProps): import("react/jsx-runtime").JSX.Element | null;
7
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ErrorMetricsCard = ErrorMetricsCard;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const useErrorMetrics_1 = require("../hooks/useErrorMetrics");
7
+ function ErrorMetricsCard({ timeRange = '24h', className }) {
8
+ const { data, loading, error } = (0, useErrorMetrics_1.useErrorMetrics)(timeRange);
9
+ if (loading)
10
+ return (0, jsx_runtime_1.jsx)("div", { className: className, children: "Loading error metrics..." });
11
+ if (error)
12
+ return (0, jsx_runtime_1.jsxs)("div", { className: className, children: ["Error: ", error] });
13
+ if (!data)
14
+ return null;
15
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("h3", { className: "text-lg font-semibold mb-4", children: ["Error Metrics", (0, jsx_runtime_1.jsxs)("span", { className: "text-sm text-gray-500 ml-2", children: ["(", new Date(data.periodStart).toLocaleDateString(), " - ", new Date(data.periodEnd).toLocaleDateString(), ")"] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-3xl font-bold", children: data.totalErrors }), (0, jsx_runtime_1.jsx)("span", { className: "text-gray-600 ml-2", children: "total errors" })] }), data.topFailingRoutes && data.topFailingRoutes.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("h4", { className: "font-medium mb-2", children: "Top Failing Routes" }), (0, jsx_runtime_1.jsx)("ul", { className: "space-y-1", children: data.topFailingRoutes.slice(0, 5).map((route, idx) => ((0, jsx_runtime_1.jsxs)("li", { className: "flex justify-between text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono", children: route.route }), (0, jsx_runtime_1.jsxs)("span", { className: "text-red-600", children: [route.count, " errors"] })] }, idx))) })] })), (0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("h4", { className: "font-medium mb-2", children: "By Severity" }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Error:" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-1", children: data.errorCount })] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Warn:" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-1", children: data.warnCount })] }), (0, jsx_runtime_1.jsxs)("div", { className: "text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium", children: "Fatal:" }), (0, jsx_runtime_1.jsx)("span", { className: "ml-1", children: data.fatalCount })] })] })] }), data.byCategory && data.byCategory.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [(0, jsx_runtime_1.jsx)("h4", { className: "font-medium mb-2", children: "By Category" }), (0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap gap-2", children: data.byCategory.map((cat, idx) => ((0, jsx_runtime_1.jsxs)("div", { className: "text-sm bg-gray-100 px-2 py-1 rounded", children: [(0, jsx_runtime_1.jsxs)("span", { className: "font-medium", children: [cat.category, ":"] }), (0, jsx_runtime_1.jsx)("span", { className: "ml-1", children: cat.count })] }, idx))) })] })), data.topErrorCodes && data.topErrorCodes.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h4", { className: "font-medium mb-2", children: "Top Error Codes" }), (0, jsx_runtime_1.jsx)("ul", { className: "space-y-1", children: data.topErrorCodes.slice(0, 5).map((code, idx) => ((0, jsx_runtime_1.jsxs)("li", { className: "flex justify-between text-sm", children: [(0, jsx_runtime_1.jsx)("span", { className: "font-mono", children: code.errorCode }), (0, jsx_runtime_1.jsx)("span", { className: "text-orange-600", children: code.count })] }, idx))) })] }))] }));
16
+ }