@synstack/query
Version:
41 lines (37 loc) • 1.73 kB
TypeScript
import { z } from 'zod/v4';
type BasePredicates<PREDICATES = never> = {
and: BasePredicates<PREDICATES>[];
} | {
or: BasePredicates<PREDICATES>[];
} | {
not: BasePredicates<PREDICATES>;
} | {
always: true;
} | {
never: true;
} | PREDICATES;
interface QueryPredicate<NAME extends string, PARAMS, INPUT = unknown> {
name: NAME;
schema: z.ZodType<{
[key in NAME]: PARAMS;
}>;
handler: (params: PARAMS) => (content: INPUT) => boolean;
}
declare class QueryEngine<PREDICATES = never, INPUT = never> {
private predicates;
private _schema;
protected constructor(predicates: Array<QueryPredicate<string, any, INPUT>>);
static default<INPUT = never>(): QueryEngine<never, INPUT>;
static addPredicate<NAME extends string, PARAM, INPUT>(name: NAME, params: z.ZodType<PARAM>, handler: (params: PARAM) => (input: INPUT) => boolean): QueryEngine<{ [n in NAME]: PARAM; }, INPUT>;
addPredicate<NAME extends string, PARAM>(name: NAME, params: z.ZodType<PARAM>, handler: (params: PARAM) => (input: INPUT) => boolean): QueryEngine<PREDICATES | { [n in NAME]: PARAM; }, INPUT>;
get schema(): z.ZodType<BasePredicates<PREDICATES>, unknown, z.core.$ZodTypeInternals<BasePredicates<PREDICATES>, unknown>>;
get jsonSchema(): z.core.JSONSchema.JSONSchema;
match(query: unknown, input: INPUT, options?: {
skipQueryValidation?: boolean;
}): boolean;
}
declare namespace QueryEngine {
type InferInput<T extends QueryEngine<any, any>> = T extends QueryEngine<any, infer INPUT> ? INPUT : never;
type InferQuery<T extends QueryEngine<any, any>> = T extends QueryEngine<infer PREDICATES, any> ? BasePredicates<PREDICATES> : never;
}
export { QueryEngine };