@payez/next-mvp 3.9.1 → 4.0.1

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 (526) hide show
  1. package/package.json +6 -18
  2. package/src/api/auth-handler.ts +550 -549
  3. package/src/api-handlers/account/change-password.ts +5 -8
  4. package/src/api-handlers/admin/analytics.ts +4 -6
  5. package/src/api-handlers/admin/audit.ts +5 -7
  6. package/src/api-handlers/admin/index.ts +1 -2
  7. package/src/api-handlers/admin/redis-sessions.ts +6 -8
  8. package/src/api-handlers/admin/sessions.ts +5 -7
  9. package/src/api-handlers/admin/site-logs.ts +8 -10
  10. package/src/api-handlers/admin/stats.ts +4 -6
  11. package/src/api-handlers/admin/users.ts +5 -7
  12. package/src/api-handlers/admin/vibe-data.ts +10 -12
  13. package/src/api-handlers/auth/refresh.ts +5 -7
  14. package/src/api-handlers/auth/signout.ts +5 -6
  15. package/src/api-handlers/auth/status.ts +4 -7
  16. package/src/api-handlers/auth/update-session.ts +123 -125
  17. package/src/api-handlers/auth/verify-code.ts +9 -13
  18. package/src/api-handlers/session/viability.ts +10 -47
  19. package/src/api-handlers/test/force-expire.ts +4 -11
  20. package/src/auth/auth-decision.ts +1 -1
  21. package/src/auth/better-auth.ts +138 -141
  22. package/src/auth/route-config.ts +219 -219
  23. package/src/auth/utils/token-utils.ts +0 -1
  24. package/src/client/AuthContext.tsx +6 -2
  25. package/src/client/fetch-with-auth.ts +47 -47
  26. package/src/components/SessionSync.tsx +6 -5
  27. package/src/components/account/MobileNavDrawer.tsx +3 -3
  28. package/src/components/account/UserAvatarMenu.tsx +6 -3
  29. package/src/components/admin/VibeAdminLayout.tsx +4 -2
  30. package/src/config/logger.ts +1 -1
  31. package/src/hooks/useAuth.ts +117 -115
  32. package/src/hooks/useAuthSettings.ts +2 -2
  33. package/src/hooks/useAvailableProviders.ts +9 -5
  34. package/src/hooks/useSessionExpiration.ts +101 -102
  35. package/src/hooks/useViabilitySession.ts +336 -335
  36. package/src/index.ts +60 -63
  37. package/src/lib/api-handler.ts +0 -1
  38. package/src/lib/app-slug.ts +6 -6
  39. package/src/lib/standardized-client-api.ts +901 -895
  40. package/src/lib/startup-init.ts +243 -247
  41. package/src/lib/test-aware-get-token.ts +22 -12
  42. package/src/lib/token-lifecycle.ts +12 -53
  43. package/src/pages/admin-login/page.tsx +9 -17
  44. package/src/pages/client-admin/ClientSiteAdminPage.tsx +4 -2
  45. package/src/pages/login/page.tsx +21 -28
  46. package/src/pages/showcase/ShowcasePage.tsx +4 -2
  47. package/src/pages/test-env/EmergencyLogoutPage.tsx +7 -6
  48. package/src/pages/test-env/JwtInspectPage.tsx +5 -3
  49. package/src/pages/test-env/RefreshTokenPage.tsx +157 -155
  50. package/src/pages/test-env/TestEnvPage.tsx +4 -2
  51. package/src/pages/verify-code/page.tsx +10 -6
  52. package/src/routes/auth/logout.ts +7 -25
  53. package/src/routes/auth/nextauth.ts +45 -71
  54. package/src/routes/auth/session.ts +25 -50
  55. package/src/routes/auth/viability.ts +7 -19
  56. package/src/server/auth.ts +60 -0
  57. package/src/stores/authStore.ts +1899 -1904
  58. package/src/utils/logout.ts +30 -30
  59. package/dist/api/auth-handler.d.ts +0 -67
  60. package/dist/api/auth-handler.js +0 -397
  61. package/dist/api/index.d.ts +0 -10
  62. package/dist/api/index.js +0 -19
  63. package/dist/api-handlers/account/change-password.d.ts +0 -9
  64. package/dist/api-handlers/account/change-password.js +0 -112
  65. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  66. package/dist/api-handlers/account/masked-info.js +0 -41
  67. package/dist/api-handlers/account/profile.d.ts +0 -3
  68. package/dist/api-handlers/account/profile.js +0 -63
  69. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  70. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  71. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  72. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  73. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  74. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  75. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  76. package/dist/api-handlers/account/reset-password.js +0 -26
  77. package/dist/api-handlers/account/send-code.d.ts +0 -24
  78. package/dist/api-handlers/account/send-code.js +0 -60
  79. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  80. package/dist/api-handlers/account/update-phone.js +0 -64
  81. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  82. package/dist/api-handlers/account/validate-password.js +0 -81
  83. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  84. package/dist/api-handlers/account/verify-email.js +0 -106
  85. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  86. package/dist/api-handlers/account/verify-sms.js +0 -106
  87. package/dist/api-handlers/admin/analytics.d.ts +0 -20
  88. package/dist/api-handlers/admin/analytics.js +0 -379
  89. package/dist/api-handlers/admin/audit.d.ts +0 -20
  90. package/dist/api-handlers/admin/audit.js +0 -214
  91. package/dist/api-handlers/admin/index.d.ts +0 -22
  92. package/dist/api-handlers/admin/index.js +0 -43
  93. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -36
  94. package/dist/api-handlers/admin/redis-sessions.js +0 -204
  95. package/dist/api-handlers/admin/sessions.d.ts +0 -21
  96. package/dist/api-handlers/admin/sessions.js +0 -284
  97. package/dist/api-handlers/admin/site-logs.d.ts +0 -46
  98. package/dist/api-handlers/admin/site-logs.js +0 -318
  99. package/dist/api-handlers/admin/stats.d.ts +0 -21
  100. package/dist/api-handlers/admin/stats.js +0 -240
  101. package/dist/api-handlers/admin/users.d.ts +0 -20
  102. package/dist/api-handlers/admin/users.js +0 -222
  103. package/dist/api-handlers/admin/vibe-data.d.ts +0 -80
  104. package/dist/api-handlers/admin/vibe-data.js +0 -268
  105. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  106. package/dist/api-handlers/anon/preferences.js +0 -96
  107. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  108. package/dist/api-handlers/auth/jwks.js +0 -24
  109. package/dist/api-handlers/auth/login.d.ts +0 -42
  110. package/dist/api-handlers/auth/login.js +0 -178
  111. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  112. package/dist/api-handlers/auth/refresh.js +0 -635
  113. package/dist/api-handlers/auth/signout.d.ts +0 -37
  114. package/dist/api-handlers/auth/signout.js +0 -187
  115. package/dist/api-handlers/auth/status.d.ts +0 -8
  116. package/dist/api-handlers/auth/status.js +0 -26
  117. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  118. package/dist/api-handlers/auth/update-session.js +0 -95
  119. package/dist/api-handlers/auth/validate.d.ts +0 -6
  120. package/dist/api-handlers/auth/validate.js +0 -43
  121. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  122. package/dist/api-handlers/auth/verify-code.js +0 -94
  123. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  124. package/dist/api-handlers/session/refresh-viability.js +0 -39
  125. package/dist/api-handlers/session/viability.d.ts +0 -13
  126. package/dist/api-handlers/session/viability.js +0 -146
  127. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  128. package/dist/api-handlers/test/force-expire.js +0 -65
  129. package/dist/auth/auth-decision.d.ts +0 -39
  130. package/dist/auth/auth-decision.js +0 -182
  131. package/dist/auth/auth-options.d.ts +0 -57
  132. package/dist/auth/auth-options.js +0 -213
  133. package/dist/auth/better-auth.d.ts +0 -82
  134. package/dist/auth/better-auth.js +0 -122
  135. package/dist/auth/callbacks/index.d.ts +0 -6
  136. package/dist/auth/callbacks/index.js +0 -12
  137. package/dist/auth/callbacks/jwt.d.ts +0 -45
  138. package/dist/auth/callbacks/jwt.js +0 -305
  139. package/dist/auth/callbacks/session.d.ts +0 -60
  140. package/dist/auth/callbacks/session.js +0 -170
  141. package/dist/auth/callbacks/signin.d.ts +0 -23
  142. package/dist/auth/callbacks/signin.js +0 -44
  143. package/dist/auth/events/index.d.ts +0 -4
  144. package/dist/auth/events/index.js +0 -8
  145. package/dist/auth/events/signout.d.ts +0 -17
  146. package/dist/auth/events/signout.js +0 -32
  147. package/dist/auth/providers/credentials.d.ts +0 -32
  148. package/dist/auth/providers/credentials.js +0 -223
  149. package/dist/auth/providers/index.d.ts +0 -5
  150. package/dist/auth/providers/index.js +0 -21
  151. package/dist/auth/providers/oauth.d.ts +0 -26
  152. package/dist/auth/providers/oauth.js +0 -105
  153. package/dist/auth/route-config.d.ts +0 -66
  154. package/dist/auth/route-config.js +0 -190
  155. package/dist/auth/types/auth-types.d.ts +0 -417
  156. package/dist/auth/types/auth-types.js +0 -53
  157. package/dist/auth/types/index.d.ts +0 -6
  158. package/dist/auth/types/index.js +0 -22
  159. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  160. package/dist/auth/unauthenticated-routes.js +0 -19
  161. package/dist/auth/utils/idp-client.d.ts +0 -94
  162. package/dist/auth/utils/idp-client.js +0 -384
  163. package/dist/auth/utils/index.d.ts +0 -5
  164. package/dist/auth/utils/index.js +0 -21
  165. package/dist/auth/utils/token-utils.d.ts +0 -84
  166. package/dist/auth/utils/token-utils.js +0 -219
  167. package/dist/client/AuthContext.d.ts +0 -19
  168. package/dist/client/AuthContext.js +0 -112
  169. package/dist/client/better-auth-client.d.ts +0 -1020
  170. package/dist/client/better-auth-client.js +0 -68
  171. package/dist/client/fetch-with-auth.d.ts +0 -11
  172. package/dist/client/fetch-with-auth.js +0 -44
  173. package/dist/client/fetchWithSession.d.ts +0 -3
  174. package/dist/client/fetchWithSession.js +0 -24
  175. package/dist/client/index.d.ts +0 -9
  176. package/dist/client/index.js +0 -20
  177. package/dist/client/useAnonSession.d.ts +0 -36
  178. package/dist/client/useAnonSession.js +0 -99
  179. package/dist/components/SessionSync.d.ts +0 -13
  180. package/dist/components/SessionSync.js +0 -119
  181. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  182. package/dist/components/SignalRHealthCheck.js +0 -97
  183. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  184. package/dist/components/account/MobileNavDrawer.js +0 -81
  185. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  186. package/dist/components/account/UserAvatarMenu.js +0 -88
  187. package/dist/components/account/index.d.ts +0 -9
  188. package/dist/components/account/index.js +0 -13
  189. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  190. package/dist/components/admin/AlertSettingsTab.js +0 -351
  191. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  192. package/dist/components/admin/AnalyticsTab.js +0 -167
  193. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  194. package/dist/components/admin/DataBrowserTab.js +0 -252
  195. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  196. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  197. package/dist/components/admin/SessionsTab.d.ts +0 -37
  198. package/dist/components/admin/SessionsTab.js +0 -165
  199. package/dist/components/admin/StatsTab.d.ts +0 -53
  200. package/dist/components/admin/StatsTab.js +0 -161
  201. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  202. package/dist/components/admin/VibeAdminContext.js +0 -38
  203. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  204. package/dist/components/admin/VibeAdminLayout.js +0 -69
  205. package/dist/components/admin/index.d.ts +0 -29
  206. package/dist/components/admin/index.js +0 -44
  207. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  208. package/dist/components/auth/FederatedAuthSection.js +0 -45
  209. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  210. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  211. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  212. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  213. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  214. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  215. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  216. package/dist/components/recovery/CompleteStep.js +0 -8
  217. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  218. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  219. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  220. package/dist/components/recovery/SelectMethodStep.js +0 -8
  221. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  222. package/dist/components/recovery/SetPasswordStep.js +0 -20
  223. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  224. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  225. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  226. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  227. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  228. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  229. package/dist/components/ui/BetaBadge.d.ts +0 -29
  230. package/dist/components/ui/BetaBadge.js +0 -38
  231. package/dist/components/ui/Footer.d.ts +0 -37
  232. package/dist/components/ui/Footer.js +0 -41
  233. package/dist/config/env.d.ts +0 -66
  234. package/dist/config/env.js +0 -57
  235. package/dist/config/logger.d.ts +0 -57
  236. package/dist/config/logger.js +0 -73
  237. package/dist/config/logging-config.d.ts +0 -30
  238. package/dist/config/logging-config.js +0 -122
  239. package/dist/config/unauthenticated-routes.d.ts +0 -17
  240. package/dist/config/unauthenticated-routes.js +0 -24
  241. package/dist/config/vibe-log-transport.d.ts +0 -81
  242. package/dist/config/vibe-log-transport.js +0 -212
  243. package/dist/edge/internal-api-url.d.ts +0 -53
  244. package/dist/edge/internal-api-url.js +0 -63
  245. package/dist/edge/middleware.d.ts +0 -14
  246. package/dist/edge/middleware.js +0 -32
  247. package/dist/hooks/useAuth.d.ts +0 -23
  248. package/dist/hooks/useAuth.js +0 -81
  249. package/dist/hooks/useAuthSettings.d.ts +0 -59
  250. package/dist/hooks/useAuthSettings.js +0 -93
  251. package/dist/hooks/useAvailableProviders.d.ts +0 -45
  252. package/dist/hooks/useAvailableProviders.js +0 -108
  253. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  254. package/dist/hooks/usePasswordValidation.js +0 -102
  255. package/dist/hooks/useProfile.d.ts +0 -15
  256. package/dist/hooks/useProfile.js +0 -59
  257. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  258. package/dist/hooks/usePublicAuthSettings.js +0 -131
  259. package/dist/hooks/useSessionExpiration.d.ts +0 -57
  260. package/dist/hooks/useSessionExpiration.js +0 -72
  261. package/dist/hooks/useViabilitySession.d.ts +0 -75
  262. package/dist/hooks/useViabilitySession.js +0 -268
  263. package/dist/index.d.ts +0 -12
  264. package/dist/index.js +0 -55
  265. package/dist/lib/anon-session.d.ts +0 -74
  266. package/dist/lib/anon-session.js +0 -169
  267. package/dist/lib/api-handler.d.ts +0 -123
  268. package/dist/lib/api-handler.js +0 -478
  269. package/dist/lib/app-slug.d.ts +0 -95
  270. package/dist/lib/app-slug.js +0 -172
  271. package/dist/lib/demo-mode.d.ts +0 -6
  272. package/dist/lib/demo-mode.js +0 -16
  273. package/dist/lib/geolocation.d.ts +0 -64
  274. package/dist/lib/geolocation.js +0 -235
  275. package/dist/lib/idp-client-config.d.ts +0 -75
  276. package/dist/lib/idp-client-config.js +0 -425
  277. package/dist/lib/idp-fetch.d.ts +0 -14
  278. package/dist/lib/idp-fetch.js +0 -91
  279. package/dist/lib/internal-api.d.ts +0 -87
  280. package/dist/lib/internal-api.js +0 -122
  281. package/dist/lib/jwt-decode-client.d.ts +0 -10
  282. package/dist/lib/jwt-decode-client.js +0 -46
  283. package/dist/lib/jwt-decode.d.ts +0 -48
  284. package/dist/lib/jwt-decode.js +0 -57
  285. package/dist/lib/nextauth-secret.d.ts +0 -10
  286. package/dist/lib/nextauth-secret.js +0 -100
  287. package/dist/lib/rate-limit-service.d.ts +0 -23
  288. package/dist/lib/rate-limit-service.js +0 -6
  289. package/dist/lib/redis.d.ts +0 -5
  290. package/dist/lib/redis.js +0 -28
  291. package/dist/lib/refresh-token-validator.d.ts +0 -13
  292. package/dist/lib/refresh-token-validator.js +0 -117
  293. package/dist/lib/roles.d.ts +0 -145
  294. package/dist/lib/roles.js +0 -168
  295. package/dist/lib/secret-validation.d.ts +0 -4
  296. package/dist/lib/secret-validation.js +0 -14
  297. package/dist/lib/session-store.d.ts +0 -170
  298. package/dist/lib/session-store.js +0 -545
  299. package/dist/lib/session.d.ts +0 -21
  300. package/dist/lib/session.js +0 -26
  301. package/dist/lib/site-logger.d.ts +0 -214
  302. package/dist/lib/site-logger.js +0 -210
  303. package/dist/lib/standardized-client-api.d.ts +0 -161
  304. package/dist/lib/standardized-client-api.js +0 -786
  305. package/dist/lib/startup-init.d.ts +0 -40
  306. package/dist/lib/startup-init.js +0 -261
  307. package/dist/lib/test-aware-get-token.d.ts +0 -2
  308. package/dist/lib/test-aware-get-token.js +0 -81
  309. package/dist/lib/token-expiry.d.ts +0 -14
  310. package/dist/lib/token-expiry.js +0 -39
  311. package/dist/lib/token-lifecycle.d.ts +0 -52
  312. package/dist/lib/token-lifecycle.js +0 -398
  313. package/dist/lib/types/api-responses.d.ts +0 -128
  314. package/dist/lib/types/api-responses.js +0 -171
  315. package/dist/lib/user-agent-parser.d.ts +0 -50
  316. package/dist/lib/user-agent-parser.js +0 -220
  317. package/dist/logging/api/admin-analytics.d.ts +0 -3
  318. package/dist/logging/api/admin-analytics.js +0 -45
  319. package/dist/logging/api/audit-log.d.ts +0 -3
  320. package/dist/logging/api/audit-log.js +0 -52
  321. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  322. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  323. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  324. package/dist/logging/components/AuditLogViewer.js +0 -51
  325. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  326. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  327. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  328. package/dist/logging/components/HealthMetricsCard.js +0 -19
  329. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  330. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  331. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  332. package/dist/logging/hooks/useAuditLog.js +0 -25
  333. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  334. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  335. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  336. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  337. package/dist/logging/index.d.ts +0 -11
  338. package/dist/logging/index.js +0 -40
  339. package/dist/logging/types/analytics.d.ts +0 -68
  340. package/dist/logging/types/analytics.js +0 -3
  341. package/dist/logging/types/audit.d.ts +0 -29
  342. package/dist/logging/types/audit.js +0 -2
  343. package/dist/logging/types/index.d.ts +0 -2
  344. package/dist/logging/types/index.js +0 -19
  345. package/dist/middleware/auth-decision.d.ts +0 -33
  346. package/dist/middleware/auth-decision.js +0 -65
  347. package/dist/middleware/create-middleware.d.ts +0 -102
  348. package/dist/middleware/create-middleware.js +0 -469
  349. package/dist/middleware/rbac-check.d.ts +0 -51
  350. package/dist/middleware/rbac-check.js +0 -219
  351. package/dist/middleware/twofa-presets.d.ts +0 -134
  352. package/dist/middleware/twofa-presets.js +0 -175
  353. package/dist/models/DecodedAccessToken.d.ts +0 -17
  354. package/dist/models/DecodedAccessToken.js +0 -2
  355. package/dist/models/SessionModel.d.ts +0 -122
  356. package/dist/models/SessionModel.js +0 -136
  357. package/dist/pages/admin-login/page.d.ts +0 -31
  358. package/dist/pages/admin-login/page.js +0 -83
  359. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  360. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  361. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  362. package/dist/pages/admin-page-permissions/index.js +0 -13
  363. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  364. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  365. package/dist/pages/admin-roles/index.d.ts +0 -8
  366. package/dist/pages/admin-roles/index.js +0 -15
  367. package/dist/pages/admin-roles/modals.d.ts +0 -72
  368. package/dist/pages/admin-roles/modals.js +0 -154
  369. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  370. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -177
  371. package/dist/pages/client-admin/index.d.ts +0 -32
  372. package/dist/pages/client-admin/index.js +0 -37
  373. package/dist/pages/coming-soon/page.d.ts +0 -8
  374. package/dist/pages/coming-soon/page.js +0 -28
  375. package/dist/pages/login/page.d.ts +0 -22
  376. package/dist/pages/login/page.js +0 -239
  377. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  378. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  379. package/dist/pages/profile/index.d.ts +0 -8
  380. package/dist/pages/profile/index.js +0 -16
  381. package/dist/pages/profile/page.d.ts +0 -19
  382. package/dist/pages/profile/page.js +0 -47
  383. package/dist/pages/profile/profile-patch.d.ts +0 -1
  384. package/dist/pages/profile/profile-patch.js +0 -281
  385. package/dist/pages/recovery/page.d.ts +0 -1
  386. package/dist/pages/recovery/page.js +0 -142
  387. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  388. package/dist/pages/roles/MyRolesPage.js +0 -71
  389. package/dist/pages/roles/components.d.ts +0 -63
  390. package/dist/pages/roles/components.js +0 -108
  391. package/dist/pages/roles/index.d.ts +0 -8
  392. package/dist/pages/roles/index.js +0 -19
  393. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  394. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  395. package/dist/pages/security/index.d.ts +0 -8
  396. package/dist/pages/security/index.js +0 -16
  397. package/dist/pages/security/page.d.ts +0 -21
  398. package/dist/pages/security/page.js +0 -212
  399. package/dist/pages/security/security-patch.d.ts +0 -1
  400. package/dist/pages/security/security-patch.js +0 -302
  401. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  402. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  403. package/dist/pages/settings/index.d.ts +0 -8
  404. package/dist/pages/settings/index.js +0 -16
  405. package/dist/pages/settings/page.d.ts +0 -7
  406. package/dist/pages/settings/page.js +0 -26
  407. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  408. package/dist/pages/showcase/ShowcasePage.js +0 -140
  409. package/dist/pages/showcase/index.d.ts +0 -12
  410. package/dist/pages/showcase/index.js +0 -17
  411. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  412. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -98
  413. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  414. package/dist/pages/test-env/JwtInspectPage.js +0 -114
  415. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  416. package/dist/pages/test-env/RefreshTokenPage.js +0 -91
  417. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  418. package/dist/pages/test-env/TestEnvPage.js +0 -49
  419. package/dist/pages/test-env/index.d.ts +0 -24
  420. package/dist/pages/test-env/index.js +0 -32
  421. package/dist/pages/verify-code/page.d.ts +0 -30
  422. package/dist/pages/verify-code/page.js +0 -408
  423. package/dist/routes/account/index.d.ts +0 -28
  424. package/dist/routes/account/index.js +0 -71
  425. package/dist/routes/account/masked-info.d.ts +0 -33
  426. package/dist/routes/account/masked-info.js +0 -39
  427. package/dist/routes/account/send-code.d.ts +0 -37
  428. package/dist/routes/account/send-code.js +0 -42
  429. package/dist/routes/account/update-phone.d.ts +0 -13
  430. package/dist/routes/account/update-phone.js +0 -17
  431. package/dist/routes/account/verify-email.d.ts +0 -38
  432. package/dist/routes/account/verify-email.js +0 -43
  433. package/dist/routes/account/verify-sms.d.ts +0 -38
  434. package/dist/routes/account/verify-sms.js +0 -43
  435. package/dist/routes/auth/index.d.ts +0 -19
  436. package/dist/routes/auth/index.js +0 -64
  437. package/dist/routes/auth/logout.d.ts +0 -31
  438. package/dist/routes/auth/logout.js +0 -113
  439. package/dist/routes/auth/nextauth.d.ts +0 -19
  440. package/dist/routes/auth/nextauth.js +0 -72
  441. package/dist/routes/auth/refresh.d.ts +0 -30
  442. package/dist/routes/auth/refresh.js +0 -51
  443. package/dist/routes/auth/session.d.ts +0 -43
  444. package/dist/routes/auth/session.js +0 -179
  445. package/dist/routes/auth/settings.d.ts +0 -25
  446. package/dist/routes/auth/settings.js +0 -55
  447. package/dist/routes/auth/viability.d.ts +0 -52
  448. package/dist/routes/auth/viability.js +0 -201
  449. package/dist/routes/index.d.ts +0 -12
  450. package/dist/routes/index.js +0 -54
  451. package/dist/routes/session/index.d.ts +0 -6
  452. package/dist/routes/session/index.js +0 -10
  453. package/dist/routes/session/refresh-viability.d.ts +0 -16
  454. package/dist/routes/session/refresh-viability.js +0 -20
  455. package/dist/server/auth-guard.d.ts +0 -46
  456. package/dist/server/auth-guard.js +0 -128
  457. package/dist/server/decode-session.d.ts +0 -30
  458. package/dist/server/decode-session.js +0 -78
  459. package/dist/server/slim-middleware.d.ts +0 -23
  460. package/dist/server/slim-middleware.js +0 -89
  461. package/dist/server/with-auth.d.ts +0 -33
  462. package/dist/server/with-auth.js +0 -59
  463. package/dist/services/signalrActivityService.d.ts +0 -44
  464. package/dist/services/signalrActivityService.js +0 -257
  465. package/dist/stores/authStore.d.ts +0 -154
  466. package/dist/stores/authStore.js +0 -1531
  467. package/dist/theme/ThemeProvider.d.ts +0 -14
  468. package/dist/theme/ThemeProvider.js +0 -28
  469. package/dist/theme/default.d.ts +0 -8
  470. package/dist/theme/default.js +0 -33
  471. package/dist/theme/index.d.ts +0 -15
  472. package/dist/theme/index.js +0 -25
  473. package/dist/theme/types.d.ts +0 -56
  474. package/dist/theme/types.js +0 -8
  475. package/dist/theme/useTheme.d.ts +0 -60
  476. package/dist/theme/useTheme.js +0 -63
  477. package/dist/theme/utils.d.ts +0 -13
  478. package/dist/theme/utils.js +0 -39
  479. package/dist/types/api.d.ts +0 -134
  480. package/dist/types/api.js +0 -44
  481. package/dist/types/auth.d.ts +0 -19
  482. package/dist/types/auth.js +0 -2
  483. package/dist/types/logging.d.ts +0 -42
  484. package/dist/types/logging.js +0 -2
  485. package/dist/types/recovery.d.ts +0 -48
  486. package/dist/types/recovery.js +0 -2
  487. package/dist/types/security.d.ts +0 -1
  488. package/dist/types/security.js +0 -2
  489. package/dist/utils/api.d.ts +0 -85
  490. package/dist/utils/api.js +0 -287
  491. package/dist/utils/circuitBreaker.d.ts +0 -43
  492. package/dist/utils/circuitBreaker.js +0 -91
  493. package/dist/utils/error-message.d.ts +0 -1
  494. package/dist/utils/error-message.js +0 -103
  495. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  496. package/dist/utils/layout/reservedSpace.js +0 -102
  497. package/dist/utils/logout.d.ts +0 -14
  498. package/dist/utils/logout.js +0 -32
  499. package/dist/vibe/client.d.ts +0 -261
  500. package/dist/vibe/client.js +0 -445
  501. package/dist/vibe/enterprise-auth.d.ts +0 -106
  502. package/dist/vibe/enterprise-auth.js +0 -173
  503. package/dist/vibe/errors.d.ts +0 -83
  504. package/dist/vibe/errors.js +0 -146
  505. package/dist/vibe/generic.d.ts +0 -234
  506. package/dist/vibe/generic.js +0 -369
  507. package/dist/vibe/hooks/index.d.ts +0 -169
  508. package/dist/vibe/hooks/index.js +0 -252
  509. package/dist/vibe/index.d.ts +0 -25
  510. package/dist/vibe/index.js +0 -72
  511. package/dist/vibe/sessions.d.ts +0 -161
  512. package/dist/vibe/sessions.js +0 -391
  513. package/dist/vibe/types.d.ts +0 -353
  514. package/dist/vibe/types.js +0 -315
  515. package/src/auth/auth-options.ts +0 -237
  516. package/src/auth/callbacks/index.ts +0 -7
  517. package/src/auth/callbacks/jwt.ts +0 -382
  518. package/src/auth/callbacks/session.ts +0 -243
  519. package/src/auth/callbacks/signin.ts +0 -56
  520. package/src/auth/events/index.ts +0 -5
  521. package/src/auth/events/signout.ts +0 -33
  522. package/src/auth/providers/credentials.ts +0 -256
  523. package/src/auth/providers/index.ts +0 -6
  524. package/src/auth/providers/oauth.ts +0 -114
  525. package/src/lib/nextauth-secret.ts +0 -121
  526. package/src/types/next-auth.d.ts +0 -15
@@ -1,68 +0,0 @@
1
- "use strict";
2
- /**
3
- * Better Auth Client (Phase 3)
4
- *
5
- * Drop-in replacement for next-auth/react hooks and functions.
6
- * Import from '@payez/next-mvp/client/better-auth-client'.
7
- *
8
- * Includes useSessionCompat() — returns NextAuth-shaped { data, status }
9
- * so existing components don't need destructure pattern changes.
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.signOut = exports.signIn = exports.useSession = exports.authClient = void 0;
13
- exports.useSessionCompat = useSessionCompat;
14
- exports.signOutCompat = signOutCompat;
15
- const react_1 = require("better-auth/react");
16
- const react_2 = require("react");
17
- exports.authClient = (0, react_1.createAuthClient)({
18
- // baseURL derived from BETTER_AUTH_URL or window.location.origin
19
- });
20
- // Convenience exports
21
- exports.useSession = exports.authClient.useSession, exports.signIn = exports.authClient.signIn, exports.signOut = exports.authClient.signOut;
22
- /**
23
- * NextAuth-compatible useSession wrapper.
24
- *
25
- * Maps Better Auth's { data, error, isPending } to NextAuth's { data, status, update }.
26
- * Drop-in replacement — no destructure changes needed in consuming components.
27
- */
28
- function useSessionCompat() {
29
- const baSession = exports.authClient.useSession();
30
- const status = (0, react_2.useMemo)(() => {
31
- if (baSession.isPending)
32
- return 'loading';
33
- if (baSession.data)
34
- return 'authenticated';
35
- return 'unauthenticated';
36
- }, [baSession.isPending, baSession.data]);
37
- // Map Better Auth session shape to NextAuth session shape
38
- const data = (0, react_2.useMemo)(() => {
39
- if (!baSession.data)
40
- return null;
41
- return {
42
- ...baSession.data,
43
- user: baSession.data.user,
44
- expires: '', // Better Auth handles expiry differently
45
- };
46
- }, [baSession.data]);
47
- return {
48
- data,
49
- status,
50
- update: async () => {
51
- // Better Auth doesn't have a direct "refresh session" call.
52
- // Force refetch by invalidating the query.
53
- // TODO: Wire to proper session refresh when available.
54
- return data;
55
- },
56
- };
57
- }
58
- /**
59
- * NextAuth-compatible signOut wrapper.
60
- *
61
- * Maps NextAuth signOut({ redirect, callbackUrl }) to Better Auth.
62
- */
63
- async function signOutCompat(options) {
64
- await exports.authClient.signOut();
65
- if (options?.redirect !== false && options?.callbackUrl) {
66
- window.location.href = options.callbackUrl;
67
- }
68
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * A wrapper for the `fetch` API that automatically injects the session's
3
- * accessToken into the Authorization header and handles 401 Unauthorized
4
- * responses by redirecting the user to the login page.
5
- *
6
- * @param url The URL to fetch.
7
- * @param options The standard `fetch` options.
8
- * @returns A `Promise` that resolves to the `Response` object.
9
- * @throws An 'UNAUTHORIZED_REDIRECT' error after initiating the redirect to halt further execution.
10
- */
11
- export declare function fetchWithAuth(url: string, options?: RequestInit): Promise<Response>;
@@ -1,44 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchWithAuth = fetchWithAuth;
4
- // src/client/fetch-with-auth.ts
5
- const react_1 = require("next-auth/react");
6
- /**
7
- * A wrapper for the `fetch` API that automatically injects the session's
8
- * accessToken into the Authorization header and handles 401 Unauthorized
9
- * responses by redirecting the user to the login page.
10
- *
11
- * @param url The URL to fetch.
12
- * @param options The standard `fetch` options.
13
- * @returns A `Promise` that resolves to the `Response` object.
14
- * @throws An 'UNAUTHORIZED_REDIRECT' error after initiating the redirect to halt further execution.
15
- */
16
- async function fetchWithAuth(url, options = {}) {
17
- // 1. Retrieve the client-side session to get the accessToken.
18
- const session = await (0, react_1.getSession)();
19
- // 2. Inject the accessToken into the Authorization header.
20
- const headers = new Headers(options.headers);
21
- if (session?.accessToken) {
22
- headers.set('Authorization', `Bearer ${session.accessToken}`);
23
- }
24
- options.headers = headers;
25
- const response = await fetch(url, options);
26
- // 3. Handle the 401 response intelligently.
27
- if (response.status === 401) {
28
- // If we have a valid session, this is likely a claim/permission error, not an auth error
29
- if (session?.accessToken) {
30
- console.warn('API returned 401 despite valid session. Likely insufficient claims or permissions.');
31
- // Don't redirect - let the calling code handle the error gracefully
32
- return response;
33
- }
34
- // No valid session - this is a real authentication failure
35
- console.error('Unauthorized API call (no valid session). Redirecting to login.');
36
- // SAFEGUARD: Never use auth pages as callback URLs to prevent redirect loops
37
- const pathname = window.location.pathname;
38
- const safeCallbackUrl = pathname.startsWith('/account-auth/') ? '/' : pathname;
39
- window.location.href = `/account-auth/login?callbackUrl=${encodeURIComponent(safeCallbackUrl)}`;
40
- // Throw a specific error to signal that a redirect has been initiated.
41
- throw new Error('UNAUTHORIZED_REDIRECT');
42
- }
43
- return response;
44
- }
@@ -1,3 +0,0 @@
1
- export declare function fetchWithSession(input: RequestInfo | URL, init?: RequestInit, opts?: {
2
- retry?: number;
3
- }): Promise<Response>;
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchWithSession = fetchWithSession;
4
- async function fetchWithSession(input, init = {}, opts = {}) {
5
- const retry = opts.retry ?? 1;
6
- const doFetch = async () => {
7
- const res = await fetch(input, { ...init, credentials: 'include' });
8
- if (res.ok)
9
- return res;
10
- if (res.status === 401 && retry > 0) {
11
- const rf = await fetch('/api/auth/refresh', { method: 'POST', headers: { 'Accept': 'application/json' }, credentials: 'include' });
12
- if (rf.ok)
13
- return fetchWithSession(input, init, { retry: retry - 1 });
14
- }
15
- if ((res.status === 409 || res.status === 503) && retry > 0) {
16
- const retryAfter = res.headers.get('Retry-After');
17
- const waitMs = retryAfter ? parseInt(retryAfter) * 1000 : 1000;
18
- await new Promise(r => setTimeout(r, Math.min(waitMs, 3000)));
19
- return fetchWithSession(input, init, { retry: retry - 1 });
20
- }
21
- return res;
22
- };
23
- return doFetch();
24
- }
@@ -1,9 +0,0 @@
1
- /**
2
- * Client-Side Exports
3
- *
4
- * This module exports only client-safe code for use in browser environments.
5
- * Server-only utilities and Node.js dependencies are excluded.
6
- */
7
- export { fetchWithAuth } from './fetch-with-auth';
8
- export { AuthProvider, useAuthConfig, useAuthMode, useFederatedProviders, useFederatedAuthEnabled, useTraditionalAuthEnabled } from './AuthContext';
9
- export type { AuthConfig } from '../types/auth';
@@ -1,20 +0,0 @@
1
- "use strict";
2
- /**
3
- * Client-Side Exports
4
- *
5
- * This module exports only client-safe code for use in browser environments.
6
- * Server-only utilities and Node.js dependencies are excluded.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.useTraditionalAuthEnabled = exports.useFederatedAuthEnabled = exports.useFederatedProviders = exports.useAuthMode = exports.useAuthConfig = exports.AuthProvider = exports.fetchWithAuth = void 0;
10
- // Client-side fetch utility
11
- var fetch_with_auth_1 = require("./fetch-with-auth");
12
- Object.defineProperty(exports, "fetchWithAuth", { enumerable: true, get: function () { return fetch_with_auth_1.fetchWithAuth; } });
13
- // Authentication context and hooks
14
- var AuthContext_1 = require("./AuthContext");
15
- Object.defineProperty(exports, "AuthProvider", { enumerable: true, get: function () { return AuthContext_1.AuthProvider; } });
16
- Object.defineProperty(exports, "useAuthConfig", { enumerable: true, get: function () { return AuthContext_1.useAuthConfig; } });
17
- Object.defineProperty(exports, "useAuthMode", { enumerable: true, get: function () { return AuthContext_1.useAuthMode; } });
18
- Object.defineProperty(exports, "useFederatedProviders", { enumerable: true, get: function () { return AuthContext_1.useFederatedProviders; } });
19
- Object.defineProperty(exports, "useFederatedAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useFederatedAuthEnabled; } });
20
- Object.defineProperty(exports, "useTraditionalAuthEnabled", { enumerable: true, get: function () { return AuthContext_1.useTraditionalAuthEnabled; } });
@@ -1,36 +0,0 @@
1
- /**
2
- * useAnonSession - React hook for anonymous session management
3
- *
4
- * Provides access to anonymous session preferences stored in Redis.
5
- * Works before user logs in, preferences persist across visits.
6
- */
7
- export interface AnonPreferences {
8
- theme?: string;
9
- locale?: string;
10
- [key: string]: any;
11
- }
12
- export interface AnonMetrics {
13
- resumeGenerationCount?: number;
14
- firstVisit?: number;
15
- lastVisit?: number;
16
- visitCount?: number;
17
- [key: string]: any;
18
- }
19
- export interface AnonSession {
20
- id: string;
21
- preferences: AnonPreferences;
22
- metrics: AnonMetrics;
23
- }
24
- export interface UseAnonSessionReturn {
25
- session: AnonSession | null;
26
- isLoading: boolean;
27
- error: string | null;
28
- updatePreferences: (preferences: Partial<AnonPreferences>) => Promise<void>;
29
- setTheme: (theme: string) => Promise<void>;
30
- refresh: () => Promise<void>;
31
- }
32
- /**
33
- * Hook to manage anonymous session state
34
- */
35
- export declare function useAnonSession(): UseAnonSessionReturn;
36
- export default useAnonSession;
@@ -1,99 +0,0 @@
1
- "use strict";
2
- /**
3
- * useAnonSession - React hook for anonymous session management
4
- *
5
- * Provides access to anonymous session preferences stored in Redis.
6
- * Works before user logs in, preferences persist across visits.
7
- */
8
- 'use client';
9
- /**
10
- * useAnonSession - React hook for anonymous session management
11
- *
12
- * Provides access to anonymous session preferences stored in Redis.
13
- * Works before user logs in, preferences persist across visits.
14
- */
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.useAnonSession = useAnonSession;
17
- const react_1 = require("react");
18
- /**
19
- * Hook to manage anonymous session state
20
- */
21
- function useAnonSession() {
22
- const [session, setSession] = (0, react_1.useState)(null);
23
- const [isLoading, setIsLoading] = (0, react_1.useState)(true);
24
- const [error, setError] = (0, react_1.useState)(null);
25
- // Fetch session on mount
26
- const fetchSession = (0, react_1.useCallback)(async () => {
27
- try {
28
- setIsLoading(true);
29
- setError(null);
30
- const response = await fetch('/api/anon/preferences', {
31
- method: 'GET',
32
- credentials: 'include', // Important for cookies
33
- });
34
- if (!response.ok) {
35
- throw new Error('Failed to fetch preferences');
36
- }
37
- const data = await response.json();
38
- if (data.success && data.data) {
39
- setSession({
40
- id: data.data.id,
41
- preferences: data.data.preferences || {},
42
- metrics: data.data.metrics || {},
43
- });
44
- }
45
- }
46
- catch (err) {
47
- console.error('[useAnonSession] Error fetching session:', err);
48
- setError(err instanceof Error ? err.message : 'Unknown error');
49
- }
50
- finally {
51
- setIsLoading(false);
52
- }
53
- }, []);
54
- (0, react_1.useEffect)(() => {
55
- fetchSession();
56
- }, [fetchSession]);
57
- // Update preferences
58
- const updatePreferences = (0, react_1.useCallback)(async (preferences) => {
59
- try {
60
- setError(null);
61
- const response = await fetch('/api/anon/preferences', {
62
- method: 'POST',
63
- credentials: 'include',
64
- headers: {
65
- 'Content-Type': 'application/json',
66
- },
67
- body: JSON.stringify({ preferences }),
68
- });
69
- if (!response.ok) {
70
- throw new Error('Failed to update preferences');
71
- }
72
- const data = await response.json();
73
- if (data.success && data.data) {
74
- setSession(prev => prev ? {
75
- ...prev,
76
- preferences: data.data.preferences,
77
- } : null);
78
- }
79
- }
80
- catch (err) {
81
- console.error('[useAnonSession] Error updating preferences:', err);
82
- setError(err instanceof Error ? err.message : 'Unknown error');
83
- throw err;
84
- }
85
- }, []);
86
- // Convenience method to set theme
87
- const setTheme = (0, react_1.useCallback)(async (theme) => {
88
- await updatePreferences({ theme });
89
- }, [updatePreferences]);
90
- return {
91
- session,
92
- isLoading,
93
- error,
94
- updatePreferences,
95
- setTheme,
96
- refresh: fetchSession,
97
- };
98
- }
99
- exports.default = useAnonSession;
@@ -1,13 +0,0 @@
1
- /**
2
- * SessionSync - Bridges NextAuth session with Zustand auth store
3
- *
4
- * CRITICAL: This component enforces strict session validation. If NextAuth
5
- * reports an authenticated status but the session data is invalid (empty user ID,
6
- * empty email, or missing access token), it forces a sign-out to prevent
7
- * contradictory state like "hasSession: true, userId: ''"
8
- *
9
- * This ensures the app NEVER shows authenticated UI with empty/invalid session data.
10
- */
11
- export declare function SessionSync({ children }: {
12
- children: React.ReactNode;
13
- }): import("react/jsx-runtime").JSX.Element;
@@ -1,119 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.SessionSync = SessionSync;
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const react_1 = require("react");
7
- const react_2 = require("next-auth/react");
8
- const authStore_1 = require("../stores/authStore");
9
- const session_1 = require("../lib/session");
10
- const app_slug_1 = require("../lib/app-slug");
11
- /**
12
- * Sanitize sensitive data for logging
13
- * Never log full user IDs or emails in any environment
14
- */
15
- function sanitizeForLog(value, type) {
16
- if (!value)
17
- return '(empty)';
18
- if (type === 'email') {
19
- return '***@***'; // Never log emails
20
- }
21
- if (type === 'userId') {
22
- // Only show first 8 chars in development
23
- if (process.env.NODE_ENV === 'development') {
24
- return value.substring(0, 8) + '...';
25
- }
26
- return '***'; // Fully redact in production
27
- }
28
- return '***';
29
- }
30
- /**
31
- * SessionSync - Bridges NextAuth session with Zustand auth store
32
- *
33
- * CRITICAL: This component enforces strict session validation. If NextAuth
34
- * reports an authenticated status but the session data is invalid (empty user ID,
35
- * empty email, or missing access token), it forces a sign-out to prevent
36
- * contradictory state like "hasSession: true, userId: ''"
37
- *
38
- * This ensures the app NEVER shows authenticated UI with empty/invalid session data.
39
- */
40
- function SessionSync({ children }) {
41
- const { data: session, status } = (0, react_2.useSession)();
42
- const { setSession, clearSession } = (0, authStore_1.useAuthStore)();
43
- // Guard against duplicate sign-out calls
44
- const isSigningOutRef = (0, react_1.useRef)(false);
45
- (0, react_1.useEffect)(() => {
46
- let isMounted = true;
47
- // Only process when NextAuth has finished loading
48
- if (status === 'loading') {
49
- return;
50
- }
51
- // Strict validation: Check if session is actually valid
52
- const isValid = (0, session_1.isValidSession)(session);
53
- // CRITICAL FIX: If NextAuth says "authenticated" but session is invalid,
54
- // this is a broken state that must be fixed immediately
55
- if (status === 'authenticated' && !isValid) {
56
- // GUARD: Prevent duplicate sign-out
57
- if (isSigningOutRef.current) {
58
- console.warn('[SessionSync] Sign-out already in progress, skipping');
59
- return;
60
- }
61
- isSigningOutRef.current = true;
62
- console.error('[SessionSync] CRITICAL: Invalid session detected despite authenticated status!');
63
- console.error('[SessionSync] This indicates a session with empty user data - forcing sign-out');
64
- // Log diagnostic info with PII redaction
65
- // Note: session is typed as Session | null from NextAuth, but may have invalid/partial data
66
- const sessionData = session; // Explicit cast needed for error logging
67
- console.error('[SessionSync] Session data:', {
68
- hasSessionObject: !!sessionData,
69
- hasUser: !!sessionData?.user,
70
- userId: sanitizeForLog(sessionData?.user?.id, 'userId'),
71
- userEmail: sanitizeForLog(sessionData?.user?.email, 'email'),
72
- hasAccessToken: !!sessionData?.accessToken,
73
- });
74
- // Clear the auth store immediately
75
- clearSession();
76
- // FIX: Force clear all auth cookies including stale provisional tokens (app-slug prefixed)
77
- // This prevents infinite loop when provisional token exists but session is invalid
78
- // Root cause: OAuth creates provisional token before Redis session exists
79
- try {
80
- const secureSession = (0, app_slug_1.getSecureSessionCookieName)();
81
- const secureCsrf = (0, app_slug_1.getSecureCsrfCookieName)();
82
- const callbackUrl = (0, app_slug_1.getCallbackUrlCookieName)();
83
- document.cookie = `${secureSession}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC; Secure; SameSite=Lax`;
84
- document.cookie = `${secureCsrf}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC; SameSite=Lax`;
85
- document.cookie = `__Secure-${callbackUrl}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC; Secure; SameSite=Lax`;
86
- }
87
- catch (e) {
88
- // Cookie clearing failed - non-critical, continue with signout
89
- }
90
- // Force NextAuth to sign out (this will clear cookies and trigger redirect)
91
- (0, react_2.signOut)({ redirect: false })
92
- .then(() => {
93
- if (isMounted) {
94
- // Use generic error code instead of implementation details
95
- window.location.href = '/account-auth/login?error=SessionExpired&code=1001';
96
- }
97
- })
98
- .catch((err) => {
99
- console.error('[SessionSync] Error during forced signout:', err);
100
- if (isMounted) {
101
- window.location.href = '/account-auth/login?error=SessionExpired&code=1001';
102
- }
103
- });
104
- return;
105
- }
106
- // Normal flow: Update store based on valid session status
107
- if (status === 'authenticated' && isValid) {
108
- setSession(session);
109
- }
110
- else if (status === 'unauthenticated') {
111
- clearSession();
112
- }
113
- // Cleanup function to prevent post-unmount updates
114
- return () => {
115
- isMounted = false;
116
- };
117
- }, [session, status, setSession, clearSession]);
118
- return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children });
119
- }
@@ -1,10 +0,0 @@
1
- interface SignalRHealthCheckProps {
2
- className?: string;
3
- idpBaseUrl: string;
4
- }
5
- /**
6
- * Simple health check component using SignalR connection state
7
- * Following Occam's Razor: Connection alive = Service healthy, Connection dead = Service unhealthy
8
- */
9
- export default function SignalRHealthCheck({ className, idpBaseUrl }: SignalRHealthCheckProps): import("react/jsx-runtime").JSX.Element | null;
10
- export {};
@@ -1,97 +0,0 @@
1
- "use strict";
2
- 'use client';
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.default = SignalRHealthCheck;
5
- const jsx_runtime_1 = require("react/jsx-runtime");
6
- const react_1 = require("react");
7
- const signalrActivityService_1 = require("../services/signalrActivityService");
8
- /**
9
- * Simple health check component using SignalR connection state
10
- * Following Occam's Razor: Connection alive = Service healthy, Connection dead = Service unhealthy
11
- */
12
- function SignalRHealthCheck({ className = '', idpBaseUrl }) {
13
- // Allow disabling via env for noisy environments (e.g., production demos)
14
- if (process.env.NEXT_PUBLIC_DISABLE_HEALTH_MONITOR === 'true') {
15
- return null;
16
- }
17
- const [healthStatus, setHealthStatus] = (0, react_1.useState)({
18
- isHealthy: false,
19
- message: 'Initializing...',
20
- lastHeartbeat: null,
21
- connectionId: null
22
- });
23
- const [isInitializing, setIsInitializing] = (0, react_1.useState)(true);
24
- (0, react_1.useEffect)(() => {
25
- let unsubscribe = null;
26
- const initializeHealthService = async () => {
27
- try {
28
- // Subscribe to health status changes
29
- unsubscribe = signalrActivityService_1.signalRActivityService.subscribe((status) => {
30
- setHealthStatus(status);
31
- setIsInitializing(false);
32
- });
33
- // Start the health monitoring
34
- await signalrActivityService_1.signalRActivityService.start(idpBaseUrl);
35
- }
36
- catch (error) {
37
- // Handle service unavailable gracefully without console spam
38
- const errorMessage = error instanceof Error ? error.message : String(error);
39
- const isServiceDown = errorMessage.includes('ERR_CONNECTION_REFUSED') ||
40
- errorMessage.includes('Failed to fetch');
41
- if (isServiceDown) {
42
- console.info('Health monitoring: Backend service unavailable');
43
- setHealthStatus({
44
- isHealthy: false,
45
- message: 'Backend service offline',
46
- lastHeartbeat: null,
47
- connectionId: null
48
- });
49
- }
50
- else {
51
- console.error('Failed to initialize SignalR health service:', error);
52
- setHealthStatus({
53
- isHealthy: false,
54
- message: 'Failed to initialize health monitoring',
55
- lastHeartbeat: null,
56
- connectionId: null
57
- });
58
- }
59
- setIsInitializing(false);
60
- }
61
- };
62
- initializeHealthService();
63
- // Cleanup on unmount
64
- return () => {
65
- if (unsubscribe) {
66
- unsubscribe();
67
- }
68
- };
69
- }, [idpBaseUrl]);
70
- const getStatusColor = () => {
71
- if (isInitializing)
72
- return 'text-yellow-600';
73
- return healthStatus.isHealthy ? 'text-green-600' : 'text-orange-600'; // Orange instead of alarming red
74
- };
75
- const getStatusIcon = () => {
76
- if (isInitializing)
77
- return '🔄';
78
- return healthStatus.isHealthy ? '✅' : '🔶'; // Orange diamond instead of scary red X
79
- };
80
- const getStatusMessage = () => {
81
- if (isInitializing)
82
- return 'Connecting to service...';
83
- return healthStatus.message;
84
- };
85
- const formatLastHeartbeat = () => {
86
- if (!healthStatus.lastHeartbeat)
87
- return null;
88
- const now = new Date();
89
- const diff = Math.floor((now.getTime() - healthStatus.lastHeartbeat.getTime()) / 1000);
90
- if (diff < 60)
91
- return `${diff}s ago`;
92
- if (diff < 3600)
93
- return `${Math.floor(diff / 60)}m ago`;
94
- return `${Math.floor(diff / 3600)}h ago`;
95
- };
96
- return ((0, jsx_runtime_1.jsxs)("div", { className: `flex items-center space-x-2 ${className}`, children: [(0, jsx_runtime_1.jsx)("span", { className: "text-lg", role: "img", "aria-label": "status", children: getStatusIcon() }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col", children: [(0, jsx_runtime_1.jsx)("span", { className: `text-sm font-medium ${getStatusColor()}`, children: getStatusMessage() }), healthStatus.lastHeartbeat && ((0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-gray-500", children: ["Last heartbeat: ", formatLastHeartbeat()] }))] })] }));
97
- }
@@ -1,32 +0,0 @@
1
- export interface NavItem {
2
- href: string;
3
- label: string;
4
- icon?: React.ReactNode;
5
- }
6
- export interface NavSection {
7
- title?: string;
8
- items: Array<{
9
- label: string;
10
- icon?: React.ReactNode;
11
- href?: string;
12
- onClick?: () => void;
13
- }>;
14
- }
15
- export interface MobileNavDrawerProps {
16
- isOpen: boolean;
17
- onClose: () => void;
18
- navItems: NavItem[];
19
- /** Extra sections like Admin, rendered after nav items with optional title */
20
- customSections?: NavSection[];
21
- /** Base path for account link (default: '/account') */
22
- basePath?: string;
23
- /** Custom sign-in handler (default: next-auth signIn) */
24
- onSignIn?: () => void;
25
- /** Callback URL after sign in (default: '/dashboard') */
26
- signInCallbackUrl?: string;
27
- /** Custom unauthenticated actions (replaces default Login + Start Free buttons) */
28
- unauthActions?: React.ReactNode;
29
- /** Custom authenticated footer (replaces default "Account Settings" link) */
30
- authFooter?: React.ReactNode;
31
- }
32
- export declare function MobileNavDrawer({ isOpen, onClose, navItems, customSections, basePath, onSignIn, signInCallbackUrl, unauthActions, authFooter, }: MobileNavDrawerProps): import("react/jsx-runtime").JSX.Element;