import { test } from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const raiz = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); function archivosTs(dir: string): string[] { const out: string[] = []; for (const e of fs.readdirSync(dir, { withFileTypes: true })) { const p = path.join(dir, e.name); if (e.isDirectory()) out.push(...archivosTs(p)); else if (/\.(ts|mjs)$/.test(e.name)) out.push(p); } return out; } /** * `platform/` tiene que poder empaquetarse solo. * * Esta prueba existe porque `routes/dayClose.ts` importaba * `../../server/lib/time.ts`, la imagen de Docker no copia `server/`, y el * proceso moría al arrancar con ERR_MODULE_NOT_FOUND. El typecheck pasaba * limpio: en el equipo de desarrollo el archivo existe. Solo se vio al * contenerizar, que es demasiado tarde. */ test("platform/ no importa nada de server/: debe poder empaquetarse solo", () => { const culpables: string[] = []; for (const f of archivosTs(raiz)) { const src = fs.readFileSync(f, "utf8"); // Se buscan importaciones, no menciones en comentarios. const re = /(?:from|import)\s+["'][^"']*\.\.\/server\/[^"']*["']/g; if (re.test(src)) culpables.push(path.relative(raiz, f)); } assert.deepEqual( culpables, [], `estos archivos de platform/ importan de server/: ${culpables.join(", ")}` ); }); test("platform/ solo depende de shared/ hacia fuera de su carpeta", () => { const fuera = new Set(); for (const f of archivosTs(raiz)) { const src = fs.readFileSync(f, "utf8"); for (const m of src.matchAll(/(?:from|import)\s+["'](\.\.\/\.\.\/[^"']+)["']/g)) { const destino = m[1].replace(/^\.\.\/\.\.\//, "").split("/")[0]; if (destino !== "shared") fuera.add(`${path.relative(raiz, f)} → ${m[1]}`); } } assert.deepEqual([...fuera], [], "solo se admite salir hacia shared/"); });