#!/usr/bin/env node /** * Liest contentful-export.json und trägt sys.createdAt der Post-Einträge * als Feld "created" in die bestehenden Dateien unter content/de/post/ ein. * * Zuordnung: Unser _slug = "post-" + slugify(fields.slug ohne führendes /) * Aufruf: node scripts/post-add-created-from-export.mjs [Pfad-zum-Export] * Default: ../www.windwiderstand.de/contentful-export.json */ import fs from "fs"; import path from "path"; import { fileURLToPath } from "url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const ROOT = path.resolve(__dirname, ".."); const POST_DIR = path.join(ROOT, "content", "de", "post"); const DEFAULT_EXPORT = path.join(ROOT, "..", "www.windwiderstand.de", "contentful-export.json"); function slugify(value) { if (value == null || value === "") return ""; return String(value) .replace(/^\//, "") .replace(/\//g, "-") .replace(/[^a-zA-Z0-9_-]+/g, "-") .replace(/-+/g, "-") .replace(/^-|-$/g, "") || "untitled"; } function postSlugFromEntry(entry) { const f = entry?.fields || {}; const slugRaw = f.slug ?? f.id ?? ""; const base = slugify(slugRaw); return base ? `post-${base}` : null; } function main() { const exportPath = process.argv[2] || DEFAULT_EXPORT; if (!fs.existsSync(exportPath)) { console.error("Export nicht gefunden:", exportPath); process.exit(1); } const data = JSON.parse(fs.readFileSync(exportPath, "utf8")); const items = data?.byType?.post?.items ?? []; const slugToCreated = new Map(); for (const entry of items) { const slug = postSlugFromEntry(entry); const createdAt = entry?.sys?.createdAt; if (slug && createdAt) slugToCreated.set(slug, createdAt); } console.log("Export: %d Posts mit createdAt, %d eindeutige Slugs", items.length, slugToCreated.size); if (!fs.existsSync(POST_DIR)) { console.error("Verzeichnis nicht gefunden:", POST_DIR); process.exit(1); } const files = fs.readdirSync(POST_DIR).filter((f) => f.endsWith(".json5")); let updated = 0; let skipped = 0; for (const file of files) { const filePath = path.join(POST_DIR, file); const raw = fs.readFileSync(filePath, "utf8"); let obj; try { obj = JSON.parse(raw); } catch (e) { console.warn("Überspringe (kein gültiges JSON):", file); skipped++; continue; } const _slug = obj._slug; if (!_slug) { console.warn("Kein _slug in:", file); skipped++; continue; } const created = slugToCreated.get(_slug); if (!created) { skipped++; continue; } if (obj.created === created) { skipped++; continue; } obj.created = created; const keys = Object.keys(obj); const order = [ "_slug", "slug", "linkName", "headline", "subheadline", "excerpt", "created", "postImage", "postTag", "important", "date", "content", "showCommentSection", "row1JustifyContent", "row1AlignItems", "row1Content", "seoTitle", "seoDescription", "seoMetaRobots", ]; const ordered = {}; for (const k of order) { if (k in obj) ordered[k] = obj[k]; } for (const k of keys) { if (!(k in ordered)) ordered[k] = obj[k]; } fs.writeFileSync(filePath, JSON.stringify(ordered, null, 2) + "\n", "utf8"); console.log(" + created: %s -> %s", _slug, created); updated++; } console.log("Fertig: %d aktualisiert, %d übersprungen.", updated, skipped); } main();