@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,149 @@
1
+ /**
2
+ * usePublicAuthSettings Hook
3
+ *
4
+ * Fetches public auth settings for pre-login pages (signup, login).
5
+ * Does NOT require authentication - settings are fetched via API.
6
+ */
7
+
8
+ 'use client';
9
+
10
+ import { useState, useEffect } from 'react';
11
+ import type { FederatedProvider } from '../types/auth';
12
+
13
+ export interface PublicAuthSettings {
14
+ enabledProviders: FederatedProvider[];
15
+ allowPublicRegistration: boolean;
16
+ allowSocialLogin: boolean;
17
+ enablePasswordReset: boolean;
18
+ require2FA: boolean;
19
+ allowed2FAMethods: string[];
20
+ }
21
+
22
+ export interface UsePublicAuthSettingsResult {
23
+ settings: PublicAuthSettings | null;
24
+ isLoading: boolean;
25
+ error: Error | null;
26
+ }
27
+
28
+ // Map provider strings to FederatedProvider type
29
+ const PROVIDER_MAP: Record<string, FederatedProvider> = {
30
+ 'google': 'google',
31
+ 'apple': 'apple',
32
+ 'facebook': 'facebook',
33
+ 'github': 'github',
34
+ 'microsoft': 'microsoft',
35
+ 'azure-ad': 'microsoft',
36
+ };
37
+
38
+ const DEFAULT_SETTINGS: PublicAuthSettings = {
39
+ enabledProviders: [],
40
+ allowPublicRegistration: true,
41
+ allowSocialLogin: false,
42
+ enablePasswordReset: true,
43
+ require2FA: true,
44
+ allowed2FAMethods: ['email', 'sms'],
45
+ };
46
+
47
+ /**
48
+ * Hook to fetch public auth settings for login/signup pages.
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * function SignupPage() {
53
+ * const { settings, isLoading } = usePublicAuthSettings();
54
+ *
55
+ * if (isLoading) return <Spinner />;
56
+ *
57
+ * return (
58
+ * <>
59
+ * {settings?.allowSocialLogin && (
60
+ * <FederatedAuthSection providers={settings.enabledProviders} />
61
+ * )}
62
+ * {settings?.allowPublicRegistration && (
63
+ * <EmailSignupForm />
64
+ * )}
65
+ * </>
66
+ * );
67
+ * }
68
+ * ```
69
+ */
70
+ export function usePublicAuthSettings(): UsePublicAuthSettingsResult {
71
+ const [settings, setSettings] = useState<PublicAuthSettings | null>(null);
72
+ const [isLoading, setIsLoading] = useState(true);
73
+ const [error, setError] = useState<Error | null>(null);
74
+
75
+ useEffect(() => {
76
+ let mounted = true;
77
+
78
+ async function fetchSettings() {
79
+ try {
80
+ const response = await fetch('/api/auth/settings');
81
+
82
+ if (!mounted) return;
83
+
84
+ if (!response.ok) {
85
+ throw new Error(`Failed to fetch auth settings: ${response.status}`);
86
+ }
87
+
88
+ const data = await response.json();
89
+
90
+ if (data.success && data.data) {
91
+ // Map provider strings to FederatedProvider type
92
+ const providers = (data.data.enabledProviders || [])
93
+ .map((p: string) => PROVIDER_MAP[p.toLowerCase()])
94
+ .filter((p: FederatedProvider | undefined): p is FederatedProvider => p !== undefined);
95
+
96
+ setSettings({
97
+ ...data.data,
98
+ enabledProviders: providers,
99
+ });
100
+ } else {
101
+ setSettings(DEFAULT_SETTINGS);
102
+ }
103
+
104
+ setError(null);
105
+ } catch (err) {
106
+ if (!mounted) return;
107
+ console.warn('[usePublicAuthSettings] Failed to fetch settings:', err);
108
+ setError(err instanceof Error ? err : new Error(String(err)));
109
+ setSettings(DEFAULT_SETTINGS);
110
+ } finally {
111
+ if (mounted) {
112
+ setIsLoading(false);
113
+ }
114
+ }
115
+ }
116
+
117
+ fetchSettings();
118
+
119
+ return () => {
120
+ mounted = false;
121
+ };
122
+ }, []);
123
+
124
+ return { settings, isLoading, error };
125
+ }
126
+
127
+ /**
128
+ * Hook to check if social login is enabled.
129
+ */
130
+ export function useSocialLoginEnabled(): boolean {
131
+ const { settings } = usePublicAuthSettings();
132
+ return settings?.allowSocialLogin ?? false;
133
+ }
134
+
135
+ /**
136
+ * Hook to check if public registration is enabled.
137
+ */
138
+ export function usePublicRegistrationEnabled(): boolean {
139
+ const { settings } = usePublicAuthSettings();
140
+ return settings?.allowPublicRegistration ?? true;
141
+ }
142
+
143
+ /**
144
+ * Hook to check if password reset is enabled.
145
+ */
146
+ export function usePasswordResetEnabled(): boolean {
147
+ const { settings } = usePublicAuthSettings();
148
+ return settings?.enablePasswordReset ?? true;
149
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Hook to detect and handle stale/expired sessions during 2FA flow
3
+ *
4
+ * Use this in verify-code pages to automatically redirect to login
5
+ * when the provisional bearer token has expired.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { useSessionExpiration } from '@payez/next-mvp/hooks/useSessionExpiration';
10
+ *
11
+ * function VerifyCodePage() {
12
+ * const { data: session } = useSession();
13
+ * const router = useRouter();
14
+ * const searchParams = useSearchParams();
15
+ * const [error, setError] = useState<string | null>(null);
16
+ *
17
+ * const callbackUrl = searchParams?.get('callbackUrl') || '/dashboard';
18
+ *
19
+ * // Automatically handles session expiration
20
+ * const sessionValid = useSessionExpiration({
21
+ * session,
22
+ * router,
23
+ * callbackUrl,
24
+ * onExpired: (message) => setError(message)
25
+ * });
26
+ *
27
+ * if (!sessionValid) return null; // Will redirect
28
+ * // ... rest of component
29
+ * }
30
+ * ```
31
+ */
32
+
33
+ import { useEffect } from 'react';
34
+ import { signOut } from 'next-auth/react';
35
+ import type { Session } from 'next-auth';
36
+
37
+ export interface UseSessionExpirationOptions {
38
+ /** NextAuth session object */
39
+ session: Session | null | undefined;
40
+ /** Next.js router for navigation */
41
+ router: {
42
+ push: (url: string) => void;
43
+ };
44
+ /** URL to redirect to after login */
45
+ callbackUrl?: string;
46
+ /** Callback when session expires - use to set error state */
47
+ onExpired?: (message: string) => void;
48
+ /** Delay before redirect in milliseconds (default: 1500) */
49
+ redirectDelay?: number;
50
+ /** Custom redirect URL (default: /account-auth/login) */
51
+ loginUrl?: string;
52
+ }
53
+
54
+ /**
55
+ * Detects stale sessions and redirects to login
56
+ *
57
+ * Returns:
58
+ * - `true` if session is valid (has accessToken)
59
+ * - `false` if session is loading (no session yet)
60
+ * - `null` if session is stale (will trigger redirect)
61
+ */
62
+ export function useSessionExpiration({
63
+ session,
64
+ router,
65
+ callbackUrl = '/dashboard',
66
+ onExpired,
67
+ redirectDelay = 1500,
68
+ loginUrl = '/account-auth/login'
69
+ }: UseSessionExpirationOptions): boolean | null {
70
+ useEffect(() => {
71
+ // If session exists but no accessToken, the token is stale/expired
72
+ if (session && !(session as any).accessToken) {
73
+ const message = 'Your session has expired. Redirecting to login...';
74
+ if (onExpired) {
75
+ onExpired(message);
76
+ }
77
+
78
+ setTimeout(async () => {
79
+ // Clear the session before redirecting
80
+ await signOut({ redirect: false });
81
+
82
+ const params = new URLSearchParams({
83
+ callbackUrl,
84
+ error: 'SessionExpired'
85
+ });
86
+
87
+ router.push(`${loginUrl}?${params.toString()}`);
88
+ }, redirectDelay);
89
+ }
90
+ }, [session, router, callbackUrl, onExpired, redirectDelay, loginUrl]);
91
+
92
+ // Return session validity state
93
+ if (session && !(session as any).accessToken) {
94
+ return null; // Stale session - will redirect
95
+ }
96
+
97
+ if ((session as any)?.accessToken) {
98
+ return true; // Valid session
99
+ }
100
+
101
+ return false; // No session yet - loading
102
+ }
@@ -0,0 +1,335 @@
1
+ /**
2
+ * useViabilitySession - Redis-backed session state hook
3
+ *
4
+ * This hook provides the REAL session state by consulting Redis via /api/session/viability
5
+ * instead of relying on the potentially stale NextAuth JWT cookie.
6
+ *
7
+ * Redis is the single source of truth. This hook:
8
+ * 1. Polls /api/session/viability to get actual session state from Redis
9
+ * 2. Returns consistent auth state across all components
10
+ * 3. Triggers callback when session state changes unexpectedly
11
+ *
12
+ * Usage:
13
+ * ```tsx
14
+ * const { isAuthenticated, isLoading } = useViabilitySession();
15
+ * ```
16
+ */
17
+
18
+ 'use client';
19
+
20
+ import { useState, useEffect, useRef } from 'react';
21
+ import { useSession } from 'next-auth/react';
22
+
23
+ export interface ViabilityState {
24
+ /** Whether the user is authenticated according to Redis */
25
+ isAuthenticated: boolean;
26
+ /** Whether the viability check is in progress */
27
+ isLoading: boolean;
28
+ /** Whether 2FA is required for this client */
29
+ requires2FA: boolean;
30
+ /** Whether 2FA has been completed for this session */
31
+ twoFactorComplete: boolean;
32
+ /** Whether the access token has expired (refresh may be needed) */
33
+ accessTokenExpired: boolean;
34
+ /** Whether a refresh token is available */
35
+ hasRefreshToken: boolean;
36
+ /** Error message if viability check failed */
37
+ error: string | null;
38
+ /** Timestamp of last successful viability check */
39
+ lastChecked: number | null;
40
+ /** Force a viability check now */
41
+ refresh: () => void;
42
+ }
43
+
44
+ interface ViabilityResponse {
45
+ authenticated: boolean;
46
+ sessionToken?: string;
47
+ requires2FA?: boolean;
48
+ twoFactorComplete?: boolean;
49
+ accessTokenExpired?: boolean;
50
+ hasRefreshToken?: boolean;
51
+ }
52
+
53
+ export interface UseViabilitySessionOptions {
54
+ /** Polling interval in milliseconds (default: 30000 = 30 seconds) */
55
+ pollInterval?: number;
56
+ /** Whether to poll automatically (default: true) */
57
+ enablePolling?: boolean;
58
+ /** Callback when session becomes invalid */
59
+ onSessionInvalid?: () => void;
60
+ }
61
+
62
+ // Use window to persist state across HMR in development
63
+ declare global {
64
+ interface Window {
65
+ __viabilitySessionState?: {
66
+ isAuthenticated: boolean;
67
+ isLoading: boolean;
68
+ requires2FA: boolean;
69
+ twoFactorComplete: boolean;
70
+ accessTokenExpired: boolean;
71
+ hasRefreshToken: boolean;
72
+ error: string | null;
73
+ lastChecked: number | null;
74
+ checkInProgress: boolean;
75
+ prevAuth: boolean | null;
76
+ intervalId: ReturnType<typeof setInterval> | null;
77
+ listeners: Set<() => void>;
78
+ onSessionInvalidCallbacks: Set<() => void>;
79
+ };
80
+ }
81
+ }
82
+
83
+ function getGlobalState() {
84
+ if (typeof window === 'undefined') {
85
+ // SSR - return default state
86
+ return {
87
+ isAuthenticated: false,
88
+ isLoading: true,
89
+ requires2FA: false,
90
+ twoFactorComplete: false,
91
+ accessTokenExpired: false,
92
+ hasRefreshToken: false,
93
+ error: null,
94
+ lastChecked: null,
95
+ checkInProgress: false,
96
+ prevAuth: null,
97
+ intervalId: null,
98
+ listeners: new Set<() => void>(),
99
+ onSessionInvalidCallbacks: new Set<() => void>()
100
+ };
101
+ }
102
+
103
+ // Initialize global state on window if not present
104
+ if (!window.__viabilitySessionState) {
105
+ window.__viabilitySessionState = {
106
+ isAuthenticated: false,
107
+ isLoading: true,
108
+ requires2FA: false,
109
+ twoFactorComplete: false,
110
+ accessTokenExpired: false,
111
+ hasRefreshToken: false,
112
+ error: null,
113
+ lastChecked: null,
114
+ checkInProgress: false,
115
+ prevAuth: null,
116
+ intervalId: null,
117
+ listeners: new Set<() => void>(),
118
+ onSessionInvalidCallbacks: new Set<() => void>()
119
+ };
120
+ }
121
+
122
+ return window.__viabilitySessionState;
123
+ }
124
+
125
+ async function doViabilityCheck(): Promise<void> {
126
+ const state = getGlobalState();
127
+
128
+ // Prevent concurrent checks
129
+ if (state.checkInProgress) return;
130
+ state.checkInProgress = true;
131
+
132
+ try {
133
+ const response = await fetch('/api/session/viability', {
134
+ method: 'GET',
135
+ headers: {
136
+ 'Accept': 'application/json',
137
+ 'Cache-Control': 'no-store'
138
+ },
139
+ credentials: 'include'
140
+ });
141
+
142
+ if (!response.ok) {
143
+ state.isLoading = false;
144
+ state.error = `Viability check failed: ${response.status}`;
145
+ state.lastChecked = Date.now();
146
+ notifyListeners();
147
+ return;
148
+ }
149
+
150
+ const data: ViabilityResponse = await response.json();
151
+
152
+ // Detect auth state change
153
+ if (state.prevAuth !== null && state.prevAuth !== data.authenticated) {
154
+ console.log('[useViabilitySession] Auth state changed:', {
155
+ was: state.prevAuth,
156
+ now: data.authenticated
157
+ });
158
+
159
+ if (!data.authenticated) {
160
+ // Notify all callbacks
161
+ state.onSessionInvalidCallbacks.forEach(cb => {
162
+ try { cb(); } catch (e) { console.error('[useViabilitySession] onSessionInvalid error:', e); }
163
+ });
164
+ }
165
+ }
166
+
167
+ state.prevAuth = data.authenticated;
168
+ state.isAuthenticated = data.authenticated;
169
+ state.isLoading = false;
170
+ state.requires2FA = data.requires2FA ?? false;
171
+ state.twoFactorComplete = data.twoFactorComplete ?? false;
172
+ state.accessTokenExpired = data.accessTokenExpired ?? false;
173
+ state.hasRefreshToken = data.hasRefreshToken ?? false;
174
+ state.error = null;
175
+ state.lastChecked = Date.now();
176
+
177
+ notifyListeners();
178
+
179
+ } catch (error) {
180
+ console.error('[useViabilitySession] Error checking viability:', error);
181
+ const state = getGlobalState();
182
+ state.isLoading = false;
183
+ state.error = error instanceof Error ? error.message : 'Unknown error';
184
+ state.lastChecked = Date.now();
185
+ notifyListeners();
186
+ } finally {
187
+ getGlobalState().checkInProgress = false;
188
+ }
189
+ }
190
+
191
+ function notifyListeners() {
192
+ const state = getGlobalState();
193
+ state.listeners.forEach(listener => {
194
+ try { listener(); } catch (e) { /* ignore */ }
195
+ });
196
+ }
197
+
198
+ function startPolling(interval: number) {
199
+ const state = getGlobalState();
200
+ if (state.intervalId !== null) return; // Already polling
201
+
202
+ state.intervalId = setInterval(() => {
203
+ doViabilityCheck();
204
+ }, interval);
205
+ }
206
+
207
+ function stopPolling() {
208
+ const state = getGlobalState();
209
+ if (state.intervalId !== null) {
210
+ clearInterval(state.intervalId);
211
+ state.intervalId = null;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Hook that provides Redis-backed session state
217
+ */
218
+ export function useViabilitySession(options: UseViabilitySessionOptions = {}): ViabilityState {
219
+ const {
220
+ pollInterval = 30000,
221
+ enablePolling = true,
222
+ onSessionInvalid
223
+ } = options;
224
+
225
+ const { status: nextAuthStatus } = useSession();
226
+ const [, forceUpdate] = useState(0);
227
+ const mountedRef = useRef(true);
228
+ const initializedRef = useRef(false);
229
+
230
+ // Register this component's onSessionInvalid callback
231
+ useEffect(() => {
232
+ if (onSessionInvalid) {
233
+ const state = getGlobalState();
234
+ state.onSessionInvalidCallbacks.add(onSessionInvalid);
235
+ return () => {
236
+ state.onSessionInvalidCallbacks.delete(onSessionInvalid);
237
+ };
238
+ }
239
+ }, [onSessionInvalid]);
240
+
241
+ // Subscribe to global state changes
242
+ useEffect(() => {
243
+ mountedRef.current = true;
244
+ const listener = () => {
245
+ if (mountedRef.current) {
246
+ forceUpdate(n => n + 1);
247
+ }
248
+ };
249
+ const state = getGlobalState();
250
+ state.listeners.add(listener);
251
+
252
+ return () => {
253
+ mountedRef.current = false;
254
+ state.listeners.delete(listener);
255
+ };
256
+ }, []);
257
+
258
+ // Initial check when NextAuth status is determined - only once!
259
+ useEffect(() => {
260
+ if (nextAuthStatus === 'loading') {
261
+ return;
262
+ }
263
+
264
+ const state = getGlobalState();
265
+
266
+ // Only do initial check once globally
267
+ if (!initializedRef.current && state.lastChecked === null) {
268
+ initializedRef.current = true;
269
+ doViabilityCheck();
270
+ }
271
+ }, [nextAuthStatus]);
272
+
273
+ // Manage polling - only one interval for all hook instances
274
+ useEffect(() => {
275
+ if (!enablePolling || nextAuthStatus === 'loading') {
276
+ return;
277
+ }
278
+
279
+ // Start polling if not already started
280
+ startPolling(pollInterval);
281
+
282
+ // Cleanup: only stop if this is the last listener
283
+ return () => {
284
+ const state = getGlobalState();
285
+ // Small delay to allow other components to register
286
+ setTimeout(() => {
287
+ if (state.listeners.size === 0) {
288
+ stopPolling();
289
+ }
290
+ }, 100);
291
+ };
292
+ }, [enablePolling, pollInterval, nextAuthStatus]);
293
+
294
+ // Check viability on focus (user returns to tab) - with debounce
295
+ useEffect(() => {
296
+ const handleFocus = () => {
297
+ const state = getGlobalState();
298
+ // Debounce: only check if last check was > 10 seconds ago
299
+ if (state.lastChecked !== null &&
300
+ Date.now() - state.lastChecked > 10000) {
301
+ doViabilityCheck();
302
+ }
303
+ };
304
+
305
+ window.addEventListener('focus', handleFocus);
306
+ return () => window.removeEventListener('focus', handleFocus);
307
+ }, []);
308
+
309
+ // Return current state
310
+ const state = getGlobalState();
311
+ return {
312
+ isAuthenticated: state.isAuthenticated,
313
+ isLoading: state.isLoading,
314
+ requires2FA: state.requires2FA,
315
+ twoFactorComplete: state.twoFactorComplete,
316
+ accessTokenExpired: state.accessTokenExpired,
317
+ hasRefreshToken: state.hasRefreshToken,
318
+ error: state.error,
319
+ lastChecked: state.lastChecked,
320
+ refresh: doViabilityCheck
321
+ };
322
+ }
323
+
324
+ /**
325
+ * Simplified hook that just returns authentication status
326
+ * Use this in components that only need to know if user is logged in
327
+ */
328
+ export function useIsAuthenticated(): { isAuthenticated: boolean; isLoading: boolean } {
329
+ const { isAuthenticated, isLoading } = useViabilitySession({
330
+ pollInterval: 60000, // Less frequent polling for simple status
331
+ enablePolling: true
332
+ });
333
+
334
+ return { isAuthenticated, isLoading };
335
+ }
package/src/index.ts ADDED
@@ -0,0 +1,63 @@
1
+ // Type augmentation for NextAuth - included via ambient module declaration
2
+ // Note: Type declarations are picked up automatically via tsconfig.json, no explicit import needed
3
+
4
+ // NOTE: Server-only exports are NOT exported from the root to prevent bundling Node.js modules in client code.
5
+ // Server-side code should import from subpath exports:
6
+ // - Session management: import { sessionStore } from '@payez/next-mvp/lib/session-store'
7
+ // - Redis client: import { redis } from '@payez/next-mvp/lib/redis'
8
+ // - Token expiry: import { computeTokenExpiries } from '@payez/next-mvp/lib/token-expiry'
9
+ // - Refresh validation: import { validateRefreshToken } from '@payez/next-mvp/lib/refresh-token-validator'
10
+ // - Auth options: import { authOptions } from '@payez/next-mvp/auth/auth-options'
11
+ // - Auth handler: import { createAuthHandler } from '@payez/next-mvp/api/auth-handler'
12
+
13
+ // Client-safe exports only
14
+
15
+ // Client-side utilities
16
+ export { fetchWithAuth } from './client/fetch-with-auth';
17
+
18
+ // Anonymous session hook (for pre-login preferences like theme)
19
+ export { useAnonSession } from './client/useAnonSession';
20
+ export type { AnonPreferences, AnonMetrics, AnonSession, UseAnonSessionReturn } from './client/useAnonSession';
21
+
22
+ // Authentication Context and Hooks
23
+ export { AuthProvider, useAuthConfig, useAuthMode, useFederatedProviders, useFederatedAuthEnabled, useTraditionalAuthEnabled } from './client/AuthContext';
24
+ export type { AuthConfig } from './types/auth';
25
+
26
+ // Route configuration (client-safe)
27
+ export { makeAuthDecision } from './auth/auth-decision';
28
+ export { isUnauthenticatedRoute, configurePublicRoutes, getRouteConfig } from './auth/route-config';
29
+ export { createMvpMiddleware } from './middleware/create-middleware';
30
+
31
+ // Account Components
32
+ export { UserAvatarMenu } from './components/account';
33
+ export type { UserAvatarMenuProps } from './components/account';
34
+
35
+ // Admin Logging & Analytics (client-side components and hooks)
36
+ export {
37
+ ErrorMetricsCard,
38
+ HealthMetricsCard,
39
+ AuditLogViewer,
40
+ AdminAnalyticsLayout,
41
+ useErrorMetrics,
42
+ useHealthMetrics,
43
+ useAuditLog,
44
+ useAdminAnalytics,
45
+ getErrorMetrics,
46
+ getHealthMetrics,
47
+ writeAuditLog,
48
+ queryAuditLog,
49
+ } from './logging';
50
+ export type {
51
+ ErrorMetrics,
52
+ HealthMetrics,
53
+ AuditLogEntry,
54
+ AuditLogQuery,
55
+ AuditLogResponse,
56
+ TimeRange,
57
+ RouteError,
58
+ LevelCount,
59
+ CategoryCount,
60
+ ErrorDetail,
61
+ EndpointHealth,
62
+ SlowRequest,
63
+ } from './logging';