# Changelog

All notable changes to the NexaBase SDK are documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
---


## [2.22.0] - 2026-08-26

### Added

- **Real bulk create/delete (`client.createDocumentsBulk()` / `client.deleteDocumentsBulk()`)**: `NexaQueryBuilder.insertBulk()` and `.deleteGetCount()` looked like batch operations but were actually a `createDocument()`/`deleteDocument()` call per record inside a `for` loop — each one opening its own transaction and updating the same `collections` row for the record count. Real client load (~1300+ records, moderate concurrency, many rows sharing the same foreign key from a common source file) produced genuine Postgres deadlocks server-side, on top of tripping the global rate limiter from the sheer request volume. Both now call the backend's new `POST :name/documents/bulk` / `POST :name/documents/bulk-delete` endpoints (single server-side transaction per call, batched internally, max 5000 records/ids per request — split larger loads into multiple calls). `insertBulk()` keeps its original `Promise<Document[]>` return type for backward compatibility (the backend now returns full inserted rows, not just ids). New lower-level methods for direct use: `client.createDocumentsBulk(collection, records)` returns `{success, inserted, ids, records, errors}`; `client.deleteDocumentsBulk(collection, ids)` returns `{success, deleted, deleted_ids, not_found}`. New events `documents:bulk_created` / `documents:bulk_deleted`.

## [2.21.0] - 2026-08-23

### Added

- **Automatic retry with exponential backoff on HTTP 429 (rate limit)**: the client had dead `retryCount`/`maxRetries` fields (reset on success but never incremented or compared anywhere) and only retried on `401` (token refresh). When the backend's per-account rate limit (300 req/60s) rejected a burst, every request failed immediately with no wait and no retry - including normal reads and signups. The response interceptor now retries `429` responses up to `maxRetries` times (default 3). Waiting strategy: the server's `Retry-After` header is honored when it is within `maxRetryDelayMs` (default 10s); if the server asks to wait longer than that, the request fails immediately instead of hanging the consumer for the whole window; without the header, exponential backoff with jitter (`retryBaseDelayMs * 2^attempt`, default 500ms base) is used. Retrying is safe even for writes because the backend answers `429` from its rate-limit middleware before any business logic touches the database. The retry counter lives on the original request config, so concurrent calls don't share state. New optional config options: `maxRetries`, `retryBaseDelayMs`, `maxRetryDelayMs`. A `ratelimit:retry` event is emitted before each retry attempt for observability.

## [2.20.0] - 2026-08-23

### Added

- **HTTP keep-alive connections in Node/Bun (`keepAlive` config option, default `true`)**: `axios.create()` was called without `httpAgent`/`httpsAgent`, so every request fell back to Node's global agent — which has `keepAlive: false` on Node <= 18 (and only a 5s idle window even where enabled) — paying a full TCP+TLS handshake per call. Measured against production: cold connection ~600-650ms (~410ms of that is TLS handshake alone); reusing the connection ~195-260ms. With sporadic traffic (7s between calls), the old behavior paid the handshake on *every* call (~570-620ms each) while the fix keeps it at ~196ms after the first one. The SDK now creates `keepAlive: true` agents (`maxSockets: 50`) automatically when running under Node/Bun; pass `keepAlive: false` to opt out. In browsers nothing changes (no Node builtins are touched — agent creation is guarded so webpack/vite builds of the SDK are unaffected, and browsers already reuse connections on their own).

## [2.19.1] - 2026-08-16

### Fixed

- **`storage.upload()`, `createDocumentWithFile()`, `updateDocumentWithFile()` broken - manual `Content-Type` clobbered the FormData boundary**: all three set `Content-Type: multipart/form-data` by hand on a `FormData` body. In a browser, axios's XHR/fetch adapters only auto-generate the `multipart/form-data; boundary=...` header when `Content-Type` was never explicitly set - an already-present value (even the default instance header `application/json`, let alone this literal `multipart/form-data` with no boundary) is sent as-is, and the backend's multipart parser can't read a body with no boundary. Fixed by passing `Content-Type: undefined` in the per-call header override instead, which clears the instance default and lets axios compute the correct boundary-bearing header. (Verified this does not affect the `Authorization`/`X-API-Key` headers - those are re-applied unconditionally by a request interceptor regardless of what `Content-Type` ends up being.)

## [2.19.0] - 2026-08-16

### Added

- **`RealtimeConfig.transport` option (`"websocket" | "socketio"`, default `"websocket"`)**: `NexaBaseRealtime` used a plain `WebSocket` unconditionally, which cannot connect to backend-v1's `/realtime` gateway at all - it's a NestJS `@nestjs/websockets` endpoint running on Socket.IO/Engine.IO framing, not a raw WebSocket server (connecting with a plain `WebSocket` fails the handshake immediately). Pass `transport: "socketio"` against backend-v1; the default `"websocket"` remains correct for backend-v2 (native `axum::extract::ws`). Both transports share the same public API and the same client-side filter-matching dispatch.

### Fixed

- **Realtime events reached every subscriber's socket unfiltered**: the `filter`/`filters` a subscription declared was only ever checked client-side, after the full, unfiltered record had already been sent to the socket - any client with read access to a collection received every record over the wire regardless of its own filter. This is fixed server-side in both backend-v1 and backend-v2 (see their own changelogs/notes); on the SDK side, `unsubscribe()` on the plain-WebSocket transport now also sends the subscription's `collection` (previously only `subscription_id`, which the backend has no way to resolve back to a collection on its own).

## [2.18.2] - 2026-08-16

### Fixed

- **Fluent Query Builder - resultados inconsistentes según la query**: `.get()`/`.first()` alternaban en silencio entre `GET /documents` (query string) y `POST /query` (JSON) según si la query usaba `.whereGroup(..., 'OR')` en algún punto - una decisión invisible para quien escribe la query. Esto causaba que la misma llamada `.where()` se comportara distinto según qué más hubiera en la cadena: valores `null` encontraban filas por GET pero 0 resultados por POST (el backend solo normalizaba `EQ+null→IS_NULL` en el parser de query string, no en la ruta JSON - ver fix del lado del backend), y valores no-string como `Date` se corrompían al pasar por `String(value)` en la query string en vez del `JSON.stringify` correcto del body POST. Ahora `.get()`/`.first()` siempre usan `queryDocuments` (POST/JSON), la ruta que serializa los valores de forma correcta y completa.

## [2.18.1] - 2026-08-14

### Fixed

- **QueryBuilder bulk operations**: `_getFilteredDocuments()` now uses paginated iteration (100 records per page) instead of requesting 1000 records at once. This prevents exceeding server-side `per_page` limits and ensures all matching documents are retrieved reliably.

## [2.18.0] - 2026-05-28

### Added

- **Idempotency on delete/replace/file operations**: `deleteDocument()`, `replaceDocument()`, `createDocumentWithFile()`, `updateDocumentWithFile()` now accept `options?: DocumentOptions` with full `X-Idempotency-Key` header support.
- **QueryBuilder idempotency propagation**: `deleteById()`, `deleteFirst()`, `deleteGetCount()` now pass `DocumentOptions` through to the underlying client methods.
- **Idempotency guide**: New `docs/guides/idempotency.md` with patterns, best practices, and API reference.
- **API documentation**: Idempotency section in `docs/API.md` covering all methods, resolution order, and configuration.

### Changed

- **package.json**: Updated to v2.18.0.

## [2.17.7] - 2026-05-14

### Fixed

- **Global Documentation Audit**: Converted absolute GitHub links to relative paths across all documentation subdirectories (`guides`, `how-to`, `tutorials`, `reference`).
- **Index Synchronization**: Updated `docs/README.md` index and main root files to the latest version.

## [2.17.6] - 2026-05-14

### Fixed

- **Documentation Overhaul**: Complete English translation of README.md, fixed absolute links, and synchronized versioning across all files.
- **API Reference**: Overhauled API.md to include missing methods from v2.17.x (queryDocuments, insertGetId, etc.).
- **Storage API routes**: Fixed routes to synchronize with backend (`/api/storage/files/:id/download`, etc.).

---

## [2.17.5] - 2026-04-29

### Fixed

- **Storage API routes**: Corregidas rutas de storage para usar `/api/storage/...` (sin prefijo `v1`), consistente con el backend. Afecta: `upload()`, `download()`, `delete()`, `getSignedUrl()`, `listFiles()`.

---

## [2.17.4] - 2026-04-25

### Fixed

- **Storage signed URLs**: Mejorado soporte para ambos formatos de respuesta ({ url } y { data: { url } }).

---

## [2.17.3] - 2026-04-25

### Added

- **File upload en Query Builder**: Nuevos métodos `insertWithFile()` y `updateFirstWithFile()` para subir archivos/imágenes junto con documentos.

---

## [2.17.2] - 2026-04-25

### Added

- **External logout**: Nuevo método `externalLogout()` en SDK para cerrar sesión externa.

### Fixed

- **Rutas de External Auth**: Usar DualAuthGuard para endpoint de login externo.

---

## [2.17.0] - 2026-04-24

### Added

- **External Authentication**: Nuevo método `externalLogin(configName, id, secret)` para autenticación sin email/password usando credenciales personalizadas (código empleado, PIN, ID afiliado, etc.)
- **Soporte SDK**:
  - `nexabase.externalLogin(configName, id, secret)`: Autenticación externa
  - Retorna `AuthResponse` con `access_token`, `refresh_token`, `user`, etc.
- **Dashboard UI**: Nueva sección en `nexabase-frontend-v2` en `/dashboard/external-auth` para configurar autenticaciones externas
- **Backend**: Nuevos endpoints en `nexabase-backend-v1` para gestionar configuraciones de auth externo

### Use Cases

- Login de empleados con código + PIN
- Login de afiliados con credenciales personalizadas
- Autenticación PIN para sistemas POS
- Cualquier combinación ID + secreto configurada en el dashboard

---

## [2.16.0] - 2026-04-24

### Added

- **Fluent Query Builder para INSERT, UPDATE, DELETE**: Nuevo módulo `NexaQueryBuilder` que permite operaciones de escritura con una API fluent y encadenable.
- **Métodos de Escritura**:
  - `insert(data?)` / `insertGetId(data?)`: Inserta un documento y retorna el resultado
  - `insertBulk(docs[])`: Inserta múltiples documentos
  - `update(data)` / `updateGetModified()`: Actualiza todos los documentos matching
  - `updateFirst()`: Actualiza solo el primer documento matching
  - `deleteGetCount()`: Elimina todos los documentos matching y retorna el conteo
  - `deleteFirst()`: Elimina solo el primer documento matching
  - `deleteById(id)`: Elimina directamente por ID
- **Métodos de Consulta**:
  - `find(id)`: Busca documento por ID
  - `count()`: Cuenta documentos matching
  - `exists()`: Verifica existencia
  - `select(...fields)`: Selecciona campos específicos
- **Métodos de Filtro**:
  - `whereIn(field, values[])`
  - `whereNotIn(field, values[])`
  - `whereNull(field)`
  - `whereNotNull(field)`
  - `whereBetween(field, start, end)`
  - `whereStartsWith(field, value)`
  - `whereEndsWith(field, value)`
  - `whereLike(field, value)`
  - `whereILike(field, value)`
- **Extensiones del Cliente**: Nuevos métodos `createQuery(collection)` y `query(collection)` en `NexaBase` que retornan el `NexaQueryBuilder`.
- **Compatibilidad Total**: Los métodos existentes (`from()`, `createDocument()`, `updateDocument()`, `deleteDocument()`) siguen funcionando igual.

### Documentation

- Nueva sección en README con ejemplos completos del Query Builder
- Actualizada la referencia de API con todos los nuevos métodos

## [2.15.2] - 2026-04-17

### Fixed

- **Estabilización de Consultas POST**: Implementada la normalización recursiva de operadores de filtros. Ahora el SDK traduce automáticamente operadores simbólicos (`>=`, `<=`, `==`, etc.) a las palabras clave esperadas por el backend (`gte`, `lte`, `eq`, etc.) en el endpoint `/query`.
- **Compatibilidad de Grupos Anidados**: Corregida la validación de grupos lógicos (`whereGroup`) al enviarse por POST, eliminando errores `400 Bad Request` en consultas complejas.

## [2.15.1] - 2026-04-17

### Fixed

- **Visibilidad de Columnas Analíticas**: Corregido error donde las columnas calculadas (`mes_nombre`, `dia_solicitud`, etc.) eran filtradas por el backend. Ahora el SDK las incluye automáticamente en la lista de selección (`fields`).
- **Normalización Exhaustiva**: Mejorado el mapeo de opciones para peticiones POST (incluyendo `limit`, `select`, `groupBy` y `sort`), garantizando consistencia total entre los endpoints GET y POST.

## [2.15.0] - 2026-04-16

### Added

- **Funciones de Agregación de Fecha**: Añadidos métodos fluidos `.month(field, alias)`, `.year(field, alias)` y `.day(field, alias)` al `NexaQuery` builder.
- **Enumeración de Agregaciones**: Introducidos el enum `AggregateFunction` y la interfaz `AggregateDto` para asegurar el cumplimiento del contrato con el backend.

### Fixed

- **Compatibilidad con Navegadores (Vite/Vue)**: Resuelto el error `TypeError: Class extends value undefined` causado por la dependencia de Node.js `events`. Se implementó un `EventEmitter` ligero y compatible con entornos de navegador.

## [2.12.1] - 2026-04-10

### Added

- **Soporte para Operaciones Seguras (Idempotencia)**: El SDK ahora permite enviar el encabezado `X-Idempotency-Key` de forma fluida mediante el método `.withIdempotency(key)`.
- **Integridad ACID**: Compatibilidad total con el nuevo sistema de transacciones y secuencias automáticas del backend.

### Fixed

- **Estabilización de Tests Unitarios**: Corregida la suite de pruebas del cliente para validar correctamente las nuevas cabeceras de configuración de Axios, habilitando el proceso de publicación (`prepublishOnly`).

## [2.12.0] - 2026-04-09

### Added

- **Consultas Lógicas Complejas (.whereGroup)**: Nuevo método fluido para crear grupos anidados de filtros (AND/OR). Permite parentetización profunda en consultas SQL generadas.
- **Auditoría Automatizada**: El backend ahora gestiona automáticamente los campos `created_by`, `updated_by` y `tenant_id` basándose en el contexto del usuario autenticado.
- **Detección de Esquema Física**: Se implementó una verificación real de columnas físicas en la base de datos para evitar errores en tablas que no tienen campos de auditoría.
- **Endpoint POST /query**: Soporte en el SDK para el nuevo endpoint de consultas por POST, permitiendo filtros JSON complejos sin las limitaciones de longitud de las URLs GET.

### Changed

- **NexaQuery**: Actualizada la lógica interna para usar el nuevo sistema de filtros estructurados (`IDTOFilter[]`) en lugar de objetos planos cuando se detecta complejidad.

## [2.11.0] - 2026-03-24


### Added

- **Soporte mejorado para File Upload en Documentos**: Se añadieron los métodos `createDocumentWithFile(collection, data, file, field)` y `updateDocumentWithFile(...)` al cliente principal.
- **Detección Inteligente de Campos**: El backend ahora detecta automáticamente campos de archivo incluso en esquemas definidos como arrays y mediante heurística de nombres (campos que contienen "file" o "image").
- **Robustez en Multipart**: Mejorada la compatibilidad con peticiones `multipart/form-data` para asegurar que los metadatos del archivo se asignen correctamente al campo destino, incluso si no está marcado estrictamente como tipo `file`.

## [2.10.0] - 2026-03-19

### Added

- **Documentación 100% basada en código real**: README completamente reescrito leyendo el código fuente del SDK.
- **Query Builder completo**: Documentación de todos los métodos del Fluent Query Builder (select, where, groupBy, aggregations).
- **Factory Functions reales**: Documentación precisa de `createApiClient`, `createTokenClient`, `createAuthenticatedApiClient`, etc.
- **Users Module**: CRUD completo de usuarios con todos los métodos (`list`, `get`, `create`, `update`, `delete`, `resendInvite`).
- **Storage Module**: Upload, download, signed URLs, list files, delete.
- **Functions Module**: Invoke con opciones (POST, GET, timeout, headers).
- **Webhooks Module**: List, create, get, update, delete.
- **Realtime Module**: Connect, subscribe, broadcast, unsubscribe, disconnect con configuración completa.

### Changed

- **README.md**: Reescrito desde cero basado en el código real (`client.ts`, `query.ts`, `users.ts`, `storage.ts`, `functions.ts`, `webhooks.ts`, `realtime.ts`, `factory.ts`).
- **Ejemplos de código**: Todos verificados contra el código real del SDK.
- **Tabla de Query Methods**: Lista completa de métodos del Query Builder con ejemplos.

### Fixed

- **Links eliminados**: Se removieron todos los links a documentación que no existe para evitar links rotos.
- **Métodos incorrectos**: Se corrigieron métodos que no existían en el código real.
- **Factory functions**: Se documentaron las funciones factory reales, no inventadas.

### Removed

- **Links a documentación externa**: Se eliminaron todos los links a `/docs/guides/` y `/docs/API.md` que no existen para evitar 404s.

## [2.9.0] - 2026-03-18

- **Documentación Mejorada para npm**: README completamente renovado con ejemplos completos para todas las características del SDK.
- **Guía de Publicación**: Nuevo archivo PUBLISH_GUIDE.md con proceso completo de publicación en npm.
- **CHANGELOG Estandarizado**: Formato Keep a Changelog con guías de migración incluidas.
- **Nuevos Keywords**: package.json actualizado con keywords adicionales para mejor discoverability en npm.
- **Scripts de Release**: Nuevos scripts `release:patch`, `release:minor`, `release:major` para facilitar versionado.
- **Campo exports**: Configuración moderna de exports en package.json para mejor compatibilidad con ESM/CJS.

### Changed

- **README.md**: +112% más contenido con 100+ ejemplos de código, quick start guide, y mejor jerarquía visual.
- **package.json**: Descripción mejorada, email de bugs agregado, publishConfig configurado.
- **prepublishOnly**: Ahora incluye tests automáticos antes de publicar.

### Improved

- **Onboarding**: Quick start de 3 pasos para nuevos usuarios.
- **Ejemplos TypeScript**: Todos los ejemplos ahora muestran tipado completo.
- **Error Handling**: Guía completa con type guards y códigos de error.
- **Navegación**: Quick links y tabla de contenidos mejorada.

### Fixed

- **Documentación de Users Module**: Ejemplos actualizados con API correcta.
- **Enlaces de Soporte**: Todos los enlaces verificados y actualizados.

## [2.8.8] - 2026-03-14

### Fixed

- **Estandarización de Respuestas**: Implementado "unwrapping" transparente de respuestas del backend. El SDK ahora extrae automáticamente el payload `data` de las respuestas estandarizadas `{ success: true, data: ... }`, manteniendo la compatibilidad con el código existente.
- **Manejo de Errores**: Mejorada la extracción de mensajes y detalles de error para soportar el nuevo formato del backend.

---

## [2.8.7] - 2026-03-14

### Fixed

- Serialización y envío de `group_by` y `aggregate` en `listDocuments` (Query Builder → HTTP).

---

## [2.8.6] - 2026-03-13

### Added

- **Agregaciones Dinámicas**: Soporte avanzado para realizar reportes y análisis de datos directamente desde el SDK.
- Nuevos métodos fluidos en el Query Builder:
  - `.groupBy()` - Agrupar resultados
  - `.count()` - Contar registros
  - `.sum()` - Sumar valores
  - `.avg()` - Calcular promedio
  - `.min()` - Obtener valor mínimo
  - `.max()` - Obtener valor máximo
- Funciones de tiempo para agrupación temporal:
  - `.month()` - Agrupar por mes
  - `.year()` - Agrupar por año
  - `.day()` - Agrupar por día
- Alias automáticos inteligentes para columnas agregadas.
- Soporte en backend para procesamiento SQL dinámico y validación de funciones de agregación.

---

## [2.8.4] - 2026-03-13

### Fixed

- **Sistema de Filtros**: Unificada la lógica de parseo con `parseFiltersFromRequest()` para notación de brackets (ej. `filter[field][$gte]=val`).
- **Mapeo de Operadores**: Compatible con estilos MongoDB (`$gte`) y API directa (`gte`).

### Added

- **Parámetro `fields`**: Genera SQL `SELECT` específico, optimizando el ancho de banda.

### Improved

- **Filtros Avanzados**: Nuevos operadores soportados:
  - `between` - Rango de valores
  - `starts_with` - Comienza con
  - `ends_with` - Termina con
  - `is_null` - Verificación de nulos
- **Propagación de `include`**: Soporte completo para relaciones y metadata.

---

## [2.8.3] - 2026-03-13

### Fixed

- Bug crítico en la serialización de filtros avanzados en el SDK.

### Changed

- Consistencia de versiones en todos los archivos del proyecto.

---

## [2.8.2] - 2026-03-12

### Fixed

- Token refresh race condition en solicitudes concurrentes.
- Manejo de errores de red con reintentos automáticos.

---

## [2.8.1] - 2026-03-11

### Added

- Método `nexabase.users.me()` para obtener usuario actual.
- Soporte para parámetro `search` en listados de usuarios.

### Fixed

- Error en tipado de `UpdateUserDto`.
- Documentación de métodos del módulo Users.

---

## [2.8.0] - 2026-03-10

### Added

- **Módulo Users Completo**: CRUD completo para gestión de usuarios del tenant.
  - `users.list()` - Listar usuarios con paginación y filtros
  - `users.get()` - Obtener usuario por ID
  - `users.create()` - Crear nuevo usuario
  - `users.update()` - Actualizar usuario
  - `users.delete()` - Eliminar usuario
  - `users.me()` - Obtener usuario actual

### Changed

- **Breaking Change**: Módulo Users ahora es instancia de clase en lugar de funciones estáticas.

### Migration Guide

```typescript
// v2.7.x (Old)
import { users } from '@nexabase/sdk';
await users.list({ page: 1 });

// v2.8.x (New)
const nexabase = createNexaBaseClient({ ... });
await nexabase.users.list({ page: 1 });
```

---

## [2.7.5] - 2026-03-08

### Fixed

- Error en filtrado por fechas con timezone.
- Serialización de objetos Date en filtros.

---

## [2.7.4] - 2026-03-07

### Added

- Método `getSignedUrl()` en Storage con tiempo de expiración configurable.
- Soporte para metadata personalizada en uploads.

---

## [2.7.3] - 2026-03-06

### Fixed

- WebSocket reconexión automática tras pérdida de conexión.
- Manejo de eventos en tiempo real con múltiples suscriptores.

---

## [2.7.2] - 2026-03-05

### Added

- Eventos del SDK:
  - `document:created`
  - `document:updated`
  - `document:deleted`
  - `auth:token-expired`
  - `auth:token-refreshed`
  - `error`

### Changed

- Mejora en el sistema de eventos con listeners múltiples.

---

## [2.7.1] - 2026-03-04

### Fixed

- Error en batch operations con concurrencia mayor a 10.
- Memory leak en suscripciones de eventos.

---

## [2.7.0] - 2026-03-03

### Added

- **Batch Operations**: Ejecución de múltiples operaciones en paralelo.
  - `createBatch()` - Crear lote de operaciones
  - `.addCreateDocument()` - Agregar creación
  - `.addUpdateDocument()` - Agregar actualización
  - `.addDeleteDocument()` - Agregar eliminación
  - `.execute()` - Ejecutar con control de concurrencia

### Example

```typescript
const batch = createBatch(nexabase)
  .addCreateDocument('users', { name: 'User 1' })
  .addCreateDocument('users', { name: 'User 2' })
  .addUpdateDocument('tasks', 'task-1', { status: 'done' });

const results = await batch.execute({ concurrency: 5 });
```

---

## [2.6.0] - 2026-03-01

### Added

- **Fluent Query Builder**: Sintaxis chainable para consultas complejas.

```typescript
const { data } = await nexabase
  .from('tasks')
  .select('id,title,status')
  .where('status', 'pending')
  .where('priority', '>', 3)
  .sort('-created_at')
  .limit(20)
  .get();
```

### Changed

- **Breaking Change**: Query builder ahora usa sintaxis fluida en lugar de objetos.

---

## [2.5.0] - 2026-02-28

### Added

- **Cloud Functions Module**: Invocación de funciones serverless.
  - `functions.invoke()` - Ejecutar función
  - `functions.list()` - Listar funciones
  - `functions.get()` - Obtener detalles de función

---

## [2.4.0] - 2026-02-25

### Added

- **Storage Module**: Gestión completa de archivos.
  - `storage.upload()` - Subir archivo
  - `storage.download()` - Descargar archivo
  - `storage.delete()` - Eliminar archivo
  - `storage.list()` - Listar archivos
  - `storage.getSignedUrl()` - URL temporal firmada

---

## [2.3.0] - 2026-02-20

### Added

- **Webhooks Module**: Creación y gestión de webhooks.
  - `webhooks.create()` - Crear webhook
  - `webhooks.list()` - Listar webhooks
  - `webhooks.update()` - Actualizar webhook
  - `webhooks.delete()` - Eliminar webhook
  - `webhooks.test()` - Probar webhook

---

## [2.2.0] - 2026-02-15

### Added

- **Real-time Subscriptions**: Escuchar cambios en tiempo real.
  - `realtime.subscribe()` - Suscribirse a colección
  - `realtime.unsubscribe()` - Cancelar suscripción
  - `realtime.on()` - Escuchar eventos específicos
  - `realtime.disconnect()` - Desconectar

---

## [2.1.0] - 2026-02-10

### Added

- **Factory Functions**: Clientes pre-configurados.
  - `createApiKeyClient()` - Cliente con API Key
  - `createSubdomainClient()` - Cliente por subdominio
  - `createAuthenticatedApiClient()` - Cliente autenticado
  - `createDevelopmentClient()` - Cliente de desarrollo

---

## [2.0.0] - 2026-02-01

### Added

- **TypeScript First**: Reescritura completa con TypeScript.
- **Tipado Completo**: Todas las clases, métodos y respuestas tipados.
- **IntelliSense**: Soporte completo para autocompletado.

### Changed

- **Breaking Change**: API completamente rediseñada.
- **Breaking Change**: Módulo de autenticación unificado.

---

## [1.9.0] - 2026-01-25

### Added

- Soporte para OAuth social (Google, GitHub).
- Método `signInWithGoogle()` y `signInWithGitHub()`.

---

## [1.8.0] - 2026-01-20

### Added

- Auto token refresh con retry logic.
- Manejo automático de expiración de JWT.

---

## [1.7.0] - 2026-01-15

### Added

- Advanced query options:
  - Filtrado avanzado con operadores
  - Ordenamiento múltiple
  - Paginación configurable
  - Selección de campos

---

## [1.6.0] - 2026-01-10

### Added

- Collections CRUD operations.
- Método `createCollection()` con validación de schema.

---

## [1.5.0] - 2026-01-05

### Added

- Documents CRUD operations.
- Método `listDocuments()` con filtros.

---

## [1.4.0] - 2025-12-25

### Added

- Authentication methods:
  - `signIn()` con email/password
  - `signOut()`
  - `refreshToken()`

---

## [1.3.0] - 2025-12-20

### Added

- Error handling mejorado con códigos de error tipados.
- Clase `NexaBaseError` con tipos específicos.

---

## [1.2.0] - 2025-12-15

### Added

- Event system para escuchar cambios del SDK.
- Listeners para eventos de autenticación y documentos.

---

## [1.1.0] - 2025-12-10

### Added

- Configuration options adicionales:
  - Timeout configurable
  - Custom headers
  - Debug mode

---

## [1.0.0] - 2025-12-01

### Added

- **Initial Release**: Primera versión estable del SDK.
- Core functionality:
  - Client initialization
  - Basic authentication
  - Document operations
  - Query support

---

## [0.9.0] - 2025-11-20

### Added

- Beta release para testing interno.

---

## Version History Summary

| 2.12.x | 2026-04 | Consultas complejas (.whereGroup), Auditoría automática |
| 2.11.x | 2026-03 | File Upload mejorado, Robustez Multipart |
| 2.8.x | 2026-03 | Agregaciones dinámicas, Filtros avanzados |

| 2.7.x | 2026-03 | Batch operations, Query builder |
| 2.6.x | 2026-03 | Fluent Query Builder |
| 2.5.x | 2026-02 | Cloud Functions |
| 2.4.x | 2026-02 | Storage Module |
| 2.3.x | 2026-02 | Webhooks Module |
| 2.2.x | 2026-02 | Real-time Subscriptions |
| 2.1.x | 2026-02 | Factory Functions |
| 2.0.x | 2026-02 | TypeScript First |
| 1.x.x | 2025-12 | Initial Release |

---

## Upcoming Features (Roadmap)

### v2.9.0 (Planned)

- [ ] Offline-first support con caché local
- [ ] Sincronización automática online/offline
- [ ] Plugins system para extensiones

### v3.0.0 (Planned)

- [ ] GraphQL support opcional
- [ ] Real-time queries mejorado
- [ ] Multi-tenant queries optimizadas

---

## Migration Guides

### Migrating from v2.7.x to v2.8.x

**Users Module Changes:**

```typescript
// v2.7.x
import { users } from '@nexabase/sdk';
await users.list({ page: 1 });

// v2.8.x
const nexabase = createNexaBaseClient({ ... });
await nexabase.users.list({ page: 1 });
```

### Migrating from v2.6.x to v2.7.x

**Batch Operations:**

No breaking changes. Batch operations are additive.

### Migrating from v1.x to v2.x

**Major Changes:**

1. TypeScript now required
2. Factory functions instead of class instantiation
3. Module-based architecture

See [MIGRATION_GUIDE.md](./MIGRATION_GUIDE.md) for detailed instructions.

---

## Support

- 📧 Email: support@fabricadealgoritmos.site
- 🐛 Issues: [GitHub Issues](https://github.com/fmirpe/nexabase-sdk/issues)
- 💬 Discussions: [GitHub Discussions](https://github.com/fmirpe/nexabase-sdk/discussions)

---

**Last Updated:** May 14, 2026
