alinea
Version:
Headless git-based CMS
34 lines (33 loc) • 1.05 kB
TypeScript
type Primitive = string | number | boolean | null;
export interface Ops<Value = unknown> {
is?: Value;
isNot?: Value;
in?: ReadonlyArray<Value>;
notIn?: ReadonlyArray<Value>;
gt?: Value;
gte?: Value;
lt?: Value;
lte?: Value;
startsWith?: string;
or?: Condition<Value> | Array<Condition<Value>>;
}
interface ObjectOps<Fields> {
has?: Filter<Fields>;
}
interface ArrayOps<Fields> {
includes?: Filter<Fields>;
}
type FieldOps<Fields> = {
[K in keyof Fields]?: Condition<Fields[K]>;
};
export interface AnyCondition<Value> extends Ops<Value>, ArrayOps<Value>, ObjectOps<Value> {
}
export type Condition<Value> = [Value] extends [Primitive] ? Ops<Value> | Value : [Value] extends [Array<any>] ? ArrayOps<Value[0]> : ObjectOps<Value>;
type AndCondition<Fields> = {
and: Array<Filter<Fields> | undefined>;
};
type OrCondition<Fields> = {
or: Array<Filter<Fields> | undefined>;
};
export type Filter<Fields = unknown> = AndCondition<Fields> | OrCondition<Fields> | FieldOps<Fields>;
export {};