Files
msd-core/sdk/src/query-raw-output-projection.ts

75 lines
2.2 KiB
TypeScript

import { formatStateLoadRawStdout } from './query/state-project-load.js';
function safeStringify(value: unknown): string {
const out = JSON.stringify(value, null, 2);
return out ?? String(value);
}
/**
* Raw output projection for native query results.
* Owns CLI-facing string contracts for raw mode commands.
*/
export function formatQueryRawOutput(registryCommand: string, data: unknown): string {
if (registryCommand === 'state.load') {
return formatStateLoadRawStdout(data);
}
if (registryCommand === 'commit') {
if (data == null || typeof data !== 'object' || Array.isArray(data)) {
return safeStringify(data);
}
const d = data as Record<string, unknown>;
if (d.committed === true) {
return d.hash != null ? String(d.hash) : 'committed';
}
if (d.committed === false) {
const r = String(d.reason ?? '');
if (
r.includes('commit_docs') ||
r.includes('skipped') ||
r.includes('gitignored') ||
r === 'skipped_commit_docs_false'
) {
return 'skipped';
}
if (r.includes('nothing') || r.includes('nothing_to_commit')) {
return 'nothing';
}
return r || 'nothing';
}
return safeStringify(data);
}
if (registryCommand === 'config-set') {
if (data == null || typeof data !== 'object' || Array.isArray(data)) {
return safeStringify(data);
}
const d = data as Record<string, unknown>;
if ((d.updated === true || d.set === true) && d.key !== undefined) {
const v = d.value;
if (v === null || v === undefined) {
return `${d.key}=`;
}
if (typeof v === 'object') {
return `${d.key}=${JSON.stringify(v)}`;
}
return `${d.key}=${String(v)}`;
}
return safeStringify(data);
}
if (registryCommand === 'state.begin-phase' || registryCommand === 'state begin-phase') {
if (data == null || typeof data !== 'object' || Array.isArray(data)) {
return safeStringify(data);
}
const d = data as Record<string, unknown>;
const u = d.updated as string[] | undefined;
return Array.isArray(u) && u.length > 0 ? 'true' : 'false';
}
if (typeof data === 'string') {
return data;
}
return safeStringify(data);
}