You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/scripts/construir.mjs

98 lines
3.3 KiB

/**
* Compila el sitio para los tests end-to-end.
*
* Existe por un motivo concreto: en Windows, el empaquetador nativo de Vite 8
* (rolldown) revienta con SIGSEGV *al terminar el proceso*, de forma
* intermitente —unas dos de cada tres veces en la máquina donde se escribió
* esto—. El build en sí se completa: los artefactos quedan escritos y son
* correctos; lo que falla es el cierre del proceso.
*
* `vite build` a secas devuelve entonces un código de error que tumba el
* arranque del servidor de Playwright, y con él toda la suite, por algo que no
* tiene que ver con el código del proyecto.
*
* Este envoltorio comprueba lo único que importa —que los artefactos existan y
* se hayan escrito en esta ejecución— y avisa por consola cuando ha tenido que
* pasar por alto ese cierre sucio. Un build que falla de verdad no deja
* artefactos nuevos, así que sigue fallando aquí.
*
* `npm run build` NO usa esto: el despliegue ejecuta `vite build` tal cual, que
* es lo que esperan las plataformas y lo que hay que arreglar si el fallo se
* reproduce en otro sitio.
*/
import { spawnSync } from 'node:child_process';
import { readdirSync, statSync } from 'node:fs';
import { resolve } from 'node:path';
/**
* Con `--panel` compila la administración en vez del sitio. Son dos
* aplicaciones del mismo repositorio, cada una con su carpeta de salida, y las
* pruebas necesitan las dos.
*/
const PANEL = process.argv.includes('--panel');
const SALIDA = PANEL ? 'build-panel' : 'build';
const GENERADO = PANEL ? '.svelte-kit-panel' : '.svelte-kit';
/**
* Archivos que adapter-node deja siempre en un build correcto.
*
* No está `server/index.js`: el adaptador no genera ese archivo. El servidor
* sale troceado en `server/chunks/`, y quien lo arranca es `index.js`.
* Comprobarlo costó un rato de creer que el build fallaba cuando lo que fallaba
* era esta lista.
*/
const ARTEFACTOS = [`${SALIDA}/index.js`, `${SALIDA}/handler.js`];
/** Directorios que tienen que haber quedado con algo dentro. */
const DIRECTORIOS = [
`${SALIDA}/client`,
`${SALIDA}/server/chunks`,
`${GENERADO}/output/client/_app`
];
const inicio = Date.now();
const resultado = spawnSync('npx', ['vite', 'build'], {
stdio: 'inherit',
shell: process.platform === 'win32',
env: PANEL ? { ...process.env, APP: 'panel' } : process.env
});
if (resultado.status === 0) process.exit(0);
const faltan = [];
for (const directorio of DIRECTORIOS) {
try {
if (readdirSync(resolve(directorio)).length === 0) {
faltan.push(`${directorio} (vacío)`);
}
} catch {
faltan.push(`${directorio} (no existe)`);
}
}
for (const artefacto of ARTEFACTOS) {
try {
const info = statSync(resolve(artefacto));
// Un artefacto viejo es de un build anterior: no cuenta.
if (info.mtimeMs < inicio) faltan.push(`${artefacto} (no se ha regenerado)`);
} catch {
faltan.push(`${artefacto} (no existe)`);
}
}
if (faltan.length > 0) {
console.error('\nEl build ha fallado de verdad. Falta:');
for (const f of faltan) console.error(` - ${f}`);
process.exit(resultado.status ?? 1);
}
console.warn(
`\n[construir] El empaquetador ha salido con código ${resultado.status} (${resultado.signal ?? 'sin señal'}),` +
'\n[construir] pero los artefactos están completos y recién escritos. Es el cierre' +
'\n[construir] sucio conocido de rolldown en Windows; se continúa.\n'
);
process.exit(0);

Powered by TurnKey Linux.