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.
98 lines
3.3 KiB
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);
|