#!/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"], ["inspector/artifact_editor", "artifact-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}`);