src / utils / coerce.ts
/* -------------------------------------------------------------------------- */
/* Runtime coercion guards */
/* */
/* Config values arrive schema-typed, but persisted sessions can lag behind */
/* the current schema. These guards normalize defensively at the boundary so */
/* downstream code can assume sane primitives. */
/* -------------------------------------------------------------------------- */
export function asString(value: unknown, fallback = ""): string {
return typeof value === "string" ? value.trim() : fallback;
}
export function asBool(value: unknown, fallback: boolean): boolean {
if (value === undefined || value === null) return fallback;
return Boolean(value);
}
export function asNumber(value: unknown, fallback: number): number {
if (typeof value === "number" && Number.isFinite(value)) return value;
return fallback;
}
src / utils / coerce.ts
/* -------------------------------------------------------------------------- */
/* Runtime coercion guards */
/* */
/* Config values arrive schema-typed, but persisted sessions can lag behind */
/* the current schema. These guards normalize defensively at the boundary so */
/* downstream code can assume sane primitives. */
/* -------------------------------------------------------------------------- */
export function asString(value: unknown, fallback = ""): string {
return typeof value === "string" ? value.trim() : fallback;
}
export function asBool(value: unknown, fallback: boolean): boolean {
if (value === undefined || value === null) return fallback;
return Boolean(value);
}
export function asNumber(value: unknown, fallback: number): number {
if (typeof value === "number" && Number.isFinite(value)) return value;
return fallback;
}