src/normalization/valueParsers.ts

const TRUE_VALUES = new Set(["1", "true", "yes", "on"]); const FALSE_VALUES = new Set(["0", "false", "no", "off"]);

type JsonParseOptions = { coerceToString?: boolean; };

export function parseBooleanFlag(value: unknown, fallback = false) { const normalized = String(value || "") .trim() .toLowerCase(); if (!normalized) return Boolean(fallback); if (TRUE_VALUES.has(normalized)) return true; if (FALSE_VALUES.has(normalized)) return false; return Boolean(fallback); }

export function parseNumberOrFallback(value: unknown, fallback: number) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : fallback; }

export function safeJsonParseFromString(value: unknown, fallback: unknown) { return safeJsonParse(value, fallback, { coerceToString: true }); }

export function safeJsonParse(value: unknown, fallback: unknown, { coerceToString = false }: JsonParseOptions = {}) { if (coerceToString) { try { return JSON.parse(String(value || "")); } catch { return fallback; } }

if (typeof value !== "string" || !value) return fallback; try { return JSON.parse(value); } catch { return fallback; } }