From 5e247f448c12746de0f9e12a0f402dce651b3e03 Mon Sep 17 00:00:00 2001 From: ErickHub192 Date: Sat, 15 Aug 2026 13:59:12 -0600 Subject: [PATCH] El link publicado es el que no cambia El primer deploy que funciono dejo la app en 3217c505.lofi-lab-22.pages.dev, y la URL estable del proyecto decia "Nothing is here yet". Dos cosas juntas: Wrangler sube a una rama de preview si no se le dice a cual, aunque el proyecto tenga su production-branch puesta. Ahora se le pasa `--branch=main`, que coincide con la que se usa al crearlo. Y se mostraba la URL que wrangler imprime, que es la de ESE deploy: lleva un prefijo distinto cada vez. El link que alguien comparta se habria quedado congelado en la version de ese momento, y republicar no lo actualizaria. Ahora se devuelve la estable del proyecto, que siempre apunta a lo ultimo. Se confirma contra la salida en vez de darla por hecha: si wrangler responde algo que no es del proyecto esperado, se respeta lo que dijo en vez de inventar una URL que quiza no carga. Co-Authored-By: Claude Opus 5 --- server/src/demos/publicar.ts | 21 +++++++++++++++++++- server/src/engine/publicar.ts | 36 ++++++++++++++++++++++++++--------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/server/src/demos/publicar.ts b/server/src/demos/publicar.ts index fdf96d9..3702b9e 100644 --- a/server/src/demos/publicar.ts +++ b/server/src/demos/publicar.ts @@ -2,7 +2,7 @@ import { writeFile, mkdir } from "node:fs/promises"; import { join } from "node:path"; import { createWorkspace } from "../engine/workspace.js"; import { detectBuild, buscarSalida } from "../engine/preview.js"; -import { credencialDeDeploy, motivoDeFallo } from "../engine/publicar.js"; +import { credencialDeDeploy, motivoDeFallo, sacarUrl } from "../engine/publicar.js"; /** * Demo: qué se compila y qué se sube al publicar la app de una sala. @@ -108,6 +108,25 @@ async function main() { check("y no la barra decorativa", !dicho.includes("─"), dicho); } + console.log("\n9. El link que se comparte es el que no cambia"); + { + /** + * El bug que cubre: wrangler imprime la URL de ESE deploy, con un prefijo + * distinto cada vez. Se mostró esa, y el link que se comparte se habría + * quedado congelado en la versión de ese momento. + */ + const salida = `✨ Deployment complete! Take a peek over at https://3217c505.una-sala.pages.dev`; + const url = sacarUrl(salida, "una-sala"); + check("devuelve la estable", url === "https://una-sala.pages.dev", String(url)); + + // Si wrangler responde algo que no es del proyecto esperado, se prefiere lo + // que dijo antes que inventar una URL que a lo mejor no carga. + const otra = sacarUrl("https://otra-cosa.pages.dev", "una-sala"); + check("si no es del proyecto, se respeta lo que dijo", otra === "https://otra-cosa.pages.dev"); + + check("sin URL en la salida, no se inventa una", sacarUrl("todo mal", "una-sala") === null); + } + console.log(`\n${pass} pasaron, ${fail} fallaron\n`); process.exit(fail > 0 ? 1 : 0); } diff --git a/server/src/engine/publicar.ts b/server/src/engine/publicar.ts index 97177da..536be95 100644 --- a/server/src/engine/publicar.ts +++ b/server/src/engine/publicar.ts @@ -120,9 +120,17 @@ export async function publicarSala( ) .catch(() => null); + /** + * `--branch=main` no es opcional: sin él wrangler sube a una rama de preview, + * y entonces la URL estable del proyecto queda vacía ("Nothing is here yet") + * mientras el contenido solo vive en una URL con prefijo que cambia en cada + * publicación. Pasó en el primer deploy que funcionó. + * + * Tiene que coincidir con la `--production-branch` de arriba. + */ const subido = await runner.exec( `${cd}npx --yes wrangler@latest pages deploy ${JSON.stringify(salida)} ` + - `--project-name=${JSON.stringify(proyecto)} --commit-dirty=true`, + `--project-name=${JSON.stringify(proyecto)} --branch=main --commit-dirty=true`, { timeoutMs: 600_000, maxOutput: 8000, @@ -130,7 +138,7 @@ export async function publicarSala( }, ); - const url = sacarUrl(subido.stdout + "\n" + subido.stderr); + const url = sacarUrl(subido.stdout + "\n" + subido.stderr, proyecto); if (subido.code !== 0 || !url) { // El texto crudo de wrangler NO se propaga: lleva el account id y, cuando // falla la autenticación, fragmentos de lo que se le pasó. Se traduce a lo @@ -141,15 +149,25 @@ export async function publicarSala( } /** - * La URL que wrangler imprime al terminar. + * La URL de la app, que es la ESTABLE del proyecto. + * + * Wrangler imprime la de este deploy en concreto, con un prefijo que cambia cada + * vez (`3217c505.la-sala.pages.dev`). Esa sirve para ver lo que se acaba de + * subir, pero es la equivocada para compartir: el link que le pasaste a alguien + * se quedaría mostrando la versión de ese momento, y republicar no lo + * actualizaría. * - * Se busca en la salida en vez de armarla como `${proyecto}.pages.dev` porque el - * primer deploy de un proyecto responde con una URL por rama, y adivinarla daría - * un link que no carga. + * La estable (`la-sala.pages.dev`) siempre apunta a lo último, que es lo que se + * quiere de un link que se comparte. Se confirma contra la salida en vez de + * darla por hecha: si wrangler no menciona el proyecto, algo salió distinto de + * lo esperado y es mejor no inventar una URL que quizá no carga. */ -function sacarUrl(salida: string): string | null { - const m = salida.match(/https:\/\/[a-z0-9.-]*\.pages\.dev[^\s]*/i); - return m ? m[0] : null; +export function sacarUrl(salida: string, proyecto: string): string | null { + const conPrefijo = salida.match(/https:\/\/[a-z0-9.-]*\.pages\.dev[^\s]*/i)?.[0]; + if (!conPrefijo) return null; + return conPrefijo.includes(`${proyecto}.pages.dev`) + ? `https://${proyecto}.pages.dev` + : conPrefijo; } /**