@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,268 @@
1
+ "use strict";
2
+ /**
3
+ * useViabilitySession - Redis-backed session state hook
4
+ *
5
+ * This hook provides the REAL session state by consulting Redis via /api/session/viability
6
+ * instead of relying on the potentially stale NextAuth JWT cookie.
7
+ *
8
+ * Redis is the single source of truth. This hook:
9
+ * 1. Polls /api/session/viability to get actual session state from Redis
10
+ * 2. Returns consistent auth state across all components
11
+ * 3. Triggers callback when session state changes unexpectedly
12
+ *
13
+ * Usage:
14
+ * ```tsx
15
+ * const { isAuthenticated, isLoading } = useViabilitySession();
16
+ * ```
17
+ */
18
+ 'use client';
19
+ /**
20
+ * useViabilitySession - Redis-backed session state hook
21
+ *
22
+ * This hook provides the REAL session state by consulting Redis via /api/session/viability
23
+ * instead of relying on the potentially stale NextAuth JWT cookie.
24
+ *
25
+ * Redis is the single source of truth. This hook:
26
+ * 1. Polls /api/session/viability to get actual session state from Redis
27
+ * 2. Returns consistent auth state across all components
28
+ * 3. Triggers callback when session state changes unexpectedly
29
+ *
30
+ * Usage:
31
+ * ```tsx
32
+ * const { isAuthenticated, isLoading } = useViabilitySession();
33
+ * ```
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.useViabilitySession = useViabilitySession;
37
+ exports.useIsAuthenticated = useIsAuthenticated;
38
+ const react_1 = require("react");
39
+ const react_2 = require("next-auth/react");
40
+ function getGlobalState() {
41
+ if (typeof window === 'undefined') {
42
+ // SSR - return default state
43
+ return {
44
+ isAuthenticated: false,
45
+ isLoading: true,
46
+ requires2FA: false,
47
+ twoFactorComplete: false,
48
+ accessTokenExpired: false,
49
+ hasRefreshToken: false,
50
+ error: null,
51
+ lastChecked: null,
52
+ checkInProgress: false,
53
+ prevAuth: null,
54
+ intervalId: null,
55
+ listeners: new Set(),
56
+ onSessionInvalidCallbacks: new Set()
57
+ };
58
+ }
59
+ // Initialize global state on window if not present
60
+ if (!window.__viabilitySessionState) {
61
+ window.__viabilitySessionState = {
62
+ isAuthenticated: false,
63
+ isLoading: true,
64
+ requires2FA: false,
65
+ twoFactorComplete: false,
66
+ accessTokenExpired: false,
67
+ hasRefreshToken: false,
68
+ error: null,
69
+ lastChecked: null,
70
+ checkInProgress: false,
71
+ prevAuth: null,
72
+ intervalId: null,
73
+ listeners: new Set(),
74
+ onSessionInvalidCallbacks: new Set()
75
+ };
76
+ }
77
+ return window.__viabilitySessionState;
78
+ }
79
+ async function doViabilityCheck() {
80
+ const state = getGlobalState();
81
+ // Prevent concurrent checks
82
+ if (state.checkInProgress)
83
+ return;
84
+ state.checkInProgress = true;
85
+ try {
86
+ const response = await fetch('/api/session/viability', {
87
+ method: 'GET',
88
+ headers: {
89
+ 'Accept': 'application/json',
90
+ 'Cache-Control': 'no-store'
91
+ },
92
+ credentials: 'include'
93
+ });
94
+ if (!response.ok) {
95
+ state.isLoading = false;
96
+ state.error = `Viability check failed: ${response.status}`;
97
+ state.lastChecked = Date.now();
98
+ notifyListeners();
99
+ return;
100
+ }
101
+ const data = await response.json();
102
+ // Detect auth state change
103
+ if (state.prevAuth !== null && state.prevAuth !== data.authenticated) {
104
+ console.log('[useViabilitySession] Auth state changed:', {
105
+ was: state.prevAuth,
106
+ now: data.authenticated
107
+ });
108
+ if (!data.authenticated) {
109
+ // Notify all callbacks
110
+ state.onSessionInvalidCallbacks.forEach(cb => {
111
+ try {
112
+ cb();
113
+ }
114
+ catch (e) {
115
+ console.error('[useViabilitySession] onSessionInvalid error:', e);
116
+ }
117
+ });
118
+ }
119
+ }
120
+ state.prevAuth = data.authenticated;
121
+ state.isAuthenticated = data.authenticated;
122
+ state.isLoading = false;
123
+ state.requires2FA = data.requires2FA ?? false;
124
+ state.twoFactorComplete = data.twoFactorComplete ?? false;
125
+ state.accessTokenExpired = data.accessTokenExpired ?? false;
126
+ state.hasRefreshToken = data.hasRefreshToken ?? false;
127
+ state.error = null;
128
+ state.lastChecked = Date.now();
129
+ notifyListeners();
130
+ }
131
+ catch (error) {
132
+ console.error('[useViabilitySession] Error checking viability:', error);
133
+ const state = getGlobalState();
134
+ state.isLoading = false;
135
+ state.error = error instanceof Error ? error.message : 'Unknown error';
136
+ state.lastChecked = Date.now();
137
+ notifyListeners();
138
+ }
139
+ finally {
140
+ getGlobalState().checkInProgress = false;
141
+ }
142
+ }
143
+ function notifyListeners() {
144
+ const state = getGlobalState();
145
+ state.listeners.forEach(listener => {
146
+ try {
147
+ listener();
148
+ }
149
+ catch (e) { /* ignore */ }
150
+ });
151
+ }
152
+ function startPolling(interval) {
153
+ const state = getGlobalState();
154
+ if (state.intervalId !== null)
155
+ return; // Already polling
156
+ state.intervalId = setInterval(() => {
157
+ doViabilityCheck();
158
+ }, interval);
159
+ }
160
+ function stopPolling() {
161
+ const state = getGlobalState();
162
+ if (state.intervalId !== null) {
163
+ clearInterval(state.intervalId);
164
+ state.intervalId = null;
165
+ }
166
+ }
167
+ /**
168
+ * Hook that provides Redis-backed session state
169
+ */
170
+ function useViabilitySession(options = {}) {
171
+ const { pollInterval = 30000, enablePolling = true, onSessionInvalid } = options;
172
+ const { status: nextAuthStatus } = (0, react_2.useSession)();
173
+ const [, forceUpdate] = (0, react_1.useState)(0);
174
+ const mountedRef = (0, react_1.useRef)(true);
175
+ const initializedRef = (0, react_1.useRef)(false);
176
+ // Register this component's onSessionInvalid callback
177
+ (0, react_1.useEffect)(() => {
178
+ if (onSessionInvalid) {
179
+ const state = getGlobalState();
180
+ state.onSessionInvalidCallbacks.add(onSessionInvalid);
181
+ return () => {
182
+ state.onSessionInvalidCallbacks.delete(onSessionInvalid);
183
+ };
184
+ }
185
+ }, [onSessionInvalid]);
186
+ // Subscribe to global state changes
187
+ (0, react_1.useEffect)(() => {
188
+ mountedRef.current = true;
189
+ const listener = () => {
190
+ if (mountedRef.current) {
191
+ forceUpdate(n => n + 1);
192
+ }
193
+ };
194
+ const state = getGlobalState();
195
+ state.listeners.add(listener);
196
+ return () => {
197
+ mountedRef.current = false;
198
+ state.listeners.delete(listener);
199
+ };
200
+ }, []);
201
+ // Initial check when NextAuth status is determined - only once!
202
+ (0, react_1.useEffect)(() => {
203
+ if (nextAuthStatus === 'loading') {
204
+ return;
205
+ }
206
+ const state = getGlobalState();
207
+ // Only do initial check once globally
208
+ if (!initializedRef.current && state.lastChecked === null) {
209
+ initializedRef.current = true;
210
+ doViabilityCheck();
211
+ }
212
+ }, [nextAuthStatus]);
213
+ // Manage polling - only one interval for all hook instances
214
+ (0, react_1.useEffect)(() => {
215
+ if (!enablePolling || nextAuthStatus === 'loading') {
216
+ return;
217
+ }
218
+ // Start polling if not already started
219
+ startPolling(pollInterval);
220
+ // Cleanup: only stop if this is the last listener
221
+ return () => {
222
+ const state = getGlobalState();
223
+ // Small delay to allow other components to register
224
+ setTimeout(() => {
225
+ if (state.listeners.size === 0) {
226
+ stopPolling();
227
+ }
228
+ }, 100);
229
+ };
230
+ }, [enablePolling, pollInterval, nextAuthStatus]);
231
+ // Check viability on focus (user returns to tab) - with debounce
232
+ (0, react_1.useEffect)(() => {
233
+ const handleFocus = () => {
234
+ const state = getGlobalState();
235
+ // Debounce: only check if last check was > 10 seconds ago
236
+ if (state.lastChecked !== null &&
237
+ Date.now() - state.lastChecked > 10000) {
238
+ doViabilityCheck();
239
+ }
240
+ };
241
+ window.addEventListener('focus', handleFocus);
242
+ return () => window.removeEventListener('focus', handleFocus);
243
+ }, []);
244
+ // Return current state
245
+ const state = getGlobalState();
246
+ return {
247
+ isAuthenticated: state.isAuthenticated,
248
+ isLoading: state.isLoading,
249
+ requires2FA: state.requires2FA,
250
+ twoFactorComplete: state.twoFactorComplete,
251
+ accessTokenExpired: state.accessTokenExpired,
252
+ hasRefreshToken: state.hasRefreshToken,
253
+ error: state.error,
254
+ lastChecked: state.lastChecked,
255
+ refresh: doViabilityCheck
256
+ };
257
+ }
258
+ /**
259
+ * Simplified hook that just returns authentication status
260
+ * Use this in components that only need to know if user is logged in
261
+ */
262
+ function useIsAuthenticated() {
263
+ const { isAuthenticated, isLoading } = useViabilitySession({
264
+ pollInterval: 60000, // Less frequent polling for simple status
265
+ enablePolling: true
266
+ });
267
+ return { isAuthenticated, isLoading };
268
+ }
@@ -0,0 +1,12 @@
1
+ export { fetchWithAuth } from './client/fetch-with-auth';
2
+ export { useAnonSession } from './client/useAnonSession';
3
+ export type { AnonPreferences, AnonMetrics, AnonSession, UseAnonSessionReturn } from './client/useAnonSession';
4
+ export { AuthProvider, useAuthConfig, useAuthMode, useFederatedProviders, useFederatedAuthEnabled, useTraditionalAuthEnabled } from './client/AuthContext';
5
+ export type { AuthConfig } from './types/auth';
6
+ export { makeAuthDecision } from './auth/auth-decision';
7
+ export { isUnauthenticatedRoute, configurePublicRoutes, getRouteConfig } from './auth/route-config';
8
+ export { createMvpMiddleware } from './middleware/create-middleware';
9
+ export { UserAvatarMenu } from './components/account';
10
+ export type { UserAvatarMenuProps } from './components/account';
11
+ export { ErrorMetricsCard, HealthMetricsCard, AuditLogViewer, AdminAnalyticsLayout, useErrorMetrics, useHealthMetrics, useAuditLog, useAdminAnalytics, getErrorMetrics, getHealthMetrics, writeAuditLog, queryAuditLog, } from './logging';
12
+ export type { ErrorMetrics, HealthMetrics, AuditLogEntry, AuditLogQuery, AuditLogResponse, TimeRange, RouteError, LevelCount, CategoryCount, ErrorDetail, EndpointHealth, SlowRequest, } from './logging';
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ // Type augmentation for NextAuth - included via ambient module declaration
3
+ // Note: Type declarations are picked up automatically via tsconfig.json, no explicit import needed
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.queryAuditLog = exports.writeAuditLog = exports.getHealthMetrics = exports.getErrorMetrics = exports.useAdminAnalytics = exports.useAuditLog = exports.useHealthMetrics = exports.useErrorMetrics = exports.AdminAnalyticsLayout = exports.AuditLogViewer = exports.HealthMetricsCard = exports.ErrorMetricsCard = exports.UserAvatarMenu = exports.createMvpMiddleware = exports.getRouteConfig = exports.configurePublicRoutes = exports.isUnauthenticatedRoute = exports.makeAuthDecision = exports.useTraditionalAuthEnabled = exports.useFederatedAuthEnabled = exports.useFederatedProviders = exports.useAuthMode = exports.useAuthConfig = exports.AuthProvider = exports.useAnonSession = exports.fetchWithAuth = void 0;
6
+ // NOTE: Server-only exports are NOT exported from the root to prevent bundling Node.js modules in client code.
7
+ // Server-side code should import from subpath exports:
8
+ // - Session management: import { sessionStore } from '@payez/next-mvp/lib/session-store'
9
+ // - Redis client: import { redis } from '@payez/next-mvp/lib/redis'
10
+ // - Token expiry: import { computeTokenExpiries } from '@payez/next-mvp/lib/token-expiry'
11
+ // - Refresh validation: import { validateRefreshToken } from '@payez/next-mvp/lib/refresh-token-validator'
12
+ // - Auth options: import { authOptions } from '@payez/next-mvp/auth/auth-options'
13
+ // - Auth handler: import { createAuthHandler } from '@payez/next-mvp/api/auth-handler'
14
+ // Client-safe exports only
15
+ // Client-side utilities
16
+ var fetch_with_auth_1 = require("./client/fetch-with-auth");
17
+ Object.defineProperty(exports, "fetchWithAuth", { enumerable: true, get: function () { return fetch_with_auth_1.fetchWithAuth; } });
18
+ // Anonymous session hook (for pre-login preferences like theme)
19
+ var useAnonSession_1 = require("./client/useAnonSession");
20
+ Object.defineProperty(exports, "useAnonSession", { enumerable: true, get: function () { return useAnonSession_1.useAnonSession; } });
21
+ // Authentication Context and Hooks
22
+ var AuthContext_1 = require("./client/AuthContext");
23
+ Object.defineProperty(exports, "AuthProvider", { enumerable: true, get: function () { return AuthContext_1.AuthProvider; } });
24
+ Object.defineProperty(exports, "useAuthConfig", { enumerable: true, get: function () { return AuthContext_1.useAuthConfig; } });
25
+ Object.defineProperty(exports, "useAuthMode", { enumerable: true, get: function () { return AuthContext_1.useAuthMode; } });
26
+ Object.defineProperty(exports, "useFederatedProviders", { enumerable: true, get: function () { return AuthContext_1.useFederatedProviders; } });
27
+ Object.defineProperty(exports, "useFederatedAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useFederatedAuthEnabled; } });
28
+ Object.defineProperty(exports, "useTraditionalAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useTraditionalAuthEnabled; } });
29
+ // Route configuration (client-safe)
30
+ var auth_decision_1 = require("./auth/auth-decision");
31
+ Object.defineProperty(exports, "makeAuthDecision", { enumerable: true, get: function () { return auth_decision_1.makeAuthDecision; } });
32
+ var route_config_1 = require("./auth/route-config");
33
+ Object.defineProperty(exports, "isUnauthenticatedRoute", { enumerable: true, get: function () { return route_config_1.isUnauthenticatedRoute; } });
34
+ Object.defineProperty(exports, "configurePublicRoutes", { enumerable: true, get: function () { return route_config_1.configurePublicRoutes; } });
35
+ Object.defineProperty(exports, "getRouteConfig", { enumerable: true, get: function () { return route_config_1.getRouteConfig; } });
36
+ var create_middleware_1 = require("./middleware/create-middleware");
37
+ Object.defineProperty(exports, "createMvpMiddleware", { enumerable: true, get: function () { return create_middleware_1.createMvpMiddleware; } });
38
+ // Account Components
39
+ var account_1 = require("./components/account");
40
+ Object.defineProperty(exports, "UserAvatarMenu", { enumerable: true, get: function () { return account_1.UserAvatarMenu; } });
41
+ // Admin Logging & Analytics (client-side components and hooks)
42
+ var logging_1 = require("./logging");
43
+ Object.defineProperty(exports, "ErrorMetricsCard", { enumerable: true, get: function () { return logging_1.ErrorMetricsCard; } });
44
+ Object.defineProperty(exports, "HealthMetricsCard", { enumerable: true, get: function () { return logging_1.HealthMetricsCard; } });
45
+ Object.defineProperty(exports, "AuditLogViewer", { enumerable: true, get: function () { return logging_1.AuditLogViewer; } });
46
+ Object.defineProperty(exports, "AdminAnalyticsLayout", { enumerable: true, get: function () { return logging_1.AdminAnalyticsLayout; } });
47
+ Object.defineProperty(exports, "useErrorMetrics", { enumerable: true, get: function () { return logging_1.useErrorMetrics; } });
48
+ Object.defineProperty(exports, "useHealthMetrics", { enumerable: true, get: function () { return logging_1.useHealthMetrics; } });
49
+ Object.defineProperty(exports, "useAuditLog", { enumerable: true, get: function () { return logging_1.useAuditLog; } });
50
+ Object.defineProperty(exports, "useAdminAnalytics", { enumerable: true, get: function () { return logging_1.useAdminAnalytics; } });
51
+ Object.defineProperty(exports, "getErrorMetrics", { enumerable: true, get: function () { return logging_1.getErrorMetrics; } });
52
+ Object.defineProperty(exports, "getHealthMetrics", { enumerable: true, get: function () { return logging_1.getHealthMetrics; } });
53
+ Object.defineProperty(exports, "writeAuditLog", { enumerable: true, get: function () { return logging_1.writeAuditLog; } });
54
+ Object.defineProperty(exports, "queryAuditLog", { enumerable: true, get: function () { return logging_1.queryAuditLog; } });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Anonymous Session Store for `@payez/next-mvp`
3
+ *
4
+ * Provides Redis-backed anonymous sessions for tracking user preferences
5
+ * before they log in. When a user logs in, their anonymous session can be
6
+ * merged into their authenticated session.
7
+ *
8
+ * Key features:
9
+ * - Generates a unique visitor ID on first visit
10
+ * - Stores preferences (theme, locale, etc.) in Redis
11
+ * - Tracks usage metrics (resume count for free tier, etc.)
12
+ * - Provides merge functionality when user authenticates
13
+ */
14
+ export declare const ANON_COOKIE_NAME: string;
15
+ export interface AnonSessionPreferences {
16
+ theme?: string;
17
+ locale?: string;
18
+ [key: string]: any;
19
+ }
20
+ export interface AnonSessionMetrics {
21
+ resumeGenerationCount?: number;
22
+ firstVisit?: number;
23
+ lastVisit?: number;
24
+ visitCount?: number;
25
+ [key: string]: any;
26
+ }
27
+ export interface AnonSessionData {
28
+ id: string;
29
+ createdAt: number;
30
+ updatedAt: number;
31
+ preferences: AnonSessionPreferences;
32
+ metrics: AnonSessionMetrics;
33
+ }
34
+ /**
35
+ * Generates a new anonymous session ID
36
+ */
37
+ export declare function generateAnonId(): string;
38
+ /**
39
+ * Creates a new anonymous session in Redis
40
+ */
41
+ export declare function createAnonSession(anonId?: string): Promise<AnonSessionData>;
42
+ /**
43
+ * Retrieves an anonymous session from Redis
44
+ */
45
+ export declare function getAnonSession(anonId: string): Promise<AnonSessionData | null>;
46
+ /**
47
+ * Gets or creates an anonymous session
48
+ */
49
+ export declare function getOrCreateAnonSession(anonId?: string): Promise<AnonSessionData>;
50
+ /**
51
+ * Saves an anonymous session to Redis
52
+ */
53
+ export declare function saveAnonSession(session: AnonSessionData): Promise<void>;
54
+ /**
55
+ * Updates preferences in an anonymous session
56
+ */
57
+ export declare function updateAnonPreferences(anonId: string, preferences: Partial<AnonSessionPreferences>): Promise<AnonSessionData | null>;
58
+ /**
59
+ * Updates metrics in an anonymous session
60
+ */
61
+ export declare function updateAnonMetrics(anonId: string, metrics: Partial<AnonSessionMetrics>): Promise<AnonSessionData | null>;
62
+ /**
63
+ * Increments a numeric metric
64
+ */
65
+ export declare function incrementAnonMetric(anonId: string, metricName: string, amount?: number): Promise<number>;
66
+ /**
67
+ * Deletes an anonymous session
68
+ */
69
+ export declare function deleteAnonSession(anonId: string): Promise<void>;
70
+ /**
71
+ * Merges anonymous session data into user profile data
72
+ * Call this when a user logs in to preserve their pre-login preferences
73
+ */
74
+ export declare function mergeAnonSessionToUser(anonId: string, userId: string, mergeCallback?: (anonData: AnonSessionData, userId: string) => Promise<void>): Promise<AnonSessionData | null>;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ /**
3
+ * Anonymous Session Store for `@payez/next-mvp`
4
+ *
5
+ * Provides Redis-backed anonymous sessions for tracking user preferences
6
+ * before they log in. When a user logs in, their anonymous session can be
7
+ * merged into their authenticated session.
8
+ *
9
+ * Key features:
10
+ * - Generates a unique visitor ID on first visit
11
+ * - Stores preferences (theme, locale, etc.) in Redis
12
+ * - Tracks usage metrics (resume count for free tier, etc.)
13
+ * - Provides merge functionality when user authenticates
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.ANON_COOKIE_NAME = void 0;
20
+ exports.generateAnonId = generateAnonId;
21
+ exports.createAnonSession = createAnonSession;
22
+ exports.getAnonSession = getAnonSession;
23
+ exports.getOrCreateAnonSession = getOrCreateAnonSession;
24
+ exports.saveAnonSession = saveAnonSession;
25
+ exports.updateAnonPreferences = updateAnonPreferences;
26
+ exports.updateAnonMetrics = updateAnonMetrics;
27
+ exports.incrementAnonMetric = incrementAnonMetric;
28
+ exports.deleteAnonSession = deleteAnonSession;
29
+ exports.mergeAnonSessionToUser = mergeAnonSessionToUser;
30
+ const redis_1 = __importDefault(require("./redis"));
31
+ const crypto_1 = require("crypto");
32
+ const app_slug_1 = require("./app-slug");
33
+ // Use app-slug prefixes for multi-app isolation
34
+ const getAnonKey = (id) => `${(0, app_slug_1.getAnonPrefix)()}${id}`;
35
+ const ANON_SESSION_TTL = 90 * 24 * 60 * 60; // 90 days in seconds
36
+ // Export dynamic cookie name getter for external use
37
+ exports.ANON_COOKIE_NAME = (0, app_slug_1.getAnonCookieName)();
38
+ /**
39
+ * Generates a new anonymous session ID
40
+ */
41
+ function generateAnonId() {
42
+ return (0, crypto_1.randomBytes)(16).toString('hex');
43
+ }
44
+ // getAnonKey is defined above using app-slug prefix
45
+ /**
46
+ * Creates a new anonymous session in Redis
47
+ */
48
+ async function createAnonSession(anonId) {
49
+ const id = anonId || generateAnonId();
50
+ const now = Date.now();
51
+ const session = {
52
+ id,
53
+ createdAt: now,
54
+ updatedAt: now,
55
+ preferences: {},
56
+ metrics: {
57
+ firstVisit: now,
58
+ lastVisit: now,
59
+ visitCount: 1,
60
+ },
61
+ };
62
+ const key = getAnonKey(id);
63
+ await redis_1.default.setex(key, ANON_SESSION_TTL, JSON.stringify(session));
64
+ return session;
65
+ }
66
+ /**
67
+ * Retrieves an anonymous session from Redis
68
+ */
69
+ async function getAnonSession(anonId) {
70
+ if (!anonId)
71
+ return null;
72
+ const key = getAnonKey(anonId);
73
+ const json = await redis_1.default.get(key);
74
+ if (!json)
75
+ return null;
76
+ try {
77
+ return JSON.parse(json);
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ /**
84
+ * Gets or creates an anonymous session
85
+ */
86
+ async function getOrCreateAnonSession(anonId) {
87
+ if (anonId) {
88
+ const existing = await getAnonSession(anonId);
89
+ if (existing) {
90
+ // Update last visit
91
+ existing.updatedAt = Date.now();
92
+ existing.metrics.lastVisit = Date.now();
93
+ existing.metrics.visitCount = (existing.metrics.visitCount || 0) + 1;
94
+ await saveAnonSession(existing);
95
+ return existing;
96
+ }
97
+ }
98
+ // Create new session
99
+ return createAnonSession(anonId);
100
+ }
101
+ /**
102
+ * Saves an anonymous session to Redis
103
+ */
104
+ async function saveAnonSession(session) {
105
+ session.updatedAt = Date.now();
106
+ const key = getAnonKey(session.id);
107
+ await redis_1.default.setex(key, ANON_SESSION_TTL, JSON.stringify(session));
108
+ }
109
+ /**
110
+ * Updates preferences in an anonymous session
111
+ */
112
+ async function updateAnonPreferences(anonId, preferences) {
113
+ const session = await getAnonSession(anonId);
114
+ if (!session)
115
+ return null;
116
+ session.preferences = { ...session.preferences, ...preferences };
117
+ await saveAnonSession(session);
118
+ return session;
119
+ }
120
+ /**
121
+ * Updates metrics in an anonymous session
122
+ */
123
+ async function updateAnonMetrics(anonId, metrics) {
124
+ const session = await getAnonSession(anonId);
125
+ if (!session)
126
+ return null;
127
+ session.metrics = { ...session.metrics, ...metrics };
128
+ await saveAnonSession(session);
129
+ return session;
130
+ }
131
+ /**
132
+ * Increments a numeric metric
133
+ */
134
+ async function incrementAnonMetric(anonId, metricName, amount = 1) {
135
+ const session = await getAnonSession(anonId);
136
+ if (!session)
137
+ return 0;
138
+ const currentValue = session.metrics[metricName] || 0;
139
+ const newValue = currentValue + amount;
140
+ session.metrics[metricName] = newValue;
141
+ await saveAnonSession(session);
142
+ return newValue;
143
+ }
144
+ /**
145
+ * Deletes an anonymous session
146
+ */
147
+ async function deleteAnonSession(anonId) {
148
+ if (!anonId)
149
+ return;
150
+ const key = getAnonKey(anonId);
151
+ await redis_1.default.del(key);
152
+ }
153
+ /**
154
+ * Merges anonymous session data into user profile data
155
+ * Call this when a user logs in to preserve their pre-login preferences
156
+ */
157
+ async function mergeAnonSessionToUser(anonId, userId, mergeCallback) {
158
+ const anonSession = await getAnonSession(anonId);
159
+ if (!anonSession)
160
+ return null;
161
+ // If a merge callback is provided, use it to persist data to user profile
162
+ if (mergeCallback) {
163
+ await mergeCallback(anonSession, userId);
164
+ }
165
+ // Optionally delete the anonymous session after merge
166
+ // await deleteAnonSession(anonId);
167
+ return anonSession;
168
+ }
169
+ // ANON_COOKIE_NAME is already exported at the top of the file