@skedulo/eql
A TypeScript parser for Skedulo's Entity Query Language (EQL). This library provides tools for parsing and evaluating EQL filter expressions.
Installation
npm install @skedulo/eql
yarn add @skedulo/eql
Usage
You can use this library in several ways:
1. Parse and evaluate a filter expression in one step:
import { evaluateFilter } from "@skedulo/eql";
const event = {
Current: { JobStatus: "Ready" },
Previous: { JobStatus: "Dispatched" },
};
const result = evaluateFilter("Current.JobStatus == 'Ready'", event);
console.log(result);
2. Parse and evaluate separately:
import { parseFilter, evaluateExpression } from "@skedulo/eql";
const ast = parseFilter("Current.JobStatus == 'Ready'");
const result = evaluateExpression(ast, event);
3. Convert AST back to string (round-trip conversion):
import { parseFilter, stringify } from "@skedulo/eql";
const ast = parseFilter("Current.JobStatus == 'Ready' AND priority > 5");
const queryString = stringify(ast);
console.log(queryString);
This is useful for:
- Query transformation and optimization
- Normalizing query format (e.g., quote styles)
- Building query builders or editors
- Serializing parsed queries for storage
4. Use the types for your own implementations:
import { Expression, Event } from "@skedulo/eql";
function customEvaluator(expr: Expression, event: Event) {
}
Supported Operations
- Comparison operators:
==, !=
- String pattern matching:
LIKE, NOTLIKE (with % and _ wildcards)
- List membership:
IN
- Logical operators:
AND, OR
- Parentheses for grouping
Examples
"Current.JobStatus == 'Ready'";
"Current.JobStatus != Previous.JobStatus";
"Current.Description LIKE '%urgent%'";
"Current.Status IN ['Open', 'InProgress']";
"(Current.Status == 'Open' OR Current.Status == 'InProgress') AND Current.Priority == 'High'";
AST to String Conversion
The stringify function converts parsed AST expressions back to EQL query strings. This enables round-trip conversion and query manipulation:
Basic Usage
import { parseFilter, stringify } from "@skedulo/eql";
const ast = parseFilter("operation == 'INSERT'");
const queryString = stringify(ast);
Quote Normalization
The stringifier normalizes all string literals to use single quotes:
const ast = parseFilter('operation == "INSERT"');
const queryString = stringify(ast);
Complex Expressions
The stringifier handles complex nested expressions with proper parenthesization:
const complexQuery = "(operation == 'UPDATE' OR operation == 'INSERT') AND Current.status != Previous.status";
const ast = parseFilter(complexQuery);
const regenerated = stringify(ast);
Supported Features
- âś… All comparison operators (
==, !=, <, <=, >, >=, LIKE, NOTLIKE, IN, NOTIN)
- âś… Logical operators (
AND, OR) with proper parenthesization
- âś… All literal types (strings, numbers, booleans, null, dates, times, durations)
- âś… List literals with mixed types
- âś… Nested path expressions (e.g.,
Current.job.status)
- âś… Quote normalization and escaping