UNPKG

astro

Version:

Astro is a modern site builder with web best practices, performance, and DX front-of-mind.

80 lines (79 loc) 2.34 kB
import { fileURLToPath } from "node:url"; import { UnableToLoadLogger } from "../errors/errors-data.js"; import { AstroError } from "../errors/index.js"; import { normalizeLoggerConfig } from "./utils.js"; const VIRTUAL_LOGGER_ID = "virtual:astro:logger"; const RESOLVED_VIRTUAL_LOGGER_ID = "\0" + VIRTUAL_LOGGER_ID; async function emitDestination(config, resolveEntrypoint, nameOffset = 0) { let resolved = null; let cause; try { resolved = await resolveEntrypoint(config.entrypoint); } catch (e) { cause = e; } if (!resolved) { const error = new AstroError({ ...UnableToLoadLogger, message: UnableToLoadLogger.message(config.entrypoint) }); if (cause instanceof Error) { error.cause = cause; } throw error; } const name = `_logger${nameOffset}`; const imports = [`import ${name} from ${JSON.stringify(resolved)};`]; if (config.loggers) { const expressions = []; for (const nested of config.loggers) { const emitted = await emitDestination(nested, resolveEntrypoint, nameOffset + imports.length); imports.push(...emitted.imports); expressions.push(emitted.expression); } return { expression: `${name}([${expressions.join(", ")}])`, imports }; } return { expression: `${name}(${JSON.stringify(config.config) ?? "undefined"})`, imports }; } function vitePluginLogger({ settings }) { const loggerConfig = settings.config.logger; if (!loggerConfig) { return; } return { name: VIRTUAL_LOGGER_ID, enforce: "pre", resolveId: { filter: { id: new RegExp(`^${VIRTUAL_LOGGER_ID}$`) }, handler() { return RESOLVED_VIRTUAL_LOGGER_ID; } }, load: { filter: { id: new RegExp(`^${RESOLVED_VIRTUAL_LOGGER_ID}$`) }, async handler() { const importerPath = fileURLToPath(new URL("package.json", settings.config.root)); const { expression, imports } = await emitDestination( normalizeLoggerConfig(loggerConfig, settings.config.root), async (entrypoint) => (await this.resolve(entrypoint, importerPath))?.id ?? null ); return { code: `${imports.join("\n")} export default ${expression}; ` }; } } }; } export { VIRTUAL_LOGGER_ID, emitDestination, vitePluginLogger };