Ir al contenido

Actualización

Ocho saltos, de los más recientes a los más antiguos. Empieza en el que esté por encima de tu versión actual y avanza hacia abajo; o, si vienes de la versión 0.12, empieza desde abajo y avanza hacia arriba.

Estás en Leer Qué efectos tiene
0.24 0.24 → 0.25 ?count= en un listado REST pasa a ser el interruptor del conteo que hay detrás de meta.total, así que un filtro sobre una columna llamada count va dentro de ?where=; list_collections del MCP remoto envía su listado solo en el bloque de texto, sin structuredContent; y @rebasepro/app deja de exportar la tabla de traducciones al español es. Se rechazan un OPTIONS simple a una ruta sin manejador, los nombres de tabla que colisionan al arrancar, un upsert sobre la colección de usuarios, page junto con offset, una cadena vacía en un campo obligatorio y una contraseña elegida por un administrador que no cumple la política de contraseñas. Las sesiones duran por defecto 30 días de inactividad, client.cron llama a /api/admin/cron, las lecturas sin conexión que no pueden responderse por completo fallan con OFFLINE, y desaparecen algunas exportaciones internas y props sin uso.
0.23 0.23 → 0.24 El SQL que generan db push y db generate sale de drizzle/ y pasa a .rebase/sql/, que no se confirma; la opción --generate de rebase dev desaparece porque dev siempre regenera los tipos del SDK, y una edición de esquema en vivo no confirma SQL. Los permisos pasan a ser alcances: las superficies de administración piden un alcance en lugar del rol de administrador, las claves de API tienen alcances en lugar de una lista de permisos y un indicador admin, y schema-admin deja de ser administrador. Un --collections relativo se lee desde donde se ejecuta el comando, un upsert en una fila de la papelera y una actualización que cambia una clave se rechazan, el endpoint remoto de MCP toma los argumentos del SDK, y los sockets de tiempo real abiertos, los enlaces de verificación de correo electrónico, signUp y los códigos de recuperación de MFA cambian cómo tratan una sesión.
0.21 – 0.22 0.21 → 0.23 Una clave de API en una ruta anidada necesita read sobre sus padres, las variables numéricas y las duraciones de sesión ilegibles impiden el arranque, un repositorio de autenticación propio necesita unlinkUserIdentity, y convertir un invitado en cuenta exige el captcha de register. 0.22 no declara ningún cambio incompatible, así que es un solo salto desde 0.21.
0.18 – 0.20 0.18 → 0.21 context.client.data deja de compilar en un callback de colección —consulta a través de context.data— y selectedEntities da paso a una selección que puede representar filas que nadie ha cargado. 0.19 y 0.20 no declaran cambios incompatibles, por lo que este es un solo salto desde 0.18.
0.17 0.17 → 0.18 Once cambios incompatibles, la mayoría son errores de compilación en lugar de cambios silenciosos de comportamiento. rebase.data desaparece en tiempo de ejecución, los rangos de dependencias peer se restringen a intercalaciones (^), y la versión mínima de Node pasa a 22.22.0.
0.14 – 0.16 0.14 → 0.17 Los paquetes de administración se renombran, los recursos se declaran en lugar de configurarse y un bundle compilado antes no arrancará en un entorno de ejecución actual. 0.15 y 0.16 no rompen nada, por lo que este es un solo salto desde 0.14.
0.13 0.13 → 0.14 Cada clave en tránsito usa camelCase, y el inicio de sesión anónimo pasa a ser opcional (opt-in).
0.12 0.12 → 0.13 El salto más grande, y el único que cambia quién puede leer tus datos. Elimina el esquema auth, renombra paquetes, cambia el significado de id, descarta CJS, migra el panel de administración a react-router 8 y corrige tres formas en las que se podía conceder acceso no solicitado.

Las secciones de cada página están en el orden en que debes aplicarlas, y cada una indica el síntoma que de otro modo intentarías depurar por el extremo equivocado.

Luego, independientemente del salto que hayas dado:

[ ] grep for authenticated() and (auth|rebase).uid() IS NOT NULL in config/collections/
[ ] decide the intent of each rule; rewrite the ones that meant "public"
[ ] replace not(authenticated()) with serverContext()
[ ] if realtime.requireAuth was true with an AuthAdapter, treat the socket as
having been open — verify RLS on every subscribable collection (section 2)
[ ] SELECT ... FROM pg_policies — record the qual of every policy BEFORE
[ ] update package names and imports
[ ] grep for rebase.data — it is now rebase.dataAsAdmin (section 8)
[ ] grep for the other ten removed deprecated exports (section 8)
[ ] drop react-router-dom; import RouterProvider from "react-router/dom"
[ ] check node >= 22.22.0 and react >= 19.2.7 (react-router 8 requires both)
[ ] move defaultSecurityRules into config/collections/index.ts
[ ] grep for .userId
[ ] grep for row.id on tables not keyed on id
[ ] run db push
[ ] run rebase doctor --policies — expect no Insecure or Orphaned entries
[ ] SELECT ... FROM pg_policies again — confirm every intended change landed
[ ] exercise the app signed OUT, in a private window — watch the websocket too
--- 0.13 → 0.14 (part 2) ---
[ ] re-run rebase generate-sdk, then build — the compiler finds row.author_id
[ ] grep for snake_case where/orderBy keys; a stale one is a 400, not a warning
[ ] grep for raw fetch consumers reading row.<something>_id — these read
undefined and raise nothing
[ ] if the project was introspected, re-run rebase schema introspect
[ ] decide anonymous sign-in: set auth.allowAnonymous: true, or confirm you
never used it (grep for signInAnonymously)
[ ] drop @rebasepro/client-postgres from package.json
--- 0.14 → 0.17 (part 3) ---
[ ] rename @rebasepro/admin → @rebasepro/cms and admin-types → cms-types,
and RebaseAdmin → RebaseCMS
[ ] move dataSources / storageSources out of the backend config into
rebase.json and config/, then `rebase build` — an old bundle will not boot
[ ] grep collections for admin.titleProperty; it is refused at boot now
[ ] grep crons for ctx.client and for `userId` as an identity key
[ ] rename --legacy to --workspace wherever build/start is scripted
[ ] if you implement EmailService yourself, `send` must return a result

rebase doctor --policies es el que debes conectar a CI: finaliza con código distinto de cero si una política aún contiene la tautología permisiva o si una política anterior fue reemplazada por un push previo. Las lecturas de pg_policies antes y después siguen valiendo la pena el minuto invertido: te muestran las expresiones en sí mismas, que es la única forma de detectar una política que falla en modo abierto (fail-open) escrita con una sintaxis que el detector no reconoce. Ni los paquetes ni el sistema de tipos te lo advertirán: el cambio reside en la base de datos, y db push es lo único que lo aplica allí.