UNPKG

ruls

Version:

Typesafe rules engine with JSON encoding

34 lines (33 loc) 1.66 kB
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>;