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
JavaScript
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 };