import { parseIntervalToDays } from '$lib/shared/routine-metrics'; import * as v from 'valibot'; export const IdSchema = v.pipe(v.number(), v.integer(), v.minValue(1)); export const AddGrocerySchema = v.object({ name: v.pipe(v.string(), v.minLength(1)), categoryId: v.nullable(v.pipe(v.number(), v.integer(), v.minValue(1))), }); export const AddReferenceSchema = v.object({ reference: v.pipe(v.string(), v.minLength(1)), price: v.nullable(v.pipe(v.number(), v.minValue(0))), unit: v.nullable(v.string()), qualityScore: v.nullable( v.pipe(v.number(), v.integer(), v.minValue(0), v.maxValue(100)), ), }); export function numericId( value: FormDataEntryValue | null | undefined, ): number { const str = value?.toString().trim() ?? ''; const n = Number(str); if (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) { throw new Error('Invalid id'); } return n; } export function parseFormString( value: FormDataEntryValue | null | undefined, ): string | null { const str = value?.toString().trim() ?? ''; return str || null; } export function parseOptionalNumber( value: FormDataEntryValue | null | undefined, ): number | null { const str = value?.toString().trim() ?? ''; if (!str) return null; const n = Number(str); if (!Number.isFinite(n)) return null; return n; } /** Parses an interval like '2w' into days; throws on invalid format. */ export function parseFrequencyDays(value: FormDataEntryValue | null): number { const days = parseIntervalToDays(value?.toString() ?? ''); if (days === null) { throw new Error('Invalid interval'); } return days; }