Bun 1.3: cliente de base de datos nativo, decoradores TC39 y REPL, sin dependencias

Bun ha ido incorporando en sus últimas versiones 1.3.x algo que otros runtimes de JavaScript resuelven a base de dependencias: clientes de base de datos integrados de serie, sin instalar pg, better-sqlite3 ni ningún ORM para lo básico. A eso se suman decoradores TC39 estándar, soporte nativo en Windows ARM64 y un REPL propio. Vamos con ejemplos de lo que cambia en el código real.

Cliente de PostgreSQL sin dependencias

Bun trae Bun.sql, un cliente de PostgreSQL integrado en el runtime. No hace falta npm install pg ni configurar un pool aparte:

import { sql } from "bun";

const usuarios = await sql`
  SELECT id, nombre, email
  FROM usuarios
  WHERE activo = true
`;

console.log(usuarios);

El cliente soporta template literals con interpolación segura de parámetros (protege contra inyección SQL automáticamente, sin que el desarrollador tenga que acordarse de usar placeholders):

const email = "[email protected]";
const [usuario] = await sql`
  SELECT * FROM usuarios WHERE email = ${email}
`;

SQLite embebido, igual de directo

Para SQLite, Bun expone bun:sqlite, también sin dependencias externas y con una API síncrona pensada para scripts y herramientas de línea de comandos:

import { Database } from "bun:sqlite";

const db = new Database("app.db");

db.run("CREATE TABLE IF NOT EXISTS notas (id INTEGER PRIMARY KEY, texto TEXT)");
db.run("INSERT INTO notas (texto) VALUES (?)", ["Primera nota"]);

const notas = db.query("SELECT * FROM notas").all();
console.log(notas);

Decoradores TC39 estándar, no la versión legacy de TypeScript

Bun soporta ya los decoradores tal y como los define la propuesta TC39 (stage 3), la misma sintaxis que está llegando al resto del ecosistema JavaScript, y no la versión experimental que llevaba años usando TypeScript por su cuenta:

function logueado(valorOriginal: any, contexto: ClassMethodDecoratorContext) {
  const nombreMetodo = String(contexto.name);
  return function (this: any, ...args: any[]) {
    console.log(`Llamando a ${nombreMetodo} con`, args);
    return valorOriginal.call(this, ...args);
  };
}

class Servicio {
  @logueado
  buscar(id: number) {
    return `Resultado para ${id}`;
  }
}

La diferencia práctica es que este código ya no depende de flags de compilador como experimentalDecorators, funciona con la sintaxis que en algún momento entrará directamente en el propio JavaScript.

REPL nativo

Bun incluye ahora un REPL propio, sin pasar por Node.js ni por herramientas de terceros. Se invoca directamente desde la terminal:

bun repl

Y dentro se puede usar await de nivel superior sin envolver nada en una función async, algo que en el REPL clásico de Node siempre ha sido más incómodo:

> const res = await fetch("https://api.example.com/status");
> await res.json()

Windows ARM64, de serie

Bun añade soporte nativo para Windows en arquitectura ARM64, sin pasar por emulación x64. Para equipos con procesadores ARM (cada vez más comunes también en portátiles Windows, no solo en Mac), significa poder instalar y ejecutar Bun con el binario compilado para esa arquitectura en vez de arrastrar la capa de traducción.

¿Sustituye esto a Prisma o a un pool de conexiones dedicado?

No para todos los casos. Bun.sql y bun:sqlite están pensados para scripts, herramientas internas, prototipos y aplicaciones donde montar un ORM completo es más peso del que hace falta. Para proyectos grandes con migraciones complejas, relaciones profundas y necesidad de un query builder tipado de extremo a extremo, herramientas como Prisma o Drizzle siguen teniendo su sitio. Lo interesante es que ahora el punto de partida sin dependencias es mucho más alto de lo que era hace un año.

Relacionado: TypeScript 7: hasta 10 veces más rápido.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP