@revisium/formula 0.6.2 → 0.7.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.
- package/dist/{chunk-V6MB7X37.js → chunk-5TM76LGI.js} +54 -6
- package/dist/chunk-5TM76LGI.js.map +1 -0
- package/dist/{chunk-QS3FBYM5.cjs → chunk-IM22W645.cjs} +54 -6
- package/dist/chunk-IM22W645.cjs.map +1 -0
- package/dist/editor/index.cjs +4 -4
- package/dist/editor/index.d.cts +1 -1
- package/dist/editor/index.d.ts +1 -1
- package/dist/editor/index.js +1 -1
- package/dist/formula-spec.cjs +21 -2
- package/dist/formula-spec.cjs.map +1 -1
- package/dist/formula-spec.js +21 -2
- package/dist/formula-spec.js.map +1 -1
- package/dist/{index-PFKKFfeI.d.cts → index-CPsOPCQ6.d.cts} +11 -2
- package/dist/{index-PFKKFfeI.d.ts → index-CPsOPCQ6.d.ts} +11 -2
- package/dist/index.cjs +8 -8
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-QS3FBYM5.cjs.map +0 -1
- package/dist/chunk-V6MB7X37.js.map +0 -1
|
@@ -67,6 +67,7 @@ var grammarText = String.raw`Formula {
|
|
|
67
67
|
// Primary expressions
|
|
68
68
|
Primary
|
|
69
69
|
= "(" Expression ")" -- paren
|
|
70
|
+
| "[" string "]" -- bracketedField
|
|
70
71
|
| number
|
|
71
72
|
| string
|
|
72
73
|
| boolean
|
|
@@ -124,6 +125,9 @@ var grammarText = String.raw`Formula {
|
|
|
124
125
|
var grammar2 = ohm.grammar(grammarText);
|
|
125
126
|
|
|
126
127
|
// src/ohm/semantics/index.ts
|
|
128
|
+
function isSafePropertyName(name) {
|
|
129
|
+
return name !== "__proto__";
|
|
130
|
+
}
|
|
127
131
|
function childrenToAST(children) {
|
|
128
132
|
return children.filter((c) => "toAST" in c).map((c) => c.toAST());
|
|
129
133
|
}
|
|
@@ -297,10 +301,18 @@ semantics.addOperation("toAST", {
|
|
|
297
301
|
};
|
|
298
302
|
},
|
|
299
303
|
Postfix_index(obj, _lb, index, _rb) {
|
|
304
|
+
const indexAST = index.toAST();
|
|
305
|
+
if (indexAST.type === "StringLiteral") {
|
|
306
|
+
return {
|
|
307
|
+
type: "BracketedMemberExpression",
|
|
308
|
+
object: obj.toAST(),
|
|
309
|
+
property: indexAST.value
|
|
310
|
+
};
|
|
311
|
+
}
|
|
300
312
|
return {
|
|
301
313
|
type: "IndexExpression",
|
|
302
314
|
object: obj.toAST(),
|
|
303
|
-
index:
|
|
315
|
+
index: indexAST
|
|
304
316
|
};
|
|
305
317
|
},
|
|
306
318
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
@@ -320,6 +332,10 @@ semantics.addOperation("toAST", {
|
|
|
320
332
|
Primary_paren(_lp, expr, _rp) {
|
|
321
333
|
return expr.toAST();
|
|
322
334
|
},
|
|
335
|
+
Primary_bracketedField(_lb, str, _rb) {
|
|
336
|
+
const strAST = str.toAST();
|
|
337
|
+
return { type: "BracketedIdentifier", name: strAST.value };
|
|
338
|
+
},
|
|
323
339
|
Primary(e) {
|
|
324
340
|
return e.toAST();
|
|
325
341
|
},
|
|
@@ -375,6 +391,9 @@ semantics.addOperation("dependencies", {
|
|
|
375
391
|
identifier(_start, _rest) {
|
|
376
392
|
return [this.sourceString];
|
|
377
393
|
},
|
|
394
|
+
Primary_bracketedField(_lb, _str, _rb) {
|
|
395
|
+
return [this.sourceString];
|
|
396
|
+
},
|
|
378
397
|
rootPath(_slash, _path) {
|
|
379
398
|
return [this.sourceString];
|
|
380
399
|
},
|
|
@@ -397,6 +416,14 @@ semantics.addOperation("dependencies", {
|
|
|
397
416
|
Postfix_index(obj, _lb, index, _rb) {
|
|
398
417
|
const objDeps = obj.dependencies();
|
|
399
418
|
const indexNode = index.toAST();
|
|
419
|
+
if (indexNode.type === "StringLiteral") {
|
|
420
|
+
const strValue = indexNode.value;
|
|
421
|
+
const quote = this.sourceString.includes('"') ? '"' : "'";
|
|
422
|
+
if (objDeps.length === 1) {
|
|
423
|
+
return [`${objDeps[0]}[${quote}${strValue}${quote}]`];
|
|
424
|
+
}
|
|
425
|
+
return objDeps;
|
|
426
|
+
}
|
|
400
427
|
const getNumericIndex = (node) => {
|
|
401
428
|
if (node.type === "NumberLiteral") {
|
|
402
429
|
return node.value;
|
|
@@ -466,6 +493,9 @@ var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
466
493
|
"includes"
|
|
467
494
|
]);
|
|
468
495
|
semantics.addOperation("features", {
|
|
496
|
+
Primary_bracketedField(_lb, _str, _rb) {
|
|
497
|
+
return ["bracket_notation"];
|
|
498
|
+
},
|
|
469
499
|
rootPath(_slash, _path) {
|
|
470
500
|
const path = this.sourceString;
|
|
471
501
|
const features = ["root_path"];
|
|
@@ -496,6 +526,10 @@ semantics.addOperation("features", {
|
|
|
496
526
|
Postfix_index(obj, _lb, index, _rb) {
|
|
497
527
|
const objFeatures = obj.features();
|
|
498
528
|
const indexFeatures = index.features();
|
|
529
|
+
const indexNode = index.toAST();
|
|
530
|
+
if (indexNode.type === "StringLiteral") {
|
|
531
|
+
return [...objFeatures, ...indexFeatures, "bracket_notation"];
|
|
532
|
+
}
|
|
499
533
|
return [...objFeatures, ...indexFeatures, "array_index"];
|
|
500
534
|
},
|
|
501
535
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
@@ -705,10 +739,17 @@ semantics.addOperation("eval(ctx)", {
|
|
|
705
739
|
Postfix_index(obj, _lb, index, _rb) {
|
|
706
740
|
const objVal = obj.eval(this.args.ctx);
|
|
707
741
|
const idx = index.eval(this.args.ctx);
|
|
708
|
-
if (idx
|
|
709
|
-
|
|
742
|
+
if (typeof idx === "string") {
|
|
743
|
+
if (!isSafePropertyName(idx)) {
|
|
744
|
+
return void 0;
|
|
745
|
+
}
|
|
746
|
+
return objVal?.[idx];
|
|
710
747
|
}
|
|
711
|
-
|
|
748
|
+
const numIdx = idx;
|
|
749
|
+
if (numIdx < 0) {
|
|
750
|
+
return objVal?.[objVal.length + numIdx];
|
|
751
|
+
}
|
|
752
|
+
return objVal?.[numIdx];
|
|
712
753
|
},
|
|
713
754
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
714
755
|
return obj.eval(this.args.ctx);
|
|
@@ -725,6 +766,13 @@ semantics.addOperation("eval(ctx)", {
|
|
|
725
766
|
Primary_paren(_lp, expr, _rp) {
|
|
726
767
|
return expr.eval(this.args.ctx);
|
|
727
768
|
},
|
|
769
|
+
Primary_bracketedField(_lb, str, _rb) {
|
|
770
|
+
const fieldName = str.eval(this.args.ctx);
|
|
771
|
+
if (!isSafePropertyName(fieldName)) {
|
|
772
|
+
return void 0;
|
|
773
|
+
}
|
|
774
|
+
return this.args.ctx[fieldName];
|
|
775
|
+
},
|
|
728
776
|
Primary(e) {
|
|
729
777
|
return e.eval(this.args.ctx);
|
|
730
778
|
},
|
|
@@ -1164,5 +1212,5 @@ function validateFormulaSyntax(expression) {
|
|
|
1164
1212
|
}
|
|
1165
1213
|
|
|
1166
1214
|
export { evaluate, evaluateWithContext, inferFormulaType, parseExpression, parseFormula, validateFormulaSyntax, validateSyntax };
|
|
1167
|
-
//# sourceMappingURL=chunk-
|
|
1168
|
-
//# sourceMappingURL=chunk-
|
|
1215
|
+
//# sourceMappingURL=chunk-5TM76LGI.js.map
|
|
1216
|
+
//# sourceMappingURL=chunk-5TM76LGI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ohm/grammar/index.ts","../src/ohm/semantics/index.ts","../src/ohm/core/parser.ts","../src/parse-formula.ts","../src/validate-syntax.ts"],"names":["grammar"],"mappings":"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","file":"chunk-5TM76LGI.js","sourcesContent":["import * as ohm from 'ohm-js';\n\n// Using String.raw to avoid double-escaping backslashes in Ohm grammar\n// In Ohm grammar, we need single backslashes for escape sequences\nconst grammarText = String.raw`Formula {\n Expression = Ternary\n\n // Ternary: condition ? then : else\n Ternary\n = LogicalOr \"?\" Ternary \":\" Ternary -- ternary\n | LogicalOr\n\n // Logical OR: a || b\n LogicalOr\n = LogicalOr \"||\" LogicalAnd -- or\n | LogicalAnd\n\n // Logical AND: a && b\n LogicalAnd\n = LogicalAnd \"&&\" Equality -- and\n | Equality\n\n // Equality: a == b, a != b\n Equality\n = Equality \"==\" Comparison -- eq\n | Equality \"!=\" Comparison -- neq\n | Comparison\n\n // Comparison: a > b, a < b, a >= b, a <= b\n Comparison\n = Comparison \">=\" Additive -- gte\n | Comparison \"<=\" Additive -- lte\n | Comparison \">\" Additive -- gt\n | Comparison \"<\" Additive -- lt\n | Additive\n\n // Additive: a + b, a - b\n Additive\n = Additive \"+\" Multiplicative -- plus\n | Additive \"-\" Multiplicative -- minus\n | Multiplicative\n\n // Multiplicative: a * b, a / b, a % b\n Multiplicative\n = Multiplicative \"*\" Unary -- times\n | Multiplicative \"/\" Unary -- div\n | Multiplicative \"%\" Unary -- mod\n | Unary\n\n // Unary: -a, !a\n Unary\n = \"-\" Unary -- neg\n | \"!\" Unary -- not\n | Postfix\n\n // Postfix: function calls, property access, array access\n Postfix\n = Postfix \"(\" Arguments? \")\" -- call\n | Postfix \".\" identifier -- property\n | Postfix \"[\" Expression \"]\" -- index\n | Postfix \"[\" \"*\" \"]\" -- wildcard\n | Primary\n\n // Arguments for function calls\n Arguments\n = Expression (\",\" Expression)*\n\n // Primary expressions\n Primary\n = \"(\" Expression \")\" -- paren\n | \"[\" string \"]\" -- bracketedField\n | number\n | string\n | boolean\n | null\n | rootPath\n | relativePath\n | contextToken\n | identifier\n\n // Literals\n number\n = \"-\"? digit+ \".\" digit+ -- float\n | \"-\"? digit+ -- int\n\n string\n = \"\\\"\" doubleStringChar* \"\\\"\"\n | \"'\" singleStringChar* \"'\"\n\n doubleStringChar\n = ~(\"\\\"\" | \"\\\\\") any -- regular\n | \"\\\\\" any -- escape\n\n singleStringChar\n = ~(\"'\" | \"\\\\\") any -- regular\n | \"\\\\\" any -- escape\n\n boolean\n = \"true\" ~identifierPart -- true\n | \"false\" ~identifierPart -- false\n\n null = \"null\" ~identifierPart\n\n // Identifiers and paths\n identifier = ~reserved identifierStart identifierPart*\n\n identifierStart = letter | \"_\"\n identifierPart = letter | digit | \"_\"\n\n // Special paths\n rootPath = \"/\" identifierPart+\n\n relativePathPrefix = \"..\" \"/\"\n relativePath = relativePathPrefix+ identifierPart+\n\n contextToken\n = \"@\" identifierPart+ -- at\n | \"#\" identifierPart+ -- hash\n\n // Reserved words (cannot be used as identifiers)\n reserved\n = (\"true\" | \"false\" | \"null\") ~identifierPart\n\n // Whitespace (implicit, Ohm handles automatically)\n}`;\n\nexport const grammar = ohm.grammar(grammarText);\n","import type { NonterminalNode, TerminalNode, IterationNode } from 'ohm-js';\nimport { grammar } from '../grammar';\nimport type { ASTNode } from '../core/types';\nimport type { FormulaFeature } from '../../types';\n\ntype OhmNode = NonterminalNode | TerminalNode | IterationNode;\n\nfunction isSafePropertyName(name: string): boolean {\n return name !== '__proto__';\n}\n\nfunction childrenToAST(children: OhmNode[]): ASTNode[] {\n return children\n .filter((c): c is NonterminalNode => 'toAST' in c)\n .map((c) => c.toAST() as ASTNode);\n}\n\nfunction childrenDependencies(children: OhmNode[]): string[] {\n return children\n .filter((c): c is NonterminalNode => 'dependencies' in c)\n .flatMap((c) => c.dependencies() as string[]);\n}\n\nfunction childrenFeatures(children: OhmNode[]): FormulaFeature[] {\n return children\n .filter((c): c is NonterminalNode => 'features' in c)\n .flatMap((c) => c.features() as FormulaFeature[]);\n}\n\nexport const semantics = grammar.createSemantics();\n\n// ============ toAST Operation ============\nsemantics.addOperation<ASTNode>('toAST', {\n Expression(e) {\n return e.toAST();\n },\n\n Ternary_ternary(cond, _q, cons, _c, alt) {\n return {\n type: 'TernaryOp',\n condition: cond.toAST(),\n consequent: cons.toAST(),\n alternate: alt.toAST(),\n };\n },\n Ternary(e) {\n return e.toAST();\n },\n\n LogicalOr_or(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '||',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n LogicalOr(e) {\n return e.toAST();\n },\n\n LogicalAnd_and(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '&&',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n LogicalAnd(e) {\n return e.toAST();\n },\n\n Equality_eq(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '==',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Equality_neq(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '!=',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Equality(e) {\n return e.toAST();\n },\n\n Comparison_gte(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '>=',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Comparison_lte(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '<=',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Comparison_gt(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '>',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Comparison_lt(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '<',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Comparison(e) {\n return e.toAST();\n },\n\n Additive_plus(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '+',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Additive_minus(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '-',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Additive(e) {\n return e.toAST();\n },\n\n Multiplicative_times(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '*',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Multiplicative_div(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '/',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Multiplicative_mod(left, _op, right) {\n return {\n type: 'BinaryOp',\n op: '%',\n left: left.toAST(),\n right: right.toAST(),\n };\n },\n Multiplicative(e) {\n return e.toAST();\n },\n\n Unary_neg(_op, expr) {\n return { type: 'UnaryOp', op: '-', argument: expr.toAST() };\n },\n Unary_not(_op, expr) {\n return { type: 'UnaryOp', op: '!', argument: expr.toAST() };\n },\n Unary(e) {\n return e.toAST();\n },\n\n Postfix_call(callee, _lp, args, _rp) {\n const firstArg = args.children[0];\n const argList = firstArg ? firstArg.toAST() : [];\n return {\n type: 'CallExpression',\n callee: callee.toAST(),\n arguments: Array.isArray(argList) ? argList : [argList],\n };\n },\n Postfix_property(obj, _dot, prop) {\n return {\n type: 'MemberExpression',\n object: obj.toAST(),\n property: prop.sourceString,\n };\n },\n Postfix_index(obj, _lb, index, _rb) {\n const indexAST = index.toAST() as ASTNode;\n if (indexAST.type === 'StringLiteral') {\n return {\n type: 'BracketedMemberExpression',\n object: obj.toAST(),\n property: indexAST.value,\n };\n }\n return {\n type: 'IndexExpression',\n object: obj.toAST(),\n index: indexAST,\n };\n },\n Postfix_wildcard(obj, _lb, _star, _rb) {\n return {\n type: 'WildcardExpression',\n object: obj.toAST(),\n };\n },\n Postfix(e) {\n return e.toAST();\n },\n\n // Returns an array of arguments, not a single ASTNode\n // @ts-expect-error - intentionally returns array for function arguments\n Arguments(first, _comma, rest) {\n return [first.toAST(), ...rest.children.map((c) => c.toAST())];\n },\n\n Primary_paren(_lp, expr, _rp) {\n return expr.toAST();\n },\n Primary_bracketedField(_lb, str, _rb) {\n const strAST = str.toAST() as { type: 'StringLiteral'; value: string };\n return { type: 'BracketedIdentifier', name: strAST.value };\n },\n Primary(e) {\n return e.toAST();\n },\n\n number_float(_neg, _int, _dot, _frac) {\n return {\n type: 'NumberLiteral',\n value: Number.parseFloat(this.sourceString),\n };\n },\n number_int(_neg, _digits) {\n return {\n type: 'NumberLiteral',\n value: Number.parseInt(this.sourceString, 10),\n };\n },\n\n string(_open, chars, _close) {\n const raw = chars.sourceString;\n return { type: 'StringLiteral', value: raw.replaceAll(/\\\\(.)/g, '$1') };\n },\n\n boolean_true(_) {\n return { type: 'BooleanLiteral', value: true };\n },\n boolean_false(_) {\n return { type: 'BooleanLiteral', value: false };\n },\n\n null(_) {\n return { type: 'NullLiteral' };\n },\n\n identifier(_start, _rest) {\n return { type: 'Identifier', name: this.sourceString };\n },\n\n rootPath(_slash, _path) {\n return { type: 'RootPath', path: this.sourceString };\n },\n\n relativePath(_dotSlashes, _parts) {\n return { type: 'RelativePath', path: this.sourceString };\n },\n\n contextToken_at(_at, _name) {\n return { type: 'ContextToken', name: this.sourceString };\n },\n contextToken_hash(_hash, _name) {\n return { type: 'ContextToken', name: this.sourceString };\n },\n\n // @ts-expect-error - _iter returns array for iteration nodes\n _iter(...children) {\n return childrenToAST(children);\n },\n\n _terminal() {\n return { type: 'Identifier', name: this.sourceString };\n },\n});\n\n// ============ dependencies Operation ============\nsemantics.addOperation<string[]>('dependencies', {\n identifier(_start, _rest) {\n return [this.sourceString];\n },\n\n Primary_bracketedField(_lb, _str, _rb) {\n return [this.sourceString];\n },\n\n rootPath(_slash, _path) {\n return [this.sourceString];\n },\n\n relativePath(_dotSlashes, _parts) {\n return [this.sourceString];\n },\n\n contextToken_at(_at, _name) {\n return [];\n },\n contextToken_hash(_hash, _name) {\n return [];\n },\n\n Postfix_property(obj, _dot, prop) {\n const objDeps = obj.dependencies() as string[];\n if (objDeps.length === 1) {\n return [`${objDeps[0]}.${prop.sourceString}`];\n }\n return objDeps;\n },\n\n Postfix_index(obj, _lb, index, _rb) {\n const objDeps = obj.dependencies() as string[];\n const indexNode = index.toAST() as ASTNode;\n\n if (indexNode.type === 'StringLiteral') {\n const strValue = indexNode.value;\n const quote = this.sourceString.includes('\"') ? '\"' : \"'\";\n if (objDeps.length === 1) {\n return [`${objDeps[0]}[${quote}${strValue}${quote}]`];\n }\n return objDeps;\n }\n\n const getNumericIndex = (node: ASTNode): number | null => {\n if (node.type === 'NumberLiteral') {\n return node.value;\n }\n if (\n node.type === 'UnaryOp' &&\n node.op === '-' &&\n node.argument.type === 'NumberLiteral'\n ) {\n return -node.argument.value;\n }\n return null;\n };\n\n const numericIndex = getNumericIndex(indexNode);\n if (objDeps.length === 1 && numericIndex !== null) {\n return [`${objDeps[0]}[${numericIndex}]`];\n }\n return [...objDeps, ...(index.dependencies() as string[])];\n },\n\n Postfix_wildcard(obj, _lb, _star, _rb) {\n const objDeps = obj.dependencies() as string[];\n if (objDeps.length === 1) {\n return [`${objDeps[0]}[*]`];\n }\n return objDeps;\n },\n\n Postfix_call(callee, _lp, args, _rp) {\n const calleeDeps = callee.dependencies() as string[];\n const calleeAST = callee.toAST() as ASTNode;\n const argDeps = childrenDependencies(args.children);\n\n if (calleeAST.type === 'Identifier') {\n return argDeps;\n }\n return [...calleeDeps, ...argDeps];\n },\n\n number_float(_neg, _int, _dot, _frac) {\n return [];\n },\n number_int(_neg, _digits) {\n return [];\n },\n\n string(_open, _chars, _close) {\n return [];\n },\n\n boolean_true(_) {\n return [];\n },\n boolean_false(_) {\n return [];\n },\n\n null(_) {\n return [];\n },\n\n _nonterminal(...children) {\n return childrenDependencies(children);\n },\n\n _iter(...children) {\n return childrenDependencies(children);\n },\n\n _terminal() {\n return [];\n },\n});\n\n// ============ features Operation ============\nconst ARRAY_FUNCTIONS = new Set([\n 'sum',\n 'avg',\n 'count',\n 'first',\n 'last',\n 'join',\n 'includes',\n]);\n\nsemantics.addOperation<FormulaFeature[]>('features', {\n Primary_bracketedField(_lb, _str, _rb) {\n return ['bracket_notation'];\n },\n\n rootPath(_slash, _path) {\n const path = this.sourceString;\n const features: FormulaFeature[] = ['root_path'];\n if (path.includes('.')) {\n features.push('nested_path');\n }\n return features;\n },\n\n relativePath(_dotSlashes, _parts) {\n const path = this.sourceString;\n const features: FormulaFeature[] = ['relative_path'];\n const withoutPrefix = path.replace(/^(\\.\\.\\/)+/, '');\n if (withoutPrefix.includes('.')) {\n features.push('nested_path');\n }\n return features;\n },\n\n contextToken_at(_at, _name) {\n return ['context_token'];\n },\n contextToken_hash(_hash, _name) {\n return ['context_token'];\n },\n\n Postfix_property(obj, _dot, _prop) {\n const objFeatures = obj.features() as FormulaFeature[];\n return [...objFeatures, 'nested_path'];\n },\n\n Postfix_index(obj, _lb, index, _rb) {\n const objFeatures = obj.features() as FormulaFeature[];\n const indexFeatures = index.features() as FormulaFeature[];\n const indexNode = index.toAST() as ASTNode;\n if (indexNode.type === 'StringLiteral') {\n return [...objFeatures, ...indexFeatures, 'bracket_notation'];\n }\n return [...objFeatures, ...indexFeatures, 'array_index'];\n },\n\n Postfix_wildcard(obj, _lb, _star, _rb) {\n const objFeatures = obj.features() as FormulaFeature[];\n return [...objFeatures, 'array_wildcard'];\n },\n\n Postfix_call(callee, _lp, args, _rp) {\n const calleeAST = callee.toAST() as ASTNode;\n const argFeatures = childrenFeatures(args.children);\n\n if (\n calleeAST.type === 'Identifier' &&\n ARRAY_FUNCTIONS.has(calleeAST.name.toLowerCase())\n ) {\n return [...argFeatures, 'array_function'];\n }\n return argFeatures;\n },\n\n _nonterminal(...children) {\n return childrenFeatures(children);\n },\n\n _iter(...children) {\n return childrenFeatures(children);\n },\n\n _terminal() {\n return [];\n },\n});\n\n// ============ eval Operation ============\nconst BUILTINS: Record<string, (...args: unknown[]) => unknown> = {\n // Logical\n and: (a, b) => Boolean(a) && Boolean(b),\n or: (a, b) => Boolean(a) || Boolean(b),\n not: (a) => !a,\n\n // String\n concat: (...args) => args.map(String).join(''),\n upper: (s) => String(s).toUpperCase(),\n lower: (s) => String(s).toLowerCase(),\n trim: (s) => String(s).trim(),\n left: (s, n) => String(s).slice(0, Math.max(0, Math.floor(Number(n)))),\n right: (s, n) => {\n const str = String(s);\n const count = Math.max(0, Math.floor(Number(n)));\n return count === 0 ? '' : str.slice(-count);\n },\n replace: (s, search, repl) => String(s).replace(String(search), String(repl)),\n tostring: String,\n length: (s) => {\n if (Array.isArray(s)) return s.length;\n if (typeof s === 'string') return s.length;\n if (s !== null && typeof s === 'object') return Object.keys(s).length;\n return String(s).length;\n },\n contains: (s, search) => String(s).includes(String(search)),\n startswith: (s, search) => String(s).startsWith(String(search)),\n endswith: (s, search) => String(s).endsWith(String(search)),\n join: (arr: unknown, sep: unknown) => {\n if (!Array.isArray(arr)) return '';\n if (sep === undefined || sep === null) return arr.join(',');\n if (typeof sep !== 'string' && typeof sep !== 'number') {\n return arr.join(',');\n }\n return arr.join(String(sep));\n },\n\n // Numeric\n tonumber: Number,\n toboolean: Boolean,\n isnull: (v) => v === null || v === undefined,\n coalesce: (...args) =>\n args.find((v) => v !== null && v !== undefined) ?? null,\n round: (n, dec) => {\n const factor = 10 ** (dec === undefined ? 0 : Number(dec));\n return Math.round(Number(n) * factor) / factor;\n },\n floor: (n) => Math.floor(Number(n)),\n ceil: (n) => Math.ceil(Number(n)),\n abs: (n) => Math.abs(Number(n)),\n sqrt: (n) => Math.sqrt(Number(n)),\n pow: (base, exp) => Math.pow(Number(base), Number(exp)),\n min: (...args) =>\n args.length === 0 ? Number.NaN : Math.min(...args.map(Number)),\n max: (...args) =>\n args.length === 0 ? Number.NaN : Math.max(...args.map(Number)),\n log: (n) => Math.log(Number(n)),\n log10: (n) => Math.log10(Number(n)),\n exp: (n) => Math.exp(Number(n)),\n sign: (n) => Math.sign(Number(n)),\n\n // Array\n sum: (arr) =>\n Array.isArray(arr) ? arr.reduce((a, b) => a + Number(b), 0) : 0,\n avg: (arr) =>\n Array.isArray(arr) && arr.length > 0\n ? arr.reduce((a, b) => a + Number(b), 0) / arr.length\n : 0,\n count: (arr) => (Array.isArray(arr) ? arr.length : 0),\n first: (arr) => (Array.isArray(arr) ? arr[0] : undefined),\n last: (arr) => (Array.isArray(arr) ? arr.at(-1) : undefined),\n includes: (arr, val) => (Array.isArray(arr) ? arr.includes(val) : false),\n\n // Conditional\n if: (cond, ifTrue, ifFalse) => (cond ? ifTrue : ifFalse),\n};\n\nfunction getByPath(obj: unknown, path: string): unknown {\n const parts = path.split('.');\n let current = obj;\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nsemantics.addOperation<unknown>('eval(ctx)', {\n Expression(e) {\n return e.eval(this.args.ctx);\n },\n\n Ternary_ternary(cond, _q, cons, _c, alt) {\n return cond.eval(this.args.ctx)\n ? cons.eval(this.args.ctx)\n : alt.eval(this.args.ctx);\n },\n Ternary(e) {\n return e.eval(this.args.ctx);\n },\n\n LogicalOr_or(left, _op, right) {\n return left.eval(this.args.ctx) || right.eval(this.args.ctx);\n },\n LogicalOr(e) {\n return e.eval(this.args.ctx);\n },\n\n LogicalAnd_and(left, _op, right) {\n return left.eval(this.args.ctx) && right.eval(this.args.ctx);\n },\n LogicalAnd(e) {\n return e.eval(this.args.ctx);\n },\n\n Equality_eq(left, _op, right) {\n return left.eval(this.args.ctx) == right.eval(this.args.ctx);\n },\n Equality_neq(left, _op, right) {\n return left.eval(this.args.ctx) != right.eval(this.args.ctx);\n },\n Equality(e) {\n return e.eval(this.args.ctx);\n },\n\n Comparison_gte(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) >=\n (right.eval(this.args.ctx) as number)\n );\n },\n Comparison_lte(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) <=\n (right.eval(this.args.ctx) as number)\n );\n },\n Comparison_gt(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) >\n (right.eval(this.args.ctx) as number)\n );\n },\n Comparison_lt(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) <\n (right.eval(this.args.ctx) as number)\n );\n },\n Comparison(e) {\n return e.eval(this.args.ctx);\n },\n\n Additive_plus(left, _op, right): unknown {\n const l = left.eval(this.args.ctx);\n const r = right.eval(this.args.ctx);\n if (typeof l === 'string' || typeof r === 'string') {\n return String(l) + String(r);\n }\n return (l as number) + (r as number);\n },\n Additive_minus(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) -\n (right.eval(this.args.ctx) as number)\n );\n },\n Additive(e) {\n return e.eval(this.args.ctx);\n },\n\n Multiplicative_times(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) *\n (right.eval(this.args.ctx) as number)\n );\n },\n Multiplicative_div(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) /\n (right.eval(this.args.ctx) as number)\n );\n },\n Multiplicative_mod(left, _op, right) {\n return (\n (left.eval(this.args.ctx) as number) %\n (right.eval(this.args.ctx) as number)\n );\n },\n Multiplicative(e) {\n return e.eval(this.args.ctx);\n },\n\n Unary_neg(_op, expr) {\n return -(expr.eval(this.args.ctx) as number);\n },\n Unary_not(_op, expr) {\n return !expr.eval(this.args.ctx);\n },\n Unary(e) {\n return e.eval(this.args.ctx);\n },\n\n Postfix_call(callee, _lp, args, _rp) {\n const calleeAST = callee.toAST() as ASTNode;\n\n const getArgValues = (): unknown[] => {\n const argsNode = args.children[0];\n if (!argsNode) {\n return [];\n }\n return argsNode.eval(this.args.ctx) as unknown[];\n };\n\n if (calleeAST.type === 'Identifier') {\n const fnName = calleeAST.name.toLowerCase();\n const builtinFn = BUILTINS[fnName];\n if (builtinFn) {\n return builtinFn(...getArgValues());\n }\n }\n\n const fn = callee.eval(this.args.ctx);\n if (typeof fn === 'function') {\n return fn(...getArgValues());\n }\n\n const calleeName =\n calleeAST.type === 'Identifier' ? calleeAST.name : 'expression';\n throw new Error(`'${calleeName}' is not a function`);\n },\n Postfix_property(obj, _dot, prop) {\n const objVal = obj.eval(this.args.ctx) as Record<string, unknown>;\n return objVal?.[prop.sourceString];\n },\n Postfix_index(obj, _lb, index, _rb) {\n const objVal = obj.eval(this.args.ctx);\n const idx = index.eval(this.args.ctx);\n if (typeof idx === 'string') {\n if (!isSafePropertyName(idx)) {\n return undefined;\n }\n return (objVal as Record<string, unknown>)?.[idx];\n }\n const numIdx = idx as number;\n if (numIdx < 0) {\n return (objVal as unknown[])?.[(objVal as unknown[]).length + numIdx];\n }\n return (objVal as unknown[])?.[numIdx];\n },\n Postfix_wildcard(obj, _lb, _star, _rb) {\n return obj.eval(this.args.ctx);\n },\n Postfix(e) {\n return e.eval(this.args.ctx);\n },\n\n Arguments(first, _comma, rest) {\n return [\n first.eval(this.args.ctx),\n ...rest.children.map((c) => c.eval(this.args.ctx)),\n ];\n },\n\n Primary_paren(_lp, expr, _rp) {\n return expr.eval(this.args.ctx);\n },\n Primary_bracketedField(_lb, str, _rb) {\n const fieldName = str.eval(this.args.ctx) as string;\n if (!isSafePropertyName(fieldName)) {\n return undefined;\n }\n return this.args.ctx[fieldName];\n },\n Primary(e) {\n return e.eval(this.args.ctx);\n },\n\n number_float(_neg, _int, _dot, _frac) {\n return Number.parseFloat(this.sourceString);\n },\n number_int(_neg, _digits) {\n return Number.parseInt(this.sourceString, 10);\n },\n\n string(_open, chars, _close) {\n return chars.sourceString.replaceAll(/\\\\(.)/g, '$1');\n },\n\n boolean_true(_) {\n return true;\n },\n boolean_false(_) {\n return false;\n },\n\n null(_) {\n return null;\n },\n\n identifier(_start, _rest) {\n const name = this.sourceString;\n return this.args.ctx[name];\n },\n\n rootPath(_slash, _path) {\n const fullPath = this.sourceString;\n if (fullPath in this.args.ctx) {\n return this.args.ctx[fullPath];\n }\n const parts = fullPath.slice(1).split('.');\n const firstPart = parts[0];\n if (!firstPart) return undefined;\n const rootKey = '/' + firstPart;\n let value = this.args.ctx[rootKey];\n for (let i = 1; i < parts.length; i++) {\n if (value === null || value === undefined) return undefined;\n const part = parts[i];\n if (!part) continue;\n value = (value as Record<string, unknown>)[part];\n }\n return value;\n },\n\n relativePath(_dotSlashes, _parts) {\n const fullPath = this.sourceString;\n if (fullPath in this.args.ctx) {\n return this.args.ctx[fullPath];\n }\n const path = fullPath.replace(/^(\\.\\.\\/)+/, '');\n return getByPath(this.args.ctx, path);\n },\n\n contextToken_at(_at, _name) {\n return this.args.ctx[this.sourceString];\n },\n contextToken_hash(_hash, _name) {\n return this.args.ctx[this.sourceString];\n },\n\n _nonterminal(...children) {\n const ctx = this.args.ctx;\n for (const child of children) {\n if ('eval' in child) {\n return child.eval(ctx);\n }\n }\n return undefined;\n },\n\n _iter(...children) {\n return children.map((c) => c.eval(this.args.ctx));\n },\n\n _terminal() {\n return undefined;\n },\n});\n","import { grammar } from '../grammar';\nimport { semantics } from '../semantics';\nimport type { ASTNode } from './types';\nimport type { FormulaFeature, FormulaMinorVersion } from '../../types';\n\nexport interface ParseResult {\n ast: ASTNode;\n dependencies: string[];\n features: FormulaFeature[];\n minVersion: FormulaMinorVersion;\n}\n\nexport function parseFormula(expression: string): ParseResult {\n const trimmed = expression.trim();\n if (!trimmed) {\n throw new Error('Empty expression');\n }\n\n const matchResult = grammar.match(trimmed);\n if (matchResult.failed()) {\n throw new Error(matchResult.message ?? 'Parse error');\n }\n\n const adapter = semantics(matchResult);\n const ast = adapter.toAST() as ASTNode;\n const dependencies = [...new Set(adapter.dependencies() as string[])];\n const allFeatures = adapter.features() as FormulaFeature[];\n const features = [...new Set(allFeatures)];\n const minVersion: FormulaMinorVersion = features.length > 0 ? '1.1' : '1.0';\n\n return { ast, dependencies, features, minVersion };\n}\n\nexport function validateSyntax(\n expression: string,\n): { isValid: true } | { isValid: false; error: string; position?: number } {\n const trimmed = expression.trim();\n if (!trimmed) {\n return { isValid: false, error: 'Empty expression' };\n }\n\n const matchResult = grammar.match(trimmed);\n if (matchResult.failed()) {\n const pos = matchResult.getRightmostFailurePosition?.();\n return {\n isValid: false,\n error: matchResult.message ?? 'Parse error',\n position: pos,\n };\n }\n\n return { isValid: true };\n}\n\nexport function evaluate(\n expression: string,\n context: Record<string, unknown>,\n): unknown {\n const trimmed = expression.trim();\n if (!trimmed) {\n throw new Error('Empty expression');\n }\n\n const matchResult = grammar.match(trimmed);\n if (matchResult.failed()) {\n throw new Error(matchResult.message ?? 'Parse error');\n }\n\n const safeContext: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(context)) {\n if (typeof value !== 'function') {\n safeContext[key] = value;\n }\n }\n\n return semantics(matchResult).eval(safeContext);\n}\n\nexport interface EvaluateContextOptions {\n rootData: Record<string, unknown>;\n itemData?: Record<string, unknown>;\n currentPath?: string;\n}\n\nfunction parseCurrentPath(currentPath: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of currentPath) {\n if (char === '[') {\n inBracket = true;\n current += char;\n } else if (char === ']') {\n inBracket = false;\n current += char;\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getValueByPath(data: Record<string, unknown>, path: string): unknown {\n const segments = parseCurrentPath(path);\n let current: unknown = data;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n if (typeof current !== 'object') {\n return undefined;\n }\n\n const bracketMatch = /^([^[]+)\\[(\\d+)\\]$/.exec(segment);\n if (bracketMatch?.[1] && bracketMatch[2]) {\n const fieldName = bracketMatch[1];\n const index = Number.parseInt(bracketMatch[2], 10);\n const arr = (current as Record<string, unknown>)[fieldName];\n if (!Array.isArray(arr)) {\n return undefined;\n }\n current = arr[index];\n } else {\n current = (current as Record<string, unknown>)[segment];\n }\n }\n\n return current;\n}\n\nfunction extractRootField(fieldPath: string): string {\n const dotIndex = fieldPath.indexOf('.');\n const bracketIndex = fieldPath.indexOf('[');\n\n if (dotIndex === -1 && bracketIndex === -1) {\n return fieldPath;\n }\n if (dotIndex === -1) {\n return fieldPath.slice(0, bracketIndex);\n }\n if (bracketIndex === -1) {\n return fieldPath.slice(0, dotIndex);\n }\n return fieldPath.slice(0, Math.min(dotIndex, bracketIndex));\n}\n\nfunction countParentLevels(path: string): number {\n let count = 0;\n let remaining = path;\n while (remaining.startsWith('../')) {\n count++;\n remaining = remaining.slice(3);\n }\n return count;\n}\n\nfunction getPathAfterParents(path: string): string {\n return path.replace(/^(\\.\\.\\/)+/, '');\n}\n\nfunction resolveRelativePath(\n rootData: Record<string, unknown>,\n currentPath: string | undefined,\n relativePath: string,\n): unknown {\n const parentLevels = countParentLevels(relativePath);\n const fieldPath = getPathAfterParents(relativePath);\n\n if (!currentPath) {\n return getValueByPath(rootData, fieldPath);\n }\n\n const pathSegments = parseCurrentPath(currentPath);\n const targetLevel = pathSegments.length - parentLevels;\n\n if (targetLevel <= 0) {\n return getValueByPath(rootData, fieldPath);\n }\n\n const basePath = pathSegments.slice(0, targetLevel).join('.');\n const fullPath = basePath ? `${basePath}.${fieldPath}` : fieldPath;\n\n return getValueByPath(rootData, fullPath);\n}\n\nfunction extractRelativeBase(relativePath: string): string {\n const pathAfterParents = getPathAfterParents(relativePath);\n const baseField = extractRootField(pathAfterParents);\n const prefix = relativePath.slice(\n 0,\n relativePath.length - pathAfterParents.length,\n );\n return prefix + baseField;\n}\n\nfunction buildPathReferences(\n rootData: Record<string, unknown>,\n dependencies: string[],\n currentPath?: string,\n): Record<string, unknown> {\n const refs: Record<string, unknown> = {};\n\n for (const dep of dependencies) {\n if (dep.startsWith('/')) {\n const fieldPath = dep.slice(1);\n const rootField = extractRootField(fieldPath);\n const contextKey = '/' + rootField;\n if (!(contextKey in refs)) {\n refs[contextKey] = getValueByPath(rootData, rootField);\n }\n } else if (dep.startsWith('../')) {\n const contextKey = extractRelativeBase(dep);\n if (!(contextKey in refs)) {\n refs[contextKey] = resolveRelativePath(\n rootData,\n currentPath,\n contextKey,\n );\n }\n }\n }\n\n return refs;\n}\n\nexport function evaluateWithContext(\n expression: string,\n options: EvaluateContextOptions,\n): unknown {\n const { rootData, itemData, currentPath } = options;\n const trimmed = expression.trim();\n\n if (!trimmed) {\n throw new Error('Empty expression');\n }\n\n const parsed = parseFormula(trimmed);\n const pathRefs = buildPathReferences(\n rootData,\n parsed.dependencies,\n currentPath,\n );\n\n const context: Record<string, unknown> = {\n ...rootData,\n ...itemData,\n ...pathRefs,\n };\n\n return evaluate(trimmed, context);\n}\n\nexport type InferredType = 'number' | 'boolean' | 'string' | 'unknown';\n\nexport interface FieldTypes {\n [fieldName: string]: 'number' | 'string' | 'boolean' | 'object' | 'array';\n}\n\nconst ARITHMETIC_OPS = new Set(['+', '-', '*', '/', '%']);\nconst COMPARISON_OPS = new Set(['<', '>', '<=', '>=', '==', '!=']);\nconst LOGICAL_OPS = new Set(['&&', '||', '!']);\nconst NUMERIC_FUNCTIONS = new Set([\n 'round',\n 'floor',\n 'ceil',\n 'abs',\n 'sqrt',\n 'pow',\n 'min',\n 'max',\n 'log',\n 'log10',\n 'exp',\n 'sign',\n 'sum',\n 'avg',\n 'count',\n 'tonumber',\n 'length',\n]);\nconst STRING_FUNCTIONS = new Set([\n 'concat',\n 'upper',\n 'lower',\n 'trim',\n 'left',\n 'right',\n 'replace',\n 'tostring',\n 'join',\n]);\nconst BOOLEAN_FUNCTIONS = new Set([\n 'and',\n 'or',\n 'not',\n 'contains',\n 'startswith',\n 'endswith',\n 'isnull',\n 'toboolean',\n 'includes',\n]);\n\nfunction getFieldType(path: string, fieldTypes: FieldTypes): InferredType {\n const rootField = path.split('.')[0]?.split('[')[0] || path;\n const schemaType = fieldTypes[rootField];\n if (schemaType === 'number') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return 'unknown';\n}\n\nfunction inferLiteralType(node: ASTNode): InferredType | null {\n switch (node.type) {\n case 'NumberLiteral':\n return 'number';\n case 'BooleanLiteral':\n return 'boolean';\n case 'StringLiteral':\n return 'string';\n case 'NullLiteral':\n return 'unknown';\n default:\n return null;\n }\n}\n\nfunction inferBinaryOpType(\n node: ASTNode & { type: 'BinaryOp' },\n fieldTypes: FieldTypes,\n): InferredType {\n const { op } = node;\n if (op === '+') {\n const leftType = inferTypeFromAST(node.left, fieldTypes);\n const rightType = inferTypeFromAST(node.right, fieldTypes);\n if (leftType === 'string' || rightType === 'string') return 'string';\n if (leftType === 'unknown' || rightType === 'unknown') return 'unknown';\n return 'number';\n }\n if (ARITHMETIC_OPS.has(op)) return 'number';\n if (COMPARISON_OPS.has(op)) return 'boolean';\n if (LOGICAL_OPS.has(op)) return 'boolean';\n return 'unknown';\n}\n\nfunction inferCallExpressionType(\n node: ASTNode & { type: 'CallExpression' },\n fieldTypes: FieldTypes,\n): InferredType {\n const funcName =\n node.callee.type === 'Identifier' ? node.callee.name.toLowerCase() : '';\n if (NUMERIC_FUNCTIONS.has(funcName)) return 'number';\n if (STRING_FUNCTIONS.has(funcName)) return 'string';\n if (BOOLEAN_FUNCTIONS.has(funcName)) return 'boolean';\n if (funcName === 'if' && node.arguments.length >= 3) {\n const thenArg = node.arguments[1];\n const elseArg = node.arguments[2];\n if (thenArg && elseArg) {\n const thenType = inferTypeFromAST(thenArg, fieldTypes);\n const elseType = inferTypeFromAST(elseArg, fieldTypes);\n if (thenType === elseType) return thenType;\n }\n }\n return 'unknown';\n}\n\nfunction inferTypeFromAST(node: ASTNode, fieldTypes: FieldTypes): InferredType {\n const literalType = inferLiteralType(node);\n if (literalType !== null) return literalType;\n\n switch (node.type) {\n case 'Identifier':\n return getFieldType(node.name, fieldTypes);\n case 'RootPath':\n case 'RelativePath':\n case 'ContextToken':\n case 'IndexExpression':\n case 'WildcardExpression':\n return 'unknown';\n case 'MemberExpression': {\n const objectType = inferTypeFromAST(node.object, fieldTypes);\n if (objectType !== 'unknown') return objectType;\n if (node.object.type === 'Identifier') {\n return getFieldType(`${node.object.name}.${node.property}`, fieldTypes);\n }\n return 'unknown';\n }\n case 'BinaryOp':\n return inferBinaryOpType(node, fieldTypes);\n case 'UnaryOp': {\n if (node.op === '-') return 'number';\n if (node.op === '!') return 'boolean';\n return 'unknown';\n }\n case 'TernaryOp': {\n const thenType = inferTypeFromAST(node.consequent, fieldTypes);\n const elseType = inferTypeFromAST(node.alternate, fieldTypes);\n return thenType === elseType ? thenType : 'unknown';\n }\n case 'CallExpression':\n return inferCallExpressionType(node, fieldTypes);\n default:\n return 'unknown';\n }\n}\n\nexport function inferFormulaType(\n expression: string,\n fieldTypes: FieldTypes = {},\n): InferredType {\n const trimmed = expression.trim();\n if (!trimmed) {\n return 'unknown';\n }\n\n try {\n const { ast } = parseFormula(trimmed);\n return inferTypeFromAST(ast, fieldTypes);\n } catch {\n return 'unknown';\n }\n}\n","import { FormulaFeature, FormulaMinorVersion } from './types';\nimport { parseFormula } from './ohm';\n\nexport interface ParsedExpression {\n expression: string;\n dependencies: string[];\n minVersion: FormulaMinorVersion;\n features: FormulaFeature[];\n}\n\n/**\n * Parse a formula expression string\n *\n * @param expression - Formula expression string\n * @returns Parsed expression with dependencies and version info\n *\n * @example\n * parseExpression('price * 1.1')\n * // { expression: 'price * 1.1', dependencies: ['price'], minVersion: '1.0', features: [] }\n *\n * parseExpression('stats.damage * multiplier')\n * // { expression: '...', dependencies: ['stats.damage', 'multiplier'], minVersion: '1.1', features: ['nested_path'] }\n */\nexport function parseExpression(expression: string): ParsedExpression {\n const result = parseFormula(expression);\n return {\n expression,\n dependencies: result.dependencies,\n minVersion: result.minVersion,\n features: result.features,\n };\n}\n","import { validateSyntax } from './ohm';\n\nexport type SyntaxValidationResult =\n | { isValid: true }\n | { isValid: false; error: string; position?: number };\n\n/**\n * Validate formula expression syntax\n *\n * @param expression - Formula expression string\n * @returns Validation result with error details if invalid\n *\n * @example\n * validateFormulaSyntax('price * 1.1')\n * // { isValid: true }\n *\n * validateFormulaSyntax('price * (1.1')\n * // { isValid: false, error: 'Unclosed (', position: 8 }\n */\nexport function validateFormulaSyntax(\n expression: string,\n): SyntaxValidationResult {\n const result = validateSyntax(expression);\n\n if (result.isValid) {\n return { isValid: true };\n }\n\n return {\n isValid: false,\n error: result.error,\n position: result.position,\n };\n}\n"]}
|
|
@@ -89,6 +89,7 @@ var grammarText = String.raw`Formula {
|
|
|
89
89
|
// Primary expressions
|
|
90
90
|
Primary
|
|
91
91
|
= "(" Expression ")" -- paren
|
|
92
|
+
| "[" string "]" -- bracketedField
|
|
92
93
|
| number
|
|
93
94
|
| string
|
|
94
95
|
| boolean
|
|
@@ -146,6 +147,9 @@ var grammarText = String.raw`Formula {
|
|
|
146
147
|
var grammar2 = ohm__namespace.grammar(grammarText);
|
|
147
148
|
|
|
148
149
|
// src/ohm/semantics/index.ts
|
|
150
|
+
function isSafePropertyName(name) {
|
|
151
|
+
return name !== "__proto__";
|
|
152
|
+
}
|
|
149
153
|
function childrenToAST(children) {
|
|
150
154
|
return children.filter((c) => "toAST" in c).map((c) => c.toAST());
|
|
151
155
|
}
|
|
@@ -319,10 +323,18 @@ semantics.addOperation("toAST", {
|
|
|
319
323
|
};
|
|
320
324
|
},
|
|
321
325
|
Postfix_index(obj, _lb, index, _rb) {
|
|
326
|
+
const indexAST = index.toAST();
|
|
327
|
+
if (indexAST.type === "StringLiteral") {
|
|
328
|
+
return {
|
|
329
|
+
type: "BracketedMemberExpression",
|
|
330
|
+
object: obj.toAST(),
|
|
331
|
+
property: indexAST.value
|
|
332
|
+
};
|
|
333
|
+
}
|
|
322
334
|
return {
|
|
323
335
|
type: "IndexExpression",
|
|
324
336
|
object: obj.toAST(),
|
|
325
|
-
index:
|
|
337
|
+
index: indexAST
|
|
326
338
|
};
|
|
327
339
|
},
|
|
328
340
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
@@ -342,6 +354,10 @@ semantics.addOperation("toAST", {
|
|
|
342
354
|
Primary_paren(_lp, expr, _rp) {
|
|
343
355
|
return expr.toAST();
|
|
344
356
|
},
|
|
357
|
+
Primary_bracketedField(_lb, str, _rb) {
|
|
358
|
+
const strAST = str.toAST();
|
|
359
|
+
return { type: "BracketedIdentifier", name: strAST.value };
|
|
360
|
+
},
|
|
345
361
|
Primary(e) {
|
|
346
362
|
return e.toAST();
|
|
347
363
|
},
|
|
@@ -397,6 +413,9 @@ semantics.addOperation("dependencies", {
|
|
|
397
413
|
identifier(_start, _rest) {
|
|
398
414
|
return [this.sourceString];
|
|
399
415
|
},
|
|
416
|
+
Primary_bracketedField(_lb, _str, _rb) {
|
|
417
|
+
return [this.sourceString];
|
|
418
|
+
},
|
|
400
419
|
rootPath(_slash, _path) {
|
|
401
420
|
return [this.sourceString];
|
|
402
421
|
},
|
|
@@ -419,6 +438,14 @@ semantics.addOperation("dependencies", {
|
|
|
419
438
|
Postfix_index(obj, _lb, index, _rb) {
|
|
420
439
|
const objDeps = obj.dependencies();
|
|
421
440
|
const indexNode = index.toAST();
|
|
441
|
+
if (indexNode.type === "StringLiteral") {
|
|
442
|
+
const strValue = indexNode.value;
|
|
443
|
+
const quote = this.sourceString.includes('"') ? '"' : "'";
|
|
444
|
+
if (objDeps.length === 1) {
|
|
445
|
+
return [`${objDeps[0]}[${quote}${strValue}${quote}]`];
|
|
446
|
+
}
|
|
447
|
+
return objDeps;
|
|
448
|
+
}
|
|
422
449
|
const getNumericIndex = (node) => {
|
|
423
450
|
if (node.type === "NumberLiteral") {
|
|
424
451
|
return node.value;
|
|
@@ -488,6 +515,9 @@ var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
488
515
|
"includes"
|
|
489
516
|
]);
|
|
490
517
|
semantics.addOperation("features", {
|
|
518
|
+
Primary_bracketedField(_lb, _str, _rb) {
|
|
519
|
+
return ["bracket_notation"];
|
|
520
|
+
},
|
|
491
521
|
rootPath(_slash, _path) {
|
|
492
522
|
const path = this.sourceString;
|
|
493
523
|
const features = ["root_path"];
|
|
@@ -518,6 +548,10 @@ semantics.addOperation("features", {
|
|
|
518
548
|
Postfix_index(obj, _lb, index, _rb) {
|
|
519
549
|
const objFeatures = obj.features();
|
|
520
550
|
const indexFeatures = index.features();
|
|
551
|
+
const indexNode = index.toAST();
|
|
552
|
+
if (indexNode.type === "StringLiteral") {
|
|
553
|
+
return [...objFeatures, ...indexFeatures, "bracket_notation"];
|
|
554
|
+
}
|
|
521
555
|
return [...objFeatures, ...indexFeatures, "array_index"];
|
|
522
556
|
},
|
|
523
557
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
@@ -727,10 +761,17 @@ semantics.addOperation("eval(ctx)", {
|
|
|
727
761
|
Postfix_index(obj, _lb, index, _rb) {
|
|
728
762
|
const objVal = obj.eval(this.args.ctx);
|
|
729
763
|
const idx = index.eval(this.args.ctx);
|
|
730
|
-
if (idx
|
|
731
|
-
|
|
764
|
+
if (typeof idx === "string") {
|
|
765
|
+
if (!isSafePropertyName(idx)) {
|
|
766
|
+
return void 0;
|
|
767
|
+
}
|
|
768
|
+
return objVal?.[idx];
|
|
732
769
|
}
|
|
733
|
-
|
|
770
|
+
const numIdx = idx;
|
|
771
|
+
if (numIdx < 0) {
|
|
772
|
+
return objVal?.[objVal.length + numIdx];
|
|
773
|
+
}
|
|
774
|
+
return objVal?.[numIdx];
|
|
734
775
|
},
|
|
735
776
|
Postfix_wildcard(obj, _lb, _star, _rb) {
|
|
736
777
|
return obj.eval(this.args.ctx);
|
|
@@ -747,6 +788,13 @@ semantics.addOperation("eval(ctx)", {
|
|
|
747
788
|
Primary_paren(_lp, expr, _rp) {
|
|
748
789
|
return expr.eval(this.args.ctx);
|
|
749
790
|
},
|
|
791
|
+
Primary_bracketedField(_lb, str, _rb) {
|
|
792
|
+
const fieldName = str.eval(this.args.ctx);
|
|
793
|
+
if (!isSafePropertyName(fieldName)) {
|
|
794
|
+
return void 0;
|
|
795
|
+
}
|
|
796
|
+
return this.args.ctx[fieldName];
|
|
797
|
+
},
|
|
750
798
|
Primary(e) {
|
|
751
799
|
return e.eval(this.args.ctx);
|
|
752
800
|
},
|
|
@@ -1192,5 +1240,5 @@ exports.parseExpression = parseExpression;
|
|
|
1192
1240
|
exports.parseFormula = parseFormula;
|
|
1193
1241
|
exports.validateFormulaSyntax = validateFormulaSyntax;
|
|
1194
1242
|
exports.validateSyntax = validateSyntax;
|
|
1195
|
-
//# sourceMappingURL=chunk-
|
|
1196
|
-
//# sourceMappingURL=chunk-
|
|
1243
|
+
//# sourceMappingURL=chunk-IM22W645.cjs.map
|
|
1244
|
+
//# sourceMappingURL=chunk-IM22W645.cjs.map
|