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.
