@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,206 @@
1
+ import { a as HEADERS } from "./constants-rNuD5qJn.js";
2
+ import { d as SESSION_ROUTES, f as USER_ROUTES, i as DIRECTORIO_ROUTES, r as AUTH_ROUTES } from "./routes-F1g5aVqP.js";
3
+ import { t as apiPath } from "./api-path-B-vSkL2H.js";
4
+ import { c as isEvaAuthConfigError, s as getProduct, t as parseErrorResponse } from "./parse-error-response-BM9-kjs0.js";
5
+ import { r as getAuthServiceUrl } from "./constants-BY7QZokc.js";
6
+ import { z } from "zod";
7
+ // src/http-client.ts
8
+ const AuthServiceResponseSchema = z.object({ data: z.unknown() });
9
+ const AUTH_SERVICE_TIMEOUT = 1e4;
10
+ const extractTokens = (headers) => {
11
+ const accessToken = headers.get(HEADERS.NEW_ACCESS_TOKEN);
12
+ const refreshToken = headers.get(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[HEADERS.AUTHORIZATION] = `Bearer ${accessToken}`;
23
+ if (refreshToken) headers[HEADERS.REFRESH_TOKEN] = refreshToken;
24
+ try {
25
+ const res = await fetch(`${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: 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(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 (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(apiPath(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(apiPath(AUTH_ROUTES.login), {
109
+ method: "POST",
110
+ body: {
111
+ phone,
112
+ code,
113
+ challengeId,
114
+ producto: 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(apiPath(AUTH_ROUTES.setActiveEmpresa), {
129
+ method: "POST",
130
+ accessToken: params.accessToken,
131
+ body: { empresaId: params.empresaId },
132
+ reissuesAccessTokenOnly: true
133
+ });
134
+ const refresh = (params) => authFetch(apiPath(AUTH_ROUTES.refresh), {
135
+ method: "POST",
136
+ refreshToken: params.refreshToken
137
+ });
138
+ const logout = (params) => authFetch(apiPath(AUTH_ROUTES.logout), {
139
+ method: "POST",
140
+ refreshToken: params.refreshToken
141
+ });
142
+ const getUser = (params) => authFetch(apiPath(USER_ROUTES.get), { accessToken: params.accessToken });
143
+ const updateUser = (params) => authFetch(apiPath(USER_ROUTES.update), {
144
+ method: "PATCH",
145
+ accessToken: params.accessToken,
146
+ body: params.data
147
+ });
148
+ const deleteUser = (params) => authFetch(apiPath(USER_ROUTES.deactivate), {
149
+ method: "DELETE",
150
+ accessToken: params.accessToken
151
+ });
152
+ const getUserEmpresas = (params) => authFetch(apiPath(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(`${apiPath(DIRECTORIO_ROUTES.search)}${qs === "" ? "" : `?${qs}`}`, { accessToken });
164
+ };
165
+ const getSessions = (params) => authFetch(apiPath(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(apiPath(SESSION_ROUTES.deleteOne, { id: params.sessionId }), {
177
+ method: "DELETE",
178
+ accessToken: params.accessToken
179
+ });
180
+ };
181
+ const deleteAllSessions = (params) => authFetch(apiPath(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
+ export { createHttpClient as t };
205
+
206
+ //# sourceMappingURL=http-client-Da0-OMfc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client-Da0-OMfc.js","names":[],"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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"}
@@ -0,0 +1,240 @@
1
+ import { d as Result } from "./types-CEABh1Zf.js";
2
+ import { Bn as UpdateServiceClientResponse, Ct as UpdateProductoRequest, D as SetProductoPermisosAutorizablesRequest, E as ProductoPermisosAutorizablesResponse, Fn as ServiceClientGrant$1, Ht as ReassignTitularRequest, In as ServiceClientPublic$1, Ln as SetServiceClientGrantRequest, On as CreateServiceClientRequest, Pn as RotateServiceClientSecretResponse, Pt as EmpresaEstadoResponse, St as ProductoResponse, Ut as ReassignTitularResponse, bt as ListProductosResponse, ct as SetContratacionRequest, f as ListServiceClientDelegationsResponse, gi as ACCOUNT_STATES, jn as ListServiceClientGrantsResponse, kn as CreateServiceClientResponse, m as SetServiceClientDelegationRequest, nr as MaintenanceCleanupResponse, ot as ContratacionResponse, p as ServiceClientDelegation$1, ur as RepublishPendingResponse, yt as CreateProductoRequest, zn as UpdateServiceClientRequest } from "./index-CZru7c5T.js";
3
+ /** Unión de literales de todos los estados de cuenta posibles. */
4
+ type AccountState = (typeof ACCOUNT_STATES)[keyof typeof ACCOUNT_STATES];
5
+ /**
6
+ * Configuración del cliente Admin: las credenciales de un service client con la marca `esAdmin`.
7
+ * Cada request se firma con HMAC S2S; el secret nunca viaja.
8
+ */
9
+ type AdminClientConfig = {
10
+ /** Slug del service client con la marca `esAdmin` (clientId). */
11
+ clientId: string;
12
+ /** Secret del service client admin en hex (64 chars), el que devuelve su creación o rotación. */
13
+ secretHex: string;
14
+ /**
15
+ * URL base del Auth Service API (sin trailing slash).
16
+ * Validada en `createAdminClient`: se requiere https (o http con host loopback para tests).
17
+ */
18
+ baseUrl: string;
19
+ };
20
+ /**
21
+ * Service client público (sin el plaintext del secret).
22
+ * Shape del wire en GET /admin/service-clients/*.
23
+ * Las fechas vienen serializadas como ISO strings en el wire.
24
+ */
25
+ type ServiceClientPublic = ServiceClientPublic$1;
26
+ /**
27
+ * Input para crear un nuevo service client (alias del request del contrato). Nace sin
28
+ * concesiones: se asignan con `setServiceClientGrant`. `auth-service` es un slug reservado.
29
+ */
30
+ type CreateServiceClientInput = CreateServiceClientRequest;
31
+ /** Input para crear un producto (alias del request del contrato). `enabled` por defecto es `true`. */
32
+ type CreateProductoInput = CreateProductoRequest;
33
+ /** Input para actualizar un producto (patch parcial; alias del request del contrato). */
34
+ type UpdateProductoInput = UpdateProductoRequest;
35
+ /** Resultado de `listProductos`: `{ productos }`. */
36
+ type ListProductosResult = ListProductosResponse['data'];
37
+ /** Resultado de crear o actualizar un producto: `{ producto }`. */
38
+ type ProductoResult = ProductoResponse['data'];
39
+ /** Concesión de un service client sobre una audiencia: los permisos que puede pedir en su token. */
40
+ type ServiceClientGrant = ServiceClientGrant$1;
41
+ /**
42
+ * Input de `setServiceClientGrant`: audiencia y permisos del catálogo de `auth-contracts`.
43
+ * Un permiso que no es de esa audiencia (p. ej. `admin` en `auth-api`) no compila y el API lo rechaza.
44
+ */
45
+ type SetServiceClientGrantInput = SetServiceClientGrantRequest;
46
+ /** Resultado de `listServiceClientGrants`. */
47
+ type ListServiceClientGrantsResult = ListServiceClientGrantsResponse['data'];
48
+ /**
49
+ * Resultado de crear un service client.
50
+ * El `secret` solo se devuelve UNA VEZ — guardarlo de inmediato.
51
+ */
52
+ type CreateServiceClientResult = CreateServiceClientResponse['data'];
53
+ /**
54
+ * Input para actualizar un service client (patch parcial; alias del request del contrato).
55
+ * Al menos un campo debe estar presente.
56
+ */
57
+ type UpdateServiceClientInput = UpdateServiceClientRequest;
58
+ /**
59
+ * Resultado de actualizar un service client.
60
+ */
61
+ type UpdateServiceClientResult = UpdateServiceClientResponse['data'];
62
+ /**
63
+ * Resultado de rotar el secret de un service client.
64
+ * El `secret` nuevo solo se devuelve UNA VEZ.
65
+ */
66
+ type RotateSecretResult = RotateServiceClientSecretResponse['data'];
67
+ /**
68
+ * Resultado de restaurar una cuenta de usuario eliminada.
69
+ * REQ-RESTORE-01 LOCKED.
70
+ *
71
+ * Tipo propio del SDK: `stateAccount` es la unión completa `AccountState`, y en el wire es el único
72
+ * literal `no_verificado`.
73
+ */
74
+ type RestoreUserResult = {
75
+ userId: string;
76
+ /** Estado de la cuenta tras la restauración. */
77
+ stateAccount: AccountState;
78
+ previouslyDeletedAt: string | null;
79
+ restoredAt: string;
80
+ };
81
+ /**
82
+ * Query de `republishPendingWebhooks`. Tipo propio del SDK (como `ListWebhookDeliveriesQuery`):
83
+ * el query del contrato coacciona strings y su tipo de entrada es `unknown`. Los rangos los valida
84
+ * el API (400).
85
+ */
86
+ type RepublishPendingWebhooksQuery = {
87
+ /** Antigüedad mínima en minutos de las entregas `pending` a republicar. Default del API: 10. */
88
+ older_than_minutes?: number;
89
+ /** Máximo de entregas por llamada. Default y tope del API: 100. */
90
+ limit?: number;
91
+ };
92
+ /**
93
+ * Resultado de `republishPendingWebhooks`: cuántas entregas se republicaron y si quedan más
94
+ * (`hasMore`: vuelve a llamar). Un 503 `service_unavailable` indica que QStash no aceptó el lote.
95
+ */
96
+ type RepublishPendingWebhooksResult = RepublishPendingResponse['data'];
97
+ /**
98
+ * Query de `maintenanceCleanup`. Tipo propio del SDK (como {@link RepublishPendingWebhooksQuery}):
99
+ * el rango lo valida el API (400).
100
+ */
101
+ type MaintenanceCleanupQuery = {
102
+ /** Máximo por lote en cada una de las dos limpiezas. Default y tope del API: 100. */
103
+ limit?: number;
104
+ };
105
+ /**
106
+ * Resultado de `maintenanceCleanup`: cuentas `eliminado` purgadas (ventana de restauración vencida),
107
+ * `webhook_events` sin entregas vivas borrados (fuera de la retención) y si queda más (`hasMore`:
108
+ * vuelve a llamar).
109
+ */
110
+ type MaintenanceCleanupResult = MaintenanceCleanupResponse['data'];
111
+ /**
112
+ * Arista de delegación de un service client: puede intercambiar tokens hacia `audience` con, como
113
+ * máximo, `scopes`; `requiere_scope_origen` vacío = no admite re-exchange.
114
+ */
115
+ type ServiceClientDelegation = ServiceClientDelegation$1;
116
+ /**
117
+ * Input de `setServiceClientDelegation`: audiencia delegable y permisos delegables del catálogo
118
+ * (`auth-api` y `admin` no compilan y el API los rechaza). `requiere_scope_origen` es opcional.
119
+ */
120
+ type SetServiceClientDelegationInput = SetServiceClientDelegationRequest;
121
+ /** Resultado de `listServiceClientDelegations`. */
122
+ type ListServiceClientDelegationsResult = ListServiceClientDelegationsResponse['data'];
123
+ /** Input de `setProductoPermisosAutorizables`: la lista COMPLETA de permisos entre empresas (vacía = ninguno). */
124
+ type SetProductoPermisosAutorizablesInput = SetProductoPermisosAutorizablesRequest;
125
+ /** Permisos entre empresas que un producto puede conceder: `{ producto, permisos }`. */
126
+ type ProductoPermisosAutorizablesResult = ProductoPermisosAutorizablesResponse['data'];
127
+ /**
128
+ * Input de `reassignEmpresaTitular`: la persona que pasa a titular y qué pasa con el titular
129
+ * anterior (`'miembro'` por defecto, o `'fuera'`).
130
+ */
131
+ type ReassignEmpresaTitularInput = ReassignTitularRequest;
132
+ /** Resultado de la reasignación de titular. */
133
+ type ReassignEmpresaTitularResult = ReassignTitularResponse['data'];
134
+ /** Estado de la empresa tras `bajaEmpresa` / `reactivarEmpresa`. */
135
+ type AdminEmpresaEstadoResult = EmpresaEstadoResponse['data'];
136
+ /** Input de `setContratacion`: estado (`prueba`, `activo`, `suspendido`, `cancelado`) y vencimiento. */
137
+ type AdminSetContratacionInput = SetContratacionRequest;
138
+ /** Contratación de un producto tras escribirla. */
139
+ type AdminContratacionResult = ContratacionResponse['data'];
140
+ /**
141
+ * Tipo del cliente Admin retornado por `createAdminClient`.
142
+ */
143
+ type AdminClient = {
144
+ createServiceClient(input: CreateServiceClientInput): Promise<Result<CreateServiceClientResult>>;
145
+ listServiceClients(): Promise<Result<{
146
+ clientes: ServiceClientPublic[];
147
+ }>>;
148
+ getServiceClient(slug: string): Promise<Result<{
149
+ cliente: ServiceClientPublic;
150
+ }>>;
151
+ updateServiceClient(slug: string, input: UpdateServiceClientInput): Promise<Result<UpdateServiceClientResult>>;
152
+ deleteServiceClient(slug: string): Promise<Result<void>>;
153
+ rotateServiceClientSecret(slug: string): Promise<Result<RotateSecretResult>>;
154
+ listServiceClientGrants(slug: string): Promise<Result<ListServiceClientGrantsResult>>;
155
+ /** Crea o reemplaza la concesión del client sobre una audiencia. */
156
+ setServiceClientGrant(slug: string, input: SetServiceClientGrantInput): Promise<Result<{
157
+ grant: ServiceClientGrant;
158
+ }>>;
159
+ deleteServiceClientGrant(slug: string, audience: string): Promise<Result<void>>;
160
+ /** Lista las aristas de delegación del client (token exchange). */
161
+ listServiceClientDelegations(slug: string): Promise<Result<ListServiceClientDelegationsResult>>;
162
+ /** Crea o reemplaza la arista del client hacia una audiencia delegable (`scopes`, `requiere_scope_origen`). */
163
+ setServiceClientDelegation(slug: string, input: SetServiceClientDelegationInput): Promise<Result<{
164
+ delegation: ServiceClientDelegation;
165
+ }>>;
166
+ deleteServiceClientDelegation(slug: string, audience: string): Promise<Result<void>>;
167
+ /** Permisos entre empresas que el producto puede conceder en nombre de sus empresas. */
168
+ getProductoPermisosAutorizables(slug: string): Promise<Result<ProductoPermisosAutorizablesResult>>;
169
+ /** Reemplaza la lista de permisos autorizables del producto (vacía = ninguno). */
170
+ setProductoPermisosAutorizables(slug: string, input: SetProductoPermisosAutorizablesInput): Promise<Result<ProductoPermisosAutorizablesResult>>;
171
+ /** Reasigna el titular de una empresa (disputa de RUC o empresa sin titular). */
172
+ reassignEmpresaTitular(empresaId: string, input: ReassignEmpresaTitularInput): Promise<Result<ReassignEmpresaTitularResult>>;
173
+ /** Da de baja una empresa (limpia sus sesiones activas; las autorizaciones y contrataciones dejan de valer). */
174
+ bajaEmpresa(empresaId: string): Promise<Result<AdminEmpresaEstadoResult>>;
175
+ /** Reactiva una empresa de baja. */
176
+ reactivarEmpresa(empresaId: string): Promise<Result<AdminEmpresaEstadoResult>>;
177
+ /** Escribe el estado y el vencimiento de la contratación de un producto por una empresa (hasta que exista facturación, así se activa a mano). */
178
+ setContratacion(empresaId: string, producto: string, input: AdminSetContratacionInput): Promise<Result<AdminContratacionResult>>;
179
+ /** Lista los productos (la audiencia del access token de usuario). */
180
+ listProductos(): Promise<Result<ListProductosResult>>;
181
+ /** Crea un producto (201). 409 si el slug existe; 400 si es una audiencia de servicio. */
182
+ createProducto(input: CreateProductoInput): Promise<Result<ProductoResult>>;
183
+ /** Actualiza `nombre` o `enabled`. 404 si no existe; 400 con body vacío. No hay delete: se deshabilita. */
184
+ updateProducto(slug: string, input: UpdateProductoInput): Promise<Result<ProductoResult>>;
185
+ restoreUser(userId: string): Promise<Result<RestoreUserResult>>;
186
+ republishPendingWebhooks(query?: RepublishPendingWebhooksQuery): Promise<Result<RepublishPendingWebhooksResult>>;
187
+ maintenanceCleanup(query?: MaintenanceCleanupQuery): Promise<Result<MaintenanceCleanupResult>>;
188
+ };
189
+ /**
190
+ * Crea un cliente Admin para provisioning del Auth Service.
191
+ *
192
+ * ADVERTENCIA: solo usar desde backends o herramientas de operador seguras — el secret del
193
+ * service client admin nunca debe exponerse en el cliente/browser.
194
+ *
195
+ * @example
196
+ * ```ts
197
+ * const admin = createAdminClient({
198
+ * clientId: process.env.AUTH_ADMIN_SLUG,
199
+ * secretHex: process.env.AUTH_ADMIN_SECRET,
200
+ * baseUrl: 'https://auth.miapp.com',
201
+ * })
202
+ * const result = await admin.createServiceClient({ slug: 'mi-servicio' })
203
+ * if (!result.ok) return handleError(result.error)
204
+ * console.log('Secret (guardar ahora):', result.data.secret)
205
+ * ```
206
+ */
207
+ declare function createAdminClient(config: AdminClientConfig): AdminClient;
208
+ /**
209
+ * Códigos de error específicos del módulo Admin.
210
+ *
211
+ * Complementan a `ERROR_CODES` (core) para errores que solo ocurren
212
+ * en operaciones de provisioning de service clients.
213
+ *
214
+ * @example
215
+ * ```ts
216
+ * import { ADMIN_ERROR_CODES } from '@eva_solutions/auth-sdk/admin'
217
+ *
218
+ * if (!result.ok && result.error.code === ADMIN_ERROR_CODES.service_client_already_exists) {
219
+ * return res.status(409).json({ error: 'El service client ya existe' })
220
+ * }
221
+ * ```
222
+ */
223
+ declare const ADMIN_ERROR_CODES: {
224
+ readonly service_client_already_exists: "service_client_already_exists";
225
+ readonly service_client_not_found: "service_client_not_found";
226
+ /**
227
+ * `rotate-secret` perdió contra otra rotación concurrente del mismo service client (409).
228
+ * El perdedor no recibe secret; es reintentable.
229
+ */
230
+ readonly service_client_secret_rotation_conflict: "service_client_secret_rotation_conflict";
231
+ /**
232
+ * La operación dejaría al sistema sin ningún service client admin habilitado (409): borrar,
233
+ * deshabilitar o quitarle `esAdmin` al último. No se aplica; habilita o crea otro admin.
234
+ */
235
+ readonly last_admin_client: "last_admin_client";
236
+ };
237
+ /** Unión de literales de los error codes específicos del módulo Admin. */
238
+ type AdminErrorCode = (typeof ADMIN_ERROR_CODES)[keyof typeof ADMIN_ERROR_CODES];
239
+ export { SetServiceClientGrantInput as A, RestoreUserResult as C, ServiceClientPublic as D, ServiceClientGrant as E, UpdateServiceClientInput as M, UpdateServiceClientResult as N, SetProductoPermisosAutorizablesInput as O, AccountState as P, RepublishPendingWebhooksResult as S, ServiceClientDelegation as T, ProductoPermisosAutorizablesResult as _, AdminClientConfig as a, ReassignEmpresaTitularResult as b, AdminSetContratacionInput as c, CreateServiceClientResult as d, ListProductosResult as f, MaintenanceCleanupResult as g, MaintenanceCleanupQuery as h, createAdminClient as i, UpdateProductoInput as j, SetServiceClientDelegationInput as k, CreateProductoInput as l, ListServiceClientGrantsResult as m, AdminErrorCode as n, AdminContratacionResult as o, ListServiceClientDelegationsResult as p, AdminClient as r, AdminEmpresaEstadoResult as s, ADMIN_ERROR_CODES as t, CreateServiceClientInput as u, ProductoResult as v, RotateSecretResult as w, RepublishPendingWebhooksQuery as x, ReassignEmpresaTitularInput as y };
240
+ //# sourceMappingURL=index-CIH_2t7Y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CIH_2t7Y.d.ts","names":["ContractServiceClientPublic","ContractServiceClientGrant","ContractServiceClientDelegation"],"sources":["../src/account-states.ts","../src/admin/types.ts","../src/admin/client.ts","../src/admin/error-codes.ts"],"mappings":";;;KAuBY,uBAAuB,6BAA6B;;;;;KCgBpD;;EAEV;;EAEA;;;;;EAKA;;;;;;;KAQU,sBAAsBA;;;;;KAMtB,2BAA2B;;KAG3B,sBAAsB;;KAGtB,sBAAsB;;KAGtB,sBAAsB;;KAGtB,iBAAiB;;KAGjB,qBAAqBC;;;;;KAMrB,6BAA6B;;KAG7B,gCACV;;;;;KAMU,4BAA4B;;;;;KAM5B,2BAA2B;;;;KAK3B,4BAA4B;;;;;KAM5B,qBAAqB;;;;;;;;KASrB;EACV;;EAEA,cAAc;EACd;EACA;;;;;;;KAQU;;EAEV;;EAEA;;;;;;KAOU,iCAAiC;;;;;KAMjC;;EAEV;;;;;;;KAQU,2BAA2B;;;;;KAM3B,0BAA0BC;;;;;KAM1B,kCAAkC;;KAGlC,qCACV;;KAGU,uCACV;;KAGU,qCACV;;;;;KAMU,8BAA8B;;KAG9B,+BAA+B;;KAG/B,2BAA2B;;KAG3B,4BAA4B;;KAG5B,0BAA0B;;;;KClH1B;EACV,oBACE,OAAO,2BACN,QAAQ,OAAO;EAClB,sBAAsB,QAAQ;IAAS,UAAU;;EACjD,iBACE,eACC,QAAQ;IAAS,SAAS;;EAC7B,oBACE,cACA,OAAO,2BACN,QAAQ,OAAO;EAClB,oBAAoB,eAAe,QAAQ;EAC3C,0BAA0B,eAAe,QAAQ,OAAO;EACxD,wBACE,eACC,QAAQ,OAAO;;EAElB,sBACE,cACA,OAAO,6BACN,QAAQ;IAAS,OAAO;;EAC3B,yBACE,cACA,mBACC,QAAQ;;EAEX,6BACE,eACC,QAAQ,OAAO;;EAElB,2BACE,cACA,OAAO,kCACN,QAAQ;IAAS,YAAY;;EAChC,8BACE,cACA,mBACC,QAAQ;;EAEX,gCACE,eACC,QAAQ,OAAO;;EAElB,gCACE,cACA,OAAO,uCACN,QAAQ,OAAO;;EAElB,uBACE,mBACA,OAAO,8BACN,QAAQ,OAAO;;EAElB,YAAY,oBAAoB,QAAQ,OAAO;;EAE/C,iBAAiB,oBAAoB,QAAQ,OAAO;;EAEpD,gBACE,mBACA,kBACA,OAAO,4BACN,QAAQ,OAAO;;EAElB,iBAAiB,QAAQ,OAAO;;EAEhC,eAAe,OAAO,sBAAsB,QAAQ,OAAO;;EAE3D,eACE,cACA,OAAO,sBACN,QAAQ,OAAO;EAClB,YAAY,iBAAiB,QAAQ,OAAO;EAC5C,yBACE,QAAQ,gCACP,QAAQ,OAAO;EAClB,mBACE,QAAQ,0BACP,QAAQ,OAAO;;;;;;;;;;;;;;;;;;;;iBA0HJ,kBAAkB,QAAQ,oBAAoB;;;;;;;;;;;;;;;;cChRjD;;;;;;;;;;;;;;;KAiBD,yBACF,gCAAgC"}