80 lines
2.2 KiB
JavaScript
80 lines
2.2 KiB
JavaScript
|
|
#!/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}`);
|