@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.
- package/CHANGELOG.md +290 -0
- package/LICENSE +21 -0
- package/README.md +481 -2
- package/dist/admin/index.cjs +4 -0
- package/dist/admin/index.d.cts +2 -0
- package/dist/admin/index.d.ts +2 -0
- package/dist/admin/index.js +1 -0
- package/dist/admin-DjvuvuI8.js +408 -0
- package/dist/admin-DjvuvuI8.js.map +1 -0
- package/dist/admin-Q6lbWqLM.cjs +419 -0
- package/dist/admin-Q6lbWqLM.cjs.map +1 -0
- package/dist/api-path-2Ulruz7R.cjs +34 -0
- package/dist/api-path-2Ulruz7R.cjs.map +1 -0
- package/dist/api-path-B-vSkL2H.js +29 -0
- package/dist/api-path-B-vSkL2H.js.map +1 -0
- package/dist/auth-19r-Q6X2.js +84 -0
- package/dist/auth-19r-Q6X2.js.map +1 -0
- package/dist/auth-DX1N5JA4.cjs +131 -0
- package/dist/auth-DX1N5JA4.cjs.map +1 -0
- package/dist/auth-handlers-B3iJaPln.js +343 -0
- package/dist/auth-handlers-B3iJaPln.js.map +1 -0
- package/dist/auth-handlers-BTbXKJms.d.ts +15 -0
- package/dist/auth-handlers-BTbXKJms.d.ts.map +1 -0
- package/dist/auth-handlers-CDzGFDTu.cjs +404 -0
- package/dist/auth-handlers-CDzGFDTu.cjs.map +1 -0
- package/dist/auth-handlers-DRUUTEtW.d.cts +15 -0
- package/dist/auth-handlers-DRUUTEtW.d.cts.map +1 -0
- package/dist/catalog-CHPqldcj.cjs +172 -0
- package/dist/catalog-CHPqldcj.cjs.map +1 -0
- package/dist/catalog-CIqpzgsM.d.cts +75 -0
- package/dist/catalog-CIqpzgsM.d.cts.map +1 -0
- package/dist/catalog-CIqpzgsM.d.ts +75 -0
- package/dist/catalog-CIqpzgsM.d.ts.map +1 -0
- package/dist/catalog-DqPhtCKZ.js +95 -0
- package/dist/catalog-DqPhtCKZ.js.map +1 -0
- package/dist/config-3avoUa9e.d.cts +95 -0
- package/dist/config-3avoUa9e.d.cts.map +1 -0
- package/dist/config-COX7rGAP.d.ts +95 -0
- package/dist/config-COX7rGAP.d.ts.map +1 -0
- package/dist/constants-BE1_9Tod.cjs +52 -0
- package/dist/constants-BE1_9Tod.cjs.map +1 -0
- package/dist/constants-BY7QZokc.js +29 -0
- package/dist/constants-BY7QZokc.js.map +1 -0
- package/dist/constants-CcbhOaAP.cjs +153 -0
- package/dist/constants-CcbhOaAP.cjs.map +1 -0
- package/dist/constants-rNuD5qJn.js +94 -0
- package/dist/constants-rNuD5qJn.js.map +1 -0
- package/dist/contracts/index.cjs +1006 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +488 -0
- package/dist/contracts/index.d.cts.map +1 -0
- package/dist/contracts/index.d.ts +488 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +817 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/cookies-DCIcr7uy.cjs +94 -0
- package/dist/cookies-DCIcr7uy.cjs.map +1 -0
- package/dist/cookies-DKEC7AWv.js +71 -0
- package/dist/cookies-DKEC7AWv.js.map +1 -0
- package/dist/delegated-token-CVNbMNfy.js +426 -0
- package/dist/delegated-token-CVNbMNfy.js.map +1 -0
- package/dist/delegated-token-DHSK4rHI.cjs +461 -0
- package/dist/delegated-token-DHSK4rHI.cjs.map +1 -0
- package/dist/error-helpers-0woh13Wd.d.cts +105 -0
- package/dist/error-helpers-0woh13Wd.d.cts.map +1 -0
- package/dist/error-helpers-Ct3AUK1I.d.ts +105 -0
- package/dist/error-helpers-Ct3AUK1I.d.ts.map +1 -0
- package/dist/error-helpers-XCh4ZJ-g.cjs +282 -0
- package/dist/error-helpers-XCh4ZJ-g.cjs.map +1 -0
- package/dist/error-helpers-lnwgNOw9.js +145 -0
- package/dist/error-helpers-lnwgNOw9.js.map +1 -0
- package/dist/error-messages-CGpW1fsg.d.cts +48 -0
- package/dist/error-messages-CGpW1fsg.d.cts.map +1 -0
- package/dist/error-messages-CGpW1fsg.d.ts +48 -0
- package/dist/error-messages-CGpW1fsg.d.ts.map +1 -0
- package/dist/event-codes-BBJHon-I.cjs +48 -0
- package/dist/event-codes-BBJHon-I.cjs.map +1 -0
- package/dist/event-codes-BgcJWsov.d.cts +42 -0
- package/dist/event-codes-BgcJWsov.d.cts.map +1 -0
- package/dist/event-codes-BgcJWsov.d.ts +42 -0
- package/dist/event-codes-BgcJWsov.d.ts.map +1 -0
- package/dist/event-codes-DR5_VlaR.js +43 -0
- package/dist/event-codes-DR5_VlaR.js.map +1 -0
- package/dist/generic/index.cjs +91 -0
- package/dist/generic/index.cjs.map +1 -0
- package/dist/generic/index.d.cts +27 -0
- package/dist/generic/index.d.cts.map +1 -0
- package/dist/generic/index.d.ts +27 -0
- package/dist/generic/index.d.ts.map +1 -0
- package/dist/generic/index.js +80 -0
- package/dist/generic/index.js.map +1 -0
- package/dist/hono/index.cjs +309 -0
- package/dist/hono/index.cjs.map +1 -0
- package/dist/hono/index.d.cts +272 -0
- package/dist/hono/index.d.cts.map +1 -0
- package/dist/hono/index.d.ts +272 -0
- package/dist/hono/index.d.ts.map +1 -0
- package/dist/hono/index.js +290 -0
- package/dist/hono/index.js.map +1 -0
- package/dist/hono-openapi/index.cjs +326 -0
- package/dist/hono-openapi/index.cjs.map +1 -0
- package/dist/hono-openapi/index.d.cts +14 -0
- package/dist/hono-openapi/index.d.cts.map +1 -0
- package/dist/hono-openapi/index.d.ts +14 -0
- package/dist/hono-openapi/index.d.ts.map +1 -0
- package/dist/hono-openapi/index.js +307 -0
- package/dist/hono-openapi/index.js.map +1 -0
- package/dist/http-client-BVF3iktR.cjs +211 -0
- package/dist/http-client-BVF3iktR.cjs.map +1 -0
- package/dist/http-client-Da0-OMfc.js +206 -0
- package/dist/http-client-Da0-OMfc.js.map +1 -0
- package/dist/index-CIH_2t7Y.d.ts +240 -0
- package/dist/index-CIH_2t7Y.d.ts.map +1 -0
- package/dist/index-CZru7c5T.d.cts +1711 -0
- package/dist/index-CZru7c5T.d.cts.map +1 -0
- package/dist/index-CZru7c5T.d.ts +1711 -0
- package/dist/index-CZru7c5T.d.ts.map +1 -0
- package/dist/index-DMVe5IJA.d.cts +240 -0
- package/dist/index-DMVe5IJA.d.cts.map +1 -0
- package/dist/index-DRWKobSp.d.ts +312 -0
- package/dist/index-DRWKobSp.d.ts.map +1 -0
- package/dist/index-DU9wJ-P2.d.cts +312 -0
- package/dist/index-DU9wJ-P2.d.cts.map +1 -0
- package/dist/index-DbiXllNy.d.cts +66 -0
- package/dist/index-DbiXllNy.d.cts.map +1 -0
- package/dist/index-z9r98qlk.d.ts +66 -0
- package/dist/index-z9r98qlk.d.ts.map +1 -0
- package/dist/index.cjs +89 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +114 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +114 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt-BBNqk0TV.cjs +155 -0
- package/dist/jwt-BBNqk0TV.cjs.map +1 -0
- package/dist/jwt-DhqgH94B.js +150 -0
- package/dist/jwt-DhqgH94B.js.map +1 -0
- package/dist/key-resolver-CESqj4-P.cjs +45 -0
- package/dist/key-resolver-CESqj4-P.cjs.map +1 -0
- package/dist/key-resolver-D56I2Zpz.js +34 -0
- package/dist/key-resolver-D56I2Zpz.js.map +1 -0
- package/dist/parse-error-response-6qOQS5y9.cjs +316 -0
- package/dist/parse-error-response-6qOQS5y9.cjs.map +1 -0
- package/dist/parse-error-response-BM9-kjs0.js +239 -0
- package/dist/parse-error-response-BM9-kjs0.js.map +1 -0
- package/dist/path-segment-C25i6aaH.cjs +29 -0
- package/dist/path-segment-C25i6aaH.cjs.map +1 -0
- package/dist/path-segment-CyqnaFrP.js +24 -0
- package/dist/path-segment-CyqnaFrP.js.map +1 -0
- package/dist/react/index.cjs +336 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +151 -0
- package/dist/react/index.d.cts.map +1 -0
- package/dist/react/index.d.ts +151 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +300 -0
- package/dist/react/index.js.map +1 -0
- package/dist/refresh-dedup-CKaHHe7m.js +14 -0
- package/dist/refresh-dedup-CKaHHe7m.js.map +1 -0
- package/dist/refresh-dedup-CLdACQXR.cjs +19 -0
- package/dist/refresh-dedup-CLdACQXR.cjs.map +1 -0
- package/dist/rolldown-runtime-CmQyd0Gu.cjs +27 -0
- package/dist/routes-DpAzgY1V.cjs +424 -0
- package/dist/routes-DpAzgY1V.cjs.map +1 -0
- package/dist/routes-F1g5aVqP.js +347 -0
- package/dist/routes-F1g5aVqP.js.map +1 -0
- package/dist/s2s/index.cjs +24 -0
- package/dist/s2s/index.d.cts +5 -0
- package/dist/s2s/index.d.ts +5 -0
- package/dist/s2s/index.js +5 -0
- package/dist/s2s-6wbotr78.cjs +926 -0
- package/dist/s2s-6wbotr78.cjs.map +1 -0
- package/dist/s2s-B_0SIQzn.js +897 -0
- package/dist/s2s-B_0SIQzn.js.map +1 -0
- package/dist/sign-C7y6xdvT.cjs +324 -0
- package/dist/sign-C7y6xdvT.cjs.map +1 -0
- package/dist/sign-HFtcYwa-.js +259 -0
- package/dist/sign-HFtcYwa-.js.map +1 -0
- package/dist/tokens-C1nzkn21.cjs +232 -0
- package/dist/tokens-C1nzkn21.cjs.map +1 -0
- package/dist/tokens-C3Z40qd7.js +107 -0
- package/dist/tokens-C3Z40qd7.js.map +1 -0
- package/dist/types-Ai3iIFlB.d.cts +538 -0
- package/dist/types-Ai3iIFlB.d.cts.map +1 -0
- package/dist/types-Bxg4hCMc.d.cts +52 -0
- package/dist/types-Bxg4hCMc.d.cts.map +1 -0
- package/dist/types-CEABh1Zf.d.ts +96 -0
- package/dist/types-CEABh1Zf.d.ts.map +1 -0
- package/dist/types-Ci0Jq0xB.d.cts +96 -0
- package/dist/types-Ci0Jq0xB.d.cts.map +1 -0
- package/dist/types-DXg8BvEh.d.ts +52 -0
- package/dist/types-DXg8BvEh.d.ts.map +1 -0
- package/dist/types-_zY7QbM5.d.ts +538 -0
- package/dist/types-_zY7QbM5.d.ts.map +1 -0
- package/dist/webhooks/index.cjs +8 -0
- package/dist/webhooks/index.d.cts +5 -0
- package/dist/webhooks/index.d.ts +5 -0
- package/dist/webhooks/index.js +4 -0
- package/dist/webhooks-B5sAWC9W.js +74 -0
- package/dist/webhooks-B5sAWC9W.js.map +1 -0
- package/dist/webhooks-Cx11psg1.cjs +79 -0
- package/dist/webhooks-Cx11psg1.cjs.map +1 -0
- package/package.json +192 -3
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { a as GetCodeSchema, c as RefreshResponseSchema, i as GetCodeResponseSchema, l as UpdateUserSchema, n as ActiveEmpresaSchema, o as LoginResponseSchema, r as ErrorResponseSchema, s as LoginSchema, t as buildAuthHandlers } from "../auth-handlers-B3iJaPln.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { OpenAPIHono, OpenAPIHono as OpenAPIHono$1, createRoute, createRoute as createRoute$1, defineOpenAPIRoute } from "@hono/zod-openapi";
|
|
4
|
+
// src/hono-openapi/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* Variante OpenAPIHono del SDK — entry point `@eva_solutions/auth-sdk/hono-openapi`.
|
|
7
|
+
*
|
|
8
|
+
* Decisión B3 (ADR-012): usa `createRoute` + `app.openapi(route, handler)`.
|
|
9
|
+
* `defineOpenAPIRoute` es para el método `openapiRoutes` (array API) — se eligió
|
|
10
|
+
* `createRoute` como API primaria por compatibilidad con el factory pattern.
|
|
11
|
+
* Los handlers del factory son compatibles con `RouteHandler<R>` cuando se castea
|
|
12
|
+
* via `as RouteHandler<typeof route>` (no `as never` — type assertion específica).
|
|
13
|
+
* Decisión B1 (ADR-012): schemas importados desde src/schemas.ts (canónico — T-00 validó).
|
|
14
|
+
* Decisión CE1 (ADR-012): requiere parent OpenAPIHono (no Hono plano) — ver warning.
|
|
15
|
+
*
|
|
16
|
+
* RISK-04 (T-034): ErrorResponseSchema siempre documenta el shape 'api'
|
|
17
|
+
* `{ error: { code: string, message: string } }` independientemente del errorWire
|
|
18
|
+
* configurado en runtime. En wire='sdk' el runtime devuelve el mismo shape — es correcto.
|
|
19
|
+
* El errorWire controla el código de error (EvaApiError vs EvaSdkError), pero el shape
|
|
20
|
+
* del wire HTTP es siempre `{ error: { code, message } }` en ambos casos.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { OpenAPIHono } from '@hono/zod-openapi'
|
|
25
|
+
* import { evaAuthOpenAPIRoutes } from '@eva_solutions/auth-sdk/hono-openapi'
|
|
26
|
+
*
|
|
27
|
+
* const app = new OpenAPIHono() // ← CRÍTICO: OpenAPIHono, no Hono
|
|
28
|
+
* app.route('/auth', evaAuthOpenAPIRoutes())
|
|
29
|
+
* app.doc('/doc', { openapi: '3.1.0', info: { title: 'API', version: '1.0' } })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
const tags = ["Auth"];
|
|
33
|
+
const getCodeRoute = createRoute$1({
|
|
34
|
+
method: "post",
|
|
35
|
+
path: "/get-code",
|
|
36
|
+
tags,
|
|
37
|
+
summary: "Solicitar código de verificación",
|
|
38
|
+
request: { body: {
|
|
39
|
+
content: { "application/json": { schema: GetCodeSchema } },
|
|
40
|
+
required: true
|
|
41
|
+
} },
|
|
42
|
+
responses: {
|
|
43
|
+
200: {
|
|
44
|
+
description: "Código enviado al teléfono; incluye el challengeId del desafío",
|
|
45
|
+
content: { "application/json": { schema: GetCodeResponseSchema } }
|
|
46
|
+
},
|
|
47
|
+
400: {
|
|
48
|
+
description: "Teléfono inválido o JSON malformado",
|
|
49
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const loginRoute = createRoute$1({
|
|
54
|
+
method: "post",
|
|
55
|
+
path: "/login",
|
|
56
|
+
tags,
|
|
57
|
+
summary: "Autenticarse con teléfono y código",
|
|
58
|
+
request: { body: {
|
|
59
|
+
content: { "application/json": { schema: LoginSchema } },
|
|
60
|
+
required: true
|
|
61
|
+
} },
|
|
62
|
+
responses: {
|
|
63
|
+
200: {
|
|
64
|
+
description: "Login exitoso — tokens seteados en cookies",
|
|
65
|
+
content: { "application/json": { schema: LoginResponseSchema } }
|
|
66
|
+
},
|
|
67
|
+
400: {
|
|
68
|
+
description: "Credenciales inválidas o JSON malformado",
|
|
69
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
70
|
+
},
|
|
71
|
+
401: {
|
|
72
|
+
description: "No autorizado",
|
|
73
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const refreshRoute = createRoute$1({
|
|
78
|
+
method: "post",
|
|
79
|
+
path: "/refresh",
|
|
80
|
+
tags,
|
|
81
|
+
summary: "Renovar access token vía refresh token en cookie",
|
|
82
|
+
responses: {
|
|
83
|
+
200: {
|
|
84
|
+
description: "Tokens renovados",
|
|
85
|
+
content: { "application/json": { schema: RefreshResponseSchema } }
|
|
86
|
+
},
|
|
87
|
+
401: {
|
|
88
|
+
description: "Refresh token ausente o inválido",
|
|
89
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const logoutRoute = createRoute$1({
|
|
94
|
+
method: "post",
|
|
95
|
+
path: "/logout",
|
|
96
|
+
tags,
|
|
97
|
+
summary: "Cerrar sesión y limpiar cookies",
|
|
98
|
+
responses: {
|
|
99
|
+
200: {
|
|
100
|
+
description: "Logout exitoso",
|
|
101
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
102
|
+
},
|
|
103
|
+
401: {
|
|
104
|
+
description: "Refresh token ausente",
|
|
105
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
const getMeRoute = createRoute$1({
|
|
110
|
+
method: "get",
|
|
111
|
+
path: "/me",
|
|
112
|
+
tags,
|
|
113
|
+
summary: "Obtener datos del usuario autenticado",
|
|
114
|
+
responses: {
|
|
115
|
+
200: {
|
|
116
|
+
description: "Usuario",
|
|
117
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
118
|
+
},
|
|
119
|
+
401: {
|
|
120
|
+
description: "Access token ausente",
|
|
121
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const updateMeRoute = createRoute$1({
|
|
126
|
+
method: "patch",
|
|
127
|
+
path: "/me",
|
|
128
|
+
tags,
|
|
129
|
+
summary: "Actualizar datos del usuario autenticado",
|
|
130
|
+
request: { body: {
|
|
131
|
+
content: { "application/json": { schema: UpdateUserSchema } },
|
|
132
|
+
required: true
|
|
133
|
+
} },
|
|
134
|
+
responses: {
|
|
135
|
+
200: {
|
|
136
|
+
description: "Usuario actualizado",
|
|
137
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
138
|
+
},
|
|
139
|
+
400: {
|
|
140
|
+
description: "Body inválido",
|
|
141
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
142
|
+
},
|
|
143
|
+
401: {
|
|
144
|
+
description: "Access token ausente",
|
|
145
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
const deleteMeRoute = createRoute$1({
|
|
150
|
+
method: "delete",
|
|
151
|
+
path: "/me",
|
|
152
|
+
tags,
|
|
153
|
+
summary: "Eliminar cuenta del usuario autenticado",
|
|
154
|
+
responses: {
|
|
155
|
+
200: {
|
|
156
|
+
description: "Cuenta eliminada",
|
|
157
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
158
|
+
},
|
|
159
|
+
401: {
|
|
160
|
+
description: "Access token ausente",
|
|
161
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
const getEmpresasRoute = createRoute$1({
|
|
166
|
+
method: "get",
|
|
167
|
+
path: "/empresas",
|
|
168
|
+
tags,
|
|
169
|
+
summary: "Listar empresas del usuario autenticado",
|
|
170
|
+
responses: {
|
|
171
|
+
200: {
|
|
172
|
+
description: "Lista de empresas",
|
|
173
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
174
|
+
},
|
|
175
|
+
401: {
|
|
176
|
+
description: "Access token ausente",
|
|
177
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
const setActiveEmpresaRoute = createRoute$1({
|
|
182
|
+
method: "post",
|
|
183
|
+
path: "/empresa-activa",
|
|
184
|
+
tags,
|
|
185
|
+
summary: "Cambiar la empresa activa de la sesión",
|
|
186
|
+
request: { body: {
|
|
187
|
+
content: { "application/json": { schema: ActiveEmpresaSchema } },
|
|
188
|
+
required: true
|
|
189
|
+
} },
|
|
190
|
+
responses: {
|
|
191
|
+
200: {
|
|
192
|
+
description: "Empresa activa cambiada — access token nuevo seteado en su cookie (el refresh no rota)",
|
|
193
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
194
|
+
},
|
|
195
|
+
400: {
|
|
196
|
+
description: "Body inválido",
|
|
197
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
198
|
+
},
|
|
199
|
+
401: {
|
|
200
|
+
description: "Access token ausente o inválido",
|
|
201
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
202
|
+
},
|
|
203
|
+
403: {
|
|
204
|
+
description: "La persona no pertenece a la empresa, o el Origin no está permitido",
|
|
205
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
206
|
+
},
|
|
207
|
+
429: {
|
|
208
|
+
description: "Auth limitó los pedidos",
|
|
209
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
210
|
+
},
|
|
211
|
+
502: {
|
|
212
|
+
description: "Auth respondió 200 sin reemitir el access token",
|
|
213
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
214
|
+
},
|
|
215
|
+
503: {
|
|
216
|
+
description: "Auth no disponible",
|
|
217
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
const getSessionsRoute = createRoute$1({
|
|
222
|
+
method: "get",
|
|
223
|
+
path: "/sessions",
|
|
224
|
+
tags,
|
|
225
|
+
summary: "Listar sesiones activas del usuario",
|
|
226
|
+
responses: {
|
|
227
|
+
200: {
|
|
228
|
+
description: "Lista de sesiones",
|
|
229
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
230
|
+
},
|
|
231
|
+
401: {
|
|
232
|
+
description: "Access token ausente",
|
|
233
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
const deleteSessionRoute = createRoute$1({
|
|
238
|
+
method: "delete",
|
|
239
|
+
path: "/sessions/{id}",
|
|
240
|
+
tags,
|
|
241
|
+
summary: "Cerrar una sesión específica por ID",
|
|
242
|
+
responses: {
|
|
243
|
+
200: {
|
|
244
|
+
description: "Sesión cerrada",
|
|
245
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
246
|
+
},
|
|
247
|
+
400: {
|
|
248
|
+
description: "ID de sesión inválido",
|
|
249
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
250
|
+
},
|
|
251
|
+
401: {
|
|
252
|
+
description: "Access token ausente",
|
|
253
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
const deleteAllSessionsRoute = createRoute$1({
|
|
258
|
+
method: "delete",
|
|
259
|
+
path: "/sessions",
|
|
260
|
+
tags,
|
|
261
|
+
summary: "Cerrar todas las sesiones activas",
|
|
262
|
+
responses: {
|
|
263
|
+
200: {
|
|
264
|
+
description: "Todas las sesiones cerradas",
|
|
265
|
+
content: { "application/json": { schema: z.object({ data: z.unknown() }) } }
|
|
266
|
+
},
|
|
267
|
+
401: {
|
|
268
|
+
description: "Refresh token ausente",
|
|
269
|
+
content: { "application/json": { schema: ErrorResponseSchema } }
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
/**
|
|
274
|
+
* Retorna una instancia `OpenAPIHono` con los 12 endpoints de auth declarados
|
|
275
|
+
* con schemas Zod 4 para generación automática de documentación OpenAPI 3.1.
|
|
276
|
+
*
|
|
277
|
+
* ⚠ IMPORTANTE: montar en un parent `OpenAPIHono` (no `Hono` plano).
|
|
278
|
+
* Si el parent es `new Hono()`, los paths NO aparecerán en el documento `/doc`.
|
|
279
|
+
* Ver honojs/middleware#952 y docs/configuration.md sección "Variante OpenAPI".
|
|
280
|
+
*/
|
|
281
|
+
function evaAuthOpenAPIRoutes(opts = {}) {
|
|
282
|
+
const h = buildAuthHandlers(opts);
|
|
283
|
+
const { getCode: getCodeGuard, login: loginGuard } = h.openApiGuards;
|
|
284
|
+
const sdkGuards = /* @__PURE__ */ new WeakMap();
|
|
285
|
+
const app = new OpenAPIHono$1({ defaultHook: (result, c) => sdkGuards.get(c)?.onInvalid(result, c) });
|
|
286
|
+
app.use("*", h.originGuard);
|
|
287
|
+
for (const [path, guard] of [["/get-code", getCodeGuard], ["/login", loginGuard]]) app.on("POST", path, (c, next) => {
|
|
288
|
+
sdkGuards.set(c, guard);
|
|
289
|
+
return guard.middleware(c, next);
|
|
290
|
+
});
|
|
291
|
+
app.openapi(getCodeRoute, h.getCode);
|
|
292
|
+
app.openapi(loginRoute, h.login);
|
|
293
|
+
app.openapi(refreshRoute, h.refresh);
|
|
294
|
+
app.openapi(logoutRoute, h.logout);
|
|
295
|
+
app.openapi(getMeRoute, h.getMe);
|
|
296
|
+
app.openapi(updateMeRoute, h.updateMe);
|
|
297
|
+
app.openapi(deleteMeRoute, h.deleteMe);
|
|
298
|
+
app.openapi(getEmpresasRoute, h.getEmpresas);
|
|
299
|
+
app.openapi(setActiveEmpresaRoute, h.setActiveEmpresa);
|
|
300
|
+
app.openapi(getSessionsRoute, h.getSessions);
|
|
301
|
+
app.openapi(deleteSessionRoute, h.deleteSession);
|
|
302
|
+
app.openapi(deleteAllSessionsRoute, h.deleteAllSessions);
|
|
303
|
+
return app;
|
|
304
|
+
}
|
|
305
|
+
export { OpenAPIHono, createRoute, defineOpenAPIRoute, evaAuthOpenAPIRoutes };
|
|
306
|
+
|
|
307
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["createRoute","OpenAPIHono"],"sources":["../../src/hono-openapi/index.ts"],"sourcesContent":["/**\n * Variante OpenAPIHono del SDK — entry point `@eva_solutions/auth-sdk/hono-openapi`.\n *\n * Decisión B3 (ADR-012): usa `createRoute` + `app.openapi(route, handler)`.\n * `defineOpenAPIRoute` es para el método `openapiRoutes` (array API) — se eligió\n * `createRoute` como API primaria por compatibilidad con el factory pattern.\n * Los handlers del factory son compatibles con `RouteHandler<R>` cuando se castea\n * via `as RouteHandler<typeof route>` (no `as never` — type assertion específica).\n * Decisión B1 (ADR-012): schemas importados desde src/schemas.ts (canónico — T-00 validó).\n * Decisión CE1 (ADR-012): requiere parent OpenAPIHono (no Hono plano) — ver warning.\n *\n * RISK-04 (T-034): ErrorResponseSchema siempre documenta el shape 'api'\n * `{ error: { code: string, message: string } }` independientemente del errorWire\n * configurado en runtime. En wire='sdk' el runtime devuelve el mismo shape — es correcto.\n * El errorWire controla el código de error (EvaApiError vs EvaSdkError), pero el shape\n * del wire HTTP es siempre `{ error: { code, message } }` en ambos casos.\n *\n * @example\n * ```ts\n * import { OpenAPIHono } from '@hono/zod-openapi'\n * import { evaAuthOpenAPIRoutes } from '@eva_solutions/auth-sdk/hono-openapi'\n *\n * const app = new OpenAPIHono() // ← CRÍTICO: OpenAPIHono, no Hono\n * app.route('/auth', evaAuthOpenAPIRoutes())\n * app.doc('/doc', { openapi: '3.1.0', info: { title: 'API', version: '1.0' } })\n * ```\n */\nimport { OpenAPIHono, createRoute } from '@hono/zod-openapi'\nimport { z } from 'zod'\nimport type { RouteHandler } from '@hono/zod-openapi'\nimport type { Context } from 'hono'\nimport {\n buildAuthHandlers,\n type AuthHandlerOptions,\n type OpenAPIBodyGuard,\n} from '../auth-handlers'\nimport {\n ActiveEmpresaSchema,\n GetCodeSchema,\n GetCodeResponseSchema,\n LoginSchema,\n UpdateUserSchema,\n ErrorResponseSchema,\n LoginResponseSchema,\n RefreshResponseSchema,\n} from '../schemas'\n\nexport type EvaAuthOpenAPIRoutesOptions = AuthHandlerOptions\n\nconst tags = ['Auth']\n\n// === Route definitions (createRoute — forma canónica de @hono/zod-openapi) ===\n\nconst getCodeRoute = createRoute({\n method: 'post',\n path: '/get-code',\n tags,\n summary: 'Solicitar código de verificación',\n request: {\n body: {\n content: { 'application/json': { schema: GetCodeSchema } },\n required: true,\n },\n },\n responses: {\n 200: {\n description:\n 'Código enviado al teléfono; incluye el challengeId del desafío',\n content: { 'application/json': { schema: GetCodeResponseSchema } },\n },\n 400: {\n description: 'Teléfono inválido o JSON malformado',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst loginRoute = createRoute({\n method: 'post',\n path: '/login',\n tags,\n summary: 'Autenticarse con teléfono y código',\n request: {\n body: {\n content: { 'application/json': { schema: LoginSchema } },\n required: true,\n },\n },\n responses: {\n 200: {\n description: 'Login exitoso — tokens seteados en cookies',\n content: { 'application/json': { schema: LoginResponseSchema } },\n },\n 400: {\n description: 'Credenciales inválidas o JSON malformado',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 401: {\n description: 'No autorizado',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst refreshRoute = createRoute({\n method: 'post',\n path: '/refresh',\n tags,\n summary: 'Renovar access token vía refresh token en cookie',\n responses: {\n 200: {\n description: 'Tokens renovados',\n content: { 'application/json': { schema: RefreshResponseSchema } },\n },\n 401: {\n description: 'Refresh token ausente o inválido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst logoutRoute = createRoute({\n method: 'post',\n path: '/logout',\n tags,\n summary: 'Cerrar sesión y limpiar cookies',\n responses: {\n 200: {\n description: 'Logout exitoso',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Refresh token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst getMeRoute = createRoute({\n method: 'get',\n path: '/me',\n tags,\n summary: 'Obtener datos del usuario autenticado',\n responses: {\n 200: {\n description: 'Usuario',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst updateMeRoute = createRoute({\n method: 'patch',\n path: '/me',\n tags,\n summary: 'Actualizar datos del usuario autenticado',\n request: {\n body: {\n content: { 'application/json': { schema: UpdateUserSchema } },\n required: true,\n },\n },\n responses: {\n 200: {\n description: 'Usuario actualizado',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 400: {\n description: 'Body inválido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst deleteMeRoute = createRoute({\n method: 'delete',\n path: '/me',\n tags,\n summary: 'Eliminar cuenta del usuario autenticado',\n responses: {\n 200: {\n description: 'Cuenta eliminada',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst getEmpresasRoute = createRoute({\n method: 'get',\n path: '/empresas',\n tags,\n summary: 'Listar empresas del usuario autenticado',\n responses: {\n 200: {\n description: 'Lista de empresas',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst setActiveEmpresaRoute = createRoute({\n method: 'post',\n path: '/empresa-activa',\n tags,\n summary: 'Cambiar la empresa activa de la sesión',\n request: {\n body: {\n content: { 'application/json': { schema: ActiveEmpresaSchema } },\n required: true,\n },\n },\n responses: {\n 200: {\n description:\n 'Empresa activa cambiada — access token nuevo seteado en su cookie (el refresh no rota)',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 400: {\n description: 'Body inválido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 401: {\n description: 'Access token ausente o inválido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 403: {\n description:\n 'La persona no pertenece a la empresa, o el Origin no está permitido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 429: {\n description: 'Auth limitó los pedidos',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 502: {\n description: 'Auth respondió 200 sin reemitir el access token',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 503: {\n description: 'Auth no disponible',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst getSessionsRoute = createRoute({\n method: 'get',\n path: '/sessions',\n tags,\n summary: 'Listar sesiones activas del usuario',\n responses: {\n 200: {\n description: 'Lista de sesiones',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst deleteSessionRoute = createRoute({\n method: 'delete',\n path: '/sessions/{id}',\n tags,\n summary: 'Cerrar una sesión específica por ID',\n responses: {\n 200: {\n description: 'Sesión cerrada',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 400: {\n description: 'ID de sesión inválido',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n 401: {\n description: 'Access token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\nconst deleteAllSessionsRoute = createRoute({\n method: 'delete',\n path: '/sessions',\n tags,\n summary: 'Cerrar todas las sesiones activas',\n responses: {\n 200: {\n description: 'Todas las sesiones cerradas',\n content: {\n 'application/json': { schema: z.object({ data: z.unknown() }) },\n },\n },\n 401: {\n description: 'Refresh token ausente',\n content: { 'application/json': { schema: ErrorResponseSchema } },\n },\n },\n})\n\n// === Factory ===\n\n/**\n * Retorna una instancia `OpenAPIHono` con los 12 endpoints de auth declarados\n * con schemas Zod 4 para generación automática de documentación OpenAPI 3.1.\n *\n * ⚠ IMPORTANTE: montar en un parent `OpenAPIHono` (no `Hono` plano).\n * Si el parent es `new Hono()`, los paths NO aparecerán en el documento `/doc`.\n * Ver honojs/middleware#952 y docs/configuration.md sección \"Variante OpenAPI\".\n */\nexport function evaAuthOpenAPIRoutes(\n opts: EvaAuthOpenAPIRoutesOptions = {},\n): OpenAPIHono {\n const h = buildAuthHandlers(opts)\n const { getCode: getCodeGuard, login: loginGuard } = h.openApiGuards\n // Hook del validador solo para get-code/login del SDK: sus 400 salen en el wire de la\n // variante plana en vez del ZodError. El resto de las rutas conserva el default.\n // Las rutas del SDK se identifican por haber pasado por su guarda (registrada con el\n // path exacto relativo a esta sub-app), no por el sufijo del path completo: así una\n // ruta propia del consumidor (/admin/login, /sms/get-code) no hereda los mensajes\n // y el prefijo de montaje (/auth, basePath, raíz, strict:false) es irrelevante.\n const sdkGuards = new WeakMap<Context, OpenAPIBodyGuard>()\n const app = new OpenAPIHono({\n defaultHook: (result, c) => sdkGuards.get(c)?.onInvalid(result, c),\n })\n\n // CSRF por Origin: antes que cualquier otra guarda o validador.\n app.use('*', h.originGuard)\n\n // get-code/login: el validador del body responde el 400 antes que el handler;\n // la guarda aporta no-store y el JSON malformado en el wire de la variante plana.\n for (const [path, guard] of [\n ['/get-code', getCodeGuard],\n ['/login', loginGuard],\n ] as const) {\n app.on('POST', path, (c, next) => {\n sdkGuards.set(c, guard)\n return guard.middleware(c, next)\n })\n }\n\n // Los handlers del factory retornan Promise<Response> — compatible en runtime con\n // RouteHandler<R>, pero TS no puede reconciliar el union type RouteConfigToTypedResponse.\n // Se usa double assertion (as unknown as RouteHandler<R>) documentada en ADR-012:\n // es una type assertion específica (no as never — mantiene el tipo target concreto).\n // Justificación: el factory pattern compartido entre variante plana y OpenAPI requiere\n // handlers genéricos; la inference TS no atraviesa el indirection del factory.\n app.openapi(\n getCodeRoute,\n h.getCode as unknown as RouteHandler<typeof getCodeRoute>,\n )\n app.openapi(loginRoute, h.login as unknown as RouteHandler<typeof loginRoute>)\n app.openapi(\n refreshRoute,\n h.refresh as unknown as RouteHandler<typeof refreshRoute>,\n )\n app.openapi(\n logoutRoute,\n h.logout as unknown as RouteHandler<typeof logoutRoute>,\n )\n app.openapi(getMeRoute, h.getMe as unknown as RouteHandler<typeof getMeRoute>)\n app.openapi(\n updateMeRoute,\n h.updateMe as unknown as RouteHandler<typeof updateMeRoute>,\n )\n app.openapi(\n deleteMeRoute,\n h.deleteMe as unknown as RouteHandler<typeof deleteMeRoute>,\n )\n app.openapi(\n getEmpresasRoute,\n h.getEmpresas as unknown as RouteHandler<typeof getEmpresasRoute>,\n )\n app.openapi(\n setActiveEmpresaRoute,\n h.setActiveEmpresa as unknown as RouteHandler<typeof setActiveEmpresaRoute>,\n )\n app.openapi(\n getSessionsRoute,\n h.getSessions as unknown as RouteHandler<typeof getSessionsRoute>,\n )\n app.openapi(\n deleteSessionRoute,\n h.deleteSession as unknown as RouteHandler<typeof deleteSessionRoute>,\n )\n app.openapi(\n deleteAllSessionsRoute,\n h.deleteAllSessions as unknown as RouteHandler<\n typeof deleteAllSessionsRoute\n >,\n )\n\n return app\n}\n\n// Re-exports de conveniencia\nexport { OpenAPIHono, createRoute, defineOpenAPIRoute } from '@hono/zod-openapi'\n"],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
const require_constants = require("./constants-CcbhOaAP.cjs");
|
|
2
|
+
const require_routes = require("./routes-DpAzgY1V.cjs");
|
|
3
|
+
const require_api_path = require("./api-path-2Ulruz7R.cjs");
|
|
4
|
+
const require_parse_error_response = require("./parse-error-response-6qOQS5y9.cjs");
|
|
5
|
+
const require_constants$1 = require("./constants-BE1_9Tod.cjs");
|
|
6
|
+
let zod = require("zod");
|
|
7
|
+
// src/http-client.ts
|
|
8
|
+
const AuthServiceResponseSchema = zod.z.object({ data: zod.z.unknown() });
|
|
9
|
+
const AUTH_SERVICE_TIMEOUT = 1e4;
|
|
10
|
+
const extractTokens = (headers) => {
|
|
11
|
+
const accessToken = headers.get(require_constants.HEADERS.NEW_ACCESS_TOKEN);
|
|
12
|
+
const refreshToken = headers.get(require_constants.HEADERS.NEW_REFRESH_TOKEN);
|
|
13
|
+
if (!accessToken || !refreshToken) return void 0;
|
|
14
|
+
return {
|
|
15
|
+
accessToken,
|
|
16
|
+
refreshToken
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
const authFetch = async (path, options = {}) => {
|
|
20
|
+
const { method = "GET", accessToken, refreshToken, body } = options;
|
|
21
|
+
const headers = { "content-type": "application/json" };
|
|
22
|
+
if (accessToken) headers[require_constants.HEADERS.AUTHORIZATION] = `Bearer ${accessToken}`;
|
|
23
|
+
if (refreshToken) headers[require_constants.HEADERS.REFRESH_TOKEN] = refreshToken;
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`${require_constants$1.getAuthServiceUrl()}${path}`, {
|
|
26
|
+
method,
|
|
27
|
+
headers,
|
|
28
|
+
signal: AbortSignal.timeout(AUTH_SERVICE_TIMEOUT),
|
|
29
|
+
...body ? { body: JSON.stringify(body) } : {}
|
|
30
|
+
});
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
const body = await res.json().catch(() => null);
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
error: require_parse_error_response.parseErrorResponse(res.status, body)
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const json = await res.json();
|
|
39
|
+
const parsed = AuthServiceResponseSchema.safeParse(json);
|
|
40
|
+
if (!parsed.success) return {
|
|
41
|
+
ok: false,
|
|
42
|
+
error: {
|
|
43
|
+
kind: "sdk",
|
|
44
|
+
reason: "malformed",
|
|
45
|
+
message: "Estructura de respuesta inválida",
|
|
46
|
+
status: 502
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const data = parsed.data.data;
|
|
50
|
+
if (Array.isArray(data)) return {
|
|
51
|
+
ok: true,
|
|
52
|
+
data
|
|
53
|
+
};
|
|
54
|
+
if (options.reissuesAccessTokenOnly) {
|
|
55
|
+
const accessToken = res.headers.get(require_constants.HEADERS.NEW_ACCESS_TOKEN);
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
data: {
|
|
59
|
+
...data,
|
|
60
|
+
...accessToken ? { accessToken } : {}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const tokens = extractTokens(res.headers);
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
data: {
|
|
68
|
+
...data,
|
|
69
|
+
...tokens ? { tokens } : {}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
} catch (err) {
|
|
73
|
+
if (require_parse_error_response.isEvaAuthConfigError(err)) throw err;
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
error: {
|
|
77
|
+
kind: "sdk",
|
|
78
|
+
reason: "network",
|
|
79
|
+
message: err instanceof Error ? err.message : "Error de red",
|
|
80
|
+
status: 0
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Solicita un código OTP. En éxito devuelve `{ message, challengeId }`:
|
|
87
|
+
* `challengeId` es opaco, el caller debe conservarlo (en memoria) y enviarlo a
|
|
88
|
+
* `login`; cada `getCode` nuevo invalida el `challengeId` anterior.
|
|
89
|
+
* El tipo es un cast: la respuesta del Auth Service no se parsea en runtime.
|
|
90
|
+
*/
|
|
91
|
+
const getCode = (params) => authFetch(require_api_path.apiPath(require_routes.AUTH_ROUTES.getCode), {
|
|
92
|
+
method: "POST",
|
|
93
|
+
body: { phone: params.phone }
|
|
94
|
+
});
|
|
95
|
+
/**
|
|
96
|
+
* Verifica el código OTP. `challengeId` es obligatorio: debe ser el que
|
|
97
|
+
* devolvió el `getCode` que originó el código; sin el desafío vigente el Auth
|
|
98
|
+
* Service responde 401 sin consumir intentos.
|
|
99
|
+
*
|
|
100
|
+
* El `producto` del login sale SIEMPRE de `configureEvaAuth({ product })`, nunca del llamador: el
|
|
101
|
+
* access token queda emitido para ese producto. `empresaId` (opcional) deja esa empresa activa en
|
|
102
|
+
* la sesión si la persona pertenece a ella.
|
|
103
|
+
*
|
|
104
|
+
* @throws Error de configuración (`EvaAuthConfigError`) si falta `configureEvaAuth({ product })`.
|
|
105
|
+
*/
|
|
106
|
+
const login = (params) => {
|
|
107
|
+
const { phone, code, challengeId, empresaId, deviceType, os, browser, userAgent } = params;
|
|
108
|
+
return authFetch(require_api_path.apiPath(require_routes.AUTH_ROUTES.login), {
|
|
109
|
+
method: "POST",
|
|
110
|
+
body: {
|
|
111
|
+
phone,
|
|
112
|
+
code,
|
|
113
|
+
challengeId,
|
|
114
|
+
producto: require_parse_error_response.getProduct(),
|
|
115
|
+
...empresaId !== void 0 && { empresaId },
|
|
116
|
+
deviceType,
|
|
117
|
+
os,
|
|
118
|
+
browser,
|
|
119
|
+
userAgent
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Cambia la empresa activa de la sesión (`null` la deja sin empresa). Auth reemite SOLO el access
|
|
125
|
+
* token (`x-eva-new-access-token`; el refresh no rota): llega en `accessToken`. Auth valida la
|
|
126
|
+
* pertenencia; si la persona no pertenece, responde error.
|
|
127
|
+
*/
|
|
128
|
+
const setActiveEmpresa = (params) => authFetch(require_api_path.apiPath(require_routes.AUTH_ROUTES.setActiveEmpresa), {
|
|
129
|
+
method: "POST",
|
|
130
|
+
accessToken: params.accessToken,
|
|
131
|
+
body: { empresaId: params.empresaId },
|
|
132
|
+
reissuesAccessTokenOnly: true
|
|
133
|
+
});
|
|
134
|
+
const refresh = (params) => authFetch(require_api_path.apiPath(require_routes.AUTH_ROUTES.refresh), {
|
|
135
|
+
method: "POST",
|
|
136
|
+
refreshToken: params.refreshToken
|
|
137
|
+
});
|
|
138
|
+
const logout = (params) => authFetch(require_api_path.apiPath(require_routes.AUTH_ROUTES.logout), {
|
|
139
|
+
method: "POST",
|
|
140
|
+
refreshToken: params.refreshToken
|
|
141
|
+
});
|
|
142
|
+
const getUser = (params) => authFetch(require_api_path.apiPath(require_routes.USER_ROUTES.get), { accessToken: params.accessToken });
|
|
143
|
+
const updateUser = (params) => authFetch(require_api_path.apiPath(require_routes.USER_ROUTES.update), {
|
|
144
|
+
method: "PATCH",
|
|
145
|
+
accessToken: params.accessToken,
|
|
146
|
+
body: params.data
|
|
147
|
+
});
|
|
148
|
+
const deleteUser = (params) => authFetch(require_api_path.apiPath(require_routes.USER_ROUTES.deactivate), {
|
|
149
|
+
method: "DELETE",
|
|
150
|
+
accessToken: params.accessToken
|
|
151
|
+
});
|
|
152
|
+
const getUserEmpresas = (params) => authFetch(require_api_path.apiPath(require_routes.USER_ROUTES.listCompanies), { accessToken: params.accessToken });
|
|
153
|
+
/**
|
|
154
|
+
* Busca en el directorio de empresas (solo las activas que optaron por aparecer; solo campos de
|
|
155
|
+
* perfil público; 50 por página). Basta el access token de usuario de CUALQUIER producto habilitado:
|
|
156
|
+
* Auth limita los pedidos por usuario. La siguiente página se pide con el `nextCursor` recibido.
|
|
157
|
+
*/
|
|
158
|
+
const getDirectorio = (params) => {
|
|
159
|
+
const { accessToken, ...filters } = params;
|
|
160
|
+
const query = new URLSearchParams();
|
|
161
|
+
for (const [key, value] of Object.entries(filters)) if (value !== void 0) query.set(key, String(value));
|
|
162
|
+
const qs = query.toString();
|
|
163
|
+
return authFetch(`${require_api_path.apiPath(require_routes.DIRECTORIO_ROUTES.search)}${qs === "" ? "" : `?${qs}`}`, { accessToken });
|
|
164
|
+
};
|
|
165
|
+
const getSessions = (params) => authFetch(require_api_path.apiPath(require_routes.SESSION_ROUTES.list), { accessToken: params.accessToken });
|
|
166
|
+
const deleteSession = (params) => {
|
|
167
|
+
if (!/^[\w-]+$/.test(params.sessionId)) return Promise.resolve({
|
|
168
|
+
ok: false,
|
|
169
|
+
error: {
|
|
170
|
+
kind: "sdk",
|
|
171
|
+
reason: "malformed",
|
|
172
|
+
message: "ID de sesión inválido",
|
|
173
|
+
status: 400
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
return authFetch(require_api_path.apiPath(require_routes.SESSION_ROUTES.deleteOne, { id: params.sessionId }), {
|
|
177
|
+
method: "DELETE",
|
|
178
|
+
accessToken: params.accessToken
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
const deleteAllSessions = (params) => authFetch(require_api_path.apiPath(require_routes.SESSION_ROUTES.deleteAll), {
|
|
182
|
+
method: "DELETE",
|
|
183
|
+
refreshToken: params.refreshToken
|
|
184
|
+
});
|
|
185
|
+
const health = () => authFetch("/health");
|
|
186
|
+
function createHttpClient() {
|
|
187
|
+
return {
|
|
188
|
+
getCode,
|
|
189
|
+
login,
|
|
190
|
+
setActiveEmpresa,
|
|
191
|
+
refresh,
|
|
192
|
+
logout,
|
|
193
|
+
getUser,
|
|
194
|
+
updateUser,
|
|
195
|
+
deleteUser,
|
|
196
|
+
getUserEmpresas,
|
|
197
|
+
getDirectorio,
|
|
198
|
+
getSessions,
|
|
199
|
+
deleteSession,
|
|
200
|
+
deleteAllSessions,
|
|
201
|
+
health
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
Object.defineProperty(exports, "createHttpClient", {
|
|
205
|
+
enumerable: true,
|
|
206
|
+
get: function() {
|
|
207
|
+
return createHttpClient;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
//# sourceMappingURL=http-client-BVF3iktR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-BVF3iktR.cjs","names":["z","HEADERS","getAuthServiceUrl","parseErrorResponse","isEvaAuthConfigError","apiPath","AUTH_ROUTES","getProduct","USER_ROUTES","DIRECTORIO_ROUTES","SESSION_ROUTES"],"sources":["../src/http-client.ts"],"sourcesContent":["import { z } from 'zod'\nimport {\n AUTH_ROUTES,\n DIRECTORIO_ROUTES,\n SESSION_ROUTES,\n USER_ROUTES,\n} from '@eva_solutions/auth-contracts'\nimport type {\n DirectorioQuery,\n DirectorioResponse,\n} from '@eva_solutions/auth-contracts'\nimport { apiPath } from './api-path'\nimport { getProduct, isEvaAuthConfigError } from './config'\nimport { HEADERS, getAuthServiceUrl } from './constants'\nimport { parseErrorResponse } from './parse-error-response'\nimport type {\n EvaUser,\n EvaSession,\n EvaEmpresa,\n Result,\n TokenPair,\n DeviceInfo,\n} from './types'\n\nconst AuthServiceResponseSchema = z.object({\n data: z.unknown(),\n})\n\nconst AUTH_SERVICE_TIMEOUT = 10_000\n\ntype FetchOptions = {\n method?: string\n accessToken?: string\n refreshToken?: string\n body?: unknown\n /** La respuesta reemite solo el access token (`x-eva-new-access-token`); el refresh no rota. */\n reissuesAccessTokenOnly?: boolean\n}\n\nconst extractTokens = (headers: Headers): TokenPair | undefined => {\n const accessToken = headers.get(HEADERS.NEW_ACCESS_TOKEN)\n const refreshToken = headers.get(HEADERS.NEW_REFRESH_TOKEN)\n if (!accessToken || !refreshToken) return undefined\n return { accessToken, refreshToken }\n}\n\nconst authFetch = async <T>(\n path: string,\n options: FetchOptions = {},\n): Promise<Result<T & { tokens?: TokenPair }>> => {\n const { method = 'GET', accessToken, refreshToken, body } = options\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n }\n\n if (accessToken) headers[HEADERS.AUTHORIZATION] = `Bearer ${accessToken}`\n if (refreshToken) headers[HEADERS.REFRESH_TOKEN] = refreshToken\n\n try {\n const res = await fetch(`${getAuthServiceUrl()}${path}`, {\n method,\n headers,\n signal: AbortSignal.timeout(AUTH_SERVICE_TIMEOUT),\n ...(body ? { body: JSON.stringify(body) } : {}),\n })\n\n if (!res.ok) {\n const body = await res.json().catch(() => null)\n return { ok: false, error: parseErrorResponse(res.status, body) }\n }\n\n const json: unknown = await res.json()\n const parsed = AuthServiceResponseSchema.safeParse(json)\n if (!parsed.success) {\n return {\n ok: false,\n error: {\n kind: 'sdk',\n reason: 'malformed',\n message: 'Estructura de respuesta inválida',\n status: 502,\n },\n }\n }\n const data = parsed.data.data as T\n // Un array (`/sessions`, `/user/empresas`) se devuelve intacto: esparcirlo en un objeto lo\n // convertiria en `{ \"0\": …, \"1\": … }`. Esos endpoints se piden solo con access token, asi que\n // no hay tokens nuevos que adjuntar.\n if (Array.isArray(data))\n return { ok: true, data: data as T & { tokens?: TokenPair } }\n\n if (options.reissuesAccessTokenOnly) {\n const accessToken = res.headers.get(HEADERS.NEW_ACCESS_TOKEN)\n return {\n ok: true,\n data: { ...data, ...(accessToken ? { accessToken } : {}) },\n }\n }\n\n const tokens = extractTokens(res.headers)\n\n return { ok: true, data: { ...data, ...(tokens ? { tokens } : {}) } }\n } catch (err) {\n // Falta de configuración (authUrl): error del consumidor, no una falla de red.\n if (isEvaAuthConfigError(err)) throw err\n const message = err instanceof Error ? err.message : 'Error de red'\n return {\n ok: false,\n error: { kind: 'sdk', reason: 'network', message, status: 0 },\n }\n }\n}\n\n/**\n * Solicita un código OTP. En éxito devuelve `{ message, challengeId }`:\n * `challengeId` es opaco, el caller debe conservarlo (en memoria) y enviarlo a\n * `login`; cada `getCode` nuevo invalida el `challengeId` anterior.\n * El tipo es un cast: la respuesta del Auth Service no se parsea en runtime.\n */\nconst getCode = (params: {\n phone: string\n}): Promise<Result<{ message: string; challengeId: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.getCode), {\n method: 'POST',\n body: { phone: params.phone },\n })\n\n/**\n * Verifica el código OTP. `challengeId` es obligatorio: debe ser el que\n * devolvió el `getCode` que originó el código; sin el desafío vigente el Auth\n * Service responde 401 sin consumir intentos.\n *\n * El `producto` del login sale SIEMPRE de `configureEvaAuth({ product })`, nunca del llamador: el\n * access token queda emitido para ese producto. `empresaId` (opcional) deja esa empresa activa en\n * la sesión si la persona pertenece a ella.\n *\n * @throws Error de configuración (`EvaAuthConfigError`) si falta `configureEvaAuth({ product })`.\n */\nconst login = (\n params: {\n phone: string\n code: string\n challengeId: string\n empresaId?: string\n } & DeviceInfo,\n): Promise<Result<{ user: { id: string }; tokens?: TokenPair }>> => {\n const {\n phone,\n code,\n challengeId,\n empresaId,\n deviceType,\n os,\n browser,\n userAgent,\n } = params\n return authFetch(apiPath(AUTH_ROUTES.login), {\n method: 'POST',\n body: {\n phone,\n code,\n challengeId,\n producto: getProduct(),\n ...(empresaId !== undefined && { empresaId }),\n deviceType,\n os,\n browser,\n userAgent,\n },\n })\n}\n\n/**\n * Cambia la empresa activa de la sesión (`null` la deja sin empresa). Auth reemite SOLO el access\n * token (`x-eva-new-access-token`; el refresh no rota): llega en `accessToken`. Auth valida la\n * pertenencia; si la persona no pertenece, responde error.\n */\nconst setActiveEmpresa = (params: {\n accessToken: string\n empresaId: string | null\n}): Promise<Result<{ empresaId: string | null; accessToken?: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.setActiveEmpresa), {\n method: 'POST',\n accessToken: params.accessToken,\n body: { empresaId: params.empresaId },\n reissuesAccessTokenOnly: true,\n })\n\nconst refresh = (params: {\n refreshToken: string\n}): Promise<Result<{ user: { id: string }; tokens?: TokenPair }>> =>\n authFetch(apiPath(AUTH_ROUTES.refresh), {\n method: 'POST',\n refreshToken: params.refreshToken,\n })\n\nconst logout = (params: {\n refreshToken: string\n}): Promise<Result<{ message: string }>> =>\n authFetch(apiPath(AUTH_ROUTES.logout), {\n method: 'POST',\n refreshToken: params.refreshToken,\n })\n\nconst getUser = (params: { accessToken: string }): Promise<Result<EvaUser>> =>\n authFetch(apiPath(USER_ROUTES.get), { accessToken: params.accessToken })\n\nconst updateUser = (params: {\n accessToken: string\n data: Record<string, unknown>\n}): Promise<Result<EvaUser>> =>\n authFetch(apiPath(USER_ROUTES.update), {\n method: 'PATCH',\n accessToken: params.accessToken,\n body: params.data,\n })\n\nconst deleteUser = (params: {\n accessToken: string\n}): Promise<Result<{ message: string }>> =>\n authFetch(apiPath(USER_ROUTES.deactivate), {\n method: 'DELETE',\n accessToken: params.accessToken,\n })\n\nconst getUserEmpresas = (params: {\n accessToken: string\n}): Promise<Result<EvaEmpresa[]>> =>\n authFetch(apiPath(USER_ROUTES.listCompanies), {\n accessToken: params.accessToken,\n })\n\n/**\n * Busca en el directorio de empresas (solo las activas que optaron por aparecer; solo campos de\n * perfil público; 50 por página). Basta el access token de usuario de CUALQUIER producto habilitado:\n * Auth limita los pedidos por usuario. La siguiente página se pide con el `nextCursor` recibido.\n */\nconst getDirectorio = (\n params: { accessToken: string } & DirectorioQuery,\n): Promise<Result<DirectorioResponse['data']>> => {\n const { accessToken, ...filters } = params\n const query = new URLSearchParams()\n for (const [key, value] of Object.entries(filters)) {\n if (value !== undefined) query.set(key, String(value))\n }\n const qs = query.toString()\n return authFetch(\n `${apiPath(DIRECTORIO_ROUTES.search)}${qs === '' ? '' : `?${qs}`}`,\n { accessToken },\n )\n}\n\nconst getSessions = (params: {\n accessToken: string\n}): Promise<Result<EvaSession[]>> =>\n authFetch(apiPath(SESSION_ROUTES.list), { accessToken: params.accessToken })\n\nconst deleteSession = (params: {\n accessToken: string\n sessionId: string\n}): Promise<Result<{ message: string }>> => {\n if (!/^[\\w-]+$/.test(params.sessionId)) {\n return Promise.resolve({\n ok: false,\n error: {\n kind: 'sdk',\n reason: 'malformed',\n message: 'ID de sesión inválido',\n status: 400,\n },\n })\n }\n return authFetch(\n apiPath(SESSION_ROUTES.deleteOne, { id: params.sessionId }),\n {\n method: 'DELETE',\n accessToken: params.accessToken,\n },\n )\n}\n\nconst deleteAllSessions = (params: {\n refreshToken: string\n}): Promise<Result<{ message: string; count: number }>> =>\n authFetch(apiPath(SESSION_ROUTES.deleteAll), {\n method: 'DELETE',\n refreshToken: params.refreshToken,\n })\n\n// Every other route is built with `apiPath` (`API_PREFIX + path`); health is an operational probe\n// that the API serves at the root, outside the versioned prefix.\nconst health = (): Promise<Result<{ status: string }>> => authFetch('/health')\n\nexport function createHttpClient() {\n return {\n getCode,\n login,\n setActiveEmpresa,\n refresh,\n logout,\n getUser,\n updateUser,\n deleteUser,\n getUserEmpresas,\n getDirectorio,\n getSessions,\n deleteSession,\n deleteAllSessions,\n health,\n }\n}\n\nexport type EvaHttpClient = ReturnType<typeof createHttpClient>\n"],"mappings":"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"}
|