createRuleEngine()
Factory function to create a rule engine instance.
import { createRuleEngine } from 'rule-engine-js' ;
const engine = createRuleEngine ( config );
Parameters
Enable strict type checking (no coercion)
Maximum rule nesting depth
Enable expression and path caching
Maximum cache entries (LRU eviction)
Maximum operators per rule
Allow prototype property access (unsafe)
Returns
Engine instance with the following methods.
evaluateExpr()
Evaluate a rule expression against data.
const result = engine . evaluateExpr ( rule , context );
Parameters
Returns
{
success : boolean ; // true if rule passed, false if failed or error
value ?: any ; // Evaluation result value (for non-boolean rules)
error ?: string ; // Error message if evaluation failed
}
Examples
Basic
Complex
Error Handling
const rule = { gte: [ 'age' , 18 ] };
const data = { age: 25 };
const result = engine . evaluateExpr ( rule , data );
// { success: true }
registerOperator()
Register a custom operator.
engine . registerOperator ( name , handler , options );
Parameters
Operator name (e.g., ‘custom’)
Operator implementation: (args, context) => boolean
Allow overwriting existing operators
Example
// Register custom operator
engine . registerOperator ( 'divisibleBy' , ( args , context ) => {
const [ left , right ] = args ;
const value = engine . resolvePath ( context , left );
return value % right === 0 ;
});
// Use it
engine . evaluateExpr ({ divisibleBy: [ 'age' , 5 ] }, { age: 25 });
// { success: true }
getOperators()
Get all registered operator names.
const operators = engine . getOperators ();
// ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'and', 'or', ...]
Returns
string[] - Array of operator names
getMetrics()
Get performance metrics.
const metrics = engine . getMetrics ();
Returns
{
evaluations : number ; // Total evaluations
cacheHits : number ; // Cache hits
errors : number ; // Total errors
totalTime : number ; // Total time (ms)
avgTime : number ; // Average time per evaluation (ms)
}
Example
console . log ( 'Performance:' , {
total: metrics . evaluations ,
hitRate: ( metrics . cacheHits / metrics . evaluations * 100 ). toFixed ( 1 ) + '%' ,
avgTime: metrics . avgTime . toFixed ( 2 ) + 'ms'
});
getCacheStats()
Get cache statistics.
const stats = engine . getCacheStats ();
Returns
{
expression : {
size : number ; // Current cache size
maxSize : number ; // Maximum cache size
} | null ;
path : {
size : number ;
maxSize : number ;
}
}
getConfig()
Get current configuration.
const config = engine . getConfig ();
// { strict: false, maxDepth: 10, enableCache: true, ... }
Returns
object - Current configuration
clearCache()
Clear all caches.
Clears both expression cache and path resolver cache. Useful for memory management or when data schema changes.
resolvePath()
Resolve a path in context data.
const value = engine . resolvePath ( context , path , defaultValue );
Parameters
Dot-notation path (e.g., ‘user.profile.name’)
Default if path doesn’t exist
Example
const data = { user: { name: 'John' , age: 25 } };
engine . resolvePath ( data , 'user.name' ); // 'John'
engine . resolvePath ( data , 'user.email' , null ); // null
Complete Example
import { createRuleEngine } from 'rule-engine-js' ;
// Create engine with config
const engine = createRuleEngine ({
strict: false ,
maxDepth: 10 ,
enableCache: true ,
maxCacheSize: 1000
});
// Register custom operator
engine . registerOperator ( 'isEven' , ( args , context ) => {
const [ path ] = args ;
const value = engine . resolvePath ( context , path );
return value % 2 === 0 ;
});
// Define rule
const rule = {
and: [
{ gte: [ 'age' , 18 ] },
{ eq: [ 'role' , 'admin' ] },
{ isEven: [ 'score' ] }
]
};
// Evaluate
const result = engine . evaluateExpr ( rule , {
age: 25 ,
role: 'admin' ,
score: 100
});
console . log ( 'Result:' , result . success ); // true
// Check metrics
const metrics = engine . getMetrics ();
console . log ( 'Metrics:' , metrics );
// Get operators
const operators = engine . getOperators ();
console . log ( 'Operators:' , operators . length );
Error Handling
All methods handle errors gracefully:
// Invalid rule structure
const result = engine . evaluateExpr ( null , data );
// { success: false, error: "Rule must be a non-null object" }
// Unknown operator
const result = engine . evaluateExpr ({ unknown: [ 'field' ] }, data );
// { success: false, error: "Unknown operator: unknown" }
// Max depth exceeded
const deepRule = { and: [{ and: [{ and: [ /* ...deeply nested */ ] }] }] };
const result = engine . evaluateExpr ( deepRule , data );
// { success: false, error: "Rule exceeds maximum depth of 10" }
TypeScript
Full TypeScript support:
import { createRuleEngine } from 'rule-engine-js' ;
import type { RuleEngine , RuleExpression , EvaluationResult , EngineConfig } from 'rule-engine-js' ;
const config : EngineConfig = {
strict: true ,
maxDepth: 15
};
const engine : RuleEngine = createRuleEngine ( config );
const rule : RuleExpression = { gte: [ 'age' , 18 ] };
const result : EvaluationResult = engine . evaluateExpr ( rule , data );