ruls
Version:
Typesafe rules engine with JSON encoding
34 lines (33 loc) • 1.66 kB
TypeScript
import type Rule from '../rules/rule';
import type { Infer, Schema } from '@decs/typeschema';
export type Signal<TContext, TSchema extends Schema> = {
_schema: TSchema;
evaluate: (context: TContext) => Promise<Infer<TSchema>>;
not: Omit<Signal<TContext, TSchema>, 'evaluate' | 'not'>;
equals(value: Infer<TSchema>): Rule<TContext>;
in(values: Array<Infer<TSchema>>): Rule<TContext>;
} & (Infer<TSchema> extends Array<infer TElement> ? {
every(rule: Rule<TElement>): Rule<TContext>;
some(rule: Rule<TElement>): Rule<TContext>;
contains(value: TElement): Rule<TContext>;
containsEvery(values: Array<TElement>): Rule<TContext>;
containsSome(values: Array<TElement>): Rule<TContext>;
} : Infer<TSchema> extends boolean ? {
isTrue(): Rule<TContext>;
isFalse(): Rule<TContext>;
} : Infer<TSchema> extends number ? {
lessThan(value: Infer<TSchema>): Rule<TContext>;
lessThanOrEquals(value: Infer<TSchema>): Rule<TContext>;
greaterThan(value: Infer<TSchema>): Rule<TContext>;
greaterThanOrEquals(value: Infer<TSchema>): Rule<TContext>;
} : Infer<TSchema> extends string ? {
includes(value: Infer<TSchema>): Rule<TContext>;
endsWith(value: Infer<TSchema>): Rule<TContext>;
startsWith(value: Infer<TSchema>): Rule<TContext>;
matches(value: RegExp): Rule<TContext>;
} : Record<string, never>);
export type SignalFactory<TSchema extends Schema> = {
_schema: TSchema;
value: <TContext>(fn: (context: TContext) => Infer<TSchema> | Promise<Infer<TSchema>>) => Signal<TContext, TSchema>;
};
export declare function type<TSchema extends Schema>(schema: TSchema): SignalFactory<TSchema>;