126 lines
3.5 KiB
JavaScript
126 lines
3.5 KiB
JavaScript
#!/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();
|