@payez/next-mvp 4.0.0 → 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 (459) hide show
  1. package/package.json +6 -16
  2. package/dist/api/auth-handler.d.ts +0 -66
  3. package/dist/api/auth-handler.js +0 -397
  4. package/dist/api/index.d.ts +0 -10
  5. package/dist/api/index.js +0 -19
  6. package/dist/api-handlers/account/change-password.d.ts +0 -9
  7. package/dist/api-handlers/account/change-password.js +0 -110
  8. package/dist/api-handlers/account/masked-info.d.ts +0 -2
  9. package/dist/api-handlers/account/masked-info.js +0 -41
  10. package/dist/api-handlers/account/profile.d.ts +0 -3
  11. package/dist/api-handlers/account/profile.js +0 -63
  12. package/dist/api-handlers/account/recovery/initiate.d.ts +0 -2
  13. package/dist/api-handlers/account/recovery/initiate.js +0 -26
  14. package/dist/api-handlers/account/recovery/send-code.d.ts +0 -2
  15. package/dist/api-handlers/account/recovery/send-code.js +0 -28
  16. package/dist/api-handlers/account/recovery/verify-code.d.ts +0 -2
  17. package/dist/api-handlers/account/recovery/verify-code.js +0 -28
  18. package/dist/api-handlers/account/reset-password.d.ts +0 -2
  19. package/dist/api-handlers/account/reset-password.js +0 -26
  20. package/dist/api-handlers/account/send-code.d.ts +0 -24
  21. package/dist/api-handlers/account/send-code.js +0 -60
  22. package/dist/api-handlers/account/update-phone.d.ts +0 -27
  23. package/dist/api-handlers/account/update-phone.js +0 -64
  24. package/dist/api-handlers/account/validate-password.d.ts +0 -17
  25. package/dist/api-handlers/account/validate-password.js +0 -81
  26. package/dist/api-handlers/account/verify-email.d.ts +0 -26
  27. package/dist/api-handlers/account/verify-email.js +0 -106
  28. package/dist/api-handlers/account/verify-sms.d.ts +0 -26
  29. package/dist/api-handlers/account/verify-sms.js +0 -106
  30. package/dist/api-handlers/admin/analytics.d.ts +0 -19
  31. package/dist/api-handlers/admin/analytics.js +0 -378
  32. package/dist/api-handlers/admin/audit.d.ts +0 -19
  33. package/dist/api-handlers/admin/audit.js +0 -213
  34. package/dist/api-handlers/admin/index.d.ts +0 -21
  35. package/dist/api-handlers/admin/index.js +0 -42
  36. package/dist/api-handlers/admin/redis-sessions.d.ts +0 -35
  37. package/dist/api-handlers/admin/redis-sessions.js +0 -203
  38. package/dist/api-handlers/admin/sessions.d.ts +0 -20
  39. package/dist/api-handlers/admin/sessions.js +0 -283
  40. package/dist/api-handlers/admin/site-logs.d.ts +0 -45
  41. package/dist/api-handlers/admin/site-logs.js +0 -317
  42. package/dist/api-handlers/admin/stats.d.ts +0 -20
  43. package/dist/api-handlers/admin/stats.js +0 -239
  44. package/dist/api-handlers/admin/users.d.ts +0 -19
  45. package/dist/api-handlers/admin/users.js +0 -221
  46. package/dist/api-handlers/admin/vibe-data.d.ts +0 -79
  47. package/dist/api-handlers/admin/vibe-data.js +0 -267
  48. package/dist/api-handlers/anon/preferences.d.ts +0 -37
  49. package/dist/api-handlers/anon/preferences.js +0 -96
  50. package/dist/api-handlers/auth/jwks.d.ts +0 -2
  51. package/dist/api-handlers/auth/jwks.js +0 -24
  52. package/dist/api-handlers/auth/login.d.ts +0 -42
  53. package/dist/api-handlers/auth/login.js +0 -178
  54. package/dist/api-handlers/auth/refresh.d.ts +0 -74
  55. package/dist/api-handlers/auth/refresh.js +0 -633
  56. package/dist/api-handlers/auth/signout.d.ts +0 -37
  57. package/dist/api-handlers/auth/signout.js +0 -186
  58. package/dist/api-handlers/auth/status.d.ts +0 -8
  59. package/dist/api-handlers/auth/status.js +0 -23
  60. package/dist/api-handlers/auth/update-session.d.ts +0 -37
  61. package/dist/api-handlers/auth/update-session.js +0 -93
  62. package/dist/api-handlers/auth/validate.d.ts +0 -6
  63. package/dist/api-handlers/auth/validate.js +0 -43
  64. package/dist/api-handlers/auth/verify-code.d.ts +0 -43
  65. package/dist/api-handlers/auth/verify-code.js +0 -90
  66. package/dist/api-handlers/session/refresh-viability.d.ts +0 -14
  67. package/dist/api-handlers/session/refresh-viability.js +0 -39
  68. package/dist/api-handlers/session/viability.d.ts +0 -13
  69. package/dist/api-handlers/session/viability.js +0 -114
  70. package/dist/api-handlers/test/force-expire.d.ts +0 -23
  71. package/dist/api-handlers/test/force-expire.js +0 -59
  72. package/dist/auth/auth-decision.d.ts +0 -39
  73. package/dist/auth/auth-decision.js +0 -182
  74. package/dist/auth/auth-options.d.ts +0 -57
  75. package/dist/auth/auth-options.js +0 -213
  76. package/dist/auth/better-auth.d.ts +0 -79
  77. package/dist/auth/better-auth.js +0 -119
  78. package/dist/auth/callbacks/index.d.ts +0 -6
  79. package/dist/auth/callbacks/index.js +0 -12
  80. package/dist/auth/callbacks/jwt.d.ts +0 -45
  81. package/dist/auth/callbacks/jwt.js +0 -305
  82. package/dist/auth/callbacks/session.d.ts +0 -60
  83. package/dist/auth/callbacks/session.js +0 -170
  84. package/dist/auth/callbacks/signin.d.ts +0 -23
  85. package/dist/auth/callbacks/signin.js +0 -44
  86. package/dist/auth/events/index.d.ts +0 -4
  87. package/dist/auth/events/index.js +0 -8
  88. package/dist/auth/events/signout.d.ts +0 -17
  89. package/dist/auth/events/signout.js +0 -32
  90. package/dist/auth/providers/credentials.d.ts +0 -32
  91. package/dist/auth/providers/credentials.js +0 -223
  92. package/dist/auth/providers/index.d.ts +0 -5
  93. package/dist/auth/providers/index.js +0 -21
  94. package/dist/auth/providers/oauth.d.ts +0 -26
  95. package/dist/auth/providers/oauth.js +0 -105
  96. package/dist/auth/route-config.d.ts +0 -66
  97. package/dist/auth/route-config.js +0 -190
  98. package/dist/auth/types/auth-types.d.ts +0 -417
  99. package/dist/auth/types/auth-types.js +0 -53
  100. package/dist/auth/types/index.d.ts +0 -6
  101. package/dist/auth/types/index.js +0 -22
  102. package/dist/auth/unauthenticated-routes.d.ts +0 -1
  103. package/dist/auth/unauthenticated-routes.js +0 -19
  104. package/dist/auth/utils/idp-client.d.ts +0 -94
  105. package/dist/auth/utils/idp-client.js +0 -384
  106. package/dist/auth/utils/index.d.ts +0 -5
  107. package/dist/auth/utils/index.js +0 -21
  108. package/dist/auth/utils/token-utils.d.ts +0 -83
  109. package/dist/auth/utils/token-utils.js +0 -218
  110. package/dist/client/AuthContext.d.ts +0 -19
  111. package/dist/client/AuthContext.js +0 -115
  112. package/dist/client/better-auth-client.d.ts +0 -1020
  113. package/dist/client/better-auth-client.js +0 -68
  114. package/dist/client/fetch-with-auth.d.ts +0 -11
  115. package/dist/client/fetch-with-auth.js +0 -44
  116. package/dist/client/fetchWithSession.d.ts +0 -3
  117. package/dist/client/fetchWithSession.js +0 -24
  118. package/dist/client/index.d.ts +0 -9
  119. package/dist/client/index.js +0 -20
  120. package/dist/client/useAnonSession.d.ts +0 -36
  121. package/dist/client/useAnonSession.js +0 -99
  122. package/dist/components/SessionSync.d.ts +0 -13
  123. package/dist/components/SessionSync.js +0 -121
  124. package/dist/components/SignalRHealthCheck.d.ts +0 -10
  125. package/dist/components/SignalRHealthCheck.js +0 -97
  126. package/dist/components/account/MobileNavDrawer.d.ts +0 -32
  127. package/dist/components/account/MobileNavDrawer.js +0 -81
  128. package/dist/components/account/UserAvatarMenu.d.ts +0 -20
  129. package/dist/components/account/UserAvatarMenu.js +0 -91
  130. package/dist/components/account/index.d.ts +0 -9
  131. package/dist/components/account/index.js +0 -13
  132. package/dist/components/admin/AlertSettingsTab.d.ts +0 -48
  133. package/dist/components/admin/AlertSettingsTab.js +0 -351
  134. package/dist/components/admin/AnalyticsTab.d.ts +0 -22
  135. package/dist/components/admin/AnalyticsTab.js +0 -167
  136. package/dist/components/admin/DataBrowserTab.d.ts +0 -19
  137. package/dist/components/admin/DataBrowserTab.js +0 -252
  138. package/dist/components/admin/LoggingSettingsTab.d.ts +0 -73
  139. package/dist/components/admin/LoggingSettingsTab.js +0 -339
  140. package/dist/components/admin/SessionsTab.d.ts +0 -37
  141. package/dist/components/admin/SessionsTab.js +0 -165
  142. package/dist/components/admin/StatsTab.d.ts +0 -53
  143. package/dist/components/admin/StatsTab.js +0 -161
  144. package/dist/components/admin/VibeAdminContext.d.ts +0 -32
  145. package/dist/components/admin/VibeAdminContext.js +0 -38
  146. package/dist/components/admin/VibeAdminLayout.d.ts +0 -11
  147. package/dist/components/admin/VibeAdminLayout.js +0 -71
  148. package/dist/components/admin/index.d.ts +0 -29
  149. package/dist/components/admin/index.js +0 -44
  150. package/dist/components/auth/FederatedAuthSection.d.ts +0 -8
  151. package/dist/components/auth/FederatedAuthSection.js +0 -45
  152. package/dist/components/auth/ModeAwareLoginPage.d.ts +0 -10
  153. package/dist/components/auth/ModeAwareLoginPage.js +0 -42
  154. package/dist/components/auth/ModeAwareSignupPage.d.ts +0 -9
  155. package/dist/components/auth/ModeAwareSignupPage.js +0 -78
  156. package/dist/components/auth/TraditionalAuthSection.d.ts +0 -14
  157. package/dist/components/auth/TraditionalAuthSection.js +0 -20
  158. package/dist/components/recovery/CompleteStep.d.ts +0 -5
  159. package/dist/components/recovery/CompleteStep.js +0 -8
  160. package/dist/components/recovery/InitiateRecoveryStep.d.ts +0 -8
  161. package/dist/components/recovery/InitiateRecoveryStep.js +0 -20
  162. package/dist/components/recovery/SelectMethodStep.d.ts +0 -8
  163. package/dist/components/recovery/SelectMethodStep.js +0 -8
  164. package/dist/components/recovery/SetPasswordStep.d.ts +0 -6
  165. package/dist/components/recovery/SetPasswordStep.js +0 -20
  166. package/dist/components/recovery/VerifyCodeStep.d.ts +0 -10
  167. package/dist/components/recovery/VerifyCodeStep.js +0 -24
  168. package/dist/components/reserved/ReservedRecoveryWarning.d.ts +0 -38
  169. package/dist/components/reserved/ReservedRecoveryWarning.js +0 -92
  170. package/dist/components/reserved/ReservedStatusBox.d.ts +0 -30
  171. package/dist/components/reserved/ReservedStatusBox.js +0 -71
  172. package/dist/components/ui/BetaBadge.d.ts +0 -29
  173. package/dist/components/ui/BetaBadge.js +0 -38
  174. package/dist/components/ui/Footer.d.ts +0 -37
  175. package/dist/components/ui/Footer.js +0 -41
  176. package/dist/config/env.d.ts +0 -66
  177. package/dist/config/env.js +0 -57
  178. package/dist/config/logger.d.ts +0 -57
  179. package/dist/config/logger.js +0 -73
  180. package/dist/config/logging-config.d.ts +0 -30
  181. package/dist/config/logging-config.js +0 -122
  182. package/dist/config/unauthenticated-routes.d.ts +0 -17
  183. package/dist/config/unauthenticated-routes.js +0 -24
  184. package/dist/config/vibe-log-transport.d.ts +0 -81
  185. package/dist/config/vibe-log-transport.js +0 -212
  186. package/dist/edge/internal-api-url.d.ts +0 -53
  187. package/dist/edge/internal-api-url.js +0 -63
  188. package/dist/edge/middleware.d.ts +0 -14
  189. package/dist/edge/middleware.js +0 -32
  190. package/dist/hooks/useAuth.d.ts +0 -23
  191. package/dist/hooks/useAuth.js +0 -83
  192. package/dist/hooks/useAuthSettings.d.ts +0 -59
  193. package/dist/hooks/useAuthSettings.js +0 -93
  194. package/dist/hooks/useAvailableProviders.d.ts +0 -43
  195. package/dist/hooks/useAvailableProviders.js +0 -112
  196. package/dist/hooks/usePasswordValidation.d.ts +0 -27
  197. package/dist/hooks/usePasswordValidation.js +0 -102
  198. package/dist/hooks/useProfile.d.ts +0 -15
  199. package/dist/hooks/useProfile.js +0 -59
  200. package/dist/hooks/usePublicAuthSettings.d.ts +0 -56
  201. package/dist/hooks/usePublicAuthSettings.js +0 -131
  202. package/dist/hooks/useSessionExpiration.d.ts +0 -56
  203. package/dist/hooks/useSessionExpiration.js +0 -72
  204. package/dist/hooks/useViabilitySession.d.ts +0 -75
  205. package/dist/hooks/useViabilitySession.js +0 -269
  206. package/dist/index.d.ts +0 -12
  207. package/dist/index.js +0 -53
  208. package/dist/lib/anon-session.d.ts +0 -74
  209. package/dist/lib/anon-session.js +0 -169
  210. package/dist/lib/api-handler.d.ts +0 -123
  211. package/dist/lib/api-handler.js +0 -478
  212. package/dist/lib/app-slug.d.ts +0 -95
  213. package/dist/lib/app-slug.js +0 -172
  214. package/dist/lib/demo-mode.d.ts +0 -6
  215. package/dist/lib/demo-mode.js +0 -16
  216. package/dist/lib/geolocation.d.ts +0 -64
  217. package/dist/lib/geolocation.js +0 -235
  218. package/dist/lib/idp-client-config.d.ts +0 -75
  219. package/dist/lib/idp-client-config.js +0 -425
  220. package/dist/lib/idp-fetch.d.ts +0 -14
  221. package/dist/lib/idp-fetch.js +0 -91
  222. package/dist/lib/internal-api.d.ts +0 -87
  223. package/dist/lib/internal-api.js +0 -122
  224. package/dist/lib/jwt-decode-client.d.ts +0 -10
  225. package/dist/lib/jwt-decode-client.js +0 -46
  226. package/dist/lib/jwt-decode.d.ts +0 -48
  227. package/dist/lib/jwt-decode.js +0 -57
  228. package/dist/lib/nextauth-secret.d.ts +0 -10
  229. package/dist/lib/nextauth-secret.js +0 -100
  230. package/dist/lib/rate-limit-service.d.ts +0 -23
  231. package/dist/lib/rate-limit-service.js +0 -6
  232. package/dist/lib/redis.d.ts +0 -5
  233. package/dist/lib/redis.js +0 -28
  234. package/dist/lib/refresh-token-validator.d.ts +0 -13
  235. package/dist/lib/refresh-token-validator.js +0 -117
  236. package/dist/lib/roles.d.ts +0 -145
  237. package/dist/lib/roles.js +0 -168
  238. package/dist/lib/secret-validation.d.ts +0 -4
  239. package/dist/lib/secret-validation.js +0 -14
  240. package/dist/lib/session-store.d.ts +0 -170
  241. package/dist/lib/session-store.js +0 -545
  242. package/dist/lib/session.d.ts +0 -21
  243. package/dist/lib/session.js +0 -26
  244. package/dist/lib/site-logger.d.ts +0 -214
  245. package/dist/lib/site-logger.js +0 -210
  246. package/dist/lib/standardized-client-api.d.ts +0 -161
  247. package/dist/lib/standardized-client-api.js +0 -791
  248. package/dist/lib/startup-init.d.ts +0 -40
  249. package/dist/lib/startup-init.js +0 -257
  250. package/dist/lib/test-aware-get-token.d.ts +0 -2
  251. package/dist/lib/test-aware-get-token.js +0 -86
  252. package/dist/lib/token-expiry.d.ts +0 -14
  253. package/dist/lib/token-expiry.js +0 -39
  254. package/dist/lib/token-lifecycle.d.ts +0 -78
  255. package/dist/lib/token-lifecycle.js +0 -360
  256. package/dist/lib/types/api-responses.d.ts +0 -128
  257. package/dist/lib/types/api-responses.js +0 -171
  258. package/dist/lib/user-agent-parser.d.ts +0 -50
  259. package/dist/lib/user-agent-parser.js +0 -220
  260. package/dist/logging/api/admin-analytics.d.ts +0 -3
  261. package/dist/logging/api/admin-analytics.js +0 -45
  262. package/dist/logging/api/audit-log.d.ts +0 -3
  263. package/dist/logging/api/audit-log.js +0 -52
  264. package/dist/logging/components/AdminAnalyticsLayout.d.ts +0 -10
  265. package/dist/logging/components/AdminAnalyticsLayout.js +0 -11
  266. package/dist/logging/components/AuditLogViewer.d.ts +0 -7
  267. package/dist/logging/components/AuditLogViewer.js +0 -51
  268. package/dist/logging/components/ErrorMetricsCard.d.ts +0 -7
  269. package/dist/logging/components/ErrorMetricsCard.js +0 -16
  270. package/dist/logging/components/HealthMetricsCard.d.ts +0 -7
  271. package/dist/logging/components/HealthMetricsCard.js +0 -19
  272. package/dist/logging/hooks/useAdminAnalytics.d.ts +0 -24
  273. package/dist/logging/hooks/useAdminAnalytics.js +0 -22
  274. package/dist/logging/hooks/useAuditLog.d.ts +0 -6
  275. package/dist/logging/hooks/useAuditLog.js +0 -25
  276. package/dist/logging/hooks/useErrorMetrics.d.ts +0 -6
  277. package/dist/logging/hooks/useErrorMetrics.js +0 -38
  278. package/dist/logging/hooks/useHealthMetrics.d.ts +0 -6
  279. package/dist/logging/hooks/useHealthMetrics.js +0 -41
  280. package/dist/logging/index.d.ts +0 -11
  281. package/dist/logging/index.js +0 -40
  282. package/dist/logging/types/analytics.d.ts +0 -68
  283. package/dist/logging/types/analytics.js +0 -3
  284. package/dist/logging/types/audit.d.ts +0 -29
  285. package/dist/logging/types/audit.js +0 -2
  286. package/dist/logging/types/index.d.ts +0 -2
  287. package/dist/logging/types/index.js +0 -19
  288. package/dist/middleware/auth-decision.d.ts +0 -33
  289. package/dist/middleware/auth-decision.js +0 -65
  290. package/dist/middleware/create-middleware.d.ts +0 -102
  291. package/dist/middleware/create-middleware.js +0 -469
  292. package/dist/middleware/rbac-check.d.ts +0 -51
  293. package/dist/middleware/rbac-check.js +0 -219
  294. package/dist/middleware/twofa-presets.d.ts +0 -134
  295. package/dist/middleware/twofa-presets.js +0 -175
  296. package/dist/models/DecodedAccessToken.d.ts +0 -17
  297. package/dist/models/DecodedAccessToken.js +0 -2
  298. package/dist/models/SessionModel.d.ts +0 -122
  299. package/dist/models/SessionModel.js +0 -136
  300. package/dist/pages/admin-login/page.d.ts +0 -31
  301. package/dist/pages/admin-login/page.js +0 -73
  302. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.d.ts +0 -18
  303. package/dist/pages/admin-page-permissions/PagePermissionsAdminPage.js +0 -276
  304. package/dist/pages/admin-page-permissions/index.d.ts +0 -6
  305. package/dist/pages/admin-page-permissions/index.js +0 -13
  306. package/dist/pages/admin-roles/RolesAdminPage.d.ts +0 -16
  307. package/dist/pages/admin-roles/RolesAdminPage.js +0 -261
  308. package/dist/pages/admin-roles/index.d.ts +0 -8
  309. package/dist/pages/admin-roles/index.js +0 -15
  310. package/dist/pages/admin-roles/modals.d.ts +0 -72
  311. package/dist/pages/admin-roles/modals.js +0 -154
  312. package/dist/pages/client-admin/ClientSiteAdminPage.d.ts +0 -79
  313. package/dist/pages/client-admin/ClientSiteAdminPage.js +0 -179
  314. package/dist/pages/client-admin/index.d.ts +0 -32
  315. package/dist/pages/client-admin/index.js +0 -37
  316. package/dist/pages/coming-soon/page.d.ts +0 -8
  317. package/dist/pages/coming-soon/page.js +0 -28
  318. package/dist/pages/login/page.d.ts +0 -22
  319. package/dist/pages/login/page.js +0 -230
  320. package/dist/pages/profile/EnhancedProfilePage.d.ts +0 -13
  321. package/dist/pages/profile/EnhancedProfilePage.js +0 -150
  322. package/dist/pages/profile/index.d.ts +0 -8
  323. package/dist/pages/profile/index.js +0 -16
  324. package/dist/pages/profile/page.d.ts +0 -19
  325. package/dist/pages/profile/page.js +0 -47
  326. package/dist/pages/profile/profile-patch.d.ts +0 -1
  327. package/dist/pages/profile/profile-patch.js +0 -281
  328. package/dist/pages/recovery/page.d.ts +0 -1
  329. package/dist/pages/recovery/page.js +0 -142
  330. package/dist/pages/roles/MyRolesPage.d.ts +0 -24
  331. package/dist/pages/roles/MyRolesPage.js +0 -71
  332. package/dist/pages/roles/components.d.ts +0 -63
  333. package/dist/pages/roles/components.js +0 -108
  334. package/dist/pages/roles/index.d.ts +0 -8
  335. package/dist/pages/roles/index.js +0 -19
  336. package/dist/pages/security/EnhancedSecurityPage.d.ts +0 -14
  337. package/dist/pages/security/EnhancedSecurityPage.js +0 -248
  338. package/dist/pages/security/index.d.ts +0 -8
  339. package/dist/pages/security/index.js +0 -16
  340. package/dist/pages/security/page.d.ts +0 -21
  341. package/dist/pages/security/page.js +0 -212
  342. package/dist/pages/security/security-patch.d.ts +0 -1
  343. package/dist/pages/security/security-patch.js +0 -302
  344. package/dist/pages/settings/EnhancedSettingsPage.d.ts +0 -46
  345. package/dist/pages/settings/EnhancedSettingsPage.js +0 -231
  346. package/dist/pages/settings/index.d.ts +0 -8
  347. package/dist/pages/settings/index.js +0 -16
  348. package/dist/pages/settings/page.d.ts +0 -7
  349. package/dist/pages/settings/page.js +0 -26
  350. package/dist/pages/showcase/ShowcasePage.d.ts +0 -13
  351. package/dist/pages/showcase/ShowcasePage.js +0 -142
  352. package/dist/pages/showcase/index.d.ts +0 -12
  353. package/dist/pages/showcase/index.js +0 -17
  354. package/dist/pages/test-env/EmergencyLogoutPage.d.ts +0 -14
  355. package/dist/pages/test-env/EmergencyLogoutPage.js +0 -99
  356. package/dist/pages/test-env/JwtInspectPage.d.ts +0 -14
  357. package/dist/pages/test-env/JwtInspectPage.js +0 -116
  358. package/dist/pages/test-env/RefreshTokenPage.d.ts +0 -15
  359. package/dist/pages/test-env/RefreshTokenPage.js +0 -93
  360. package/dist/pages/test-env/TestEnvPage.d.ts +0 -13
  361. package/dist/pages/test-env/TestEnvPage.js +0 -51
  362. package/dist/pages/test-env/index.d.ts +0 -24
  363. package/dist/pages/test-env/index.js +0 -32
  364. package/dist/pages/verify-code/page.d.ts +0 -30
  365. package/dist/pages/verify-code/page.js +0 -412
  366. package/dist/routes/account/index.d.ts +0 -28
  367. package/dist/routes/account/index.js +0 -71
  368. package/dist/routes/account/masked-info.d.ts +0 -33
  369. package/dist/routes/account/masked-info.js +0 -39
  370. package/dist/routes/account/send-code.d.ts +0 -37
  371. package/dist/routes/account/send-code.js +0 -42
  372. package/dist/routes/account/update-phone.d.ts +0 -13
  373. package/dist/routes/account/update-phone.js +0 -17
  374. package/dist/routes/account/verify-email.d.ts +0 -38
  375. package/dist/routes/account/verify-email.js +0 -43
  376. package/dist/routes/account/verify-sms.d.ts +0 -38
  377. package/dist/routes/account/verify-sms.js +0 -43
  378. package/dist/routes/auth/index.d.ts +0 -19
  379. package/dist/routes/auth/index.js +0 -64
  380. package/dist/routes/auth/logout.d.ts +0 -31
  381. package/dist/routes/auth/logout.js +0 -98
  382. package/dist/routes/auth/nextauth.d.ts +0 -22
  383. package/dist/routes/auth/nextauth.js +0 -40
  384. package/dist/routes/auth/refresh.d.ts +0 -30
  385. package/dist/routes/auth/refresh.js +0 -51
  386. package/dist/routes/auth/session.d.ts +0 -43
  387. package/dist/routes/auth/session.js +0 -157
  388. package/dist/routes/auth/settings.d.ts +0 -25
  389. package/dist/routes/auth/settings.js +0 -55
  390. package/dist/routes/auth/viability.d.ts +0 -52
  391. package/dist/routes/auth/viability.js +0 -190
  392. package/dist/routes/index.d.ts +0 -12
  393. package/dist/routes/index.js +0 -54
  394. package/dist/routes/session/index.d.ts +0 -6
  395. package/dist/routes/session/index.js +0 -10
  396. package/dist/routes/session/refresh-viability.d.ts +0 -16
  397. package/dist/routes/session/refresh-viability.js +0 -20
  398. package/dist/server/auth-guard.d.ts +0 -46
  399. package/dist/server/auth-guard.js +0 -128
  400. package/dist/server/auth.d.ts +0 -50
  401. package/dist/server/auth.js +0 -62
  402. package/dist/server/decode-session.d.ts +0 -30
  403. package/dist/server/decode-session.js +0 -78
  404. package/dist/server/slim-middleware.d.ts +0 -23
  405. package/dist/server/slim-middleware.js +0 -89
  406. package/dist/server/with-auth.d.ts +0 -33
  407. package/dist/server/with-auth.js +0 -59
  408. package/dist/services/signalrActivityService.d.ts +0 -44
  409. package/dist/services/signalrActivityService.js +0 -257
  410. package/dist/stores/authStore.d.ts +0 -154
  411. package/dist/stores/authStore.js +0 -1527
  412. package/dist/theme/ThemeProvider.d.ts +0 -14
  413. package/dist/theme/ThemeProvider.js +0 -28
  414. package/dist/theme/default.d.ts +0 -8
  415. package/dist/theme/default.js +0 -33
  416. package/dist/theme/index.d.ts +0 -15
  417. package/dist/theme/index.js +0 -25
  418. package/dist/theme/types.d.ts +0 -56
  419. package/dist/theme/types.js +0 -8
  420. package/dist/theme/useTheme.d.ts +0 -60
  421. package/dist/theme/useTheme.js +0 -63
  422. package/dist/theme/utils.d.ts +0 -13
  423. package/dist/theme/utils.js +0 -39
  424. package/dist/types/api.d.ts +0 -134
  425. package/dist/types/api.js +0 -44
  426. package/dist/types/auth.d.ts +0 -19
  427. package/dist/types/auth.js +0 -2
  428. package/dist/types/logging.d.ts +0 -42
  429. package/dist/types/logging.js +0 -2
  430. package/dist/types/recovery.d.ts +0 -48
  431. package/dist/types/recovery.js +0 -2
  432. package/dist/types/security.d.ts +0 -1
  433. package/dist/types/security.js +0 -2
  434. package/dist/utils/api.d.ts +0 -85
  435. package/dist/utils/api.js +0 -287
  436. package/dist/utils/circuitBreaker.d.ts +0 -43
  437. package/dist/utils/circuitBreaker.js +0 -91
  438. package/dist/utils/error-message.d.ts +0 -1
  439. package/dist/utils/error-message.js +0 -103
  440. package/dist/utils/layout/reservedSpace.d.ts +0 -59
  441. package/dist/utils/layout/reservedSpace.js +0 -102
  442. package/dist/utils/logout.d.ts +0 -14
  443. package/dist/utils/logout.js +0 -32
  444. package/dist/vibe/client.d.ts +0 -261
  445. package/dist/vibe/client.js +0 -445
  446. package/dist/vibe/enterprise-auth.d.ts +0 -106
  447. package/dist/vibe/enterprise-auth.js +0 -173
  448. package/dist/vibe/errors.d.ts +0 -83
  449. package/dist/vibe/errors.js +0 -146
  450. package/dist/vibe/generic.d.ts +0 -234
  451. package/dist/vibe/generic.js +0 -369
  452. package/dist/vibe/hooks/index.d.ts +0 -169
  453. package/dist/vibe/hooks/index.js +0 -252
  454. package/dist/vibe/index.d.ts +0 -25
  455. package/dist/vibe/index.js +0 -72
  456. package/dist/vibe/sessions.d.ts +0 -161
  457. package/dist/vibe/sessions.js +0 -391
  458. package/dist/vibe/types.d.ts +0 -353
  459. package/dist/vibe/types.js +0 -315
@@ -1,261 +0,0 @@
1
- "use strict";
2
- /**
3
- * Role Management Admin Page (/admin/roles)
4
- *
5
- * Design: Aurum (DESIGN_SPEC.md)
6
- * Three sections:
7
- * 1. Available Roles — Cards showing SiteAdmin, ClientAdmin
8
- * 2. User Assignments — Table with inline role dropdowns
9
- * 3. Change History — Audit log of role changes
10
- *
11
- * Design Principles:
12
- * - No shadows, gradients, or animation
13
- * - One accent color (blue #0066cc)
14
- * - Inline interactions (no modals)
15
- * - Scan-friendly tables and lists
16
- */
17
- 'use client';
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.default = RolesAdminPage;
20
- const jsx_runtime_1 = require("react/jsx-runtime");
21
- const react_1 = require("react");
22
- // Mock data
23
- const MOCK_ROLES = [
24
- {
25
- id: 1,
26
- name: 'SiteAdmin',
27
- description: 'System-wide administrator. Manages all vibe_app features.',
28
- userCount: 1,
29
- lastChanged: '3/10/2026 by Admin',
30
- },
31
- {
32
- id: 2,
33
- name: 'ClientAdmin',
34
- description: 'Resume admin for Ideal Resume. Manages users, resumes, audit logs.',
35
- userCount: 2,
36
- lastChanged: '3/9/2026 by Admin',
37
- },
38
- ];
39
- const MOCK_USERS = [
40
- { id: 1, email: 'alice@example.com', role: 'ClientAdmin', assigned: '3/10/2026' },
41
- { id: 2, email: 'bob@example.com', role: 'SiteAdmin', assigned: '2/28/2026' },
42
- { id: 3, email: 'carol@example.com', role: null, assigned: null },
43
- { id: 4, email: 'dave@example.com', role: 'ClientAdmin', assigned: '3/5/2026' },
44
- { id: 5, email: 'eve@example.com', role: 'ClientAdmin', assigned: '3/8/2026' },
45
- ];
46
- const MOCK_CHANGES = [
47
- { timestamp: '3/10/2026, 10:15 AM', event: 'Alice assigned to ClientAdmin by Admin User' },
48
- { timestamp: '3/9/2026, 2:30 PM', event: 'Bob assigned to SiteAdmin by Admin User' },
49
- { timestamp: '3/8/2026, 4:45 PM', event: 'Carol removed from ClientAdmin by Admin User' },
50
- { timestamp: '3/8/2026, 3:00 PM', event: 'SiteAdmin edited: Description changed by Admin User' },
51
- ];
52
- function RolesAdminPage() {
53
- const [users, setUsers] = (0, react_1.useState)(MOCK_USERS);
54
- const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
55
- const [editingUserId, setEditingUserId] = (0, react_1.useState)(null);
56
- const [tempRole, setTempRole] = (0, react_1.useState)(null);
57
- const [message, setMessage] = (0, react_1.useState)(null);
58
- const filteredUsers = users.filter((u) => u.email.toLowerCase().includes(searchQuery.toLowerCase()));
59
- const handleEditRole = (userId, currentRole) => {
60
- setEditingUserId(userId);
61
- setTempRole(currentRole);
62
- };
63
- const handleSaveRole = (userId) => {
64
- setUsers((prev) => prev.map((u) => u.id === userId ? { ...u, role: tempRole, assigned: '3/10/2026' } : u));
65
- setMessage(`Role updated`);
66
- setEditingUserId(null);
67
- setTimeout(() => setMessage(null), 3000);
68
- };
69
- const handleRemoveRole = (userId) => {
70
- setUsers((prev) => prev.map((u) => (u.id === userId ? { ...u, role: null, assigned: null } : u)));
71
- setMessage(`Role removed`);
72
- setTimeout(() => setMessage(null), 3000);
73
- };
74
- return ((0, jsx_runtime_1.jsx)("div", { style: { background: '#f8f8f8', minHeight: '100vh', padding: '40px 20px' }, children: (0, jsx_runtime_1.jsxs)("div", { style: { maxWidth: '1200px', margin: '0 auto' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { marginBottom: '40px' }, children: [(0, jsx_runtime_1.jsx)("h1", { style: {
75
- fontSize: '32px',
76
- fontWeight: 400,
77
- color: '#333',
78
- marginBottom: '8px',
79
- }, children: "Role Management" }), (0, jsx_runtime_1.jsx)("p", { style: { fontSize: '16px', color: '#666', fontWeight: 400 }, children: "Manage who has access to what role" })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '60px' }, children: [(0, jsx_runtime_1.jsx)("h2", { style: {
80
- fontSize: '18px',
81
- fontWeight: 400,
82
- color: '#666',
83
- marginBottom: '24px',
84
- textTransform: 'uppercase',
85
- letterSpacing: '1px',
86
- }, children: "Available Roles" }), (0, jsx_runtime_1.jsx)("div", { style: {
87
- display: 'grid',
88
- gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))',
89
- gap: '24px',
90
- }, children: MOCK_ROLES.map((role) => ((0, jsx_runtime_1.jsxs)("div", { style: {
91
- background: 'white',
92
- border: '1px solid #e0e0e0',
93
- borderRadius: '6px',
94
- padding: '20px',
95
- display: 'flex',
96
- flexDirection: 'column',
97
- transition: 'all 0.2s ease',
98
- cursor: 'default',
99
- }, onMouseEnter: (e) => {
100
- e.currentTarget.style.background = '#f9f9f9';
101
- e.currentTarget.style.borderColor = '#d0d0d0';
102
- }, onMouseLeave: (e) => {
103
- e.currentTarget.style.background = 'white';
104
- e.currentTarget.style.borderColor = '#e0e0e0';
105
- }, children: [(0, jsx_runtime_1.jsx)("h3", { style: {
106
- fontSize: '18px',
107
- fontWeight: 600,
108
- color: '#333',
109
- marginBottom: '8px',
110
- }, children: role.name }), (0, jsx_runtime_1.jsx)("p", { style: {
111
- fontSize: '14px',
112
- color: '#666',
113
- marginBottom: '16px',
114
- flex: 1,
115
- lineHeight: 1.6,
116
- }, children: role.description }), (0, jsx_runtime_1.jsxs)("div", { style: { marginBottom: '16px' }, children: [(0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '12px', color: '#999' }, children: ["Users: ", role.userCount] }), (0, jsx_runtime_1.jsxs)("div", { style: { fontSize: '12px', color: '#999' }, children: ["Last changed: ", role.lastChanged] })] }), (0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [(0, jsx_runtime_1.jsx)("button", { style: {
117
- padding: '8px 16px',
118
- fontSize: '13px',
119
- background: '#0066cc',
120
- color: 'white',
121
- border: 'none',
122
- borderRadius: '4px',
123
- cursor: 'pointer',
124
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#0052a3'), onMouseLeave: (e) => (e.currentTarget.style.background = '#0066cc'), children: "Edit" }), (0, jsx_runtime_1.jsx)("button", { style: {
125
- padding: '8px 16px',
126
- fontSize: '13px',
127
- background: 'white',
128
- color: '#333',
129
- border: '1px solid #e0e0e0',
130
- borderRadius: '4px',
131
- cursor: 'pointer',
132
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "Remove" })] })] }, role.id))) })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { style: { marginBottom: '60px' }, children: [(0, jsx_runtime_1.jsx)("h2", { style: {
133
- fontSize: '18px',
134
- fontWeight: 400,
135
- color: '#666',
136
- marginBottom: '24px',
137
- textTransform: 'uppercase',
138
- letterSpacing: '1px',
139
- }, children: "User Assignments" }), (0, jsx_runtime_1.jsx)("div", { style: { marginBottom: '24px' }, children: (0, jsx_runtime_1.jsx)("input", { type: "text", placeholder: "Search users...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), style: {
140
- width: '100%',
141
- padding: '10px 14px',
142
- fontSize: '14px',
143
- border: '1px solid #e0e0e0',
144
- borderRadius: '4px',
145
- background: 'white',
146
- boxSizing: 'border-box',
147
- } }) }), message && ((0, jsx_runtime_1.jsxs)("div", { style: {
148
- padding: '8px 12px',
149
- background: '#e8f5e9',
150
- color: '#2e7d32',
151
- borderRadius: '4px',
152
- marginBottom: '12px',
153
- fontSize: '13px',
154
- }, children: ["\u2713 ", message] })), (0, jsx_runtime_1.jsxs)("table", { style: {
155
- width: '100%',
156
- borderCollapse: 'collapse',
157
- background: 'white',
158
- border: '1px solid #e0e0e0',
159
- borderRadius: '4px',
160
- overflow: 'hidden',
161
- }, children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsxs)("tr", { style: { background: '#f8f8f8', borderBottom: '1px solid #e0e0e0' }, children: [(0, jsx_runtime_1.jsx)("th", { style: {
162
- padding: '16px',
163
- textAlign: 'left',
164
- fontSize: '12px',
165
- color: '#999',
166
- textTransform: 'uppercase',
167
- letterSpacing: '0.5px',
168
- fontWeight: 'normal',
169
- }, children: "User" }), (0, jsx_runtime_1.jsx)("th", { style: {
170
- padding: '16px',
171
- textAlign: 'left',
172
- fontSize: '12px',
173
- color: '#999',
174
- textTransform: 'uppercase',
175
- letterSpacing: '0.5px',
176
- fontWeight: 'normal',
177
- }, children: "Role" }), (0, jsx_runtime_1.jsx)("th", { style: {
178
- padding: '16px',
179
- textAlign: 'left',
180
- fontSize: '12px',
181
- color: '#999',
182
- textTransform: 'uppercase',
183
- letterSpacing: '0.5px',
184
- fontWeight: 'normal',
185
- }, children: "Assigned" }), (0, jsx_runtime_1.jsx)("th", { style: {
186
- padding: '16px',
187
- textAlign: 'left',
188
- fontSize: '12px',
189
- color: '#999',
190
- textTransform: 'uppercase',
191
- letterSpacing: '0.5px',
192
- fontWeight: 'normal',
193
- }, children: "Actions" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: filteredUsers.map((user) => ((0, jsx_runtime_1.jsxs)("tr", { style: {
194
- borderBottom: '1px solid #e0e0e0',
195
- height: '48px',
196
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: [(0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '14px', color: '#333' }, children: user.email }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '14px' }, children: editingUserId === user.id ? ((0, jsx_runtime_1.jsxs)("select", { value: tempRole || '', onChange: (e) => setTempRole(e.target.value || null), style: {
197
- padding: '6px 10px',
198
- fontSize: '13px',
199
- border: '1px solid #0066cc',
200
- borderRadius: '4px',
201
- background: 'white',
202
- color: '#333',
203
- }, children: [(0, jsx_runtime_1.jsx)("option", { value: "", children: "\u2014 Remove role \u2014" }), (0, jsx_runtime_1.jsx)("option", { value: "SiteAdmin", children: "SiteAdmin" }), (0, jsx_runtime_1.jsx)("option", { value: "ClientAdmin", children: "ClientAdmin" })] })) : user.role ? ((0, jsx_runtime_1.jsx)("span", { style: {
204
- background: '#e3f2fd',
205
- color: '#0066cc',
206
- padding: '6px 10px',
207
- borderRadius: '4px',
208
- fontSize: '13px',
209
- display: 'inline-block',
210
- }, children: user.role })) : ((0, jsx_runtime_1.jsx)("span", { style: { color: '#999', fontStyle: 'italic' }, children: "(none)" })) }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '12px', color: '#999' }, children: user.assigned || '—' }), (0, jsx_runtime_1.jsx)("td", { style: { padding: '16px', fontSize: '13px' }, children: editingUserId === user.id ? ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => handleSaveRole(user.id), style: {
211
- padding: '6px 12px',
212
- background: '#0066cc',
213
- color: 'white',
214
- border: 'none',
215
- borderRadius: '4px',
216
- cursor: 'pointer',
217
- fontSize: '12px',
218
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#0052a3'), onMouseLeave: (e) => (e.currentTarget.style.background = '#0066cc'), children: "Save" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setEditingUserId(null), style: {
219
- padding: '6px 12px',
220
- background: 'white',
221
- color: '#333',
222
- border: '1px solid #e0e0e0',
223
- borderRadius: '4px',
224
- cursor: 'pointer',
225
- fontSize: '12px',
226
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "Cancel" })] })) : ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', gap: '8px' }, children: [user.role && ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRole(user.id, user.role), style: {
227
- padding: '6px 10px',
228
- background: 'white',
229
- color: '#0066cc',
230
- border: '1px solid #e0e0e0',
231
- borderRadius: '4px',
232
- cursor: 'pointer',
233
- fontSize: '12px',
234
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "\u2193" })), !user.role ? ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleEditRole(user.id, null), style: {
235
- padding: '6px 10px',
236
- background: 'white',
237
- color: '#0066cc',
238
- border: '1px solid #e0e0e0',
239
- borderRadius: '4px',
240
- cursor: 'pointer',
241
- fontSize: '12px',
242
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#f5f5f5'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "+" })) : ((0, jsx_runtime_1.jsx)("button", { onClick: () => handleRemoveRole(user.id), style: {
243
- padding: '6px 10px',
244
- background: 'white',
245
- color: '#cc0000',
246
- border: '1px solid #e0e0e0',
247
- borderRadius: '4px',
248
- cursor: 'pointer',
249
- fontSize: '12px',
250
- }, onMouseEnter: (e) => (e.currentTarget.style.background = '#fff0f0'), onMouseLeave: (e) => (e.currentTarget.style.background = 'white'), children: "\u2715" }))] })) })] }, user.id))) })] }), (0, jsx_runtime_1.jsxs)("div", { style: { marginTop: '12px', fontSize: '12px', color: '#999' }, children: [filteredUsers.length, " of ", users.length, " users shown"] })] }), (0, jsx_runtime_1.jsx)("div", { style: { height: '1px', background: '#e0e0e0', margin: '24px 0' } }), (0, jsx_runtime_1.jsxs)("section", { children: [(0, jsx_runtime_1.jsx)("h2", { style: {
251
- fontSize: '18px',
252
- fontWeight: 400,
253
- color: '#666',
254
- marginBottom: '24px',
255
- textTransform: 'uppercase',
256
- letterSpacing: '1px',
257
- }, children: "Recent Changes" }), (0, jsx_runtime_1.jsx)("div", { style: { background: 'white', border: '1px solid #e0e0e0', borderRadius: '4px' }, children: MOCK_CHANGES.map((change, idx) => ((0, jsx_runtime_1.jsxs)("div", { style: {
258
- padding: '16px',
259
- borderBottom: idx < MOCK_CHANGES.length - 1 ? '1px solid #e0e0e0' : 'none',
260
- }, children: [(0, jsx_runtime_1.jsx)("div", { style: { fontSize: '12px', color: '#999', marginBottom: '4px' }, children: change.timestamp }), (0, jsx_runtime_1.jsx)("div", { style: { fontSize: '14px', color: '#333' }, children: change.event })] }, idx))) })] })] }) }));
261
- }
@@ -1,8 +0,0 @@
1
- /**
2
- * Admin Roles Page exports
3
- *
4
- * - RolesAdminPage: Read-only admin interface for viewing roles and permissions (/admin/roles)
5
- *
6
- * MVP scope: Role creation/editing deferred to post-MVP.
7
- */
8
- export { default as RolesAdminPage } from './RolesAdminPage';
@@ -1,15 +0,0 @@
1
- "use strict";
2
- /**
3
- * Admin Roles Page exports
4
- *
5
- * - RolesAdminPage: Read-only admin interface for viewing roles and permissions (/admin/roles)
6
- *
7
- * MVP scope: Role creation/editing deferred to post-MVP.
8
- */
9
- var __importDefault = (this && this.__importDefault) || function (mod) {
10
- return (mod && mod.__esModule) ? mod : { "default": mod };
11
- };
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.RolesAdminPage = void 0;
14
- var RolesAdminPage_1 = require("./RolesAdminPage");
15
- Object.defineProperty(exports, "RolesAdminPage", { enumerable: true, get: function () { return __importDefault(RolesAdminPage_1).default; } });
@@ -1,72 +0,0 @@
1
- /**
2
- * Admin Role Modals for @payez/next-mvp
3
- *
4
- * - RoleEditorModal: Create/edit roles with permissions
5
- * - UserRoleAssignerModal: Assign roles to users
6
- *
7
- * Security Addendum implemented:
8
- * - Role name validation (3-50 chars, lowercase alphanumeric + underscore, no payez_ prefix)
9
- * - Last admin warning
10
- * - IDP roles read-only
11
- * - Self-assignment warning
12
- *
13
- * @see docs/specs/ROLES_MANAGEMENT_SPEC.md
14
- */
15
- interface PagePermission {
16
- page_permission_id: number;
17
- route_pattern: string;
18
- display_name: string;
19
- requires_2fa: boolean;
20
- }
21
- interface Role {
22
- role_id?: number;
23
- role_name: string;
24
- display_name?: string;
25
- description?: string;
26
- page_permissions?: string[];
27
- requires_2fa?: boolean;
28
- is_system_role?: boolean;
29
- }
30
- interface User {
31
- user_id: number;
32
- email: string;
33
- full_name?: string;
34
- roles: {
35
- idp: string[];
36
- app: string[];
37
- };
38
- }
39
- /**
40
- * RoleEditorModal - Create or edit a role
41
- */
42
- export declare function RoleEditorModal({ role, pagePermissions, adminAccessiblePages, onSave, onClose, isDark, }: {
43
- role?: Role;
44
- pagePermissions: PagePermission[];
45
- adminAccessiblePages?: string[];
46
- onSave: (data: {
47
- role_name: string;
48
- display_name?: string;
49
- description?: string;
50
- page_permissions: string[];
51
- requires_2fa: boolean;
52
- }) => Promise<void>;
53
- onClose: () => void;
54
- isDark?: boolean;
55
- }): import("react/jsx-runtime").JSX.Element;
56
- /**
57
- * UserRoleAssignerModal - Assign roles to a user
58
- */
59
- export declare function UserRoleAssignerModal({ user, availableRoles, isLastAdmin, currentUserId, onSave, onClose, isDark, }: {
60
- user: User;
61
- availableRoles: {
62
- role_name: string;
63
- display_name?: string;
64
- description?: string;
65
- }[];
66
- isLastAdmin?: boolean;
67
- currentUserId?: number;
68
- onSave: (userId: number, appRoles: string[]) => Promise<void>;
69
- onClose: () => void;
70
- isDark?: boolean;
71
- }): import("react/jsx-runtime").JSX.Element;
72
- export {};
@@ -1,154 +0,0 @@
1
- "use strict";
2
- /**
3
- * Admin Role Modals for @payez/next-mvp
4
- *
5
- * - RoleEditorModal: Create/edit roles with permissions
6
- * - UserRoleAssignerModal: Assign roles to users
7
- *
8
- * Security Addendum implemented:
9
- * - Role name validation (3-50 chars, lowercase alphanumeric + underscore, no payez_ prefix)
10
- * - Last admin warning
11
- * - IDP roles read-only
12
- * - Self-assignment warning
13
- *
14
- * @see docs/specs/ROLES_MANAGEMENT_SPEC.md
15
- */
16
- 'use client';
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.RoleEditorModal = RoleEditorModal;
19
- exports.UserRoleAssignerModal = UserRoleAssignerModal;
20
- const jsx_runtime_1 = require("react/jsx-runtime");
21
- const react_1 = require("react");
22
- // ============================================================================
23
- // VALIDATION
24
- // ============================================================================
25
- // Role name validation (Security Addendum)
26
- function validateRoleName(name) {
27
- if (!name)
28
- return { valid: false, error: 'Role name is required' };
29
- if (name.length < 3)
30
- return { valid: false, error: 'Role name must be at least 3 characters' };
31
- if (name.length > 50)
32
- return { valid: false, error: 'Role name must be at most 50 characters' };
33
- if (!/^[a-z0-9_]+$/.test(name))
34
- return { valid: false, error: 'Only lowercase letters, numbers, and underscores allowed' };
35
- if (name.startsWith('payez_'))
36
- return { valid: false, error: 'Role name cannot start with "payez_"' };
37
- return { valid: true };
38
- }
39
- // ============================================================================
40
- // ROLE EDITOR MODAL
41
- // ============================================================================
42
- /**
43
- * RoleEditorModal - Create or edit a role
44
- */
45
- function RoleEditorModal({ role, pagePermissions, adminAccessiblePages, onSave, onClose, isDark = true, }) {
46
- const isEditing = !!role?.role_id;
47
- // Form state
48
- const [roleName, setRoleName] = (0, react_1.useState)(role?.role_name || '');
49
- const [displayName, setDisplayName] = (0, react_1.useState)(role?.display_name || '');
50
- const [description, setDescription] = (0, react_1.useState)(role?.description || '');
51
- const [selectedPermissions, setSelectedPermissions] = (0, react_1.useState)(role?.page_permissions || []);
52
- const [requires2FA, setRequires2FA] = (0, react_1.useState)(role?.requires_2fa || false);
53
- const [error, setError] = (0, react_1.useState)('');
54
- const [saving, setSaving] = (0, react_1.useState)(false);
55
- // Role name validation
56
- const [nameValidation, setNameValidation] = (0, react_1.useState)({ valid: true });
57
- (0, react_1.useEffect)(() => {
58
- if (!isEditing && roleName) {
59
- setNameValidation(validateRoleName(roleName));
60
- }
61
- }, [roleName, isEditing]);
62
- // Filter permissions based on admin access (Security Addendum)
63
- const availablePermissions = adminAccessiblePages
64
- ? pagePermissions.filter((p) => adminAccessiblePages.some((ap) => p.route_pattern.startsWith(ap.replace('*', ''))))
65
- : pagePermissions;
66
- const handleSubmit = async (e) => {
67
- e.preventDefault();
68
- setError('');
69
- if (!isEditing) {
70
- const validation = validateRoleName(roleName);
71
- if (!validation.valid) {
72
- setError(validation.error || 'Invalid role name');
73
- return;
74
- }
75
- }
76
- try {
77
- setSaving(true);
78
- await onSave({
79
- role_name: roleName,
80
- display_name: displayName || undefined,
81
- description: description || undefined,
82
- page_permissions: selectedPermissions,
83
- requires_2fa: requires2FA,
84
- });
85
- onClose();
86
- }
87
- catch (err) {
88
- setError(err instanceof Error ? err.message : 'Failed to save role');
89
- }
90
- finally {
91
- setSaving(false);
92
- }
93
- };
94
- const togglePermission = (pattern) => {
95
- setSelectedPermissions((prev) => prev.includes(pattern) ? prev.filter((p) => p !== pattern) : [...prev, pattern]);
96
- };
97
- // Theme colors
98
- const modalBg = isDark ? 'bg-slate-800' : 'bg-white';
99
- const borderColor = isDark ? 'border-slate-700' : 'border-gray-200';
100
- const textPrimary = isDark ? 'text-white' : 'text-gray-900';
101
- const textMuted = isDark ? 'text-slate-400' : 'text-gray-500';
102
- const inputBg = isDark ? 'bg-slate-700' : 'bg-white';
103
- const inputBorder = isDark ? 'border-slate-600' : 'border-gray-300';
104
- return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-lg mx-4 rounded-lg shadow-xl ${modalBg} border ${borderColor} max-h-[90vh] overflow-hidden flex flex-col`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-b ${borderColor} flex items-center justify-between`, children: [(0, jsx_runtime_1.jsx)("h3", { className: `text-lg font-semibold ${textPrimary}`, children: isEditing ? `Edit Role: ${role?.role_name}` : 'Create New Role' }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, className: textMuted, children: (0, jsx_runtime_1.jsx)("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, className: "flex-1 overflow-y-auto", children: [(0, jsx_runtime_1.jsxs)("div", { className: "px-6 py-4 space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: ["Role Name ", (0, jsx_runtime_1.jsx)("span", { className: "text-red-500", children: "*" })] }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: roleName, onChange: (e) => setRoleName(e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, '')), disabled: isEditing, className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary} ${isEditing ? 'opacity-50 cursor-not-allowed' : ''} font-mono`, placeholder: "e.g., content_editor" }), !isEditing && roleName && !nameValidation.valid && ((0, jsx_runtime_1.jsx)("p", { className: "mt-1 text-sm text-red-500", children: nameValidation.error })), !isEditing && ((0, jsx_runtime_1.jsx)("p", { className: `mt-1 text-xs ${textMuted}`, children: "3-50 characters, lowercase letters, numbers, underscores only" }))] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: "Display Name" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: displayName, onChange: (e) => setDisplayName(e.target.value), className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary}`, placeholder: "e.g., Content Editor" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-1 ${textMuted}`, children: "Description" }), (0, jsx_runtime_1.jsx)("textarea", { value: description, onChange: (e) => setDescription(e.target.value), rows: 2, className: `w-full px-3 py-2 rounded-md border ${inputBorder} ${inputBg} ${textPrimary}`, placeholder: "What does this role do?" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Page Permissions" }), (0, jsx_runtime_1.jsx)("div", { className: `border ${borderColor} rounded-md max-h-48 overflow-y-auto`, children: availablePermissions.length === 0 ? ((0, jsx_runtime_1.jsx)("p", { className: `p-3 text-sm ${textMuted}`, children: "No page permissions available" })) : (availablePermissions.map((perm) => ((0, jsx_runtime_1.jsxs)("label", { className: `flex items-center px-3 py-2 border-b last:border-b-0 ${borderColor} cursor-pointer hover:${isDark ? 'bg-slate-700' : 'bg-gray-50'}`, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: selectedPermissions.includes(perm.route_pattern), onChange: () => togglePermission(perm.route_pattern), className: "mr-3" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("span", { className: `font-mono text-sm ${textPrimary}`, children: perm.route_pattern }), perm.display_name && ((0, jsx_runtime_1.jsx)("span", { className: `block text-xs ${textMuted}`, children: perm.display_name }))] })] }, perm.page_permission_id)))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `border-t ${borderColor} pt-4`, children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Security Options" }), (0, jsx_runtime_1.jsxs)("label", { className: "flex items-center cursor-pointer", children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: requires2FA, onChange: (e) => setRequires2FA(e.target.checked), className: "mr-3" }), (0, jsx_runtime_1.jsx)("span", { className: textPrimary, children: "Requires 2FA for all pages" })] })] }), error && ((0, jsx_runtime_1.jsx)("div", { className: "bg-red-900/30 border border-red-600 rounded-lg p-3", children: (0, jsx_runtime_1.jsx)("p", { className: "text-red-400 text-sm", children: error }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-t ${borderColor} flex justify-end gap-3`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: `px-4 py-2 rounded-md border ${borderColor} ${textMuted}`, children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: saving || (!isEditing && !nameValidation.valid), className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50", children: saving ? 'Saving...' : isEditing ? 'Save Changes' : 'Create Role' })] })] })] }) }));
105
- }
106
- // ============================================================================
107
- // USER ROLE ASSIGNER MODAL
108
- // ============================================================================
109
- /**
110
- * UserRoleAssignerModal - Assign roles to a user
111
- */
112
- function UserRoleAssignerModal({ user, availableRoles, isLastAdmin, currentUserId, onSave, onClose, isDark = true, }) {
113
- const [selectedRoles, setSelectedRoles] = (0, react_1.useState)(user.roles.app);
114
- const [saving, setSaving] = (0, react_1.useState)(false);
115
- const [error, setError] = (0, react_1.useState)('');
116
- const handleSubmit = async (e) => {
117
- e.preventDefault();
118
- setError('');
119
- // Security: Self-assignment warning
120
- if (user.user_id === currentUserId) {
121
- if (!confirm('You are modifying your own roles. Changes take effect on next login. Continue?')) {
122
- return;
123
- }
124
- }
125
- // Security Addendum: Last admin warning
126
- const hadAdmin = user.roles.app.some((r) => r.includes('admin'));
127
- const hasAdmin = selectedRoles.some((r) => r.includes('admin'));
128
- if (hadAdmin && !hasAdmin && isLastAdmin) {
129
- if (!confirm('Warning: This is the last administrator. Removing admin access will lock out admin access. Continue?')) {
130
- return;
131
- }
132
- }
133
- try {
134
- setSaving(true);
135
- await onSave(user.user_id, selectedRoles);
136
- onClose();
137
- }
138
- catch (err) {
139
- setError(err instanceof Error ? err.message : 'Failed to update roles');
140
- }
141
- finally {
142
- setSaving(false);
143
- }
144
- };
145
- const toggleRole = (roleName) => {
146
- setSelectedRoles((prev) => prev.includes(roleName) ? prev.filter((r) => r !== roleName) : [...prev, roleName]);
147
- };
148
- // Theme colors
149
- const modalBg = isDark ? 'bg-slate-800' : 'bg-white';
150
- const borderColor = isDark ? 'border-slate-700' : 'border-gray-200';
151
- const textPrimary = isDark ? 'text-white' : 'text-gray-900';
152
- const textMuted = isDark ? 'text-slate-400' : 'text-gray-500';
153
- return ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: `w-full max-w-md mx-4 rounded-lg shadow-xl ${modalBg} border ${borderColor}`, children: [(0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-b ${borderColor} flex items-center justify-between`, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h3", { className: `text-lg font-semibold ${textPrimary}`, children: "Edit Roles" }), (0, jsx_runtime_1.jsx)("p", { className: `text-sm ${textMuted}`, children: user.full_name || user.email })] }), (0, jsx_runtime_1.jsx)("button", { onClick: onClose, className: textMuted, children: (0, jsx_runtime_1.jsx)("svg", { className: "w-5 h-5", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }) })] }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleSubmit, children: [(0, jsx_runtime_1.jsxs)("div", { className: "px-6 py-4 space-y-4", children: [user.roles.idp.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: ["IDP Roles (read-only)", (0, jsx_runtime_1.jsx)("svg", { className: "inline w-4 h-4 ml-1", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "space-y-1", children: user.roles.idp.map((role) => ((0, jsx_runtime_1.jsxs)("div", { className: `flex items-center px-3 py-2 rounded ${isDark ? 'bg-slate-700/50' : 'bg-gray-100'}`, children: [(0, jsx_runtime_1.jsx)("span", { className: textMuted, children: role }), (0, jsx_runtime_1.jsx)("span", { className: `ml-auto text-xs ${textMuted}`, children: "assigned by IDP" })] }, role))) })] })), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: `block text-sm font-medium mb-2 ${textMuted}`, children: "Application Roles" }), (0, jsx_runtime_1.jsx)("div", { className: `border ${borderColor} rounded-md`, children: availableRoles.map((role) => ((0, jsx_runtime_1.jsxs)("label", { className: `flex items-start px-3 py-2 border-b last:border-b-0 ${borderColor} cursor-pointer hover:${isDark ? 'bg-slate-700' : 'bg-gray-50'}`, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: selectedRoles.includes(role.role_name), onChange: () => toggleRole(role.role_name), className: "mt-1 mr-3" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("span", { className: textPrimary, children: role.display_name || role.role_name }), role.description && ((0, jsx_runtime_1.jsx)("span", { className: `block text-xs ${textMuted}`, children: role.description }))] })] }, role.role_name))) })] }), error && ((0, jsx_runtime_1.jsx)("div", { className: "bg-red-900/30 border border-red-600 rounded-lg p-3", children: (0, jsx_runtime_1.jsx)("p", { className: "text-red-400 text-sm", children: error }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: `px-6 py-4 border-t ${borderColor} flex justify-end gap-3`, children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClose, className: `px-4 py-2 rounded-md border ${borderColor} ${textMuted}`, children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: saving, className: "px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50", children: saving ? 'Saving...' : 'Save Changes' })] })] })] }) }));
154
- }
@@ -1,79 +0,0 @@
1
- /**
2
- * =============================================================================
3
- * CLIENT SITE ADMIN - Your App's Admin Dashboard
4
- * =============================================================================
5
- *
6
- * This is the foundation for YOUR app-specific admin area.
7
- * The MVP admin (/admin) handles membership - this handles YOUR data.
8
- *
9
- * SEPARATION OF CONCERNS:
10
- * ┌─────────────────────────────────────────────────────────────────────┐
11
- * │ /admin (MVP Admin) │ /admin/[your-area] (This) │
12
- * │ ───────────────── │ ──────────────────────── │
13
- * │ • User authentication │ • Your app's collections │
14
- * │ • Sessions management │ • Your app's features │
15
- * │ • Role assignments │ • Content moderation │
16
- * │ • Tier/subscription mgmt │ • App-specific analytics │
17
- * │ • Site-wide analytics │ • Custom admin tools │
18
- * │ • vibe_app collection │ • your_app collection │
19
- * └─────────────────────────────────────────────────────────────────────┘
20
- *
21
- * USAGE:
22
- * ```tsx
23
- * // app/admin/your-area/page.tsx
24
- * import { ClientSiteAdminPage } from '@payez/next-mvp/pages/client-admin';
25
- *
26
- * export default function YourAdminPage() {
27
- * return (
28
- * <ClientSiteAdminPage
29
- * title="Your Admin"
30
- * subtitle="Manage your app data"
31
- * collectionName="your_collection"
32
- * tabs={[
33
- * { id: 'overview', label: 'Overview', icon: '📊' },
34
- * { id: 'items', label: 'Items', icon: '📦', table: 'items' },
35
- * ]}
36
- * renderTabContent={(tab, data) => <YourCustomContent />}
37
- * />
38
- * );
39
- * }
40
- * ```
41
- *
42
- * =============================================================================
43
- */
44
- import React from 'react';
45
- export interface ClientAdminTab {
46
- id: string;
47
- label: string;
48
- icon: string;
49
- table?: string;
50
- }
51
- export interface TableStats {
52
- table: string;
53
- count: number;
54
- label: string;
55
- }
56
- export interface ClientSiteAdminProps {
57
- /** Admin area title */
58
- title: string;
59
- /** Subtitle shown under title */
60
- subtitle?: string;
61
- /** Vibe collection name for this admin area */
62
- collectionName: string;
63
- /** Tabs to display */
64
- tabs: ClientAdminTab[];
65
- /** Roles that can access (defaults to vibe_app_admin) */
66
- allowedRoles?: string[];
67
- /** Custom overview content renderer */
68
- renderOverview?: (stats: TableStats[]) => React.ReactNode;
69
- /** Custom tab content renderer */
70
- renderTabContent?: (tab: ClientAdminTab, data: any[], loading: boolean) => React.ReactNode;
71
- /** Theme detection function (optional) */
72
- isDark?: boolean;
73
- /** Back link URL (defaults to /) */
74
- backUrl?: string;
75
- /** Back link label (defaults to "Back to Site") */
76
- backLabel?: string;
77
- }
78
- export declare function ClientSiteAdminPage({ title, subtitle, collectionName, tabs, allowedRoles, renderOverview, renderTabContent, isDark: isDarkProp, backUrl, backLabel, }: ClientSiteAdminProps): import("react/jsx-runtime").JSX.Element | null;
79
- export default ClientSiteAdminPage;