@controldealquiler/sdk 1.3.0 → 1.3.1

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/README.md CHANGED
@@ -211,6 +211,10 @@ Se configura por entorno:
211
211
 
212
212
  `controldealquiler` sin argumentos muestra la ayuda de cada comando.
213
213
 
214
+ ## Cambios en 1.3.1
215
+
216
+ - Limpia los tipos publicados: quita comentarios internos y opciones reservadas a pruebas. Sin cambios de comportamiento.
217
+
214
218
  ## Cambios en 1.3.0
215
219
 
216
220
  - Nueva opción `lecturaEnServidor: 'permitir' | 'rechazar'` (por defecto `'permitir'`, como hasta ahora). Con `'rechazar'`, el `409 AGENCIA_MODO_SERVIDOR` no sube el fichero por multipart: `borradores.leer`, `crearBorradores` y el alta fallan, y el alta lanza `ErrorAlta` con `corta: true` y `reintentable: false`.
package/dist/index.d.ts CHANGED
@@ -49,13 +49,12 @@ interface Sobre {
49
49
  iv: Uint8Array;
50
50
  }
51
51
  interface FicheroSellado {
52
- /** iv||cipher: se sube tal cual al bucket (formato del vault). */
52
+ /** Contenido cifrado, listo para subir tal cual. */
53
53
  blob: Uint8Array;
54
54
  wrapped_file_key: Uint8Array;
55
55
  nombre_cipher: Uint8Array;
56
56
  nombre_iv: Uint8Array;
57
57
  }
58
- /** (Sin AAD en AES-GCM, compatible con `envelope.ts` tal cual: el formato no ata el sobre a su cliente.) */
59
58
  /** Sella un JSON con la pública del destinatario (un único sobre). */
60
59
  declare function sellarJson(valor: unknown, publicaSpki: Uint8Array): Promise<Sobre>;
61
60
  /** Abre un sobre con la privada (CryptoKey RSA-OAEP con `decrypt`). */
@@ -96,7 +95,7 @@ interface Descifrador {
96
95
  publicaAgenciaSpki(): Promise<string>;
97
96
  /**
98
97
  * La privada de sobres de la agencia como clave no extraíble, solo en memoria del proceso. La usa `clientes.crear` para
99
- * re-envolver las claves de los ficheros hacia la llave efímera del alta (el mismo `sellarBorradorParaEfimera` del panel).
98
+ * re-envolver las claves de los ficheros hacia la llave efímera del alta, igual que el panel.
100
99
  */
101
100
  clavePrivadaSobres(): Promise<CryptoKey>;
102
101
  }
@@ -140,8 +139,8 @@ interface ParsedLeaseContract {
140
139
  /** Dirección de la vivienda tal como consta (una línea, sin trocear), máx. 200 caracteres. */
141
140
  property_address: string | null;
142
141
  /**
143
- * Solo el lector sin IA de las agencias (`lib/agencia/lectores/contrato.ts`) lo fija, tras parsear (este parser nunca lo lee del JSON): la RC de la VIVIENDA que se importa a su
144
- * ficha (ya validada por dígitos de control), o null si el contrato no la fija. Ausente en la lectura por IA.
142
+ * Referencia catastral de la vivienda que se importa a su ficha (ya validada por dígitos de control), o null si el
143
+ * contrato no la fija. Solo la rellena la lectura sin IA de las agencias; ausente en la lectura por IA.
145
144
  */
146
145
  cadastral_ref_vivienda?: string | null;
147
146
  }
@@ -156,7 +155,7 @@ interface VentanaEjercicios {
156
155
  caducaAntesDe: string | null;
157
156
  }
158
157
 
159
- /** Lo que dice la certificación de la agencia (`agencia_lector`): qué parser y qué conceptos están certificados. */
158
+ /** Lo que dice la certificación de la agencia: qué parser y qué conceptos están certificados. */
160
159
  interface LectorCertificado {
161
160
  parser: string;
162
161
  conceptos: string[];
@@ -208,9 +207,8 @@ type ResultadoLecturaAlta = {
208
207
  /** Filas leídas pero fuera de la ventana de ejercicios: se quitan con aviso. */
209
208
  filasFuera: number;
210
209
  /**
211
- * Rótulo de cada fila de `filas` (mismo orden, ≤200 caracteres): texto libre del PDF. NUNCA va a la BD ni a la
212
- * respuesta del servidor (`lecturaAGuardar` y `respuestaDe` eligen campos a mano): solo lo usa el navegador de la
213
- * agencia para el sobre E2EE del titular, donde es el concepto de la transacción.
210
+ * Rótulo de cada fila de `filas` (mismo orden, ≤200 caracteres): texto libre del PDF. Nunca viaja a la API:
211
+ * solo lo usa el navegador de la agencia para el sobre cifrado del titular, donde es el concepto de la transacción.
214
212
  */
215
213
  rotulos: string[];
216
214
  } | {
@@ -219,7 +217,7 @@ type ResultadoLecturaAlta = {
219
217
  transitorio: boolean;
220
218
  };
221
219
 
222
- /** Mismo tope que el servidor y el navegador (`leer-alta-navegador.ts`, `leer-fichero.ts`). */
220
+ /** Mismo tope que el servidor y el navegador (el mismo que aplica el panel). */
223
221
  declare const TOPE_BYTES = 4000000;
224
222
  /** Lector vivo de la agencia: `parser` y conceptos certificados (constantes del sistema, sin PII). */
225
223
  type LectorVigente = LectorCertificado;
@@ -237,8 +235,6 @@ interface OpcionesLector {
237
235
  /** El servidor aplica la ventana: aquí se lee con una ventana abierta, igual que el navegador. */
238
236
  ventana?: VentanaEjercicios;
239
237
  mime?: string;
240
- /** Solo para los tests: sustituye a pdf.js. */
241
- extraer?: (b: Uint8Array) => Promise<string | null>;
242
238
  }
243
239
  declare function leerFicheroLocal(bytes: Uint8Array, a: OpcionesLector): Promise<SalidaLectorLocal>;
244
240
  interface Borradores {
@@ -358,8 +354,7 @@ interface ViviendaAlta {
358
354
  municipio?: string;
359
355
  direccion: string;
360
356
  /**
361
- * Código postal (5 cifras), OBLIGATORIO: el sobre de la vivienda lo exige (`sobreViviendaSchema`) y el dueño lo ve. Desvío
362
- * del plan (su interfaz no lo traía); nunca se inventa uno (decisión de la Reina, 28-10).
357
+ * Código postal (5 cifras), obligatorio: el sobre de la vivienda lo exige y el titular lo ve. El SDK nunca inventa uno.
363
358
  */
364
359
  cp: string;
365
360
  ficheros: FicheroAlta[];
@@ -382,13 +377,11 @@ interface DepsAlta {
382
377
  http: Http;
383
378
  borradores: Borradores;
384
379
  descifrador: Descifrador;
385
- /** `fetch` para subir los objetos a la URL firmada del Storage. */
380
+ /** `fetch` para subir los ficheros a la URL firmada. */
386
381
  fetch?: typeof fetch;
387
382
  /** Origen del sitio (`https://controldealquiler.com`) para componer el enlace. */
388
383
  origen: string;
389
- /** Solo para los tests: sustituye a pdf.js. */
390
- extraer?: OpcionesLector['extraer'];
391
- /** «Hoy» de Madrid para validar los contratos; por defecto `lib/time/madrid.ts`. */
384
+ /** «Hoy» de Madrid para validar los contratos; por defecto, la fecha de hoy en Madrid. */
392
385
  hoy?: () => string;
393
386
  /** Espera entre sondeos del lote y entre reintentos de lectura (ms). */
394
387
  intervaloMs?: number;
@@ -399,18 +392,16 @@ interface DepsAlta {
399
392
  * Ficheros de una misma vivienda que se suben y leen a la vez (entero de 1 a 8; fuera de rango se acota). Si no se fija,
400
393
  * se usa la sugerencia del servidor (`GET /v1/yo` → `limites.concurrencia_ficheros`) y, si falta o falla, 4.
401
394
  * 1 los procesa uno tras otro. Las viviendas siguen en serie. Cada fichero cuesta unas 3 llamadas a la API y la API admite
402
- * 10 peticiones/s por cuenta con ráfaga de 50 (`apps/web/lib/api/limites.ts`): un 429 se reintenta con `Retry-After`.
395
+ * 10 peticiones/s por cuenta con ráfaga de 50: un 429 se reintenta con `Retry-After`.
403
396
  */
404
397
  concurrenciaFicheros?: number;
405
- /** Uso interno: la sugerencia del servidor, memorizada por cliente (`concurrenciaDelServidor`). */
406
- concurrenciaSugerida?: () => Promise<number>;
407
398
  }
408
399
  /** `crearAlta(d, e)` = `crearAltaConContexto(d, e)`. Lanza SIEMPRE `ErrorAlta` (nada más). */
409
400
  declare function crearAlta(deps: DepsAlta, e: EntradaAlta): Promise<ResultadoAlta>;
410
401
  interface Clientes {
411
402
  /**
412
403
  * Alta de un cliente con sus viviendas y ficheros por el circuito del panel. Idempotente por `ref`.
413
- * `previo` es de uso interno de `crearVarios` y del CLI: arrastra `creado: 'desconocido'` entre intentos de una misma `ref`.
404
+ * `previo` está reservado para los reintentos de `crearVarios`: no hace falta pasarlo.
414
405
  */
415
406
  crear(e: EntradaAlta, previo?: {
416
407
  creado: Creado;
@@ -429,7 +420,7 @@ interface ResultadoMantenimiento {
429
420
  imposibles: number;
430
421
  /** Un error de un cliente (lote inválido, fallo del servidor…) no tumba la pasada: se recoge aquí y se sigue con los demás. */
431
422
  errores: ErrorCliente[];
432
- /** Sobres que la privada de la agencia no abre o que no validan: se quedan pendientes (ver el residual de F1 arriba). */
423
+ /** Sobres que la privada de la agencia no abre o que no validan: se quedan pendientes. */
433
424
  sobresSinAbrir: number;
434
425
  /** `false` si en algún momento faltó una cabecera `Date` válida del servidor: en ese caso no se declaró nada. */
435
426
  relojServidor: boolean;
@@ -584,9 +575,7 @@ interface RenovacionApi {
584
575
  fijar(f: FijarRenovacion): Promise<unknown>;
585
576
  }
586
577
  /**
587
- * Tipos públicos de webhook (v10 § 4.8). Viven como DATOS en `api_webhook_tipo` (migración, columna A); el SDK es
588
- * público y no importa del servidor, así que los repite aquí y `tests/api/webhook-tipos-sdk.test.ts` los compara con la
589
- * migración para que no se desfasen.
578
+ * Tipos de evento de webhook que la API puede enviar.
590
579
  */
591
580
  declare const TIPOS_WEBHOOK: readonly ["cliente.activado", "cliente.ido", "lote.terminado", "credencial.caduca_pronto", "mantenimiento.pendiente"];
592
581
  type TipoWebhook = (typeof TIPOS_WEBHOOK)[number];
@@ -671,20 +660,7 @@ type ResultadoFotoSdk = {
671
660
  ok: false;
672
661
  error: 'IMAGEN_NO_PROCESABLE';
673
662
  };
674
- /** Lo mínimo de `sharp` que usamos (se tipa a mano: la dependencia es opcional y puede no estar instalada). */
675
- interface SharpInstancia {
676
- rotate(): SharpInstancia;
677
- resize(o: Record<string, unknown>): SharpInstancia;
678
- clone(): SharpInstancia;
679
- jpeg(o: {
680
- quality: number;
681
- }): SharpInstancia;
682
- toBuffer(): Promise<Uint8Array>;
683
- }
684
- type SharpFn = (entrada: Uint8Array, opciones?: Record<string, unknown>) => SharpInstancia;
685
663
  interface DepsFoto {
686
- /** Solo para los tests: sustituye a la carga de `sharp` (`null` = no instalado). */
687
- cargarSharp?: () => Promise<SharpFn | null>;
688
664
  }
689
665
  declare function prepararFoto(bytes: Uint8Array, mime: string, deps?: DepsFoto): Promise<ResultadoFotoSdk>;
690
666
 
@@ -696,8 +672,6 @@ declare class ErrorFirmaWebhook extends Error {
696
672
  }
697
673
  type CabecerasWebhook = Headers | Record<string, string | string[] | undefined>;
698
674
  interface OpcionesVerificar {
699
- /** «Ahora» en milisegundos Unix; por defecto `Date.now()`. Solo para tests. */
700
- ahora?: () => number;
701
675
  /** Ventana en segundos a cada lado (por defecto 300). */
702
676
  toleranciaS?: number;
703
677
  }
@@ -710,7 +684,7 @@ interface WebhookVerificado {
710
684
  declare function verificarWebhook(cuerpo: string | Uint8Array, cabeceras: CabecerasWebhook, secreto: string | readonly string[], opciones?: OpcionesVerificar): WebhookVerificado;
711
685
 
712
686
  interface ClienteCda {
713
- /** Llamada de bajo nivel; las tareas siguientes cuelgan de aquí `clientes`, `borradores`, `mantenimiento`. */
687
+ /** Llamada de bajo nivel a la API; sobre ella se construyen `clientes`, `borradores` y `mantenimiento`. */
714
688
  peticion<T = unknown>(p: Peticion): Promise<T>;
715
689
  http: Http;
716
690
  descifrador: Descifrador;
@@ -728,8 +702,6 @@ interface OpcionesCliente {
728
702
  baseUrl?: string;
729
703
  descifrador: Descifrador;
730
704
  fetch?: typeof fetch;
731
- /** Solo para los tests: sustituye a pdf.js al leer actas, contratos y movimientos. */
732
- extraer?: OpcionesLector['extraer'];
733
705
  hoy?: () => string;
734
706
  intervaloMs?: number;
735
707
  maxEsperaMs?: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@controldealquiler/sdk",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "private": false,
6
6
  "type": "module",
@@ -14,8 +14,8 @@
14
14
  },
15
15
  "scripts": {
16
16
  "build": "node build.mjs",
17
- "prepublishOnly": "node build.mjs && vitest run test/tipos-paquete.test.ts",
18
- "test:tipos": "vitest run test/tipos-paquete.test.ts",
17
+ "prepublishOnly": "node build.mjs && vitest run test/tipos-paquete.test.ts test/vocabulario-interno.test.ts",
18
+ "test:tipos": "vitest run test/tipos-paquete.test.ts test/vocabulario-interno.test.ts",
19
19
  "test": "vitest run --passWithNoTests"
20
20
  },
21
21
  "devDependencies": {