1.0.0 โข Published 6 months ago
funrules v1.0.0
FunRules
A flexible and powerful rule engine for JavaScript that works seamlessly in both Node.js and browser environments.
Features
- ๐ Universal Module Definition (UMD) - works in Node.js and browsers
- โก Lightweight and dependency-free
- ๐ Support for rule chaining and complex conditions
- ๐ฏ Priority-based rule execution
- ๐ณ Dependency management with cycle detection
- ๐ฆ Smart error handling
- ๐ Visual rule tree representation
Installation
Node.js
npm install funrules
Browser
<script src="dist/funrules.js"></script>
Usage
Basic Example
// Create a new instance
const rules = new FunRules();
// Add some simple rules
rules.addRule('isAdult', (data) => data.age >= 18);
rules.addRule('hasValidEmail', (data) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email));
// Add a composite rule using the rule builder
rules.addRule('canRegister', (data) => true, { needsFirst: ['isAdult', 'hasValidEmail'] });
// Check the rules
const data = {
age: 20,
email: 'test@example.com'
};
const results = rules.checkAll(data);
console.log(results);
Advanced Features
Rule Chaining
const rules = new FunRules();
rules.addRule('A', data => data.value > 10);
rules.addRule('B', data => data.value < 20);
// Create a composite rule using AND
const compositeRule = rules.rule('A').and('B');
rules.addSmartRule('C', compositeRule);
Priority-based Execution
rules.addRule('highPriority', checkFn, { priority: 2 });
rules.addRule('lowPriority', checkFn, { priority: 1 });
Dependency Management
rules.addRule('dependent', checkFn, {
needsFirst: ['prerequisite1', 'prerequisite2'],
skipIfFailed: ['criticalRule']
});
Visual Rule Tree
rules.checkAll(data);
rules.printRuleTree();
๐ Say Goodbye to Spaghetti Code!
Before FunRules: The Nightmare ๐ฑ
if (user.age >= 18) {
if (user.hasValidEmail) {
if (user.country === 'US') {
if (user.hasAcceptedTerms) {
if (user.creditScore > 700) {
if (user.income > 50000) {
// Finally! But what were we checking again? ๐ค
approveApplication();
} else {
rejectIncome();
}
} else {
rejectCredit();
}
} else {
rejectTerms();
}
} else {
rejectCountry();
}
} else {
rejectEmail();
}
} else {
rejectAge();
}
The Spaghetti Monster:
if โโโ
โโโ if โโโ
โโโ if โโโ
โโโ if โโโ
โโโ if โโโ
โโโ if โโโ
โโโ ๐ Yikes!
After FunRules: Clean & Organized! ๐
const rules = new FunRules();
// Simple, focused rules
rules.addRule('isAdult', user => user.age >= 18);
rules.addRule('hasValidEmail', user => /\S+@\S+\.\S+/.test(user.email));
rules.addRule('isUSResident', user => user.country === 'US');
rules.addRule('hasAcceptedTerms', user => user.hasAcceptedTerms);
rules.addRule('hasGoodCredit', user => user.creditScore > 700);
rules.addRule('hasSufficientIncome', user => user.income > 50000);
// Combine them elegantly
rules.addRule('isEligible', user => true, {
needsFirst: [
'isAdult',
'hasValidEmail',
'isUSResident',
'hasAcceptedTerms',
'hasGoodCredit',
'hasSufficientIncome'
]
});
// One clean check!
const result = rules.checkAll(user);
The Clean Architecture:
๐ณ Rule Tree
โโโ โ
isAdult - Priority: 1
โโโ โ
hasValidEmail - Priority: 1
โโโ โ
isUSResident - Priority: 1
โโโ โ
hasAcceptedTerms - Priority: 1
โโโ โ
hasGoodCredit - Priority: 1
โโโ โ
hasSufficientIncome - Priority: 1
โโโ โ
isEligible - Priority: 2
โโโ (AND Group)
โโโ needsFirst - isAdult
โโโ needsFirst - hasValidEmail
โโโ needsFirst - isUSResident
โโโ needsFirst - hasAcceptedTerms
โโโ needsFirst - hasGoodCredit
โโโ needsFirst - hasSufficientIncome
Benefits ๐
- ๐ Readable: Each rule is clearly named and has a single responsibility
- ๐ Debuggable: Visual tree shows exactly which rules passed or failed
- ๐ Reusable: Rules can be combined in different ways
- ๐ฏ Maintainable: Add or modify rules without touching others
- ๐งช Testable: Each rule can be tested in isolation
- ๐ Visualizable: See your business logic as a beautiful tree!
API Reference
Constructor
new FunRules(options)
options.throwErrors
: Boolean to control error handling
Methods
addRule(name, checkFunction, options)
addSmartRule(name, rule, options)
rule(name)
- Returns a rule buildercheckRule(name, data)
checkAll(data)
printRuleTree()
License
MIT
1.0.0
6 months ago