/** * El gancho de resolución para poder cargar código del sitio desde un script. * * Hace dos cosas que Vite hace y Node no: * * - `$lib/x` pasa a ser `src/lib/x`. * - Los imports sin extensión —`./fields`, `$lib/utils/date`— encuentran su * `.ts`. En ESM, Node exige la ruta completa; el código del proyecto se * escribe como se escribe con un empaquetador delante. * * Existe para que el volcado pueda reutilizar los analizadores del sitio en * lugar de copiarlos. Una copia «parecida» es lo que garantiza que un día la * base y la web cuenten cosas distintas y nadie lo note. */ import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; const RAIZ_LIB = path.resolve('src/lib'); /** * Los módulos que SvelteKit inyecta en tiempo de compilación y fuera de la * aplicación no existen. Se sustituyen por lo mínimo que necesita el código que * el volcado reutiliza; `$app/types` no aparece porque solo se importa como * tipo y el borrado de tipos se lo lleva por delante. */ const SUSTITUTOS = { '$app/paths': path.resolve('scripts/db/app-paths.mjs'), '$env/dynamic/private': path.resolve('scripts/db/env-privado.mjs') }; /** Prueba el archivo tal cual, con extensión, y como carpeta con índice. */ function primeroQueExista(base) { const candidatos = [base, `${base}.ts`, `${base}.js`, `${base}.mjs`, path.join(base, 'index.ts')]; return candidatos.find((c) => fs.existsSync(c) && fs.statSync(c).isFile()); } export function resolve(especificador, contexto, siguiente) { if (SUSTITUTOS[especificador]) { return { url: pathToFileURL(SUSTITUTOS[especificador]).href, shortCircuit: true }; } if (especificador.startsWith('$lib/')) { const encontrado = primeroQueExista(path.join(RAIZ_LIB, especificador.slice(5))); if (!encontrado) throw new Error(`No encuentro ${especificador}`); return { url: pathToFileURL(encontrado).href, shortCircuit: true }; } // Relativo y sin extensión: se completa igual que haría el empaquetador. if (especificador.startsWith('.') && !path.extname(especificador) && contexto.parentURL) { const desde = path.dirname(fileURLToPath(contexto.parentURL)); const encontrado = primeroQueExista(path.resolve(desde, especificador)); if (encontrado) return { url: pathToFileURL(encontrado).href, shortCircuit: true }; } return siguiente(especificador, contexto); }