File size: 983 Bytes
1187b53 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | type JsonMap = Record<string, unknown>;
function asJsonMap(value: unknown): JsonMap | null {
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
return value as JsonMap;
}
export type ParsedApiBody = {
data: JsonMap | null;
text: string;
};
export async function parseJsonOrText(response: Response): Promise<ParsedApiBody> {
const text = await response.text().catch(() => "");
if (!text) return { data: null, text: "" };
try {
const parsed = JSON.parse(text);
return { data: asJsonMap(parsed), text };
} catch {
return { data: null, text };
}
}
export function extractErrorMessage(parsed: ParsedApiBody, fallback: string): string {
const detail = parsed.data?.detail;
if (typeof detail === "string" && detail.trim()) return detail.trim();
const error = parsed.data?.error;
if (typeof error === "string" && error.trim()) return error.trim();
if (parsed.text.trim()) return parsed.text.trim();
return fallback;
}
|