@zentto/platform-client 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +89 -2
  2. package/dist/auth/client.d.ts +132 -0
  3. package/dist/auth/client.d.ts.map +1 -0
  4. package/dist/auth/client.js +157 -0
  5. package/dist/auth/client.js.map +1 -0
  6. package/dist/auth/index.d.ts +2 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +2 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/cache/client.d.ts +113 -0
  11. package/dist/cache/client.d.ts.map +1 -0
  12. package/dist/cache/client.js +87 -0
  13. package/dist/cache/client.js.map +1 -0
  14. package/dist/cache/index.d.ts +2 -0
  15. package/dist/cache/index.d.ts.map +1 -0
  16. package/dist/cache/index.js +2 -0
  17. package/dist/cache/index.js.map +1 -0
  18. package/dist/events/client.d.ts +94 -0
  19. package/dist/events/client.d.ts.map +1 -0
  20. package/dist/events/client.js +208 -0
  21. package/dist/events/client.js.map +1 -0
  22. package/dist/events/envelope.d.ts +28 -0
  23. package/dist/events/envelope.d.ts.map +1 -0
  24. package/dist/events/envelope.js +38 -0
  25. package/dist/events/envelope.js.map +1 -0
  26. package/dist/events/index.d.ts +3 -0
  27. package/dist/events/index.d.ts.map +1 -0
  28. package/dist/events/index.js +3 -0
  29. package/dist/events/index.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +9 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/internal/circuit.d.ts +33 -0
  35. package/dist/internal/circuit.d.ts.map +1 -0
  36. package/dist/internal/circuit.js +73 -0
  37. package/dist/internal/circuit.js.map +1 -0
  38. package/dist/internal/errors.d.ts +57 -0
  39. package/dist/internal/errors.d.ts.map +1 -0
  40. package/dist/internal/errors.js +96 -0
  41. package/dist/internal/errors.js.map +1 -0
  42. package/dist/internal/http.d.ts +59 -0
  43. package/dist/internal/http.d.ts.map +1 -0
  44. package/dist/internal/http.js +95 -0
  45. package/dist/internal/http.js.map +1 -0
  46. package/dist/landing/client.d.ts +50 -0
  47. package/dist/landing/client.d.ts.map +1 -0
  48. package/dist/landing/client.js +46 -0
  49. package/dist/landing/client.js.map +1 -0
  50. package/dist/landing/index.d.ts +2 -0
  51. package/dist/landing/index.d.ts.map +1 -0
  52. package/dist/landing/index.js +2 -0
  53. package/dist/landing/index.js.map +1 -0
  54. package/package.json +27 -2
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Jerarquía de errores tipados del SDK.
3
+ *
4
+ * El SDK NO lanza por default (mantiene shape best-effort `{ ok, error }`).
5
+ * Estos errores se usan:
6
+ * a) En `result.errorInstance` para callers que quieran `instanceof`.
7
+ * b) Opcionalmente en modo `throwOnError: true` (futuro).
8
+ *
9
+ * La jerarquía permite reaccionar fino:
10
+ * if (err instanceof RateLimitedError) backoff();
11
+ * if (err instanceof AuthError) redirectToLogin();
12
+ */
13
+ export class PlatformError extends Error {
14
+ status;
15
+ path;
16
+ attempt;
17
+ constructor(message, opts) {
18
+ super(message);
19
+ this.name = "PlatformError";
20
+ this.status = opts?.status;
21
+ this.path = opts?.path;
22
+ this.attempt = opts?.attempt;
23
+ if (opts?.cause !== undefined)
24
+ this.cause = opts.cause;
25
+ }
26
+ }
27
+ /** 4xx 401/403 — token inválido/expirado, scope faltante. */
28
+ export class AuthError extends PlatformError {
29
+ constructor(message, opts) {
30
+ super(message, opts);
31
+ this.name = "AuthError";
32
+ }
33
+ }
34
+ /** 4xx 400/422 — body mal formado, campos faltantes. */
35
+ export class ValidationError extends PlatformError {
36
+ constructor(message, opts) {
37
+ super(message, opts);
38
+ this.name = "ValidationError";
39
+ }
40
+ }
41
+ /** 4xx 404 — recurso no existe. */
42
+ export class NotFoundError extends PlatformError {
43
+ constructor(message, opts) {
44
+ super(message, opts);
45
+ this.name = "NotFoundError";
46
+ }
47
+ }
48
+ /** 4xx 429 — rate limited upstream. */
49
+ export class RateLimitedError extends PlatformError {
50
+ retryAfterSec;
51
+ constructor(message, opts) {
52
+ super(message, opts);
53
+ this.name = "RateLimitedError";
54
+ this.retryAfterSec = opts?.retryAfterSec;
55
+ }
56
+ }
57
+ /** 5xx — error del servicio upstream. Normalmente reintentable. */
58
+ export class ServiceError extends PlatformError {
59
+ constructor(message, opts) {
60
+ super(message, opts);
61
+ this.name = "ServiceError";
62
+ }
63
+ }
64
+ /** Errores de red (timeout, DNS, connection reset). Reintentables. */
65
+ export class NetworkError extends PlatformError {
66
+ constructor(message, opts) {
67
+ super(message, opts);
68
+ this.name = "NetworkError";
69
+ }
70
+ }
71
+ /** Circuit breaker abierto — upstream fallando demasiado. */
72
+ export class CircuitOpenError extends PlatformError {
73
+ constructor(message, opts) {
74
+ super(message, opts);
75
+ this.name = "CircuitOpenError";
76
+ }
77
+ }
78
+ /** Mapea HTTP status + contexto a un error tipado. */
79
+ export function mapHttpError(status, body, path, attempt) {
80
+ const msg = body.error ?? body.message ?? (status ? `HTTP ${status}` : "unknown error");
81
+ const opts = { status, path, attempt };
82
+ if (status === 401 || status === 403)
83
+ return new AuthError(msg, opts);
84
+ if (status === 404)
85
+ return new NotFoundError(msg, opts);
86
+ if (status === 429) {
87
+ const retryAfterSec = typeof body.retryAfter === "number" ? body.retryAfter : undefined;
88
+ return new RateLimitedError(msg, { ...opts, retryAfterSec });
89
+ }
90
+ if (status && status >= 400 && status < 500)
91
+ return new ValidationError(msg, opts);
92
+ if (status && status >= 500)
93
+ return new ServiceError(msg, opts);
94
+ return new NetworkError(msg, opts);
95
+ }
96
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,MAAM,CAAU;IAChB,IAAI,CAAU;IACd,OAAO,CAAU;IAE1B,YAAY,OAAe,EAAE,IAA4E;QACvG,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC7B,IAAI,IAAI,EAAE,KAAK,KAAK,SAAS;YAAG,IAAY,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAClE,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,SAAU,SAAQ,aAAa;IAC1C,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,mCAAmC;AACnC,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,uCAAuC;AACvC,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IACxC,aAAa,CAAU;IAChC,YAAY,OAAe,EAAE,IAAkF;QAC7G,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,aAAa,CAAC;IAC3C,CAAC;CACF;AAED,mEAAmE;AACnE,MAAM,OAAO,YAAa,SAAQ,aAAa;IAC7C,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,sEAAsE;AACtE,MAAM,OAAO,YAAa,SAAQ,aAAa;IAC7C,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IACjD,YAAY,OAAe,EAAE,IAAqD;QAChF,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,sDAAsD;AACtD,MAAM,UAAU,YAAY,CAAC,MAA0B,EAAE,IAA6B,EAAE,IAAY,EAAE,OAAe;IACnH,MAAM,GAAG,GAAI,IAAI,CAAC,KAAgB,IAAK,IAAI,CAAC,OAAkB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IAChH,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACvC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtE,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,OAAO,IAAI,gBAAgB,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,IAAI,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnF,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChE,OAAO,IAAI,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * HTTP helper compartido entre submódulos.
3
+ *
4
+ * Features:
5
+ * - Retries con backoff exponencial ante errores de red o 5xx.
6
+ * - Sin retry en 4xx (es error del caller).
7
+ * - Timeout por request.
8
+ * - Circuit breaker por (baseUrl): evita cascade cuando upstream cae.
9
+ * - Errores tipados (AuthError, RateLimitedError, ServiceError, etc.) en `errorInstance`.
10
+ * - Hook `beforeRetry` (ej. AuthClient lo usa para auto-refresh del JWT).
11
+ * - No lanza: siempre retorna Result<T> (ok/error).
12
+ */
13
+ import { CircuitBreaker, type CircuitOptions } from "./circuit.js";
14
+ import { type PlatformError } from "./errors.js";
15
+ export interface HttpConfig {
16
+ baseUrl: string;
17
+ timeoutMs: number;
18
+ retries: number;
19
+ onError: (err: Error, ctx: {
20
+ path: string;
21
+ attempt: number;
22
+ }) => void;
23
+ /** Opcional: permite al AuthClient interceptar 401 para refresh + retry. */
24
+ beforeRetry?: (err: PlatformError, ctx: {
25
+ path: string;
26
+ attempt: number;
27
+ }) => Promise<{
28
+ retry: boolean;
29
+ headers?: Record<string, string>;
30
+ }>;
31
+ /** Circuit breaker compartido entre requests del mismo cliente. */
32
+ breaker: CircuitBreaker;
33
+ }
34
+ export interface HttpResult<T = unknown> {
35
+ ok: boolean;
36
+ status?: number;
37
+ data?: T;
38
+ error?: string;
39
+ errorInstance?: PlatformError;
40
+ }
41
+ export interface RequestOptions {
42
+ method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
43
+ path: string;
44
+ body?: object;
45
+ headers?: Record<string, string>;
46
+ query?: Record<string, string | number | undefined | null>;
47
+ credentials?: "include" | "omit";
48
+ }
49
+ export declare function httpRequest<T = unknown>(cfg: HttpConfig, opts: RequestOptions): Promise<HttpResult<T>>;
50
+ export interface HttpConfigInput {
51
+ baseUrl: string;
52
+ timeoutMs?: number;
53
+ retries?: number;
54
+ onError?: HttpConfig["onError"];
55
+ circuit?: CircuitOptions;
56
+ beforeRetry?: HttpConfig["beforeRetry"];
57
+ }
58
+ export declare function defaultHttpConfig(overrides: HttpConfigInput): HttpConfig;
59
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,4EAA4E;IAC5E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAC5I,mEAAmE;IACnE,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAClC;AAcD,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CA+DxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;CACzC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,UAAU,CASxE"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * HTTP helper compartido entre submódulos.
3
+ *
4
+ * Features:
5
+ * - Retries con backoff exponencial ante errores de red o 5xx.
6
+ * - Sin retry en 4xx (es error del caller).
7
+ * - Timeout por request.
8
+ * - Circuit breaker por (baseUrl): evita cascade cuando upstream cae.
9
+ * - Errores tipados (AuthError, RateLimitedError, ServiceError, etc.) en `errorInstance`.
10
+ * - Hook `beforeRetry` (ej. AuthClient lo usa para auto-refresh del JWT).
11
+ * - No lanza: siempre retorna Result<T> (ok/error).
12
+ */
13
+ import { CircuitBreaker } from "./circuit.js";
14
+ import { CircuitOpenError, NetworkError, mapHttpError } from "./errors.js";
15
+ function buildUrl(baseUrl, path, query) {
16
+ const url = `${baseUrl.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
17
+ if (!query)
18
+ return url;
19
+ const params = new URLSearchParams();
20
+ for (const [k, v] of Object.entries(query)) {
21
+ if (v === undefined || v === null)
22
+ continue;
23
+ params.set(k, String(v));
24
+ }
25
+ const qs = params.toString();
26
+ return qs ? `${url}?${qs}` : url;
27
+ }
28
+ export async function httpRequest(cfg, opts) {
29
+ const url = buildUrl(cfg.baseUrl, opts.path, opts.query);
30
+ const breakerKey = cfg.baseUrl;
31
+ if (!cfg.breaker.allow(breakerKey)) {
32
+ const err = new CircuitOpenError(`Circuit open for ${cfg.baseUrl}`, { path: opts.path, attempt: 0 });
33
+ cfg.onError(err, { path: opts.path, attempt: 0 });
34
+ return { ok: false, error: err.message, errorInstance: err };
35
+ }
36
+ let headers = { "Content-Type": "application/json", ...opts.headers };
37
+ let lastErr;
38
+ for (let attempt = 0; attempt <= cfg.retries; attempt++) {
39
+ try {
40
+ const res = await fetch(url, {
41
+ method: opts.method,
42
+ headers,
43
+ body: opts.body ? JSON.stringify(opts.body) : undefined,
44
+ credentials: opts.credentials,
45
+ signal: AbortSignal.timeout(cfg.timeoutMs),
46
+ });
47
+ const json = (await res.json().catch(() => ({})));
48
+ if (res.ok) {
49
+ cfg.breaker.recordSuccess(breakerKey);
50
+ return { ok: true, status: res.status, data: json };
51
+ }
52
+ const err = mapHttpError(res.status, json, opts.path, attempt);
53
+ lastErr = err;
54
+ // 4xx: sin retry por default. Pero beforeRetry puede pedir retry
55
+ // (ej. AuthClient refresca token y reintenta 401 una vez).
56
+ if (res.status >= 400 && res.status < 500) {
57
+ const shouldRetry = cfg.beforeRetry && attempt < cfg.retries
58
+ ? await cfg.beforeRetry(err, { path: opts.path, attempt })
59
+ : { retry: false };
60
+ if (!shouldRetry.retry) {
61
+ // 4xx → NO toca el breaker (es error del caller, no del servicio).
62
+ return { ok: false, status: res.status, error: err.message, errorInstance: err };
63
+ }
64
+ if (shouldRetry.headers)
65
+ headers = { ...headers, ...shouldRetry.headers };
66
+ continue;
67
+ }
68
+ // 5xx → cuenta para el breaker
69
+ cfg.breaker.recordFailure(breakerKey);
70
+ }
71
+ catch (netErr) {
72
+ const err = new NetworkError(netErr.message, { path: opts.path, attempt, cause: netErr });
73
+ lastErr = err;
74
+ cfg.breaker.recordFailure(breakerKey);
75
+ }
76
+ if (attempt < cfg.retries) {
77
+ cfg.onError(lastErr, { path: opts.path, attempt });
78
+ await new Promise((r) => setTimeout(r, 250 * Math.pow(2, attempt)));
79
+ }
80
+ }
81
+ const err = lastErr ?? new NetworkError("unknown error", { path: opts.path, attempt: cfg.retries });
82
+ cfg.onError(err, { path: opts.path, attempt: cfg.retries });
83
+ return { ok: false, error: err.message, errorInstance: err };
84
+ }
85
+ export function defaultHttpConfig(overrides) {
86
+ return {
87
+ baseUrl: overrides.baseUrl,
88
+ timeoutMs: overrides.timeoutMs ?? 10_000,
89
+ retries: Math.max(0, overrides.retries ?? 1),
90
+ onError: overrides.onError ?? (() => { }),
91
+ beforeRetry: overrides.beforeRetry,
92
+ breaker: new CircuitBreaker(overrides.circuit ?? {}),
93
+ };
94
+ }
95
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * LandingClient — cliente tipado para el endpoint público de leads del
3
+ * ERP Zentto (POST https://api.zentto.net/api/landing/register).
4
+ *
5
+ * Útil para sitios externos de tenants clientes (acme.com) que quieren
6
+ * integrar su formulario de contacto sin reescribir fetch a mano. Resuelve
7
+ * el tenant destino vía `X-Tenant-Key` emitido desde el CRM del cliente.
8
+ *
9
+ * Para el landing propio de Zentto (zentto.net), la Pages Function ya
10
+ * llama al ERP directamente — no necesita este cliente.
11
+ */
12
+ import { type HttpConfig, type HttpResult } from "../internal/http.js";
13
+ export interface LandingConfig {
14
+ baseUrl?: string;
15
+ /** Header `X-Tenant-Key` — PublicApiKey emitida desde el CRM del tenant. */
16
+ tenantKey?: string;
17
+ timeoutMs?: number;
18
+ retries?: number;
19
+ onError?: HttpConfig["onError"];
20
+ }
21
+ export interface RegisterLeadParams {
22
+ email: string;
23
+ name: string;
24
+ company?: string;
25
+ country?: string;
26
+ phone?: string;
27
+ source?: string;
28
+ topic?: string;
29
+ message?: string;
30
+ }
31
+ export interface RegisterLeadResponse {
32
+ ok: boolean;
33
+ mensaje?: string;
34
+ targetCompanyId?: number | null;
35
+ zentto_registered?: boolean;
36
+ paddle_customer_id?: string | null;
37
+ }
38
+ export declare class LandingClient {
39
+ private readonly cfg;
40
+ private readonly tenantKey?;
41
+ constructor(opts: LandingConfig);
42
+ registerLead(params: RegisterLeadParams): Promise<HttpResult<RegisterLeadResponse>>;
43
+ }
44
+ /**
45
+ * Factory desde env vars:
46
+ * ZENTTO_API_URL — default https://api.zentto.net
47
+ * ZENTTO_TENANT_KEY — PublicApiKey del tenant (si el caller es externo)
48
+ */
49
+ export declare function landingFromEnv(overrides?: Partial<LandingConfig>): LandingClient;
50
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/landing/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAkC,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvG,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;gBAExB,IAAI,EAAE,aAAa;IAUzB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;CAQ1F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAMhF"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * LandingClient — cliente tipado para el endpoint público de leads del
3
+ * ERP Zentto (POST https://api.zentto.net/api/landing/register).
4
+ *
5
+ * Útil para sitios externos de tenants clientes (acme.com) que quieren
6
+ * integrar su formulario de contacto sin reescribir fetch a mano. Resuelve
7
+ * el tenant destino vía `X-Tenant-Key` emitido desde el CRM del cliente.
8
+ *
9
+ * Para el landing propio de Zentto (zentto.net), la Pages Function ya
10
+ * llama al ERP directamente — no necesita este cliente.
11
+ */
12
+ import { defaultHttpConfig, httpRequest } from "../internal/http.js";
13
+ export class LandingClient {
14
+ cfg;
15
+ tenantKey;
16
+ constructor(opts) {
17
+ this.cfg = defaultHttpConfig({
18
+ baseUrl: opts.baseUrl ?? "https://api.zentto.net",
19
+ timeoutMs: opts.timeoutMs,
20
+ retries: opts.retries,
21
+ onError: opts.onError,
22
+ });
23
+ this.tenantKey = opts.tenantKey;
24
+ }
25
+ async registerLead(params) {
26
+ return httpRequest(this.cfg, {
27
+ method: "POST",
28
+ path: "/api/landing/register",
29
+ body: params,
30
+ headers: this.tenantKey ? { "X-Tenant-Key": this.tenantKey } : undefined,
31
+ });
32
+ }
33
+ }
34
+ /**
35
+ * Factory desde env vars:
36
+ * ZENTTO_API_URL — default https://api.zentto.net
37
+ * ZENTTO_TENANT_KEY — PublicApiKey del tenant (si el caller es externo)
38
+ */
39
+ export function landingFromEnv(overrides) {
40
+ return new LandingClient({
41
+ baseUrl: process.env.ZENTTO_API_URL,
42
+ tenantKey: process.env.ZENTTO_TENANT_KEY,
43
+ ...overrides,
44
+ });
45
+ }
46
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/landing/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAoC,MAAM,qBAAqB,CAAC;AA8BvG,MAAM,OAAO,aAAa;IACP,GAAG,CAAa;IAChB,SAAS,CAAU;IAEpC,YAAY,IAAmB;QAC7B,IAAI,CAAC,GAAG,GAAG,iBAAiB,CAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,wBAAwB;YACjD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,OAAO,WAAW,CAAuB,IAAI,CAAC,GAAG,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;SACzE,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAkC;IAC/D,OAAO,IAAI,aAAa,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACnC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACxC,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/landing/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/landing/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zentto/platform-client",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Cliente tipado para los servicios de plataforma Zentto (notify, cache, auth, landing). Uso oficial en ERP, verticals y sitios de tenants clientes.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,8 +13,30 @@
13
13
  "./notify": {
14
14
  "types": "./dist/notify/index.d.ts",
15
15
  "import": "./dist/notify/index.js"
16
+ },
17
+ "./auth": {
18
+ "types": "./dist/auth/index.d.ts",
19
+ "import": "./dist/auth/index.js"
20
+ },
21
+ "./cache": {
22
+ "types": "./dist/cache/index.d.ts",
23
+ "import": "./dist/cache/index.js"
24
+ },
25
+ "./landing": {
26
+ "types": "./dist/landing/index.d.ts",
27
+ "import": "./dist/landing/index.js"
28
+ },
29
+ "./events": {
30
+ "types": "./dist/events/index.d.ts",
31
+ "import": "./dist/events/index.js"
16
32
  }
17
33
  },
34
+ "peerDependenciesMeta": {
35
+ "kafkajs": { "optional": true }
36
+ },
37
+ "peerDependencies": {
38
+ "kafkajs": "^2.2.4"
39
+ },
18
40
  "files": [
19
41
  "dist",
20
42
  "README.md",
@@ -23,6 +45,8 @@
23
45
  "scripts": {
24
46
  "build": "tsc",
25
47
  "dev": "tsc --watch",
48
+ "test": "vitest run",
49
+ "test:watch": "vitest",
26
50
  "clean": "rm -rf dist",
27
51
  "prepublishOnly": "npm run clean && npm run build"
28
52
  },
@@ -47,7 +71,8 @@
47
71
  },
48
72
  "devDependencies": {
49
73
  "@types/node": "^25.6.0",
50
- "typescript": "^5.7.0"
74
+ "typescript": "^5.7.0",
75
+ "vitest": "^3.2.4"
51
76
  },
52
77
  "engines": {
53
78
  "node": ">=20"