@revisium/formula 0.6.1 → 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.
@@ -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: index.toAST()
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 < 0) {
709
- return objVal?.[objVal.length + idx];
742
+ if (typeof idx === "string") {
743
+ if (!isSafePropertyName(idx)) {
744
+ return void 0;
745
+ }
746
+ return objVal?.[idx];
747
+ }
748
+ const numIdx = idx;
749
+ if (numIdx < 0) {
750
+ return objVal?.[objVal.length + numIdx];
710
751
  }
711
- return objVal?.[idx];
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
  },
@@ -850,8 +898,33 @@ function evaluate(expression, context) {
850
898
  }
851
899
  return semantics(matchResult).eval(safeContext);
852
900
  }
901
+ function parseCurrentPath(currentPath) {
902
+ const segments = [];
903
+ let current = "";
904
+ let inBracket = false;
905
+ for (const char of currentPath) {
906
+ if (char === "[") {
907
+ inBracket = true;
908
+ current += char;
909
+ } else if (char === "]") {
910
+ inBracket = false;
911
+ current += char;
912
+ } else if (char === "." && !inBracket) {
913
+ if (current) {
914
+ segments.push(current);
915
+ current = "";
916
+ }
917
+ } else {
918
+ current += char;
919
+ }
920
+ }
921
+ if (current) {
922
+ segments.push(current);
923
+ }
924
+ return segments;
925
+ }
853
926
  function getValueByPath(data, path) {
854
- const segments = path.split(".");
927
+ const segments = parseCurrentPath(path);
855
928
  let current = data;
856
929
  for (const segment of segments) {
857
930
  if (current === null || current === void 0) {
@@ -860,7 +933,18 @@ function getValueByPath(data, path) {
860
933
  if (typeof current !== "object") {
861
934
  return void 0;
862
935
  }
863
- current = current[segment];
936
+ const bracketMatch = /^([^[]+)\[(\d+)\]$/.exec(segment);
937
+ if (bracketMatch?.[1] && bracketMatch[2]) {
938
+ const fieldName = bracketMatch[1];
939
+ const index = Number.parseInt(bracketMatch[2], 10);
940
+ const arr = current[fieldName];
941
+ if (!Array.isArray(arr)) {
942
+ return void 0;
943
+ }
944
+ current = arr[index];
945
+ } else {
946
+ current = current[segment];
947
+ }
864
948
  }
865
949
  return current;
866
950
  }
@@ -878,7 +962,43 @@ function extractRootField(fieldPath) {
878
962
  }
879
963
  return fieldPath.slice(0, Math.min(dotIndex, bracketIndex));
880
964
  }
881
- function buildPathReferences(rootData, dependencies) {
965
+ function countParentLevels(path) {
966
+ let count = 0;
967
+ let remaining = path;
968
+ while (remaining.startsWith("../")) {
969
+ count++;
970
+ remaining = remaining.slice(3);
971
+ }
972
+ return count;
973
+ }
974
+ function getPathAfterParents(path) {
975
+ return path.replace(/^(\.\.\/)+/, "");
976
+ }
977
+ function resolveRelativePath(rootData, currentPath, relativePath) {
978
+ const parentLevels = countParentLevels(relativePath);
979
+ const fieldPath = getPathAfterParents(relativePath);
980
+ if (!currentPath) {
981
+ return getValueByPath(rootData, fieldPath);
982
+ }
983
+ const pathSegments = parseCurrentPath(currentPath);
984
+ const targetLevel = pathSegments.length - parentLevels;
985
+ if (targetLevel <= 0) {
986
+ return getValueByPath(rootData, fieldPath);
987
+ }
988
+ const basePath = pathSegments.slice(0, targetLevel).join(".");
989
+ const fullPath = basePath ? `${basePath}.${fieldPath}` : fieldPath;
990
+ return getValueByPath(rootData, fullPath);
991
+ }
992
+ function extractRelativeBase(relativePath) {
993
+ const pathAfterParents = getPathAfterParents(relativePath);
994
+ const baseField = extractRootField(pathAfterParents);
995
+ const prefix = relativePath.slice(
996
+ 0,
997
+ relativePath.length - pathAfterParents.length
998
+ );
999
+ return prefix + baseField;
1000
+ }
1001
+ function buildPathReferences(rootData, dependencies, currentPath) {
882
1002
  const refs = {};
883
1003
  for (const dep of dependencies) {
884
1004
  if (dep.startsWith("/")) {
@@ -889,20 +1009,30 @@ function buildPathReferences(rootData, dependencies) {
889
1009
  refs[contextKey] = getValueByPath(rootData, rootField);
890
1010
  }
891
1011
  } else if (dep.startsWith("../")) {
892
- const fieldPath = dep.slice(3);
893
- refs[dep] = getValueByPath(rootData, fieldPath);
1012
+ const contextKey = extractRelativeBase(dep);
1013
+ if (!(contextKey in refs)) {
1014
+ refs[contextKey] = resolveRelativePath(
1015
+ rootData,
1016
+ currentPath,
1017
+ contextKey
1018
+ );
1019
+ }
894
1020
  }
895
1021
  }
896
1022
  return refs;
897
1023
  }
898
1024
  function evaluateWithContext(expression, options) {
899
- const { rootData, itemData } = options;
1025
+ const { rootData, itemData, currentPath } = options;
900
1026
  const trimmed = expression.trim();
901
1027
  if (!trimmed) {
902
1028
  throw new Error("Empty expression");
903
1029
  }
904
1030
  const parsed = parseFormula(trimmed);
905
- const pathRefs = buildPathReferences(rootData, parsed.dependencies);
1031
+ const pathRefs = buildPathReferences(
1032
+ rootData,
1033
+ parsed.dependencies,
1034
+ currentPath
1035
+ );
906
1036
  const context = {
907
1037
  ...rootData,
908
1038
  ...itemData,
@@ -1082,5 +1212,5 @@ function validateFormulaSyntax(expression) {
1082
1212
  }
1083
1213
 
1084
1214
  export { evaluate, evaluateWithContext, inferFormulaType, parseExpression, parseFormula, validateFormulaSyntax, validateSyntax };
1085
- //# sourceMappingURL=chunk-LFEHEGBL.js.map
1086
- //# sourceMappingURL=chunk-LFEHEGBL.js.map
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"]}