@revisium/formula 0.4.0 → 0.6.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.
@@ -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-LFEHEGBL.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 | 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 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 return {\n type: 'IndexExpression',\n object: obj.toAST(),\n index: index.toAST(),\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(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 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 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 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 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) as unknown[];\n const idx = index.eval(this.args.ctx) as number;\n if (idx < 0) {\n return objVal?.[objVal.length + idx];\n }\n return objVal?.[idx];\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(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 getValueByPath(data: Record<string, unknown>, path: string): unknown {\n const segments = path.split('.');\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 current = (current as Record<string, unknown>)[segment];\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 buildPathReferences(\n rootData: Record<string, unknown>,\n dependencies: 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 fieldPath = dep.slice(3);\n refs[dep] = getValueByPath(rootData, fieldPath);\n }\n }\n\n return refs;\n}\n\nexport function evaluateWithContext(\n expression: string,\n options: EvaluateContextOptions,\n): unknown {\n const { rootData, itemData } = 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(rootData, parsed.dependencies);\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"]}
@@ -1,29 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var chunkAGBOCJGV_cjs = require('../chunk-AGBOCJGV.cjs');
4
- require('../chunk-Q7SFCCGT.cjs');
3
+ var chunkGOMUE724_cjs = require('../chunk-GOMUE724.cjs');
5
4
 
6
5
 
7
6
 
8
- Object.defineProperty(exports, "extractSchemaFormulas", {
9
- enumerable: true,
10
- get: function () { return chunkAGBOCJGV_cjs.extractSchemaFormulas; }
11
- });
12
7
  Object.defineProperty(exports, "parseExpression", {
13
8
  enumerable: true,
14
- get: function () { return chunkAGBOCJGV_cjs.parseExpression; }
9
+ get: function () { return chunkGOMUE724_cjs.parseExpression; }
15
10
  });
16
11
  Object.defineProperty(exports, "parseFormula", {
17
12
  enumerable: true,
18
- get: function () { return chunkAGBOCJGV_cjs.parseFormula; }
19
- });
20
- Object.defineProperty(exports, "validateFormulaAgainstSchema", {
21
- enumerable: true,
22
- get: function () { return chunkAGBOCJGV_cjs.validateFormulaAgainstSchema; }
13
+ get: function () { return chunkGOMUE724_cjs.parseFormula; }
23
14
  });
24
15
  Object.defineProperty(exports, "validateFormulaSyntax", {
25
16
  enumerable: true,
26
- get: function () { return chunkAGBOCJGV_cjs.validateFormulaSyntax; }
17
+ get: function () { return chunkGOMUE724_cjs.validateFormulaSyntax; }
27
18
  });
28
19
  //# sourceMappingURL=index.cjs.map
29
20
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- export { A as ASTNode, g as ExtractedFormula, o as FormulaAnalysis, n as FormulaFeature, m as FormulaMinorVersion, k as FormulaValidationError, J as JsonSchema, P as ParseResult, c as ParsedExpression, r as ParsedPath, q as PathSegment, s as PathValidationResult, S as SyntaxValidationResult, X as XFormula, f as extractSchemaFormulas, b as parseExpression, p as parseFormula, h as validateFormulaAgainstSchema, d as validateFormulaSyntax } from '../index-JZFJ9oT6.cjs';
1
+ export { A as ASTNode, h as FormulaAnalysis, g as FormulaFeature, f as FormulaMinorVersion, P as ParseResult, c as ParsedExpression, k as ParsedPath, j as PathSegment, l as PathValidationResult, S as SyntaxValidationResult, X as XFormula, b as parseExpression, p as parseFormula, d as validateFormulaSyntax } from '../index-PFKKFfeI.cjs';
@@ -1 +1 @@
1
- export { A as ASTNode, g as ExtractedFormula, o as FormulaAnalysis, n as FormulaFeature, m as FormulaMinorVersion, k as FormulaValidationError, J as JsonSchema, P as ParseResult, c as ParsedExpression, r as ParsedPath, q as PathSegment, s as PathValidationResult, S as SyntaxValidationResult, X as XFormula, f as extractSchemaFormulas, b as parseExpression, p as parseFormula, h as validateFormulaAgainstSchema, d as validateFormulaSyntax } from '../index-JZFJ9oT6.js';
1
+ export { A as ASTNode, h as FormulaAnalysis, g as FormulaFeature, f as FormulaMinorVersion, P as ParseResult, c as ParsedExpression, k as ParsedPath, j as PathSegment, l as PathValidationResult, S as SyntaxValidationResult, X as XFormula, b as parseExpression, p as parseFormula, d as validateFormulaSyntax } from '../index-PFKKFfeI.js';
@@ -1,4 +1,3 @@
1
- export { extractSchemaFormulas, parseExpression, parseFormula, validateFormulaAgainstSchema, validateFormulaSyntax } from '../chunk-FDIJPOVQ.js';
2
- import '../chunk-PZ5AY32C.js';
1
+ export { parseExpression, parseFormula, validateFormulaSyntax } from '../chunk-LFEHEGBL.js';
3
2
  //# sourceMappingURL=index.js.map
4
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- require('./chunk-Q7SFCCGT.cjs');
4
-
5
3
  // src/formula-spec.ts
6
4
  var formulaSpec = {
7
5
  version: "1.1",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula-spec.ts"],"names":[],"mappings":"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","file":"formula-spec.cjs","sourcesContent":["export interface FunctionSpec {\n name: string;\n description: string;\n signature: string;\n returnType: 'string' | 'number' | 'boolean' | 'any';\n examples: string[];\n}\n\nexport interface FormulaSpec {\n version: string;\n description: string;\n syntax: {\n fieldReferences: string[];\n arithmeticOperators: { operator: string; description: string }[];\n comparisonOperators: { operator: string; description: string }[];\n logicalOperators: { operator: string; description: string }[];\n other: string[];\n };\n functions: {\n string: FunctionSpec[];\n numeric: FunctionSpec[];\n boolean: FunctionSpec[];\n array: FunctionSpec[];\n conversion: FunctionSpec[];\n conditional: FunctionSpec[];\n };\n features: {\n name: string;\n description: string;\n minVersion: string;\n examples: string[];\n dependenciesExtracted?: string[];\n }[];\n versionDetection: { feature: string; minVersion: string }[];\n parseResult: {\n description: string;\n interface: string;\n };\n examples: {\n expression: string;\n description: string;\n result?: string;\n }[];\n apiExamples: {\n name: string;\n description: string;\n code: string;\n }[];\n schemaUsage: {\n structure: string;\n fieldTypes: string[];\n rules: string[];\n };\n}\n\nexport const formulaSpec: FormulaSpec = {\n version: '1.1',\n description:\n 'Formula expressions for computed fields. Formulas reference other fields and calculate values automatically.',\n\n syntax: {\n fieldReferences: [\n 'Simple field: fieldName (e.g., price, quantity)',\n 'Nested path: object.property (e.g., stats.damage)',\n 'Array index: array[0] or array[-1] for last element',\n 'Combined: items[0].price, user.addresses[-1].city',\n ],\n arithmeticOperators: [\n { operator: '+', description: 'Addition or string concatenation' },\n { operator: '-', description: 'Subtraction' },\n { operator: '*', description: 'Multiplication' },\n { operator: '/', description: 'Division' },\n { operator: '%', description: 'Modulo (remainder)' },\n ],\n comparisonOperators: [\n { operator: '==', description: 'Equal' },\n { operator: '!=', description: 'Not equal' },\n { operator: '>', description: 'Greater than' },\n { operator: '<', description: 'Less than' },\n { operator: '>=', description: 'Greater or equal' },\n { operator: '<=', description: 'Less or equal' },\n ],\n logicalOperators: [\n { operator: '&&', description: 'Logical AND' },\n { operator: '||', description: 'Logical OR' },\n { operator: '!', description: 'Logical NOT' },\n ],\n other: ['Parentheses: (a + b) * c', 'Unary minus: -value, a + -b'],\n },\n\n functions: {\n string: [\n {\n name: 'concat',\n description: 'Concatenate multiple values into a single string',\n signature: 'concat(value1, value2, ...)',\n returnType: 'string',\n examples: [\n 'concat(firstName, \" \", lastName) // \"John Doe\"',\n 'concat(\"Price: \", price, \" USD\") // \"Price: 100 USD\"',\n ],\n },\n {\n name: 'upper',\n description: 'Convert string to uppercase',\n signature: 'upper(text)',\n returnType: 'string',\n examples: ['upper(name) // \"HELLO\"'],\n },\n {\n name: 'lower',\n description: 'Convert string to lowercase',\n signature: 'lower(text)',\n returnType: 'string',\n examples: ['lower(name) // \"hello\"'],\n },\n {\n name: 'trim',\n description: 'Remove whitespace from both ends of a string',\n signature: 'trim(text)',\n returnType: 'string',\n examples: ['trim(name) // \"hello\" from \" hello \"'],\n },\n {\n name: 'left',\n description: 'Extract characters from the beginning of a string',\n signature: 'left(text, count)',\n returnType: 'string',\n examples: ['left(name, 3) // \"hel\" from \"hello\"'],\n },\n {\n name: 'right',\n description: 'Extract characters from the end of a string',\n signature: 'right(text, count)',\n returnType: 'string',\n examples: ['right(name, 3) // \"llo\" from \"hello\"'],\n },\n {\n name: 'replace',\n description: 'Replace first occurrence of a substring',\n signature: 'replace(text, search, replacement)',\n returnType: 'string',\n examples: ['replace(name, \"o\", \"0\") // \"hell0\" from \"hello\"'],\n },\n {\n name: 'join',\n description: 'Join array elements into a string',\n signature: 'join(array, separator?)',\n returnType: 'string',\n examples: ['join(tags) // \"a,b,c\"', 'join(tags, \" | \") // \"a | b | c\"'],\n },\n ],\n numeric: [\n {\n name: 'round',\n description: 'Round a number to specified decimal places',\n signature: 'round(number, decimals?)',\n returnType: 'number',\n examples: ['round(3.14159, 2) // 3.14', 'round(3.5) // 4'],\n },\n {\n name: 'floor',\n description: 'Round down to the nearest integer',\n signature: 'floor(number)',\n returnType: 'number',\n examples: ['floor(3.7) // 3'],\n },\n {\n name: 'ceil',\n description: 'Round up to the nearest integer',\n signature: 'ceil(number)',\n returnType: 'number',\n examples: ['ceil(3.2) // 4'],\n },\n {\n name: 'abs',\n description: 'Get the absolute value',\n signature: 'abs(number)',\n returnType: 'number',\n examples: ['abs(-5) // 5'],\n },\n {\n name: 'sqrt',\n description: 'Calculate the square root',\n signature: 'sqrt(number)',\n returnType: 'number',\n examples: ['sqrt(16) // 4'],\n },\n {\n name: 'pow',\n description: 'Raise a number to a power',\n signature: 'pow(base, exponent)',\n returnType: 'number',\n examples: ['pow(2, 3) // 8'],\n },\n {\n name: 'min',\n description: 'Get the minimum of multiple values',\n signature: 'min(value1, value2, ...)',\n returnType: 'number',\n examples: ['min(a, b, c) // smallest value'],\n },\n {\n name: 'max',\n description: 'Get the maximum of multiple values',\n signature: 'max(value1, value2, ...)',\n returnType: 'number',\n examples: ['max(a, b, c) // largest value'],\n },\n {\n name: 'log',\n description: 'Calculate the natural logarithm',\n signature: 'log(number)',\n returnType: 'number',\n examples: ['log(10) // 2.302...'],\n },\n {\n name: 'log10',\n description: 'Calculate the base-10 logarithm',\n signature: 'log10(number)',\n returnType: 'number',\n examples: ['log10(100) // 2'],\n },\n {\n name: 'exp',\n description: 'Calculate e raised to a power',\n signature: 'exp(number)',\n returnType: 'number',\n examples: ['exp(1) // 2.718...'],\n },\n {\n name: 'sign',\n description: 'Get the sign of a number (-1, 0, or 1)',\n signature: 'sign(number)',\n returnType: 'number',\n examples: ['sign(-5) // -1', 'sign(0) // 0', 'sign(5) // 1'],\n },\n {\n name: 'length',\n description: 'Get the length of a string or array',\n signature: 'length(value)',\n returnType: 'number',\n examples: ['length(name) // 5 from \"hello\"', 'length(items) // 3'],\n },\n ],\n boolean: [\n {\n name: 'and',\n description: 'Logical AND of two values',\n signature: 'and(a, b)',\n returnType: 'boolean',\n examples: ['and(isActive, hasPermission) // true if both true'],\n },\n {\n name: 'or',\n description: 'Logical OR of two values',\n signature: 'or(a, b)',\n returnType: 'boolean',\n examples: ['or(isAdmin, isOwner) // true if either true'],\n },\n {\n name: 'not',\n description: 'Logical NOT of a value',\n signature: 'not(value)',\n returnType: 'boolean',\n examples: ['not(isDeleted) // true if false'],\n },\n {\n name: 'contains',\n description: 'Check if a string contains a substring',\n signature: 'contains(text, search)',\n returnType: 'boolean',\n examples: ['contains(name, \"ell\") // true for \"hello\"'],\n },\n {\n name: 'startswith',\n description: 'Check if a string starts with a prefix',\n signature: 'startswith(text, prefix)',\n returnType: 'boolean',\n examples: ['startswith(name, \"hel\") // true for \"hello\"'],\n },\n {\n name: 'endswith',\n description: 'Check if a string ends with a suffix',\n signature: 'endswith(text, suffix)',\n returnType: 'boolean',\n examples: ['endswith(name, \"llo\") // true for \"hello\"'],\n },\n {\n name: 'isnull',\n description: 'Check if a value is null or undefined',\n signature: 'isnull(value)',\n returnType: 'boolean',\n examples: ['isnull(optionalField) // true if null/undefined'],\n },\n {\n name: 'includes',\n description: 'Check if an array contains a value',\n signature: 'includes(array, value)',\n returnType: 'boolean',\n examples: [\n 'includes(tags, \"featured\") // true if array contains value',\n ],\n },\n ],\n array: [\n {\n name: 'sum',\n description: 'Calculate the sum of array elements',\n signature: 'sum(array)',\n returnType: 'number',\n examples: ['sum(prices) // total of all prices'],\n },\n {\n name: 'avg',\n description: 'Calculate the average of array elements',\n signature: 'avg(array)',\n returnType: 'number',\n examples: ['avg(scores) // average score'],\n },\n {\n name: 'count',\n description: 'Get the number of elements in an array',\n signature: 'count(array)',\n returnType: 'number',\n examples: ['count(items) // number of items'],\n },\n {\n name: 'first',\n description: 'Get the first element of an array',\n signature: 'first(array)',\n returnType: 'any',\n examples: ['first(items) // first item'],\n },\n {\n name: 'last',\n description: 'Get the last element of an array',\n signature: 'last(array)',\n returnType: 'any',\n examples: ['last(items) // last item'],\n },\n ],\n conversion: [\n {\n name: 'tostring',\n description: 'Convert a value to string',\n signature: 'tostring(value)',\n returnType: 'string',\n examples: ['tostring(42) // \"42\"'],\n },\n {\n name: 'tonumber',\n description: 'Convert a value to number',\n signature: 'tonumber(value)',\n returnType: 'number',\n examples: ['tonumber(\"42\") // 42'],\n },\n {\n name: 'toboolean',\n description: 'Convert a value to boolean',\n signature: 'toboolean(value)',\n returnType: 'boolean',\n examples: ['toboolean(1) // true', 'toboolean(0) // false'],\n },\n ],\n conditional: [\n {\n name: 'if',\n description: 'Return one of two values based on a condition',\n signature: 'if(condition, valueIfTrue, valueIfFalse)',\n returnType: 'any',\n examples: [\n 'if(stock > 0, \"Available\", \"Out of Stock\")',\n 'if(price > 100, price * 0.9, price)',\n ],\n },\n {\n name: 'coalesce',\n description: 'Return the first non-null value',\n signature: 'coalesce(value1, value2, ...)',\n returnType: 'any',\n examples: ['coalesce(nickname, name, \"Anonymous\")'],\n },\n ],\n },\n\n features: [\n {\n name: 'simple_refs',\n description: 'Reference top-level fields by name',\n minVersion: '1.0',\n examples: ['price', 'quantity', 'baseDamage'],\n dependenciesExtracted: ['[\"price\"]', '[\"quantity\"]', '[\"baseDamage\"]'],\n },\n {\n name: 'arithmetic',\n description: 'Basic math operations (+, -, *, /)',\n minVersion: '1.0',\n examples: ['price * 1.1', 'a + b - c', 'quantity * price'],\n },\n {\n name: 'comparison',\n description: 'Compare values (>, <, >=, <=, ==, !=)',\n minVersion: '1.0',\n examples: ['price > 100', 'x == 10', 'quantity >= 5'],\n },\n {\n name: 'nested_path',\n description: 'Access nested object properties using dot notation',\n minVersion: '1.1',\n examples: ['stats.damage', 'user.profile.name', 'item.metadata.category'],\n dependenciesExtracted: ['[\"stats.damage\"]'],\n },\n {\n name: 'array_index',\n description:\n 'Access array elements by numeric index. Negative indices access from the end',\n minVersion: '1.1',\n examples: [\n 'items[0].price',\n 'inventory[1].quantity',\n 'items[-1].name // last element',\n 'items[-2].price // second to last',\n ],\n dependenciesExtracted: ['[\"items[0].price\"]', '[\"items[-1].name\"]'],\n },\n {\n name: 'root_path',\n description:\n 'Absolute path reference starting with /. Always resolves from root data, even inside array item formulas',\n minVersion: '1.1',\n examples: [\n '/taxRate',\n '/config.tax',\n 'price * (1 + /taxRate)',\n 'price * /config.multiplier',\n ],\n dependenciesExtracted: ['[\"/taxRate\"]', '[\"/config.tax\"]'],\n },\n {\n name: 'relative_path',\n description:\n 'Relative path reference starting with ../. Resolves from parent context (root data) when inside array item formulas',\n minVersion: '1.1',\n examples: [\n '../discount',\n '../settings.multiplier',\n 'price * (1 - ../discount)',\n 'price * ../settings.multiplier',\n ],\n dependenciesExtracted: ['[\"../discount\"]', '[\"../settings.multiplier\"]'],\n },\n {\n name: 'function_named_fields',\n description:\n 'Fields can have the same name as built-in functions (max, min, sum, etc.). Built-in functions are always checked first when a function call is made',\n minVersion: '1.0',\n examples: [\n 'max(max, 0)',\n 'min(min, 100)',\n 'max(max - field.min, 0)',\n 'round(round * 2)',\n ],\n },\n ],\n\n versionDetection: [\n { feature: 'Simple refs, arithmetic, comparisons', minVersion: '1.0' },\n { feature: 'Function-named fields (max(max, 0))', minVersion: '1.0' },\n { feature: 'Nested paths (a.b)', minVersion: '1.1' },\n { feature: 'Array index ([0], [-1])', minVersion: '1.1' },\n { feature: 'Absolute paths (/field)', minVersion: '1.1' },\n { feature: 'Relative paths (../field)', minVersion: '1.1' },\n ],\n\n parseResult: {\n description:\n 'The parser automatically detects the minimum required version',\n interface: `interface ParseResult {\n ast: ASTNode; // Abstract syntax tree\n dependencies: string[]; // List of field dependencies\n features: string[]; // List of detected features\n minVersion: string; // Minimum required version (\"1.0\" or \"1.1\")\n}`,\n },\n\n examples: [\n {\n expression: 'price * quantity',\n description: 'Calculate total from price and quantity',\n result: 'number',\n },\n {\n expression: 'firstName + \" \" + lastName',\n description: 'Concatenate strings with space',\n result: 'string',\n },\n {\n expression: 'quantity > 0',\n description: 'Check if in stock',\n result: 'boolean',\n },\n {\n expression: 'if(stock > 0, \"Available\", \"Out of Stock\")',\n description: 'Conditional text based on stock',\n result: 'string',\n },\n {\n expression: 'price * (1 + taxRate)',\n description: 'Price with tax',\n result: 'number',\n },\n {\n expression: 'items[0].price + items[1].price',\n description: 'Sum first two item prices (v1.1)',\n result: 'number',\n },\n ],\n\n apiExamples: [\n {\n name: 'Simple Expression (v1.0)',\n description: 'Parse a basic arithmetic expression',\n code: `parseExpression('price * 1.1')\n// {\n// minVersion: \"1.0\",\n// features: [],\n// dependencies: [\"price\"]\n// }`,\n },\n {\n name: 'Nested Path (v1.1)',\n description: 'Parse expression with nested object access',\n code: `parseExpression('stats.damage * multiplier')\n// {\n// minVersion: \"1.1\",\n// features: [\"nested_path\"],\n// dependencies: [\"stats.damage\", \"multiplier\"]\n// }`,\n },\n {\n name: 'Array Access (v1.1)',\n description: 'Parse expression with array index access',\n code: `parseExpression('items[0].price + items[1].price')\n// {\n// minVersion: \"1.1\",\n// features: [\"array_index\", \"nested_path\"],\n// dependencies: [\"items[0].price\", \"items[1].price\"]\n// }`,\n },\n {\n name: 'Evaluate expressions',\n description: 'Execute formulas with context data',\n code: `evaluate('price * 1.1', { price: 100 })\n// 110\n\nevaluate('stats.damage', { stats: { damage: 50 } })\n// 50\n\nevaluate('items[0].price', { items: [{ price: 10 }] })\n// 10\n\nevaluate('price > 100', { price: 150 })\n// true\n\nevaluate('a + b * c', { a: 1, b: 2, c: 3 })\n// 7`,\n },\n {\n name: 'Function-named fields',\n description: 'Fields can have the same name as built-in functions',\n code: `// Built-in functions take precedence in function calls\nevaluate('max(max, 0)', { max: 10 })\n// 10 (max() function, then max field)\n\nevaluate('max(max - field.min, 0)', { max: 100, field: { min: 20 } })\n// 80\n\nevaluate('round(round * 2)', { round: 3.7 })\n// 7\n\n// Field named \"sum\" doesn't conflict with sum() function\nevaluate('sum(values) + sum', { values: [1, 2, 3], sum: 10 })\n// 16`,\n },\n {\n name: 'Evaluate with context (array items)',\n description:\n 'Use evaluateWithContext() for array item formulas with path resolution',\n code: `// Absolute path: /field always resolves from root\nevaluateWithContext('price * (1 + /taxRate)', {\n rootData: { taxRate: 0.1, items: [{ price: 100 }] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 110\n\n// Nested absolute path\nevaluateWithContext('price * /config.multiplier', {\n rootData: { config: { multiplier: 1.5 }, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 150\n\n// Relative path: ../field resolves from parent (root)\nevaluateWithContext('price * (1 - ../discount)', {\n rootData: { discount: 0.2, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 80\n\n// itemData takes precedence over rootData for same field\nevaluateWithContext('value + 10', {\n rootData: { value: 100 },\n itemData: { value: 50 },\n currentPath: 'items[0]'\n})\n// 60`,\n },\n ],\n\n schemaUsage: {\n structure:\n '{ \"x-formula\": { \"version\": 1, \"expression\": \"...\" }, \"readOnly\": true }',\n fieldTypes: ['string', 'number', 'boolean'],\n rules: [\n 'Add x-formula to string, number, or boolean field schema',\n 'readOnly: true is REQUIRED for fields with x-formula',\n 'Expression must reference existing fields in the same table',\n 'Circular dependencies are not allowed (a references b, b references a)',\n ],\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/formula-spec.ts"],"names":[],"mappings":"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","file":"formula-spec.cjs","sourcesContent":["export interface FunctionSpec {\n name: string;\n description: string;\n signature: string;\n returnType: 'string' | 'number' | 'boolean' | 'any';\n examples: string[];\n}\n\nexport interface FormulaSpec {\n version: string;\n description: string;\n syntax: {\n fieldReferences: string[];\n arithmeticOperators: { operator: string; description: string }[];\n comparisonOperators: { operator: string; description: string }[];\n logicalOperators: { operator: string; description: string }[];\n other: string[];\n };\n functions: {\n string: FunctionSpec[];\n numeric: FunctionSpec[];\n boolean: FunctionSpec[];\n array: FunctionSpec[];\n conversion: FunctionSpec[];\n conditional: FunctionSpec[];\n };\n features: {\n name: string;\n description: string;\n minVersion: string;\n examples: string[];\n dependenciesExtracted?: string[];\n }[];\n versionDetection: { feature: string; minVersion: string }[];\n parseResult: {\n description: string;\n interface: string;\n };\n examples: {\n expression: string;\n description: string;\n result?: string;\n }[];\n apiExamples: {\n name: string;\n description: string;\n code: string;\n }[];\n schemaUsage: {\n structure: string;\n fieldTypes: string[];\n rules: string[];\n };\n}\n\nexport const formulaSpec: FormulaSpec = {\n version: '1.1',\n description:\n 'Formula expressions for computed fields. Formulas reference other fields and calculate values automatically.',\n\n syntax: {\n fieldReferences: [\n 'Simple field: fieldName (e.g., price, quantity)',\n 'Nested path: object.property (e.g., stats.damage)',\n 'Array index: array[0] or array[-1] for last element',\n 'Combined: items[0].price, user.addresses[-1].city',\n ],\n arithmeticOperators: [\n { operator: '+', description: 'Addition or string concatenation' },\n { operator: '-', description: 'Subtraction' },\n { operator: '*', description: 'Multiplication' },\n { operator: '/', description: 'Division' },\n { operator: '%', description: 'Modulo (remainder)' },\n ],\n comparisonOperators: [\n { operator: '==', description: 'Equal' },\n { operator: '!=', description: 'Not equal' },\n { operator: '>', description: 'Greater than' },\n { operator: '<', description: 'Less than' },\n { operator: '>=', description: 'Greater or equal' },\n { operator: '<=', description: 'Less or equal' },\n ],\n logicalOperators: [\n { operator: '&&', description: 'Logical AND' },\n { operator: '||', description: 'Logical OR' },\n { operator: '!', description: 'Logical NOT' },\n ],\n other: ['Parentheses: (a + b) * c', 'Unary minus: -value, a + -b'],\n },\n\n functions: {\n string: [\n {\n name: 'concat',\n description: 'Concatenate multiple values into a single string',\n signature: 'concat(value1, value2, ...)',\n returnType: 'string',\n examples: [\n 'concat(firstName, \" \", lastName) // \"John Doe\"',\n 'concat(\"Price: \", price, \" USD\") // \"Price: 100 USD\"',\n ],\n },\n {\n name: 'upper',\n description: 'Convert string to uppercase',\n signature: 'upper(text)',\n returnType: 'string',\n examples: ['upper(name) // \"HELLO\"'],\n },\n {\n name: 'lower',\n description: 'Convert string to lowercase',\n signature: 'lower(text)',\n returnType: 'string',\n examples: ['lower(name) // \"hello\"'],\n },\n {\n name: 'trim',\n description: 'Remove whitespace from both ends of a string',\n signature: 'trim(text)',\n returnType: 'string',\n examples: ['trim(name) // \"hello\" from \" hello \"'],\n },\n {\n name: 'left',\n description: 'Extract characters from the beginning of a string',\n signature: 'left(text, count)',\n returnType: 'string',\n examples: ['left(name, 3) // \"hel\" from \"hello\"'],\n },\n {\n name: 'right',\n description: 'Extract characters from the end of a string',\n signature: 'right(text, count)',\n returnType: 'string',\n examples: ['right(name, 3) // \"llo\" from \"hello\"'],\n },\n {\n name: 'replace',\n description: 'Replace first occurrence of a substring',\n signature: 'replace(text, search, replacement)',\n returnType: 'string',\n examples: ['replace(name, \"o\", \"0\") // \"hell0\" from \"hello\"'],\n },\n {\n name: 'join',\n description: 'Join array elements into a string',\n signature: 'join(array, separator?)',\n returnType: 'string',\n examples: ['join(tags) // \"a,b,c\"', 'join(tags, \" | \") // \"a | b | c\"'],\n },\n ],\n numeric: [\n {\n name: 'round',\n description: 'Round a number to specified decimal places',\n signature: 'round(number, decimals?)',\n returnType: 'number',\n examples: ['round(3.14159, 2) // 3.14', 'round(3.5) // 4'],\n },\n {\n name: 'floor',\n description: 'Round down to the nearest integer',\n signature: 'floor(number)',\n returnType: 'number',\n examples: ['floor(3.7) // 3'],\n },\n {\n name: 'ceil',\n description: 'Round up to the nearest integer',\n signature: 'ceil(number)',\n returnType: 'number',\n examples: ['ceil(3.2) // 4'],\n },\n {\n name: 'abs',\n description: 'Get the absolute value',\n signature: 'abs(number)',\n returnType: 'number',\n examples: ['abs(-5) // 5'],\n },\n {\n name: 'sqrt',\n description: 'Calculate the square root',\n signature: 'sqrt(number)',\n returnType: 'number',\n examples: ['sqrt(16) // 4'],\n },\n {\n name: 'pow',\n description: 'Raise a number to a power',\n signature: 'pow(base, exponent)',\n returnType: 'number',\n examples: ['pow(2, 3) // 8'],\n },\n {\n name: 'min',\n description: 'Get the minimum of multiple values',\n signature: 'min(value1, value2, ...)',\n returnType: 'number',\n examples: ['min(a, b, c) // smallest value'],\n },\n {\n name: 'max',\n description: 'Get the maximum of multiple values',\n signature: 'max(value1, value2, ...)',\n returnType: 'number',\n examples: ['max(a, b, c) // largest value'],\n },\n {\n name: 'log',\n description: 'Calculate the natural logarithm',\n signature: 'log(number)',\n returnType: 'number',\n examples: ['log(10) // 2.302...'],\n },\n {\n name: 'log10',\n description: 'Calculate the base-10 logarithm',\n signature: 'log10(number)',\n returnType: 'number',\n examples: ['log10(100) // 2'],\n },\n {\n name: 'exp',\n description: 'Calculate e raised to a power',\n signature: 'exp(number)',\n returnType: 'number',\n examples: ['exp(1) // 2.718...'],\n },\n {\n name: 'sign',\n description: 'Get the sign of a number (-1, 0, or 1)',\n signature: 'sign(number)',\n returnType: 'number',\n examples: ['sign(-5) // -1', 'sign(0) // 0', 'sign(5) // 1'],\n },\n {\n name: 'length',\n description: 'Get the length of a string or array',\n signature: 'length(value)',\n returnType: 'number',\n examples: ['length(name) // 5 from \"hello\"', 'length(items) // 3'],\n },\n ],\n boolean: [\n {\n name: 'and',\n description: 'Logical AND of two values',\n signature: 'and(a, b)',\n returnType: 'boolean',\n examples: ['and(isActive, hasPermission) // true if both true'],\n },\n {\n name: 'or',\n description: 'Logical OR of two values',\n signature: 'or(a, b)',\n returnType: 'boolean',\n examples: ['or(isAdmin, isOwner) // true if either true'],\n },\n {\n name: 'not',\n description: 'Logical NOT of a value',\n signature: 'not(value)',\n returnType: 'boolean',\n examples: ['not(isDeleted) // true if false'],\n },\n {\n name: 'contains',\n description: 'Check if a string contains a substring',\n signature: 'contains(text, search)',\n returnType: 'boolean',\n examples: ['contains(name, \"ell\") // true for \"hello\"'],\n },\n {\n name: 'startswith',\n description: 'Check if a string starts with a prefix',\n signature: 'startswith(text, prefix)',\n returnType: 'boolean',\n examples: ['startswith(name, \"hel\") // true for \"hello\"'],\n },\n {\n name: 'endswith',\n description: 'Check if a string ends with a suffix',\n signature: 'endswith(text, suffix)',\n returnType: 'boolean',\n examples: ['endswith(name, \"llo\") // true for \"hello\"'],\n },\n {\n name: 'isnull',\n description: 'Check if a value is null or undefined',\n signature: 'isnull(value)',\n returnType: 'boolean',\n examples: ['isnull(optionalField) // true if null/undefined'],\n },\n {\n name: 'includes',\n description: 'Check if an array contains a value',\n signature: 'includes(array, value)',\n returnType: 'boolean',\n examples: [\n 'includes(tags, \"featured\") // true if array contains value',\n ],\n },\n ],\n array: [\n {\n name: 'sum',\n description: 'Calculate the sum of array elements',\n signature: 'sum(array)',\n returnType: 'number',\n examples: ['sum(prices) // total of all prices'],\n },\n {\n name: 'avg',\n description: 'Calculate the average of array elements',\n signature: 'avg(array)',\n returnType: 'number',\n examples: ['avg(scores) // average score'],\n },\n {\n name: 'count',\n description: 'Get the number of elements in an array',\n signature: 'count(array)',\n returnType: 'number',\n examples: ['count(items) // number of items'],\n },\n {\n name: 'first',\n description: 'Get the first element of an array',\n signature: 'first(array)',\n returnType: 'any',\n examples: ['first(items) // first item'],\n },\n {\n name: 'last',\n description: 'Get the last element of an array',\n signature: 'last(array)',\n returnType: 'any',\n examples: ['last(items) // last item'],\n },\n ],\n conversion: [\n {\n name: 'tostring',\n description: 'Convert a value to string',\n signature: 'tostring(value)',\n returnType: 'string',\n examples: ['tostring(42) // \"42\"'],\n },\n {\n name: 'tonumber',\n description: 'Convert a value to number',\n signature: 'tonumber(value)',\n returnType: 'number',\n examples: ['tonumber(\"42\") // 42'],\n },\n {\n name: 'toboolean',\n description: 'Convert a value to boolean',\n signature: 'toboolean(value)',\n returnType: 'boolean',\n examples: ['toboolean(1) // true', 'toboolean(0) // false'],\n },\n ],\n conditional: [\n {\n name: 'if',\n description: 'Return one of two values based on a condition',\n signature: 'if(condition, valueIfTrue, valueIfFalse)',\n returnType: 'any',\n examples: [\n 'if(stock > 0, \"Available\", \"Out of Stock\")',\n 'if(price > 100, price * 0.9, price)',\n ],\n },\n {\n name: 'coalesce',\n description: 'Return the first non-null value',\n signature: 'coalesce(value1, value2, ...)',\n returnType: 'any',\n examples: ['coalesce(nickname, name, \"Anonymous\")'],\n },\n ],\n },\n\n features: [\n {\n name: 'simple_refs',\n description: 'Reference top-level fields by name',\n minVersion: '1.0',\n examples: ['price', 'quantity', 'baseDamage'],\n dependenciesExtracted: ['[\"price\"]', '[\"quantity\"]', '[\"baseDamage\"]'],\n },\n {\n name: 'arithmetic',\n description: 'Basic math operations (+, -, *, /)',\n minVersion: '1.0',\n examples: ['price * 1.1', 'a + b - c', 'quantity * price'],\n },\n {\n name: 'comparison',\n description: 'Compare values (>, <, >=, <=, ==, !=)',\n minVersion: '1.0',\n examples: ['price > 100', 'x == 10', 'quantity >= 5'],\n },\n {\n name: 'nested_path',\n description: 'Access nested object properties using dot notation',\n minVersion: '1.1',\n examples: ['stats.damage', 'user.profile.name', 'item.metadata.category'],\n dependenciesExtracted: ['[\"stats.damage\"]'],\n },\n {\n name: 'array_index',\n description:\n 'Access array elements by numeric index. Negative indices access from the end',\n minVersion: '1.1',\n examples: [\n 'items[0].price',\n 'inventory[1].quantity',\n 'items[-1].name // last element',\n 'items[-2].price // second to last',\n ],\n dependenciesExtracted: ['[\"items[0].price\"]', '[\"items[-1].name\"]'],\n },\n {\n name: 'root_path',\n description:\n 'Absolute path reference starting with /. Always resolves from root data, even inside array item formulas',\n minVersion: '1.1',\n examples: [\n '/taxRate',\n '/config.tax',\n 'price * (1 + /taxRate)',\n 'price * /config.multiplier',\n ],\n dependenciesExtracted: ['[\"/taxRate\"]', '[\"/config.tax\"]'],\n },\n {\n name: 'relative_path',\n description:\n 'Relative path reference starting with ../. Resolves from parent context (root data) when inside array item formulas',\n minVersion: '1.1',\n examples: [\n '../discount',\n '../settings.multiplier',\n 'price * (1 - ../discount)',\n 'price * ../settings.multiplier',\n ],\n dependenciesExtracted: ['[\"../discount\"]', '[\"../settings.multiplier\"]'],\n },\n {\n name: 'function_named_fields',\n description:\n 'Fields can have the same name as built-in functions (max, min, sum, etc.). Built-in functions are always checked first when a function call is made',\n minVersion: '1.0',\n examples: [\n 'max(max, 0)',\n 'min(min, 100)',\n 'max(max - field.min, 0)',\n 'round(round * 2)',\n ],\n },\n ],\n\n versionDetection: [\n { feature: 'Simple refs, arithmetic, comparisons', minVersion: '1.0' },\n { feature: 'Function-named fields (max(max, 0))', minVersion: '1.0' },\n { feature: 'Nested paths (a.b)', minVersion: '1.1' },\n { feature: 'Array index ([0], [-1])', minVersion: '1.1' },\n { feature: 'Absolute paths (/field)', minVersion: '1.1' },\n { feature: 'Relative paths (../field)', minVersion: '1.1' },\n ],\n\n parseResult: {\n description:\n 'The parser automatically detects the minimum required version',\n interface: `interface ParseResult {\n ast: ASTNode; // Abstract syntax tree\n dependencies: string[]; // List of field dependencies\n features: string[]; // List of detected features\n minVersion: string; // Minimum required version (\"1.0\" or \"1.1\")\n}`,\n },\n\n examples: [\n {\n expression: 'price * quantity',\n description: 'Calculate total from price and quantity',\n result: 'number',\n },\n {\n expression: 'firstName + \" \" + lastName',\n description: 'Concatenate strings with space',\n result: 'string',\n },\n {\n expression: 'quantity > 0',\n description: 'Check if in stock',\n result: 'boolean',\n },\n {\n expression: 'if(stock > 0, \"Available\", \"Out of Stock\")',\n description: 'Conditional text based on stock',\n result: 'string',\n },\n {\n expression: 'price * (1 + taxRate)',\n description: 'Price with tax',\n result: 'number',\n },\n {\n expression: 'items[0].price + items[1].price',\n description: 'Sum first two item prices (v1.1)',\n result: 'number',\n },\n ],\n\n apiExamples: [\n {\n name: 'Simple Expression (v1.0)',\n description: 'Parse a basic arithmetic expression',\n code: `parseExpression('price * 1.1')\n// {\n// minVersion: \"1.0\",\n// features: [],\n// dependencies: [\"price\"]\n// }`,\n },\n {\n name: 'Nested Path (v1.1)',\n description: 'Parse expression with nested object access',\n code: `parseExpression('stats.damage * multiplier')\n// {\n// minVersion: \"1.1\",\n// features: [\"nested_path\"],\n// dependencies: [\"stats.damage\", \"multiplier\"]\n// }`,\n },\n {\n name: 'Array Access (v1.1)',\n description: 'Parse expression with array index access',\n code: `parseExpression('items[0].price + items[1].price')\n// {\n// minVersion: \"1.1\",\n// features: [\"array_index\", \"nested_path\"],\n// dependencies: [\"items[0].price\", \"items[1].price\"]\n// }`,\n },\n {\n name: 'Evaluate expressions',\n description: 'Execute formulas with context data',\n code: `evaluate('price * 1.1', { price: 100 })\n// 110\n\nevaluate('stats.damage', { stats: { damage: 50 } })\n// 50\n\nevaluate('items[0].price', { items: [{ price: 10 }] })\n// 10\n\nevaluate('price > 100', { price: 150 })\n// true\n\nevaluate('a + b * c', { a: 1, b: 2, c: 3 })\n// 7`,\n },\n {\n name: 'Function-named fields',\n description: 'Fields can have the same name as built-in functions',\n code: `// Built-in functions take precedence in function calls\nevaluate('max(max, 0)', { max: 10 })\n// 10 (max() function, then max field)\n\nevaluate('max(max - field.min, 0)', { max: 100, field: { min: 20 } })\n// 80\n\nevaluate('round(round * 2)', { round: 3.7 })\n// 7\n\n// Field named \"sum\" doesn't conflict with sum() function\nevaluate('sum(values) + sum', { values: [1, 2, 3], sum: 10 })\n// 16`,\n },\n {\n name: 'Evaluate with context (array items)',\n description:\n 'Use evaluateWithContext() for array item formulas with path resolution',\n code: `// Absolute path: /field always resolves from root\nevaluateWithContext('price * (1 + /taxRate)', {\n rootData: { taxRate: 0.1, items: [{ price: 100 }] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 110\n\n// Nested absolute path\nevaluateWithContext('price * /config.multiplier', {\n rootData: { config: { multiplier: 1.5 }, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 150\n\n// Relative path: ../field resolves from parent (root)\nevaluateWithContext('price * (1 - ../discount)', {\n rootData: { discount: 0.2, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 80\n\n// itemData takes precedence over rootData for same field\nevaluateWithContext('value + 10', {\n rootData: { value: 100 },\n itemData: { value: 50 },\n currentPath: 'items[0]'\n})\n// 60`,\n },\n ],\n\n schemaUsage: {\n structure:\n '{ \"x-formula\": { \"version\": 1, \"expression\": \"...\" }, \"readOnly\": true }',\n fieldTypes: ['string', 'number', 'boolean'],\n rules: [\n 'Add x-formula to string, number, or boolean field schema',\n 'readOnly: true is REQUIRED for fields with x-formula',\n 'Expression must reference existing fields in the same table',\n 'Circular dependencies are not allowed (a references b, b references a)',\n ],\n },\n};\n"]}
@@ -1,5 +1,3 @@
1
- import './chunk-PZ5AY32C.js';
2
-
3
1
  // src/formula-spec.ts
4
2
  var formulaSpec = {
5
3
  version: "1.1",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/formula-spec.ts"],"names":[],"mappings":"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","file":"formula-spec.js","sourcesContent":["export interface FunctionSpec {\n name: string;\n description: string;\n signature: string;\n returnType: 'string' | 'number' | 'boolean' | 'any';\n examples: string[];\n}\n\nexport interface FormulaSpec {\n version: string;\n description: string;\n syntax: {\n fieldReferences: string[];\n arithmeticOperators: { operator: string; description: string }[];\n comparisonOperators: { operator: string; description: string }[];\n logicalOperators: { operator: string; description: string }[];\n other: string[];\n };\n functions: {\n string: FunctionSpec[];\n numeric: FunctionSpec[];\n boolean: FunctionSpec[];\n array: FunctionSpec[];\n conversion: FunctionSpec[];\n conditional: FunctionSpec[];\n };\n features: {\n name: string;\n description: string;\n minVersion: string;\n examples: string[];\n dependenciesExtracted?: string[];\n }[];\n versionDetection: { feature: string; minVersion: string }[];\n parseResult: {\n description: string;\n interface: string;\n };\n examples: {\n expression: string;\n description: string;\n result?: string;\n }[];\n apiExamples: {\n name: string;\n description: string;\n code: string;\n }[];\n schemaUsage: {\n structure: string;\n fieldTypes: string[];\n rules: string[];\n };\n}\n\nexport const formulaSpec: FormulaSpec = {\n version: '1.1',\n description:\n 'Formula expressions for computed fields. Formulas reference other fields and calculate values automatically.',\n\n syntax: {\n fieldReferences: [\n 'Simple field: fieldName (e.g., price, quantity)',\n 'Nested path: object.property (e.g., stats.damage)',\n 'Array index: array[0] or array[-1] for last element',\n 'Combined: items[0].price, user.addresses[-1].city',\n ],\n arithmeticOperators: [\n { operator: '+', description: 'Addition or string concatenation' },\n { operator: '-', description: 'Subtraction' },\n { operator: '*', description: 'Multiplication' },\n { operator: '/', description: 'Division' },\n { operator: '%', description: 'Modulo (remainder)' },\n ],\n comparisonOperators: [\n { operator: '==', description: 'Equal' },\n { operator: '!=', description: 'Not equal' },\n { operator: '>', description: 'Greater than' },\n { operator: '<', description: 'Less than' },\n { operator: '>=', description: 'Greater or equal' },\n { operator: '<=', description: 'Less or equal' },\n ],\n logicalOperators: [\n { operator: '&&', description: 'Logical AND' },\n { operator: '||', description: 'Logical OR' },\n { operator: '!', description: 'Logical NOT' },\n ],\n other: ['Parentheses: (a + b) * c', 'Unary minus: -value, a + -b'],\n },\n\n functions: {\n string: [\n {\n name: 'concat',\n description: 'Concatenate multiple values into a single string',\n signature: 'concat(value1, value2, ...)',\n returnType: 'string',\n examples: [\n 'concat(firstName, \" \", lastName) // \"John Doe\"',\n 'concat(\"Price: \", price, \" USD\") // \"Price: 100 USD\"',\n ],\n },\n {\n name: 'upper',\n description: 'Convert string to uppercase',\n signature: 'upper(text)',\n returnType: 'string',\n examples: ['upper(name) // \"HELLO\"'],\n },\n {\n name: 'lower',\n description: 'Convert string to lowercase',\n signature: 'lower(text)',\n returnType: 'string',\n examples: ['lower(name) // \"hello\"'],\n },\n {\n name: 'trim',\n description: 'Remove whitespace from both ends of a string',\n signature: 'trim(text)',\n returnType: 'string',\n examples: ['trim(name) // \"hello\" from \" hello \"'],\n },\n {\n name: 'left',\n description: 'Extract characters from the beginning of a string',\n signature: 'left(text, count)',\n returnType: 'string',\n examples: ['left(name, 3) // \"hel\" from \"hello\"'],\n },\n {\n name: 'right',\n description: 'Extract characters from the end of a string',\n signature: 'right(text, count)',\n returnType: 'string',\n examples: ['right(name, 3) // \"llo\" from \"hello\"'],\n },\n {\n name: 'replace',\n description: 'Replace first occurrence of a substring',\n signature: 'replace(text, search, replacement)',\n returnType: 'string',\n examples: ['replace(name, \"o\", \"0\") // \"hell0\" from \"hello\"'],\n },\n {\n name: 'join',\n description: 'Join array elements into a string',\n signature: 'join(array, separator?)',\n returnType: 'string',\n examples: ['join(tags) // \"a,b,c\"', 'join(tags, \" | \") // \"a | b | c\"'],\n },\n ],\n numeric: [\n {\n name: 'round',\n description: 'Round a number to specified decimal places',\n signature: 'round(number, decimals?)',\n returnType: 'number',\n examples: ['round(3.14159, 2) // 3.14', 'round(3.5) // 4'],\n },\n {\n name: 'floor',\n description: 'Round down to the nearest integer',\n signature: 'floor(number)',\n returnType: 'number',\n examples: ['floor(3.7) // 3'],\n },\n {\n name: 'ceil',\n description: 'Round up to the nearest integer',\n signature: 'ceil(number)',\n returnType: 'number',\n examples: ['ceil(3.2) // 4'],\n },\n {\n name: 'abs',\n description: 'Get the absolute value',\n signature: 'abs(number)',\n returnType: 'number',\n examples: ['abs(-5) // 5'],\n },\n {\n name: 'sqrt',\n description: 'Calculate the square root',\n signature: 'sqrt(number)',\n returnType: 'number',\n examples: ['sqrt(16) // 4'],\n },\n {\n name: 'pow',\n description: 'Raise a number to a power',\n signature: 'pow(base, exponent)',\n returnType: 'number',\n examples: ['pow(2, 3) // 8'],\n },\n {\n name: 'min',\n description: 'Get the minimum of multiple values',\n signature: 'min(value1, value2, ...)',\n returnType: 'number',\n examples: ['min(a, b, c) // smallest value'],\n },\n {\n name: 'max',\n description: 'Get the maximum of multiple values',\n signature: 'max(value1, value2, ...)',\n returnType: 'number',\n examples: ['max(a, b, c) // largest value'],\n },\n {\n name: 'log',\n description: 'Calculate the natural logarithm',\n signature: 'log(number)',\n returnType: 'number',\n examples: ['log(10) // 2.302...'],\n },\n {\n name: 'log10',\n description: 'Calculate the base-10 logarithm',\n signature: 'log10(number)',\n returnType: 'number',\n examples: ['log10(100) // 2'],\n },\n {\n name: 'exp',\n description: 'Calculate e raised to a power',\n signature: 'exp(number)',\n returnType: 'number',\n examples: ['exp(1) // 2.718...'],\n },\n {\n name: 'sign',\n description: 'Get the sign of a number (-1, 0, or 1)',\n signature: 'sign(number)',\n returnType: 'number',\n examples: ['sign(-5) // -1', 'sign(0) // 0', 'sign(5) // 1'],\n },\n {\n name: 'length',\n description: 'Get the length of a string or array',\n signature: 'length(value)',\n returnType: 'number',\n examples: ['length(name) // 5 from \"hello\"', 'length(items) // 3'],\n },\n ],\n boolean: [\n {\n name: 'and',\n description: 'Logical AND of two values',\n signature: 'and(a, b)',\n returnType: 'boolean',\n examples: ['and(isActive, hasPermission) // true if both true'],\n },\n {\n name: 'or',\n description: 'Logical OR of two values',\n signature: 'or(a, b)',\n returnType: 'boolean',\n examples: ['or(isAdmin, isOwner) // true if either true'],\n },\n {\n name: 'not',\n description: 'Logical NOT of a value',\n signature: 'not(value)',\n returnType: 'boolean',\n examples: ['not(isDeleted) // true if false'],\n },\n {\n name: 'contains',\n description: 'Check if a string contains a substring',\n signature: 'contains(text, search)',\n returnType: 'boolean',\n examples: ['contains(name, \"ell\") // true for \"hello\"'],\n },\n {\n name: 'startswith',\n description: 'Check if a string starts with a prefix',\n signature: 'startswith(text, prefix)',\n returnType: 'boolean',\n examples: ['startswith(name, \"hel\") // true for \"hello\"'],\n },\n {\n name: 'endswith',\n description: 'Check if a string ends with a suffix',\n signature: 'endswith(text, suffix)',\n returnType: 'boolean',\n examples: ['endswith(name, \"llo\") // true for \"hello\"'],\n },\n {\n name: 'isnull',\n description: 'Check if a value is null or undefined',\n signature: 'isnull(value)',\n returnType: 'boolean',\n examples: ['isnull(optionalField) // true if null/undefined'],\n },\n {\n name: 'includes',\n description: 'Check if an array contains a value',\n signature: 'includes(array, value)',\n returnType: 'boolean',\n examples: [\n 'includes(tags, \"featured\") // true if array contains value',\n ],\n },\n ],\n array: [\n {\n name: 'sum',\n description: 'Calculate the sum of array elements',\n signature: 'sum(array)',\n returnType: 'number',\n examples: ['sum(prices) // total of all prices'],\n },\n {\n name: 'avg',\n description: 'Calculate the average of array elements',\n signature: 'avg(array)',\n returnType: 'number',\n examples: ['avg(scores) // average score'],\n },\n {\n name: 'count',\n description: 'Get the number of elements in an array',\n signature: 'count(array)',\n returnType: 'number',\n examples: ['count(items) // number of items'],\n },\n {\n name: 'first',\n description: 'Get the first element of an array',\n signature: 'first(array)',\n returnType: 'any',\n examples: ['first(items) // first item'],\n },\n {\n name: 'last',\n description: 'Get the last element of an array',\n signature: 'last(array)',\n returnType: 'any',\n examples: ['last(items) // last item'],\n },\n ],\n conversion: [\n {\n name: 'tostring',\n description: 'Convert a value to string',\n signature: 'tostring(value)',\n returnType: 'string',\n examples: ['tostring(42) // \"42\"'],\n },\n {\n name: 'tonumber',\n description: 'Convert a value to number',\n signature: 'tonumber(value)',\n returnType: 'number',\n examples: ['tonumber(\"42\") // 42'],\n },\n {\n name: 'toboolean',\n description: 'Convert a value to boolean',\n signature: 'toboolean(value)',\n returnType: 'boolean',\n examples: ['toboolean(1) // true', 'toboolean(0) // false'],\n },\n ],\n conditional: [\n {\n name: 'if',\n description: 'Return one of two values based on a condition',\n signature: 'if(condition, valueIfTrue, valueIfFalse)',\n returnType: 'any',\n examples: [\n 'if(stock > 0, \"Available\", \"Out of Stock\")',\n 'if(price > 100, price * 0.9, price)',\n ],\n },\n {\n name: 'coalesce',\n description: 'Return the first non-null value',\n signature: 'coalesce(value1, value2, ...)',\n returnType: 'any',\n examples: ['coalesce(nickname, name, \"Anonymous\")'],\n },\n ],\n },\n\n features: [\n {\n name: 'simple_refs',\n description: 'Reference top-level fields by name',\n minVersion: '1.0',\n examples: ['price', 'quantity', 'baseDamage'],\n dependenciesExtracted: ['[\"price\"]', '[\"quantity\"]', '[\"baseDamage\"]'],\n },\n {\n name: 'arithmetic',\n description: 'Basic math operations (+, -, *, /)',\n minVersion: '1.0',\n examples: ['price * 1.1', 'a + b - c', 'quantity * price'],\n },\n {\n name: 'comparison',\n description: 'Compare values (>, <, >=, <=, ==, !=)',\n minVersion: '1.0',\n examples: ['price > 100', 'x == 10', 'quantity >= 5'],\n },\n {\n name: 'nested_path',\n description: 'Access nested object properties using dot notation',\n minVersion: '1.1',\n examples: ['stats.damage', 'user.profile.name', 'item.metadata.category'],\n dependenciesExtracted: ['[\"stats.damage\"]'],\n },\n {\n name: 'array_index',\n description:\n 'Access array elements by numeric index. Negative indices access from the end',\n minVersion: '1.1',\n examples: [\n 'items[0].price',\n 'inventory[1].quantity',\n 'items[-1].name // last element',\n 'items[-2].price // second to last',\n ],\n dependenciesExtracted: ['[\"items[0].price\"]', '[\"items[-1].name\"]'],\n },\n {\n name: 'root_path',\n description:\n 'Absolute path reference starting with /. Always resolves from root data, even inside array item formulas',\n minVersion: '1.1',\n examples: [\n '/taxRate',\n '/config.tax',\n 'price * (1 + /taxRate)',\n 'price * /config.multiplier',\n ],\n dependenciesExtracted: ['[\"/taxRate\"]', '[\"/config.tax\"]'],\n },\n {\n name: 'relative_path',\n description:\n 'Relative path reference starting with ../. Resolves from parent context (root data) when inside array item formulas',\n minVersion: '1.1',\n examples: [\n '../discount',\n '../settings.multiplier',\n 'price * (1 - ../discount)',\n 'price * ../settings.multiplier',\n ],\n dependenciesExtracted: ['[\"../discount\"]', '[\"../settings.multiplier\"]'],\n },\n {\n name: 'function_named_fields',\n description:\n 'Fields can have the same name as built-in functions (max, min, sum, etc.). Built-in functions are always checked first when a function call is made',\n minVersion: '1.0',\n examples: [\n 'max(max, 0)',\n 'min(min, 100)',\n 'max(max - field.min, 0)',\n 'round(round * 2)',\n ],\n },\n ],\n\n versionDetection: [\n { feature: 'Simple refs, arithmetic, comparisons', minVersion: '1.0' },\n { feature: 'Function-named fields (max(max, 0))', minVersion: '1.0' },\n { feature: 'Nested paths (a.b)', minVersion: '1.1' },\n { feature: 'Array index ([0], [-1])', minVersion: '1.1' },\n { feature: 'Absolute paths (/field)', minVersion: '1.1' },\n { feature: 'Relative paths (../field)', minVersion: '1.1' },\n ],\n\n parseResult: {\n description:\n 'The parser automatically detects the minimum required version',\n interface: `interface ParseResult {\n ast: ASTNode; // Abstract syntax tree\n dependencies: string[]; // List of field dependencies\n features: string[]; // List of detected features\n minVersion: string; // Minimum required version (\"1.0\" or \"1.1\")\n}`,\n },\n\n examples: [\n {\n expression: 'price * quantity',\n description: 'Calculate total from price and quantity',\n result: 'number',\n },\n {\n expression: 'firstName + \" \" + lastName',\n description: 'Concatenate strings with space',\n result: 'string',\n },\n {\n expression: 'quantity > 0',\n description: 'Check if in stock',\n result: 'boolean',\n },\n {\n expression: 'if(stock > 0, \"Available\", \"Out of Stock\")',\n description: 'Conditional text based on stock',\n result: 'string',\n },\n {\n expression: 'price * (1 + taxRate)',\n description: 'Price with tax',\n result: 'number',\n },\n {\n expression: 'items[0].price + items[1].price',\n description: 'Sum first two item prices (v1.1)',\n result: 'number',\n },\n ],\n\n apiExamples: [\n {\n name: 'Simple Expression (v1.0)',\n description: 'Parse a basic arithmetic expression',\n code: `parseExpression('price * 1.1')\n// {\n// minVersion: \"1.0\",\n// features: [],\n// dependencies: [\"price\"]\n// }`,\n },\n {\n name: 'Nested Path (v1.1)',\n description: 'Parse expression with nested object access',\n code: `parseExpression('stats.damage * multiplier')\n// {\n// minVersion: \"1.1\",\n// features: [\"nested_path\"],\n// dependencies: [\"stats.damage\", \"multiplier\"]\n// }`,\n },\n {\n name: 'Array Access (v1.1)',\n description: 'Parse expression with array index access',\n code: `parseExpression('items[0].price + items[1].price')\n// {\n// minVersion: \"1.1\",\n// features: [\"array_index\", \"nested_path\"],\n// dependencies: [\"items[0].price\", \"items[1].price\"]\n// }`,\n },\n {\n name: 'Evaluate expressions',\n description: 'Execute formulas with context data',\n code: `evaluate('price * 1.1', { price: 100 })\n// 110\n\nevaluate('stats.damage', { stats: { damage: 50 } })\n// 50\n\nevaluate('items[0].price', { items: [{ price: 10 }] })\n// 10\n\nevaluate('price > 100', { price: 150 })\n// true\n\nevaluate('a + b * c', { a: 1, b: 2, c: 3 })\n// 7`,\n },\n {\n name: 'Function-named fields',\n description: 'Fields can have the same name as built-in functions',\n code: `// Built-in functions take precedence in function calls\nevaluate('max(max, 0)', { max: 10 })\n// 10 (max() function, then max field)\n\nevaluate('max(max - field.min, 0)', { max: 100, field: { min: 20 } })\n// 80\n\nevaluate('round(round * 2)', { round: 3.7 })\n// 7\n\n// Field named \"sum\" doesn't conflict with sum() function\nevaluate('sum(values) + sum', { values: [1, 2, 3], sum: 10 })\n// 16`,\n },\n {\n name: 'Evaluate with context (array items)',\n description:\n 'Use evaluateWithContext() for array item formulas with path resolution',\n code: `// Absolute path: /field always resolves from root\nevaluateWithContext('price * (1 + /taxRate)', {\n rootData: { taxRate: 0.1, items: [{ price: 100 }] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 110\n\n// Nested absolute path\nevaluateWithContext('price * /config.multiplier', {\n rootData: { config: { multiplier: 1.5 }, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 150\n\n// Relative path: ../field resolves from parent (root)\nevaluateWithContext('price * (1 - ../discount)', {\n rootData: { discount: 0.2, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 80\n\n// itemData takes precedence over rootData for same field\nevaluateWithContext('value + 10', {\n rootData: { value: 100 },\n itemData: { value: 50 },\n currentPath: 'items[0]'\n})\n// 60`,\n },\n ],\n\n schemaUsage: {\n structure:\n '{ \"x-formula\": { \"version\": 1, \"expression\": \"...\" }, \"readOnly\": true }',\n fieldTypes: ['string', 'number', 'boolean'],\n rules: [\n 'Add x-formula to string, number, or boolean field schema',\n 'readOnly: true is REQUIRED for fields with x-formula',\n 'Expression must reference existing fields in the same table',\n 'Circular dependencies are not allowed (a references b, b references a)',\n ],\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/formula-spec.ts"],"names":[],"mappings":"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","file":"formula-spec.js","sourcesContent":["export interface FunctionSpec {\n name: string;\n description: string;\n signature: string;\n returnType: 'string' | 'number' | 'boolean' | 'any';\n examples: string[];\n}\n\nexport interface FormulaSpec {\n version: string;\n description: string;\n syntax: {\n fieldReferences: string[];\n arithmeticOperators: { operator: string; description: string }[];\n comparisonOperators: { operator: string; description: string }[];\n logicalOperators: { operator: string; description: string }[];\n other: string[];\n };\n functions: {\n string: FunctionSpec[];\n numeric: FunctionSpec[];\n boolean: FunctionSpec[];\n array: FunctionSpec[];\n conversion: FunctionSpec[];\n conditional: FunctionSpec[];\n };\n features: {\n name: string;\n description: string;\n minVersion: string;\n examples: string[];\n dependenciesExtracted?: string[];\n }[];\n versionDetection: { feature: string; minVersion: string }[];\n parseResult: {\n description: string;\n interface: string;\n };\n examples: {\n expression: string;\n description: string;\n result?: string;\n }[];\n apiExamples: {\n name: string;\n description: string;\n code: string;\n }[];\n schemaUsage: {\n structure: string;\n fieldTypes: string[];\n rules: string[];\n };\n}\n\nexport const formulaSpec: FormulaSpec = {\n version: '1.1',\n description:\n 'Formula expressions for computed fields. Formulas reference other fields and calculate values automatically.',\n\n syntax: {\n fieldReferences: [\n 'Simple field: fieldName (e.g., price, quantity)',\n 'Nested path: object.property (e.g., stats.damage)',\n 'Array index: array[0] or array[-1] for last element',\n 'Combined: items[0].price, user.addresses[-1].city',\n ],\n arithmeticOperators: [\n { operator: '+', description: 'Addition or string concatenation' },\n { operator: '-', description: 'Subtraction' },\n { operator: '*', description: 'Multiplication' },\n { operator: '/', description: 'Division' },\n { operator: '%', description: 'Modulo (remainder)' },\n ],\n comparisonOperators: [\n { operator: '==', description: 'Equal' },\n { operator: '!=', description: 'Not equal' },\n { operator: '>', description: 'Greater than' },\n { operator: '<', description: 'Less than' },\n { operator: '>=', description: 'Greater or equal' },\n { operator: '<=', description: 'Less or equal' },\n ],\n logicalOperators: [\n { operator: '&&', description: 'Logical AND' },\n { operator: '||', description: 'Logical OR' },\n { operator: '!', description: 'Logical NOT' },\n ],\n other: ['Parentheses: (a + b) * c', 'Unary minus: -value, a + -b'],\n },\n\n functions: {\n string: [\n {\n name: 'concat',\n description: 'Concatenate multiple values into a single string',\n signature: 'concat(value1, value2, ...)',\n returnType: 'string',\n examples: [\n 'concat(firstName, \" \", lastName) // \"John Doe\"',\n 'concat(\"Price: \", price, \" USD\") // \"Price: 100 USD\"',\n ],\n },\n {\n name: 'upper',\n description: 'Convert string to uppercase',\n signature: 'upper(text)',\n returnType: 'string',\n examples: ['upper(name) // \"HELLO\"'],\n },\n {\n name: 'lower',\n description: 'Convert string to lowercase',\n signature: 'lower(text)',\n returnType: 'string',\n examples: ['lower(name) // \"hello\"'],\n },\n {\n name: 'trim',\n description: 'Remove whitespace from both ends of a string',\n signature: 'trim(text)',\n returnType: 'string',\n examples: ['trim(name) // \"hello\" from \" hello \"'],\n },\n {\n name: 'left',\n description: 'Extract characters from the beginning of a string',\n signature: 'left(text, count)',\n returnType: 'string',\n examples: ['left(name, 3) // \"hel\" from \"hello\"'],\n },\n {\n name: 'right',\n description: 'Extract characters from the end of a string',\n signature: 'right(text, count)',\n returnType: 'string',\n examples: ['right(name, 3) // \"llo\" from \"hello\"'],\n },\n {\n name: 'replace',\n description: 'Replace first occurrence of a substring',\n signature: 'replace(text, search, replacement)',\n returnType: 'string',\n examples: ['replace(name, \"o\", \"0\") // \"hell0\" from \"hello\"'],\n },\n {\n name: 'join',\n description: 'Join array elements into a string',\n signature: 'join(array, separator?)',\n returnType: 'string',\n examples: ['join(tags) // \"a,b,c\"', 'join(tags, \" | \") // \"a | b | c\"'],\n },\n ],\n numeric: [\n {\n name: 'round',\n description: 'Round a number to specified decimal places',\n signature: 'round(number, decimals?)',\n returnType: 'number',\n examples: ['round(3.14159, 2) // 3.14', 'round(3.5) // 4'],\n },\n {\n name: 'floor',\n description: 'Round down to the nearest integer',\n signature: 'floor(number)',\n returnType: 'number',\n examples: ['floor(3.7) // 3'],\n },\n {\n name: 'ceil',\n description: 'Round up to the nearest integer',\n signature: 'ceil(number)',\n returnType: 'number',\n examples: ['ceil(3.2) // 4'],\n },\n {\n name: 'abs',\n description: 'Get the absolute value',\n signature: 'abs(number)',\n returnType: 'number',\n examples: ['abs(-5) // 5'],\n },\n {\n name: 'sqrt',\n description: 'Calculate the square root',\n signature: 'sqrt(number)',\n returnType: 'number',\n examples: ['sqrt(16) // 4'],\n },\n {\n name: 'pow',\n description: 'Raise a number to a power',\n signature: 'pow(base, exponent)',\n returnType: 'number',\n examples: ['pow(2, 3) // 8'],\n },\n {\n name: 'min',\n description: 'Get the minimum of multiple values',\n signature: 'min(value1, value2, ...)',\n returnType: 'number',\n examples: ['min(a, b, c) // smallest value'],\n },\n {\n name: 'max',\n description: 'Get the maximum of multiple values',\n signature: 'max(value1, value2, ...)',\n returnType: 'number',\n examples: ['max(a, b, c) // largest value'],\n },\n {\n name: 'log',\n description: 'Calculate the natural logarithm',\n signature: 'log(number)',\n returnType: 'number',\n examples: ['log(10) // 2.302...'],\n },\n {\n name: 'log10',\n description: 'Calculate the base-10 logarithm',\n signature: 'log10(number)',\n returnType: 'number',\n examples: ['log10(100) // 2'],\n },\n {\n name: 'exp',\n description: 'Calculate e raised to a power',\n signature: 'exp(number)',\n returnType: 'number',\n examples: ['exp(1) // 2.718...'],\n },\n {\n name: 'sign',\n description: 'Get the sign of a number (-1, 0, or 1)',\n signature: 'sign(number)',\n returnType: 'number',\n examples: ['sign(-5) // -1', 'sign(0) // 0', 'sign(5) // 1'],\n },\n {\n name: 'length',\n description: 'Get the length of a string or array',\n signature: 'length(value)',\n returnType: 'number',\n examples: ['length(name) // 5 from \"hello\"', 'length(items) // 3'],\n },\n ],\n boolean: [\n {\n name: 'and',\n description: 'Logical AND of two values',\n signature: 'and(a, b)',\n returnType: 'boolean',\n examples: ['and(isActive, hasPermission) // true if both true'],\n },\n {\n name: 'or',\n description: 'Logical OR of two values',\n signature: 'or(a, b)',\n returnType: 'boolean',\n examples: ['or(isAdmin, isOwner) // true if either true'],\n },\n {\n name: 'not',\n description: 'Logical NOT of a value',\n signature: 'not(value)',\n returnType: 'boolean',\n examples: ['not(isDeleted) // true if false'],\n },\n {\n name: 'contains',\n description: 'Check if a string contains a substring',\n signature: 'contains(text, search)',\n returnType: 'boolean',\n examples: ['contains(name, \"ell\") // true for \"hello\"'],\n },\n {\n name: 'startswith',\n description: 'Check if a string starts with a prefix',\n signature: 'startswith(text, prefix)',\n returnType: 'boolean',\n examples: ['startswith(name, \"hel\") // true for \"hello\"'],\n },\n {\n name: 'endswith',\n description: 'Check if a string ends with a suffix',\n signature: 'endswith(text, suffix)',\n returnType: 'boolean',\n examples: ['endswith(name, \"llo\") // true for \"hello\"'],\n },\n {\n name: 'isnull',\n description: 'Check if a value is null or undefined',\n signature: 'isnull(value)',\n returnType: 'boolean',\n examples: ['isnull(optionalField) // true if null/undefined'],\n },\n {\n name: 'includes',\n description: 'Check if an array contains a value',\n signature: 'includes(array, value)',\n returnType: 'boolean',\n examples: [\n 'includes(tags, \"featured\") // true if array contains value',\n ],\n },\n ],\n array: [\n {\n name: 'sum',\n description: 'Calculate the sum of array elements',\n signature: 'sum(array)',\n returnType: 'number',\n examples: ['sum(prices) // total of all prices'],\n },\n {\n name: 'avg',\n description: 'Calculate the average of array elements',\n signature: 'avg(array)',\n returnType: 'number',\n examples: ['avg(scores) // average score'],\n },\n {\n name: 'count',\n description: 'Get the number of elements in an array',\n signature: 'count(array)',\n returnType: 'number',\n examples: ['count(items) // number of items'],\n },\n {\n name: 'first',\n description: 'Get the first element of an array',\n signature: 'first(array)',\n returnType: 'any',\n examples: ['first(items) // first item'],\n },\n {\n name: 'last',\n description: 'Get the last element of an array',\n signature: 'last(array)',\n returnType: 'any',\n examples: ['last(items) // last item'],\n },\n ],\n conversion: [\n {\n name: 'tostring',\n description: 'Convert a value to string',\n signature: 'tostring(value)',\n returnType: 'string',\n examples: ['tostring(42) // \"42\"'],\n },\n {\n name: 'tonumber',\n description: 'Convert a value to number',\n signature: 'tonumber(value)',\n returnType: 'number',\n examples: ['tonumber(\"42\") // 42'],\n },\n {\n name: 'toboolean',\n description: 'Convert a value to boolean',\n signature: 'toboolean(value)',\n returnType: 'boolean',\n examples: ['toboolean(1) // true', 'toboolean(0) // false'],\n },\n ],\n conditional: [\n {\n name: 'if',\n description: 'Return one of two values based on a condition',\n signature: 'if(condition, valueIfTrue, valueIfFalse)',\n returnType: 'any',\n examples: [\n 'if(stock > 0, \"Available\", \"Out of Stock\")',\n 'if(price > 100, price * 0.9, price)',\n ],\n },\n {\n name: 'coalesce',\n description: 'Return the first non-null value',\n signature: 'coalesce(value1, value2, ...)',\n returnType: 'any',\n examples: ['coalesce(nickname, name, \"Anonymous\")'],\n },\n ],\n },\n\n features: [\n {\n name: 'simple_refs',\n description: 'Reference top-level fields by name',\n minVersion: '1.0',\n examples: ['price', 'quantity', 'baseDamage'],\n dependenciesExtracted: ['[\"price\"]', '[\"quantity\"]', '[\"baseDamage\"]'],\n },\n {\n name: 'arithmetic',\n description: 'Basic math operations (+, -, *, /)',\n minVersion: '1.0',\n examples: ['price * 1.1', 'a + b - c', 'quantity * price'],\n },\n {\n name: 'comparison',\n description: 'Compare values (>, <, >=, <=, ==, !=)',\n minVersion: '1.0',\n examples: ['price > 100', 'x == 10', 'quantity >= 5'],\n },\n {\n name: 'nested_path',\n description: 'Access nested object properties using dot notation',\n minVersion: '1.1',\n examples: ['stats.damage', 'user.profile.name', 'item.metadata.category'],\n dependenciesExtracted: ['[\"stats.damage\"]'],\n },\n {\n name: 'array_index',\n description:\n 'Access array elements by numeric index. Negative indices access from the end',\n minVersion: '1.1',\n examples: [\n 'items[0].price',\n 'inventory[1].quantity',\n 'items[-1].name // last element',\n 'items[-2].price // second to last',\n ],\n dependenciesExtracted: ['[\"items[0].price\"]', '[\"items[-1].name\"]'],\n },\n {\n name: 'root_path',\n description:\n 'Absolute path reference starting with /. Always resolves from root data, even inside array item formulas',\n minVersion: '1.1',\n examples: [\n '/taxRate',\n '/config.tax',\n 'price * (1 + /taxRate)',\n 'price * /config.multiplier',\n ],\n dependenciesExtracted: ['[\"/taxRate\"]', '[\"/config.tax\"]'],\n },\n {\n name: 'relative_path',\n description:\n 'Relative path reference starting with ../. Resolves from parent context (root data) when inside array item formulas',\n minVersion: '1.1',\n examples: [\n '../discount',\n '../settings.multiplier',\n 'price * (1 - ../discount)',\n 'price * ../settings.multiplier',\n ],\n dependenciesExtracted: ['[\"../discount\"]', '[\"../settings.multiplier\"]'],\n },\n {\n name: 'function_named_fields',\n description:\n 'Fields can have the same name as built-in functions (max, min, sum, etc.). Built-in functions are always checked first when a function call is made',\n minVersion: '1.0',\n examples: [\n 'max(max, 0)',\n 'min(min, 100)',\n 'max(max - field.min, 0)',\n 'round(round * 2)',\n ],\n },\n ],\n\n versionDetection: [\n { feature: 'Simple refs, arithmetic, comparisons', minVersion: '1.0' },\n { feature: 'Function-named fields (max(max, 0))', minVersion: '1.0' },\n { feature: 'Nested paths (a.b)', minVersion: '1.1' },\n { feature: 'Array index ([0], [-1])', minVersion: '1.1' },\n { feature: 'Absolute paths (/field)', minVersion: '1.1' },\n { feature: 'Relative paths (../field)', minVersion: '1.1' },\n ],\n\n parseResult: {\n description:\n 'The parser automatically detects the minimum required version',\n interface: `interface ParseResult {\n ast: ASTNode; // Abstract syntax tree\n dependencies: string[]; // List of field dependencies\n features: string[]; // List of detected features\n minVersion: string; // Minimum required version (\"1.0\" or \"1.1\")\n}`,\n },\n\n examples: [\n {\n expression: 'price * quantity',\n description: 'Calculate total from price and quantity',\n result: 'number',\n },\n {\n expression: 'firstName + \" \" + lastName',\n description: 'Concatenate strings with space',\n result: 'string',\n },\n {\n expression: 'quantity > 0',\n description: 'Check if in stock',\n result: 'boolean',\n },\n {\n expression: 'if(stock > 0, \"Available\", \"Out of Stock\")',\n description: 'Conditional text based on stock',\n result: 'string',\n },\n {\n expression: 'price * (1 + taxRate)',\n description: 'Price with tax',\n result: 'number',\n },\n {\n expression: 'items[0].price + items[1].price',\n description: 'Sum first two item prices (v1.1)',\n result: 'number',\n },\n ],\n\n apiExamples: [\n {\n name: 'Simple Expression (v1.0)',\n description: 'Parse a basic arithmetic expression',\n code: `parseExpression('price * 1.1')\n// {\n// minVersion: \"1.0\",\n// features: [],\n// dependencies: [\"price\"]\n// }`,\n },\n {\n name: 'Nested Path (v1.1)',\n description: 'Parse expression with nested object access',\n code: `parseExpression('stats.damage * multiplier')\n// {\n// minVersion: \"1.1\",\n// features: [\"nested_path\"],\n// dependencies: [\"stats.damage\", \"multiplier\"]\n// }`,\n },\n {\n name: 'Array Access (v1.1)',\n description: 'Parse expression with array index access',\n code: `parseExpression('items[0].price + items[1].price')\n// {\n// minVersion: \"1.1\",\n// features: [\"array_index\", \"nested_path\"],\n// dependencies: [\"items[0].price\", \"items[1].price\"]\n// }`,\n },\n {\n name: 'Evaluate expressions',\n description: 'Execute formulas with context data',\n code: `evaluate('price * 1.1', { price: 100 })\n// 110\n\nevaluate('stats.damage', { stats: { damage: 50 } })\n// 50\n\nevaluate('items[0].price', { items: [{ price: 10 }] })\n// 10\n\nevaluate('price > 100', { price: 150 })\n// true\n\nevaluate('a + b * c', { a: 1, b: 2, c: 3 })\n// 7`,\n },\n {\n name: 'Function-named fields',\n description: 'Fields can have the same name as built-in functions',\n code: `// Built-in functions take precedence in function calls\nevaluate('max(max, 0)', { max: 10 })\n// 10 (max() function, then max field)\n\nevaluate('max(max - field.min, 0)', { max: 100, field: { min: 20 } })\n// 80\n\nevaluate('round(round * 2)', { round: 3.7 })\n// 7\n\n// Field named \"sum\" doesn't conflict with sum() function\nevaluate('sum(values) + sum', { values: [1, 2, 3], sum: 10 })\n// 16`,\n },\n {\n name: 'Evaluate with context (array items)',\n description:\n 'Use evaluateWithContext() for array item formulas with path resolution',\n code: `// Absolute path: /field always resolves from root\nevaluateWithContext('price * (1 + /taxRate)', {\n rootData: { taxRate: 0.1, items: [{ price: 100 }] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 110\n\n// Nested absolute path\nevaluateWithContext('price * /config.multiplier', {\n rootData: { config: { multiplier: 1.5 }, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 150\n\n// Relative path: ../field resolves from parent (root)\nevaluateWithContext('price * (1 - ../discount)', {\n rootData: { discount: 0.2, items: [] },\n itemData: { price: 100 },\n currentPath: 'items[0]'\n})\n// 80\n\n// itemData takes precedence over rootData for same field\nevaluateWithContext('value + 10', {\n rootData: { value: 100 },\n itemData: { value: 50 },\n currentPath: 'items[0]'\n})\n// 60`,\n },\n ],\n\n schemaUsage: {\n structure:\n '{ \"x-formula\": { \"version\": 1, \"expression\": \"...\" }, \"readOnly\": true }',\n fieldTypes: ['string', 'number', 'boolean'],\n rules: [\n 'Add x-formula to string, number, or boolean field schema',\n 'readOnly: true is REQUIRED for fields with x-formula',\n 'Expression must reference existing fields in the same table',\n 'Circular dependencies are not allowed (a references b, b references a)',\n ],\n },\n};\n"]}