UNPKG

agnostic-query

Version:

Type-safe fluent builder for portable query schemas. Runtime-agnostic, database-agnostic — the same QuerySchema drives Drizzle, Kysely, db0, or raw SQL.

59 lines (58 loc) 1.71 kB
import { multiComparisonOps, multiLogicalWhereOps, predicateOps, setComparisonOps, unaryComparisonOps } from "./core/where.js"; import z from "zod"; //#region src/zod.ts const createFieldPathSchema = () => z.preprocess((val) => typeof val === "string" ? [val] : val, z.tuple([z.string()]).rest(z.union([z.string(), z.number()]))); const createWhereSchema = () => { const unaryComparisonSchema = z.object({ field: createFieldPathSchema(), op: z.enum(unaryComparisonOps), value: z.any() }); const multiComparisonSchema = z.object({ field: createFieldPathSchema(), op: z.literal(multiComparisonOps[0]), values: z.array(z.any()) }); const predicateSchema = z.object({ field: createFieldPathSchema(), op: z.enum(predicateOps) }); const setComparisonSchema = z.object({ field: createFieldPathSchema(), op: z.enum(setComparisonOps), value: z.any() }); const schema = z.lazy(() => z.union([ unaryComparisonSchema, predicateSchema, setComparisonSchema, multiComparisonSchema, z.object({ op: z.enum(multiLogicalWhereOps), conditions: z.array(schema) }), z.object({ op: z.literal("not"), condition: schema }) ])); return schema; }; const createOrderBySchema = () => { const itemSchema = z.object({ field: createFieldPathSchema(), direction: z.enum(["asc", "desc"]) }); return z.array(itemSchema); }; const createQuerySchema = () => { return z.object({ where: createWhereSchema().nullish(), orderBy: createOrderBySchema().optional(), limit: z.number().optional(), offset: z.number().optional(), table: z.string().optional() }); }; //#endregion export { createFieldPathSchema, createOrderBySchema, createQuerySchema, createWhereSchema };