@eva_solutions/auth-sdk 0.0.0-stage → 3.0.0-dev-20261109133200

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 (205) hide show
  1. package/CHANGELOG.md +290 -0
  2. package/LICENSE +21 -0
  3. package/README.md +481 -2
  4. package/dist/admin/index.cjs +4 -0
  5. package/dist/admin/index.d.cts +2 -0
  6. package/dist/admin/index.d.ts +2 -0
  7. package/dist/admin/index.js +1 -0
  8. package/dist/admin-DjvuvuI8.js +408 -0
  9. package/dist/admin-DjvuvuI8.js.map +1 -0
  10. package/dist/admin-Q6lbWqLM.cjs +419 -0
  11. package/dist/admin-Q6lbWqLM.cjs.map +1 -0
  12. package/dist/api-path-2Ulruz7R.cjs +34 -0
  13. package/dist/api-path-2Ulruz7R.cjs.map +1 -0
  14. package/dist/api-path-B-vSkL2H.js +29 -0
  15. package/dist/api-path-B-vSkL2H.js.map +1 -0
  16. package/dist/auth-19r-Q6X2.js +84 -0
  17. package/dist/auth-19r-Q6X2.js.map +1 -0
  18. package/dist/auth-DX1N5JA4.cjs +131 -0
  19. package/dist/auth-DX1N5JA4.cjs.map +1 -0
  20. package/dist/auth-handlers-B3iJaPln.js +343 -0
  21. package/dist/auth-handlers-B3iJaPln.js.map +1 -0
  22. package/dist/auth-handlers-BTbXKJms.d.ts +15 -0
  23. package/dist/auth-handlers-BTbXKJms.d.ts.map +1 -0
  24. package/dist/auth-handlers-CDzGFDTu.cjs +404 -0
  25. package/dist/auth-handlers-CDzGFDTu.cjs.map +1 -0
  26. package/dist/auth-handlers-DRUUTEtW.d.cts +15 -0
  27. package/dist/auth-handlers-DRUUTEtW.d.cts.map +1 -0
  28. package/dist/catalog-CHPqldcj.cjs +172 -0
  29. package/dist/catalog-CHPqldcj.cjs.map +1 -0
  30. package/dist/catalog-CIqpzgsM.d.cts +75 -0
  31. package/dist/catalog-CIqpzgsM.d.cts.map +1 -0
  32. package/dist/catalog-CIqpzgsM.d.ts +75 -0
  33. package/dist/catalog-CIqpzgsM.d.ts.map +1 -0
  34. package/dist/catalog-DqPhtCKZ.js +95 -0
  35. package/dist/catalog-DqPhtCKZ.js.map +1 -0
  36. package/dist/config-3avoUa9e.d.cts +95 -0
  37. package/dist/config-3avoUa9e.d.cts.map +1 -0
  38. package/dist/config-COX7rGAP.d.ts +95 -0
  39. package/dist/config-COX7rGAP.d.ts.map +1 -0
  40. package/dist/constants-BE1_9Tod.cjs +52 -0
  41. package/dist/constants-BE1_9Tod.cjs.map +1 -0
  42. package/dist/constants-BY7QZokc.js +29 -0
  43. package/dist/constants-BY7QZokc.js.map +1 -0
  44. package/dist/constants-CcbhOaAP.cjs +153 -0
  45. package/dist/constants-CcbhOaAP.cjs.map +1 -0
  46. package/dist/constants-rNuD5qJn.js +94 -0
  47. package/dist/constants-rNuD5qJn.js.map +1 -0
  48. package/dist/contracts/index.cjs +1006 -0
  49. package/dist/contracts/index.cjs.map +1 -0
  50. package/dist/contracts/index.d.cts +488 -0
  51. package/dist/contracts/index.d.cts.map +1 -0
  52. package/dist/contracts/index.d.ts +488 -0
  53. package/dist/contracts/index.d.ts.map +1 -0
  54. package/dist/contracts/index.js +817 -0
  55. package/dist/contracts/index.js.map +1 -0
  56. package/dist/cookies-DCIcr7uy.cjs +94 -0
  57. package/dist/cookies-DCIcr7uy.cjs.map +1 -0
  58. package/dist/cookies-DKEC7AWv.js +71 -0
  59. package/dist/cookies-DKEC7AWv.js.map +1 -0
  60. package/dist/delegated-token-CVNbMNfy.js +426 -0
  61. package/dist/delegated-token-CVNbMNfy.js.map +1 -0
  62. package/dist/delegated-token-DHSK4rHI.cjs +461 -0
  63. package/dist/delegated-token-DHSK4rHI.cjs.map +1 -0
  64. package/dist/error-helpers-0woh13Wd.d.cts +105 -0
  65. package/dist/error-helpers-0woh13Wd.d.cts.map +1 -0
  66. package/dist/error-helpers-Ct3AUK1I.d.ts +105 -0
  67. package/dist/error-helpers-Ct3AUK1I.d.ts.map +1 -0
  68. package/dist/error-helpers-XCh4ZJ-g.cjs +282 -0
  69. package/dist/error-helpers-XCh4ZJ-g.cjs.map +1 -0
  70. package/dist/error-helpers-lnwgNOw9.js +145 -0
  71. package/dist/error-helpers-lnwgNOw9.js.map +1 -0
  72. package/dist/error-messages-CGpW1fsg.d.cts +48 -0
  73. package/dist/error-messages-CGpW1fsg.d.cts.map +1 -0
  74. package/dist/error-messages-CGpW1fsg.d.ts +48 -0
  75. package/dist/error-messages-CGpW1fsg.d.ts.map +1 -0
  76. package/dist/event-codes-BBJHon-I.cjs +48 -0
  77. package/dist/event-codes-BBJHon-I.cjs.map +1 -0
  78. package/dist/event-codes-BgcJWsov.d.cts +42 -0
  79. package/dist/event-codes-BgcJWsov.d.cts.map +1 -0
  80. package/dist/event-codes-BgcJWsov.d.ts +42 -0
  81. package/dist/event-codes-BgcJWsov.d.ts.map +1 -0
  82. package/dist/event-codes-DR5_VlaR.js +43 -0
  83. package/dist/event-codes-DR5_VlaR.js.map +1 -0
  84. package/dist/generic/index.cjs +91 -0
  85. package/dist/generic/index.cjs.map +1 -0
  86. package/dist/generic/index.d.cts +27 -0
  87. package/dist/generic/index.d.cts.map +1 -0
  88. package/dist/generic/index.d.ts +27 -0
  89. package/dist/generic/index.d.ts.map +1 -0
  90. package/dist/generic/index.js +80 -0
  91. package/dist/generic/index.js.map +1 -0
  92. package/dist/hono/index.cjs +309 -0
  93. package/dist/hono/index.cjs.map +1 -0
  94. package/dist/hono/index.d.cts +272 -0
  95. package/dist/hono/index.d.cts.map +1 -0
  96. package/dist/hono/index.d.ts +272 -0
  97. package/dist/hono/index.d.ts.map +1 -0
  98. package/dist/hono/index.js +290 -0
  99. package/dist/hono/index.js.map +1 -0
  100. package/dist/hono-openapi/index.cjs +326 -0
  101. package/dist/hono-openapi/index.cjs.map +1 -0
  102. package/dist/hono-openapi/index.d.cts +14 -0
  103. package/dist/hono-openapi/index.d.cts.map +1 -0
  104. package/dist/hono-openapi/index.d.ts +14 -0
  105. package/dist/hono-openapi/index.d.ts.map +1 -0
  106. package/dist/hono-openapi/index.js +307 -0
  107. package/dist/hono-openapi/index.js.map +1 -0
  108. package/dist/http-client-BVF3iktR.cjs +211 -0
  109. package/dist/http-client-BVF3iktR.cjs.map +1 -0
  110. package/dist/http-client-Da0-OMfc.js +206 -0
  111. package/dist/http-client-Da0-OMfc.js.map +1 -0
  112. package/dist/index-CIH_2t7Y.d.ts +240 -0
  113. package/dist/index-CIH_2t7Y.d.ts.map +1 -0
  114. package/dist/index-CZru7c5T.d.cts +1711 -0
  115. package/dist/index-CZru7c5T.d.cts.map +1 -0
  116. package/dist/index-CZru7c5T.d.ts +1711 -0
  117. package/dist/index-CZru7c5T.d.ts.map +1 -0
  118. package/dist/index-DMVe5IJA.d.cts +240 -0
  119. package/dist/index-DMVe5IJA.d.cts.map +1 -0
  120. package/dist/index-DRWKobSp.d.ts +312 -0
  121. package/dist/index-DRWKobSp.d.ts.map +1 -0
  122. package/dist/index-DU9wJ-P2.d.cts +312 -0
  123. package/dist/index-DU9wJ-P2.d.cts.map +1 -0
  124. package/dist/index-DbiXllNy.d.cts +66 -0
  125. package/dist/index-DbiXllNy.d.cts.map +1 -0
  126. package/dist/index-z9r98qlk.d.ts +66 -0
  127. package/dist/index-z9r98qlk.d.ts.map +1 -0
  128. package/dist/index.cjs +89 -0
  129. package/dist/index.cjs.map +1 -0
  130. package/dist/index.d.cts +114 -0
  131. package/dist/index.d.cts.map +1 -0
  132. package/dist/index.d.ts +114 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +28 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/jwt-BBNqk0TV.cjs +155 -0
  137. package/dist/jwt-BBNqk0TV.cjs.map +1 -0
  138. package/dist/jwt-DhqgH94B.js +150 -0
  139. package/dist/jwt-DhqgH94B.js.map +1 -0
  140. package/dist/key-resolver-CESqj4-P.cjs +45 -0
  141. package/dist/key-resolver-CESqj4-P.cjs.map +1 -0
  142. package/dist/key-resolver-D56I2Zpz.js +34 -0
  143. package/dist/key-resolver-D56I2Zpz.js.map +1 -0
  144. package/dist/parse-error-response-6qOQS5y9.cjs +316 -0
  145. package/dist/parse-error-response-6qOQS5y9.cjs.map +1 -0
  146. package/dist/parse-error-response-BM9-kjs0.js +239 -0
  147. package/dist/parse-error-response-BM9-kjs0.js.map +1 -0
  148. package/dist/path-segment-C25i6aaH.cjs +29 -0
  149. package/dist/path-segment-C25i6aaH.cjs.map +1 -0
  150. package/dist/path-segment-CyqnaFrP.js +24 -0
  151. package/dist/path-segment-CyqnaFrP.js.map +1 -0
  152. package/dist/react/index.cjs +336 -0
  153. package/dist/react/index.cjs.map +1 -0
  154. package/dist/react/index.d.cts +151 -0
  155. package/dist/react/index.d.cts.map +1 -0
  156. package/dist/react/index.d.ts +151 -0
  157. package/dist/react/index.d.ts.map +1 -0
  158. package/dist/react/index.js +300 -0
  159. package/dist/react/index.js.map +1 -0
  160. package/dist/refresh-dedup-CKaHHe7m.js +14 -0
  161. package/dist/refresh-dedup-CKaHHe7m.js.map +1 -0
  162. package/dist/refresh-dedup-CLdACQXR.cjs +19 -0
  163. package/dist/refresh-dedup-CLdACQXR.cjs.map +1 -0
  164. package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
  165. package/dist/routes-DpAzgY1V.cjs +424 -0
  166. package/dist/routes-DpAzgY1V.cjs.map +1 -0
  167. package/dist/routes-F1g5aVqP.js +347 -0
  168. package/dist/routes-F1g5aVqP.js.map +1 -0
  169. package/dist/s2s/index.cjs +24 -0
  170. package/dist/s2s/index.d.cts +5 -0
  171. package/dist/s2s/index.d.ts +5 -0
  172. package/dist/s2s/index.js +5 -0
  173. package/dist/s2s-6wbotr78.cjs +926 -0
  174. package/dist/s2s-6wbotr78.cjs.map +1 -0
  175. package/dist/s2s-B_0SIQzn.js +897 -0
  176. package/dist/s2s-B_0SIQzn.js.map +1 -0
  177. package/dist/sign-C7y6xdvT.cjs +324 -0
  178. package/dist/sign-C7y6xdvT.cjs.map +1 -0
  179. package/dist/sign-HFtcYwa-.js +259 -0
  180. package/dist/sign-HFtcYwa-.js.map +1 -0
  181. package/dist/tokens-C1nzkn21.cjs +232 -0
  182. package/dist/tokens-C1nzkn21.cjs.map +1 -0
  183. package/dist/tokens-C3Z40qd7.js +107 -0
  184. package/dist/tokens-C3Z40qd7.js.map +1 -0
  185. package/dist/types-Ai3iIFlB.d.cts +538 -0
  186. package/dist/types-Ai3iIFlB.d.cts.map +1 -0
  187. package/dist/types-Bxg4hCMc.d.cts +52 -0
  188. package/dist/types-Bxg4hCMc.d.cts.map +1 -0
  189. package/dist/types-CEABh1Zf.d.ts +96 -0
  190. package/dist/types-CEABh1Zf.d.ts.map +1 -0
  191. package/dist/types-Ci0Jq0xB.d.cts +96 -0
  192. package/dist/types-Ci0Jq0xB.d.cts.map +1 -0
  193. package/dist/types-DXg8BvEh.d.ts +52 -0
  194. package/dist/types-DXg8BvEh.d.ts.map +1 -0
  195. package/dist/types-_zY7QbM5.d.ts +538 -0
  196. package/dist/types-_zY7QbM5.d.ts.map +1 -0
  197. package/dist/webhooks/index.cjs +8 -0
  198. package/dist/webhooks/index.d.cts +5 -0
  199. package/dist/webhooks/index.d.ts +5 -0
  200. package/dist/webhooks/index.js +4 -0
  201. package/dist/webhooks-B5sAWC9W.js +74 -0
  202. package/dist/webhooks-B5sAWC9W.js.map +1 -0
  203. package/dist/webhooks-Cx11psg1.cjs +79 -0
  204. package/dist/webhooks-Cx11psg1.cjs.map +1 -0
  205. package/package.json +192 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-19r-Q6X2.js","names":[],"sources":["../../auth-contracts/dist/errors.js","../../auth-contracts/dist/auth.js"],"sourcesContent":["import { z } from \"zod\";\n// src/errors.ts\n/**\n* SCHEMA module (it calls `.meta()` at load time): react-reachable SDK code must not import it by\n* value. It holds only the error body; the error codes live in the PURE `constants.ts`.\n*\n* Wire shape `{ error: { code, message } }`. `code` is an open `string`, not an enum: features add\n* their own snake_case codes. Metadata uses only the zod-native metadata API, never the zod-to-openapi extension.\n*/\nconst errorResponseSchema = z.object({ error: z.object({\n\tcode: z.string().meta({ description: \"Código de error enumerado (snake_case ASCII)\" }),\n\tmessage: z.string().meta({ description: \"Mensaje human-readable del error\" })\n}) }).meta({ id: \"ErrorBody\" });\nexport { errorResponseSchema };\n\n//# sourceMappingURL=errors.js.map","import { z } from \"zod\";\n// src/auth.ts\n/**\n* SCHEMA module: wire schemas of the login flow. Body schemas stay plain strict objects (no\n* `.refine`), so the API can plug them into `createRoute` without changing the OpenAPI document.\n* Metadata uses `.meta()` only. Refresh answers with `loginResponseSchema`; logout with the\n* generic message response from `common.ts`. The refresh header schema is API-owned.\n*/\nconst INTERNATIONAL_DIALING_PREFIX = /^00/;\nconst phoneSchema = z.string().min(8).max(22).regex(/^\\d+$/, { error: \"Solo dígitos permitidos\" }).transform((val) => val.replace(INTERNATIONAL_DIALING_PREFIX, \"\")).pipe(z.string().min(8).max(20).regex(/^[1-9]/, { error: \"Formato internacional inválido\" })).meta({\n\tdescription: \"Número de teléfono en formato internacional\",\n\texample: \"5491155551234\"\n});\n/**\n* Product slug: same shape as a service client slug. It never equals a service audience; the API\n* checks that with `isServiceAudience`.\n*/\nconst productoSlugSchema = z.string().regex(/^[a-z][a-z0-9-]{2,63}$/, { error: \"producto debe matchear ^[a-z][a-z0-9-]{2,63}$\" }).meta({\n\tdescription: \"Producto al que entra la persona\",\n\texample: \"whatsapp-panel\"\n});\nconst getCodeRequestSchema = z.object({ phone: phoneSchema }).strict();\n/**\n* The two `challengeId` descriptions (here and in the login request) name no route and no path:\n* route names and prefixes live only in the route descriptors, so a path change never leaves a\n* stale description in the published OpenAPI document.\n*/\nconst getCodeResponseSchema = z.object({ data: z.object({\n\tmessage: z.string().meta({ description: \"Mensaje de confirmación\" }),\n\tchallengeId: z.string().regex(/^[0-9a-f]{32}$/).meta({\n\t\tdescription: \"Identificador opaco del desafío; enviarlo en el login junto con el código. Vence con el código y se invalida con cada get-code nuevo.\",\n\t\texample: \"9f86d081884c7d659a2feaa0c55ad015\"\n\t})\n}) });\n/** Login body. `challengeId` is lowercase hex and is rejected, never normalized. */\nconst loginRequestSchema = z.object({\n\tphone: phoneSchema,\n\tcode: z.string().length(6).regex(/^[0-9A-Za-z]+$/, { error: \"Solo dígitos y letras\" }).transform((val) => val.toUpperCase()).meta({\n\t\tdescription: \"Código OTP de 6 caracteres\",\n\t\texample: \"A1B2C3\"\n\t}),\n\tproducto: productoSlugSchema,\n\tempresaId: z.string().min(1).max(64).optional().meta({ description: \"Empresa que queda activa en la sesión (opcional)\" }),\n\tchallengeId: z.string().regex(/^[0-9a-f]{32}$/, { error: \"Formato de challenge inválido\" }).meta({\n\t\tdescription: \"challengeId devuelto por la solicitud de código (get-code)\",\n\t\texample: \"9f86d081884c7d659a2feaa0c55ad015\"\n\t}),\n\tdeviceType: z.string().min(1).max(50).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Tipo de dispositivo (mobile, desktop, tablet)\",\n\t\texample: \"mobile\"\n\t}),\n\tos: z.string().min(1).max(100).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Sistema operativo del dispositivo\",\n\t\texample: \"Android 14\"\n\t}),\n\tbrowser: z.string().min(1).max(100).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Navegador o aplicación cliente\",\n\t\texample: \"Chrome 120\"\n\t}),\n\tuserAgent: z.string().min(1).max(500).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"User-Agent completo del cliente\",\n\t\texample: \"Mozilla/5.0 ...\"\n\t})\n}).strict();\nconst loginResponseSchema = z.object({ data: z.object({ user: z.object({ id: z.string().meta({ description: \"ID del usuario\" }) }) }) });\n/** Active company switch body: an id, or `null` to leave the session without one. */\nconst setActiveEmpresaRequestSchema = z.object({ empresaId: z.string().min(1).max(64).nullable().meta({ description: \"Empresa que queda activa, o null para ninguna\" }) }).strict();\n/** Active company switch answer. The re-issued access token travels in the `x-eva-new-access-token` header; the refresh token does not rotate. */\nconst setActiveEmpresaResponseSchema = z.object({ data: z.object({ empresaId: z.string().nullable().meta({ description: \"Empresa activa\" }) }) });\nexport { getCodeRequestSchema, getCodeResponseSchema, loginRequestSchema, loginResponseSchema, productoSlugSchema, setActiveEmpresaRequestSchema, setActiveEmpresaResponseSchema };\n\n//# sourceMappingURL=auth.js.map"],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ let zod = require("zod");
2
+ // ../auth-contracts/dist/errors.js
3
+ /**
4
+ * SCHEMA module (it calls `.meta()` at load time): react-reachable SDK code must not import it by
5
+ * value. It holds only the error body; the error codes live in the PURE `constants.ts`.
6
+ *
7
+ * Wire shape `{ error: { code, message } }`. `code` is an open `string`, not an enum: features add
8
+ * their own snake_case codes. Metadata uses only the zod-native metadata API, never the zod-to-openapi extension.
9
+ */
10
+ const errorResponseSchema = zod.z.object({ error: zod.z.object({
11
+ code: zod.z.string().meta({ description: "Código de error enumerado (snake_case ASCII)" }),
12
+ message: zod.z.string().meta({ description: "Mensaje human-readable del error" })
13
+ }) }).meta({ id: "ErrorBody" });
14
+ // ../auth-contracts/dist/auth.js
15
+ /**
16
+ * SCHEMA module: wire schemas of the login flow. Body schemas stay plain strict objects (no
17
+ * `.refine`), so the API can plug them into `createRoute` without changing the OpenAPI document.
18
+ * Metadata uses `.meta()` only. Refresh answers with `loginResponseSchema`; logout with the
19
+ * generic message response from `common.ts`. The refresh header schema is API-owned.
20
+ */
21
+ const INTERNATIONAL_DIALING_PREFIX = /^00/;
22
+ const phoneSchema = zod.z.string().min(8).max(22).regex(/^\d+$/, { error: "Solo dígitos permitidos" }).transform((val) => val.replace(INTERNATIONAL_DIALING_PREFIX, "")).pipe(zod.z.string().min(8).max(20).regex(/^[1-9]/, { error: "Formato internacional inválido" })).meta({
23
+ description: "Número de teléfono en formato internacional",
24
+ example: "5491155551234"
25
+ });
26
+ /**
27
+ * Product slug: same shape as a service client slug. It never equals a service audience; the API
28
+ * checks that with `isServiceAudience`.
29
+ */
30
+ const productoSlugSchema = zod.z.string().regex(/^[a-z][a-z0-9-]{2,63}$/, { error: "producto debe matchear ^[a-z][a-z0-9-]{2,63}$" }).meta({
31
+ description: "Producto al que entra la persona",
32
+ example: "whatsapp-panel"
33
+ });
34
+ const getCodeRequestSchema = zod.z.object({ phone: phoneSchema }).strict();
35
+ /**
36
+ * The two `challengeId` descriptions (here and in the login request) name no route and no path:
37
+ * route names and prefixes live only in the route descriptors, so a path change never leaves a
38
+ * stale description in the published OpenAPI document.
39
+ */
40
+ const getCodeResponseSchema = zod.z.object({ data: zod.z.object({
41
+ message: zod.z.string().meta({ description: "Mensaje de confirmación" }),
42
+ challengeId: zod.z.string().regex(/^[0-9a-f]{32}$/).meta({
43
+ description: "Identificador opaco del desafío; enviarlo en el login junto con el código. Vence con el código y se invalida con cada get-code nuevo.",
44
+ example: "9f86d081884c7d659a2feaa0c55ad015"
45
+ })
46
+ }) });
47
+ /** Login body. `challengeId` is lowercase hex and is rejected, never normalized. */
48
+ const loginRequestSchema = zod.z.object({
49
+ phone: phoneSchema,
50
+ code: zod.z.string().length(6).regex(/^[0-9A-Za-z]+$/, { error: "Solo dígitos y letras" }).transform((val) => val.toUpperCase()).meta({
51
+ description: "Código OTP de 6 caracteres",
52
+ example: "A1B2C3"
53
+ }),
54
+ producto: productoSlugSchema,
55
+ empresaId: zod.z.string().min(1).max(64).optional().meta({ description: "Empresa que queda activa en la sesión (opcional)" }),
56
+ challengeId: zod.z.string().regex(/^[0-9a-f]{32}$/, { error: "Formato de challenge inválido" }).meta({
57
+ description: "challengeId devuelto por la solicitud de código (get-code)",
58
+ example: "9f86d081884c7d659a2feaa0c55ad015"
59
+ }),
60
+ deviceType: zod.z.string().min(1).max(50).regex(/^[\x20-\x7E\xA0-\xFF]*$/, { error: "Caracteres de control no permitidos" }).meta({
61
+ description: "Tipo de dispositivo (mobile, desktop, tablet)",
62
+ example: "mobile"
63
+ }),
64
+ os: zod.z.string().min(1).max(100).regex(/^[\x20-\x7E\xA0-\xFF]*$/, { error: "Caracteres de control no permitidos" }).meta({
65
+ description: "Sistema operativo del dispositivo",
66
+ example: "Android 14"
67
+ }),
68
+ browser: zod.z.string().min(1).max(100).regex(/^[\x20-\x7E\xA0-\xFF]*$/, { error: "Caracteres de control no permitidos" }).meta({
69
+ description: "Navegador o aplicación cliente",
70
+ example: "Chrome 120"
71
+ }),
72
+ userAgent: zod.z.string().min(1).max(500).regex(/^[\x20-\x7E\xA0-\xFF]*$/, { error: "Caracteres de control no permitidos" }).meta({
73
+ description: "User-Agent completo del cliente",
74
+ example: "Mozilla/5.0 ..."
75
+ })
76
+ }).strict();
77
+ const loginResponseSchema = zod.z.object({ data: zod.z.object({ user: zod.z.object({ id: zod.z.string().meta({ description: "ID del usuario" }) }) }) });
78
+ /** Active company switch body: an id, or `null` to leave the session without one. */
79
+ const setActiveEmpresaRequestSchema = zod.z.object({ empresaId: zod.z.string().min(1).max(64).nullable().meta({ description: "Empresa que queda activa, o null para ninguna" }) }).strict();
80
+ /** Active company switch answer. The re-issued access token travels in the `x-eva-new-access-token` header; the refresh token does not rotate. */
81
+ const setActiveEmpresaResponseSchema = zod.z.object({ data: zod.z.object({ empresaId: zod.z.string().nullable().meta({ description: "Empresa activa" }) }) });
82
+ Object.defineProperty(exports, "errorResponseSchema", {
83
+ enumerable: true,
84
+ get: function() {
85
+ return errorResponseSchema;
86
+ }
87
+ });
88
+ Object.defineProperty(exports, "getCodeRequestSchema", {
89
+ enumerable: true,
90
+ get: function() {
91
+ return getCodeRequestSchema;
92
+ }
93
+ });
94
+ Object.defineProperty(exports, "getCodeResponseSchema", {
95
+ enumerable: true,
96
+ get: function() {
97
+ return getCodeResponseSchema;
98
+ }
99
+ });
100
+ Object.defineProperty(exports, "loginRequestSchema", {
101
+ enumerable: true,
102
+ get: function() {
103
+ return loginRequestSchema;
104
+ }
105
+ });
106
+ Object.defineProperty(exports, "loginResponseSchema", {
107
+ enumerable: true,
108
+ get: function() {
109
+ return loginResponseSchema;
110
+ }
111
+ });
112
+ Object.defineProperty(exports, "productoSlugSchema", {
113
+ enumerable: true,
114
+ get: function() {
115
+ return productoSlugSchema;
116
+ }
117
+ });
118
+ Object.defineProperty(exports, "setActiveEmpresaRequestSchema", {
119
+ enumerable: true,
120
+ get: function() {
121
+ return setActiveEmpresaRequestSchema;
122
+ }
123
+ });
124
+ Object.defineProperty(exports, "setActiveEmpresaResponseSchema", {
125
+ enumerable: true,
126
+ get: function() {
127
+ return setActiveEmpresaResponseSchema;
128
+ }
129
+ });
130
+
131
+ //# sourceMappingURL=auth-DX1N5JA4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-DX1N5JA4.cjs","names":["z","z"],"sources":["../../auth-contracts/dist/errors.js","../../auth-contracts/dist/auth.js"],"sourcesContent":["import { z } from \"zod\";\n// src/errors.ts\n/**\n* SCHEMA module (it calls `.meta()` at load time): react-reachable SDK code must not import it by\n* value. It holds only the error body; the error codes live in the PURE `constants.ts`.\n*\n* Wire shape `{ error: { code, message } }`. `code` is an open `string`, not an enum: features add\n* their own snake_case codes. Metadata uses only the zod-native metadata API, never the zod-to-openapi extension.\n*/\nconst errorResponseSchema = z.object({ error: z.object({\n\tcode: z.string().meta({ description: \"Código de error enumerado (snake_case ASCII)\" }),\n\tmessage: z.string().meta({ description: \"Mensaje human-readable del error\" })\n}) }).meta({ id: \"ErrorBody\" });\nexport { errorResponseSchema };\n\n//# sourceMappingURL=errors.js.map","import { z } from \"zod\";\n// src/auth.ts\n/**\n* SCHEMA module: wire schemas of the login flow. Body schemas stay plain strict objects (no\n* `.refine`), so the API can plug them into `createRoute` without changing the OpenAPI document.\n* Metadata uses `.meta()` only. Refresh answers with `loginResponseSchema`; logout with the\n* generic message response from `common.ts`. The refresh header schema is API-owned.\n*/\nconst INTERNATIONAL_DIALING_PREFIX = /^00/;\nconst phoneSchema = z.string().min(8).max(22).regex(/^\\d+$/, { error: \"Solo dígitos permitidos\" }).transform((val) => val.replace(INTERNATIONAL_DIALING_PREFIX, \"\")).pipe(z.string().min(8).max(20).regex(/^[1-9]/, { error: \"Formato internacional inválido\" })).meta({\n\tdescription: \"Número de teléfono en formato internacional\",\n\texample: \"5491155551234\"\n});\n/**\n* Product slug: same shape as a service client slug. It never equals a service audience; the API\n* checks that with `isServiceAudience`.\n*/\nconst productoSlugSchema = z.string().regex(/^[a-z][a-z0-9-]{2,63}$/, { error: \"producto debe matchear ^[a-z][a-z0-9-]{2,63}$\" }).meta({\n\tdescription: \"Producto al que entra la persona\",\n\texample: \"whatsapp-panel\"\n});\nconst getCodeRequestSchema = z.object({ phone: phoneSchema }).strict();\n/**\n* The two `challengeId` descriptions (here and in the login request) name no route and no path:\n* route names and prefixes live only in the route descriptors, so a path change never leaves a\n* stale description in the published OpenAPI document.\n*/\nconst getCodeResponseSchema = z.object({ data: z.object({\n\tmessage: z.string().meta({ description: \"Mensaje de confirmación\" }),\n\tchallengeId: z.string().regex(/^[0-9a-f]{32}$/).meta({\n\t\tdescription: \"Identificador opaco del desafío; enviarlo en el login junto con el código. Vence con el código y se invalida con cada get-code nuevo.\",\n\t\texample: \"9f86d081884c7d659a2feaa0c55ad015\"\n\t})\n}) });\n/** Login body. `challengeId` is lowercase hex and is rejected, never normalized. */\nconst loginRequestSchema = z.object({\n\tphone: phoneSchema,\n\tcode: z.string().length(6).regex(/^[0-9A-Za-z]+$/, { error: \"Solo dígitos y letras\" }).transform((val) => val.toUpperCase()).meta({\n\t\tdescription: \"Código OTP de 6 caracteres\",\n\t\texample: \"A1B2C3\"\n\t}),\n\tproducto: productoSlugSchema,\n\tempresaId: z.string().min(1).max(64).optional().meta({ description: \"Empresa que queda activa en la sesión (opcional)\" }),\n\tchallengeId: z.string().regex(/^[0-9a-f]{32}$/, { error: \"Formato de challenge inválido\" }).meta({\n\t\tdescription: \"challengeId devuelto por la solicitud de código (get-code)\",\n\t\texample: \"9f86d081884c7d659a2feaa0c55ad015\"\n\t}),\n\tdeviceType: z.string().min(1).max(50).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Tipo de dispositivo (mobile, desktop, tablet)\",\n\t\texample: \"mobile\"\n\t}),\n\tos: z.string().min(1).max(100).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Sistema operativo del dispositivo\",\n\t\texample: \"Android 14\"\n\t}),\n\tbrowser: z.string().min(1).max(100).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"Navegador o aplicación cliente\",\n\t\texample: \"Chrome 120\"\n\t}),\n\tuserAgent: z.string().min(1).max(500).regex(/^[\\x20-\\x7E\\xA0-\\xFF]*$/, { error: \"Caracteres de control no permitidos\" }).meta({\n\t\tdescription: \"User-Agent completo del cliente\",\n\t\texample: \"Mozilla/5.0 ...\"\n\t})\n}).strict();\nconst loginResponseSchema = z.object({ data: z.object({ user: z.object({ id: z.string().meta({ description: \"ID del usuario\" }) }) }) });\n/** Active company switch body: an id, or `null` to leave the session without one. */\nconst setActiveEmpresaRequestSchema = z.object({ empresaId: z.string().min(1).max(64).nullable().meta({ description: \"Empresa que queda activa, o null para ninguna\" }) }).strict();\n/** Active company switch answer. The re-issued access token travels in the `x-eva-new-access-token` header; the refresh token does not rotate. */\nconst setActiveEmpresaResponseSchema = z.object({ data: z.object({ empresaId: z.string().nullable().meta({ description: \"Empresa activa\" }) }) });\nexport { getCodeRequestSchema, getCodeResponseSchema, loginRequestSchema, loginResponseSchema, productoSlugSchema, setActiveEmpresaRequestSchema, setActiveEmpresaResponseSchema };\n\n//# sourceMappingURL=auth.js.map"],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import { t as createHttpClient } from "./http-client-Da0-OMfc.js";
2
+ import { i as setTokenCookies, n as readTokensFromCookies, r as setAccessTokenCookie, t as clearTokenCookies } from "./cookies-DKEC7AWv.js";
3
+ import { t as deduplicateRefresh } from "./refresh-dedup-CKaHHe7m.js";
4
+ import { a as getErrorMessages, l as validateErrorMessagesInput, o as getErrorWire, p as resolveErrorMessages } from "./parse-error-response-BM9-kjs0.js";
5
+ import { c as errorResponseSchema, i as loginResponseSchema, n as getCodeResponseSchema } from "./auth-19r-Q6X2.js";
6
+ import { z } from "zod";
7
+ import Bowser from "bowser";
8
+ // src/hono/device-info.ts
9
+ function parseDeviceInfo(request) {
10
+ const userAgent = request.headers.get("user-agent") || "";
11
+ const parsed = Bowser.parse(userAgent);
12
+ return {
13
+ deviceType: parsed.platform?.type || "desktop",
14
+ os: parsed.os?.name || "Unknown",
15
+ browser: parsed.browser?.name || "Unknown",
16
+ userAgent: userAgent.slice(0, 500)
17
+ };
18
+ }
19
+ // src/schemas.ts
20
+ /**
21
+ * Schemas Zod 4 compartidos — fuente canónica (B1 confirmado por T-00 probe).
22
+ * Usados por auth-handlers.ts (validación runtime) y hono-openapi/index.ts (OpenAPI doc).
23
+ * Importar desde aquí evita duplicación y garantiza consistencia entre variantes.
24
+ *
25
+ * `parseErrorResponse` vive en `parse-error-response.ts` (módulo puro, D-35): este archivo no es
26
+ * alcanzable desde `src/react/index.ts`.
27
+ */
28
+ const GetCodeSchema = z.object({ phone: z.string().min(1) });
29
+ /**
30
+ * Cuerpo de POST /login. `challengeId` es el identificador opaco que devolvió
31
+ * POST /get-code para este código: el navegador lo conserva en memoria y lo
32
+ * reenvía junto con el código. Sin él, /login responde 400 (`malformed`).
33
+ */
34
+ const LoginSchema = z.object({
35
+ phone: z.string().min(1),
36
+ code: z.string().min(1),
37
+ challengeId: z.string().min(1),
38
+ empresaId: z.string().min(1).optional()
39
+ });
40
+ /**
41
+ * Cuerpo de POST /empresa-activa: el id de la empresa que queda activa o `null` para ninguna.
42
+ * El campo es obligatorio (un body `{}` es inválido): `null` es una decisión, no un faltante.
43
+ */
44
+ const ActiveEmpresaSchema = z.object({ empresaId: z.string().min(1).nullable() });
45
+ /**
46
+ * Schema para PATCH /me — record no vacío.
47
+ * Validación extra con .refine() para rechazar body vacío.
48
+ */
49
+ const UpdateUserSchema = z.record(z.string(), z.unknown()).refine((obj) => Object.keys(obj).length > 0, "Cuerpo de actualización vacío");
50
+ /** Wire de error `{ error: { code, message } }` (componente `ErrorBody`). */
51
+ const ErrorResponseSchema = errorResponseSchema;
52
+ /** Wire de POST /login/get-code (200). `challengeId` es opaco; cada get-code nuevo invalida el anterior. */
53
+ const GetCodeResponseSchema = getCodeResponseSchema;
54
+ /** Wire de POST /login (200). */
55
+ const LoginResponseSchema = loginResponseSchema;
56
+ /** Wire de POST /login/refresh (200): el contrato reutiliza la respuesta de login. */
57
+ const RefreshResponseSchema = loginResponseSchema;
58
+ // src/auth-handlers.ts
59
+ const KNOWN_ERROR_STATUSES = /* @__PURE__ */ new Set([
60
+ 400,
61
+ 401,
62
+ 403,
63
+ 404,
64
+ 409,
65
+ 429,
66
+ 500,
67
+ 502,
68
+ 503
69
+ ]);
70
+ const REASON_TO_CODE = {
71
+ auth_required: "unauthorized",
72
+ token_invalid: "unauthorized",
73
+ refresh_no_tokens: "unauthorized",
74
+ verify_failed: "unauthorized",
75
+ network: "service_unavailable",
76
+ malformed: "bad_request"
77
+ };
78
+ function resolveCode(evaError) {
79
+ if (evaError.kind === "api") return evaError.code;
80
+ return REASON_TO_CODE[evaError.reason];
81
+ }
82
+ function errorResponse(c, evaError, status) {
83
+ const safeStatus = KNOWN_ERROR_STATUSES.has(status) ? status : 500;
84
+ if (getErrorWire() === "api") return c.json({ error: {
85
+ code: resolveCode(evaError),
86
+ message: evaError.message
87
+ } }, safeStatus);
88
+ return c.json({ error: evaError.message }, safeStatus);
89
+ }
90
+ const SAFE_METHODS = /* @__PURE__ */ new Set([
91
+ "GET",
92
+ "HEAD",
93
+ "OPTIONS"
94
+ ]);
95
+ /**
96
+ * Origen serializado de un esquema que no es http(s) (`tauri://localhost`, `capacitor://localhost`):
97
+ * `esquema://host[:puerto]` sin userinfo, path, query ni fragmento (una `/` final se tolera).
98
+ */
99
+ const CUSTOM_SCHEME_ORIGIN = /^([a-z][a-z0-9+.-]*):\/\/([^\s/?#@\\]+)\/?$/i;
100
+ /**
101
+ * `new URL(...).origin` de un esquema no especial es `"null"`, así que http(s) se normaliza con el
102
+ * parser y el resto se compara por su forma serializada en minúsculas (la que manda el navegador).
103
+ */
104
+ function normalizeAllowedOrigins(origins) {
105
+ const normalized = /* @__PURE__ */ new Set();
106
+ for (const entry of origins) {
107
+ let url;
108
+ try {
109
+ url = new URL(entry);
110
+ } catch {}
111
+ const custom = url !== void 0 && !/^https?:$/.test(url.protocol) ? CUSTOM_SCHEME_ORIGIN.exec(entry) : null;
112
+ if (url === void 0 || custom === null && !/^https?:$/.test(url.protocol)) throw new Error(`[eva-auth-sdk] allowedOrigins inválido: ${JSON.stringify(entry)} (se espera un origen serializado esquema://host[:puerto], p. ej. https://app.example.com o tauri://localhost)`);
113
+ normalized.add(custom === null ? url.origin : `${custom[1].toLowerCase()}://${custom[2].toLowerCase()}`);
114
+ }
115
+ return normalized;
116
+ }
117
+ /**
118
+ * Mismo origen = mismo host:puerto que la request; el esquema no cuenta porque tras un proxy que
119
+ * termina TLS el servidor ve `http://` mientras el navegador manda `https://`.
120
+ */
121
+ function isOriginAllowed(origin, requestUrl, allowed) {
122
+ let parsed;
123
+ try {
124
+ parsed = new URL(origin);
125
+ } catch {
126
+ return false;
127
+ }
128
+ return allowed.has(parsed.origin) || allowed.has(origin.toLowerCase()) || parsed.host === new URL(requestUrl).host;
129
+ }
130
+ function sdkError(reason, message, status) {
131
+ return {
132
+ kind: "sdk",
133
+ reason,
134
+ message,
135
+ status
136
+ };
137
+ }
138
+ /**
139
+ * Construye los 12 handlers de auth con las opciones provistas.
140
+ * Validación temprana de errorMessages si se proveen (lanza si key inválida o valor no-string).
141
+ *
142
+ * Decisión M2 (ADR-012): messages() se resuelve por-request (closure evalúa
143
+ * getErrorMessages() en cada llamada). Permite que configureEvaAuth() post-factory
144
+ * tome efecto en el siguiente request. Tradeoff: ~3 spreads + 2 fn calls per request.
145
+ */
146
+ function buildAuthHandlers(opts = {}) {
147
+ if (opts.errorMessages !== void 0) validateErrorMessagesInput(opts.errorMessages);
148
+ const allowedOrigins = normalizeAllowedOrigins(opts.allowedOrigins ?? []);
149
+ const client = createHttpClient();
150
+ const messages = () => resolveErrorMessages(opts.errorMessages, getErrorMessages());
151
+ const bodyGuard = (invalidMessage) => ({
152
+ middleware: async (c, next) => {
153
+ c.header("Cache-Control", "no-store");
154
+ try {
155
+ await c.req.json();
156
+ } catch {
157
+ return errorResponse(c, sdkError("malformed", messages().invalidJsonBody, 400), 400);
158
+ }
159
+ await next();
160
+ },
161
+ onInvalid: (result, c) => {
162
+ if (result.success) return void 0;
163
+ c.header("Cache-Control", "no-store");
164
+ return errorResponse(c, sdkError("malformed", invalidMessage(), 400), 400);
165
+ }
166
+ });
167
+ const originGuard = async (c, next) => {
168
+ const origin = c.req.header("origin");
169
+ if (SAFE_METHODS.has(c.req.method) || origin === void 0 || isOriginAllowed(origin, c.req.url, allowedOrigins)) return next();
170
+ return errorResponse(c, {
171
+ kind: "api",
172
+ code: "forbidden",
173
+ message: messages().originNotAllowed,
174
+ status: 403
175
+ }, 403);
176
+ };
177
+ return {
178
+ originGuard,
179
+ openApiGuards: {
180
+ getCode: bodyGuard(() => messages().invalidPhone),
181
+ login: bodyGuard(() => messages().loginFailed)
182
+ },
183
+ getCode: async (c) => {
184
+ c.header("Cache-Control", "no-store");
185
+ let raw;
186
+ try {
187
+ raw = await c.req.json();
188
+ } catch {
189
+ return errorResponse(c, sdkError("malformed", messages().invalidJsonBody, 400), 400);
190
+ }
191
+ const parsed = GetCodeSchema.safeParse(raw);
192
+ if (!parsed.success) return errorResponse(c, sdkError("malformed", messages().invalidPhone, 400), 400);
193
+ const result = await client.getCode(parsed.data);
194
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
195
+ return c.json({ data: result.data });
196
+ },
197
+ login: async (c) => {
198
+ c.header("Cache-Control", "no-store");
199
+ let raw;
200
+ try {
201
+ raw = await c.req.json();
202
+ } catch {
203
+ return errorResponse(c, sdkError("malformed", messages().invalidJsonBody, 400), 400);
204
+ }
205
+ const parsed = LoginSchema.safeParse(raw);
206
+ if (!parsed.success) return errorResponse(c, sdkError("malformed", messages().loginFailed, 400), 400);
207
+ const deviceInfo = parseDeviceInfo(c.req.raw);
208
+ const result = await client.login({
209
+ ...parsed.data,
210
+ ...deviceInfo
211
+ });
212
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
213
+ if (result.data.tokens) {
214
+ const cookieHeaders = setTokenCookies(result.data.tokens);
215
+ for (const cookie of cookieHeaders) c.header("Set-Cookie", cookie, { append: true });
216
+ }
217
+ return c.json({ data: { user: { id: result.data.user.id } } });
218
+ },
219
+ refresh: async (c) => {
220
+ const cookieHeader = c.req.header("cookie") || null;
221
+ const { refreshToken } = readTokensFromCookies(cookieHeader);
222
+ if (!refreshToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
223
+ const result = await deduplicateRefresh(refreshToken, () => client.refresh({ refreshToken }));
224
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
225
+ if (result.data.tokens) {
226
+ const cookieHeaders = setTokenCookies(result.data.tokens);
227
+ for (const cookie of cookieHeaders) c.header("Set-Cookie", cookie, { append: true });
228
+ }
229
+ return c.json({ data: { user: { id: result.data.user.id } } });
230
+ },
231
+ logout: async (c) => {
232
+ const cookieHeader = c.req.header("cookie") || null;
233
+ const { refreshToken } = readTokensFromCookies(cookieHeader);
234
+ if (!refreshToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
235
+ const result = await client.logout({ refreshToken });
236
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
237
+ const clearHeaders = clearTokenCookies();
238
+ for (const cookie of clearHeaders) c.header("Set-Cookie", cookie, { append: true });
239
+ return c.json({ data: result.data });
240
+ },
241
+ getMe: async (c) => {
242
+ const cookieHeader = c.req.header("cookie") || null;
243
+ const { accessToken } = readTokensFromCookies(cookieHeader);
244
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
245
+ const result = await client.getUser({ accessToken });
246
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
247
+ return c.json({ data: result.data });
248
+ },
249
+ updateMe: async (c) => {
250
+ const cookieHeader = c.req.header("cookie") || null;
251
+ const { accessToken } = readTokensFromCookies(cookieHeader);
252
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
253
+ let raw;
254
+ try {
255
+ raw = await c.req.json();
256
+ } catch {
257
+ return errorResponse(c, sdkError("malformed", messages().invalidJsonBody, 400), 400);
258
+ }
259
+ const parsed = UpdateUserSchema.safeParse(raw);
260
+ if (!parsed.success) return errorResponse(c, sdkError("malformed", messages().invalidUpdateBody, 400), 400);
261
+ const result = await client.updateUser({
262
+ accessToken,
263
+ data: parsed.data
264
+ });
265
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
266
+ return c.json({ data: result.data });
267
+ },
268
+ deleteMe: async (c) => {
269
+ const cookieHeader = c.req.header("cookie") || null;
270
+ const { accessToken } = readTokensFromCookies(cookieHeader);
271
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
272
+ const result = await client.deleteUser({ accessToken });
273
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
274
+ const clearHeaders = clearTokenCookies();
275
+ for (const cookie of clearHeaders) c.header("Set-Cookie", cookie, { append: true });
276
+ return c.json({ data: result.data });
277
+ },
278
+ getEmpresas: async (c) => {
279
+ const cookieHeader = c.req.header("cookie") || null;
280
+ const { accessToken } = readTokensFromCookies(cookieHeader);
281
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
282
+ const result = await client.getUserEmpresas({ accessToken });
283
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
284
+ return c.json({ data: result.data });
285
+ },
286
+ setActiveEmpresa: async (c) => {
287
+ c.header("Cache-Control", "no-store");
288
+ const cookieHeader = c.req.header("cookie") || null;
289
+ const { accessToken } = readTokensFromCookies(cookieHeader);
290
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
291
+ let raw;
292
+ try {
293
+ raw = await c.req.json();
294
+ } catch {
295
+ return errorResponse(c, sdkError("malformed", messages().invalidJsonBody, 400), 400);
296
+ }
297
+ const parsed = ActiveEmpresaSchema.safeParse(raw);
298
+ if (!parsed.success) return errorResponse(c, sdkError("malformed", "empresaId inválido: debe ser el id de una empresa o null", 400), 400);
299
+ const result = await client.setActiveEmpresa({
300
+ accessToken,
301
+ empresaId: parsed.data.empresaId
302
+ });
303
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
304
+ if (!result.data.accessToken) return errorResponse(c, sdkError("malformed", "Respuesta de Auth sin access token reemitido", 502), 502);
305
+ c.header("Set-Cookie", setAccessTokenCookie(result.data.accessToken), { append: true });
306
+ return c.json({ data: { empresaId: result.data.empresaId } });
307
+ },
308
+ getSessions: async (c) => {
309
+ const cookieHeader = c.req.header("cookie") || null;
310
+ const { accessToken } = readTokensFromCookies(cookieHeader);
311
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
312
+ const result = await client.getSessions({ accessToken });
313
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
314
+ return c.json({ data: result.data });
315
+ },
316
+ deleteSession: async (c) => {
317
+ const cookieHeader = c.req.header("cookie") || null;
318
+ const { accessToken } = readTokensFromCookies(cookieHeader);
319
+ if (!accessToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
320
+ const sessionId = c.req.param("id");
321
+ if (!sessionId || !/^[\w-]+$/.test(sessionId)) return errorResponse(c, sdkError("malformed", messages().sessionInvalid, 400), 400);
322
+ const result = await client.deleteSession({
323
+ accessToken,
324
+ sessionId
325
+ });
326
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
327
+ return c.json({ data: result.data });
328
+ },
329
+ deleteAllSessions: async (c) => {
330
+ const cookieHeader = c.req.header("cookie") || null;
331
+ const { refreshToken } = readTokensFromCookies(cookieHeader);
332
+ if (!refreshToken) return errorResponse(c, sdkError("auth_required", messages().tokenNotFound, 401), 401);
333
+ const result = await client.deleteAllSessions({ refreshToken });
334
+ if (!result.ok) return errorResponse(c, result.error, result.error.status);
335
+ const clearHeaders = clearTokenCookies();
336
+ for (const cookie of clearHeaders) c.header("Set-Cookie", cookie, { append: true });
337
+ return c.json({ data: result.data });
338
+ }
339
+ };
340
+ }
341
+ export { GetCodeSchema as a, RefreshResponseSchema as c, GetCodeResponseSchema as i, UpdateUserSchema as l, ActiveEmpresaSchema as n, LoginResponseSchema as o, ErrorResponseSchema as r, LoginSchema as s, buildAuthHandlers as t, parseDeviceInfo as u };
342
+
343
+ //# sourceMappingURL=auth-handlers-B3iJaPln.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handlers-B3iJaPln.js","names":[],"sources":["../src/hono/device-info.ts","../src/schemas.ts","../src/auth-handlers.ts"],"sourcesContent":["import Bowser from 'bowser'\nimport type { DeviceInfo } from '../types'\n\nexport function parseDeviceInfo(request: Request): DeviceInfo {\n const userAgent = request.headers.get('user-agent') || ''\n const parsed = Bowser.parse(userAgent)\n\n return {\n deviceType: parsed.platform?.type || 'desktop',\n os: parsed.os?.name || 'Unknown',\n browser: parsed.browser?.name || 'Unknown',\n userAgent: userAgent.slice(0, 500),\n }\n}\n","/**\n * Schemas Zod 4 compartidos — fuente canónica (B1 confirmado por T-00 probe).\n * Usados por auth-handlers.ts (validación runtime) y hono-openapi/index.ts (OpenAPI doc).\n * Importar desde aquí evita duplicación y garantiza consistencia entre variantes.\n *\n * `parseErrorResponse` vive en `parse-error-response.ts` (módulo puro, D-35): este archivo no es\n * alcanzable desde `src/react/index.ts`.\n */\nimport { z } from 'zod'\nimport {\n errorResponseSchema,\n getCodeResponseSchema,\n loginResponseSchema,\n} from '@eva_solutions/auth-contracts'\n\n// === Request schemas ===\n\nexport const GetCodeSchema = z.object({\n phone: z.string().min(1),\n})\n\n/**\n * Cuerpo de POST /login. `challengeId` es el identificador opaco que devolvió\n * POST /get-code para este código: el navegador lo conserva en memoria y lo\n * reenvía junto con el código. Sin él, /login responde 400 (`malformed`).\n */\nexport const LoginSchema = z.object({\n phone: z.string().min(1),\n code: z.string().min(1),\n challengeId: z.string().min(1),\n // Empresa que queda activa (opcional). El `producto` NO viene del navegador: lo pone el SDK.\n empresaId: z.string().min(1).optional(),\n})\n\n/**\n * Cuerpo de POST /empresa-activa: el id de la empresa que queda activa o `null` para ninguna.\n * El campo es obligatorio (un body `{}` es inválido): `null` es una decisión, no un faltante.\n */\nexport const ActiveEmpresaSchema = z.object({\n empresaId: z.string().min(1).nullable(),\n})\n\n/**\n * Schema para PATCH /me — record no vacío.\n * Validación extra con .refine() para rechazar body vacío.\n */\nexport const UpdateUserSchema = z\n .record(z.string(), z.unknown())\n .refine((obj) => Object.keys(obj).length > 0, 'Cuerpo de actualización vacío')\n\n// === Response schemas ===\n\n/*\n * Los schemas de respuesta son alias del contrato compartido (D-28: el tipo es idéntico al que\n * este archivo definía antes). Se usan solo para documentar OpenAPI: `http-client` no los parsea en\n * runtime. Este módulo registra metadatos de zod al cargarse, así que NO debe ser alcanzable desde\n * `src/react` (regla D-35: ahí solo se importan valores de módulos puros o `import type`).\n */\n\n/** Wire de error `{ error: { code, message } }` (componente `ErrorBody`). */\nexport const ErrorResponseSchema = errorResponseSchema\n\n/** Wire de POST /login/get-code (200). `challengeId` es opaco; cada get-code nuevo invalida el anterior. */\nexport const GetCodeResponseSchema = getCodeResponseSchema\n\n/** Wire de POST /login (200). */\nexport const LoginResponseSchema = loginResponseSchema\n\n/** Wire de POST /login/refresh (200): el contrato reutiliza la respuesta de login. */\nexport const RefreshResponseSchema = loginResponseSchema\n\n// === Inferred types ===\n\nexport type GetCodeInput = z.infer<typeof GetCodeSchema>\nexport type LoginInput = z.infer<typeof LoginSchema>\nexport type ActiveEmpresaInput = z.infer<typeof ActiveEmpresaSchema>\nexport type UpdateUserInput = z.infer<typeof UpdateUserSchema>\n","/**\n * Factory de handlers de auth — fuente única de verdad para los 12 endpoints.\n * Compartido entre evaAuthRoutes() (Hono plano) y evaAuthOpenAPIRoutes() (OpenAPIHono).\n * Decisión M2: resolución de messages() por-request (closure evalúa global cada vez).\n */\nimport type { Context, MiddlewareHandler } from 'hono'\nimport { createHttpClient } from './http-client'\nimport {\n readTokensFromCookies,\n setTokenCookies,\n setAccessTokenCookie,\n clearTokenCookies,\n} from './cookies'\nimport { deduplicateRefresh } from './refresh-dedup'\nimport { parseDeviceInfo } from './hono/device-info'\nimport { resolveErrorMessages, type EvaErrorMessages } from './error-messages'\nimport {\n getErrorMessages,\n getErrorWire,\n validateErrorMessagesInput,\n} from './config'\nimport {\n ActiveEmpresaSchema,\n GetCodeSchema,\n LoginSchema,\n UpdateUserSchema,\n} from './schemas'\nimport type { EvaError, EvaSdkError } from './types'\nimport type { SdkErrorReason } from './error-codes'\n\nexport interface AuthHandlerOptions {\n errorMessages?: Partial<EvaErrorMessages>\n /**\n * Orígenes extra (`https://app.example.com`, sin path) desde los que se aceptan las mutaciones\n * con cookies, además del propio host de la request. Un `Origin` fuera de esa lista responde 403.\n * Acepta cualquier origen serializado `esquema://host[:puerto]` (también `tauri://localhost`,\n * `capacitor://localhost`) por coincidencia exacta. Lanza al construir si una entrada no lo es\n * (p. ej. `'*'` o `null`).\n */\n allowedOrigins?: readonly string[]\n}\n\n/**\n * Guardas para la variante OpenAPI de get-code/login: el validador de\n * @hono/zod-openapi responde el 400 antes que el handler, así que\n * no-store y el wire de error se replican aquí. middleware corre antes del validador\n * (JSON malformado); onInvalid es el hook del validador (body que no cumple el schema).\n */\nexport interface OpenAPIBodyGuard {\n middleware: MiddlewareHandler\n onInvalid: (result: { success: boolean }, c: Context) => Response | undefined\n}\n\nexport interface AuthHandlers {\n /** Middleware CSRF: rechaza con 403 las mutaciones cuyo `Origin` no está permitido. */\n originGuard: MiddlewareHandler\n openApiGuards: { getCode: OpenAPIBodyGuard; login: OpenAPIBodyGuard }\n getCode: (c: Context) => Promise<Response>\n login: (c: Context) => Promise<Response>\n refresh: (c: Context) => Promise<Response>\n logout: (c: Context) => Promise<Response>\n getMe: (c: Context) => Promise<Response>\n updateMe: (c: Context) => Promise<Response>\n deleteMe: (c: Context) => Promise<Response>\n getEmpresas: (c: Context) => Promise<Response>\n setActiveEmpresa: (c: Context) => Promise<Response>\n getSessions: (c: Context) => Promise<Response>\n deleteSession: (c: Context) => Promise<Response>\n deleteAllSessions: (c: Context) => Promise<Response>\n}\n\ntype ErrorStatus = 400 | 401 | 403 | 404 | 409 | 429 | 500 | 502 | 503\n\nconst KNOWN_ERROR_STATUSES = new Set<number>([\n 400, 401, 403, 404, 409, 429, 500, 502, 503,\n])\n\nconst REASON_TO_CODE: Record<SdkErrorReason, string> = {\n auth_required: 'unauthorized',\n token_invalid: 'unauthorized',\n refresh_no_tokens: 'unauthorized',\n verify_failed: 'unauthorized',\n network: 'service_unavailable',\n malformed: 'bad_request',\n}\n\nfunction resolveCode(evaError: EvaError): string {\n if (evaError.kind === 'api') return evaError.code\n return REASON_TO_CODE[evaError.reason]\n}\n\nfunction errorResponse(\n c: Context,\n evaError: EvaError,\n status: number,\n): Response {\n const safeStatus = KNOWN_ERROR_STATUSES.has(status)\n ? (status as ErrorStatus)\n : 500\n const wire = getErrorWire()\n if (wire === 'api') {\n return c.json(\n { error: { code: resolveCode(evaError), message: evaError.message } },\n safeStatus,\n )\n }\n return c.json({ error: evaError.message }, safeStatus)\n}\n\nconst SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS'])\n\n/**\n * Origen serializado de un esquema que no es http(s) (`tauri://localhost`, `capacitor://localhost`):\n * `esquema://host[:puerto]` sin userinfo, path, query ni fragmento (una `/` final se tolera).\n */\nconst CUSTOM_SCHEME_ORIGIN = /^([a-z][a-z0-9+.-]*):\\/\\/([^\\s/?#@\\\\]+)\\/?$/i\n\n/**\n * `new URL(...).origin` de un esquema no especial es `\"null\"`, así que http(s) se normaliza con el\n * parser y el resto se compara por su forma serializada en minúsculas (la que manda el navegador).\n */\nfunction normalizeAllowedOrigins(origins: readonly string[]): Set<string> {\n const normalized = new Set<string>()\n for (const entry of origins) {\n let url: URL | undefined\n try {\n url = new URL(entry)\n } catch {\n // cae al throw de abajo\n }\n const custom =\n url !== undefined && !/^https?:$/.test(url.protocol)\n ? CUSTOM_SCHEME_ORIGIN.exec(entry)\n : null\n if (\n url === undefined ||\n (custom === null && !/^https?:$/.test(url.protocol))\n ) {\n throw new Error(\n `[eva-auth-sdk] allowedOrigins inválido: ${JSON.stringify(entry)} (se espera un origen serializado esquema://host[:puerto], p. ej. https://app.example.com o tauri://localhost)`,\n )\n }\n normalized.add(\n custom === null\n ? url.origin\n : `${(custom[1] as string).toLowerCase()}://${(custom[2] as string).toLowerCase()}`,\n )\n }\n return normalized\n}\n\n/**\n * Mismo origen = mismo host:puerto que la request; el esquema no cuenta porque tras un proxy que\n * termina TLS el servidor ve `http://` mientras el navegador manda `https://`.\n */\nfunction isOriginAllowed(\n origin: string,\n requestUrl: string,\n allowed: ReadonlySet<string>,\n): boolean {\n let parsed: URL\n try {\n parsed = new URL(origin)\n } catch {\n return false // `Origin: null` (iframes sandbox, redirects entre orígenes) y basura\n }\n return (\n allowed.has(parsed.origin) ||\n allowed.has(origin.toLowerCase()) ||\n parsed.host === new URL(requestUrl).host\n )\n}\n\nfunction sdkError(\n reason: SdkErrorReason,\n message: string,\n status: number,\n): EvaSdkError {\n return { kind: 'sdk', reason, message, status }\n}\n\n/**\n * Construye los 12 handlers de auth con las opciones provistas.\n * Validación temprana de errorMessages si se proveen (lanza si key inválida o valor no-string).\n *\n * Decisión M2 (ADR-012): messages() se resuelve por-request (closure evalúa\n * getErrorMessages() en cada llamada). Permite que configureEvaAuth() post-factory\n * tome efecto en el siguiente request. Tradeoff: ~3 spreads + 2 fn calls per request.\n */\nexport function buildAuthHandlers(opts: AuthHandlerOptions = {}): AuthHandlers {\n if (opts.errorMessages !== undefined) {\n validateErrorMessagesInput(opts.errorMessages)\n }\n\n const allowedOrigins = normalizeAllowedOrigins(opts.allowedOrigins ?? [])\n\n const client = createHttpClient()\n\n // Resolución diferida por-request (M2)\n const messages = () =>\n resolveErrorMessages(opts.errorMessages, getErrorMessages())\n\n const bodyGuard = (invalidMessage: () => string): OpenAPIBodyGuard => ({\n middleware: async (c, next) => {\n c.header('Cache-Control', 'no-store')\n try {\n await c.req.json()\n } catch {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidJsonBody, 400),\n 400,\n )\n }\n await next()\n },\n onInvalid: (result, c) => {\n if (result.success) return undefined\n c.header('Cache-Control', 'no-store')\n return errorResponse(c, sdkError('malformed', invalidMessage(), 400), 400)\n },\n })\n\n // Sin `Origin` (curl, servidores) se deja pasar: todo navegador lo manda en las mutaciones.\n const originGuard: MiddlewareHandler = async (c, next) => {\n const origin = c.req.header('origin')\n if (\n SAFE_METHODS.has(c.req.method) ||\n origin === undefined ||\n isOriginAllowed(origin, c.req.url, allowedOrigins)\n ) {\n return next()\n }\n return errorResponse(\n c,\n {\n kind: 'api',\n code: 'forbidden',\n message: messages().originNotAllowed,\n status: 403,\n },\n 403,\n )\n }\n\n return {\n originGuard,\n openApiGuards: {\n getCode: bodyGuard(() => messages().invalidPhone),\n login: bodyGuard(() => messages().loginFailed),\n },\n // POST /get-code\n getCode: async (c: Context): Promise<Response> => {\n // Respuestas con challengeId/cookies: nunca cacheables (paridad con el API).\n c.header('Cache-Control', 'no-store')\n let raw: unknown\n try {\n raw = await c.req.json()\n } catch {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidJsonBody, 400),\n 400,\n )\n }\n const parsed = GetCodeSchema.safeParse(raw)\n if (!parsed.success) {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidPhone, 400),\n 400,\n )\n }\n const result = await client.getCode(parsed.data)\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // POST /login\n login: async (c: Context): Promise<Response> => {\n // Respuestas con challengeId/cookies: nunca cacheables (paridad con el API).\n c.header('Cache-Control', 'no-store')\n let raw: unknown\n try {\n raw = await c.req.json()\n } catch {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidJsonBody, 400),\n 400,\n )\n }\n const parsed = LoginSchema.safeParse(raw)\n if (!parsed.success) {\n return errorResponse(\n c,\n sdkError('malformed', messages().loginFailed, 400),\n 400,\n )\n }\n const deviceInfo = parseDeviceInfo(c.req.raw)\n const result = await client.login({ ...parsed.data, ...deviceInfo })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n if (result.data.tokens) {\n const cookieHeaders = setTokenCookies(result.data.tokens)\n for (const cookie of cookieHeaders) {\n c.header('Set-Cookie', cookie, { append: true })\n }\n }\n return c.json({ data: { user: { id: result.data.user.id } } })\n },\n\n // POST /refresh\n refresh: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { refreshToken } = readTokensFromCookies(cookieHeader)\n if (!refreshToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await deduplicateRefresh(refreshToken, () =>\n client.refresh({ refreshToken }),\n )\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n if (result.data.tokens) {\n const cookieHeaders = setTokenCookies(result.data.tokens)\n for (const cookie of cookieHeaders) {\n c.header('Set-Cookie', cookie, { append: true })\n }\n }\n return c.json({ data: { user: { id: result.data.user.id } } })\n },\n\n // POST /logout\n logout: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { refreshToken } = readTokensFromCookies(cookieHeader)\n if (!refreshToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.logout({ refreshToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n const clearHeaders = clearTokenCookies()\n for (const cookie of clearHeaders) {\n c.header('Set-Cookie', cookie, { append: true })\n }\n return c.json({ data: result.data })\n },\n\n // GET /me\n getMe: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.getUser({ accessToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // PATCH /me\n updateMe: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n let raw: unknown\n try {\n raw = await c.req.json()\n } catch {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidJsonBody, 400),\n 400,\n )\n }\n const parsed = UpdateUserSchema.safeParse(raw)\n if (!parsed.success) {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidUpdateBody, 400),\n 400,\n )\n }\n const result = await client.updateUser({ accessToken, data: parsed.data })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // DELETE /me\n deleteMe: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.deleteUser({ accessToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n const clearHeaders = clearTokenCookies()\n for (const cookie of clearHeaders) {\n c.header('Set-Cookie', cookie, { append: true })\n }\n return c.json({ data: result.data })\n },\n\n // GET /empresas\n getEmpresas: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.getUserEmpresas({ accessToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // POST /empresa-activa\n setActiveEmpresa: async (c: Context): Promise<Response> => {\n // Lleva un access token nuevo en una cookie: nunca cacheable.\n c.header('Cache-Control', 'no-store')\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n let raw: unknown\n try {\n raw = await c.req.json()\n } catch {\n return errorResponse(\n c,\n sdkError('malformed', messages().invalidJsonBody, 400),\n 400,\n )\n }\n const parsed = ActiveEmpresaSchema.safeParse(raw)\n if (!parsed.success) {\n return errorResponse(\n c,\n sdkError(\n 'malformed',\n 'empresaId inválido: debe ser el id de una empresa o null',\n 400,\n ),\n 400,\n )\n }\n const result = await client.setActiveEmpresa({\n accessToken,\n empresaId: parsed.data.empresaId,\n })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n // Auth reemite SOLO el access token; sin él la sesión seguiría con la empresa vieja y no hay\n // nada que reescribir: es una respuesta inválida de Auth, no un éxito.\n if (!result.data.accessToken) {\n return errorResponse(\n c,\n sdkError(\n 'malformed',\n 'Respuesta de Auth sin access token reemitido',\n 502,\n ),\n 502,\n )\n }\n c.header('Set-Cookie', setAccessTokenCookie(result.data.accessToken), {\n append: true,\n })\n return c.json({ data: { empresaId: result.data.empresaId } })\n },\n\n // GET /sessions\n getSessions: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.getSessions({ accessToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // DELETE /sessions/:id\n deleteSession: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { accessToken } = readTokensFromCookies(cookieHeader)\n if (!accessToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const sessionId = c.req.param('id')\n if (!sessionId || !/^[\\w-]+$/.test(sessionId)) {\n return errorResponse(\n c,\n sdkError('malformed', messages().sessionInvalid, 400),\n 400,\n )\n }\n const result = await client.deleteSession({ accessToken, sessionId })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n return c.json({ data: result.data })\n },\n\n // DELETE /sessions\n deleteAllSessions: async (c: Context): Promise<Response> => {\n const cookieHeader = c.req.header('cookie') || null\n const { refreshToken } = readTokensFromCookies(cookieHeader)\n if (!refreshToken)\n return errorResponse(\n c,\n sdkError('auth_required', messages().tokenNotFound, 401),\n 401,\n )\n const result = await client.deleteAllSessions({ refreshToken })\n if (!result.ok) return errorResponse(c, result.error, result.error.status)\n const clearHeaders = clearTokenCookies()\n for (const cookie of clearHeaders) {\n c.header('Set-Cookie', cookie, { append: true })\n }\n return c.json({ data: result.data })\n },\n }\n}\n"],"mappings":";;;;;;;;AAGA,SAAgB,gBAAgB,SAA8B;CAC5D,MAAM,YAAY,QAAQ,QAAQ,IAAI,YAAY,KAAK;CACvD,MAAM,SAAS,OAAO,MAAM,SAAS;CAErC,OAAO;EACL,YAAY,OAAO,UAAU,QAAQ;EACrC,IAAI,OAAO,IAAI,QAAQ;EACvB,SAAS,OAAO,SAAS,QAAQ;EACjC,WAAW,UAAU,MAAM,GAAG,GAAG;CACnC;AACF;;;;;;;;;;ACIA,MAAa,gBAAgB,EAAE,OAAO,EACpC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EACzB,CAAC;;;;;;AAOD,MAAa,cAAc,EAAE,OAAO;CAClC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACvB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CAE7B,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACxC,CAAC;;;;;AAMD,MAAa,sBAAsB,EAAE,OAAO,EAC1C,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EACxC,CAAC;;;;;AAMD,MAAa,mBAAmB,EAC7B,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAC/B,QAAQ,QAAQ,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,GAAG,+BAA+B;;AAY/E,MAAa,sBAAsB;;AAGnC,MAAa,wBAAwB;;AAGrC,MAAa,sBAAsB;;AAGnC,MAAa,wBAAwB;;ACIrC,MAAM,uCAAuB,IAAI,IAAY;CAC3C;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAC1C,CAAC;AAED,MAAM,iBAAiD;CACrD,eAAe;CACf,eAAe;CACf,mBAAmB;CACnB,eAAe;CACf,SAAS;CACT,WAAW;AACb;AAEA,SAAS,YAAY,UAA4B;CAC/C,IAAI,SAAS,SAAS,OAAO,OAAO,SAAS;CAC7C,OAAO,eAAe,SAAS;AACjC;AAEA,SAAS,cACP,GACA,UACA,QACU;CACV,MAAM,aAAa,qBAAqB,IAAI,MAAM,IAC7C,SACD;CAEJ,IADa,aACN,MAAM,OACX,OAAO,EAAE,KACP,EAAE,OAAO;EAAE,MAAM,YAAY,QAAQ;EAAG,SAAS,SAAS;CAAQ,EAAE,GACpE,UACF;CAEF,OAAO,EAAE,KAAK,EAAE,OAAO,SAAS,QAAQ,GAAG,UAAU;AACvD;AAEA,MAAM,+BAAe,IAAI,IAAI;CAAC;CAAO;CAAQ;AAAS,CAAC;;;;;AAMvD,MAAM,uBAAuB;;;;;AAM7B,SAAS,wBAAwB,SAAyC;CACxE,MAAM,6BAAa,IAAI,IAAY;CACnC,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI;EACJ,IAAI;GACF,MAAM,IAAI,IAAI,KAAK;EACrB,QAAQ,CAER;EACA,MAAM,SACJ,QAAQ,KAAA,KAAa,CAAC,YAAY,KAAK,IAAI,QAAQ,IAC/C,qBAAqB,KAAK,KAAK,IAC/B;EACN,IACE,QAAQ,KAAA,KACP,WAAW,QAAQ,CAAC,YAAY,KAAK,IAAI,QAAQ,GAElD,MAAM,IAAI,MACR,2CAA2C,KAAK,UAAU,KAAK,EAAE,+GACnE;EAEF,WAAW,IACT,WAAW,OACP,IAAI,SACJ,GAAI,OAAO,EAAE,CAAY,YAAY,EAAE,KAAM,OAAO,EAAE,CAAY,YAAY,GACpF;CACF;CACA,OAAO;AACT;;;;;AAMA,SAAS,gBACP,QACA,YACA,SACS;CACT,IAAI;CACJ,IAAI;EACF,SAAS,IAAI,IAAI,MAAM;CACzB,QAAQ;EACN,OAAO;CACT;CACA,OACE,QAAQ,IAAI,OAAO,MAAM,KACzB,QAAQ,IAAI,OAAO,YAAY,CAAC,KAChC,OAAO,SAAS,IAAI,IAAI,UAAU,CAAC,CAAC;AAExC;AAEA,SAAS,SACP,QACA,SACA,QACa;CACb,OAAO;EAAE,MAAM;EAAO;EAAQ;EAAS;CAAO;AAChD;;;;;;;;;AAUA,SAAgB,kBAAkB,OAA2B,CAAC,GAAiB;CAC7E,IAAI,KAAK,kBAAkB,KAAA,GACzB,2BAA2B,KAAK,aAAa;CAG/C,MAAM,iBAAiB,wBAAwB,KAAK,kBAAkB,CAAC,CAAC;CAExE,MAAM,SAAS,iBAAiB;CAGhC,MAAM,iBACJ,qBAAqB,KAAK,eAAe,iBAAiB,CAAC;CAE7D,MAAM,aAAa,oBAAoD;EACrE,YAAY,OAAO,GAAG,SAAS;GAC7B,EAAE,OAAO,iBAAiB,UAAU;GACpC,IAAI;IACF,MAAM,EAAE,IAAI,KAAK;GACnB,QAAQ;IACN,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,iBAAiB,GAAG,GACrD,GACF;GACF;GACA,MAAM,KAAK;EACb;EACA,YAAY,QAAQ,MAAM;GACxB,IAAI,OAAO,SAAS,OAAO,KAAA;GAC3B,EAAE,OAAO,iBAAiB,UAAU;GACpC,OAAO,cAAc,GAAG,SAAS,aAAa,eAAe,GAAG,GAAG,GAAG,GAAG;EAC3E;CACF;CAGA,MAAM,cAAiC,OAAO,GAAG,SAAS;EACxD,MAAM,SAAS,EAAE,IAAI,OAAO,QAAQ;EACpC,IACE,aAAa,IAAI,EAAE,IAAI,MAAM,KAC7B,WAAW,KAAA,KACX,gBAAgB,QAAQ,EAAE,IAAI,KAAK,cAAc,GAEjD,OAAO,KAAK;EAEd,OAAO,cACL,GACA;GACE,MAAM;GACN,MAAM;GACN,SAAS,SAAS,CAAC,CAAC;GACpB,QAAQ;EACV,GACA,GACF;CACF;CAEA,OAAO;EACL;EACA,eAAe;GACb,SAAS,gBAAgB,SAAS,CAAC,CAAC,YAAY;GAChD,OAAO,gBAAgB,SAAS,CAAC,CAAC,WAAW;EAC/C;EAEA,SAAS,OAAO,MAAkC;GAEhD,EAAE,OAAO,iBAAiB,UAAU;GACpC,IAAI;GACJ,IAAI;IACF,MAAM,MAAM,EAAE,IAAI,KAAK;GACzB,QAAQ;IACN,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,iBAAiB,GAAG,GACrD,GACF;GACF;GACA,MAAM,SAAS,cAAc,UAAU,GAAG;GAC1C,IAAI,CAAC,OAAO,SACV,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,cAAc,GAAG,GAClD,GACF;GAEF,MAAM,SAAS,MAAM,OAAO,QAAQ,OAAO,IAAI;GAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,OAAO,OAAO,MAAkC;GAE9C,EAAE,OAAO,iBAAiB,UAAU;GACpC,IAAI;GACJ,IAAI;IACF,MAAM,MAAM,EAAE,IAAI,KAAK;GACzB,QAAQ;IACN,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,iBAAiB,GAAG,GACrD,GACF;GACF;GACA,MAAM,SAAS,YAAY,UAAU,GAAG;GACxC,IAAI,CAAC,OAAO,SACV,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,aAAa,GAAG,GACjD,GACF;GAEF,MAAM,aAAa,gBAAgB,EAAE,IAAI,GAAG;GAC5C,MAAM,SAAS,MAAM,OAAO,MAAM;IAAE,GAAG,OAAO;IAAM,GAAG;GAAW,CAAC;GACnE,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,IAAI,OAAO,KAAK,QAAQ;IACtB,MAAM,gBAAgB,gBAAgB,OAAO,KAAK,MAAM;IACxD,KAAK,MAAM,UAAU,eACnB,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,KAAK,CAAC;GAEnD;GACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;EAC/D;EAGA,SAAS,OAAO,MAAkC;GAChD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,iBAAiB,sBAAsB,YAAY;GAC3D,IAAI,CAAC,cACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,mBAAmB,oBACtC,OAAO,QAAQ,EAAE,aAAa,CAAC,CACjC;GACA,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,IAAI,OAAO,KAAK,QAAQ;IACtB,MAAM,gBAAgB,gBAAgB,OAAO,KAAK,MAAM;IACxD,KAAK,MAAM,UAAU,eACnB,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,KAAK,CAAC;GAEnD;GACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;EAC/D;EAGA,QAAQ,OAAO,MAAkC;GAC/C,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,iBAAiB,sBAAsB,YAAY;GAC3D,IAAI,CAAC,cACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,OAAO,EAAE,aAAa,CAAC;GACnD,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,MAAM,eAAe,kBAAkB;GACvC,KAAK,MAAM,UAAU,cACnB,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,KAAK,CAAC;GAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,OAAO,OAAO,MAAkC;GAC9C,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,QAAQ,EAAE,YAAY,CAAC;GACnD,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,UAAU,OAAO,MAAkC;GACjD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,IAAI;GACJ,IAAI;IACF,MAAM,MAAM,EAAE,IAAI,KAAK;GACzB,QAAQ;IACN,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,iBAAiB,GAAG,GACrD,GACF;GACF;GACA,MAAM,SAAS,iBAAiB,UAAU,GAAG;GAC7C,IAAI,CAAC,OAAO,SACV,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,mBAAmB,GAAG,GACvD,GACF;GAEF,MAAM,SAAS,MAAM,OAAO,WAAW;IAAE;IAAa,MAAM,OAAO;GAAK,CAAC;GACzE,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,UAAU,OAAO,MAAkC;GACjD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,WAAW,EAAE,YAAY,CAAC;GACtD,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,MAAM,eAAe,kBAAkB;GACvC,KAAK,MAAM,UAAU,cACnB,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,KAAK,CAAC;GAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,aAAa,OAAO,MAAkC;GACpD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,gBAAgB,EAAE,YAAY,CAAC;GAC3D,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,kBAAkB,OAAO,MAAkC;GAEzD,EAAE,OAAO,iBAAiB,UAAU;GACpC,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,IAAI;GACJ,IAAI;IACF,MAAM,MAAM,EAAE,IAAI,KAAK;GACzB,QAAQ;IACN,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,iBAAiB,GAAG,GACrD,GACF;GACF;GACA,MAAM,SAAS,oBAAoB,UAAU,GAAG;GAChD,IAAI,CAAC,OAAO,SACV,OAAO,cACL,GACA,SACE,aACA,4DACA,GACF,GACA,GACF;GAEF,MAAM,SAAS,MAAM,OAAO,iBAAiB;IAC3C;IACA,WAAW,OAAO,KAAK;GACzB,CAAC;GACD,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GAGzE,IAAI,CAAC,OAAO,KAAK,aACf,OAAO,cACL,GACA,SACE,aACA,gDACA,GACF,GACA,GACF;GAEF,EAAE,OAAO,cAAc,qBAAqB,OAAO,KAAK,WAAW,GAAG,EACpE,QAAQ,KACV,CAAC;GACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,OAAO,KAAK,UAAU,EAAE,CAAC;EAC9D;EAGA,aAAa,OAAO,MAAkC;GACpD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,YAAY,EAAE,YAAY,CAAC;GACvD,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,eAAe,OAAO,MAAkC;GACtD,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,gBAAgB,sBAAsB,YAAY;GAC1D,IAAI,CAAC,aACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,YAAY,EAAE,IAAI,MAAM,IAAI;GAClC,IAAI,CAAC,aAAa,CAAC,WAAW,KAAK,SAAS,GAC1C,OAAO,cACL,GACA,SAAS,aAAa,SAAS,CAAC,CAAC,gBAAgB,GAAG,GACpD,GACF;GAEF,MAAM,SAAS,MAAM,OAAO,cAAc;IAAE;IAAa;GAAU,CAAC;GACpE,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;EAGA,mBAAmB,OAAO,MAAkC;GAC1D,MAAM,eAAe,EAAE,IAAI,OAAO,QAAQ,KAAK;GAC/C,MAAM,EAAE,iBAAiB,sBAAsB,YAAY;GAC3D,IAAI,CAAC,cACH,OAAO,cACL,GACA,SAAS,iBAAiB,SAAS,CAAC,CAAC,eAAe,GAAG,GACvD,GACF;GACF,MAAM,SAAS,MAAM,OAAO,kBAAkB,EAAE,aAAa,CAAC;GAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,cAAc,GAAG,OAAO,OAAO,OAAO,MAAM,MAAM;GACzE,MAAM,eAAe,kBAAkB;GACvC,KAAK,MAAM,UAAU,cACnB,EAAE,OAAO,cAAc,QAAQ,EAAE,QAAQ,KAAK,CAAC;GAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,KAAK,CAAC;EACrC;CACF;AACF"}
@@ -0,0 +1,15 @@
1
+ import { n as EvaErrorMessages } from "./error-messages-CGpW1fsg.js";
2
+ import { Context } from "hono";
3
+ interface AuthHandlerOptions {
4
+ errorMessages?: Partial<EvaErrorMessages>;
5
+ /**
6
+ * Orígenes extra (`https://app.example.com`, sin path) desde los que se aceptan las mutaciones
7
+ * con cookies, además del propio host de la request. Un `Origin` fuera de esa lista responde 403.
8
+ * Acepta cualquier origen serializado `esquema://host[:puerto]` (también `tauri://localhost`,
9
+ * `capacitor://localhost`) por coincidencia exacta. Lanza al construir si una entrada no lo es
10
+ * (p. ej. `'*'` o `null`).
11
+ */
12
+ allowedOrigins?: readonly string[];
13
+ }
14
+ export { AuthHandlerOptions as t };
15
+ //# sourceMappingURL=auth-handlers-BTbXKJms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-handlers-BTbXKJms.d.ts","names":[],"sources":["../src/auth-handlers.ts"],"mappings":";;UA8BiB;EACf,gBAAgB,QAAQ;;;;;;;;EAQxB"}