Ir al contenido

Actualizar de 0.17 a 0.18

0.18.0 ya está publicada. Son las entradas ### Breaking de su sección del changelog, una a una, con lo que cada una te pide cambiar. En 0.x la versión menor es la que rompe, así que este es el muro entre 0.17.3 y 0.18.0: léelo antes de actualizar, no después.

Eran tres sobrecargas —Postgres, Firestore, MongoDB— y ahora es una, discriminada por engine (Postgres cuando falta).

Qué cambiar: nada en una llamada que ya compilaba; lo que cambia es dónde cae el error, ahora sobre la clave equivocada y no sobre defineCollection(. UnknownPropertyKey ahora se llama NoSuchKey: solo el código que importaba el nombre antiguo tiene algo que tocar.

21. defineCollection sigue comprobando tras la primera propiedad errónea

Sección titulada «21. defineCollection sigue comprobando tras la primera propiedad errónea»

Una sola propiedad mal escrita colapsaba la entidad inferida a Record<string, unknown> y apagaba todas las demás comprobaciones.

Qué cambiar: nada que escribir, pero espera errores nuevos en archivos de colección que antes compilaban. Ya estaban mal entonces; el compilador había dejado de mirar.

22. El campo de enlace de una relación debe pertenecer a su kind

Sección titulada «22. El campo de enlace de una relación debe pertenecer a su kind»

{ kind: "belongsTo", foreignKeyOnTarget: … } ya no compila.

Qué cambiar: escribe el campo que corresponde a esa clase de relación.

author: {
type: "relation",
relation: { kind: "belongsTo", foreignKeyOnTarget: "author_id", target: () => authors }
relation: { kind: "belongsTo", localKey: "author_id", target: () => authors }
}

El validador de arranque ya lo rechazaba: si tu proyecto arranca hoy, compila hoy.

23. La validation de una relación sube a la propiedad

Sección titulada «23. La validation de una relación sube a la propiedad»

RelationBase.validation y ResolvedRelationBase.validation se han eliminado.

Qué cambiar: súbela un nivel, junto a la de cualquier otro campo.

author: {
type: "relation",
validation: { required: true },
relation: { kind: "belongsTo", validation: { required: true }, target: () => authors }
relation: { kind: "belongsTo", target: () => authors }
}

El arranque rechaza la clave antigua por su nombre. El código que preguntaba a una relación si era obligatoria ahora usa import { isRelationRequired, relationDeclaringProperty } from "@rebasepro/common".

24. Un belongsTo obligatorio borra con RESTRICT, no con CASCADE

Sección titulada «24. Un belongsTo obligatorio borra con RESTRICT, no con CASCADE»

Esto es un cambio de DDL. El próximo rebase db push planifica una reconstrucción de la restricción para cada relación obligatoria que nunca declaró un onDelete, y después los borrados del padre empiezan a fallar donde antes cascadeaban.

Qué cambiar: si quieres conservar el comportamiento anterior, escríbelo.

relation: { kind: "belongsTo", target: () => authors }
relation: { kind: "belongsTo", onDelete: "cascade", target: () => authors }

Revisa el plan antes de aplicarlo — rebase db push imprime las sentencias.

En 0.17.3 todos los paquetes publicados declaraban >=20@rebasepro/cli no declaraba engines en absoluto— y en main todos declaran >=22.22.0. La única fuente es el .nvmrc del repositorio.

Qué cambiar: pásate a Node 22.22.0 antes de actualizar. pnpm install responde a un desajuste de engines con [WARN] Unsupported engine e instala igualmente, así que el fallo no llega al instalar: llega más tarde, en un sitio donde no se menciona Node.

26. rebase.data ya no existe en tiempo de ejecución

Sección titulada «26. rebase.data ya no existe en tiempo de ejecución»

RebaseServerClient quitó data de su tipo para que el código de servidor tenga que decir bajo qué identidad corre una lectura, y la propiedad quedó luego en el objeto como alias en tiempo de ejecución. Ahora se borra en el arranque: rebase.data es undefined.

Qué cambiar: en el código de servidor —funciones, crons, callbacks— escribe rebase.dataAsAdmin donde quieras el plano de administración y context.data donde quieras el del llamante. El código tipado ya recibía el error desde que cambió el tipo; lo que se rompe ahora es el código sin tipos, y el ai-instructions.md del andamiaje, que todavía le dice a un asistente que use rebase.data.<slug>. Ese archivo lo escribe rebase init: regenéralo o corrige la regla a mano. El código de navegador no cambia: rebase.data en el SDK cliente es el plano del usuario y se queda.

src/index.ts reexportaba dieciséis módulos y ponía 95 nombres en npm. Ahora exporta entry, manifest y bundle.

Qué cambiar: nada, salvo que importes de @rebasepro/cli —cosa improbable, porque no lo hacía ni este repositorio ni el plano de control—. Si lo haces: la CLI es un binario. Llama a rebase <command> como proceso en lugar de importar sus funciones de comando, cuyas firmas nunca fueron un contrato.

ui, forms, firebase, plugin-insights y cms-types declaraban react >=19.0.0, un rango cuya mitad inferior no puede satisfacer a app y cms en 19.2.7: un instalador que eligiera 19.0.0 producía un árbol que resolvía limpio y rompía al renderizar. Los cinco dicen ^19.2.7. El peer typescript de @rebasepro/app pasa de >=5.0.0 a ^6.0.0.

Qué cambiar: estar en React 19.2.7 o posterior, y en TypeScript 6 si usas el plugin de Vite de @rebasepro/app. Si tu instalación resolvía React 19.0.x, verás un aviso de peer hasta que subas; ese aviso es el árbol que ya estabas ejecutando, dicho en voz alta.

29. rebase cloud webhooks create toma --endpoint

Sección titulada «29. rebase cloud webhooks create toma --endpoint»

--url nombra el plano de control en toda esta familia de comandos, así que el segundo --url que este declaraba para el endpoint del cliente nunca podía ganar: el ejemplo documentado enviaba la URL del webhook al cliente como el host contra el que autenticarse.

Qué cambiar: rebase cloud webhooks create --endpoint https://… en cualquier script que cree uno. La grafía antigua no podía funcionar, así que no hay comportamiento que preservar: solo líneas que corregir.

El codificador de hojas compartido parsea con manga ancha, porque un código corto llega por el cable, y emite estricto, porque quien se lo pasa al serializador ha construido la condición a mano. serializeFilter({ a: ["gt", 5] }) lanza en vez de devolver gte.

Qué cambiar: solo si llamas directamente a los serializadores de @rebasepro/common. Usa los nombres de operador que declaran los tipos (gt, gte, lt, lte, …) en lugar de los códigos cortos de REST. Los constructores de consultas y el SDK ya los escribían así; lo nuevo es que la grafía equivocada ahora lo dice.


Siguiente: Qué salto te toca · Changelog.