@tinyrack/tinyauth-server 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist/entities/oauth-client.entity.d.ts +36 -0
  2. package/dist/entities/oauth-client.entity.d.ts.map +1 -1
  3. package/dist/entities/oauth-client.entity.js +4 -0
  4. package/dist/entities/oauth-client.entity.js.map +1 -1
  5. package/dist/entities/oauth-code.entity.d.ts +36 -0
  6. package/dist/entities/oauth-code.entity.d.ts.map +1 -1
  7. package/dist/entities/oauth-device-code.entity.d.ts +36 -0
  8. package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
  9. package/dist/entities/oauth-device-code.entity.js +12 -0
  10. package/dist/entities/oauth-device-code.entity.js.map +1 -1
  11. package/dist/entities/revoked-token.entity.d.ts +36 -0
  12. package/dist/entities/revoked-token.entity.d.ts.map +1 -1
  13. package/dist/entities/user-consent.entity.d.ts +36 -0
  14. package/dist/entities/user-consent.entity.d.ts.map +1 -1
  15. package/dist/entrypoints/app.d.ts +326 -16
  16. package/dist/entrypoints/app.d.ts.map +1 -1
  17. package/dist/entrypoints/app.js +33 -7
  18. package/dist/entrypoints/app.js.map +1 -1
  19. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +19 -7
  20. package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
  21. package/dist/entrypoints/database/postgres/compiled-functions.js +213 -39
  22. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  23. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +19 -7
  24. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
  25. package/dist/entrypoints/database/sqlite/compiled-functions.js +213 -39
  26. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  27. package/dist/lib/config/admin.d.ts +9 -0
  28. package/dist/lib/config/admin.d.ts.map +1 -0
  29. package/dist/lib/config/admin.js +13 -0
  30. package/dist/lib/config/admin.js.map +1 -0
  31. package/dist/lib/config/auth.d.ts +85 -0
  32. package/dist/lib/config/auth.d.ts.map +1 -1
  33. package/dist/lib/config/auth.js +61 -0
  34. package/dist/lib/config/auth.js.map +1 -1
  35. package/dist/lib/config/client.d.ts +22 -0
  36. package/dist/lib/config/client.d.ts.map +1 -1
  37. package/dist/lib/config/client.js +18 -0
  38. package/dist/lib/config/client.js.map +1 -1
  39. package/dist/lib/config/index.d.ts +2 -0
  40. package/dist/lib/config/index.d.ts.map +1 -1
  41. package/dist/lib/config/index.js +1 -0
  42. package/dist/lib/config/index.js.map +1 -1
  43. package/dist/lib/config/resolved.d.ts +41 -0
  44. package/dist/lib/config/resolved.d.ts.map +1 -1
  45. package/dist/lib/config/resolved.js +2 -0
  46. package/dist/lib/config/resolved.js.map +1 -1
  47. package/dist/lib/config/server.d.ts.map +1 -1
  48. package/dist/lib/config/server.js +12 -0
  49. package/dist/lib/config/server.js.map +1 -1
  50. package/dist/lib/swagger-tags.d.ts +1 -0
  51. package/dist/lib/swagger-tags.d.ts.map +1 -1
  52. package/dist/lib/swagger-tags.js +1 -0
  53. package/dist/lib/swagger-tags.js.map +1 -1
  54. package/dist/middleware/auth.d.ts +3 -0
  55. package/dist/middleware/auth.d.ts.map +1 -1
  56. package/dist/middleware/auth.js +26 -0
  57. package/dist/middleware/auth.js.map +1 -1
  58. package/dist/middleware/session.d.ts +33 -1
  59. package/dist/middleware/session.d.ts.map +1 -1
  60. package/dist/middleware/session.js +84 -3
  61. package/dist/middleware/session.js.map +1 -1
  62. package/dist/migrations/postgres/Migration20260620025358_add_oauth_client_skip_consent.d.ts +6 -0
  63. package/dist/migrations/postgres/Migration20260620025358_add_oauth_client_skip_consent.d.ts.map +1 -0
  64. package/dist/migrations/postgres/Migration20260620025358_add_oauth_client_skip_consent.js +11 -0
  65. package/dist/migrations/postgres/Migration20260620025358_add_oauth_client_skip_consent.js.map +1 -0
  66. package/dist/migrations/postgres/Migration20260624190500_add_oauth_device_denied_at.d.ts +6 -0
  67. package/dist/migrations/postgres/Migration20260624190500_add_oauth_device_denied_at.d.ts.map +1 -0
  68. package/dist/migrations/postgres/Migration20260624190500_add_oauth_device_denied_at.js +11 -0
  69. package/dist/migrations/postgres/Migration20260624190500_add_oauth_device_denied_at.js.map +1 -0
  70. package/dist/migrations/postgres/Migration20260624223000_add_oauth_device_poll_state.d.ts +6 -0
  71. package/dist/migrations/postgres/Migration20260624223000_add_oauth_device_poll_state.d.ts.map +1 -0
  72. package/dist/migrations/postgres/Migration20260624223000_add_oauth_device_poll_state.js +14 -0
  73. package/dist/migrations/postgres/Migration20260624223000_add_oauth_device_poll_state.js.map +1 -0
  74. package/dist/migrations/postgres/index.d.ts.map +1 -1
  75. package/dist/migrations/postgres/index.js +6 -0
  76. package/dist/migrations/postgres/index.js.map +1 -1
  77. package/dist/migrations/sqlite/Migration20260620025358_add_oauth_client_skip_consent.d.ts +6 -0
  78. package/dist/migrations/sqlite/Migration20260620025358_add_oauth_client_skip_consent.d.ts.map +1 -0
  79. package/dist/migrations/sqlite/Migration20260620025358_add_oauth_client_skip_consent.js +10 -0
  80. package/dist/migrations/sqlite/Migration20260620025358_add_oauth_client_skip_consent.js.map +1 -0
  81. package/dist/migrations/sqlite/Migration20260624190500_add_oauth_device_denied_at.d.ts +6 -0
  82. package/dist/migrations/sqlite/Migration20260624190500_add_oauth_device_denied_at.d.ts.map +1 -0
  83. package/dist/migrations/sqlite/Migration20260624190500_add_oauth_device_denied_at.js +10 -0
  84. package/dist/migrations/sqlite/Migration20260624190500_add_oauth_device_denied_at.js.map +1 -0
  85. package/dist/migrations/sqlite/Migration20260624223000_add_oauth_device_poll_state.d.ts +6 -0
  86. package/dist/migrations/sqlite/Migration20260624223000_add_oauth_device_poll_state.d.ts.map +1 -0
  87. package/dist/migrations/sqlite/Migration20260624223000_add_oauth_device_poll_state.js +12 -0
  88. package/dist/migrations/sqlite/Migration20260624223000_add_oauth_device_poll_state.js.map +1 -0
  89. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  90. package/dist/migrations/sqlite/index.js +6 -0
  91. package/dist/migrations/sqlite/index.js.map +1 -1
  92. package/dist/repositories/oauth-device-code.repository.d.ts +4 -0
  93. package/dist/repositories/oauth-device-code.repository.d.ts.map +1 -1
  94. package/dist/repositories/oauth-device-code.repository.js +19 -0
  95. package/dist/repositories/oauth-device-code.repository.js.map +1 -1
  96. package/dist/repositories/user.repository.d.ts +4 -2
  97. package/dist/repositories/user.repository.d.ts.map +1 -1
  98. package/dist/repositories/user.repository.js +11 -7
  99. package/dist/repositories/user.repository.js.map +1 -1
  100. package/dist/routes/.well-known/openid-configuration/get.d.ts.map +1 -1
  101. package/dist/routes/.well-known/openid-configuration/get.js +4 -0
  102. package/dist/routes/.well-known/openid-configuration/get.js.map +1 -1
  103. package/dist/routes/api/admin/index.d.ts +185 -0
  104. package/dist/routes/api/admin/index.d.ts.map +1 -0
  105. package/dist/routes/api/admin/index.js +13 -0
  106. package/dist/routes/api/admin/index.js.map +1 -0
  107. package/dist/routes/api/admin/me/get.d.ts +26 -0
  108. package/dist/routes/api/admin/me/get.d.ts.map +1 -0
  109. package/dist/routes/api/admin/me/get.js +29 -0
  110. package/dist/routes/api/admin/me/get.js.map +1 -0
  111. package/dist/routes/api/admin/users/index.d.ts +162 -0
  112. package/dist/routes/api/admin/users/index.d.ts.map +1 -0
  113. package/dist/routes/api/admin/users/index.js +166 -0
  114. package/dist/routes/api/admin/users/index.js.map +1 -0
  115. package/dist/routes/api/auth/accounts/get.d.ts +28 -0
  116. package/dist/routes/api/auth/accounts/get.d.ts.map +1 -0
  117. package/dist/routes/api/auth/accounts/get.js +47 -0
  118. package/dist/routes/api/auth/accounts/get.js.map +1 -0
  119. package/dist/routes/api/auth/accounts/remove.post.d.ts +30 -0
  120. package/dist/routes/api/auth/accounts/remove.post.d.ts.map +1 -0
  121. package/dist/routes/api/auth/accounts/remove.post.js +30 -0
  122. package/dist/routes/api/auth/accounts/remove.post.js.map +1 -0
  123. package/dist/routes/api/auth/accounts/select.post.d.ts +31 -0
  124. package/dist/routes/api/auth/accounts/select.post.d.ts.map +1 -0
  125. package/dist/routes/api/auth/accounts/select.post.js +26 -0
  126. package/dist/routes/api/auth/accounts/select.post.js.map +1 -0
  127. package/dist/routes/api/auth/email/verify/post.d.ts +1 -0
  128. package/dist/routes/api/auth/email/verify/post.d.ts.map +1 -1
  129. package/dist/routes/api/auth/index.d.ts +86 -0
  130. package/dist/routes/api/auth/index.d.ts.map +1 -1
  131. package/dist/routes/api/auth/index.js +6 -0
  132. package/dist/routes/api/auth/index.js.map +1 -1
  133. package/dist/routes/api/auth/login/post.d.ts +1 -0
  134. package/dist/routes/api/auth/login/post.d.ts.map +1 -1
  135. package/dist/routes/api/auth/login/post.js +15 -16
  136. package/dist/routes/api/auth/login/post.js.map +1 -1
  137. package/dist/routes/api/auth/passkey/verify/post.d.ts +1 -0
  138. package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
  139. package/dist/routes/api/auth/register/post.d.ts +1 -0
  140. package/dist/routes/api/auth/register/post.d.ts.map +1 -1
  141. package/dist/routes/api/auth/totp/recovery/verify/post.d.ts +1 -0
  142. package/dist/routes/api/auth/totp/recovery/verify/post.d.ts.map +1 -1
  143. package/dist/routes/api/auth/totp/verify/post.d.ts +1 -0
  144. package/dist/routes/api/auth/totp/verify/post.d.ts.map +1 -1
  145. package/dist/routes/api/config/get.d.ts +3 -0
  146. package/dist/routes/api/config/get.d.ts.map +1 -1
  147. package/dist/routes/api/config/get.js +7 -1
  148. package/dist/routes/api/config/get.js.map +1 -1
  149. package/dist/routes/api/config/index.d.ts +3 -0
  150. package/dist/routes/api/config/index.d.ts.map +1 -1
  151. package/dist/routes/api/consent/index.d.ts +10 -0
  152. package/dist/routes/api/consent/index.d.ts.map +1 -1
  153. package/dist/routes/api/consent/post.d.ts +10 -0
  154. package/dist/routes/api/consent/post.d.ts.map +1 -1
  155. package/dist/routes/api/consent/post.js +52 -1
  156. package/dist/routes/api/consent/post.js.map +1 -1
  157. package/dist/routes/api/index.d.ts +310 -26
  158. package/dist/routes/api/index.d.ts.map +1 -1
  159. package/dist/routes/api/index.js +2 -0
  160. package/dist/routes/api/index.js.map +1 -1
  161. package/dist/routes/api/user/index.d.ts +3 -0
  162. package/dist/routes/api/user/index.d.ts.map +1 -1
  163. package/dist/routes/api/user/passkeys/register/verify/post.d.ts +1 -0
  164. package/dist/routes/api/user/passkeys/register/verify/post.d.ts.map +1 -1
  165. package/dist/routes/api/user/session/get.d.ts +1 -0
  166. package/dist/routes/api/user/session/get.d.ts.map +1 -1
  167. package/dist/routes/api/user/totp/confirm/post.d.ts +1 -0
  168. package/dist/routes/api/user/totp/confirm/post.d.ts.map +1 -1
  169. package/dist/routes/index.d.ts +303 -16
  170. package/dist/routes/index.d.ts.map +1 -1
  171. package/dist/routes/oauth/.well-known/openid-configuration/get.d.ts.map +1 -1
  172. package/dist/routes/oauth/.well-known/openid-configuration/get.js +1 -0
  173. package/dist/routes/oauth/.well-known/openid-configuration/get.js.map +1 -1
  174. package/dist/routes/oauth/authorize/get.d.ts +2 -0
  175. package/dist/routes/oauth/authorize/get.d.ts.map +1 -1
  176. package/dist/routes/oauth/authorize/get.js +12 -1
  177. package/dist/routes/oauth/authorize/get.js.map +1 -1
  178. package/dist/routes/oauth/client-auth.js +1 -1
  179. package/dist/routes/oauth/client-auth.js.map +1 -1
  180. package/dist/routes/oauth/cors.d.ts.map +1 -1
  181. package/dist/routes/oauth/cors.js +8 -3
  182. package/dist/routes/oauth/cors.js.map +1 -1
  183. package/dist/routes/oauth/device/get-post.d.ts +2 -1
  184. package/dist/routes/oauth/device/get-post.d.ts.map +1 -1
  185. package/dist/routes/oauth/device/get-post.js +15 -9
  186. package/dist/routes/oauth/device/get-post.js.map +1 -1
  187. package/dist/routes/oauth/device-authorization/post.d.ts.map +1 -1
  188. package/dist/routes/oauth/device-authorization/post.js +2 -0
  189. package/dist/routes/oauth/device-authorization/post.js.map +1 -1
  190. package/dist/routes/oauth/end-session/get.d.ts.map +1 -1
  191. package/dist/routes/oauth/end-session/get.js +17 -8
  192. package/dist/routes/oauth/end-session/get.js.map +1 -1
  193. package/dist/routes/oauth/index.d.ts +5 -2
  194. package/dist/routes/oauth/index.d.ts.map +1 -1
  195. package/dist/routes/oauth/revoke/post.d.ts.map +1 -1
  196. package/dist/routes/oauth/revoke/post.js +2 -0
  197. package/dist/routes/oauth/revoke/post.js.map +1 -1
  198. package/dist/routes/oauth/token/post.d.ts +1 -1
  199. package/dist/routes/oauth/token/post.d.ts.map +1 -1
  200. package/dist/routes/oauth/token/post.js +10 -6
  201. package/dist/routes/oauth/token/post.js.map +1 -1
  202. package/dist/routes/oauth/userinfo/get.d.ts.map +1 -1
  203. package/dist/routes/oauth/userinfo/get.js +12 -6
  204. package/dist/routes/oauth/userinfo/get.js.map +1 -1
  205. package/dist/schemas/error.d.ts +56 -6
  206. package/dist/schemas/error.d.ts.map +1 -1
  207. package/dist/schemas/error.js +4 -2
  208. package/dist/schemas/error.js.map +1 -1
  209. package/dist/schemas/field.d.ts +1 -4
  210. package/dist/schemas/field.d.ts.map +1 -1
  211. package/dist/schemas/field.js +3 -1
  212. package/dist/schemas/field.js.map +1 -1
  213. package/dist/schemas/response.d.ts +97 -0
  214. package/dist/schemas/response.d.ts.map +1 -1
  215. package/dist/schemas/response.js +32 -0
  216. package/dist/schemas/response.js.map +1 -1
  217. package/dist/seeders/config.seeder.js +1 -0
  218. package/dist/seeders/config.seeder.js.map +1 -1
  219. package/dist/services/account-selection.service.d.ts +39 -0
  220. package/dist/services/account-selection.service.d.ts.map +1 -0
  221. package/dist/services/account-selection.service.js +77 -0
  222. package/dist/services/account-selection.service.js.map +1 -0
  223. package/dist/services/container.d.ts +23 -0
  224. package/dist/services/container.d.ts.map +1 -1
  225. package/dist/services/jwt.service.js +3 -3
  226. package/dist/services/jwt.service.js.map +1 -1
  227. package/dist/services/oauth-authorize.service.d.ts +24 -1
  228. package/dist/services/oauth-authorize.service.d.ts.map +1 -1
  229. package/dist/services/oauth-authorize.service.js +233 -8
  230. package/dist/services/oauth-authorize.service.js.map +1 -1
  231. package/dist/services/oauth-client.service.d.ts.map +1 -1
  232. package/dist/services/oauth-client.service.js +1 -0
  233. package/dist/services/oauth-client.service.js.map +1 -1
  234. package/dist/services/oauth-token.service.d.ts +2 -3
  235. package/dist/services/oauth-token.service.d.ts.map +1 -1
  236. package/dist/services/oauth-token.service.js +18 -10
  237. package/dist/services/oauth-token.service.js.map +1 -1
  238. package/dist/services/user-consent.service.d.ts +1 -0
  239. package/dist/services/user-consent.service.d.ts.map +1 -1
  240. package/dist/services/user-consent.service.js +4 -1
  241. package/dist/services/user-consent.service.js.map +1 -1
  242. package/dist/services/user.service.d.ts +28 -1
  243. package/dist/services/user.service.d.ts.map +1 -1
  244. package/dist/services/user.service.js +104 -0
  245. package/dist/services/user.service.js.map +1 -1
  246. package/package.json +1 -1
  247. package/public/assets/2fa-BoyBKrjD.js +2 -0
  248. package/public/assets/2fa-BoyBKrjD.js.map +1 -0
  249. package/public/assets/2fa-DfWvDjDW.js +2 -0
  250. package/public/assets/2fa-DfWvDjDW.js.map +1 -0
  251. package/public/assets/2fa-IkQlgUP0.js +2 -0
  252. package/public/assets/2fa-IkQlgUP0.js.map +1 -0
  253. package/public/assets/2fa-SSKfXB7c.js +2 -0
  254. package/public/assets/2fa-SSKfXB7c.js.map +1 -0
  255. package/public/assets/CheckCircle.es-MnJIACCe.js +2 -0
  256. package/public/assets/CheckCircle.es-MnJIACCe.js.map +1 -0
  257. package/public/assets/EnvelopeSimple.es-BZ7u3LYh.js +2 -0
  258. package/public/assets/EnvelopeSimple.es-BZ7u3LYh.js.map +1 -0
  259. package/public/assets/Fingerprint.es-CW755VWD.js +2 -0
  260. package/public/assets/Fingerprint.es-CW755VWD.js.map +1 -0
  261. package/public/assets/IconBase.es-d5KP98Ac.js +2 -0
  262. package/public/assets/IconBase.es-d5KP98Ac.js.map +1 -0
  263. package/public/assets/Key.es-l5aSxw0I.js +2 -0
  264. package/public/assets/Key.es-l5aSxw0I.js.map +1 -0
  265. package/public/assets/Link.es-B-IJS4Q5.js +2 -0
  266. package/public/assets/Link.es-B-IJS4Q5.js.map +1 -0
  267. package/public/assets/Lock.es-Cb_uwQly.js +2 -0
  268. package/public/assets/Lock.es-Cb_uwQly.js.map +1 -0
  269. package/public/assets/ShieldCheck.es-CscPsYbC.js +2 -0
  270. package/public/assets/ShieldCheck.es-CscPsYbC.js.map +1 -0
  271. package/public/assets/Trash.es-BepW9BwV.js +2 -0
  272. package/public/assets/Trash.es-BepW9BwV.js.map +1 -0
  273. package/public/assets/Warning.es-BPpZIJYZ.js +2 -0
  274. package/public/assets/Warning.es-BPpZIJYZ.js.map +1 -0
  275. package/public/assets/X.es-IwdB4hWT.js +2 -0
  276. package/public/assets/X.es-IwdB4hWT.js.map +1 -0
  277. package/public/assets/admin-D2CMlWzS.js +2 -0
  278. package/public/assets/admin-D2CMlWzS.js.map +1 -0
  279. package/public/assets/admin-users-CTAQJl7w.js +2 -0
  280. package/public/assets/admin-users-CTAQJl7w.js.map +1 -0
  281. package/public/assets/alert-CSXqgDVi.js +2 -0
  282. package/public/assets/alert-CSXqgDVi.js.map +1 -0
  283. package/public/assets/consent-C5Qo0iLd.js +2 -0
  284. package/public/assets/consent-C5Qo0iLd.js.map +1 -0
  285. package/public/assets/consent-DwuWkp63.js +2 -0
  286. package/public/assets/consent-DwuWkp63.js.map +1 -0
  287. package/public/assets/email-CIttZRBe.js +2 -0
  288. package/public/assets/email-CIttZRBe.js.map +1 -0
  289. package/public/assets/email-SSKfXB7c.js +2 -0
  290. package/public/assets/email-SSKfXB7c.js.map +1 -0
  291. package/public/assets/error-D60wkdWN.js +2 -0
  292. package/public/assets/error-D60wkdWN.js.map +1 -0
  293. package/public/assets/footer-link-Ib1Hd-fr.js +2 -0
  294. package/public/assets/footer-link-Ib1Hd-fr.js.map +1 -0
  295. package/public/assets/forgot-SSKfXB7c.js +2 -0
  296. package/public/assets/forgot-SSKfXB7c.js.map +1 -0
  297. package/public/assets/forgot-x-UDyHXT.js +2 -0
  298. package/public/assets/forgot-x-UDyHXT.js.map +1 -0
  299. package/public/assets/icon-input-8iU7PNzd.js +2 -0
  300. package/public/assets/icon-input-8iU7PNzd.js.map +1 -0
  301. package/public/assets/index-CsT6OVnP.js +11 -0
  302. package/public/assets/index-CsT6OVnP.js.map +1 -0
  303. package/public/assets/index-D6-1JDnX.css +2 -0
  304. package/public/assets/login-DhbnCudI.js +2 -0
  305. package/public/assets/login-DhbnCudI.js.map +1 -0
  306. package/public/assets/login-SSKfXB7c.js +2 -0
  307. package/public/assets/login-SSKfXB7c.js.map +1 -0
  308. package/public/assets/modal-BjnpKlXn.js +2 -0
  309. package/public/assets/modal-BjnpKlXn.js.map +1 -0
  310. package/public/assets/mutationOptions-Dfvzj6n2.js +2 -0
  311. package/public/assets/mutationOptions-Dfvzj6n2.js.map +1 -0
  312. package/public/assets/page-header-BYMFSGfT.js +2 -0
  313. package/public/assets/page-header-BYMFSGfT.js.map +1 -0
  314. package/public/assets/page-layout-C475gs09.js +2 -0
  315. package/public/assets/page-layout-C475gs09.js.map +1 -0
  316. package/public/assets/passkey-BdISbWr7.js +2 -0
  317. package/public/assets/passkey-BdISbWr7.js.map +1 -0
  318. package/public/assets/passkey-Bv7zPLAZ.js +2 -0
  319. package/public/assets/passkey-Bv7zPLAZ.js.map +1 -0
  320. package/public/assets/passkey-e6uvApHa.js +2 -0
  321. package/public/assets/passkey-e6uvApHa.js.map +1 -0
  322. package/public/assets/password-CkeV4qxb.js +2 -0
  323. package/public/assets/password-CkeV4qxb.js.map +1 -0
  324. package/public/assets/password-SSKfXB7c.js +2 -0
  325. package/public/assets/password-SSKfXB7c.js.map +1 -0
  326. package/public/assets/password-reset-XZJTgJi3.js +2 -0
  327. package/public/assets/password-reset-XZJTgJi3.js.map +1 -0
  328. package/public/assets/pin-input-BM1UizHr.js +2 -0
  329. package/public/assets/pin-input-BM1UizHr.js.map +1 -0
  330. package/public/assets/profile-D2cuVYgE.js +2 -0
  331. package/public/assets/profile-D2cuVYgE.js.map +1 -0
  332. package/public/assets/profile-TKdT20x5.js +2 -0
  333. package/public/assets/profile-TKdT20x5.js.map +1 -0
  334. package/public/assets/promise-OpBtq8tG.js +2 -0
  335. package/public/assets/promise-OpBtq8tG.js.map +1 -0
  336. package/public/assets/recovery-DM8h2gbb.js +2 -0
  337. package/public/assets/recovery-DM8h2gbb.js.map +1 -0
  338. package/public/assets/register-SSKfXB7c.js +2 -0
  339. package/public/assets/register-SSKfXB7c.js.map +1 -0
  340. package/public/assets/register-vWW_43cD.js +2 -0
  341. package/public/assets/register-vWW_43cD.js.map +1 -0
  342. package/public/assets/reset-CgACYrdp.js +2 -0
  343. package/public/assets/reset-CgACYrdp.js.map +1 -0
  344. package/public/assets/reset-SSKfXB7c.js +2 -0
  345. package/public/assets/reset-SSKfXB7c.js.map +1 -0
  346. package/public/assets/routes-CAIeH5mq.js +2 -0
  347. package/public/assets/routes-CAIeH5mq.js.map +1 -0
  348. package/public/assets/select-BCP5fwfB.js +2 -0
  349. package/public/assets/select-BCP5fwfB.js.map +1 -0
  350. package/public/assets/select-SSKfXB7c.js +2 -0
  351. package/public/assets/select-SSKfXB7c.js.map +1 -0
  352. package/public/assets/standard-schema-o4V-s4uY.js +2 -0
  353. package/public/assets/standard-schema-o4V-s4uY.js.map +1 -0
  354. package/public/assets/submit-button-Xx6DwLyh.js +2 -0
  355. package/public/assets/submit-button-Xx6DwLyh.js.map +1 -0
  356. package/public/assets/terms-DPWrbYY2.js +2 -0
  357. package/public/assets/terms-DPWrbYY2.js.map +1 -0
  358. package/public/assets/terms-TKdT20x5.js +2 -0
  359. package/public/assets/terms-TKdT20x5.js.map +1 -0
  360. package/public/assets/terms-checkbox-list-CdrbHxiF.js +2 -0
  361. package/public/assets/terms-checkbox-list-CdrbHxiF.js.map +1 -0
  362. package/public/assets/totp-CKZ6N1NS.js +2 -0
  363. package/public/assets/totp-CKZ6N1NS.js.map +1 -0
  364. package/public/assets/totp-D-PVOsGQ.js +2 -0
  365. package/public/assets/totp-D-PVOsGQ.js.map +1 -0
  366. package/public/assets/totp-NlqqRp4a.js +2 -0
  367. package/public/assets/totp-NlqqRp4a.js.map +1 -0
  368. package/public/assets/use-theme-cVUDAjtt.js +2 -0
  369. package/public/assets/use-theme-cVUDAjtt.js.map +1 -0
  370. package/public/assets/use-totp-setup-BH75uEbE.js +3 -0
  371. package/public/assets/use-totp-setup-BH75uEbE.js.map +1 -0
  372. package/public/assets/useMutation-DVMopbtG.js +2 -0
  373. package/public/assets/useMutation-DVMopbtG.js.map +1 -0
  374. package/public/assets/users-B7ofdp72.js +2 -0
  375. package/public/assets/users-B7ofdp72.js.map +1 -0
  376. package/public/assets/zod-BItJDQBQ.js +66 -0
  377. package/public/assets/zod-BItJDQBQ.js.map +1 -0
  378. package/public/index.html +6 -2
  379. package/public/assets/index-5_9rzim1.css +0 -2
  380. package/public/assets/index-BTGeW26-.js +0 -75
  381. package/public/assets/index-BTGeW26-.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp-CKZ6N1NS.js","names":["t","InfoIcon","ShieldCheckIcon","WarningCircleIcon","XCircleIcon","useQueryClient","Link","useRouter","useCallback","useEffect","useState","useTranslation","FooterLink","PageHeader","QrStep","RecoveryCodesStep","VerifyStep","Alert","PageLayout","useTotpSetup","TinyAuthError","buildAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","getSessionQueryOptions","ERROR_CODES","TOTP_ALREADY_ENABLED","TOTP_NOT_SETUP","INVALID_TOTP_CODE","UNAUTHORIZED","SECOND_FACTOR_SESSION_EXPIRED","const","Route","ErrorType","REDIRECT_COUNTDOWN_SECONDS","SetupTotp","t","router","queryClient","search","useSearch","errorType","setErrorType","redirectCountdown","setRedirectCountdown","redirectToLogin","navigate","to","redirectToProfile","handleSetupError","error","Error","code","handleVerifySuccess","_data","TotpSetupVerifyResponse","handleConfirmSuccess","data","TotpConfirmResponse","setQueryData","queryKey","user","window","location","href","step","setupData","recoveryCodes","isSetupPending","isVerifyPending","isConfirmPending","startSetup","verify","goToQr","goToVerify","confirmRecoveryCodes","autoStart","onSetupError","onVerifySuccess","onConfirmSuccess","onVerifyError","timer","setInterval","prev","clearInterval","handleVerify","seconds","length","component"],"sources":["../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/XCircle.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/XCircle.es.js","../../../frontend/src/routes/setup/totp/index.tsx?tsr-split=component"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M168.49,104.49,145,128l23.52,23.51a12,12,0,0,1-17,17L128,145l-23.51,23.52a12,12,0,0,1-17-17L111,128,87.51,104.49a12,12,0,0,1,17-17L128,111l23.51-23.52a12,12,0,0,1,17,17ZM236,128A108,108,0,1,1,128,20,108.12,108.12,0,0,1,236,128Zm-24,0a84,84,0,1,0-84,84A84.09,84.09,0,0,0,212,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-96-96A96,96,0,0,1,224,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm37.66,130.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32L139.31,128Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M164.24,100.24,136.48,128l27.76,27.76a6,6,0,1,1-8.48,8.48L128,136.48l-27.76,27.76a6,6,0,0,1-8.48-8.48L119.52,128,91.76,100.24a6,6,0,0,1,8.48-8.48L128,119.52l27.76-27.76a6,6,0,0,1,8.48,8.48ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M165.66,101.66,139.31,128l26.35,26.34a8,8,0,0,1-11.32,11.32L128,139.31l-26.34,26.35a8,8,0,0,1-11.32-11.32L116.69,128,90.34,101.66a8,8,0,0,1,11.32-11.32L128,116.69l26.34-26.35a8,8,0,0,1,11.32,11.32ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M162.83,98.83,133.66,128l29.17,29.17a4,4,0,0,1-5.66,5.66L128,133.66,98.83,162.83a4,4,0,0,1-5.66-5.66L122.34,128,93.17,98.83a4,4,0,0,1,5.66-5.66L128,122.34l29.17-29.17a4,4,0,1,1,5.66,5.66ZM228,128A100,100,0,1,1,128,28,100.11,100.11,0,0,1,228,128Zm-8,0a92,92,0,1,0-92,92A92.1,92.1,0,0,0,220,128Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as e from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/XCircle.es.js\";\nconst o = e.forwardRef((r, c) => /* @__PURE__ */ e.createElement(t, { ref: c, ...r, weights: a }));\no.displayName = \"XCircleIcon\";\nconst s = o;\nexport {\n s as XCircle,\n o as XCircleIcon\n};\n","import {\n InfoIcon,\n ShieldCheckIcon,\n WarningCircleIcon,\n XCircleIcon,\n} from '@phosphor-icons/react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { FooterLink } from '#frontend/components/auth/footer-link.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { QrStep } from '#frontend/components/totp/qr-step.tsx';\nimport { RecoveryCodesStep } from '#frontend/components/totp/recovery-codes-step.tsx';\nimport { VerifyStep } from '#frontend/components/totp/verify-step.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport { useTotpSetup } from '#frontend/features/totp/use-totp-setup.ts';\nimport { TinyAuthError } from '#frontend/libs/error.ts';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport type {\n TotpConfirmResponse,\n TotpSetupVerifyResponse,\n} from '#frontend/queries/totp.ts';\n\n/** Error codes from backend */\nconst ERROR_CODES = {\n TOTP_ALREADY_ENABLED: 'TOTP_ALREADY_ENABLED',\n TOTP_NOT_SETUP: 'TOTP_NOT_SETUP',\n INVALID_TOTP_CODE: 'INVALID_TOTP_CODE',\n UNAUTHORIZED: 'UNAUTHORIZED',\n SECOND_FACTOR_SESSION_EXPIRED: 'SECOND_FACTOR_SESSION_EXPIRED',\n} as const;\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/setup/totp/')({\n component: SetupTotp,\n validateSearch: SearchSchema,\n});\n\ntype ErrorType = 'generic' | 'already_enabled' | 'session_expired';\n\n/** Auto redirect countdown seconds */\nconst REDIRECT_COUNTDOWN_SECONDS = 5;\n\nfunction SetupTotp() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const [errorType, setErrorType] = useState<ErrorType>('generic');\n const [redirectCountdown, setRedirectCountdown] = useState(\n REDIRECT_COUNTDOWN_SECONDS,\n );\n\n const redirectToLogin = useCallback(() => {\n router.navigate({\n to: '/login',\n search: extractOAuthParams(search),\n });\n }, [router, search]);\n\n const redirectToProfile = useCallback(() => {\n router.navigate({ to: '/profile' });\n }, [router]);\n\n const handleSetupError = useCallback((error: Error) => {\n if (error instanceof TinyAuthError) {\n switch (error.code) {\n case ERROR_CODES.TOTP_ALREADY_ENABLED:\n setErrorType('already_enabled');\n break;\n case ERROR_CODES.UNAUTHORIZED:\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n setErrorType('session_expired');\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n break;\n default:\n setErrorType('generic');\n }\n } else {\n setErrorType('generic');\n }\n }, []);\n\n const handleVerifySuccess = useCallback(\n async (_data: TotpSetupVerifyResponse) => {\n // Recovery codes step is handled by useTotpSetup hook\n // (step transitions to 'recovery' automatically)\n // Session update happens after confirm, not here\n await tick();\n },\n [],\n );\n\n const handleConfirmSuccess = useCallback(\n async (data: TotpConfirmResponse) => {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n // Navigate after successful confirm\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n [queryClient, router, search],\n );\n\n const {\n step,\n setupData,\n recoveryCodes,\n isSetupPending,\n isVerifyPending,\n isConfirmPending,\n startSetup,\n verify,\n goToQr,\n goToVerify,\n confirmRecoveryCodes,\n } = useTotpSetup({\n autoStart: true,\n onSetupError: handleSetupError,\n onVerifySuccess: handleVerifySuccess,\n onConfirmSuccess: handleConfirmSuccess,\n onVerifyError: (error) => {\n if (error instanceof TinyAuthError) {\n switch (error.code) {\n case ERROR_CODES.TOTP_ALREADY_ENABLED:\n redirectToProfile();\n break;\n case ERROR_CODES.UNAUTHORIZED:\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n setErrorType('session_expired');\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n break;\n case ERROR_CODES.TOTP_NOT_SETUP:\n startSetup();\n break;\n }\n }\n },\n });\n\n // Auto redirect when session expires\n useEffect(() => {\n if (errorType !== 'session_expired' || step !== 'error') return;\n\n const timer = setInterval(() => {\n setRedirectCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n redirectToLogin();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [errorType, step, redirectToLogin]);\n\n const handleVerify = useCallback(\n async (code: string) => {\n await verify(code);\n },\n [verify],\n );\n\n // Loading state\n if (step === 'loading') {\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.title')}\n />\n <div\n className=\"flex justify-center py-8\"\n data-testid=\"totp-setup-loading\"\n >\n <span className=\"loading loading-spinner loading-lg\" />\n </div>\n </PageLayout>\n );\n }\n\n // Error state\n if (step === 'error') {\n // Session expired error - show countdown and redirect\n if (errorType === 'session_expired') {\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.title')}\n />\n <div\n className=\"alert alert-warning mb-4\"\n data-testid=\"totp-setup-session-expired\"\n >\n <WarningCircleIcon className=\"size-5\" weight=\"fill\" />\n <div className=\"flex flex-col gap-1\">\n <span>{t('setupTotp.error.expired')}</span>\n <span className=\"text-sm opacity-80\">\n {t('setupTotp.redirecting', {\n seconds: redirectCountdown,\n })}\n </span>\n <button\n className=\"btn btn-sm btn-ghost mt-2 w-fit\"\n onClick={redirectToLogin}\n type=\"button\"\n >\n {t('setupTotp.redirectNow')}\n </button>\n </div>\n </div>\n <FooterLink\n as={Link}\n linkText={t('setupTotp.backToLogin')}\n search={extractOAuthParams(search)}\n text=\"\"\n to=\"/login\"\n />\n </PageLayout>\n );\n }\n\n // TOTP already enabled error - redirect to profile\n if (errorType === 'already_enabled') {\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.title')}\n />\n <Alert className=\"mb-4\" icon={InfoIcon} type=\"info\">\n {t('setupTotp.error.alreadyEnabled')}\n </Alert>\n <button\n className=\"btn btn-primary btn-block\"\n onClick={redirectToProfile}\n type=\"button\"\n >\n {t('setupTotp.goToProfile')}\n </button>\n <FooterLink\n as={Link}\n linkText={t('setupTotp.backToLogin')}\n search={extractOAuthParams(search)}\n text=\"\"\n to=\"/login\"\n />\n </PageLayout>\n );\n }\n\n // Generic error - show retry button\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.title')}\n />\n <Alert className=\"mb-4\" icon={XCircleIcon} type=\"error\">\n {t('setupTotp.error.setupFailed')}\n </Alert>\n <button\n className=\"btn btn-primary btn-block\"\n disabled={isSetupPending}\n onClick={startSetup}\n type=\"button\"\n >\n {t('setupTotp.retry')}\n </button>\n <FooterLink\n as={Link}\n linkText={t('setupTotp.backToLogin')}\n search={extractOAuthParams(search)}\n text=\"\"\n to=\"/login\"\n />\n </PageLayout>\n );\n }\n\n // Recovery codes step\n if (step === 'recovery' && recoveryCodes.length > 0) {\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.recoveryCodes.title')}\n />\n <RecoveryCodesStep\n isLoading={isConfirmPending}\n onConfirm={confirmRecoveryCodes}\n recoveryCodes={recoveryCodes}\n />\n </PageLayout>\n );\n }\n\n // QR code step\n if (step === 'qr' && setupData) {\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.subtitle')}\n title={t('setupTotp.title')}\n />\n\n <div className=\"alert alert-info mb-4\">\n <ShieldCheckIcon className=\"size-5\" weight=\"fill\" />\n <span>{t('setupTotp.required')}</span>\n </div>\n\n <QrStep onNext={goToVerify} setupData={setupData} />\n\n <FooterLink\n as={Link}\n linkText={t('setupTotp.backToLogin')}\n search={extractOAuthParams(search)}\n text=\"\"\n to=\"/login\"\n />\n </PageLayout>\n );\n }\n\n // Verify step\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('setupTotp.verifySubtitle')}\n title={t('setupTotp.verifyTitle')}\n />\n\n <VerifyStep\n isPending={isVerifyPending}\n onBack={goToQr}\n onSubmit={handleVerify}\n />\n </PageLayout>\n );\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{n as e,o as t,r as n,s as r,u as i}from"./IconBase.es-d5KP98Ac.js";import{f as a,h as o,ut as s}from"./use-theme-cVUDAjtt.js";import{t as c}from"./useMutation-DVMopbtG.js";import{t as l}from"./page-layout-C475gs09.js";import{c as u,o as d}from"./zod-BItJDQBQ.js";import{A as f,M as p,P as m,S as h,h as g,j as _}from"./index-CsT6OVnP.js";import{t as v}from"./page-header-BYMFSGfT.js";import{t as y}from"./promise-OpBtq8tG.js";import{r as b,t as x}from"./standard-schema-o4V-s4uY.js";import{t as S}from"./footer-link-Ib1Hd-fr.js";import{t as C}from"./submit-button-Xx6DwLyh.js";import{o as w}from"./totp-NlqqRp4a.js";import{t as T}from"./pin-input-BM1UizHr.js";var E=i(r()),D=t(),O={SECOND_FACTOR_SESSION_EXPIRED:`SECOND_FACTOR_SESSION_EXPIRED`,INVALID_TOTP_CODE:`INVALID_TOTP_CODE`,TOTP_NOT_ENABLED:`TOTP_NOT_ENABLED`},k=5;function A(){let{t}=n(),r=o(),i=s(),A=g.useSearch(),j=(0,E.useRef)(null),[M,N]=(0,E.useState)(!1),[P,F]=(0,E.useState)(k),I=(0,E.useMemo)(()=>d({code:u().length(6,t(`validation.totp.length`)).regex(/^\d{6}$/,t(`validation.totp.digits`))}),[t]),L=c({...w,onSuccess:async e=>{i.setQueryData(h.queryKey,{user:e.user}),await y(),p(A)?window.location.href=f(A):r.navigate({to:`/profile`})},onSettled:()=>{i.invalidateQueries({queryKey:h.queryKey})}}),{setValue:R,setError:z,handleSubmit:B,watch:V,formState:{errors:H}}=b({defaultValues:{code:``},resolver:x(I)}),U=V(`code`),W=(0,E.useCallback)(()=>{r.navigate({to:`/login`,search:_(A)})},[r,A]);(0,E.useEffect)(()=>{if(!M)return;let e=setInterval(()=>{F(t=>t<=1?(clearInterval(e),W(),0):t-1)},1e3);return()=>clearInterval(e)},[M,W]);let G=async n=>{try{await L.mutateAsync(n)}catch(n){if(n instanceof e)switch(n.code){case O.SECOND_FACTOR_SESSION_EXPIRED:N(!0),F(k);return;case O.TOTP_NOT_ENABLED:W();return;case O.INVALID_TOTP_CODE:z(`code`,{type:`manual`,message:t(`verifyTotp.error.invalid`)}),R(`code`,``),j.current?.focus();return}z(`code`,{type:`manual`,message:t(`verifyTotp.error.invalid`)}),R(`code`,``),j.current?.focus()}};return(0,D.jsxs)(l,{cardPadding:!0,maxWidth:`100`,children:[(0,D.jsx)(v,{subtitle:t(`verifyTotp.subtitle`),title:t(`verifyTotp.title`)}),M&&(0,D.jsxs)(`div`,{className:`alert alert-warning mb-4`,"data-testid":`totp-verify-session-expired`,children:[(0,D.jsx)(m,{className:`size-5`,weight:`fill`}),(0,D.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,D.jsx)(`span`,{children:t(`verifyTotp.error.expired`)}),(0,D.jsx)(`span`,{className:`text-sm opacity-80`,children:t(`verifyTotp.redirecting`,{seconds:P})}),(0,D.jsx)(`button`,{className:`btn btn-sm btn-ghost mt-2 w-fit`,onClick:W,type:`button`,children:t(`verifyTotp.redirectNow`)})]})]}),(0,D.jsxs)(`form`,{className:`flex flex-col gap-4`,onSubmit:B(G),children:[(0,D.jsx)(T,{autoFocus:!0,disabled:M,error:H.code,length:6,onChange:e=>R(`code`,e),onComplete:()=>B(G)(),ref:j,value:U}),M?(0,D.jsx)(`button`,{className:`btn btn-block btn-disabled mt-2`,disabled:!0,type:`button`,children:t(`verifyTotp.submit`)}):(0,D.jsx)(C,{className:`mt-2`,isPending:L.isPending,pendingText:t(`verifyTotp.submitting`),children:t(`verifyTotp.submit`)})]}),(0,D.jsx)(`div`,{className:`mt-4 text-center`,children:(0,D.jsx)(`button`,{className:`link link-info font-medium text-xs`,"data-testid":`totp-verify-recovery-link`,onClick:()=>r.navigate({to:`/verify/totp/recovery`,search:_(A)}),type:`button`,children:t(`verifyTotp.useRecoveryCode`)})}),(0,D.jsx)(S,{as:a,linkText:t(`verifyTotp.backToLogin`),search:_(A),text:``,to:`/login`})]})}export{A as component};
2
+ //# sourceMappingURL=totp-D-PVOsGQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp-D-PVOsGQ.js","names":["standardSchemaResolver","WarningCircleIcon","useMutation","useQueryClient","Link","useRouter","useCallback","useEffect","useMemo","useRef","useState","useForm","useTranslation","z","FooterLink","PageHeader","SubmitButton","PinInput","PageLayout","TinyAuthError","buildAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","getSessionQueryOptions","verifyTotpLoginMutationOptions","ERROR_CODES","SECOND_FACTOR_SESSION_EXPIRED","INVALID_TOTP_CODE","TOTP_NOT_ENABLED","const","Route","VerifyTotpFormValues","code","REDIRECT_COUNTDOWN_SECONDS","VerifyTotp","t","router","queryClient","search","useSearch","pinInputRef","PinInputRef","sessionExpired","setSessionExpired","redirectCountdown","setRedirectCountdown","verifySchema","object","string","length","regex","verifyMutation","onSuccess","data","setQueryData","queryKey","user","window","location","href","navigate","to","onSettled","invalidateQueries","setValue","setError","handleSubmit","watch","formState","errors","defaultValues","resolver","codeValue","redirectToLogin","timer","setInterval","prev","clearInterval","onSubmit","values","mutateAsync","error","type","message","current","focus","seconds","value","isPending","component"],"sources":["../../../frontend/src/routes/verify/totp/index.tsx?tsr-split=component"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { WarningCircleIcon } from '@phosphor-icons/react';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { FooterLink } from '#frontend/components/auth/footer-link.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { SubmitButton } from '#frontend/components/auth/submit-button.tsx';\nimport {\n PinInput,\n type PinInputRef,\n} from '#frontend/components/ui/pin-input.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport { TinyAuthError } from '#frontend/libs/error.ts';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport { verifyTotpLoginMutationOptions } from '#frontend/queries/totp.ts';\n\n/** Error codes from backend */\nconst ERROR_CODES = {\n SECOND_FACTOR_SESSION_EXPIRED: 'SECOND_FACTOR_SESSION_EXPIRED',\n INVALID_TOTP_CODE: 'INVALID_TOTP_CODE',\n TOTP_NOT_ENABLED: 'TOTP_NOT_ENABLED',\n} as const;\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/verify/totp/')({\n component: VerifyTotp,\n validateSearch: SearchSchema,\n});\n\ntype VerifyTotpFormValues = {\n code: string;\n};\n\n/** Auto redirect countdown seconds */\nconst REDIRECT_COUNTDOWN_SECONDS = 5;\n\nfunction VerifyTotp() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const pinInputRef = useRef<PinInputRef>(null);\n\n const [sessionExpired, setSessionExpired] = useState(false);\n const [redirectCountdown, setRedirectCountdown] = useState(\n REDIRECT_COUNTDOWN_SECONDS,\n );\n\n const verifySchema = useMemo(\n () =>\n z.object({\n code: z\n .string()\n .length(6, t('validation.totp.length'))\n .regex(/^\\d{6}$/, t('validation.totp.digits')),\n }),\n [t],\n );\n\n const verifyMutation = useMutation({\n ...verifyTotpLoginMutationOptions,\n onSuccess: async (data) => {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const {\n setValue,\n setError,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm<VerifyTotpFormValues>({\n defaultValues: {\n code: '',\n },\n resolver: standardSchemaResolver(verifySchema),\n });\n\n const codeValue = watch('code');\n\n // Auto redirect when session expires\n const redirectToLogin = useCallback(() => {\n router.navigate({\n to: '/login',\n search: extractOAuthParams(search),\n });\n }, [router, search]);\n\n useEffect(() => {\n if (!sessionExpired) return;\n\n const timer = setInterval(() => {\n setRedirectCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n redirectToLogin();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [sessionExpired, redirectToLogin]);\n\n const onSubmit = async (values: VerifyTotpFormValues) => {\n try {\n await verifyMutation.mutateAsync(values);\n } catch (error) {\n if (error instanceof TinyAuthError) {\n switch (error.code) {\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n // Session expired - show alert and start auto redirect\n setSessionExpired(true);\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n return;\n\n case ERROR_CODES.TOTP_NOT_ENABLED:\n // TOTP not enabled - redirect to login\n redirectToLogin();\n return;\n\n case ERROR_CODES.INVALID_TOTP_CODE:\n // Invalid code - show specific error and clear input\n setError('code', {\n type: 'manual',\n message: t('verifyTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n return;\n }\n }\n\n // Generic error fallback\n setError('code', {\n type: 'manual',\n message: t('verifyTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n }\n };\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle={t('verifyTotp.subtitle')}\n title={t('verifyTotp.title')}\n />\n\n {sessionExpired && (\n <div\n className=\"alert alert-warning mb-4\"\n data-testid=\"totp-verify-session-expired\"\n >\n <WarningCircleIcon className=\"size-5\" weight=\"fill\" />\n <div className=\"flex flex-col gap-1\">\n <span>{t('verifyTotp.error.expired')}</span>\n <span className=\"text-sm opacity-80\">\n {t('verifyTotp.redirecting', { seconds: redirectCountdown })}\n </span>\n <button\n className=\"btn btn-sm btn-ghost mt-2 w-fit\"\n onClick={redirectToLogin}\n type=\"button\"\n >\n {t('verifyTotp.redirectNow')}\n </button>\n </div>\n </div>\n )}\n\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit(onSubmit)}>\n <PinInput\n autoFocus\n disabled={sessionExpired}\n error={errors.code}\n length={6}\n onChange={(value) => setValue('code', value)}\n onComplete={() => handleSubmit(onSubmit)()}\n ref={pinInputRef}\n value={codeValue}\n />\n\n {sessionExpired ? (\n <button\n className=\"btn btn-block btn-disabled mt-2\"\n disabled\n type=\"button\"\n >\n {t('verifyTotp.submit')}\n </button>\n ) : (\n <SubmitButton\n className=\"mt-2\"\n isPending={verifyMutation.isPending}\n pendingText={t('verifyTotp.submitting')}\n >\n {t('verifyTotp.submit')}\n </SubmitButton>\n )}\n </form>\n\n <div className=\"mt-4 text-center\">\n <button\n className=\"link link-info font-medium text-xs\"\n data-testid=\"totp-verify-recovery-link\"\n onClick={() =>\n router.navigate({\n to: '/verify/totp/recovery',\n search: extractOAuthParams(search),\n })\n }\n type=\"button\"\n >\n {t('verifyTotp.useRecoveryCode')}\n </button>\n </div>\n\n <FooterLink\n as={Link}\n linkText={t('verifyTotp.backToLogin')}\n search={extractOAuthParams(search)}\n text=\"\"\n to=\"/login\"\n />\n </PageLayout>\n );\n}\n"],"mappings":"8qBA4BM0B,EAAc,CAClBC,8BAA+B,gCAC/BC,kBAAmB,oBACnBC,iBAAkB,kBACpB,EAcMK,EAA6B,EAEnC,SAASC,GAAa,CACpB,GAAM,CAAEC,GAAMxB,EAAe,EACvByB,EAAShC,EAAU,EACnBiC,EAAcnC,EAAe,EAC7BoC,EAASR,EAAMS,UAAU,EACzBC,GAAAA,EAAAA,EAAAA,QAAkC,IAAI,EAEtC,CAACE,EAAgBC,IAAAA,EAAAA,EAAAA,UAA8B,EAAK,EACpD,CAACC,EAAmBC,IAAAA,EAAAA,EAAAA,UACxBZ,CACF,EAEMa,GAAAA,EAAAA,EAAAA,aAEFlC,EAAS,CACPoB,KAAMpB,EACI,EACPqC,OAAO,EAAGd,EAAE,wBAAwB,CAAC,EACrCe,MAAM,UAAWf,EAAE,wBAAwB,CAAC,CACjD,CAAC,EACH,CAACA,CAAC,CACJ,EAEMgB,EAAiBlD,EAAY,CACjC,GAAGuB,EACH4B,UAAW,KAAOC,IAAS,CACzBhB,EAAYiB,aAAa/B,EAAuBgC,SAAU,CACxDC,KAAMH,EAAKG,IACb,CAAC,EACD,MAAMlC,EAAK,EAEPD,EAAYiB,CAAM,EACpBmB,OAAOC,SAASC,KAAOxC,EAAkBmB,CAAM,EAE/CF,EAAOwB,SAAS,CAAEC,GAAI,UAAW,CAAC,CAEtC,EACAC,cAAiB,CACfzB,EAAY0B,kBAAkB,CAC5BR,SAAUhC,EAAuBgC,QACnC,CAAC,CACH,CACF,CAAC,EAEK,CACJS,WACAC,WACAC,eACAC,QACAC,UAAW,CAAEC,WACX3D,EAA8B,CAChC4D,cAAe,CACbtC,KAAM,EACR,EACAuC,SAAUxE,EAAuB+C,CAAY,CAC/C,CAAC,EAEK0B,EAAYL,EAAM,MAAM,EAGxBM,GAAAA,EAAAA,EAAAA,iBAAoC,CACxCrC,EAAOwB,SAAS,CACdC,GAAI,SACJvB,OAAQlB,EAAmBkB,CAAM,CACnC,CAAC,CACH,EAAG,CAACF,EAAQE,CAAM,CAAC,GAEnBhC,EAAAA,EAAAA,eAAgB,CACd,GAAI,CAACoC,EAAgB,OAErB,IAAMgC,EAAQC,gBAAkB,CAC9B9B,EAAsB+B,GAChBA,GAAQ,GACVC,cAAcH,CAAK,EACnBD,EAAgB,EACT,GAEFG,EAAO,CACf,CACH,EAAG,GAAI,EAEP,UAAaC,cAAcH,CAAK,CAClC,EAAG,CAAChC,EAAgB+B,CAAe,CAAC,EAEpC,IAAMK,EAAW,KAAOC,IAAiC,CACvD,GAAI,CACF,MAAM5B,EAAe6B,YAAYD,CAAM,CACzC,OAASE,EAAO,CACd,GAAIA,aAAiB/D,EACnB,OAAQ+D,EAAMjD,KAAd,CACE,KAAKP,EAAYC,8BAEfiB,EAAkB,EAAI,EACtBE,EAAqBZ,CAA0B,EAC/C,OAEF,KAAKR,EAAYG,iBAEf6C,EAAgB,EAChB,OAEF,KAAKhD,EAAYE,kBAEfsC,EAAS,OAAQ,CACfiB,KAAM,SACNC,QAAShD,EAAE,0BAA0B,CACvC,CAAC,EACD6B,EAAS,OAAQ,EAAE,EACnBxB,EAAY4C,SAASC,MAAM,EAC3B,MACJ,CAIFpB,EAAS,OAAQ,CACfiB,KAAM,SACNC,QAAShD,EAAE,0BAA0B,CACvC,CAAC,EACD6B,EAAS,OAAQ,EAAE,EACnBxB,EAAY4C,SAASC,MAAM,CAC7B,CACF,EAEA,OACE,EAAA,EAAA,MAAC,EAAD,CAAY,YAAA,GAAY,SAAS,eAAjC,EACE,EAAA,EAAA,KAAC,EAAD,CACE,SAAUlD,EAAE,qBAAqB,EACjC,MAAOA,EAAE,kBAAkB,CAAE,CAAA,EAG9BO,IACC,EAAA,EAAA,MAAC,MAAD,CACE,UAAU,2BACV,cAAY,uCAFd,EAIE,EAAA,EAAA,KAAC,EAAD,CAAmB,UAAU,SAAS,OAAO,MAAM,CAAA,GACnD,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,+BAAf,EACE,EAAA,EAAA,KAAC,OAAD,CAAA,SAAOP,EAAE,0BAA0B,CAAQ,CAAA,GAC3C,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,8BACbA,EAAE,yBAA0B,CAAEmD,QAAS1C,CAAkB,CAAC,CACvD,CAAA,GACN,EAAA,EAAA,KAAC,SAAD,CACE,UAAU,kCACV,QAAS6B,EACT,KAAK,kBAEJtC,EAAE,wBAAwB,CACrB,CAAA,CACL,GACF,KAGP,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,sBAAsB,SAAU+B,EAAaY,CAAQ,WAArE,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAA,GACA,SAAUpC,EACV,MAAO2B,EAAOrC,KACd,OAAQ,EACR,SAAWuD,GAAUvB,EAAS,OAAQuB,CAAK,EAC3C,eAAkBrB,EAAaY,CAAQ,EAAE,EACzC,IAAKtC,EACL,MAAOgC,CAAU,CAAA,EAGlB9B,GACC,EAAA,EAAA,KAAC,SAAD,CACE,UAAU,kCACV,SAAA,GACA,KAAK,kBAEJP,EAAE,mBAAmB,CAChB,CAAA,GAER,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,OACV,UAAWgB,EAAeqC,UAC1B,YAAarD,EAAE,uBAAuB,WAErCA,EAAE,mBAAmB,CACV,CAAA,CAEZ,KAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,KAAC,SAAD,CACE,UAAU,qCACV,cAAY,4BACZ,YACEC,EAAOwB,SAAS,CACdC,GAAI,wBACJvB,OAAQlB,EAAmBkB,CAAM,CACnC,CAAC,EAEH,KAAK,kBAEJH,EAAE,4BAA4B,CACzB,CAAA,CACL,CAAA,GAEL,EAAA,EAAA,KAAC,EAAD,CACE,GAAIhC,EACJ,SAAUgC,EAAE,wBAAwB,EACpC,OAAQf,EAAmBkB,CAAM,EACjC,KAAK,GACL,GAAG,QAAQ,CAAA,CAEH,GAEhB"}
@@ -0,0 +1,2 @@
1
+ import{a as e,i as t}from"./use-theme-cVUDAjtt.js";import{t as n}from"./mutationOptions-Dfvzj6n2.js";var r=n({mutationFn:async()=>e(await t.api.user.totp.setup.$post())}),i=n({mutationFn:async n=>e(await t.api.user.totp.verify.$post({json:n}))}),a=n({mutationFn:async()=>e(await t.api.user.totp.confirm.$post({json:{}}))}),o=n({mutationFn:async n=>e(await t.api.user.totp.$delete({json:n}))}),s=n({mutationFn:async n=>e(await t.api.user.totp.recovery.regenerate.$post({json:n}))}),c=n({mutationFn:async n=>e(await t.api.auth.totp.verify.$post({json:n}))}),l=n({mutationFn:async n=>e(await t.api.auth.totp.recovery.verify.$post({json:n}))});export{l as a,r as i,o as n,c as o,s as r,i as s,a as t};
2
+ //# sourceMappingURL=totp-NlqqRp4a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp-NlqqRp4a.js","names":[],"sources":["../../../frontend/src/queries/totp.ts"],"sourcesContent":["import { mutationOptions } from '@tanstack/react-query';\nimport type { InferRequestType, InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type TotpSetupResponse = InferResponseType<\n (typeof client.api.user.totp.setup)['$post'],\n 200\n>;\n\nexport type TotpSetupVerifyResponse = InferResponseType<\n (typeof client.api.user.totp.verify)['$post'],\n 200\n>;\n\nexport type TotpConfirmResponse = InferResponseType<\n (typeof client.api.user.totp.confirm)['$post'],\n 200\n>;\n\nexport type RegenerateTotpRecoveryCodesResponse = InferResponseType<\n (typeof client.api.user.totp.recovery.regenerate)['$post'],\n 200\n>;\n\nexport type TotpLoginVerifyResponse = InferResponseType<\n (typeof client.api.auth.totp.verify)['$post'],\n 200\n>;\n\n/**\n * Start TOTP setup - generates secret and QR code\n */\nexport const startTotpSetupMutationOptions = mutationOptions({\n mutationFn: async () => {\n const res = await client.api.user.totp.setup.$post();\n return jsonOk(res);\n },\n});\n\n/**\n * Verify TOTP code during setup (returns recovery codes)\n */\nexport type VerifyTotpParams = InferRequestType<\n (typeof client.api.user.totp.verify)['$post']\n>['json'];\n\nexport const verifyTotpMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyTotpParams) => {\n const res = await client.api.user.totp.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\n/**\n * Confirm TOTP setup after user acknowledges recovery\n * codes\n */\nexport const confirmTotpSetupMutationOptions = mutationOptions({\n mutationFn: async () => {\n const res = await client.api.user.totp.confirm.$post({\n json: {},\n });\n return jsonOk(res);\n },\n});\n\n/**\n * Disable TOTP authentication\n */\nexport type DisableTotpParams = InferRequestType<\n (typeof client.api.user.totp)['$delete']\n>['json'];\n\nexport const disableTotpMutationOptions = mutationOptions({\n mutationFn: async (values: DisableTotpParams) => {\n const res = await client.api.user.totp.$delete({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\nexport type RegenerateTotpRecoveryCodesParams = InferRequestType<\n (typeof client.api.user.totp.recovery.regenerate)['$post']\n>['json'];\n\nexport const regenerateTotpRecoveryCodesMutationOptions = mutationOptions({\n mutationFn: async (values: RegenerateTotpRecoveryCodesParams) => {\n const res = await client.api.user.totp.recovery.regenerate.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\n/**\n * Verify TOTP code during login (complete 2FA login)\n */\nexport type VerifyTotpLoginParams = InferRequestType<\n (typeof client.api.auth.totp.verify)['$post']\n>['json'];\n\nexport const verifyTotpLoginMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyTotpLoginParams) => {\n const res = await client.api.auth.totp.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\n/**\n * Verify recovery code during login (complete 2FA login)\n */\nexport type VerifyRecoveryCodeParams = InferRequestType<\n (typeof client.api.auth.totp.recovery.verify)['$post']\n>['json'];\n\nexport type VerifyRecoveryCodeResponse = InferResponseType<\n (typeof client.api.auth.totp.recovery.verify)['$post'],\n 200\n>;\n\nexport const verifyRecoveryCodeMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyRecoveryCodeParams) => {\n const res = await client.api.auth.totp.recovery.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n"],"mappings":"qGAgCA,IAAa,EAAgC,EAAgB,CAC3D,WAAY,SAEH,EAAO,MADI,EAAO,IAAI,KAAK,KAAK,MAAM,MAAM,CAClC,CAErB,CAAC,EASY,EAA4B,EAAgB,CACvD,WAAY,KAAO,IAIV,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,OAAO,MAAM,CAClD,KAAM,CACR,CAAC,CACgB,CAErB,CAAC,EAMY,EAAkC,EAAgB,CAC7D,WAAY,SAIH,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,QAAQ,MAAM,CACnD,KAAM,CAAC,CACT,CAAC,CACgB,CAErB,CAAC,EASY,EAA6B,EAAgB,CACxD,WAAY,KAAO,IAIV,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,QAAQ,CAC7C,KAAM,CACR,CAAC,CACgB,CAErB,CAAC,EAMY,EAA6C,EAAgB,CACxE,WAAY,KAAO,IAIV,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,SAAS,WAAW,MAAM,CAC/D,KAAM,CACR,CAAC,CACgB,CAErB,CAAC,EASY,EAAiC,EAAgB,CAC5D,WAAY,KAAO,IAIV,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,OAAO,MAAM,CAClD,KAAM,CACR,CAAC,CACgB,CAErB,CAAC,EAcY,EAAoC,EAAgB,CAC/D,WAAY,KAAO,IAIV,EAAO,MAHI,EAAO,IAAI,KAAK,KAAK,SAAS,OAAO,MAAM,CAC3D,KAAM,CACR,CAAC,CACgB,CAErB,CAAC"}