gitdataai/scripts/generate-changelog-data.js
ZhenYi ab1ef0d1a7 feat(changelog): add /changelog page with i18n support
Create changelog page with language tabs (EN/CN/DE/FR),
timeline layout, and MDX rendering. Add generate script
to build changelog data from mdx files.
2026-04-27 21:59:50 +08:00

90 lines
2.2 KiB
JavaScript

/**
* Generates changelog data file for the frontend.
* Run with: node scripts/generate-changelog-data.js
*/
const fs = require('fs');
const path = require('path');
const CHANGELOG_DIR = path.join(__dirname, '..', 'changelog');
const OUTPUT_FILE = path.join(__dirname, '..', 'src', 'data', 'changelog-data.ts');
const LANGUAGES = ['en', 'cn', 'de', 'fr'];
function readFile(filePath) {
try {
return fs.readFileSync(filePath, 'utf-8');
} catch {
return null;
}
}
function parseMdx(content) {
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
if (!frontmatterMatch) {
return { title: '', body: content };
}
const body = frontmatterMatch[2].trim();
const frontmatter = frontmatterMatch[1];
const titleMatch = frontmatter.match(/title:\s*["']?([^"'\n]+)["']?/);
const title = titleMatch ? titleMatch[1].trim() : '';
return { title, body };
}
// Get all unique dates
const dates = [];
const files = fs.readdirSync(CHANGELOG_DIR);
files.forEach(file => {
const match = file.match(/^(\d{4}-\d{2}-\d{2})-(\w+)\.mdx$/);
if (match) {
const date = match[1];
const lang = match[2];
if (!dates.includes(date)) {
dates.push(date);
}
}
});
// Sort dates descending
dates.sort((a, b) => new Date(b) - new Date(a));
// Generate data for each language
const data = {};
LANGUAGES.forEach(lang => {
data[lang] = dates.map(date => {
const filePath = path.join(CHANGELOG_DIR, `${date}-${lang}.mdx`);
const content = readFile(filePath);
if (!content) {
return null;
}
const { title, body } = parseMdx(content);
return {
date,
title,
lang,
author: 'ZhenYi',
body,
};
}).filter(Boolean);
});
// Generate TypeScript file
const tsContent = `// Auto-generated from changelog/*.mdx files
// Run: node scripts/generate-changelog-data.js
export type ChangelogEntry = {
date: string;
title: string;
lang: string;
author: string;
body: string;
};
export const CHANGELOG_DATA: Record<string, ChangelogEntry[]> = ${JSON.stringify(data, null, 2)};
export const CHANGELOG_LANGUAGES = ${JSON.stringify(LANGUAGES)};
`;
fs.writeFileSync(OUTPUT_FILE, tsContent);
console.log(`Generated ${OUTPUT_FILE}`);