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.
58 lines
2.3 KiB
58 lines
2.3 KiB
|
4 weeks ago
|
/**
|
||
|
|
* 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);
|
||
|
|
}
|