From e041d6cb5a4371e1751c16303c77bcb32491d520 Mon Sep 17 00:00:00 2001 From: Fairpost Date: Sat, 4 Oct 2025 18:23:15 +0200 Subject: [PATCH 1/2] feat: Add support for edit-platform (cli only) --- README.md | 1 + src/cli.ts | 45 ++++++++++++++++++++++++++++++++++------ src/services/Fairpost.ts | 1 + 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index b960bf0..a83e650 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,7 @@ fairpost: @userid get-user fairpost: @userid get-feed fairpost: @userid get-platform --platform=xxx fairpost: @userid put-platform --platform=xxx << payload +fairpost: @userid edit-platform --platform=xxx (cli only) fairpost: @userid get-platforms [--platforms=xxx,xxx] fairpost: @userid setup-platform --platform=xxx fairpost: @userid test-platform --platform=xxx diff --git a/src/cli.ts b/src/cli.ts index cde4c70..dcd1ec4 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -3,6 +3,11 @@ Fairpost cli handler */ +import fs from "fs"; +import os from "os"; +import path from "path"; +import { spawnSync } from "child_process"; + import "./bootstrap.ts"; import Fairpost from "./services/Fairpost.ts"; @@ -45,7 +50,7 @@ if (!process.stdin.isTTY) { chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); } } -const PAYLOAD = chunks.length +let PAYLOAD = chunks.length ? await parsePayload(Buffer.concat(chunks)) : undefined; @@ -57,14 +62,33 @@ function getOption(key: string): boolean | string | null { return value.replace(`--${key}=`, ""); } +async function editPayload(getCommand: string, putCommand: string) { + const tmpFile = path.join(os.tmpdir(), "fairpost.tmp"); + fs.writeFileSync(tmpFile, await execute(getCommand), "utf8"); + const edit = spawnSync(`${process.env.EDITOR || "nano"} "${tmpFile}"`, { + stdio: "inherit", + shell: true, + }); + if (edit.error) { + console.error("Failed to launch editor:", edit.error); + process.exit(1); + } + if (edit.status !== 0) { + console.warn(`Editor exited with code ${edit.status} — assuming user cancelled.`); + process.exit(1); + } + PAYLOAD = await parsePayload(fs.readFileSync(tmpFile)); + return await execute(putCommand); +} + // main -async function main() { +async function execute(command: string): Promise { const operator = new Operator(OPERATOR, ["admin"], "cli", true); const user = USER && COMMAND !== "create-user" ? await User.getUser(USER) : undefined; try { - const output = await Fairpost.execute(operator, user, COMMAND, { + const output = await Fairpost.execute(operator, user, command, { dryrun: DRY_RUN, user: USER, password: PASSWORD, @@ -78,11 +102,20 @@ async function main() { payload: PAYLOAD, }); - console.info(JSON.stringify(output, JSONReplacer, "\t")); + return JSON.stringify(output, JSONReplacer, "\t"); } catch (e) { console.error((e as Error).message ?? e); + throw(e); } } -// eslint-disable-next-line @typescript-eslint/no-floating-promises -main(); +switch(COMMAND) { + case "edit-platform": + console.info(await editPayload("get-platform","put-platform")); + break; + default: + console.info(await execute(COMMAND)); +} + + + diff --git a/src/services/Fairpost.ts b/src/services/Fairpost.ts index 5e6bebf..7b0a237 100644 --- a/src/services/Fairpost.ts +++ b/src/services/Fairpost.ts @@ -974,6 +974,7 @@ class Fairpost { `${cmd} @userid get-feed`, `${cmd} @userid get-platform --platform=xxx`, `${cmd} @userid put-platform --platform=xxx << payload`, + `${cmd} @userid edit-platform --platform=xxx (cli only)`, `${cmd} @userid get-platforms [--platforms=xxx,xxx]`, `${cmd} @userid setup-platform --platform=xxx`, `${cmd} @userid test-platform --platform=xxx`, From 6c2e5a912282d9b0c82efa6913ce7ea94fb6b4f7 Mon Sep 17 00:00:00 2001 From: Fairpost Date: Sat, 4 Oct 2025 18:27:44 +0200 Subject: [PATCH 2/2] fix: Lint --- src/cli.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index dcd1ec4..3a0a3d3 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -74,7 +74,9 @@ async function editPayload(getCommand: string, putCommand: string) { process.exit(1); } if (edit.status !== 0) { - console.warn(`Editor exited with code ${edit.status} — assuming user cancelled.`); + console.warn( + `Editor exited with code ${edit.status} — assuming user cancelled.`, + ); process.exit(1); } PAYLOAD = await parsePayload(fs.readFileSync(tmpFile)); @@ -105,17 +107,14 @@ async function execute(command: string): Promise { return JSON.stringify(output, JSONReplacer, "\t"); } catch (e) { console.error((e as Error).message ?? e); - throw(e); + throw e; } } -switch(COMMAND) { +switch (COMMAND) { case "edit-platform": - console.info(await editPayload("get-platform","put-platform")); + console.info(await editPayload("get-platform", "put-platform")); break; default: console.info(await execute(COMMAND)); } - - -