@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,213 @@
1
+ "use strict";
2
+ /**
3
+ * NextAuth Configuration (Refactored)
4
+ *
5
+ * This is the composition layer that wires together all auth modules.
6
+ * Individual logic lives in dedicated modules:
7
+ * - providers/ - Credentials and OAuth provider builders
8
+ * - callbacks/ - JWT, session, signIn callbacks
9
+ * - events/ - SignOut event handler
10
+ * - utils/ - Token utilities, IDP client
11
+ * - types/ - Type definitions
12
+ *
13
+ * CARGO CULT PATTERNS REMOVED:
14
+ * ============================
15
+ * The original auth-options.ts (1186 lines) had several anti-patterns that
16
+ * added complexity without benefit:
17
+ *
18
+ * 1. CALLBACK CONCURRENCY PROTECTION (removed)
19
+ * - shouldExecuteCallback() / markCallbackComplete()
20
+ * - A debouncing mechanism that tried to prevent callbacks from running
21
+ * too frequently. NextAuth already handles this properly.
22
+ * - Added complexity, caused race condition bugs, and leaked memory
23
+ * (Map entries never cleaned up).
24
+ *
25
+ * 2. SESSION RESTORATION (removed)
26
+ * - attemptSessionRestoration()
27
+ * - Tried to restore sessions by calling refresh endpoint from JWT callback.
28
+ * - Created circular dependencies and made debugging impossible.
29
+ * - Clean approach: Session missing = user re-authenticates. Simple.
30
+ *
31
+ * 3. VARIABLE NAME SOUP (normalized in Phase 3)
32
+ * - accessToken vs idpAccessToken vs oauthAccessToken
33
+ * - twoFactorComplete vs mfaVerified vs requiresTwoFactor
34
+ * - sessionToken vs redisSessionId
35
+ * - Now: Clear prefixes (idp*, oauth*, mfa*) with documented meanings.
36
+ *
37
+ * 4. INLINE EVERYTHING (modularized in Phase 2)
38
+ * - All logic was in one giant file with no separation of concerns.
39
+ * - Now: Each module has one job and can be tested independently.
40
+ *
41
+ * @version 2.0.0
42
+ * @since auth-refactor-2026-01
43
+ */
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.authOptions = void 0;
46
+ exports.getAuthOptions = getAuthOptions;
47
+ exports.clearAuthOptionsCache = clearAuthOptionsCache;
48
+ const jwt_1 = require("next-auth/jwt");
49
+ const idp_client_config_1 = require("../lib/idp-client-config");
50
+ const app_slug_1 = require("../lib/app-slug");
51
+ // Module imports
52
+ const providers_1 = require("./providers");
53
+ const callbacks_1 = require("./callbacks");
54
+ const events_1 = require("./events");
55
+ // ============================================================================
56
+ // ENVIRONMENT HELPERS
57
+ // ============================================================================
58
+ /**
59
+ * Get AUTH_ISSUER_URL for JWT issuer claim.
60
+ * Required for SSO across apps.
61
+ */
62
+ function getAuthIssuerUrl() {
63
+ const url = process.env.AUTH_ISSUER_URL;
64
+ if (!url) {
65
+ throw new Error('AUTH_ISSUER_URL environment variable is REQUIRED');
66
+ }
67
+ return url;
68
+ }
69
+ // ============================================================================
70
+ // BASE AUTH OPTIONS
71
+ // ============================================================================
72
+ /**
73
+ * Base NextAuth configuration.
74
+ * Use getAuthOptions() for dynamic provider loading from IDP.
75
+ */
76
+ exports.authOptions = {
77
+ // Session uses JWT strategy - JWT contains only redisSessionId
78
+ session: {
79
+ strategy: 'jwt',
80
+ maxAge: 30 * 24 * 60 * 60, // 30 days default, overridden by IDP config
81
+ },
82
+ // Custom JWT handling for SSO issuer
83
+ jwt: {
84
+ encode: async (params) => {
85
+ try {
86
+ const issuer = getAuthIssuerUrl();
87
+ console.log('[JWT_ENCODE] Encoding token:', {
88
+ hasToken: !!params.token,
89
+ hasSecret: !!params.secret,
90
+ secretLength: params.secret?.length || 0,
91
+ issuer,
92
+ tokenKeys: params.token ? Object.keys(params.token) : [],
93
+ });
94
+ const encoded = await (0, jwt_1.encode)({
95
+ ...params,
96
+ secret: params.secret,
97
+ token: {
98
+ ...params.token,
99
+ iss: issuer,
100
+ },
101
+ });
102
+ console.log('[JWT_ENCODE] Success, encoded length:', encoded?.length || 0);
103
+ return encoded;
104
+ }
105
+ catch (error) {
106
+ console.error('[JWT_ENCODE] FAILED:', error);
107
+ throw error;
108
+ }
109
+ },
110
+ decode: async (params) => {
111
+ const decoded = await (0, jwt_1.decode)(params);
112
+ if (decoded?.iss && decoded.iss !== getAuthIssuerUrl()) {
113
+ console.error('[JWT] Invalid issuer. Expected:', getAuthIssuerUrl(), 'Got:', decoded.iss);
114
+ return null; // Hard enforcement - reject mismatched issuers
115
+ }
116
+ return decoded;
117
+ },
118
+ },
119
+ // Cookie configuration for multi-app support
120
+ // In production, use __Secure- prefixed cookie names for enhanced security
121
+ cookies: {
122
+ sessionToken: {
123
+ name: process.env.NODE_ENV === 'production' ? (0, app_slug_1.getSecureSessionCookieName)() : (0, app_slug_1.getSessionCookieName)(),
124
+ options: {
125
+ httpOnly: true,
126
+ sameSite: 'lax',
127
+ path: '/',
128
+ secure: process.env.NODE_ENV === 'production',
129
+ },
130
+ },
131
+ csrfToken: {
132
+ name: process.env.NODE_ENV === 'production' ? (0, app_slug_1.getSecureCsrfCookieName)() : (0, app_slug_1.getCsrfCookieName)(),
133
+ options: {
134
+ httpOnly: true,
135
+ sameSite: 'lax',
136
+ path: '/',
137
+ secure: process.env.NODE_ENV === 'production',
138
+ },
139
+ },
140
+ callbackUrl: {
141
+ name: (0, app_slug_1.getCallbackUrlCookieName)(),
142
+ options: {
143
+ sameSite: 'lax',
144
+ path: '/',
145
+ secure: process.env.NODE_ENV === 'production',
146
+ },
147
+ },
148
+ },
149
+ // Providers - credentials only in base, OAuth added dynamically
150
+ providers: [(0, providers_1.createCredentialsProvider)()],
151
+ // Callbacks wired to modular implementations
152
+ callbacks: {
153
+ jwt: callbacks_1.jwtCallback,
154
+ session: callbacks_1.sessionCallback, // Type cast needed for NextAuth compatibility
155
+ signIn: callbacks_1.signInCallback,
156
+ },
157
+ // Events
158
+ events: {
159
+ signOut: events_1.handleSignOut,
160
+ },
161
+ // Custom pages
162
+ pages: {
163
+ signIn: '/account-auth/login',
164
+ error: '/account-auth/login',
165
+ },
166
+ debug: false,
167
+ };
168
+ // ============================================================================
169
+ // DYNAMIC AUTH OPTIONS (WITH IDP OAUTH PROVIDERS)
170
+ // ============================================================================
171
+ let cachedAuthOptions = null;
172
+ let authOptionsPromise = null;
173
+ /**
174
+ * Get auth options with dynamically loaded OAuth providers from IDP.
175
+ * Uses caching to avoid rebuilding on every request.
176
+ */
177
+ async function getAuthOptions() {
178
+ if (cachedAuthOptions) {
179
+ return cachedAuthOptions;
180
+ }
181
+ if (authOptionsPromise) {
182
+ return authOptionsPromise;
183
+ }
184
+ authOptionsPromise = buildDynamicAuthOptions();
185
+ cachedAuthOptions = await authOptionsPromise;
186
+ authOptionsPromise = null;
187
+ return cachedAuthOptions;
188
+ }
189
+ /**
190
+ * Build auth options with dynamic OAuth providers from IDP.
191
+ */
192
+ async function buildDynamicAuthOptions() {
193
+ const idpConfig = await (0, idp_client_config_1.getIDPClientConfig)();
194
+ const oauthProviders = (0, providers_1.buildOAuthProviders)(idpConfig);
195
+ return {
196
+ ...exports.authOptions,
197
+ secret: idpConfig.nextAuthSecret || process.env.NEXTAUTH_SECRET,
198
+ session: {
199
+ ...exports.authOptions.session,
200
+ maxAge: idpConfig.authSettings?.rememberMeDays
201
+ ? idpConfig.authSettings.rememberMeDays * 24 * 60 * 60
202
+ : 30 * 24 * 60 * 60,
203
+ },
204
+ providers: [(0, providers_1.createCredentialsProvider)(), ...oauthProviders],
205
+ };
206
+ }
207
+ /**
208
+ * Clear cached auth options (when IDP config changes).
209
+ */
210
+ function clearAuthOptionsCache() {
211
+ cachedAuthOptions = null;
212
+ authOptionsPromise = null;
213
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Auth Callbacks - Public Exports
3
+ */
4
+ export { jwtCallback } from './jwt';
5
+ export { sessionCallback } from './session';
6
+ export { signInCallback } from './signin';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ /**
3
+ * Auth Callbacks - Public Exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.signInCallback = exports.sessionCallback = exports.jwtCallback = void 0;
7
+ var jwt_1 = require("./jwt");
8
+ Object.defineProperty(exports, "jwtCallback", { enumerable: true, get: function () { return jwt_1.jwtCallback; } });
9
+ var session_1 = require("./session");
10
+ Object.defineProperty(exports, "sessionCallback", { enumerable: true, get: function () { return session_1.sessionCallback; } });
11
+ var signin_1 = require("./signin");
12
+ Object.defineProperty(exports, "signInCallback", { enumerable: true, get: function () { return signin_1.signInCallback; } });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * JWT Callback
3
+ *
4
+ * Minimal token strategy - only store redisSessionId in JWT.
5
+ * All session data lives in Redis, not in the browser cookie.
6
+ *
7
+ * HANDLES:
8
+ * - Initial sign-in (credentials): Store redisSessionId from authorize()
9
+ * - Initial sign-in (OAuth): Register with IDP, create session, store redisSessionId
10
+ * - Subsequent requests: Validate session exists, return token
11
+ *
12
+ * @version 1.0.0
13
+ * @since auth-refactor-2026-01
14
+ */
15
+ import type { JWT } from 'next-auth/jwt';
16
+ import type { User, Account } from 'next-auth';
17
+ interface JwtCallbackParams {
18
+ token: JWT;
19
+ user?: User | any;
20
+ account?: Account | null;
21
+ trigger?: 'signIn' | 'signUp' | 'update';
22
+ }
23
+ interface JwtCallbackResult extends JWT {
24
+ /** Redis session ID - the key to look up session data */
25
+ redisSessionId?: string;
26
+ /** User ID from IDP */
27
+ sub: string;
28
+ /** Error code if session validation failed */
29
+ error?: string;
30
+ /** Flag for OAuth users who need immediate 2FA redirect */
31
+ requiresTwoFactorRedirect?: boolean;
32
+ }
33
+ /**
34
+ * JWT callback - builds the NextAuth JWT token.
35
+ *
36
+ * MINIMAL TOKEN STRATEGY:
37
+ * - Only store redisSessionId (key to Redis session)
38
+ * - All tokens and user data live in Redis
39
+ * - Browser cookie stays small and secure
40
+ *
41
+ * @param params - JWT callback parameters from NextAuth
42
+ * @returns JWT payload to store in browser cookie
43
+ */
44
+ export declare function jwtCallback({ token, user, account, trigger, }: JwtCallbackParams): Promise<JwtCallbackResult>;
45
+ export {};
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+ /**
3
+ * JWT Callback
4
+ *
5
+ * Minimal token strategy - only store redisSessionId in JWT.
6
+ * All session data lives in Redis, not in the browser cookie.
7
+ *
8
+ * HANDLES:
9
+ * - Initial sign-in (credentials): Store redisSessionId from authorize()
10
+ * - Initial sign-in (OAuth): Register with IDP, create session, store redisSessionId
11
+ * - Subsequent requests: Validate session exists, return token
12
+ *
13
+ * @version 1.0.0
14
+ * @since auth-refactor-2026-01
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.jwtCallback = jwtCallback;
18
+ const crypto_1 = require("crypto");
19
+ const session_store_1 = require("../../lib/session-store");
20
+ const idp_client_config_1 = require("../../lib/idp-client-config");
21
+ const idp_client_1 = require("../utils/idp-client");
22
+ const token_utils_1 = require("../utils/token-utils");
23
+ // NOTE: Using any for sessionData until Phase 3 normalizes types
24
+ // ============================================================================
25
+ // VIBE ROLE FETCHING
26
+ // ============================================================================
27
+ /**
28
+ * Generate HMAC signature for Vibe API request.
29
+ */
30
+ function generateVibeSignature(endpoint, clientId, timestamp) {
31
+ const signingKey = process.env.VIBE_SIGNING_KEY;
32
+ if (!signingKey) {
33
+ return '';
34
+ }
35
+ const stringToSign = `${timestamp}|GET|${endpoint}|${clientId}`;
36
+ return (0, crypto_1.createHmac)('sha256', Buffer.from(signingKey, 'base64'))
37
+ .update(stringToSign)
38
+ .digest('base64');
39
+ }
40
+ /**
41
+ * Fetch user's roles from Vibe API.
42
+ * Returns empty array on failure (non-blocking).
43
+ * Uses HMAC signature for authentication when signing key is configured.
44
+ */
45
+ async function fetchVibeRoles(userId, clientId) {
46
+ const vibeApiUrl = process.env.VIBE_API_URL;
47
+ if (!vibeApiUrl) {
48
+ return [];
49
+ }
50
+ const endpoint = `/api/v1/users/${userId}/roles`;
51
+ const timestamp = Math.floor(Date.now() / 1000);
52
+ const signature = generateVibeSignature(endpoint, clientId, timestamp);
53
+ // Build headers with optional signature
54
+ const headers = {
55
+ 'Accept': 'application/json',
56
+ 'X-Client-Id': clientId,
57
+ 'X-Vibe-Client-Id': clientId,
58
+ };
59
+ if (signature) {
60
+ headers['X-Vibe-Timestamp'] = String(timestamp);
61
+ headers['X-Vibe-Signature'] = signature;
62
+ }
63
+ try {
64
+ const response = await fetch(`${vibeApiUrl}${endpoint}`, {
65
+ method: 'GET',
66
+ headers,
67
+ // 2 second timeout
68
+ signal: AbortSignal.timeout(2000),
69
+ });
70
+ if (!response.ok) {
71
+ console.warn('[JWT_CALLBACK] Failed to fetch Vibe roles:', response.status);
72
+ return [];
73
+ }
74
+ const data = await response.json();
75
+ const roles = data.roles?.map((r) => r.role_name || r) || [];
76
+ console.log('[JWT_CALLBACK] Fetched Vibe roles:', roles);
77
+ return roles;
78
+ }
79
+ catch (error) {
80
+ console.warn('[JWT_CALLBACK] Error fetching Vibe roles (continuing with IDP roles only):', error);
81
+ return [];
82
+ }
83
+ }
84
+ /**
85
+ * Merge IDP roles with Vibe roles, deduplicating.
86
+ */
87
+ function mergeRoles(idpRoles, vibeRoles) {
88
+ return [...new Set([...idpRoles, ...vibeRoles])];
89
+ }
90
+ // ============================================================================
91
+ // JWT CALLBACK
92
+ // ============================================================================
93
+ /**
94
+ * JWT callback - builds the NextAuth JWT token.
95
+ *
96
+ * MINIMAL TOKEN STRATEGY:
97
+ * - Only store redisSessionId (key to Redis session)
98
+ * - All tokens and user data live in Redis
99
+ * - Browser cookie stays small and secure
100
+ *
101
+ * @param params - JWT callback parameters from NextAuth
102
+ * @returns JWT payload to store in browser cookie
103
+ */
104
+ async function jwtCallback({ token, user, account, trigger, }) {
105
+ console.log('[JWT_CALLBACK] Called with:', {
106
+ trigger,
107
+ hasAccount: !!account,
108
+ provider: account?.provider,
109
+ hasUser: !!user,
110
+ userEmail: user?.email,
111
+ existingRedisSessionId: token?.redisSessionId ? 'yes' : 'no',
112
+ });
113
+ // -------------------------------------------------------------------------
114
+ // OAuth Sign-In: Register with IDP and create session
115
+ // -------------------------------------------------------------------------
116
+ if (account && account.provider !== 'credentials') {
117
+ console.log('[JWT_CALLBACK] Handling OAuth sign-in for provider:', account.provider);
118
+ return handleOAuthSignIn(token, user, account);
119
+ }
120
+ // -------------------------------------------------------------------------
121
+ // Credentials Sign-In: Session already created in authorize()
122
+ // -------------------------------------------------------------------------
123
+ if (user && user.redisSessionId) {
124
+ // Credentials authorize() returns redisSessionId
125
+ const redisSessionId = user.redisSessionId;
126
+ return {
127
+ ...token,
128
+ redisSessionId,
129
+ sub: user.id || token.sub || 'unknown',
130
+ };
131
+ }
132
+ // -------------------------------------------------------------------------
133
+ // Subsequent Requests: Validate session exists
134
+ // -------------------------------------------------------------------------
135
+ const redisSessionId = user?.redisSessionId || token?.redisSessionId || token?.redisSessionId;
136
+ if (!redisSessionId) {
137
+ return { ...token, error: 'NoSession', sub: token.sub || 'unknown' };
138
+ }
139
+ // Validate session still exists in Redis
140
+ try {
141
+ const sessionData = await (0, session_store_1.getSession)(redisSessionId);
142
+ if (!sessionData) {
143
+ // Session expired or deleted
144
+ return { ...token, error: 'SessionNotFound', sub: token.sub || 'unknown' };
145
+ }
146
+ // Check if refresh token has expired (session should be terminated)
147
+ if (sessionData.idpRefreshTokenExpires && Date.now() >= sessionData.idpRefreshTokenExpires) {
148
+ return { ...token, error: 'RefreshTokenExpired', sub: token.sub || 'unknown' };
149
+ }
150
+ // Check if MFA has expired (requires step-up authentication)
151
+ if (sessionData.mfaExpiresAt && Date.now() > sessionData.mfaExpiresAt) {
152
+ return {
153
+ ...token,
154
+ redisSessionId,
155
+ sub: sessionData.userId,
156
+ error: 'MfaExpired',
157
+ };
158
+ }
159
+ }
160
+ catch (error) {
161
+ console.error('[JWT_CALLBACK] Session validation error:', error);
162
+ return { ...token, error: 'SessionError', sub: token.sub || 'unknown' };
163
+ }
164
+ // Session is valid - return minimal token
165
+ return {
166
+ ...token,
167
+ redisSessionId,
168
+ sub: token.sub || 'unknown',
169
+ };
170
+ }
171
+ // ============================================================================
172
+ // OAUTH SIGN-IN HANDLER
173
+ // ============================================================================
174
+ /**
175
+ * Handle OAuth sign-in by registering with IDP and creating session.
176
+ */
177
+ async function handleOAuthSignIn(token, user, account) {
178
+ console.log('[JWT_CALLBACK] handleOAuthSignIn starting for:', {
179
+ provider: account.provider,
180
+ email: user?.email,
181
+ providerAccountId: account.providerAccountId,
182
+ });
183
+ try {
184
+ // Call IDP to register/authenticate OAuth user
185
+ const idpResult = await (0, idp_client_1.idpOAuthCallback)({
186
+ provider: account.provider,
187
+ providerAccountId: account.providerAccountId,
188
+ email: user?.email || '',
189
+ name: user?.name || '',
190
+ image: user?.image || '',
191
+ accessToken: account.access_token,
192
+ refreshToken: account.refresh_token,
193
+ expiresAt: account.expires_at,
194
+ });
195
+ // Build session data using normalized field names
196
+ let sessionData;
197
+ let mfaVerified = false;
198
+ if (idpResult.success && idpResult.data?.accessToken) {
199
+ // IDP integration succeeded - we have IDP tokens
200
+ const decoded = (0, token_utils_1.decodeIdpAccessToken)(idpResult.data.accessToken);
201
+ const amrClaims = decoded ? (0, token_utils_1.extractAmrFromToken)(decoded) : [];
202
+ const acrLevel = decoded?.acr || '1';
203
+ // Extract kid from JWT header (CRITICAL: different from client_id in payload)
204
+ const bearerKeyId = (0, token_utils_1.extractKidFromToken)(idpResult.data.accessToken);
205
+ if (bearerKeyId) {
206
+ console.log('[JWT_CALLBACK] Extracted bearerKeyId (kid) from JWT header:', bearerKeyId);
207
+ }
208
+ else {
209
+ console.warn('[JWT_CALLBACK] No kid found in JWT header');
210
+ }
211
+ // Check if MFA is required for this client
212
+ try {
213
+ const clientConfig = await (0, idp_client_config_1.getIDPClientConfig)();
214
+ const require2FA = clientConfig?.authSettings?.require2FA ?? true;
215
+ mfaVerified = !require2FA; // If MFA not required, mark as verified
216
+ }
217
+ catch {
218
+ // Default to requiring MFA if config unavailable
219
+ mfaVerified = false;
220
+ }
221
+ sessionData = {
222
+ userId: idpResult.data.user?.userId?.toString() || account.providerAccountId,
223
+ email: idpResult.data.user?.email || user?.email || '',
224
+ name: idpResult.data.user?.fullName || user?.name || '',
225
+ roles: idpResult.data.user?.roles || [],
226
+ // IDP tokens (normalized names)
227
+ idpAccessToken: idpResult.data.accessToken,
228
+ idpRefreshToken: idpResult.data.refreshToken,
229
+ idpAccessTokenExpires: decoded?.exp ? (0, token_utils_1.expClaimToMs)(decoded.exp) : Date.now() + 3600000,
230
+ decodedAccessToken: decoded || undefined,
231
+ // Bearer key ID from JWT header (NOT client_id from payload)
232
+ bearerKeyId,
233
+ // MFA state (normalized names)
234
+ mfaVerified,
235
+ authenticationMethods: amrClaims,
236
+ authenticationLevel: acrLevel,
237
+ // OAuth provider info (normalized names)
238
+ oauthProvider: account.provider,
239
+ oauthProviderToken: account.access_token,
240
+ oauthProviderRefreshToken: account.refresh_token,
241
+ // Multi-tenant info
242
+ idpClientId: decoded?.client_id,
243
+ merchantId: decoded?.merchant_id,
244
+ };
245
+ }
246
+ else {
247
+ // IDP integration failed - create OAuth-only session
248
+ // This allows OAuth login to work even if IDP is unavailable
249
+ mfaVerified = true; // OAuth IS multi-factor (Google/Microsoft handle MFA)
250
+ sessionData = {
251
+ userId: account.providerAccountId,
252
+ email: user?.email || '',
253
+ name: user?.name || '',
254
+ roles: [],
255
+ mfaVerified: true, // OAuth IS multi-factor
256
+ oauthProvider: account.provider,
257
+ oauthProviderToken: account.access_token,
258
+ oauthProviderRefreshToken: account.refresh_token,
259
+ idpAccessTokenExpires: account.expires_at
260
+ ? account.expires_at * 1000
261
+ : Date.now() + 3600000,
262
+ };
263
+ }
264
+ // -------------------------------------------------------------------------
265
+ // ROLE MERGING: Fetch Vibe roles and merge with IDP roles
266
+ // -------------------------------------------------------------------------
267
+ const clientId = sessionData.idpClientId || process.env.IDP_CLIENT_ID || '';
268
+ if (clientId && sessionData.userId) {
269
+ const vibeRoles = await fetchVibeRoles(sessionData.userId, clientId);
270
+ // SECURITY: Filter out protected IDP-level role prefixes to prevent injection
271
+ const safeVibeRoles = vibeRoles.filter(r => !r.startsWith('payez_'));
272
+ const idpRoles = sessionData.roles || [];
273
+ sessionData.roles = mergeRoles(idpRoles, safeVibeRoles);
274
+ console.log('[JWT_CALLBACK] Merged roles:', {
275
+ idpRoles,
276
+ vibeRoles,
277
+ safeVibeRoles,
278
+ merged: sessionData.roles,
279
+ });
280
+ }
281
+ // Create Redis session
282
+ console.log('[JWT_CALLBACK] Creating Redis session for:', {
283
+ userId: sessionData.userId,
284
+ email: sessionData.email,
285
+ mfaVerified: sessionData.mfaVerified,
286
+ roles: sessionData.roles,
287
+ });
288
+ const redisSessionId = await (0, session_store_1.createSession)(sessionData);
289
+ console.log('[JWT_CALLBACK] Redis session created:', {
290
+ redisSessionId: redisSessionId ? redisSessionId.substring(0, 8) + '...' : 'NONE',
291
+ });
292
+ // Check if immediate MFA redirect is needed
293
+ const needsImmediateTwoFactor = !mfaVerified;
294
+ return {
295
+ ...token,
296
+ redisSessionId,
297
+ sub: sessionData.userId,
298
+ requiresTwoFactorRedirect: needsImmediateTwoFactor,
299
+ };
300
+ }
301
+ catch (error) {
302
+ console.error('[JWT_CALLBACK] handleOAuthSignIn FAILED:', error);
303
+ return { ...token, error: 'OAuthSignInFailed', sub: token.sub || 'unknown' };
304
+ }
305
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Session Callback
3
+ *
4
+ * Builds the NextAuth session from Redis session data.
5
+ * The JWT only contains redisSessionId - all user data comes from Redis.
6
+ *
7
+ * FLOW:
8
+ * 1. Extract redisSessionId from JWT token
9
+ * 2. Fetch session data from Redis
10
+ * 3. Build NextAuth session with user info
11
+ *
12
+ * @version 1.0.0
13
+ * @since auth-refactor-2026-01
14
+ */
15
+ import type { Session } from 'next-auth';
16
+ import type { JWT } from 'next-auth/jwt';
17
+ interface SessionCallbackParams {
18
+ session: Session;
19
+ token: JWT & {
20
+ /** Redis session ID - the key to look up session data */
21
+ redisSessionId?: string;
22
+ error?: string;
23
+ };
24
+ }
25
+ interface AppSessionUser {
26
+ id: string;
27
+ email: string;
28
+ name?: string;
29
+ roles: string[];
30
+ twoFactorSessionVerified: boolean;
31
+ requiresTwoFactor: boolean;
32
+ authenticationMethods?: string[];
33
+ authenticationLevel?: string;
34
+ mfaCompletedAt?: number;
35
+ mfaExpiresAt?: number;
36
+ mfaValidityHours?: number;
37
+ oauthProvider?: string;
38
+ idpClientId?: string;
39
+ merchantId?: string;
40
+ bearerKeyId?: string;
41
+ }
42
+ interface AppSession extends Omit<Session, 'user'> {
43
+ user: AppSessionUser;
44
+ sessionToken?: string;
45
+ accessToken?: string;
46
+ refreshToken?: string;
47
+ accessTokenExpires?: number;
48
+ error?: string;
49
+ }
50
+ /**
51
+ * Session callback - builds NextAuth session from Redis.
52
+ *
53
+ * This callback is called whenever getSession() or useSession() is used.
54
+ * It fetches the full session from Redis and exposes it to the client.
55
+ *
56
+ * @param params - Session callback parameters from NextAuth
57
+ * @returns AppSession with user data from Redis
58
+ */
59
+ export declare function sessionCallback({ session, token, }: SessionCallbackParams): Promise<AppSession>;
60
+ export {};