RustyCMS: file-based headless CMS — API, Admin UI (content, types, assets), Docker/Caddy, image transform; only demo type and demo content in version control
Made-with: Cursor
This commit is contained in:
125
scripts/post-add-created-from-export.mjs
Normal file
125
scripts/post-add-created-from-export.mjs
Normal file
@@ -0,0 +1,125 @@
|
||||
#!/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();
|
||||
Reference in New Issue
Block a user