bliss/bliss-cli/live-editor/install.js

80 lines
2.2 KiB
JavaScript
Raw Normal View History

2026-08-03 01:24:54 -04:00
#!/usr/bin/env node
// Install/update the live editor using Bliss's public CLI workflow. This file
// intentionally does not open the Bliss database directly.
const { spawnSync } = require("node:child_process");
const path = require("node:path");
const repo = path.resolve(__dirname, "../..");
const cli = path.join(repo, "bliss-cli/bliss");
function bliss(...args) {
const result = spawnSync(process.execPath, [cli, ...args], {
cwd: repo,
env: process.env,
encoding: "utf8",
});
if (result.status !== 0) throw new Error(result.stderr || result.stdout);
return result.stdout.trim();
}
function json(...args) {
return JSON.parse(bliss(...args));
}
const structures = json("structures");
let structure = structures.find((item) => item.name === "__bliss_live_editor");
if (!structure) {
const created = json("create-structure", "__bliss_live_editor");
structure = { id: created.id };
}
const structureId = String(structure.id);
bliss("update-settings", structureId, "--route-prefix", "/_bliss");
let state = json("structure", structureId);
if (!state.dbs.some((db) => String(db.id) === "0" && db.alias === "bliss")) {
bliss("attach-db", structureId, "0", "bliss");
}
const templates = [
["inspector/slideout", "slideout.eta"],
["inspector/route_editor", "route-editor.eta"],
["inspector/template_editor", "template-editor.eta"],
];
for (const [name, filename] of templates) {
let template = state.templates.find((item) => item.name === name);
if (!template) {
template = json("create-template", structureId, name);
}
bliss(
"update-template",
structureId,
String(template.id),
"--content-file",
path.join(__dirname, filename),
);
}
const routes = [
["/inspector", "inspector.js"],
["/editor/route/:id", "route-editor.js"],
["/editor/template/:id", "template-editor.js"],
];
for (const [routePath, filename] of routes) {
let route = state.routes.find(
(item) => item.verb === "GET" && item.path === routePath,
);
if (!route) {
route = json("create-route", structureId, "GET", routePath);
}
bliss(
"update-route",
structureId,
String(route.id),
"--handler-file",
path.join(__dirname, filename),
);
}
console.log(`live editor installed as Structure ${structureId}`);