json-expressions
Version:
A JavaScript expression engine for JSON-based dynamic computations and function composition
396 lines (320 loc) • 8.44 kB
TypeScript
// TypeScript definitions for json-expressions
// JSON-based expression engine for dynamic computations and function composition
// === CORE TYPES ===
/**
* A JSON expression that can be evaluated against input data
*/
export interface Expression {
[key: string]: unknown;
}
/**
* Expression engine for evaluating JSON expressions
*/
export interface ExpressionEngine {
/**
* Apply an expression with input data
* @param expression - The expression to apply
* @param inputData - The input data context
* @returns The result of the expression
*/
apply(expression: Expression, inputData: unknown): unknown;
/**
* Evaluate an expression without input data (for static expressions)
* @param expression - The expression to evaluate
* @returns The evaluated result
*/
evaluate(expression: Expression): unknown;
/**
* Array of available expression names
*/
expressionNames: string[];
/**
* Check if a value is an expression
* @param value - The value to check
* @returns True if the value is an expression
*/
isExpression(value: unknown): boolean;
}
// === CORE EXPRESSIONS ===
export interface GetExpression {
$get: string | [string, unknown] | [unknown, string] | [unknown, string, unknown];
}
export interface LiteralExpression {
$literal: unknown;
}
export interface PropExpression {
$prop: string | number | symbol | [unknown, string | number | symbol];
}
export interface IsDefined {
$isDefined: unknown | [unknown];
}
export interface EnsurePathExpression {
$ensurePath: string | [unknown, string];
}
export interface DebugExpression {
$debug: Expression | unknown;
}
export interface PipeExpression {
$pipe: Expression[] | [Expression[], unknown];
}
// === COMPARATIVE EXPRESSIONS ===
export interface EqualExpression {
$eq: unknown | [unknown, unknown];
}
export interface NotEqualExpression {
$ne: unknown | [unknown, unknown];
}
export interface GreaterThanExpression {
$gt: number | [number, number];
}
export interface GreaterThanOrEqualExpression {
$gte: number | [number, number];
}
export interface LessThanExpression {
$lt: number | [number, number];
}
export interface LessThanOrEqualExpression {
$lte: number | [number, number];
}
export interface InExpression {
$in: unknown[] | [unknown[], unknown];
}
export interface NotInExpression {
$nin: unknown[] | [unknown[], unknown];
}
export interface MatchesRegexExpression {
$matchesRegex: string | [string, string];
}
export interface MatchesLikeExpression {
$matchesLike: string | [string, string];
}
export interface MatchesGlobExpression {
$matchesGlob: string | [string, string];
}
// === LOGICAL EXPRESSIONS ===
export interface AndExpression {
$and: Expression[];
}
export interface OrExpression {
$or: Expression[];
}
export interface NotExpression {
$not: Expression | boolean;
}
// === CONDITIONAL EXPRESSIONS ===
export interface IfExpression {
$if: {
if: Expression | boolean;
then: unknown;
else: unknown;
};
}
export interface CaseExpression {
$case: {
value: unknown;
cases: Array<{
when: unknown; // Can be literal value OR boolean predicate expression
then: unknown;
}>;
default: unknown;
} | [{
value: unknown;
cases: Array<{
when: unknown; // Can be literal value OR boolean predicate expression
then: unknown;
}>;
default: unknown;
}];
}
// === AGGREGATIVE EXPRESSIONS ===
export interface CountExpression {
$count: unknown[];
}
export interface SumExpression {
$sum: number[];
}
export interface MaxExpression {
$max: number[];
}
export interface MinExpression {
$min: number[];
}
export interface MeanExpression {
$mean: number[];
}
export interface MedianExpression {
$median: number[];
}
export interface ModeExpression {
$mode: unknown[];
}
// === ITERATIVE EXPRESSIONS ===
export interface FilterExpression {
$filter: Expression | [Expression, unknown[]];
}
export interface MapExpression {
$map: Expression | [Expression, unknown[]];
}
export interface FlatMapExpression {
$flatMap: Expression | [Expression, unknown[]];
}
export interface FindExpression {
$find: Expression | [Expression, unknown[]];
}
export interface AllExpression {
$all: Expression | [Expression, unknown[]];
}
export interface AnyExpression {
$any: Expression | [Expression, unknown[]];
}
export interface ConcatExpression {
$concat: unknown[] | [unknown[], unknown[]];
}
export interface JoinExpression {
$join: string | [string, unknown[]];
}
export interface ReverseExpression {
$reverse: {} | unknown[];
}
// === MATH EXPRESSIONS ===
export interface AddExpression {
$add: number | [number, number];
}
export interface SubtractExpression {
$subtract: number | [number, number];
}
export interface MultiplyExpression {
$multiply: number | [number, number];
}
export interface DivideExpression {
$divide: number | [number, number];
}
export interface ModuloExpression {
$modulo: number | [number, number];
}
// === GENERATIVE EXPRESSIONS ===
export interface RandomExpression {
$random: {
min?: number;
max?: number;
precision?: number | null;
} | {};
}
export interface UuidExpression {
$uuid: unknown;
}
// === TEMPORAL EXPRESSIONS ===
export interface NowUTCExpression {
$nowUTC: unknown;
}
export interface NowLocalExpression {
$nowLocal: unknown;
}
export interface TimestampExpression {
$timestamp: unknown;
}
// === UNION TYPE FOR ALL EXPRESSIONS ===
export type AnyExpression =
// Core
| GetExpression
| LiteralExpression
| PropExpression
| IsDefined
| EnsurePathExpression
| DebugExpression
| PipeExpression
// Comparative
| EqualExpression
| NotEqualExpression
| GreaterThanExpression
| GreaterThanOrEqualExpression
| LessThanExpression
| LessThanOrEqualExpression
| InExpression
| NotInExpression
| MatchesRegexExpression
| MatchesLikeExpression
| MatchesGlobExpression
// Logical
| AndExpression
| OrExpression
| NotExpression
// Conditional
| IfExpression
| CaseExpression
// Aggregative
| CountExpression
| SumExpression
| MaxExpression
| MinExpression
| MeanExpression
| MedianExpression
| ModeExpression
// Iterative
| FilterExpression
| MapExpression
| FlatMapExpression
| FindExpression
| AllExpression
| AnyExpression
| ConcatExpression
| JoinExpression
| ReverseExpression
// Math
| AddExpression
| SubtractExpression
| MultiplyExpression
| DivideExpression
| ModuloExpression
// Generative
| RandomExpression
| UuidExpression
// Temporal
| NowUTCExpression
| NowLocalExpression
| TimestampExpression;
// === MAIN EXPORTS ===
/**
* Configuration object for creating an expression engine
*/
export interface ExpressionEngineConfig {
/** Array of expression pack objects to include */
packs?: object[];
/** Custom expression definitions */
custom?: { [k: string]: {
apply: (operand: unknown, inputData: unknown, context?: {
apply: (expr: Expression, data: unknown) => unknown;
evaluate: (expr: Expression) => unknown;
isExpression: (value: unknown) => boolean;
}) => unknown;
evaluate: (operand: unknown, context?: {
apply: (expr: Expression, data: unknown) => unknown;
evaluate: (expr: Expression) => unknown;
isExpression: (value: unknown) => boolean;
}) => unknown;
} };
/** Whether to include base expressions (default: true) */
includeBase?: boolean;
}
/**
* Creates a new expression engine with specified configuration
* @param config - Configuration object for the expression engine
* @returns Expression engine instance
*/
export function createExpressionEngine(config?: ExpressionEngineConfig): ExpressionEngine;
// === PACK EXPORTS ===
export const aggregation: { [k: string]: unknown };
export const all: { [k: string]: unknown };
export const array: { [k: string]: unknown };
export const base: { [k: string]: unknown };
export const comparison: { [k: string]: unknown };
export const filtering: { [k: string]: unknown };
export const logic: { [k: string]: unknown };
export const math: { [k: string]: unknown };
export const projection: { [k: string]: unknown };
export const string: { [k: string]: unknown };
export const time: { [k: string]: unknown };
// === INDIVIDUAL EXPRESSION DEFINITION EXPORTS ===
// All individual expression definitions are exported via export * statements
// from their respective definition files (aggregative, comparative, conditional,
// core, generative, iterative, logical, math, string, temporal)