UNPKG

smartcal

Version:

SmartCal is a lightweight and powerful library for evaluating complex mathematical expressions dynamically. It supports tokenization, parsing, and interpreting mathematical formulas seamlessly, offering flexibility to integrate custom data objects for dyn

200 lines (148 loc) 4.78 kB
# SmartCal **SmartCal** is a lightweight JavaScript library designed to evaluate mathematical expressions, formulas, and conditional expressions dynamically. It supports variables, nested formulas, and complex mathematical operations. ## ⭐ Features - Arithmetic operations (+, -, *, /, ^, %) - Comparison operators (>, <, >=, <=, ==, !=) - Logical operators (&&, ||) - Ternary conditions (condition ? true : false) - Formula variables and nested formulas - Compile expressions for reuse ## 📦 Installation ```bash npm install smartcal ``` ## 🚀 Quick Start ### Basic Evaluation ```typescript import SmartCal from "smartcal"; // Basic arithmetic console.log(SmartCal("2 + 3 * 4")); // 14 console.log(SmartCal("2 ^ 3")); // 8 console.log(SmartCal("10 % 3")); // 1 // With variables const data = { x: 10, y: 5 }; console.log(SmartCal("x + y * 2", data)); // 20 const conditionalData= { score: 85 }; // Simple ternary console.log(SmartCal(`score >= 80 ? 'A' : 'B'`, conditionalData)); // 'A' // Nested conditions const grade = SmartCal(`score >= 90 ? "A" : ((score >= 80) ? "B" : (score >= 70 ? "C" : "D")) `, conditionalData); // 'B ``` ## 📘 Advanced Usage ### Expression Validation ```typescript import { isValidExpression } from "smartcal"; // Valid expressions console.log(isValidExpression("2 + 2")); // true console.log(isValidExpression("x > 10 ? 'high' : 'low'")); // true console.log(isValidExpression("(a + b) * c")); // true // Invalid expressions console.log(isValidExpression("2 +")); // false console.log(isValidExpression("x > ? 1 : 0")); // false console.log(isValidExpression("(a + b * c")); // false ``` ### Compiled Expressions ```typescript import { compile } from "smartcal"; // Create a reusable compiled expression const priceCalculator = compile("quantity * unitPrice * (1 - discount)"); // Use it multiple times with different data console.log(priceCalculator.evaluate({ quantity: 5, unitPrice: 10, discount: 0.1 })); // 45 console.log(priceCalculator.evaluate({ quantity: 3, unitPrice: 15, discount: 0.2 })); // 36 // Compile complex formulas const taxCalculator = compile(` subtotal > 1000 ? (subtotal * (1 + taxRate) * 0.95) : (subtotal * (1 + taxRate)) `); console.log(taxCalculator.evaluate({ subtotal: 1500, taxRate: 0.2 })); // 1710 (includes 5% discount) // Get the original expression console.log(taxCalculator.toString()); // prints the original formula // Chain multiple compilations const discountCalculator = compile("price >= 100 ? (discount * 2) : discount"); const finalPrice = compile(`basePrice * (1 - discountCalculator)`); console.log(finalPrice.evaluate({ basePrice: 120, price: 120, discount: 0.1, discountCalculator })); // 96 (120 * (1 - 0.2)) ``` ### Working with Formula Variables ```typescript import SmartCal,{ConditionResult} from "smartcal"; const data = { basePrice: 100, quantity: 5, f_subtotal: "basePrice * quantity", f_discount: "f_subtotal >= 500 ? 0.1 : 0.05", f_final: "f_subtotal * (1 - f_discount)" }; // Evaluate nested formulas console.log(SmartCal("f_final", data)); // 450 (500 * 0.9) // Complex conditional formulas const orderData = { items: 3, unitPrice: 40, isPremium: ConditionResult.True, f_baseTotal: "items * unitPrice", f_discount: "isPremium ? 0.15 : (f_baseTotal > 100 ? 0.1 : 0)", f_shipping: "f_baseTotal > 200 ? 0 : 10", f_grandTotal: "f_baseTotal * (1 - f_discount) + f_shipping" }; console.log(SmartCal("f_grandTotal", orderData)); // 112 (120 * 0.85 + 10) ``` ## 📖 Documentation ### Supported Operators - Arithmetic: `+`, `-`, `*`, `/`, `^`, `%` - Comparison: `>`, `<`, `>=`, `<=`, `==`, `!=` - Logical: `&&`, `||` - Ternary: `?`, `:` - Grouping: `(`, `)` ### API Reference ```typescript // Simple evaluation SmartCal<T>(expression: string, data?: T): number | string // Expression validation isValidExpression(expression: string): boolean // Compilation for reuse compile(expression: string): CompiledExpression // CompiledExpression interface interface CompiledExpression { evaluate<T>(data: T): number | string; toString(): string; } ``` ## ⚠️ Important Notes ### Ternary Operators ```typescript // Wrong const expression = `variable > 6 ? 0.5*anotherVariable : 0.5` // Correct const expression = `variable > 6 ? (0.5*anotherVariable) : 0.5` ``` ### Boolean Variables ```typescript const data = { bool: ConditionResult.True, // 1 bool2: ConditionResult.False // 0 } const expression = `bool ? "True" : bool2 ? "False" : "True"` ``` ## 🤝 Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## 📄 License This project is licensed under the [MIT License](./LISENCE).