const fs = require("fs"), path = require("path"), crypto = require("crypto"); const site = process.argv[2]; if (!site) { console.error("usage: node scripts/publish.js "); process.exit(1); } const dist = path.join(__dirname, "..", "dist"); const dest = path.join(site, "assets", "cm"); const jsFiles = fs .readdirSync(dist) .filter((f) => f.endsWith(".js")) .sort(); // version = hash of the bundle contents, so it only changes when the code does const h = crypto.createHash("sha1"); for (const f of jsFiles) h.update(fs.readFileSync(path.join(dist, f))); const v = h.digest("hex").slice(0, 10); // replace old files so stale chunks don't pile up fs.rmSync(dest, { recursive: true, force: true }); fs.mkdirSync(dest, { recursive: true }); for (const f of fs.readdirSync(dist)) fs.copyFileSync(path.join(dist, f), path.join(dest, f)); const entries = { "@codemirror/state": "state", "@codemirror/view": "view", "@codemirror/commands": "commands", "@codemirror/language": "language", "@uiw/codemirror-theme-github": "theme", }; const imports = Object.entries(entries) .map( ([spec, name]) => ` "${spec}": "{{ '/assets/cm/${name}.js' | relative_url }}?v=${v}"`, ) .join(",\n"); const preload = jsFiles .filter((f) => f.startsWith("chunk-")) .map( (f) => ``, ) .join("\n"); const html = `${preload}\n\n`; fs.mkdirSync(path.join(site, "_includes"), { recursive: true }); fs.writeFileSync(path.join(site, "_includes", "cm-importmap.html"), html); console.log("published, version", v);