soul v4.2.0

Gotchas

Las trampas conocidas, con su sintoma y su salida.

Cloudflare y wrangler#

Los envs no heredan nada

Sintoma: funciona en wrangler dev y en produccion falla con el binding undefined.

Un env sin name crea un Worker aparte

Si omites name dentro de env.production, Wrangler despliega a <proyecto>-production en vez de a tu Worker. Sintoma: desplegaste, no hay errores, y el sitio sigue mostrando la version vieja. Le paso a NutriLabel.

db.exec no traga SQL real

Falla con SQL multilinea o con comentarios. Usa applySql de @jun/soul/testing.

SQLite no puede alterar un CHECK

Hay que reconstruir la tabla: respaldar las hijas, borrar, recrear el padre, recrear las hijas y restaurar. ALTER ADD COLUMN si es seguro.

Hono#

La barra final importa

app.route("/x", sub) con sub.get("/") matchea /x, no /x/. Es el origen de muchos 404 fantasma.

Invarianza de tipos con un Env mas ancho

Los middlewares de soul tipan Bindings: SoulEnv. Si tu Env lo extiende, TypeScript reclama por invarianza de genericos aunque en runtime sea correcto.

TypeScript
// El cast es seguro: Env es un superconjunto estructural de SoulEnv.
export const requireAdmin = auth.requireAdmin as unknown as () => MiddlewareHandler<{
  Bindings: Env;
  Variables: AuthVariables;
}>;

Plantillas HTML#

html`` devuelve un objeto String

La regla: String(...) solo en las funciones terminales, cuyo resultado va directo a la pagina. Los helpers intermedios devuelven el objeto sin coercionar; si devuelven string plano, el html\`\` receptor los escapa y el markup sale como texto literal.

Distribucion#

La forma corta de npm ignora tus alias SSH

Solo se empaqueta lo que esta en files

Al instalar por git, npm aplica las mismas reglas que en npm publish: el array files de package.json decide que viaja. Una carpeta que el paquete necesite en runtime y no este listada desaparece silenciosamente para los consumidores reales, aunque funcione en tu checkout local.

Git no versiona directorios vacios

Si el codigo asume que existe un directorio, hay que crearlo con fs.mkdirSync(dir, { recursive: true }) o dejar un .gitkeep.

Instalacion local con file: rompe tsc

Un consumidor que use file: termina con dos copias de hono y TypeScript ve dos identidades del mismo tipo. Los errores son espurios. Se arregla con paths en tsconfig.json, y para verificar de verdad conviene fiarse del tsc de dentro de soul.