summaryrefslogtreecommitdiff
path: root/_tools/cm-esbuild/scripts
diff options
context:
space:
mode:
authorHizbu Azka <hanifan.azka@gmail.com>2026-10-21 14:31:59 +0700
committerHizbu Azka <hanifan.azka@gmail.com>2026-10-21 15:11:13 +0700
commit976c0d950461ab884a9d107659d3ba103d8cb269 (patch)
treee86016b3d1c966fb3c11f16c52b99f0de56a5b94 /_tools/cm-esbuild/scripts
parent8ad5216903950b5e3785b3729068ca48bd5232e0 (diff)
selfhost cm, add dark theme
Diffstat (limited to '_tools/cm-esbuild/scripts')
-rw-r--r--_tools/cm-esbuild/scripts/deploy.js37
1 files changed, 37 insertions, 0 deletions
diff --git a/_tools/cm-esbuild/scripts/deploy.js b/_tools/cm-esbuild/scripts/deploy.js
new file mode 100644
index 0000000..a06130e
--- /dev/null
+++ b/_tools/cm-esbuild/scripts/deploy.js
@@ -0,0 +1,37 @@
+const fs = require('fs'), path = require('path'), crypto = require('crypto');
+
+const site = process.argv[2];
+if (!site) { console.error('usage: node scripts/publish.js <path-to-jekyll-site>'); 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 => `<link rel="modulepreload" href="{{ '/assets/cm/${f}' | relative_url }}">`)
+ .join('\n');
+
+const html = `${preload}\n<script type="importmap">\n{\n "imports": {\n${imports}\n }\n}\n</script>\n`;
+fs.mkdirSync(path.join(site, '_includes'), { recursive: true });
+fs.writeFileSync(path.join(site, '_includes', 'cm-importmap.html'), html);
+console.log('published, version', v);