|
1 | 1 | import { defineConfig, type HeadConfig } from "vitepress"; |
2 | 2 | import { tabsMarkdownPlugin } from "vitepress-plugin-tabs"; |
3 | 3 | import { withMermaid } from "vitepress-plugin-mermaid"; |
4 | | -import { readFileSync } from "node:fs"; |
5 | | -import { resolve } from "node:path"; |
| 4 | +import { readFileSync, readdirSync, statSync, mkdirSync, copyFileSync } from "node:fs"; |
| 5 | +import { resolve, join, relative, dirname } from "node:path"; |
6 | 6 |
|
7 | 7 | function loadEnvVar(key: string): string | undefined { |
8 | 8 | // process.env takes precedence (CI/hosting platforms set vars here) |
@@ -75,6 +75,29 @@ export default withMermaid( |
75 | 75 | ], |
76 | 76 | }, |
77 | 77 | }, |
| 78 | + buildEnd(siteConfig) { |
| 79 | + // Copy source .md files into dist/ for Accept: text/markdown negotiation. |
| 80 | + const srcDir = siteConfig.srcDir; |
| 81 | + const outDir = siteConfig.outDir; |
| 82 | + |
| 83 | + function walk(dir: string): void { |
| 84 | + for (const entry of readdirSync(dir)) { |
| 85 | + if (entry === ".vitepress" || entry === "public" || entry === "node_modules") continue; |
| 86 | + const abs = join(dir, entry); |
| 87 | + const stat = statSync(abs); |
| 88 | + if (stat.isDirectory()) { |
| 89 | + walk(abs); |
| 90 | + } else if (stat.isFile() && abs.endsWith(".md")) { |
| 91 | + const rel = relative(srcDir, abs); |
| 92 | + const dest = join(outDir, rel); |
| 93 | + mkdirSync(dirname(dest), { recursive: true }); |
| 94 | + copyFileSync(abs, dest); |
| 95 | + } |
| 96 | + } |
| 97 | + } |
| 98 | + |
| 99 | + walk(srcDir); |
| 100 | + }, |
78 | 101 | title: "Plane developer documentation", |
79 | 102 | description: |
80 | 103 | "Self-host Plane, integrate with our API, configure webhooks, and extend your project management platform. Complete guides for developers building on Plane.", |
|
0 commit comments