fix: clean vault/vaults output in n8n
Build and Push Docker Container / build-and-push (push) Successful in 4m46s
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:
@@ -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
@@ -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,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');
|
||||||
|
|||||||
Reference in New Issue
Block a user