fix: clean vault/vaults output in n8n
Build and Push Docker Container / build-and-push (push) Successful in 4m46s

- Parse vaults stdout into structured {name,path} pairs

- For vault/vaults, return parsed JSON directly (no stdout wrapper)

- Keep minimal output for all operations: stdout or parsed_stdout

- Bump n8n node package to 0.2.3
This commit is contained in:
2026-06-24 12:25:27 +02:00
parent a953214c20
commit f3762eec82
4 changed files with 27 additions and 16 deletions
@@ -264,9 +264,9 @@ export class ObsidianApi implements INodeType {
// Always keep n8n output minimal/clean. // Always keep n8n output minimal/clean.
// - Prefer parsed stdout (e.g. vault/vaults) // - Prefer parsed stdout (e.g. vault/vaults)
// - Otherwise keep stdout as-is // - Otherwise keep stdout as-is
const stdoutValue = (result as any).parsed_stdout ?? result.stdout; const parsed = (result as any).parsed_stdout;
const out: any = { stdout: stdoutValue }; const out: any = parsed ? parsed : { stdout: result.stdout };
if (result.stderr) out.stderr = result.stderr; if (!parsed && result.stderr) out.stderr = result.stderr;
if (result.timed_out) out.timed_out = result.timed_out; if (result.timed_out) out.timed_out = result.timed_out;
returnData.push({ json: out, pairedItem: { item: itemIndex } }); returnData.push({ json: out, pairedItem: { item: itemIndex } });
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "n8n-nodes-obsidian-cli-api", "name": "n8n-nodes-obsidian-cli-api",
"version": "0.2.2", "version": "0.2.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "n8n-nodes-obsidian-cli-api", "name": "n8n-nodes-obsidian-cli-api",
"version": "0.2.2", "version": "0.2.3",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/node": "^24.0.0", "@types/node": "^24.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "n8n-nodes-obsidian-cli-api", "name": "n8n-nodes-obsidian-cli-api",
"version": "0.2.2", "version": "0.2.3",
"description": "n8n community nodes for the Obsidian API Docker service backed by the official Obsidian CLI.", "description": "n8n community nodes for the Obsidian API Docker service backed by the official Obsidian CLI.",
"license": "MIT", "license": "MIT",
"homepage": "https://git.yiprawr.dev/Docker/obsidian-api", "homepage": "https://git.yiprawr.dev/Docker/obsidian-api",
@@ -144,14 +144,12 @@ function extractErrorMessage(body: unknown): string {
} }
function maybeParseStdout(result: ObsidianCommandResult): IDataObject | undefined { function maybeParseStdout(result: ObsidianCommandResult): IDataObject | undefined {
const lastArg = result.command[result.command.length - 1]; const cmd = result.command;
if (lastArg !== 'vault' && lastArg !== 'vaults') return undefined; const hasVault = cmd.includes('vault');
const hasVaults = cmd.includes('vaults');
if (!hasVault && !hasVaults) return undefined;
// Obsidian CLI prints either:
// vault:
// key<TAB>value\nkey<TAB>value\n...
// vaults:
// often one vault per line (names) or a similar tabular output.
const lines = (result.stdout || '') const lines = (result.stdout || '')
.split(/\r?\n/) .split(/\r?\n/)
.map((l) => l.trim()) .map((l) => l.trim())
@@ -159,11 +157,24 @@ function maybeParseStdout(result: ObsidianCommandResult): IDataObject | undefine
if (!lines.length) return undefined; if (!lines.length) return undefined;
const isKv = lines.some((l) => l.includes('\t')); // vaults output is typically a 2-col tabular format: <name>\t<containerPath>
if (!isKv && lastArg === 'vaults') { if (hasVaults) {
return { vaults: lines }; const vaults: Array<{ name: string; path: string }> = [];
for (const line of lines) {
const parts = line.split('\t');
if (parts.length < 2) continue;
const name = parts[0].trim();
const path = parts.slice(1).join('\t').trim();
if (!name || !path) continue;
vaults.push({ name, path });
} }
// Fallback: if parsing failed, return raw lines
if (!vaults.length) return { vaults: lines };
return { vaults };
}
// vault output is often key\tvalue pairs
const kv: Record<string, string | number> = {}; const kv: Record<string, string | number> = {};
for (const line of lines) { for (const line of lines) {
const parts = line.split('\t'); const parts = line.split('\t');