// shared/parse.ts — Schema-validated JSON parsing (replaces unsafe `as` casts) import * as v from "valibot"; /** * Parse a JSON string and validate it against a valibot schema. * Returns the validated value, or null if parsing/validation fails. */ export function parseJsonWith>>( text: string, schema: T, ): v.InferOutput | null { try { return v.parse(schema, JSON.parse(text)); } catch { return null; } } /** Schema for responses containing a `version` field (npm registry, GitHub releases). */ export const PkgVersionSchema = v.object({ version: v.string(), }); /** * Parse a JSON string and return it as a Record or null. * Rejects non-object results (arrays, primitives). * Use for API responses that are always a JSON object. */ export function parseJsonObj(text: string): Record | null { try { const val = JSON.parse(text); if (val !== null && typeof val === "object" && !Array.isArray(val)) { return val; } return null; } catch { return null; } }