SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
4 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
2.1 KB · 43 lines typescript
Raw Blame History
1/** zod helpers for query-string parameters (strings in → typed values out). */2import { z } from "zod";34const empty = (v: unknown) => (v === "" || v === null ? undefined : v);56export const numParam = z.preprocess((v) => { const x = empty(v); if (x === undefined) return undefined; const n = Number(x); return Number.isFinite(n) ? n : x; }, z.number().optional());7export const intParam = z.preprocess((v) => { const x = empty(v); if (x === undefined) return undefined; const n = Number(x); return Number.isFinite(n) ? Math.trunc(n) : x; }, z.number().int().optional());8export const boolParam = z.preprocess((v) => { const x = empty(v); if (x === undefined) return undefined; if (typeof x === "boolean") return x; const s = String(x).toLowerCase(); if (["1", "true", "yes", "y", "on"].includes(s)) return true; if (["0", "false", "no", "n", "off"].includes(s)) return false; return x; }, z.boolean().optional());9export const strParam = z.preprocess(empty, z.string().trim().max(300).optional());10export const csvParam = z.preprocess(empty, z.string().trim().max(1000).optional());11export const pageParam = z.preprocess((v) => { const x = empty(v); if (x === undefined) return 1; const n = Number(x); return Number.isFinite(n) && n >= 1 ? Math.trunc(n) : 1; }, z.number().int().min(1));1213export const orderParam = z.preprocess(empty, z.enum(["asc", "desc"]).optional());1415export const facilityFiltersSchema = z.object({16  q: strParam,17  country: csvParam,18  region: strParam,19  metro: strParam,20  operator: strParam,21  status: csvParam,22  type: csvParam,23  min_mw: numParam,24  max_mw: numParam,25  opened_from: intParam,26  opened_to: intParam,27  planned_from: intParam,28  planned_to: intParam,29  cloud: strParam,30  hyperscale: boolParam,31  colocation: boolParam,32  ai: boolParam,33  renewable: boolParam,34  has_mw: boolParam,35  has_geo: boolParam,36  confidence: csvParam,37  sort: z.preprocess(empty, z.enum(["name", "mw", "updated", "opened", "completeness"]).optional()),38  order: orderParam,39  page: pageParam,40  per_page: intParam,41});42export type FacilityFiltersInput = z.infer<typeof facilityFiltersSchema>;43