@the-trybe/formula-engine 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/.claude/settings.local.json +6 -0
  2. package/PRD_FORMULA_ENGINE.md +1863 -0
  3. package/README.md +382 -0
  4. package/dist/decimal-utils.d.ts +180 -0
  5. package/dist/decimal-utils.js +355 -0
  6. package/dist/dependency-extractor.d.ts +20 -0
  7. package/dist/dependency-extractor.js +103 -0
  8. package/dist/dependency-graph.d.ts +60 -0
  9. package/dist/dependency-graph.js +252 -0
  10. package/dist/errors.d.ts +161 -0
  11. package/dist/errors.js +260 -0
  12. package/dist/evaluator.d.ts +51 -0
  13. package/dist/evaluator.js +494 -0
  14. package/dist/formula-engine.d.ts +79 -0
  15. package/dist/formula-engine.js +355 -0
  16. package/dist/functions.d.ts +3 -0
  17. package/dist/functions.js +720 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.js +61 -0
  20. package/dist/lexer.d.ts +25 -0
  21. package/dist/lexer.js +357 -0
  22. package/dist/parser.d.ts +32 -0
  23. package/dist/parser.js +372 -0
  24. package/dist/types.d.ts +228 -0
  25. package/dist/types.js +62 -0
  26. package/jest.config.js +23 -0
  27. package/package.json +35 -0
  28. package/src/decimal-utils.ts +408 -0
  29. package/src/dependency-extractor.ts +117 -0
  30. package/src/dependency-graph.test.ts +238 -0
  31. package/src/dependency-graph.ts +288 -0
  32. package/src/errors.ts +296 -0
  33. package/src/evaluator.ts +604 -0
  34. package/src/formula-engine.test.ts +660 -0
  35. package/src/formula-engine.ts +430 -0
  36. package/src/functions.ts +770 -0
  37. package/src/index.ts +103 -0
  38. package/src/lexer.test.ts +288 -0
  39. package/src/lexer.ts +394 -0
  40. package/src/parser.test.ts +349 -0
  41. package/src/parser.ts +449 -0
  42. package/src/types.ts +347 -0
  43. package/tsconfig.json +29 -0
package/dist/errors.js ADDED
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeneralFormulaError = exports.MaxExpressionLengthError = exports.MaxRecursionError = exports.MaxIterationsError = exports.SecurityError = exports.ConfigurationError = exports.InvalidDecimalError = exports.DecimalDivisionByZeroError = exports.DecimalUnderflowError = exports.DecimalOverflowError = exports.DecimalError = exports.IndexAccessError = exports.PropertyAccessError = exports.InvalidOperationError = exports.ArgumentCountError = exports.TypeMismatchError = exports.DivisionByZeroError = exports.DuplicateFormulaError = exports.UndefinedFunctionError = exports.UndefinedVariableError = exports.CircularDependencyError = exports.InvalidNumberError = exports.UnterminatedStringError = exports.UnexpectedTokenError = exports.SyntaxError = exports.FormulaEngineError = void 0;
4
+ class FormulaEngineError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = this.constructor.name;
8
+ Object.setPrototypeOf(this, new.target.prototype);
9
+ }
10
+ }
11
+ exports.FormulaEngineError = FormulaEngineError;
12
+ // ============================================================================
13
+ // Parse Errors
14
+ // ============================================================================
15
+ class SyntaxError extends FormulaEngineError {
16
+ constructor(message, position, line, column, expression) {
17
+ super(`${message} at line ${line}, column ${column}`);
18
+ this.position = position;
19
+ this.line = line;
20
+ this.column = column;
21
+ this.expression = expression;
22
+ this.code = 'PARSE_SYNTAX_ERROR';
23
+ this.category = 'PARSE';
24
+ }
25
+ }
26
+ exports.SyntaxError = SyntaxError;
27
+ class UnexpectedTokenError extends FormulaEngineError {
28
+ constructor(token, expected, position) {
29
+ super(`Unexpected token '${token}', expected one of: ${expected.join(', ')}`);
30
+ this.token = token;
31
+ this.expected = expected;
32
+ this.position = position;
33
+ this.code = 'PARSE_UNEXPECTED_TOKEN';
34
+ this.category = 'PARSE';
35
+ }
36
+ }
37
+ exports.UnexpectedTokenError = UnexpectedTokenError;
38
+ class UnterminatedStringError extends FormulaEngineError {
39
+ constructor(position) {
40
+ super(`Unterminated string starting at position ${position}`);
41
+ this.code = 'PARSE_UNTERMINATED_STRING';
42
+ this.category = 'PARSE';
43
+ }
44
+ }
45
+ exports.UnterminatedStringError = UnterminatedStringError;
46
+ class InvalidNumberError extends FormulaEngineError {
47
+ constructor(value, position) {
48
+ super(`Invalid number '${value}' at position ${position}`);
49
+ this.code = 'PARSE_INVALID_NUMBER';
50
+ this.category = 'PARSE';
51
+ }
52
+ }
53
+ exports.InvalidNumberError = InvalidNumberError;
54
+ // ============================================================================
55
+ // Validation Errors
56
+ // ============================================================================
57
+ class CircularDependencyError extends FormulaEngineError {
58
+ constructor(cycle, involvedFormulas) {
59
+ super(`Circular dependency detected: ${cycle.join(' → ')}`);
60
+ this.cycle = cycle;
61
+ this.involvedFormulas = involvedFormulas;
62
+ this.code = 'VALIDATION_CIRCULAR_DEPENDENCY';
63
+ this.category = 'VALIDATION';
64
+ }
65
+ }
66
+ exports.CircularDependencyError = CircularDependencyError;
67
+ class UndefinedVariableError extends FormulaEngineError {
68
+ constructor(variableName, expression) {
69
+ super(`Undefined variable: ${variableName}`);
70
+ this.variableName = variableName;
71
+ this.expression = expression;
72
+ this.code = 'VALIDATION_UNDEFINED_VARIABLE';
73
+ this.category = 'VALIDATION';
74
+ }
75
+ }
76
+ exports.UndefinedVariableError = UndefinedVariableError;
77
+ class UndefinedFunctionError extends FormulaEngineError {
78
+ constructor(functionName) {
79
+ super(`Undefined function: ${functionName}`);
80
+ this.functionName = functionName;
81
+ this.code = 'VALIDATION_UNDEFINED_FUNCTION';
82
+ this.category = 'VALIDATION';
83
+ }
84
+ }
85
+ exports.UndefinedFunctionError = UndefinedFunctionError;
86
+ class DuplicateFormulaError extends FormulaEngineError {
87
+ constructor(formulaId) {
88
+ super(`Duplicate formula ID: ${formulaId}`);
89
+ this.formulaId = formulaId;
90
+ this.code = 'VALIDATION_DUPLICATE_FORMULA';
91
+ this.category = 'VALIDATION';
92
+ }
93
+ }
94
+ exports.DuplicateFormulaError = DuplicateFormulaError;
95
+ // ============================================================================
96
+ // Evaluation Errors
97
+ // ============================================================================
98
+ class DivisionByZeroError extends FormulaEngineError {
99
+ constructor() {
100
+ super('Division by zero');
101
+ this.code = 'EVAL_DIVISION_BY_ZERO';
102
+ this.category = 'EVALUATION';
103
+ }
104
+ }
105
+ exports.DivisionByZeroError = DivisionByZeroError;
106
+ class TypeMismatchError extends FormulaEngineError {
107
+ constructor(expected, actual, context) {
108
+ const expectedStr = Array.isArray(expected) ? expected.join(' or ') : expected;
109
+ super(`Type mismatch: expected ${expectedStr}, got ${actual} in ${context}`);
110
+ this.expected = expected;
111
+ this.actual = actual;
112
+ this.context = context;
113
+ this.code = 'EVAL_TYPE_MISMATCH';
114
+ this.category = 'EVALUATION';
115
+ }
116
+ }
117
+ exports.TypeMismatchError = TypeMismatchError;
118
+ class ArgumentCountError extends FormulaEngineError {
119
+ constructor(functionName, expected, actual) {
120
+ const expectedStr = expected.min === expected.max
121
+ ? `${expected.min}`
122
+ : expected.max === -1
123
+ ? `at least ${expected.min}`
124
+ : `${expected.min}-${expected.max}`;
125
+ super(`Function ${functionName} expects ${expectedStr} arguments, got ${actual}`);
126
+ this.functionName = functionName;
127
+ this.expected = expected;
128
+ this.actual = actual;
129
+ this.code = 'EVAL_ARGUMENT_COUNT';
130
+ this.category = 'EVALUATION';
131
+ }
132
+ }
133
+ exports.ArgumentCountError = ArgumentCountError;
134
+ class InvalidOperationError extends FormulaEngineError {
135
+ constructor(operator, operandTypes) {
136
+ super(`Cannot apply operator '${operator}' to types: ${operandTypes.join(', ')}`);
137
+ this.operator = operator;
138
+ this.operandTypes = operandTypes;
139
+ this.code = 'EVAL_INVALID_OPERATION';
140
+ this.category = 'EVALUATION';
141
+ }
142
+ }
143
+ exports.InvalidOperationError = InvalidOperationError;
144
+ class PropertyAccessError extends FormulaEngineError {
145
+ constructor(property, objectType) {
146
+ super(`Cannot access property '${property}' on ${objectType}`);
147
+ this.property = property;
148
+ this.objectType = objectType;
149
+ this.code = 'EVAL_PROPERTY_ACCESS';
150
+ this.category = 'EVALUATION';
151
+ }
152
+ }
153
+ exports.PropertyAccessError = PropertyAccessError;
154
+ class IndexAccessError extends FormulaEngineError {
155
+ constructor(index, objectType) {
156
+ super(`Cannot use index '${index}' on ${objectType}`);
157
+ this.index = index;
158
+ this.objectType = objectType;
159
+ this.code = 'EVAL_INDEX_ACCESS';
160
+ this.category = 'EVALUATION';
161
+ }
162
+ }
163
+ exports.IndexAccessError = IndexAccessError;
164
+ // ============================================================================
165
+ // Decimal Errors
166
+ // ============================================================================
167
+ class DecimalError extends FormulaEngineError {
168
+ constructor(message) {
169
+ super(message);
170
+ this.code = 'DECIMAL_ERROR';
171
+ this.category = 'EVALUATION';
172
+ }
173
+ }
174
+ exports.DecimalError = DecimalError;
175
+ class DecimalOverflowError extends DecimalError {
176
+ constructor(value, maxExponent) {
177
+ super(`Decimal overflow: exponent exceeds ${maxExponent}`);
178
+ this.value = value;
179
+ this.maxExponent = maxExponent;
180
+ this.code = 'DECIMAL_OVERFLOW';
181
+ }
182
+ }
183
+ exports.DecimalOverflowError = DecimalOverflowError;
184
+ class DecimalUnderflowError extends DecimalError {
185
+ constructor(value, minExponent) {
186
+ super(`Decimal underflow: exponent below ${minExponent}`);
187
+ this.value = value;
188
+ this.minExponent = minExponent;
189
+ this.code = 'DECIMAL_UNDERFLOW';
190
+ }
191
+ }
192
+ exports.DecimalUnderflowError = DecimalUnderflowError;
193
+ class DecimalDivisionByZeroError extends DecimalError {
194
+ constructor() {
195
+ super('Division by zero');
196
+ this.code = 'DECIMAL_DIVISION_BY_ZERO';
197
+ }
198
+ }
199
+ exports.DecimalDivisionByZeroError = DecimalDivisionByZeroError;
200
+ class InvalidDecimalError extends DecimalError {
201
+ constructor(input) {
202
+ super(`Invalid decimal value: "${input}"`);
203
+ this.input = input;
204
+ this.code = 'INVALID_DECIMAL';
205
+ }
206
+ }
207
+ exports.InvalidDecimalError = InvalidDecimalError;
208
+ // ============================================================================
209
+ // Configuration Errors
210
+ // ============================================================================
211
+ class ConfigurationError extends FormulaEngineError {
212
+ constructor(message) {
213
+ super(message);
214
+ this.code = 'CONFIGURATION_ERROR';
215
+ this.category = 'CONFIGURATION';
216
+ }
217
+ }
218
+ exports.ConfigurationError = ConfigurationError;
219
+ // ============================================================================
220
+ // Security Errors
221
+ // ============================================================================
222
+ class SecurityError extends FormulaEngineError {
223
+ constructor(message) {
224
+ super(message);
225
+ this.code = 'SECURITY_ERROR';
226
+ this.category = 'EVALUATION';
227
+ }
228
+ }
229
+ exports.SecurityError = SecurityError;
230
+ class MaxIterationsError extends SecurityError {
231
+ constructor(limit) {
232
+ super(`Maximum iterations exceeded: ${limit}`);
233
+ this.code = 'MAX_ITERATIONS_EXCEEDED';
234
+ }
235
+ }
236
+ exports.MaxIterationsError = MaxIterationsError;
237
+ class MaxRecursionError extends SecurityError {
238
+ constructor(limit) {
239
+ super(`Maximum recursion depth exceeded: ${limit}`);
240
+ this.code = 'MAX_RECURSION_EXCEEDED';
241
+ }
242
+ }
243
+ exports.MaxRecursionError = MaxRecursionError;
244
+ class MaxExpressionLengthError extends SecurityError {
245
+ constructor(length, limit) {
246
+ super(`Expression length ${length} exceeds maximum ${limit}`);
247
+ this.code = 'MAX_EXPRESSION_LENGTH_EXCEEDED';
248
+ }
249
+ }
250
+ exports.MaxExpressionLengthError = MaxExpressionLengthError;
251
+ // Concrete class for general errors
252
+ class GeneralFormulaError extends FormulaEngineError {
253
+ constructor(message) {
254
+ super(message);
255
+ this.code = 'GENERAL_ERROR';
256
+ this.category = 'EVALUATION';
257
+ }
258
+ }
259
+ exports.GeneralFormulaError = GeneralFormulaError;
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxNQUFzQixrQkFBbUIsU0FBUSxLQUFLO0lBSXBELFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBVEQsZ0RBU0M7QUFFRCwrRUFBK0U7QUFDL0UsZUFBZTtBQUNmLCtFQUErRTtBQUUvRSxNQUFhLFdBQVksU0FBUSxrQkFBa0I7SUFJakQsWUFDRSxPQUFlLEVBQ1IsUUFBZ0IsRUFDaEIsSUFBWSxFQUNaLE1BQWMsRUFDZCxVQUFrQjtRQUV6QixLQUFLLENBQUMsR0FBRyxPQUFPLFlBQVksSUFBSSxZQUFZLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFML0MsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVE7UUFSbEIsU0FBSSxHQUFHLG9CQUFvQixDQUFDO1FBQzVCLGFBQVEsR0FBa0IsT0FBTyxDQUFDO0lBVTNDLENBQUM7Q0FDRjtBQWJELGtDQWFDO0FBRUQsTUFBYSxvQkFBcUIsU0FBUSxrQkFBa0I7SUFJMUQsWUFDUyxLQUFhLEVBQ2IsUUFBa0IsRUFDbEIsUUFBZ0I7UUFFdkIsS0FBSyxDQUFDLHFCQUFxQixLQUFLLHVCQUF1QixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUp2RSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBVTtR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Q0FBQyxDQUFDO1FBSlIsU0FBSSxHQUFXLGdCQUFnQixDQUFDO1FBQ2hDLGFBQVEsR0FBa0IsWUFBWSxDQUFDO0lBSWhELENBQUM7Q0FDRjtBQVBELHNDQU9DO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxhQUFhO0lBR25ELFlBQVksS0FBYTtRQUN2QixLQUFLLENBQUMsZ0NBQWdDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFIL0IsU0FBSSxHQUFXLHlCQUF5QixDQUFDO0lBSTNELENBQUM7Q0FDRjtBQU5ELGdEQU1DO0FBRUQsTUFBYSxpQkFBa0IsU0FBUSxhQUFhO0lBR2xELFlBQVksS0FBYTtRQUN2QixLQUFLLENBQUMscUNBQXFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFIcEMsU0FBSSxHQUFXLHdCQUF3QixDQUFDO0lBSTFELENBQUM7Q0FDRjtBQU5ELDhDQU1DO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxhQUFhO0lBR3pELFlBQVksTUFBYyxFQUFFLEtBQWE7UUFDdkMsS0FBSyxDQUFDLHFCQUFxQixNQUFNLG9CQUFvQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBSDlDLFNBQUksR0FBVyxnQ0FBZ0MsQ0FBQztJQUlsRSxDQUFDO0NBQ0Y7QUFORCw0REFNQztBQUVELG9DQUFvQztBQUNwQyxNQUFhLG1CQUFvQixTQUFRLGtCQUFrQjtJQUl6RCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSlIsU0FBSSxHQUFXLGVBQWUsQ0FBQztRQUMvQixhQUFRLEdBQWtCLFlBQVksQ0FBQztJQUloRCxDQUFDO0NBQ0Y7QUFQRCxrREFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZhbHVlVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBFcnJvckNhdGVnb3J5ID0gJ1BBUlNFJyB8ICdWQUxJREFUSU9OJyB8ICdFVkFMVUFUSU9OJyB8ICdDT05GSUdVUkFUSU9OJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm11bGFFbmdpbmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeTtcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJzZSBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFN5bnRheEVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9TWU5UQVhfRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdQQVJTRSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyBwb3NpdGlvbjogbnVtYmVyLFxuICAgIHB1YmxpYyBsaW5lOiBudW1iZXIsXG4gICAgcHVibGljIGNvbHVtbjogbnVtYmVyLFxuICAgIHB1YmxpYyBleHByZXNzaW9uOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYCR7bWVzc2FnZX0gYXQgbGluZSAke2xpbmV9LCBjb2x1bW4gJHtjb2x1bW59YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRUb2tlbkVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9VTkVYUEVDVEVEX1RPS0VOJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB0b2tlbjogc3RyaW5nLFxuICAgIHB1YmxpYyBleHBlY3RlZDogc3RyaW5nW10sXG4gICAgcHVibGljIHBvc2l0aW9uOiBudW1iZXJcbiAgKSB7XG4gICAgc3VwZXIoYFVuZXhwZWN0ZWQgdG9rZW4gJyR7dG9rZW59JywgZXhwZWN0ZWQgb25lIG9mOiAke2V4cGVjdGVkLmpvaW4oJywgJyl9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVudGVybWluYXRlZFN0cmluZ0Vycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdQQVJTRV9VTlRFUk1JTkFURURfU1RSSU5HJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcihgVW50ZXJtaW5hdGVkIHN0cmluZyBzdGFydGluZyBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkTnVtYmVyRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ1BBUlNFX0lOVkFMSURfTlVNQkVSJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnUEFSU0UnO1xuXG4gIGNvbnN0cnVjdG9yKHZhbHVlOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcihgSW52YWxpZCBudW1iZXIgJyR7dmFsdWV9JyBhdCBwb3NpdGlvbiAke3Bvc2l0aW9ufWApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZhbGlkYXRpb24gRXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9DSVJDVUxBUl9ERVBFTkRFTkNZJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnVkFMSURBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGN5Y2xlOiBzdHJpbmdbXSxcbiAgICBwdWJsaWMgaW52b2x2ZWRGb3JtdWxhczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoYENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICR7Y3ljbGUuam9pbignIOKGkiAnKX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkVmFyaWFibGVFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9VTkRFRklORURfVkFSSUFCTEUnO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdWQUxJREFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdmFyaWFibGVOYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGV4cHJlc3Npb246IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihgVW5kZWZpbmVkIHZhcmlhYmxlOiAke3ZhcmlhYmxlTmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5kZWZpbmVkRnVuY3Rpb25FcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnVkFMSURBVElPTl9VTkRFRklORURfRlVOQ1RJT04nO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdWQUxJREFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZnVuY3Rpb25OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVW5kZWZpbmVkIGZ1bmN0aW9uOiAke2Z1bmN0aW9uTmFtZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRHVwbGljYXRlRm9ybXVsYUVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdWQUxJREFUSU9OX0RVUExJQ0FURV9GT1JNVUxBJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnVkFMSURBVElPTic7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGZvcm11bGFJZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoYER1cGxpY2F0ZSBmb3JtdWxhIElEOiAke2Zvcm11bGFJZH1gKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFdmFsdWF0aW9uIEVycm9yc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY2xhc3MgRGl2aXNpb25CeVplcm9FcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnRVZBTF9ESVZJU0lPTl9CWV9aRVJPJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoJ0RpdmlzaW9uIGJ5IHplcm8nKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZU1pc21hdGNoRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0VWQUxfVFlQRV9NSVNNQVRDSCc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBleHBlY3RlZDogVmFsdWVUeXBlIHwgVmFsdWVUeXBlW10gfCBzdHJpbmcsXG4gICAgcHVibGljIGFjdHVhbDogVmFsdWVUeXBlIHwgc3RyaW5nLFxuICAgIHB1YmxpYyBjb250ZXh0OiBzdHJpbmdcbiAgKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRTdHIgPSBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSA/IGV4cGVjdGVkLmpvaW4oJyBvciAnKSA6IGV4cGVjdGVkO1xuICAgIHN1cGVyKGBUeXBlIG1pc21hdGNoOiBleHBlY3RlZCAke2V4cGVjdGVkU3RyfSwgZ290ICR7YWN0dWFsfSBpbiAke2NvbnRleHR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyZ3VtZW50Q291bnRFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGUgPSAnRVZBTF9BUkdVTUVOVF9DT1VOVCc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZXhwZWN0ZWQ6IHsgbWluOiBudW1iZXI7IG1heDogbnVtYmVyIH0sXG4gICAgcHVibGljIGFjdHVhbDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGV4cGVjdGVkU3RyID0gZXhwZWN0ZWQubWluID09PSBleHBlY3RlZC5tYXhcbiAgICAgID8gYCR7ZXhwZWN0ZWQubWlufWBcbiAgICAgIDogZXhwZWN0ZWQubWF4ID09PSAtMVxuICAgICAgICA/IGBhdCBsZWFzdCAke2V4cGVjdGVkLm1pbn1gXG4gICAgICAgIDogYCR7ZXhwZWN0ZWQubWlufS0ke2V4cGVjdGVkLm1heH1gO1xuICAgIHN1cGVyKGBGdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX0gZXhwZWN0cyAke2V4cGVjdGVkU3RyfSBhcmd1bWVudHMsIGdvdCAke2FjdHVhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW52YWxpZE9wZXJhdGlvbkVycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdFVkFMX0lOVkFMSURfT1BFUkFUSU9OJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG9wZXJhdG9yOiBzdHJpbmcsXG4gICAgcHVibGljIG9wZXJhbmRUeXBlczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCBhcHBseSBvcGVyYXRvciAnJHtvcGVyYXRvcn0nIHRvIHR5cGVzOiAke29wZXJhbmRUeXBlcy5qb2luKCcsICcpfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eUFjY2Vzc0Vycm9yIGV4dGVuZHMgRm9ybXVsYUVuZ2luZUVycm9yIHtcbiAgcmVhZG9ubHkgY29kZSA9ICdFVkFMX1BST1BFUlRZX0FDQ0VTUyc7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBwcm9wZXJ0eTogc3RyaW5nLFxuICAgIHB1YmxpYyBvYmplY3RUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCBhY2Nlc3MgcHJvcGVydHkgJyR7cHJvcGVydHl9JyBvbiAke29iamVjdFR5cGV9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluZGV4QWNjZXNzRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0VWQUxfSU5ERVhfQUNDRVNTJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGluZGV4OiB1bmtub3duLFxuICAgIHB1YmxpYyBvYmplY3RUeXBlOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoYENhbm5vdCB1c2UgaW5kZXggJyR7aW5kZXh9JyBvbiAke29iamVjdFR5cGV9YCk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjaW1hbCBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxFcnJvciBleHRlbmRzIEZvcm11bGFFbmdpbmVFcnJvciB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX0VSUk9SJztcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IEVycm9yQ2F0ZWdvcnkgPSAnRVZBTFVBVElPTic7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxPdmVyZmxvd0Vycm9yIGV4dGVuZHMgRGVjaW1hbEVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgY29kZTogc3RyaW5nID0gJ0RFQ0lNQUxfT1ZFUkZMT1cnO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogc3RyaW5nLCBwdWJsaWMgbWF4RXhwb25lbnQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBEZWNpbWFsIG92ZXJmbG93OiBleHBvbmVudCBleGNlZWRzICR7bWF4RXhwb25lbnR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlY2ltYWxVbmRlcmZsb3dFcnJvciBleHRlbmRzIERlY2ltYWxFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX1VOREVSRkxPVyc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBtaW5FeHBvbmVudDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYERlY2ltYWwgdW5kZXJmbG93OiBleHBvbmVudCBiZWxvdyAke21pbkV4cG9uZW50fWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWNpbWFsRGl2aXNpb25CeVplcm9FcnJvciBleHRlbmRzIERlY2ltYWxFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdERUNJTUFMX0RJVklTSU9OX0JZX1pFUk8nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdEaXZpc2lvbiBieSB6ZXJvJyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWREZWNpbWFsRXJyb3IgZXh0ZW5kcyBEZWNpbWFsRXJyb3Ige1xuICBvdmVycmlkZSByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnSU5WQUxJRF9ERUNJTUFMJztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5wdXQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBJbnZhbGlkIGRlY2ltYWwgdmFsdWU6IFwiJHtpbnB1dH1cImApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbmZpZ3VyYXRpb24gRXJyb3JzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlID0gJ0NPTkZJR1VSQVRJT05fRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdDT05GSUdVUkFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZWN1cml0eSBFcnJvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNsYXNzIFNlY3VyaXR5RXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnU0VDVVJJVFlfRVJST1InO1xuICByZWFkb25seSBjYXRlZ29yeTogRXJyb3JDYXRlZ29yeSA9ICdFVkFMVUFUSU9OJztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4SXRlcmF0aW9uc0Vycm9yIGV4dGVuZHMgU2VjdXJpdHlFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdNQVhfSVRFUkFUSU9OU19FWENFRURFRCc7XG5cbiAgY29uc3RydWN0b3IobGltaXQ6IG51bWJlcikge1xuICAgIHN1cGVyKGBNYXhpbXVtIGl0ZXJhdGlvbnMgZXhjZWVkZWQ6ICR7bGltaXR9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1heFJlY3Vyc2lvbkVycm9yIGV4dGVuZHMgU2VjdXJpdHlFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IGNvZGU6IHN0cmluZyA9ICdNQVhfUkVDVVJTSU9OX0VYQ0VFREVEJztcblxuICBjb25zdHJ1Y3RvcihsaW1pdDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYE1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkOiAke2xpbWl0fWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhFeHByZXNzaW9uTGVuZ3RoRXJyb3IgZXh0ZW5kcyBTZWN1cml0eUVycm9yIHtcbiAgb3ZlcnJpZGUgcmVhZG9ubHkgY29kZTogc3RyaW5nID0gJ01BWF9FWFBSRVNTSU9OX0xFTkdUSF9FWENFRURFRCc7XG5cbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIsIGxpbWl0OiBudW1iZXIpIHtcbiAgICBzdXBlcihgRXhwcmVzc2lvbiBsZW5ndGggJHtsZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSAke2xpbWl0fWApO1xuICB9XG59XG5cbi8vIENvbmNyZXRlIGNsYXNzIGZvciBnZW5lcmFsIGVycm9yc1xuZXhwb3J0IGNsYXNzIEdlbmVyYWxGb3JtdWxhRXJyb3IgZXh0ZW5kcyBGb3JtdWxhRW5naW5lRXJyb3Ige1xuICByZWFkb25seSBjb2RlOiBzdHJpbmcgPSAnR0VORVJBTF9FUlJPUic7XG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBFcnJvckNhdGVnb3J5ID0gJ0VWQUxVQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,51 @@
1
+ import { ASTNode, EvaluationContext, EvaluationResult, FunctionDefinition, FormulaEngineConfig } from './types';
2
+ import { DecimalUtils } from './decimal-utils';
3
+ export declare class Evaluator {
4
+ private parser;
5
+ private decimalUtils;
6
+ private functions;
7
+ private strictMode;
8
+ private securityConfig;
9
+ private recursionDepth;
10
+ private iterationCount;
11
+ private accessedVariables;
12
+ constructor(decimalUtils: DecimalUtils, functions: Map<string, FunctionDefinition>, config?: FormulaEngineConfig);
13
+ /**
14
+ * Evaluate an expression string
15
+ */
16
+ evaluate(expression: string, context: EvaluationContext): EvaluationResult;
17
+ /**
18
+ * Evaluate an AST node
19
+ */
20
+ evaluateNode(node: ASTNode, context: EvaluationContext): unknown;
21
+ private checkRecursionLimit;
22
+ private checkIterationLimit;
23
+ private evaluateVariable;
24
+ private maybeConvertToDecimal;
25
+ private evaluateBinaryOperation;
26
+ private evaluateUnaryOperation;
27
+ private evaluateConditional;
28
+ private evaluateFunctionCall;
29
+ private evaluateSumWithExpression;
30
+ private evaluateFilter;
31
+ private evaluateMap;
32
+ private evaluateMemberAccess;
33
+ private evaluateIndexAccess;
34
+ private isNumeric;
35
+ private toDecimal;
36
+ private toNumber;
37
+ private toBool;
38
+ private typeOf;
39
+ private add;
40
+ private subtract;
41
+ private multiply;
42
+ private divide;
43
+ private modulo;
44
+ private power;
45
+ private negate;
46
+ private equals;
47
+ private lessThan;
48
+ private greaterThan;
49
+ private lessThanOrEqual;
50
+ private greaterThanOrEqual;
51
+ }