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/db/gancho-lib.mjs

58 lines
2.3 KiB

/**
* 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')
};
/** 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);
}

Powered by TurnKey Linux.