@payez/next-mvp 4.0.1 → 4.0.2

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 (433) hide show
  1. package/dist/api/auth-handler.d.ts +66 -0
  2. package/dist/api/auth-handler.js +397 -0
  3. package/dist/api/index.d.ts +10 -0
  4. package/dist/api/index.js +19 -0
  5. package/dist/api-handlers/account/change-password.d.ts +9 -0
  6. package/dist/api-handlers/account/change-password.js +110 -0
  7. package/dist/api-handlers/account/masked-info.d.ts +2 -0
  8. package/dist/api-handlers/account/masked-info.js +41 -0
  9. package/dist/api-handlers/account/profile.d.ts +3 -0
  10. package/dist/api-handlers/account/profile.js +63 -0
  11. package/dist/api-handlers/account/recovery/initiate.d.ts +2 -0
  12. package/dist/api-handlers/account/recovery/initiate.js +26 -0
  13. package/dist/api-handlers/account/recovery/send-code.d.ts +2 -0
  14. package/dist/api-handlers/account/recovery/send-code.js +28 -0
  15. package/dist/api-handlers/account/recovery/verify-code.d.ts +2 -0
  16. package/dist/api-handlers/account/recovery/verify-code.js +28 -0
  17. package/dist/api-handlers/account/reset-password.d.ts +2 -0
  18. package/dist/api-handlers/account/reset-password.js +26 -0
  19. package/dist/api-handlers/account/send-code.d.ts +24 -0
  20. package/dist/api-handlers/account/send-code.js +60 -0
  21. package/dist/api-handlers/account/update-phone.d.ts +27 -0
  22. package/dist/api-handlers/account/update-phone.js +64 -0
  23. package/dist/api-handlers/account/validate-password.d.ts +17 -0
  24. package/dist/api-handlers/account/validate-password.js +81 -0
  25. package/dist/api-handlers/account/verify-email.d.ts +26 -0
  26. package/dist/api-handlers/account/verify-email.js +106 -0
  27. package/dist/api-handlers/account/verify-sms.d.ts +26 -0
  28. package/dist/api-handlers/account/verify-sms.js +106 -0
  29. package/dist/api-handlers/admin/analytics.d.ts +19 -0
  30. package/dist/api-handlers/admin/analytics.js +378 -0
  31. package/dist/api-handlers/admin/audit.d.ts +19 -0
  32. package/dist/api-handlers/admin/audit.js +213 -0
  33. package/dist/api-handlers/admin/index.d.ts +21 -0
  34. package/dist/api-handlers/admin/index.js +42 -0
  35. package/dist/api-handlers/admin/redis-sessions.d.ts +35 -0
  36. package/dist/api-handlers/admin/redis-sessions.js +203 -0
  37. package/dist/api-handlers/admin/sessions.d.ts +20 -0
  38. package/dist/api-handlers/admin/sessions.js +283 -0
  39. package/dist/api-handlers/admin/site-logs.d.ts +45 -0
  40. package/dist/api-handlers/admin/site-logs.js +317 -0
  41. package/dist/api-handlers/admin/stats.d.ts +20 -0
  42. package/dist/api-handlers/admin/stats.js +239 -0
  43. package/dist/api-handlers/admin/users.d.ts +19 -0
  44. package/dist/api-handlers/admin/users.js +221 -0
  45. package/dist/api-handlers/admin/vibe-data.d.ts +79 -0
  46. package/dist/api-handlers/admin/vibe-data.js +267 -0
  47. package/dist/api-handlers/anon/preferences.d.ts +37 -0
  48. package/dist/api-handlers/anon/preferences.js +96 -0
  49. package/dist/api-handlers/auth/jwks.d.ts +2 -0
  50. package/dist/api-handlers/auth/jwks.js +24 -0
  51. package/dist/api-handlers/auth/login.d.ts +42 -0
  52. package/dist/api-handlers/auth/login.js +178 -0
  53. package/dist/api-handlers/auth/refresh.d.ts +74 -0
  54. package/dist/api-handlers/auth/refresh.js +633 -0
  55. package/dist/api-handlers/auth/signout.d.ts +37 -0
  56. package/dist/api-handlers/auth/signout.js +186 -0
  57. package/dist/api-handlers/auth/status.d.ts +8 -0
  58. package/dist/api-handlers/auth/status.js +23 -0
  59. package/dist/api-handlers/auth/update-session.d.ts +37 -0
  60. package/dist/api-handlers/auth/update-session.js +93 -0
  61. package/dist/api-handlers/auth/validate.d.ts +6 -0
  62. package/dist/api-handlers/auth/validate.js +43 -0
  63. package/dist/api-handlers/auth/verify-code.d.ts +43 -0
  64. package/dist/api-handlers/auth/verify-code.js +90 -0
  65. package/dist/api-handlers/session/refresh-viability.d.ts +14 -0
  66. package/dist/api-handlers/session/refresh-viability.js +39 -0
  67. package/dist/api-handlers/session/viability.d.ts +13 -0
  68. package/dist/api-handlers/session/viability.js +114 -0
  69. package/dist/api-handlers/test/force-expire.d.ts +23 -0
  70. package/dist/api-handlers/test/force-expire.js +59 -0
  71. package/dist/auth/auth-decision.d.ts +39 -0
  72. package/dist/auth/auth-decision.js +182 -0
  73. package/dist/auth/better-auth.d.ts +79 -0
  74. package/dist/auth/better-auth.js +119 -0
  75. package/dist/auth/route-config.d.ts +66 -0
  76. package/dist/auth/route-config.js +190 -0
  77. package/dist/auth/types/auth-types.d.ts +417 -0
  78. package/dist/auth/types/auth-types.js +53 -0
  79. package/dist/auth/types/index.d.ts +6 -0
  80. package/dist/auth/types/index.js +22 -0
  81. package/dist/auth/unauthenticated-routes.d.ts +1 -0
  82. package/dist/auth/unauthenticated-routes.js +19 -0
  83. package/dist/auth/utils/idp-client.d.ts +94 -0
  84. package/dist/auth/utils/idp-client.js +384 -0
  85. package/dist/auth/utils/index.d.ts +5 -0
  86. package/dist/auth/utils/index.js +21 -0
  87. package/dist/auth/utils/token-utils.d.ts +83 -0
  88. package/dist/auth/utils/token-utils.js +218 -0
  89. package/dist/client/AuthContext.d.ts +19 -0
  90. package/dist/client/AuthContext.js +115 -0
  91. package/dist/client/better-auth-client.d.ts +1020 -0
  92. package/dist/client/better-auth-client.js +68 -0
  93. package/dist/client/fetch-with-auth.d.ts +11 -0
  94. package/dist/client/fetch-with-auth.js +44 -0
  95. package/dist/client/fetchWithSession.d.ts +3 -0
  96. package/dist/client/fetchWithSession.js +24 -0
  97. package/dist/client/index.d.ts +9 -0
  98. package/dist/client/index.js +20 -0
  99. package/dist/client/useAnonSession.d.ts +36 -0
  100. package/dist/client/useAnonSession.js +99 -0
  101. package/dist/components/SessionSync.d.ts +13 -0
  102. package/dist/components/SessionSync.js +121 -0
  103. package/dist/components/SignalRHealthCheck.d.ts +10 -0
  104. package/dist/components/SignalRHealthCheck.js +97 -0
  105. package/dist/components/account/MobileNavDrawer.d.ts +32 -0
  106. package/dist/components/account/MobileNavDrawer.js +81 -0
  107. package/dist/components/account/UserAvatarMenu.d.ts +20 -0
  108. package/dist/components/account/UserAvatarMenu.js +91 -0
  109. package/dist/components/account/index.d.ts +9 -0
  110. package/dist/components/account/index.js +13 -0
  111. package/dist/components/admin/AlertSettingsTab.d.ts +48 -0
  112. package/dist/components/admin/AlertSettingsTab.js +351 -0
  113. package/dist/components/admin/AnalyticsTab.d.ts +22 -0
  114. package/dist/components/admin/AnalyticsTab.js +167 -0
  115. package/dist/components/admin/DataBrowserTab.d.ts +19 -0
  116. package/dist/components/admin/DataBrowserTab.js +252 -0
  117. package/dist/components/admin/LoggingSettingsTab.d.ts +73 -0
  118. package/dist/components/admin/LoggingSettingsTab.js +339 -0
  119. package/dist/components/admin/SessionsTab.d.ts +37 -0
  120. package/dist/components/admin/SessionsTab.js +165 -0
  121. package/dist/components/admin/StatsTab.d.ts +53 -0
  122. package/dist/components/admin/StatsTab.js +161 -0
  123. package/dist/components/admin/VibeAdminContext.d.ts +32 -0
  124. package/dist/components/admin/VibeAdminContext.js +38 -0
  125. package/dist/components/admin/VibeAdminLayout.d.ts +11 -0
  126. package/dist/components/admin/VibeAdminLayout.js +71 -0
  127. package/dist/components/admin/index.d.ts +29 -0
  128. package/dist/components/admin/index.js +44 -0
  129. package/dist/components/auth/FederatedAuthSection.d.ts +8 -0
  130. package/dist/components/auth/FederatedAuthSection.js +45 -0
  131. package/dist/components/auth/ModeAwareLoginPage.d.ts +10 -0
  132. package/dist/components/auth/ModeAwareLoginPage.js +42 -0
  133. package/dist/components/auth/ModeAwareSignupPage.d.ts +9 -0
  134. package/dist/components/auth/ModeAwareSignupPage.js +78 -0
  135. package/dist/components/auth/TraditionalAuthSection.d.ts +14 -0
  136. package/dist/components/auth/TraditionalAuthSection.js +20 -0
  137. package/dist/components/recovery/CompleteStep.d.ts +5 -0
  138. package/dist/components/recovery/CompleteStep.js +8 -0
  139. package/dist/components/recovery/InitiateRecoveryStep.d.ts +8 -0
  140. package/dist/components/recovery/InitiateRecoveryStep.js +20 -0
  141. package/dist/components/recovery/SelectMethodStep.d.ts +8 -0
  142. package/dist/components/recovery/SelectMethodStep.js +8 -0
  143. package/dist/components/recovery/SetPasswordStep.d.ts +6 -0
  144. package/dist/components/recovery/SetPasswordStep.js +20 -0
  145. package/dist/components/recovery/VerifyCodeStep.d.ts +10 -0
  146. package/dist/components/recovery/VerifyCodeStep.js +24 -0
  147. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +38 -0
  148. package/dist/components/reserved/ReservedRecoveryWarning.js +92 -0
  149. package/dist/components/reserved/ReservedStatusBox.d.ts +30 -0
  150. package/dist/components/reserved/ReservedStatusBox.js +71 -0
  151. package/dist/components/ui/BetaBadge.d.ts +29 -0
  152. package/dist/components/ui/BetaBadge.js +38 -0
  153. package/dist/components/ui/Footer.d.ts +37 -0
  154. package/dist/components/ui/Footer.js +41 -0
  155. package/dist/config/env.d.ts +66 -0
  156. package/dist/config/env.js +57 -0
  157. package/dist/config/logger.d.ts +57 -0
  158. package/dist/config/logger.js +73 -0
  159. package/dist/config/logging-config.d.ts +30 -0
  160. package/dist/config/logging-config.js +122 -0
  161. package/dist/config/unauthenticated-routes.d.ts +17 -0
  162. package/dist/config/unauthenticated-routes.js +24 -0
  163. package/dist/config/vibe-log-transport.d.ts +81 -0
  164. package/dist/config/vibe-log-transport.js +212 -0
  165. package/dist/edge/internal-api-url.d.ts +53 -0
  166. package/dist/edge/internal-api-url.js +63 -0
  167. package/dist/edge/middleware.d.ts +14 -0
  168. package/dist/edge/middleware.js +32 -0
  169. package/dist/hooks/useAuth.d.ts +23 -0
  170. package/dist/hooks/useAuth.js +83 -0
  171. package/dist/hooks/useAuthSettings.d.ts +59 -0
  172. package/dist/hooks/useAuthSettings.js +93 -0
  173. package/dist/hooks/useAvailableProviders.d.ts +43 -0
  174. package/dist/hooks/useAvailableProviders.js +112 -0
  175. package/dist/hooks/usePasswordValidation.d.ts +27 -0
  176. package/dist/hooks/usePasswordValidation.js +102 -0
  177. package/dist/hooks/useProfile.d.ts +15 -0
  178. package/dist/hooks/useProfile.js +59 -0
  179. package/dist/hooks/usePublicAuthSettings.d.ts +56 -0
  180. package/dist/hooks/usePublicAuthSettings.js +131 -0
  181. package/dist/hooks/useSessionExpiration.d.ts +56 -0
  182. package/dist/hooks/useSessionExpiration.js +72 -0
  183. package/dist/hooks/useViabilitySession.d.ts +75 -0
  184. package/dist/hooks/useViabilitySession.js +269 -0
  185. package/dist/index.d.ts +12 -0
  186. package/dist/index.js +53 -0
  187. package/dist/lib/anon-session.d.ts +74 -0
  188. package/dist/lib/anon-session.js +169 -0
  189. package/dist/lib/api-handler.d.ts +123 -0
  190. package/dist/lib/api-handler.js +478 -0
  191. package/dist/lib/app-slug.d.ts +95 -0
  192. package/dist/lib/app-slug.js +172 -0
  193. package/dist/lib/demo-mode.d.ts +6 -0
  194. package/dist/lib/demo-mode.js +16 -0
  195. package/dist/lib/geolocation.d.ts +64 -0
  196. package/dist/lib/geolocation.js +235 -0
  197. package/dist/lib/idp-client-config.d.ts +75 -0
  198. package/dist/lib/idp-client-config.js +425 -0
  199. package/dist/lib/idp-fetch.d.ts +14 -0
  200. package/dist/lib/idp-fetch.js +91 -0
  201. package/dist/lib/internal-api.d.ts +87 -0
  202. package/dist/lib/internal-api.js +122 -0
  203. package/dist/lib/jwt-decode-client.d.ts +10 -0
  204. package/dist/lib/jwt-decode-client.js +46 -0
  205. package/dist/lib/jwt-decode.d.ts +48 -0
  206. package/dist/lib/jwt-decode.js +57 -0
  207. package/dist/lib/rate-limit-service.d.ts +23 -0
  208. package/dist/lib/rate-limit-service.js +6 -0
  209. package/dist/lib/redis.d.ts +5 -0
  210. package/dist/lib/redis.js +28 -0
  211. package/dist/lib/refresh-token-validator.d.ts +13 -0
  212. package/dist/lib/refresh-token-validator.js +117 -0
  213. package/dist/lib/roles.d.ts +145 -0
  214. package/dist/lib/roles.js +168 -0
  215. package/dist/lib/secret-validation.d.ts +4 -0
  216. package/dist/lib/secret-validation.js +14 -0
  217. package/dist/lib/session-store.d.ts +170 -0
  218. package/dist/lib/session-store.js +545 -0
  219. package/dist/lib/session.d.ts +21 -0
  220. package/dist/lib/session.js +26 -0
  221. package/dist/lib/site-logger.d.ts +214 -0
  222. package/dist/lib/site-logger.js +210 -0
  223. package/dist/lib/standardized-client-api.d.ts +161 -0
  224. package/dist/lib/standardized-client-api.js +791 -0
  225. package/dist/lib/startup-init.d.ts +40 -0
  226. package/dist/lib/startup-init.js +257 -0
  227. package/dist/lib/test-aware-get-token.d.ts +2 -0
  228. package/dist/lib/test-aware-get-token.js +86 -0
  229. package/dist/lib/token-expiry.d.ts +14 -0
  230. package/dist/lib/token-expiry.js +39 -0
  231. package/dist/lib/token-lifecycle.d.ts +78 -0
  232. package/dist/lib/token-lifecycle.js +360 -0
  233. package/dist/lib/types/api-responses.d.ts +128 -0
  234. package/dist/lib/types/api-responses.js +171 -0
  235. package/dist/lib/user-agent-parser.d.ts +50 -0
  236. package/dist/lib/user-agent-parser.js +220 -0
  237. package/dist/logging/api/admin-analytics.d.ts +3 -0
  238. package/dist/logging/api/admin-analytics.js +45 -0
  239. package/dist/logging/api/audit-log.d.ts +3 -0
  240. package/dist/logging/api/audit-log.js +52 -0
  241. package/dist/logging/components/AdminAnalyticsLayout.d.ts +10 -0
  242. package/dist/logging/components/AdminAnalyticsLayout.js +11 -0
  243. package/dist/logging/components/AuditLogViewer.d.ts +7 -0
  244. package/dist/logging/components/AuditLogViewer.js +51 -0
  245. package/dist/logging/components/ErrorMetricsCard.d.ts +7 -0
  246. package/dist/logging/components/ErrorMetricsCard.js +16 -0
  247. package/dist/logging/components/HealthMetricsCard.d.ts +7 -0
  248. package/dist/logging/components/HealthMetricsCard.js +19 -0
  249. package/dist/logging/hooks/useAdminAnalytics.d.ts +24 -0
  250. package/dist/logging/hooks/useAdminAnalytics.js +22 -0
  251. package/dist/logging/hooks/useAuditLog.d.ts +6 -0
  252. package/dist/logging/hooks/useAuditLog.js +25 -0
  253. package/dist/logging/hooks/useErrorMetrics.d.ts +6 -0
  254. package/dist/logging/hooks/useErrorMetrics.js +38 -0
  255. package/dist/logging/hooks/useHealthMetrics.d.ts +6 -0
  256. package/dist/logging/hooks/useHealthMetrics.js +41 -0
  257. package/dist/logging/index.d.ts +11 -0
  258. package/dist/logging/index.js +40 -0
  259. package/dist/logging/types/analytics.d.ts +68 -0
  260. package/dist/logging/types/analytics.js +3 -0
  261. package/dist/logging/types/audit.d.ts +29 -0
  262. package/dist/logging/types/audit.js +2 -0
  263. package/dist/logging/types/index.d.ts +2 -0
  264. package/dist/logging/types/index.js +19 -0
  265. package/dist/middleware/auth-decision.d.ts +33 -0
  266. package/dist/middleware/auth-decision.js +65 -0
  267. package/dist/middleware/create-middleware.d.ts +102 -0
  268. package/dist/middleware/create-middleware.js +469 -0
  269. package/dist/middleware/rbac-check.d.ts +51 -0
  270. package/dist/middleware/rbac-check.js +219 -0
  271. package/dist/middleware/twofa-presets.d.ts +134 -0
  272. package/dist/middleware/twofa-presets.js +175 -0
  273. package/dist/models/DecodedAccessToken.d.ts +17 -0
  274. package/dist/models/DecodedAccessToken.js +2 -0
  275. package/dist/models/SessionModel.d.ts +122 -0
  276. package/dist/models/SessionModel.js +136 -0
  277. package/dist/pages/admin-login/page.d.ts +31 -0
  278. package/dist/pages/admin-login/page.js +73 -0
  279. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +18 -0
  280. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +276 -0
  281. package/dist/pages/admin-page-permissions/index.d.ts +6 -0
  282. package/dist/pages/admin-page-permissions/index.js +13 -0
  283. package/dist/pages/admin-roles/RolesAdminPage.d.ts +16 -0
  284. package/dist/pages/admin-roles/RolesAdminPage.js +261 -0
  285. package/dist/pages/admin-roles/index.d.ts +8 -0
  286. package/dist/pages/admin-roles/index.js +15 -0
  287. package/dist/pages/admin-roles/modals.d.ts +72 -0
  288. package/dist/pages/admin-roles/modals.js +154 -0
  289. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +79 -0
  290. package/dist/pages/client-admin/ClientSiteAdminPage.js +179 -0
  291. package/dist/pages/client-admin/index.d.ts +32 -0
  292. package/dist/pages/client-admin/index.js +37 -0
  293. package/dist/pages/coming-soon/page.d.ts +8 -0
  294. package/dist/pages/coming-soon/page.js +28 -0
  295. package/dist/pages/login/page.d.ts +22 -0
  296. package/dist/pages/login/page.js +230 -0
  297. package/dist/pages/profile/EnhancedProfilePage.d.ts +13 -0
  298. package/dist/pages/profile/EnhancedProfilePage.js +150 -0
  299. package/dist/pages/profile/index.d.ts +8 -0
  300. package/dist/pages/profile/index.js +16 -0
  301. package/dist/pages/profile/page.d.ts +19 -0
  302. package/dist/pages/profile/page.js +47 -0
  303. package/dist/pages/recovery/page.d.ts +1 -0
  304. package/dist/pages/recovery/page.js +142 -0
  305. package/dist/pages/roles/MyRolesPage.d.ts +24 -0
  306. package/dist/pages/roles/MyRolesPage.js +71 -0
  307. package/dist/pages/roles/components.d.ts +63 -0
  308. package/dist/pages/roles/components.js +108 -0
  309. package/dist/pages/roles/index.d.ts +8 -0
  310. package/dist/pages/roles/index.js +19 -0
  311. package/dist/pages/security/EnhancedSecurityPage.d.ts +14 -0
  312. package/dist/pages/security/EnhancedSecurityPage.js +248 -0
  313. package/dist/pages/security/index.d.ts +8 -0
  314. package/dist/pages/security/index.js +16 -0
  315. package/dist/pages/security/page.d.ts +21 -0
  316. package/dist/pages/security/page.js +212 -0
  317. package/dist/pages/settings/EnhancedSettingsPage.d.ts +46 -0
  318. package/dist/pages/settings/EnhancedSettingsPage.js +231 -0
  319. package/dist/pages/settings/index.d.ts +8 -0
  320. package/dist/pages/settings/index.js +16 -0
  321. package/dist/pages/settings/page.d.ts +7 -0
  322. package/dist/pages/settings/page.js +26 -0
  323. package/dist/pages/showcase/ShowcasePage.d.ts +13 -0
  324. package/dist/pages/showcase/ShowcasePage.js +142 -0
  325. package/dist/pages/showcase/index.d.ts +12 -0
  326. package/dist/pages/showcase/index.js +17 -0
  327. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +14 -0
  328. package/dist/pages/test-env/EmergencyLogoutPage.js +99 -0
  329. package/dist/pages/test-env/JwtInspectPage.d.ts +14 -0
  330. package/dist/pages/test-env/JwtInspectPage.js +116 -0
  331. package/dist/pages/test-env/RefreshTokenPage.d.ts +15 -0
  332. package/dist/pages/test-env/RefreshTokenPage.js +93 -0
  333. package/dist/pages/test-env/TestEnvPage.d.ts +13 -0
  334. package/dist/pages/test-env/TestEnvPage.js +51 -0
  335. package/dist/pages/test-env/index.d.ts +24 -0
  336. package/dist/pages/test-env/index.js +32 -0
  337. package/dist/pages/verify-code/page.d.ts +30 -0
  338. package/dist/pages/verify-code/page.js +412 -0
  339. package/dist/routes/account/index.d.ts +28 -0
  340. package/dist/routes/account/index.js +71 -0
  341. package/dist/routes/account/masked-info.d.ts +33 -0
  342. package/dist/routes/account/masked-info.js +39 -0
  343. package/dist/routes/account/send-code.d.ts +37 -0
  344. package/dist/routes/account/send-code.js +42 -0
  345. package/dist/routes/account/update-phone.d.ts +13 -0
  346. package/dist/routes/account/update-phone.js +17 -0
  347. package/dist/routes/account/verify-email.d.ts +38 -0
  348. package/dist/routes/account/verify-email.js +43 -0
  349. package/dist/routes/account/verify-sms.d.ts +38 -0
  350. package/dist/routes/account/verify-sms.js +43 -0
  351. package/dist/routes/auth/index.d.ts +19 -0
  352. package/dist/routes/auth/index.js +64 -0
  353. package/dist/routes/auth/logout.d.ts +31 -0
  354. package/dist/routes/auth/logout.js +98 -0
  355. package/dist/routes/auth/nextauth.d.ts +22 -0
  356. package/dist/routes/auth/nextauth.js +40 -0
  357. package/dist/routes/auth/refresh.d.ts +30 -0
  358. package/dist/routes/auth/refresh.js +51 -0
  359. package/dist/routes/auth/session.d.ts +43 -0
  360. package/dist/routes/auth/session.js +157 -0
  361. package/dist/routes/auth/settings.d.ts +25 -0
  362. package/dist/routes/auth/settings.js +55 -0
  363. package/dist/routes/auth/viability.d.ts +52 -0
  364. package/dist/routes/auth/viability.js +190 -0
  365. package/dist/routes/index.d.ts +12 -0
  366. package/dist/routes/index.js +54 -0
  367. package/dist/routes/session/index.d.ts +6 -0
  368. package/dist/routes/session/index.js +10 -0
  369. package/dist/routes/session/refresh-viability.d.ts +16 -0
  370. package/dist/routes/session/refresh-viability.js +20 -0
  371. package/dist/server/auth-guard.d.ts +46 -0
  372. package/dist/server/auth-guard.js +128 -0
  373. package/dist/server/auth.d.ts +50 -0
  374. package/dist/server/auth.js +62 -0
  375. package/dist/server/decode-session.d.ts +30 -0
  376. package/dist/server/decode-session.js +78 -0
  377. package/dist/server/slim-middleware.d.ts +23 -0
  378. package/dist/server/slim-middleware.js +89 -0
  379. package/dist/server/with-auth.d.ts +33 -0
  380. package/dist/server/with-auth.js +59 -0
  381. package/dist/services/signalrActivityService.d.ts +44 -0
  382. package/dist/services/signalrActivityService.js +257 -0
  383. package/dist/stores/authStore.d.ts +154 -0
  384. package/dist/stores/authStore.js +1527 -0
  385. package/dist/theme/ThemeProvider.d.ts +14 -0
  386. package/dist/theme/ThemeProvider.js +28 -0
  387. package/dist/theme/default.d.ts +8 -0
  388. package/dist/theme/default.js +33 -0
  389. package/dist/theme/index.d.ts +15 -0
  390. package/dist/theme/index.js +25 -0
  391. package/dist/theme/types.d.ts +56 -0
  392. package/dist/theme/types.js +8 -0
  393. package/dist/theme/useTheme.d.ts +60 -0
  394. package/dist/theme/useTheme.js +63 -0
  395. package/dist/theme/utils.d.ts +13 -0
  396. package/dist/theme/utils.js +39 -0
  397. package/dist/types/api.d.ts +134 -0
  398. package/dist/types/api.js +44 -0
  399. package/dist/types/auth.d.ts +19 -0
  400. package/dist/types/auth.js +2 -0
  401. package/dist/types/logging.d.ts +42 -0
  402. package/dist/types/logging.js +2 -0
  403. package/dist/types/recovery.d.ts +48 -0
  404. package/dist/types/recovery.js +2 -0
  405. package/dist/types/security.d.ts +1 -0
  406. package/dist/types/security.js +2 -0
  407. package/dist/utils/api.d.ts +85 -0
  408. package/dist/utils/api.js +287 -0
  409. package/dist/utils/circuitBreaker.d.ts +43 -0
  410. package/dist/utils/circuitBreaker.js +91 -0
  411. package/dist/utils/error-message.d.ts +1 -0
  412. package/dist/utils/error-message.js +103 -0
  413. package/dist/utils/layout/reservedSpace.d.ts +59 -0
  414. package/dist/utils/layout/reservedSpace.js +102 -0
  415. package/dist/utils/logout.d.ts +14 -0
  416. package/dist/utils/logout.js +32 -0
  417. package/dist/vibe/client.d.ts +261 -0
  418. package/dist/vibe/client.js +445 -0
  419. package/dist/vibe/enterprise-auth.d.ts +106 -0
  420. package/dist/vibe/enterprise-auth.js +173 -0
  421. package/dist/vibe/errors.d.ts +83 -0
  422. package/dist/vibe/errors.js +146 -0
  423. package/dist/vibe/generic.d.ts +234 -0
  424. package/dist/vibe/generic.js +369 -0
  425. package/dist/vibe/hooks/index.d.ts +169 -0
  426. package/dist/vibe/hooks/index.js +252 -0
  427. package/dist/vibe/index.d.ts +25 -0
  428. package/dist/vibe/index.js +72 -0
  429. package/dist/vibe/sessions.d.ts +161 -0
  430. package/dist/vibe/sessions.js +391 -0
  431. package/dist/vibe/types.d.ts +353 -0
  432. package/dist/vibe/types.js +315 -0
  433. package/package.json +1 -1
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ /**
3
+ * Token Lifecycle Management for @payez/next-mvp
4
+ *
5
+ * Ensures tokens are fresh before making API calls.
6
+ * Checks expiration and triggers refresh if needed.
7
+ *
8
+ * Pattern: Check first, refresh if needed, fail gracefully if refresh fails.
9
+ *
10
+ * HANDLES CONCURRENT REFRESH: When multiple API calls arrive simultaneously
11
+ * with expired tokens, only one will actually perform the refresh. Others
12
+ * receive 409 (conflict) and wait for the refresh to complete, then use
13
+ * the freshly refreshed tokens.
14
+ *
15
+ * REQUIRED: Your app must expose the refresh route:
16
+ * ```typescript
17
+ * // app/api/auth/refresh/route.ts
18
+ * export { POST } from '@payez/next-mvp/routes/auth/refresh';
19
+ * ```
20
+ *
21
+ * @version 2.0.0
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.ensureFreshToken = ensureFreshToken;
25
+ exports.getFreshAuthHeader = getFreshAuthHeader;
26
+ const session_store_1 = require("./session-store");
27
+ const auth_1 = require("../server/auth");
28
+ // 5 minute threshold for "needs refresh" - matches refresh handler pattern
29
+ const REFRESH_THRESHOLD_MS = 5 * 60 * 1000;
30
+ // Concurrent refresh handling configuration
31
+ const CONCURRENT_REFRESH_POLL_INTERVAL_MS = 200; // How often to poll session during concurrent refresh
32
+ const CONCURRENT_REFRESH_MAX_WAIT_MS = 8000; // Max time to wait for concurrent refresh to complete
33
+ const REFRESH_RETRY_DELAY_MS = 500; // Delay before retrying after failed concurrent refresh
34
+ const KEY_PROPAGATION_DELAY_MS = 150; // Delay after refresh to allow JWKS cache updates in downstream services
35
+ /**
36
+ * Check if token needs refresh based on expiration time
37
+ */
38
+ function needsRefresh(accessTokenExpires) {
39
+ if (!accessTokenExpires)
40
+ return true;
41
+ const timeUntilExpiry = accessTokenExpires - Date.now();
42
+ return timeUntilExpiry <= REFRESH_THRESHOLD_MS;
43
+ }
44
+ /**
45
+ * Helper to delay execution
46
+ */
47
+ function delay(ms) {
48
+ return new Promise(resolve => setTimeout(resolve, ms));
49
+ }
50
+ /**
51
+ * Wait for a concurrent refresh to complete by polling the session.
52
+ * Returns true if session becomes fresh, false if timeout reached.
53
+ */
54
+ async function waitForConcurrentRefresh(sessionToken, maxWaitMs = CONCURRENT_REFRESH_MAX_WAIT_MS) {
55
+ const startTime = Date.now();
56
+ while (Date.now() - startTime < maxWaitMs) {
57
+ await delay(CONCURRENT_REFRESH_POLL_INTERVAL_MS);
58
+ const sessionData = await (0, session_store_1.getSession)(sessionToken);
59
+ if (!sessionData) {
60
+ return { success: false };
61
+ }
62
+ // Check if token is now fresh
63
+ if (!needsRefresh(sessionData.idpAccessTokenExpires)) {
64
+ return { success: true, sessionData };
65
+ }
66
+ // Check if session has a new access token (even if still within threshold)
67
+ if (sessionData.idpAccessToken && sessionData.idpAccessTokenExpires &&
68
+ sessionData.idpAccessTokenExpires > Date.now()) {
69
+ return { success: true, sessionData };
70
+ }
71
+ }
72
+ return { success: false };
73
+ }
74
+ /**
75
+ * Get the internal API URL for making internal service calls.
76
+ * INTERNAL_API_URL is REQUIRED - no fallbacks.
77
+ */
78
+ function getInternalApiUrl(request) {
79
+ const internalUrl = process.env.INTERNAL_API_URL;
80
+ if (!internalUrl) {
81
+ throw new Error('[INTERNAL_API_URL] FATAL: INTERNAL_API_URL environment variable is REQUIRED. ' +
82
+ 'Set it to this app\'s internal K8s service URL (e.g., http://myapp.namespace.svc.cluster.local:80) ' +
83
+ 'or http://localhost:3000 for local development.');
84
+ }
85
+ return internalUrl;
86
+ }
87
+ /**
88
+ * Trigger a token refresh via the refresh API endpoint.
89
+ *
90
+ * HANDLES CONCURRENT REFRESH (409):
91
+ * When another request is already refreshing the token, this function
92
+ * waits for that refresh to complete instead of failing immediately.
93
+ * This prevents race conditions where multiple parallel API calls
94
+ * could cause unnecessary refresh failures.
95
+ *
96
+ * TERMINAL STATES:
97
+ * Returns { success: false, terminal: true } when the session cannot be
98
+ * recovered (e.g., no refresh token). Callers should redirect to login.
99
+ */
100
+ async function triggerRefresh(request, sessionToken, retryCount = 0) {
101
+ const maxRetries = 2;
102
+ try {
103
+ const baseUrl = getInternalApiUrl(request);
104
+ const requestId = `refresh_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
105
+ const response = await fetch(`${baseUrl}/api/auth/refresh`, {
106
+ method: 'POST',
107
+ headers: {
108
+ 'Content-Type': 'application/json',
109
+ 'Cookie': request.headers.get('cookie') || '',
110
+ 'X-Session-Token': sessionToken,
111
+ 'X-Request-Id': requestId,
112
+ },
113
+ });
114
+ // Handle 409 Conflict - another refresh is in progress
115
+ if (response.status === 409) {
116
+ // Wait for the concurrent refresh to complete
117
+ const waitResult = await waitForConcurrentRefresh(sessionToken);
118
+ if (waitResult.success) {
119
+ return { success: true };
120
+ }
121
+ // Concurrent refresh didn't produce a fresh token - try again if we have retries left
122
+ if (retryCount < maxRetries) {
123
+ await delay(REFRESH_RETRY_DELAY_MS);
124
+ return triggerRefresh(request, sessionToken, retryCount + 1);
125
+ }
126
+ return { success: false };
127
+ }
128
+ // Handle other non-OK responses
129
+ if (!response.ok) {
130
+ // Parse response body to check for terminal errors
131
+ let responseData = {};
132
+ try {
133
+ responseData = await response.json();
134
+ }
135
+ catch {
136
+ // Ignore parse errors
137
+ }
138
+ // Log the failure for debugging
139
+ console.warn('[TOKEN_LIFECYCLE] Refresh request failed:', {
140
+ status: response.status,
141
+ statusText: response.statusText,
142
+ baseUrl,
143
+ retryCount,
144
+ code: responseData.code,
145
+ terminal: responseData.terminal
146
+ });
147
+ // CHECK FOR TERMINAL STATE: No refresh token = session is dead
148
+ // Don't retry - user must re-authenticate
149
+ if (responseData.code === 'NO_REFRESH_TOKEN' || responseData.terminal === true) {
150
+ console.error('[TOKEN_LIFECYCLE] TERMINAL: Session has no refresh token - user must re-login');
151
+ return { success: false, terminal: true, code: responseData.code };
152
+ }
153
+ // For other 401s, check if maybe session was refreshed by another request
154
+ if (response.status === 401 && retryCount < maxRetries) {
155
+ await delay(REFRESH_RETRY_DELAY_MS);
156
+ const sessionData = await (0, session_store_1.getSession)(sessionToken);
157
+ if (sessionData && !needsRefresh(sessionData.idpAccessTokenExpires)) {
158
+ return { success: true };
159
+ }
160
+ }
161
+ return { success: false, code: responseData.code };
162
+ }
163
+ const result = await response.json();
164
+ const success = result.refreshed === true || result.reason === 'already_fresh';
165
+ return { success };
166
+ }
167
+ catch (error) {
168
+ // Log network errors for debugging
169
+ console.error('[TOKEN_LIFECYCLE] Refresh network error:', {
170
+ error: error instanceof Error ? error.message : String(error),
171
+ retryCount
172
+ });
173
+ // On network error, check if maybe another request refreshed the token
174
+ if (retryCount < maxRetries) {
175
+ await delay(REFRESH_RETRY_DELAY_MS);
176
+ const sessionData = await (0, session_store_1.getSession)(sessionToken);
177
+ if (sessionData && !needsRefresh(sessionData.idpAccessTokenExpires)) {
178
+ return { success: true };
179
+ }
180
+ }
181
+ return { success: false };
182
+ }
183
+ }
184
+ /**
185
+ * Ensures we have a fresh access token before making API calls.
186
+ *
187
+ * This utility checks token expiration and triggers a refresh if needed,
188
+ * preventing 401 errors from expired tokens being sent to downstream APIs.
189
+ *
190
+ * @param request - The incoming NextRequest
191
+ * @returns TokenResult with accessToken and sessionData, or TokenError
192
+ *
193
+ * @example
194
+ * ```typescript
195
+ * import { ensureFreshToken } from '@payez/next-mvp/lib/token-lifecycle';
196
+ *
197
+ * export async function GET(request: NextRequest) {
198
+ * const tokenResult = await ensureFreshToken(request);
199
+ * if (!tokenResult.success) {
200
+ * return NextResponse.json({ error: tokenResult.error }, { status: 401 });
201
+ * }
202
+ *
203
+ * // Use tokenResult.accessToken for downstream API calls
204
+ * const response = await fetch('https://api.example.com/data', {
205
+ * headers: { 'Authorization': `Bearer ${tokenResult.accessToken}` }
206
+ * });
207
+ * }
208
+ * ```
209
+ */
210
+ async function ensureFreshToken(request) {
211
+ try {
212
+ // 1. Get Better Auth session to extract sessionToken
213
+ const betterAuthSession = await (0, auth_1.getSession)(request);
214
+ if (!betterAuthSession?.session?.token) {
215
+ console.warn('[TOKEN_LIFECYCLE] NO_SESSION - Better Auth session not found');
216
+ return {
217
+ success: false,
218
+ error: 'NO_SESSION',
219
+ message: 'No session available',
220
+ };
221
+ }
222
+ const sessionToken = betterAuthSession.session.token;
223
+ // 2. Get session data from Redis
224
+ let sessionData = await (0, session_store_1.getSession)(sessionToken);
225
+ if (!sessionData) {
226
+ return {
227
+ success: false,
228
+ error: 'NO_SESSION',
229
+ message: 'Session expired or not found',
230
+ };
231
+ }
232
+ // DEBUG: Log session data before refresh check
233
+ const tokenExpiresStr = sessionData.idpAccessTokenExpires
234
+ ? new Date(sessionData.idpAccessTokenExpires).toISOString()
235
+ : 'undefined';
236
+ let needsRefreshNow = needsRefresh(sessionData.idpAccessTokenExpires);
237
+ // VALIDATION: Check if the actual JWT token's exp matches what Redis claims
238
+ // This catches cases where accessTokenExpires was updated but accessToken wasn't
239
+ let tokenMismatch = false;
240
+ if (sessionData.idpAccessToken && !needsRefreshNow) {
241
+ try {
242
+ const tokenParts = sessionData.idpAccessToken.split('.');
243
+ if (tokenParts.length === 3) {
244
+ const payload = JSON.parse(Buffer.from(tokenParts[1], 'base64url').toString());
245
+ const jwtExpMs = (payload.exp || 0) * 1000;
246
+ const now = Date.now();
247
+ // If the JWT is actually expired, force a refresh regardless of what Redis says
248
+ if (jwtExpMs < now) {
249
+ console.warn('[TOKEN_LIFECYCLE] Token mismatch detected! JWT expired but Redis claims valid', {
250
+ jwtExp: new Date(jwtExpMs).toISOString(),
251
+ redisAccessTokenExpires: tokenExpiresStr,
252
+ now: new Date(now).toISOString(),
253
+ mismatchMs: sessionData.idpAccessTokenExpires ? sessionData.idpAccessTokenExpires - jwtExpMs : 'N/A'
254
+ });
255
+ needsRefreshNow = true;
256
+ tokenMismatch = true;
257
+ }
258
+ }
259
+ }
260
+ catch (e) {
261
+ // If we can't decode, proceed with normal logic
262
+ console.warn('[TOKEN_LIFECYCLE] Could not validate JWT exp claim:', e);
263
+ }
264
+ }
265
+ console.log('[TOKEN_LIFECYCLE] ensureFreshToken check:', {
266
+ sessionToken: sessionToken.substring(0, 8) + '...',
267
+ accessTokenExpires: tokenExpiresStr,
268
+ now: new Date().toISOString(),
269
+ needsRefresh: needsRefreshNow,
270
+ tokenMismatch,
271
+ hasRefreshToken: !!sessionData.idpRefreshToken
272
+ });
273
+ // 3. Check if token needs refresh
274
+ if (needsRefreshNow) {
275
+ // 4. Trigger refresh
276
+ console.log('[TOKEN_LIFECYCLE] Triggering refresh...');
277
+ const refreshResult = await triggerRefresh(request, sessionToken);
278
+ if (!refreshResult.success) {
279
+ // Check for terminal state - session cannot be recovered
280
+ if (refreshResult.terminal) {
281
+ console.error('[TOKEN_LIFECYCLE] TERMINAL: Session expired with no refresh token - redirect to login');
282
+ return {
283
+ success: false,
284
+ error: 'SESSION_EXPIRED_NO_REFRESH',
285
+ message: 'Session expired. Please sign in again.',
286
+ terminal: true,
287
+ };
288
+ }
289
+ console.warn('[TOKEN_LIFECYCLE] Refresh failed');
290
+ return {
291
+ success: false,
292
+ error: 'REFRESH_FAILED',
293
+ message: 'Token refresh failed',
294
+ };
295
+ }
296
+ // 5. Re-fetch session data after refresh
297
+ sessionData = await (0, session_store_1.getSession)(sessionToken);
298
+ console.log('[TOKEN_LIFECYCLE] After refresh:', {
299
+ hasAccessToken: !!sessionData?.idpAccessToken,
300
+ newAccessTokenExpires: sessionData?.idpAccessTokenExpires
301
+ ? new Date(sessionData.idpAccessTokenExpires).toISOString()
302
+ : 'undefined'
303
+ });
304
+ if (!sessionData?.idpAccessToken) {
305
+ return {
306
+ success: false,
307
+ error: 'REFRESH_FAILED',
308
+ message: 'No access token after refresh',
309
+ };
310
+ }
311
+ // 5.5. Key propagation delay - allow downstream services (like Vibe) to cache new JWKS
312
+ // This is critical when IDP rotates signing keys - the new token's kid may not be
313
+ // immediately available in Vibe's JWKS cache
314
+ await delay(KEY_PROPAGATION_DELAY_MS);
315
+ }
316
+ // 6. Validate we have a token
317
+ if (!sessionData.idpAccessToken) {
318
+ return {
319
+ success: false,
320
+ error: 'NO_TOKEN',
321
+ message: 'No access token available',
322
+ };
323
+ }
324
+ return {
325
+ success: true,
326
+ accessToken: sessionData.idpAccessToken,
327
+ sessionData,
328
+ };
329
+ }
330
+ catch (error) {
331
+ console.error('[TOKEN_LIFECYCLE] Error:', error);
332
+ return {
333
+ success: false,
334
+ error: 'NO_SESSION',
335
+ message: error instanceof Error ? error.message : 'Unknown error',
336
+ };
337
+ }
338
+ }
339
+ /**
340
+ * Get authorization header from fresh token.
341
+ * Convenience wrapper for API routes.
342
+ *
343
+ * @param request - The incoming NextRequest
344
+ * @returns Authorization header string or null if token unavailable
345
+ *
346
+ * @example
347
+ * ```typescript
348
+ * const authHeader = await getFreshAuthHeader(request);
349
+ * if (!authHeader) {
350
+ * return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
351
+ * }
352
+ * ```
353
+ */
354
+ async function getFreshAuthHeader(request) {
355
+ const result = await ensureFreshToken(request);
356
+ if (!result.success) {
357
+ return null;
358
+ }
359
+ return `Bearer ${result.accessToken}`;
360
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * BASE STANDARDIZED RESPONSE FORMAT
3
+ * This is THE ONLY acceptable response format from our APIs
4
+ */
5
+ export interface StandardizedApiResponse<TData = unknown> {
6
+ /** REQUIRED: Operation success status */
7
+ success: true;
8
+ /** REQUIRED: The actual data payload */
9
+ data: TData;
10
+ /** REQUIRED: Human-readable success message */
11
+ message: string;
12
+ /** REQUIRED: Unique operation code for tracking */
13
+ operation_code: string;
14
+ /** Optional: Server timestamp */
15
+ timestamp?: string;
16
+ /** Optional: Request ID for tracing */
17
+ request_id?: string;
18
+ }
19
+ /**
20
+ * STANDARDIZED ERROR RESPONSE FORMAT
21
+ * This is THE ONLY acceptable error format from our APIs
22
+ */
23
+ export interface StandardizedErrorResponse {
24
+ /** REQUIRED: Always false for errors */
25
+ success: false;
26
+ /** REQUIRED: Standard error code */
27
+ error_code: string;
28
+ /** REQUIRED: Human-readable error message */
29
+ message: string;
30
+ /** REQUIRED: Operation that failed */
31
+ operation: string;
32
+ /** Optional: Additional error details - can be any structure from IDP */
33
+ details?: unknown;
34
+ /** Optional: Validation errors */
35
+ validation_errors?: Record<string, string[]>;
36
+ /** Optional: Server timestamp */
37
+ timestamp?: string;
38
+ /** Optional: Request ID for tracing */
39
+ request_id?: string;
40
+ }
41
+ /**
42
+ * STANDARDIZED PAGINATED RESPONSE FORMAT
43
+ * For endpoints that return paged data
44
+ */
45
+ export interface StandardizedPagedResponse<TData = unknown> {
46
+ /** REQUIRED: Always true for success */
47
+ success: true;
48
+ /** REQUIRED: Array of data items */
49
+ data: TData[];
50
+ /** REQUIRED: Human-readable success message */
51
+ message: string;
52
+ /** REQUIRED: Unique operation code */
53
+ operation_code: string;
54
+ /** REQUIRED: Pagination metadata */
55
+ pagination: {
56
+ /** Current page number (1-based) */
57
+ current_page: number;
58
+ /** Total number of pages */
59
+ total_pages: number;
60
+ /** Number of items per page */
61
+ page_size: number;
62
+ /** Total number of items across all pages */
63
+ total_items: number;
64
+ /** True if there are more pages after current */
65
+ has_next_page: boolean;
66
+ /** True if there are pages before current */
67
+ has_previous_page: boolean;
68
+ };
69
+ /** Optional: Server timestamp */
70
+ timestamp?: string;
71
+ /** Optional: Request ID for tracing */
72
+ request_id?: string;
73
+ }
74
+ /**
75
+ * VALIDATION ERROR RESPONSE FORMAT
76
+ * For input validation failures
77
+ */
78
+ export interface StandardizedValidationResponse {
79
+ /** REQUIRED: Always false for validation errors */
80
+ success: false;
81
+ /** REQUIRED: Always 'VALIDATION_ERROR' */
82
+ error_code: 'VALIDATION_ERROR';
83
+ /** REQUIRED: Summary message */
84
+ message: string;
85
+ /** REQUIRED: Operation that failed */
86
+ operation: string;
87
+ /** REQUIRED: Field-specific validation errors */
88
+ payload: {
89
+ /** Field name mapped to array of error messages */
90
+ validation_errors: Record<string, string[]>;
91
+ /** The invalid value that caused the error */
92
+ invalid_value?: unknown;
93
+ /** The field that caused the primary error */
94
+ primary_field?: string;
95
+ };
96
+ }
97
+ /** ALL POSSIBLE STANDARDIZED RESPONSES */
98
+ export type StandardizedResponse<TData = unknown> = StandardizedApiResponse<TData> | StandardizedPagedResponse<TData> | StandardizedErrorResponse | StandardizedValidationResponse;
99
+ /**
100
+ * Type guard to check if response is a success response
101
+ * THROWS if response doesn't match standardized format
102
+ */
103
+ export declare function isSuccessResponse<TData = unknown>(response: unknown): response is StandardizedApiResponse<TData>;
104
+ /**
105
+ * Type guard to check if response is a paged success response
106
+ * THROWS if response doesn't match standardized format
107
+ */
108
+ export declare function isPagedResponse<TData = unknown>(response: unknown): response is StandardizedPagedResponse<TData>;
109
+ /**
110
+ * Type guard to check if response is an error response
111
+ * THROWS if response doesn't match standardized format
112
+ */
113
+ export declare function isErrorResponse(response: unknown): response is StandardizedErrorResponse;
114
+ /**
115
+ * Type guard to check if response is a validation error
116
+ * THROWS if response doesn't match standardized format
117
+ */
118
+ export declare function isValidationErrorResponse(response: unknown): response is StandardizedValidationResponse;
119
+ /**
120
+ * VALIDATES AND NORMALIZES API RESPONSES
121
+ * This function BREAKS THE BUILD if responses don't match our standard
122
+ * NO EXCEPTIONS - ZERO TOLERANCE FOR BAD RESPONSES
123
+ */
124
+ export declare function validateStandardizedResponse<TData = unknown>(response: unknown, endpoint?: string): StandardizedResponse<TData>;
125
+ /** Extract the data type from a standardized response */
126
+ export type ExtractResponseData<T> = T extends StandardizedApiResponse<infer U> ? U : T extends StandardizedPagedResponse<infer U> ? U[] : never;
127
+ /** Extract the error code from an error response */
128
+ export type ExtractErrorCode<T> = T extends StandardizedErrorResponse ? T['error_code'] : T extends StandardizedValidationResponse ? T['error_code'] : never;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ // ========================================================================================
3
+ // BULLETPROOF API RESPONSE TYPES - ENFORCES STANDARDIZED FORMAT
4
+ // ========================================================================================
5
+ // These types ENFORCE the standardized response format from our Identity API
6
+ // If the API doesn't return this exact structure, TypeScript will break the build
7
+ // NO MORE data.data.data.data NONSENSE - EVER!
8
+ // ========================================================================================
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.isSuccessResponse = isSuccessResponse;
11
+ exports.isPagedResponse = isPagedResponse;
12
+ exports.isErrorResponse = isErrorResponse;
13
+ exports.isValidationErrorResponse = isValidationErrorResponse;
14
+ exports.validateStandardizedResponse = validateStandardizedResponse;
15
+ // ========================================================================================
16
+ // TYPE GUARDS FOR RUNTIME VALIDATION
17
+ // ========================================================================================
18
+ /**
19
+ * Type guard to check if response is a success response
20
+ * THROWS if response doesn't match standardized format
21
+ */
22
+ function isSuccessResponse(response) {
23
+ if (!response || typeof response !== 'object') {
24
+ throw new Error('INVALID_API_RESPONSE: Response is not an object');
25
+ }
26
+ const r = response;
27
+ if (r.success !== true) {
28
+ return false; // This is an error response, not invalid format
29
+ }
30
+ // SUCCESS RESPONSE VALIDATION - BE STRICT!
31
+ if (!('data' in r)) {
32
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "data" field');
33
+ }
34
+ if (!('message' in r) || typeof r.message !== 'string') {
35
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "message" field');
36
+ }
37
+ if (!('operation_code' in r) || typeof r.operation_code !== 'string') {
38
+ throw new Error('INVALID_API_RESPONSE: Success response missing required "operation_code" field');
39
+ }
40
+ return true;
41
+ }
42
+ /**
43
+ * Type guard to check if response is a paged success response
44
+ * THROWS if response doesn't match standardized format
45
+ */
46
+ function isPagedResponse(response) {
47
+ if (!isSuccessResponse(response)) {
48
+ return false;
49
+ }
50
+ const r = response;
51
+ // Check if it has pagination metadata
52
+ if (!('pagination' in r) || typeof r.pagination !== 'object') {
53
+ return false;
54
+ }
55
+ const pagination = r.pagination;
56
+ const requiredPaginationFields = [
57
+ 'current_page', 'total_pages', 'page_size', 'total_items',
58
+ 'has_next_page', 'has_previous_page'
59
+ ];
60
+ for (const field of requiredPaginationFields) {
61
+ if (!(field in pagination)) {
62
+ throw new Error(`INVALID_API_RESPONSE: Paged response missing required pagination.${field}`);
63
+ }
64
+ }
65
+ // Ensure data is an array for paged responses
66
+ if (!Array.isArray(r.data)) {
67
+ throw new Error('INVALID_API_RESPONSE: Paged response data must be an array');
68
+ }
69
+ return true;
70
+ }
71
+ /**
72
+ * Type guard to check if response is an error response
73
+ * THROWS if response doesn't match standardized format
74
+ */
75
+ function isErrorResponse(response) {
76
+ if (!response || typeof response !== 'object') {
77
+ throw new Error('INVALID_API_RESPONSE: Response is not an object');
78
+ }
79
+ const r = response;
80
+ if (r.success !== false) {
81
+ return false; // This is a success response, not invalid format
82
+ }
83
+ // ERROR RESPONSE VALIDATION - BE STRICT!
84
+ if (!('error_code' in r) || typeof r.error_code !== 'string') {
85
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "error_code" field');
86
+ }
87
+ if (!('message' in r) || typeof r.message !== 'string') {
88
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "message" field');
89
+ }
90
+ if (!('operation' in r) || typeof r.operation !== 'string') {
91
+ throw new Error('INVALID_API_RESPONSE: Error response missing required "operation" field');
92
+ }
93
+ return true;
94
+ }
95
+ /**
96
+ * Type guard to check if response is a validation error
97
+ * THROWS if response doesn't match standardized format
98
+ */
99
+ function isValidationErrorResponse(response) {
100
+ if (!isErrorResponse(response)) {
101
+ return false;
102
+ }
103
+ const r = response;
104
+ if (r.error_code !== 'VALIDATION_ERROR') {
105
+ return false;
106
+ }
107
+ // VALIDATION ERROR RESPONSE VALIDATION - BE STRICT!
108
+ if (!('payload' in r) || typeof r.payload !== 'object') {
109
+ throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload" field');
110
+ }
111
+ if (!('validation_errors' in r.payload) || typeof r.payload.validation_errors !== 'object') {
112
+ throw new Error('INVALID_API_RESPONSE: Validation error missing required "payload.validation_errors" field');
113
+ }
114
+ return true;
115
+ }
116
+ // ========================================================================================
117
+ // RESPONSE VALIDATOR - ENFORCES COMPLIANCE AT RUNTIME
118
+ // ========================================================================================
119
+ /**
120
+ * VALIDATES AND NORMALIZES API RESPONSES
121
+ * This function BREAKS THE BUILD if responses don't match our standard
122
+ * NO EXCEPTIONS - ZERO TOLERANCE FOR BAD RESPONSES
123
+ */
124
+ function validateStandardizedResponse(response, endpoint) {
125
+ const context = endpoint ? ` for endpoint: ${endpoint}` : '';
126
+ try {
127
+ // First, basic object validation
128
+ if (!response || typeof response !== 'object') {
129
+ throw new Error(`CRITICAL_API_ERROR: Invalid response object${context}`);
130
+ }
131
+ const r = response;
132
+ // Check for success field (REQUIRED)
133
+ if (!('success' in r) || typeof r.success !== 'boolean') {
134
+ throw new Error(`CRITICAL_API_ERROR: Response missing required boolean "success" field${context}`);
135
+ }
136
+ // Route to appropriate validator based on success status
137
+ if (r.success === true) {
138
+ // Check if it's a paged response
139
+ if ('pagination' in r) {
140
+ if (isPagedResponse(response)) {
141
+ return response;
142
+ }
143
+ }
144
+ else {
145
+ if (isSuccessResponse(response)) {
146
+ return response;
147
+ }
148
+ }
149
+ }
150
+ else if (r.success === false) {
151
+ // Check if it's a validation error
152
+ if (r.error_code === 'VALIDATION_ERROR') {
153
+ if (isValidationErrorResponse(response)) {
154
+ return response;
155
+ }
156
+ }
157
+ else {
158
+ if (isErrorResponse(response)) {
159
+ return response;
160
+ }
161
+ }
162
+ }
163
+ // If we reach here, the response format is invalid
164
+ throw new Error(`CRITICAL_API_ERROR: Response format validation failed${context}. Response: ${JSON.stringify(response, null, 2)}`);
165
+ }
166
+ catch (error) {
167
+ // Re-throw validation errors with context
168
+ const errorMessage = error instanceof Error ? error.message : 'Unknown validation error';
169
+ throw new Error(`${errorMessage}${context}`);
170
+ }
171
+ }