var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) { if (typeof path === "string" && /^\.\.?\//.test(path)) { return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) { return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js"); }); } return path; }; import { access, readFile } from 'node:fs/promises'; import path from 'node:path'; import { pathToFileURL } from 'node:url'; const defaults = { title: 'easy-slides', description: 'Markdown presentations powered by easy-slides', slidesDir: 'slides', outDir: 'dist', exportDir: 'exports', }; export async function loadProjectConfig(cwd = process.cwd()) { const candidates = [ 'easy-slides.config.mjs', 'easy-slides.config.js', 'easy-slides.config.json', ]; for (const candidate of candidates) { const filename = path.join(cwd, candidate); if (!(await exists(filename))) continue; const loaded = candidate.endsWith('.json') ? JSON.parse(await readFile(filename, 'utf8')) : (await import(__rewriteRelativeImportExtension(`${pathToFileURL(filename).href}?t=${Date.now()}`))).default; return normalizeConfig(loaded); } return { ...defaults }; } export function normalizeConfig(value) { return { ...defaults, ...value, slidesDir: normalizeRelativePath(value?.slidesDir ?? defaults.slidesDir, 'slidesDir'), outDir: normalizeRelativePath(value?.outDir ?? defaults.outDir, 'outDir'), exportDir: normalizeRelativePath(value?.exportDir ?? defaults.exportDir, 'exportDir'), }; } function normalizeRelativePath(value, field) { const normalized = value.trim().replace(/[\\/]+$/, ''); const portable = normalized.replaceAll('\\', '/'); if (!normalized || path.isAbsolute(normalized) || portable === '..' || portable.startsWith('../')) throw new Error(`${field} 必须是项目内的相对路径`); return normalized; } async function exists(filename) { try { await access(filename); return true; } catch { return false; } } //# sourceMappingURL=config.js.map