/* ===================================================================== workspace-stempel.mjs — Versionsstempel an die Workspace-Dateien. WARUM ES DAS GIBT: Cloudflare speichert JS und CSS vier Stunden im Browser -- es ueberschreibt damit das "no-cache", das der Server korrekt schickt. Nach einem Deploy sah man deshalb bis zu vier Stunden lang die ALTE Oberflaeche, obwohl der Server laengst die neue auslieferte. Genau so ist es passiert: eine neue Kachel war live, aber nicht sichtbar. Die HTML-Seiten kommen dagegen immer frisch an (no-cache, DYNAMIC). Deshalb genuegt es, in der HTML einen Stempel an die Adressen zu haengen: Neue Seite -> neue Adresse -> Cloudflare kennt sie nicht -> frische Datei. Ohne Cloudflare-Einstellung, ohne Zutun von aussen. Der Stempel ist die Minute des Aufrufs. Er wird bei jedem Lauf neu gesetzt, auch wenn schon einer dasteht. AUFRUF: node tools/workspace-stempel.mjs Gehoert vor jeden Deploy, der JS oder CSS im Workspace anfasst. ===================================================================== */ import { readdirSync, readFileSync, writeFileSync } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; const HIER = dirname(fileURLToPath(import.meta.url)); const ORDNER = join(HIER, "..", "workspace"); const d = new Date(); const p = (n) => String(n).padStart(2, "0"); const STEMPEL = `${d.getFullYear()}${p(d.getMonth() + 1)}${p(d.getDate())}${p(d.getHours())}${p(d.getMinutes())}`; /* Trifft href="assets/..." und src="assets/..." -- mit oder ohne vorhandenen Stempel, damit wiederholte Laeufe nicht anhaengen. */ const MUSTER = /(href|src)="(assets\/(?:css|js)\/[A-Za-z0-9._-]+)(?:\?v=\d+)?"/g; let dateien = 0; let stellen = 0; for (const name of readdirSync(ORDNER)) { if (!name.endsWith(".html")) continue; const pfad = join(ORDNER, name); const alt = readFileSync(pfad, "utf8"); let n = 0; const neu = alt.replace(MUSTER, (_, was, datei) => { n += 1; return `${was}="${datei}?v=${STEMPEL}"`; }); if (neu !== alt) { writeFileSync(pfad, neu); dateien += 1; stellen += n; console.log(` ${name.padEnd(20)} ${n} Verweise`); } } console.log(`\nStempel ${STEMPEL} auf ${stellen} Verweise in ${dateien} Dateien gesetzt.`); if (!dateien) console.log("Nichts geaendert -- stimmt das Muster noch?");