import { Object, String, Union } from 'ts-toolbelt'; import { Paths } from './paths'; import { NonNullable } from './required'; export type FuncCompareOp, K extends keyof F, CustomEvaluatorFuncRunOptions> = Awaited[0]>; export type StringPaths = any extends O ? never : (any extends Ignore ? never : String.Join, '.'>); export type Primitive = string | number | boolean; export type PropertyPathsOfType = { [K in StringPaths]: Union.NonNullable>, V>> extends V ? 1 : 0; }; export type ExtractPropertyPathsOfType> = { [K in keyof T]: T[K] extends 1 ? K : never; }[keyof T]; export type PropertyRef = { ref: ExtractPropertyPathsOfType>; }; export type MathOps = '+' | '-' | '*' | '/' | '%' | 'pow'; export interface MathOp { op: MathOps; rhs: number | PropertyRef; lhs: number | PropertyRef; } export type CompareValue = V | PropertyRef | (V extends number ? MathOp : never); export type NumberCompareValue = number | PropertyRef | MathOp; export interface EqualCompareOp { eq: CompareValue; } export interface NotEqualCompareOp { neq: CompareValue; } export interface InqCompareOp { inq: CompareValue[]; } export interface NinCompareOp { nin: CompareValue[]; } export interface BetweenCompareOp { between: readonly [NumberCompareValue, NumberCompareValue]; } export interface GtCompareOp { gt: NumberCompareValue; } export interface GteCompareOp { gte: NumberCompareValue; } export interface LtCompareOp { lt: NumberCompareValue; } export interface LteCompareOp { lte: NumberCompareValue; } export interface RegexCompareOp { regexp: string | PropertyRef; } export interface RegexiCompareOp { regexpi: string | PropertyRef; } export interface ExistsCompareOp { exists: boolean; } export type FuncCompares, CustomEvaluatorFuncRunOptions> = { [K in keyof F]: FuncCompareOp; }; export type NumberCompareOps = V extends number ? BetweenCompareOp | GtCompareOp | GteCompareOp | LtCompareOp | LteCompareOp : never; export type StringCompareOps = V extends string ? RegexCompareOp | RegexiCompareOp : never; export type ExtendedCompareOp = EqualCompareOp | NotEqualCompareOp | InqCompareOp | NinCompareOp | NumberCompareOps | StringCompareOps | ExistsCompareOp; type ExtractPrimitive = Extract, Primitive>; export type PropertyCompareOps = { [K in StringPaths]: ExtractPrimitive>> extends never ? ExistsCompareOp : (Extract>, Primitive | undefined> | ExtendedCompareOp>>>); }; export interface AndCompareOp, Ignore, CustomEvaluatorFuncRunOptions> { and: Expression[]; } export interface OrCompareOp, Ignore, CustomEvaluatorFuncRunOptions> { or: Expression[]; } export interface NotCompareOp, Ignore, CustomEvaluatorFuncRunOptions> { not: Expression; } export type RequireOnlyOne = Object.Either; export type FullExpression, Ignore, CustomEvaluatorFuncRunOptions> = NotCompareOp & OrCompareOp & AndCompareOp & FuncCompares & PropertyCompareOps; export type Expression, Ignore, CustomEvaluatorFuncRunOptions> = RequireOnlyOne>; export type EvaluatorFuncRunOptions = { custom: CustomEvaluatorFuncRunOptions; validation: boolean; }; export type Func = (param: any, context: T, runOptions: EvaluatorFuncRunOptions) => boolean | Promise; export type FunctionsTable = Record>; export type Context = Record; export type ValidationContext = NonNullable; export interface EvaluationResult, Ignore, CustomEvaluatorFuncRunOptions> { result: boolean; reason: Expression; } export {};