import fs from "node:fs"; import path from "node:path"; import glob from "fast-glob"; async function main() { const blogRoot = path.join(process.cwd(), "src/content/blog"); const entries = await glob("**/*.mdx", { cwd: blogRoot }); const manifest = new Map(); for (const entry of entries) { const segments = entry.split("/"); if (segments.length < 2) { continue; } const [slug, filename] = segments; if (!slug || slug.startsWith("[")) { continue; } const locale = filename.replace(/\.mdx$/, ""); if (!locale) { continue; } if (!manifest.has(slug)) { manifest.set(slug, new Set()); } manifest.get(slug).add(locale); } const sortedManifest = Array.from(manifest.entries()).sort(([a], [b]) => a.localeCompare(b) ); const lines = []; lines.push("// This file is auto-generated by scripts/generate-blog-manifest.mjs"); lines.push("/// "); lines.push("// Do not edit manually.\n"); lines.push("export const blogModuleLoaders = {"); for (const [slug, locales] of sortedManifest) { lines.push(` "${slug}": {`); const sortedLocales = Array.from(locales).sort((a, b) => a.localeCompare(b)); for (const locale of sortedLocales) { // 使用 path.posix 确保导入路径始终使用 / (跨平台兼容) const importPath = path.posix.join( "..", "content", "blog", slug, `${locale}.mdx` ); lines.push(` "${locale}": () => import("${importPath}"),`); } lines.push(" },"); } lines.push("} as const;\n"); const targetPath = path.join(process.cwd(), "src/lib/blog-manifest.generated.ts"); fs.writeFileSync(targetPath, lines.join("\n"), "utf-8"); } main().catch((error) => { console.error(error); process.exitCode = 1; });