@revisium/formula 0.3.0 → 0.4.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":["../node_modules/subscript/src/parse.js","../node_modules/subscript/src/const.js","../node_modules/subscript/feature/number.js","../node_modules/subscript/feature/string.js","../node_modules/subscript/src/compile.js","../node_modules/subscript/feature/call.js","../node_modules/subscript/feature/access.js","../node_modules/subscript/feature/group.js","../node_modules/subscript/feature/assign.js","../node_modules/subscript/feature/mult.js","../node_modules/subscript/feature/add.js","../node_modules/subscript/feature/increment.js","../node_modules/subscript/feature/bitwise.js","../node_modules/subscript/feature/logic.js","../node_modules/subscript/feature/compare.js","../node_modules/subscript/feature/shift.js","../node_modules/subscript/subscript.js","../src/parser.ts","../src/parse-formula.ts","../src/validate-syntax.ts","../src/dependency-graph.ts","../src/extract-schema.ts","../src/validate-schema.ts"],"names":["err","last","token","prop","b","next","num"],"mappings":"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","file":"chunk-FDIJPOVQ.js","sourcesContent":["import { SPACE } from \"./const.js\"\n\n// current string, index and collected ids\nexport let idx, cur,\n\n // no handling tagged literals since easily done on user side with cache, if needed\n parse = s => (idx = 0, cur = s, s = expr(), cur[idx] ? err() : s || ''),\n\n // display error with context\n err = (msg = 'Unexpected token',\n lines = cur.slice(0, idx).split('\\n'),\n last = lines.pop(),\n before = cur.slice(Math.max(0, idx - 40), idx),\n after = cur.slice(idx, idx + 20)\n ) => {\n throw SyntaxError(`${msg} at ${lines.length + 1}:${last.length + 1} — ${before}^${after}`)\n },\n\n // advance until condition meets\n next = (is, from = idx, l) => {\n while (l = is(cur.charCodeAt(idx))) idx += l\n return cur.slice(from, idx)\n },\n\n // advance n characters\n skip = () => cur[idx++],\n\n // a + b - c\n expr = (prec = 0, end) => {\n let cc, token, newNode, fn\n\n // chunk/token parser\n while (\n (cc = space()) && // till not end\n // NOTE: when lookup bails on lower precedence, parent expr re-calls space() — acceptable overhead\n (newNode =\n ((fn = lookup[cc]) && fn(token, prec)) ?? // if operator with higher precedence isn't found\n (!token && next(parse.id)) // parse literal or quit. token seqs are forbidden: `a b`, `a \"b\"`, `1.32 a`\n )\n ) token = newNode;\n\n // check end character\n if (end) cc == end ? idx++ : err('Unclosed ' + String.fromCharCode(end - (end > 42 ? 2 : 1)))\n\n return token\n },\n\n // skip space chars, return first non-space character\n space = cc => { while ((cc = cur.charCodeAt(idx)) <= SPACE) idx++; return cc },\n\n // parse identifier (configurable)\n id = parse.id = c =>\n (c >= 48 && c <= 57) || // 0..9\n (c >= 65 && c <= 90) || // A...Z\n (c >= 97 && c <= 122) || // a...z\n c == 36 || c == 95 || // $, _,\n (c >= 192 && c != 215 && c != 247), // any non-ASCII\n\n // operator/token lookup table\n // lookup[0] is id parser to let configs redefine it\n lookup = [],\n\n\n // create operator checker/mapper (see examples)\n token = (\n op,\n prec = SPACE,\n map,\n c = op.charCodeAt(0),\n l = op.length,\n prev = lookup[c],\n word = op.toUpperCase() !== op // make sure word boundary comes after word operator\n ) => lookup[c] = (a, curPrec, curOp, from = idx) =>\n (\n (curOp ?\n op == curOp :\n ((l < 2 || cur.substr(idx, l) == op) && (curOp = op)) // save matched op to avoid mismatches like `|` as part of `||`\n ) &&\n curPrec < prec && // matches precedence AFTER operator matched\n !(word && parse.id(cur.charCodeAt(idx + l))) && // finished word, not part of bigger word\n (idx += l, map(a) || (idx = from, !prev && err())) // throw if operator didn't detect usage pattern: (a;^b) etc\n ) ||\n prev?.(a, curPrec, curOp),\n\n // right assoc is indicated by negative precedence (meaning go from right to left)\n binary = (op, prec, right = false) => token(op, prec, (a, b) => a && (b = expr(prec - (right ? .5 : 0))) && [op, a, b]),\n\n // post indicates postfix rather than prefix operator\n unary = (op, prec, post) => token(op, prec, a => post ? (a && [op, a]) : (!a && (a = expr(prec - .5)) && [op, a])),\n\n // NOTE: allows ;;; (valid empty statements) and ,,, (debatable but harmless)\n // right=true allows same-precedence tokens on RHS (like statements after semicolon)\n nary = (op, prec, right) => {\n token(op, prec,\n (a, b) => (\n b = expr(prec - (right ? .5 : 0)),\n (\n (a?.[0] !== op) && (a = [op, a || null]), // if beginning of sequence - init node\n b?.[0] === op ? a.push(...b.slice(1)) : a.push(b || null), // comments can return same-token expr\n a\n ))\n )\n },\n\n // register (a), [b], {c} etc groups\n group = (op, prec) => token(op[0], prec, a => (!a && [op, expr(0, op.charCodeAt(1))])),\n\n // register a(b), a[b], a<b> etc,\n // NOTE: we make sure `null` indicates placeholder\n access = (op, prec) => token(op[0], prec, a => (a && [op, a, expr(0, op.charCodeAt(1)) || null]))\n\n\nexport default parse\n","export const\n PERIOD = 46,\n OPAREN = 40,\n CPAREN = 41,\n OBRACK = 91,\n CBRACK = 93,\n OBRACE = 123,\n CBRACE = 125,\n SPACE = 32,\n COLON = 58,\n DQUOTE = 34,\n QUOTE = 39,\n _0 = 48,\n _9 = 57,\n _E = 69,\n _e = 101,\n BSLASH = 92,\n SLASH = 47,\n STAR = 42\n\n// ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_precedence\n// we mult by 10 to leave space for extensions\nexport const\n PREC_STATEMENT = 5,\n PREC_SEQ = 10,\n PREC_ASSIGN = 20,\n PREC_LOR = 30,\n PREC_LAND = 40,\n PREC_OR = 50,\n PREC_XOR = 60,\n PREC_AND = 70,\n PREC_EQ = 80,\n PREC_COMP = 90,\n PREC_SHIFT = 100,\n PREC_ADD = 110,\n PREC_MULT = 120,\n PREC_EXP = 130,\n PREC_PREFIX = 140,\n PREC_POSTFIX = 150,\n PREC_ACCESS = 170,\n PREC_GROUP = 180,\n PREC_TOKEN = 200\n\n// Block prototype chain attacks: constructor, prototype, __proto__, __defineGetter__, etc.\nexport const unsafe = k => k?.[0] === '_' && k[1] === '_' || k === 'constructor' || k === 'prototype'\n","import { lookup, next, err, skip } from \"../src/parse.js\"\nimport { cur, idx } from \"../src/parse.js\"\nimport { PERIOD, _0, _E, _e, _9 } from \"../src/const.js\"\n\n// Char codes for prefixes\nconst _b = 98, _B = 66, _o = 111, _O = 79, _x = 120, _X = 88\nconst _a = 97, _f = 102, _A = 65, _F = 70\n\n// parse decimal number (with optional exponent)\nconst num = (a, _) => [, (\n a = +next(c => (c === PERIOD) || (c >= _0 && c <= _9) || (c === _E || c === _e ? 2 : 0))\n) != a ? err() : a]\n\n// .1\nlookup[PERIOD] = a => !a && num()\n\n// 1-9 (non-zero starts decimal)\nfor (let i = _0 + 1; i <= _9; i++) lookup[i] = a => a ? err() : num()\n\n// 0 - check for prefix (0b, 0o, 0x) or plain decimal\nlookup[_0] = a => {\n if (a) return err()\n const nextChar = cur.charCodeAt(idx + 1)\n \n // Binary: 0b\n if (nextChar === _b || nextChar === _B) {\n skip(); skip() // consume '0b'\n const s = next(c => c === 48 || c === 49) // 0 or 1\n return [, parseInt(s, 2)]\n }\n // Octal: 0o\n if (nextChar === _o || nextChar === _O) {\n skip(); skip() // consume '0o'\n const s = next(c => c >= 48 && c <= 55) // 0-7\n return [, parseInt(s, 8)]\n }\n // Hex: 0x\n if (nextChar === _x || nextChar === _X) {\n skip(); skip() // consume '0x'\n const s = next(c => (c >= _0 && c <= _9) || (c >= _a && c <= _f) || (c >= _A && c <= _F))\n return [, parseInt(s, 16)]\n }\n \n return num()\n}\n","import { skip, err, next, cur, idx, lookup } from '../src/parse.js'\nimport { DQUOTE, QUOTE, BSLASH } from '../src/const.js'\n\nconst escape = { n: '\\n', r: '\\r', t: '\\t', b: '\\b', f: '\\f', v: '\\v' },\n string = q => (qc, prec, str = '') => {\n qc && err('Unexpected string') // must not follow another token\n skip()\n // while (c = cur.charCodeAt(idx), c - q) {\n // if (c === BSLASH) skip(), c = cur[idx], skip(), str += escape[c] || c\n // else str += cur[idx], skip()\n // }\n next(c => c - q && (c === BSLASH ? (str += escape[cur[idx+1]] || cur[idx+1], 2 ) : (str += cur[idx], 1)))\n skip() || err('Bad string')\n return [, str]\n }\n\n\n// \"' with /\nlookup[DQUOTE] = string(DQUOTE)\nlookup[QUOTE] = string(QUOTE)\n","import { err } from \"./parse.js\"\n\n// build optimized evaluator for the tree\nexport const compile = (node) => !Array.isArray(node) ? compile.id(node) : !node[0] ? () => node[1] : operators[node[0]].call(...node),\n // compile id getter\n id = compile.id = name => ctx => ctx?.[name],\n\n // registered operators\n operators = {},\n\n // register an operator\n operator = (op, fn, prev = operators[op]) => (operators[op] = (...args) => fn(...args) || prev?.(...args)),\n\n // takes node and returns evaluator depending on the case with passed params (container, path, ctx) =>\n prop = (a, fn, generic, obj, path) => (\n // (((x))) => x\n a[0] === '()' && a.length == 2 ? prop(a[1], fn, generic) :\n // (_, name, ctx) => ctx[path]\n typeof a === 'string' ? ctx => fn(ctx, a, ctx) :\n // (container, path, ctx) => container(ctx)[path]\n a[0] === '.' ? (obj = compile(a[1]), path = a[2], ctx => fn(obj(ctx), path, ctx)) :\n // (container, path, ctx) => container(ctx)[path(ctx)]\n a[0] === '[]' && a.length === 3 ? (obj = compile(a[1]), path = compile(a[2]), ctx => fn(obj(ctx), path(ctx), ctx)) :\n // (src, _, ctx) => src(ctx)\n generic ? (a = compile(a), ctx => fn([a(ctx)], 0, ctx)) : () => err('Bad left value')\n )\n\nexport default compile\n","import { access } from '../src/parse.js'\nimport { operator, compile, prop } from '../src/compile.js'\nimport { PREC_ACCESS } from '../src/const.js'\n\n// a(b,c,d), a()\naccess('()', PREC_ACCESS)\noperator('()', (a, b, args) => b !== undefined && (\n args = !b ? () => [] : // a()\n b[0] === ',' ? (b = b.slice(1).map(b => !b ? err() : compile(b)), ctx => b.map(arg => arg(ctx))) : // a(b,c)\n (b = compile(b), ctx => [b(ctx)]), // a(b)\n\n // a(...args), a.b(...args), a[b](...args)\n prop(a, (obj, path, ctx) => obj[path](...args(ctx)), true)\n)\n)\n","import { access, binary, group, err } from '../src/parse.js'\nimport { operator, compile } from '../src/compile.js'\nimport { PREC_ACCESS, unsafe } from '../src/const.js'\n\n// a[b]\naccess('[]', PREC_ACCESS)\noperator('[]', (a, b) => !b ? err() : (a = compile(a), b = compile(b), ctx => { const k = b(ctx); return unsafe(k) ? undefined : a(ctx)[k] }))\n\n// a.b\nbinary('.', PREC_ACCESS)\noperator('.', (a, b) => (a = compile(a), b = !b[0] ? b[1] : b, unsafe(b) ? () => undefined : ctx => a(ctx)[b]))\n","import { err, nary, group } from '../src/parse.js'\nimport { compile, operator } from '../src/compile.js'\nimport { PREC_ACCESS, PREC_GROUP, PREC_SEQ, PREC_STATEMENT } from '../src/const.js'\n\n// (a,b,c), (a) — uses PREC_ACCESS to avoid conflict with ?.\ngroup('()', PREC_ACCESS)\noperator('()', (a, b) => b === undefined && (!a && err('Empty ()'), compile(a)))\n\nconst last = (...args) => (args = args.map(compile), ctx => args.map(arg => arg(ctx)).pop())\nnary(',', PREC_SEQ), operator(',', last)\nnary(';', PREC_STATEMENT, true), operator(';', last)\n","import { binary, err } from \"../src/parse.js\";\nimport { compile, operator, operators, prop } from \"../src/compile.js\";\nimport { PREC_ASSIGN } from \"../src/const.js\";\n\n// assignments\nbinary('=', PREC_ASSIGN, true)\noperator('=', (a, b) => (\n b = compile(b),\n // a = x, ((a)) = x, a.b = x, a['b'] = x\n prop(a, (container, path, ctx) => container[path] = b(ctx))\n))\n","import { binary } from '../src/parse.js'\nimport { operator, compile, prop } from '../src/compile.js'\nimport { PREC_MULT, PREC_ASSIGN } from '../src/const.js'\n\nbinary('*', PREC_MULT), operator('*', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) * b(ctx)))\nbinary('/', PREC_MULT), operator('/', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) / b(ctx)))\nbinary('%', PREC_MULT), operator('%', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) % b(ctx)))\n\nbinary('*=', PREC_ASSIGN, true)\noperator('*=', (a, b) => (\n b = compile(b),\n prop(a, (container, path, ctx) => container[path] *= b(ctx))\n))\n\nbinary('/=', PREC_ASSIGN, true)\noperator('/=', (a, b) => (\n b = compile(b),\n prop(a, (container, path, ctx) => container[path] /= b(ctx))\n))\n\nbinary('%=', PREC_ASSIGN, true)\noperator('%=', (a, b) => (\n b = compile(b),\n prop(a, (container, path, ctx) => container[path] %= b(ctx))\n))\n","\nimport { binary, unary } from '../src/parse.js'\nimport { PREC_ADD, PREC_PREFIX, PREC_ASSIGN } from '../src/const.js'\nimport { compile, prop, operator } from '../src/compile.js'\n\nbinary('+', PREC_ADD), operator('+', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) + b(ctx)))\nbinary('-', PREC_ADD), operator('-', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) - b(ctx)))\n\nunary('+', PREC_PREFIX), operator('+', (a, b) => !b && (a = compile(a), ctx => +a(ctx)))\nunary('-', PREC_PREFIX), operator('-', (a, b) => !b && (a = compile(a), ctx => -a(ctx)))\n\nbinary('+=', PREC_ASSIGN, true)\noperator('+=', (a, b) => (\n b = compile(b),\n prop(a, (container, path, ctx) => container[path] += b(ctx))\n))\n\nbinary('-=', PREC_ASSIGN, true)\noperator('-=', (a, b) => (\n b = compile(b),\n prop(a, (container, path, ctx) => (container[path] -= b(ctx)))\n))\n","import { token, expr } from \"../src/parse.js\"\nimport { operator, compile, prop } from \"../src/compile.js\"\nimport { PREC_POSTFIX } from \"../src/const.js\"\n\ntoken('++', PREC_POSTFIX, a => a ? ['++', a, null,] : ['++', expr(PREC_POSTFIX - 1)])\n// ++a, ++((a)), ++a.b, ++a[b]\noperator('++', (a,b) => prop(a, b === null ? (obj, path) => obj[path]++ : (obj, path) => ++obj[path]))\n\ntoken('--', PREC_POSTFIX, a => a ? ['--', a, null,] : ['--', expr(PREC_POSTFIX - 1)])\n// --a, --a.b, --a[b]\noperator('--', (a, b) => prop(a, b === null ? (obj, path) => obj[path]-- : (obj, path) => --obj[path]))\n","import { PREC_OR, PREC_AND, PREC_SHIFT, PREC_XOR, PREC_PREFIX } from \"../src/const.js\"\nimport { unary, binary } from \"../src/parse.js\"\nimport { operator, compile } from \"../src/compile.js\"\n\nunary('~', PREC_PREFIX), operator('~', (a, b) => !b && (a = compile(a), ctx => ~a(ctx)))\n\nbinary('|', PREC_OR), operator('|', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) | b(ctx)))\n\nbinary('&', PREC_AND), operator('&', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) & b(ctx)))\n\nbinary('^', PREC_XOR), operator('^', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) ^ b(ctx)))\n","import { PREC_LOR, PREC_LAND, PREC_PREFIX, PREC_ASSIGN } from '../src/const.js';\nimport { unary, binary } from \"../src/parse.js\"\nimport { operator, compile } from \"../src/compile.js\"\n\nunary('!', PREC_PREFIX), operator('!', (a, b) => !b && (a = compile(a), ctx => !a(ctx)))\n\nbinary('||', PREC_LOR)\noperator('||', (a, b) => (a = compile(a), b = compile(b), ctx => a(ctx) || b(ctx)))\n\nbinary('&&', PREC_LAND)\noperator('&&', (a, b) => (a = compile(a), b = compile(b), ctx => a(ctx) && b(ctx)))\n","import { PREC_EQ, PREC_COMP } from '../src/const.js'\nimport { unary, binary } from \"../src/parse.js\"\nimport { operator, compile } from \"../src/compile.js\"\n\n\nbinary('==', PREC_EQ), operator('==', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) == b(ctx)))\nbinary('!=', PREC_EQ), operator('!=', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) != b(ctx)))\nbinary('>', PREC_COMP), operator('>', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) > b(ctx)))\nbinary('<', PREC_COMP), operator('<', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) < b(ctx)))\nbinary('>=', PREC_COMP), operator('>=', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) >= b(ctx)))\nbinary('<=', PREC_COMP), operator('<=', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) <= b(ctx)))\n","import { PREC_OR, PREC_AND, PREC_SHIFT, PREC_XOR, PREC_PREFIX, PREC_ASSIGN } from \"../src/const.js\"\nimport { unary, binary } from \"../src/parse.js\"\nimport { operator, compile } from \"../src/compile.js\"\n\n\nbinary('>>', PREC_SHIFT), operator('>>', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) >> b(ctx)))\nbinary('<<', PREC_SHIFT), operator('<<', (a, b) => b && (a = compile(a), b = compile(b), ctx => a(ctx) << b(ctx)))\n\nbinary('>>=', PREC_ASSIGN, true)\noperator('>>=', (a, b) => (b = compile(b), prop(a, (obj, path, ctx) => (obj[path] >>= b(ctx)))))\nbinary('<<=', PREC_ASSIGN, true)\noperator('<<=', (a, b) => (b = compile(b), prop(a, (obj, path, ctx) => (obj[path] <<= b(ctx)))))\n","/**\n * Subscript dialect includes common operators / primitives for all languages\n */\nimport './feature/number.js'\nimport './feature/string.js'\nimport './feature/call.js'\nimport './feature/access.js'\nimport './feature/group.js'\nimport './feature/assign.js'\nimport './feature/mult.js'\nimport './feature/add.js'\nimport './feature/increment.js'\nimport './feature/bitwise.js'\nimport './feature/logic.js'\nimport './feature/compare.js'\nimport './feature/shift.js'\nimport compile from './src/compile.js'\nimport parse from './src/parse.js'\n\nexport { parse, access, binary, unary, nary, group, token } from './src/parse.js'\nexport { compile, operator } from './src/compile.js'\nexport { stringify } from './src/stringify.js'\n\nexport default s => compile(parse(s))\n","import subscript, { parse, token, operator, compile } from 'subscript';\nimport type { Node as SubscriptNode } from 'subscript/src/compile.js';\nimport { FormulaFeature, FormulaMinorVersion } from './types';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore - subscript internal module\nimport * as parseModule from 'subscript/src/parse.js';\n\ntype ASTNodeInternal = SubscriptNode;\n\nconst { next } = parseModule as { next: (fn: (c: number) => number) => string };\n\n// Helper for identifier chars - returns 1 if valid, 0 otherwise\nconst isIdChar = (c: number): number =>\n (c >= 97 && c <= 122) || // a-z\n (c >= 65 && c <= 90) || // A-Z\n (c >= 48 && c <= 57) || // 0-9\n c === 95 // _\n ? 1\n : 0;\n\n// Register @ for context tokens (@prev, @next, @current)\ntoken('@', 200, (a: unknown) => {\n if (a) return; // must not follow another token\n const name = next(isIdChar);\n if (!name) return;\n return '@' + name;\n});\n\n// Register # for position tokens (#index, #first, #last, #length)\ntoken('#', 200, (a: unknown) => {\n if (a) return;\n const name = next(isIdChar);\n if (!name) return;\n return '#' + name;\n});\n\n// Create sparse array literal for wildcard: [, '*'] means literal value '*'\nconst createWildcardLiteral = (): unknown[] => {\n const arr: unknown[] = [];\n arr[1] = '*';\n return arr;\n};\n\n// Register * as wildcard when standalone (inside [])\ntoken('*', 200, (a: unknown) => {\n if (!a) return createWildcardLiteral();\n return undefined;\n});\n\n// Register / for absolute paths (/field, /nested.field)\ntoken('/', 200, (a: unknown) => {\n if (a) return; // must not follow another token (avoid division)\n const name = next(isIdChar);\n if (!name) return;\n return '/' + name;\n});\n\n// Helper for relative path chars - extends isIdChar with / and .\nconst isRelativePathChar = (c: number): number =>\n isIdChar(c) || c === 47 || c === 46 ? 1 : 0; // 47 = /, 46 = .\n\n// Register .. for relative paths (../field, ../../field)\ntoken('.', 200, (a: unknown) => {\n if (a) return; // must not follow another token\n // Check if this is .. (double dot for relative path)\n const second = next((c: number) => (c === 46 ? 1 : 0)); // 46 = .\n if (!second) return; // single dot - let normal parsing handle it\n // Now we have .. - read the rest of the relative path\n const rest = next(isRelativePathChar);\n if (!rest) return; // just .. without path - invalid\n return '..' + rest;\n});\n\n// Built-in functions - defined early for operator registration\nconst BUILTIN_FUNCTIONS: Record<string, (...args: unknown[]) => unknown> = {\n and: (a: unknown, b: unknown) => Boolean(a) && Boolean(b),\n or: (a: unknown, b: unknown) => Boolean(a) || Boolean(b),\n not: (a: unknown) => !a,\n concat: (...args: unknown[]) => args.map(String).join(''),\n upper: (s: unknown) => String(s).toUpperCase(),\n lower: (s: unknown) => String(s).toLowerCase(),\n trim: (s: unknown) => String(s).trim(),\n left: (s: unknown, n: unknown) => {\n const count = Math.max(0, Math.floor(Number(n)));\n return String(s).slice(0, count);\n },\n right: (s: unknown, n: unknown) => {\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: unknown, search: unknown, replacement: unknown) =>\n String(s).replace(String(search), String(replacement)),\n tostring: String,\n length: (s: unknown) => {\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: unknown, search: unknown) => String(s).includes(String(search)),\n startswith: (s: unknown, search: unknown) =>\n String(s).startsWith(String(search)),\n endswith: (s: unknown, search: unknown) => String(s).endsWith(String(search)),\n tonumber: Number,\n toboolean: Boolean,\n isnull: (v: unknown) => v === null || v === undefined,\n coalesce: (...args: unknown[]) =>\n args.find((v) => v !== null && v !== undefined) ?? null,\n round: (n: unknown, decimals?: unknown) => {\n const num = Number(n);\n const dec = decimals === undefined ? 0 : Number(decimals);\n const factor = 10 ** dec;\n return Math.round(num * factor) / factor;\n },\n floor: (n: unknown) => Math.floor(Number(n)),\n ceil: (n: unknown) => Math.ceil(Number(n)),\n abs: (n: unknown) => Math.abs(Number(n)),\n sqrt: (n: unknown) => Math.sqrt(Number(n)),\n pow: (base: unknown, exp: unknown) => Math.pow(Number(base), Number(exp)),\n min: (...args: unknown[]) =>\n args.length === 0 ? Number.NaN : Math.min(...args.map(Number)),\n max: (...args: unknown[]) =>\n args.length === 0 ? Number.NaN : Math.max(...args.map(Number)),\n log: (n: unknown) => Math.log(Number(n)),\n log10: (n: unknown) => Math.log10(Number(n)),\n exp: (n: unknown) => Math.exp(Number(n)),\n sign: (n: unknown) => Math.sign(Number(n)),\n sum: (arr: unknown) =>\n Array.isArray(arr) ? arr.reduce((a: number, b) => a + Number(b), 0) : 0,\n avg: (arr: unknown) =>\n Array.isArray(arr) && arr.length > 0\n ? arr.reduce((a: number, b) => a + Number(b), 0) / arr.length\n : 0,\n count: (arr: unknown) => (Array.isArray(arr) ? arr.length : 0),\n first: (arr: unknown): unknown =>\n Array.isArray(arr) ? (arr[0] as unknown) : undefined,\n last: (arr: unknown): unknown =>\n Array.isArray(arr) ? (arr.at(-1) as unknown) : undefined,\n join: (arr: unknown, separator?: unknown) => {\n if (!Array.isArray(arr)) return '';\n if (separator === undefined) return arr.join(',');\n if (typeof separator === 'string') return arr.join(separator);\n if (typeof separator === 'number') return arr.join(String(separator));\n return arr.join(',');\n },\n includes: (arr: unknown, value: unknown) =>\n Array.isArray(arr) ? arr.includes(value) : false,\n if: (condition: unknown, ifTrue: unknown, ifFalse: unknown) =>\n condition ? ifTrue : ifFalse,\n};\n\n// Helper to extract arguments from AST node\nfunction extractCallArgs(argsNode: ASTNodeInternal): ASTNodeInternal[] {\n if (!argsNode) return [];\n if (!Array.isArray(argsNode)) return [argsNode];\n if (argsNode[0] === ',') {\n return argsNode.slice(1) as ASTNodeInternal[];\n }\n return [argsNode];\n}\n\ntype CompiledFn = (ctx: Record<string, unknown>) => unknown;\n\nfunction compileNode(node: ASTNodeInternal): CompiledFn {\n return compile(node) as CompiledFn;\n}\n\nfunction createGroupingEvaluator(fn: ASTNodeInternal): CompiledFn {\n const compiledExpr = compileNode(fn);\n return (ctx: Record<string, unknown>): unknown => compiledExpr(ctx);\n}\n\nfunction createFunctionCallEvaluator(\n fn: ASTNodeInternal,\n argsNode: ASTNodeInternal,\n): CompiledFn {\n const args = extractCallArgs(argsNode);\n const compiledArgs = args.map((arg) => compileNode(arg));\n\n return (ctx: Record<string, unknown>): unknown => {\n const argValues = compiledArgs.map((a) => a(ctx));\n\n if (typeof fn === 'string') {\n const builtinFn = BUILTIN_FUNCTIONS[fn.toLowerCase()];\n if (builtinFn) {\n return builtinFn(...argValues);\n }\n }\n\n const fnValue = compileNode(fn)(ctx);\n if (typeof fnValue === 'function') {\n return (fnValue as (...args: unknown[]) => unknown)(...argValues);\n }\n\n const fnName = typeof fn === 'string' ? fn : String(fn);\n throw new Error(`'${fnName}' is not a function`);\n };\n}\n\n// Override function call operator to use builtin functions namespace\n// This allows fields to have same names as functions (e.g., max, min, round)\n// Note: () operator handles both grouping (a + b) and function calls fn(a, b)\n// - Grouping: [\"()\", expr] - one argument, just evaluate it\n// - Function call: [\"()\", fn, args] - two arguments, call function\noperator('()', (fn: ASTNodeInternal, argsNode?: ASTNodeInternal) => {\n if (argsNode === undefined) {\n return createGroupingEvaluator(fn);\n }\n return createFunctionCallEvaluator(fn, argsNode);\n});\n\nexport type ASTNode = string | number | boolean | null | [string, ...ASTNode[]];\n\nconst KEYWORDS = new Set([\n 'true',\n 'false',\n 'null',\n 'and',\n 'or',\n 'not',\n 'if',\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 'concat',\n 'upper',\n 'lower',\n 'length',\n 'trim',\n 'left',\n 'right',\n 'replace',\n 'contains',\n 'startswith',\n 'endswith',\n 'tostring',\n 'tonumber',\n 'toboolean',\n 'isnull',\n 'coalesce',\n 'sum',\n 'avg',\n 'count',\n 'first',\n 'last',\n 'join',\n 'includes',\n]);\n\nconst ARRAY_FUNCTIONS = new Set([\n 'sum',\n 'avg',\n 'count',\n 'first',\n 'last',\n 'join',\n 'includes',\n]);\n\nexport interface ParseResult {\n ast: ASTNode;\n dependencies: string[];\n features: FormulaFeature[];\n minVersion: FormulaMinorVersion;\n}\n\nfunction isKeyword(name: string): boolean {\n return KEYWORDS.has(name.toLowerCase());\n}\n\nfunction isArrayFunction(name: string): boolean {\n return ARRAY_FUNCTIONS.has(name.toLowerCase());\n}\n\nfunction isContextToken(name: string): boolean {\n return name.startsWith('@') || name.startsWith('#');\n}\n\nfunction isRootPath(name: string): boolean {\n return name.startsWith('/');\n}\n\nfunction isRelativePath(name: string): boolean {\n return name.startsWith('..');\n}\n\nfunction isValidIdentifierRoot(rootName: string): boolean {\n return !isKeyword(rootName) && !isContextToken(rootName);\n}\n\nfunction extractRootName(path: string): string {\n return path.split('.')[0]?.split('[')[0] ?? '';\n}\n\nfunction addPathIfValid(path: string | null, identifiers: Set<string>): void {\n if (path && isValidIdentifierRoot(extractRootName(path))) {\n identifiers.add(path);\n }\n}\n\nfunction collectStringIdentifier(node: string, identifiers: Set<string>): void {\n if (isRootPath(node) || isRelativePath(node)) {\n identifiers.add(node);\n return;\n }\n if (!isContextToken(node) && !isKeyword(node)) {\n identifiers.add(node);\n }\n}\n\nfunction collectFunctionCallIdentifiers(\n args: ASTNode[],\n identifiers: Set<string>,\n): void {\n for (let i = 1; i < args.length; i++) {\n collectIdentifiers(args[i] as ASTNode, identifiers);\n }\n const funcName = args[0];\n if (typeof funcName !== 'string') {\n collectIdentifiers(funcName as ASTNode, identifiers);\n }\n}\n\nfunction collectPathOrFallback(node: ASTNode, identifiers: Set<string>): void {\n const path = buildDotPath(node);\n if (path) {\n addPathIfValid(path, identifiers);\n } else {\n const [, ...args] = node as [string, ...ASTNode[]];\n for (const arg of args) {\n collectIdentifiers(arg, identifiers);\n }\n }\n}\n\nfunction collectIdentifiers(node: ASTNode, identifiers: Set<string>): void {\n if (typeof node === 'string') {\n collectStringIdentifier(node, identifiers);\n return;\n }\n\n if (!Array.isArray(node)) {\n return;\n }\n\n if (isLiteralArray(node)) {\n return;\n }\n\n const [op, ...args] = node;\n\n if (op === '.' || op === '[]') {\n collectPathOrFallback(node, identifiers);\n return;\n }\n\n if (op === '()') {\n collectFunctionCallIdentifiers(args, identifiers);\n return;\n }\n\n for (const arg of args) {\n collectIdentifiers(arg, identifiers);\n }\n}\n\nfunction isLiteralArray(arr: unknown[]): boolean {\n return !(0 in arr);\n}\n\nfunction buildPropertyAccessPath(left: ASTNode, right: ASTNode): string | null {\n const leftPath = buildDotPath(left);\n const rightPath = typeof right === 'string' ? right : null;\n if (leftPath && rightPath) {\n return `${leftPath}.${rightPath}`;\n }\n return null;\n}\n\nfunction getNegativeIndexValue(index: unknown): number | null {\n if (!Array.isArray(index) || index[0] !== '-' || index.length !== 2) {\n return null;\n }\n const inner: unknown = index[1];\n if (\n Array.isArray(inner) &&\n isLiteralArray(inner) &&\n typeof inner[1] === 'number'\n ) {\n return -inner[1];\n }\n return null;\n}\n\nfunction buildArrayAccessPath(left: ASTNode, right: ASTNode): string | null {\n const leftPath = buildDotPath(left);\n if (!leftPath) {\n return null;\n }\n\n if (Array.isArray(right) && isLiteralArray(right)) {\n if (right[1] === '*') {\n return `${leftPath}[*]`;\n }\n if (typeof right[1] === 'number') {\n return `${leftPath}[${right[1]}]`;\n }\n }\n\n const negativeIndex = getNegativeIndexValue(right);\n if (negativeIndex !== null) {\n return `${leftPath}[${negativeIndex}]`;\n }\n\n const rightPath = buildDotPath(right);\n if (rightPath) {\n return `${leftPath}[${rightPath}]`;\n }\n return null;\n}\n\nfunction buildDotPath(node: ASTNode): string | null {\n if (typeof node === 'string') {\n return node;\n }\n\n if (!Array.isArray(node) || isLiteralArray(node)) {\n return null;\n }\n\n const [op, left, right] = node;\n\n if (op === '.') {\n return buildPropertyAccessPath(left as ASTNode, right as ASTNode);\n }\n\n if (op === '[]') {\n return buildArrayAccessPath(left as ASTNode, right as ASTNode);\n }\n\n return null;\n}\n\nfunction isNegativeIndexLiteral(index: unknown): boolean {\n if (!Array.isArray(index) || index[0] !== '-' || index.length !== 2) {\n return false;\n }\n const inner: unknown = index[1];\n return (\n Array.isArray(inner) &&\n isLiteralArray(inner) &&\n typeof inner[1] === 'number'\n );\n}\n\nfunction detectArrayAccessFeatures(\n index: ASTNode,\n features: Set<FormulaFeature>,\n): void {\n if (Array.isArray(index) && isLiteralArray(index)) {\n if (index[1] === '*') {\n features.add('array_wildcard');\n } else if (typeof index[1] === 'number') {\n features.add('array_index');\n }\n }\n if (isNegativeIndexLiteral(index)) {\n features.add('array_index');\n }\n}\n\nfunction detectFunctionCallFeatures(\n funcName: ASTNode,\n features: Set<FormulaFeature>,\n): void {\n if (typeof funcName === 'string' && isArrayFunction(funcName)) {\n features.add('array_function');\n }\n}\n\nfunction detectStringFeatures(\n node: string,\n features: Set<FormulaFeature>,\n): void {\n if (isContextToken(node)) {\n features.add('context_token');\n }\n if (isRootPath(node)) {\n features.add('root_path');\n if (node.includes('.')) {\n features.add('nested_path');\n }\n }\n if (isRelativePath(node)) {\n features.add('relative_path');\n const withoutPrefix = node.replace(/^(\\.\\.\\/)+/, '');\n if (withoutPrefix.includes('.')) {\n features.add('nested_path');\n }\n }\n}\n\nfunction detectOperatorFeatures(\n node: [string, ...ASTNode[]],\n features: Set<FormulaFeature>,\n): void {\n const op = node[0];\n\n if (op === '.') {\n features.add('nested_path');\n }\n if (op === '[]') {\n detectArrayAccessFeatures(node[2] as ASTNode, features);\n }\n if (op === '()') {\n detectFunctionCallFeatures(node[1] as ASTNode, features);\n }\n}\n\nfunction detectFeatures(node: ASTNode, features: Set<FormulaFeature>): void {\n if (typeof node === 'string') {\n detectStringFeatures(node, features);\n return;\n }\n\n if (!Array.isArray(node) || isLiteralArray(node)) {\n return;\n }\n\n detectOperatorFeatures(node as [string, ...ASTNode[]], features);\n\n for (let i = 1; i < node.length; i++) {\n detectFeatures(node[i] as ASTNode, features);\n }\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 ast = parse(trimmed) as ASTNode;\n\n const identifiers = new Set<string>();\n collectIdentifiers(ast, identifiers);\n\n const featuresSet = new Set<FormulaFeature>();\n detectFeatures(ast, featuresSet);\n\n const features = Array.from(featuresSet);\n const minVersion: FormulaMinorVersion = features.length > 0 ? '1.1' : '1.0';\n\n return {\n ast,\n dependencies: Array.from(identifiers),\n features,\n minVersion,\n };\n}\n\nexport function validateSyntax(\n expression: string,\n): { isValid: true } | { isValid: false; error: string; position?: number } {\n const trimmed = expression.trim();\n\n if (!trimmed) {\n return { isValid: false, error: 'Empty expression' };\n }\n\n try {\n parse(trimmed);\n\n return { isValid: true };\n } catch (e) {\n const error = e as Error;\n const match = /at (\\d+):(\\d+)/.exec(error.message);\n const position = match\n ? Number.parseInt(match[2] ?? '0', 10) - 1\n : undefined;\n return {\n isValid: false,\n error: error.message,\n position,\n };\n }\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 const fn = subscript(trimmed);\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 return fn(safeContext);\n}\n\n/**\n * Options for evaluateWithContext\n */\nexport interface EvaluateContextOptions {\n /** Root document data - used for absolute paths (/field) */\n rootData: Record<string, unknown>;\n /** Current item data - merged with rootData, takes precedence */\n itemData?: Record<string, unknown>;\n /** Current path in document (e.g. 'items[0]') - used for relative paths (../field) */\n currentPath?: string;\n}\n\n/**\n * Get value by dot-separated path from object\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\n/**\n * Build path references for absolute and relative paths.\n *\n * Subscript parses paths differently based on nesting:\n * - \"/config.tax\" → [\".\", \"/config\", \"tax\"] - property access with /config as root\n * - \"../settings.multiplier\" → \"../settings.multiplier\" as single string token\n *\n * So for \"/\" paths we add the root field as object (e.g., \"/config\" → rootData.config)\n * For \"../\" paths we add the full resolved value (e.g., \"../settings.multiplier\" → rootData.settings.multiplier)\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 // Absolute path: /field or /nested.field\n // Subscript parses as property access: [\".\", \"/field\", \"nested\"]\n // So we need to add \"/field\" → rootData.field as object\n const fieldPath = dep.slice(1);\n const rootField = fieldPath.split('.')[0] ?? fieldPath;\n const contextKey = '/' + rootField;\n if (!(contextKey in refs)) {\n refs[contextKey] = getValueByPath(rootData, rootField);\n }\n } else if (dep.startsWith('../')) {\n // Relative path: ../field or ../nested.field\n // Subscript parses as single string token: \"../nested.field\"\n // So we add the full path as key with resolved value\n const fieldPath = dep.slice(3);\n refs[dep] = getValueByPath(rootData, fieldPath);\n }\n }\n\n return refs;\n}\n\n/**\n * Evaluate formula with context - resolves absolute and relative paths automatically.\n *\n * @param expression - Formula expression string\n * @param options - Evaluation context options\n * @returns Evaluated result\n *\n * @example\n * // Simple evaluation at root level\n * evaluateWithContext('price * quantity', {\n * rootData: { price: 100, quantity: 2 }\n * });\n * // → 200\n *\n * @example\n * // Evaluation in array item with absolute path\n * evaluateWithContext('price * (1 + /taxRate)', {\n * rootData: { taxRate: 0.1, items: [...] },\n * itemData: { price: 100 },\n * currentPath: 'items[0]'\n * });\n * // → 110\n *\n * @example\n * // Evaluation with relative path\n * evaluateWithContext('price * (1 - ../discount)', {\n * rootData: { discount: 0.2, items: [...] },\n * itemData: { price: 100 },\n * currentPath: 'items[0]'\n * });\n * // → 80\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 // Parse to get dependencies\n const parsed = parseFormula(trimmed);\n\n // Build path references for / and ../ paths\n const pathRefs = buildPathReferences(rootData, parsed.dependencies);\n\n // Build final context\n const context: Record<string, unknown> = {\n ...rootData,\n ...(itemData ?? {}),\n ...pathRefs,\n };\n\n return evaluate(trimmed, context);\n}\n\n/**\n * Inferred type of a formula expression\n */\nexport type InferredType = 'number' | 'boolean' | 'string' | 'unknown';\n\n/**\n * Schema field types for type inference\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 inferPrimitiveType(\n node: ASTNode,\n fieldTypes: FieldTypes,\n): InferredType | null {\n if (typeof node === 'number') return 'number';\n if (typeof node === 'boolean') return 'boolean';\n if (typeof node === 'string') return getFieldType(node, fieldTypes);\n if (node === null) return 'unknown';\n return null;\n}\n\nfunction inferLiteralArrayType(node: unknown[]): InferredType {\n const val = node[1];\n if (typeof val === 'number') return 'number';\n if (typeof val === 'string') return 'string';\n if (typeof val === 'boolean') return 'boolean';\n return 'unknown';\n}\n\nfunction inferOperatorType(\n op: string,\n argsLength: number,\n argTypes?: InferredType[],\n): InferredType | null {\n if (op === '+' && argTypes) {\n if (argTypes.includes('string')) return 'string';\n if (argTypes.includes('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 if (op === '-' && argsLength === 1) return 'number';\n return null;\n}\n\nfunction inferPropertyAccessType(\n node: ASTNode,\n fieldTypes: FieldTypes,\n): InferredType {\n const path = buildDotPath(node);\n return path ? getFieldType(path, fieldTypes) : 'unknown';\n}\n\nfunction inferFunctionCallType(funcName: ASTNode): InferredType {\n if (typeof funcName !== 'string') return 'unknown';\n const lowerName = funcName.toLowerCase();\n if (NUMERIC_FUNCTIONS.has(lowerName)) return 'number';\n if (STRING_FUNCTIONS.has(lowerName)) return 'string';\n if (BOOLEAN_FUNCTIONS.has(lowerName)) return 'boolean';\n return 'unknown';\n}\n\nfunction inferTypeFromNode(\n node: ASTNode,\n fieldTypes: FieldTypes,\n): InferredType {\n const primitiveType = inferPrimitiveType(node, fieldTypes);\n if (primitiveType !== null) return primitiveType;\n\n if (!Array.isArray(node)) return 'unknown';\n if (isLiteralArray(node)) return inferLiteralArrayType(node);\n\n const [op, ...args] = node;\n\n const argTypes =\n op === '+'\n ? args.map((arg) => inferTypeFromNode(arg, fieldTypes))\n : undefined;\n const operatorType = inferOperatorType(op, args.length, argTypes);\n if (operatorType !== null) return operatorType;\n\n if (op === '.' || op === '[]') {\n return inferPropertyAccessType(node, fieldTypes);\n }\n\n if (op === '()') {\n return inferFunctionCallType(args[0] as ASTNode);\n }\n\n return 'unknown';\n}\n\n/**\n * Infer the return type of a formula expression\n *\n * @param expression - Formula expression string\n * @param fieldTypes - Map of field names to their types from schema\n * @returns Inferred type of the expression result\n *\n * @example\n * inferFormulaType('price * quantity', { price: 'number', quantity: 'number' })\n * // 'number'\n *\n * inferFormulaType('price > 100', { price: 'number' })\n * // 'boolean'\n *\n * inferFormulaType('name', { name: 'string' })\n * // 'string'\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 = parse(trimmed) as ASTNode;\n return inferTypeFromNode(ast, fieldTypes);\n } catch {\n return 'unknown';\n }\n}\n\nexport { parse, compile } from 'subscript';\n","import { FormulaFeature, FormulaMinorVersion } from './types';\nimport { parseFormula } from './parser';\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 './parser';\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","export interface DependencyGraph {\n nodes: Set<string>;\n edges: Map<string, Set<string>>;\n}\n\nexport interface CircularDependencyResult {\n hasCircular: boolean;\n cycle: string[] | null;\n}\n\nexport interface TopologicalOrderResult {\n success: boolean;\n order: string[];\n error?: string;\n}\n\n/**\n * Build a dependency graph from a dependencies map\n *\n * @param dependencies - Map of node names to their dependencies\n * @returns Dependency graph with nodes and edges\n *\n * @example\n * const graph = buildDependencyGraph({\n * tax: ['price'],\n * total: ['price', 'tax']\n * });\n * // graph.edges.get('tax') = Set(['price'])\n * // graph.edges.get('total') = Set(['price', 'tax'])\n */\nexport function buildDependencyGraph(\n dependencies: Record<string, string[]>,\n): DependencyGraph {\n const nodes = new Set<string>();\n const edges = new Map<string, Set<string>>();\n\n for (const [node, deps] of Object.entries(dependencies)) {\n nodes.add(node);\n edges.set(node, new Set(deps));\n\n for (const dep of deps) {\n nodes.add(dep);\n }\n }\n\n return { nodes, edges };\n}\n\n/**\n * Detect first circular dependency in a dependency graph\n *\n * @param graph - Dependency graph\n * @returns Result with detected cycle (null if no cycle)\n *\n * @example\n * detectCircularDependencies(graph)\n * // { hasCircular: true, cycle: ['a', 'b', 'c', 'a'] }\n */\nexport function detectCircularDependencies(\n graph: DependencyGraph,\n): CircularDependencyResult {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const path: string[] = [];\n\n for (const node of graph.nodes) {\n if (!visited.has(node)) {\n const cycle = dfsVisit(node, graph, visited, recursionStack, path);\n if (cycle) {\n return { hasCircular: true, cycle };\n }\n }\n }\n\n return { hasCircular: false, cycle: null };\n}\n\nfunction dfsVisit(\n node: string,\n graph: DependencyGraph,\n visited: Set<string>,\n recursionStack: Set<string>,\n path: string[],\n): string[] | null {\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const deps = graph.edges.get(node);\n if (deps) {\n for (const dep of deps) {\n if (!visited.has(dep)) {\n const cycle = dfsVisit(dep, graph, visited, recursionStack, path);\n if (cycle) {\n return cycle;\n }\n } else if (recursionStack.has(dep)) {\n const cycleStart = path.indexOf(dep);\n return [...path.slice(cycleStart), dep];\n }\n }\n }\n\n path.pop();\n recursionStack.delete(node);\n return null;\n}\n\n/**\n * Get topological order for formula evaluation\n *\n * @param graph - Dependency graph\n * @returns Ordered list of field names for evaluation\n *\n * @example\n * getTopologicalOrder(graph)\n * // { success: true, order: ['price', 'tax', 'total'] }\n */\nexport function getTopologicalOrder(\n graph: DependencyGraph,\n): TopologicalOrderResult {\n const circularCheck = detectCircularDependencies(graph);\n if (circularCheck.hasCircular && circularCheck.cycle) {\n return {\n success: false,\n order: [],\n error: `Circular dependency detected: ${circularCheck.cycle.join(' -> ')}`,\n };\n }\n\n const inDegree = initializeInDegree(graph);\n const queue = findZeroInDegreeNodes(inDegree);\n const order = processQueue(queue, graph, inDegree);\n\n order.reverse();\n return { success: true, order };\n}\n\nfunction initializeInDegree(graph: DependencyGraph): Map<string, number> {\n const inDegree = new Map<string, number>();\n\n for (const node of graph.nodes) {\n inDegree.set(node, 0);\n }\n\n for (const deps of graph.edges.values()) {\n for (const dep of deps) {\n inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1);\n }\n }\n\n return inDegree;\n}\n\nfunction findZeroInDegreeNodes(inDegree: Map<string, number>): string[] {\n const result: string[] = [];\n for (const [node, degree] of inDegree) {\n if (degree === 0) {\n result.push(node);\n }\n }\n return result;\n}\n\nfunction processQueue(\n queue: string[],\n graph: DependencyGraph,\n inDegree: Map<string, number>,\n): string[] {\n const order: string[] = [];\n let head = 0;\n\n while (head < queue.length) {\n const node = queue[head]!;\n head++;\n order.push(node);\n\n const deps = graph.edges.get(node);\n if (deps) {\n for (const dep of deps) {\n const newDegree = (inDegree.get(dep) ?? 0) - 1;\n inDegree.set(dep, newDegree);\n if (newDegree === 0) {\n queue.push(dep);\n }\n }\n }\n }\n\n return order;\n}\n","interface XFormulaInput {\n version: number;\n expression: string;\n}\n\ninterface SchemaProperty {\n type?: string;\n 'x-formula'?: XFormulaInput;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface JsonSchema {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface ExtractedFormula {\n fieldName: string;\n expression: string;\n fieldType: string;\n}\n\n/**\n * Extract formula definitions from a JSON Schema\n *\n * @param schema - JSON Schema object with properties\n * @returns Array of extracted formulas with field names and expressions\n *\n * @example\n * extractSchemaFormulas({\n * type: 'object',\n * properties: {\n * price: { type: 'number' },\n * tax: { type: 'number', 'x-formula': { version: 1, expression: 'price * 0.1' } }\n * }\n * });\n * // [{ fieldName: 'tax', expression: 'price * 0.1', fieldType: 'number' }]\n */\nexport function extractSchemaFormulas(schema: JsonSchema): ExtractedFormula[] {\n const formulas: ExtractedFormula[] = [];\n extractFormulasRecursive(schema, '', formulas);\n return formulas;\n}\n\nfunction extractFormulasRecursive(\n schema: SchemaProperty | JsonSchema,\n pathPrefix: string,\n formulas: ExtractedFormula[],\n): void {\n if (schema.type === 'array' && schema.items) {\n extractFormulasRecursive(schema.items, `${pathPrefix}[]`, formulas);\n return;\n }\n\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const fullPath = pathPrefix ? `${pathPrefix}.${fieldName}` : fieldName;\n\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName: fullPath,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n\n if (fieldSchema.type === 'object' && fieldSchema.properties) {\n extractFormulasRecursive(fieldSchema, fullPath, formulas);\n }\n\n if (fieldSchema.type === 'array' && fieldSchema.items) {\n extractFormulasRecursive(fieldSchema.items, `${fullPath}[]`, formulas);\n }\n }\n}\n","import { parseExpression } from './parse-formula';\nimport { validateFormulaSyntax } from './validate-syntax';\nimport { extractSchemaFormulas, JsonSchema } from './extract-schema';\nimport {\n buildDependencyGraph,\n detectCircularDependencies,\n} from './dependency-graph';\nimport { inferFormulaType, FieldTypes, InferredType } from './parser';\n\ninterface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n items?: SchemaProperty;\n [key: string]: unknown;\n}\n\nexport interface FormulaValidationError {\n field: string;\n error: string;\n position?: number;\n}\n\nexport interface SchemaValidationResult {\n isValid: boolean;\n errors: FormulaValidationError[];\n}\n\nfunction resolveSubSchema(\n schema: JsonSchema,\n fieldPath: string,\n): SchemaProperty | null {\n if (!fieldPath) {\n return schema;\n }\n\n const segments = parsePathSegments(fieldPath);\n let current: SchemaProperty | JsonSchema = schema;\n\n for (const segment of segments) {\n if (segment === '[]') {\n if (current.type === 'array' && current.items) {\n current = current.items;\n } else {\n return null;\n }\n } else {\n if (current.properties?.[segment]) {\n current = current.properties[segment];\n } else {\n return null;\n }\n }\n }\n\n return current;\n}\n\nfunction parsePathSegments(path: string): string[] {\n const segments: string[] = [];\n let current = '';\n let inBracket = false;\n\n for (const char of path) {\n if (char === '[') {\n if (current) {\n segments.push(current);\n current = '';\n }\n inBracket = true;\n } else if (char === ']') {\n inBracket = false;\n segments.push('[]');\n } else if (char === '.' && !inBracket) {\n if (current) {\n segments.push(current);\n current = '';\n }\n } else if (!inBracket) {\n current += char;\n }\n }\n\n if (current) {\n segments.push(current);\n }\n\n return segments;\n}\n\nfunction getParentPath(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf('[');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex <= 0) {\n return '';\n }\n\n return fieldPath.substring(0, splitIndex);\n}\n\nfunction getFieldName(fieldPath: string): string {\n const lastDotIndex = fieldPath.lastIndexOf('.');\n const lastBracketIndex = fieldPath.lastIndexOf(']');\n const splitIndex = Math.max(lastDotIndex, lastBracketIndex);\n\n if (splitIndex === -1) {\n return fieldPath;\n }\n\n return fieldPath.substring(splitIndex + 1);\n}\n\nfunction getSchemaFields(schema: SchemaProperty | JsonSchema): Set<string> {\n const fields = new Set<string>();\n const properties = schema.properties ?? {};\n\n for (const fieldName of Object.keys(properties)) {\n fields.add(fieldName);\n }\n\n return fields;\n}\n\nfunction getSchemaFieldTypes(schema: SchemaProperty | JsonSchema): FieldTypes {\n const fieldTypes: FieldTypes = {};\n const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const schemaType = fieldSchema.type;\n if (\n schemaType === 'number' ||\n schemaType === 'string' ||\n schemaType === 'boolean' ||\n schemaType === 'object' ||\n schemaType === 'array'\n ) {\n fieldTypes[fieldName] = schemaType;\n }\n }\n\n return fieldTypes;\n}\n\nfunction schemaTypeToInferred(\n schemaType: string | undefined,\n): InferredType | null {\n if (schemaType === 'number') return 'number';\n if (schemaType === 'string') return 'string';\n if (schemaType === 'boolean') return 'boolean';\n return null;\n}\n\nfunction isTypeCompatible(\n inferredType: InferredType,\n expectedType: InferredType | null,\n): boolean {\n if (expectedType === null) return true;\n if (inferredType === 'unknown') return true;\n return inferredType === expectedType;\n}\n\nfunction extractFieldRoot(dependency: string): string {\n const root = dependency.split('.')[0]?.split('[')[0];\n return root || dependency;\n}\n\nfunction validateFormulaInContext(\n expression: string,\n fieldPath: string,\n rootSchema: JsonSchema,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldPath,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parentPath = getParentPath(fieldPath);\n const localFieldName = getFieldName(fieldPath);\n const contextSchema = resolveSubSchema(rootSchema, parentPath);\n\n if (!contextSchema) {\n return {\n field: fieldPath,\n error: `Cannot resolve schema context for path '${parentPath}'`,\n };\n }\n\n const parseResult = parseExpression(expression);\n const schemaFields = getSchemaFields(contextSchema);\n\n for (const dep of parseResult.dependencies) {\n const rootField = extractFieldRoot(dep);\n if (!schemaFields.has(rootField)) {\n return {\n field: fieldPath,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n\n if (\n parseResult.dependencies.some((d) => extractFieldRoot(d) === localFieldName)\n ) {\n return {\n field: fieldPath,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = contextSchema.properties?.[localFieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(contextSchema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldPath,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\n}\n\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchema,\n): FormulaValidationError | null {\n return validateFormulaInContext(expression, fieldName, schema);\n}\n\nexport function validateSchemaFormulas(\n schema: JsonSchema,\n): SchemaValidationResult {\n const errors: FormulaValidationError[] = [];\n const formulas = extractSchemaFormulas(schema);\n\n for (const formula of formulas) {\n const error = validateFormulaAgainstSchema(\n formula.expression,\n formula.fieldName,\n schema,\n );\n if (error) {\n errors.push(error);\n }\n }\n\n if (errors.length > 0) {\n return { isValid: false, errors };\n }\n\n const dependencies: Record<string, string[]> = {};\n for (const formula of formulas) {\n const parseResult = parseExpression(formula.expression);\n const parentPath = getParentPath(formula.fieldName);\n const prefix = parentPath ? `${parentPath}.` : '';\n\n dependencies[formula.fieldName] = parseResult.dependencies.map((dep) => {\n const rootField = extractFieldRoot(dep);\n return `${prefix}${rootField}`;\n });\n }\n\n const graph = buildDependencyGraph(dependencies);\n const circularCheck = detectCircularDependencies(graph);\n\n const cycle = circularCheck.cycle;\n if (circularCheck.hasCircular && cycle && cycle.length > 0) {\n const firstField = cycle[0];\n if (firstField) {\n errors.push({\n field: firstField,\n error: `Circular dependency: ${cycle.join(' → ')}`,\n });\n return { isValid: false, errors };\n }\n }\n\n return { isValid: true, errors: [] };\n}\n"]}
@@ -1,29 +1,29 @@
1
1
  'use strict';
2
2
 
3
- var chunkJJ72EVIZ_cjs = require('../chunk-JJ72EVIZ.cjs');
3
+ var chunkAGBOCJGV_cjs = require('../chunk-AGBOCJGV.cjs');
4
4
  require('../chunk-Q7SFCCGT.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "extractSchemaFormulas", {
9
9
  enumerable: true,
10
- get: function () { return chunkJJ72EVIZ_cjs.extractSchemaFormulas; }
10
+ get: function () { return chunkAGBOCJGV_cjs.extractSchemaFormulas; }
11
11
  });
12
12
  Object.defineProperty(exports, "parseExpression", {
13
13
  enumerable: true,
14
- get: function () { return chunkJJ72EVIZ_cjs.parseExpression; }
14
+ get: function () { return chunkAGBOCJGV_cjs.parseExpression; }
15
15
  });
16
16
  Object.defineProperty(exports, "parseFormula", {
17
17
  enumerable: true,
18
- get: function () { return chunkJJ72EVIZ_cjs.parseFormula; }
18
+ get: function () { return chunkAGBOCJGV_cjs.parseFormula; }
19
19
  });
20
20
  Object.defineProperty(exports, "validateFormulaAgainstSchema", {
21
21
  enumerable: true,
22
- get: function () { return chunkJJ72EVIZ_cjs.validateFormulaAgainstSchema; }
22
+ get: function () { return chunkAGBOCJGV_cjs.validateFormulaAgainstSchema; }
23
23
  });
24
24
  Object.defineProperty(exports, "validateFormulaSyntax", {
25
25
  enumerable: true,
26
- get: function () { return chunkJJ72EVIZ_cjs.validateFormulaSyntax; }
26
+ get: function () { return chunkAGBOCJGV_cjs.validateFormulaSyntax; }
27
27
  });
28
28
  //# sourceMappingURL=index.cjs.map
29
29
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- export { A as ASTNode, E as ExtractedFormula, m as FormulaAnalysis, l as FormulaFeature, k as FormulaMinorVersion, h as FormulaValidationError, J as JsonSchema, P as ParseResult, b as ParsedExpression, o as ParsedPath, n as PathSegment, q as PathValidationResult, S as SyntaxValidationResult, X as XFormula, d as extractSchemaFormulas, a as parseExpression, p as parseFormula, f as validateFormulaAgainstSchema, c as validateFormulaSyntax } from '../index-DO2EZ7U6.cjs';
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 +1 @@
1
- export { A as ASTNode, E as ExtractedFormula, m as FormulaAnalysis, l as FormulaFeature, k as FormulaMinorVersion, h as FormulaValidationError, J as JsonSchema, P as ParseResult, b as ParsedExpression, o as ParsedPath, n as PathSegment, q as PathValidationResult, S as SyntaxValidationResult, X as XFormula, d as extractSchemaFormulas, a as parseExpression, p as parseFormula, f as validateFormulaAgainstSchema, c as validateFormulaSyntax } from '../index-DO2EZ7U6.js';
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,4 +1,4 @@
1
- export { extractSchemaFormulas, parseExpression, parseFormula, validateFormulaAgainstSchema, validateFormulaSyntax } from '../chunk-4JNGUHMF.js';
1
+ export { extractSchemaFormulas, parseExpression, parseFormula, validateFormulaAgainstSchema, validateFormulaSyntax } from '../chunk-FDIJPOVQ.js';
2
2
  import '../chunk-PZ5AY32C.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -368,12 +368,50 @@ var formulaSpec = {
368
368
  "items[-2].price // second to last"
369
369
  ],
370
370
  dependenciesExtracted: ['["items[0].price"]', '["items[-1].name"]']
371
+ },
372
+ {
373
+ name: "root_path",
374
+ description: "Absolute path reference starting with /. Always resolves from root data, even inside array item formulas",
375
+ minVersion: "1.1",
376
+ examples: [
377
+ "/taxRate",
378
+ "/config.tax",
379
+ "price * (1 + /taxRate)",
380
+ "price * /config.multiplier"
381
+ ],
382
+ dependenciesExtracted: ['["/taxRate"]', '["/config.tax"]']
383
+ },
384
+ {
385
+ name: "relative_path",
386
+ description: "Relative path reference starting with ../. Resolves from parent context (root data) when inside array item formulas",
387
+ minVersion: "1.1",
388
+ examples: [
389
+ "../discount",
390
+ "../settings.multiplier",
391
+ "price * (1 - ../discount)",
392
+ "price * ../settings.multiplier"
393
+ ],
394
+ dependenciesExtracted: ['["../discount"]', '["../settings.multiplier"]']
395
+ },
396
+ {
397
+ name: "function_named_fields",
398
+ description: "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",
399
+ minVersion: "1.0",
400
+ examples: [
401
+ "max(max, 0)",
402
+ "min(min, 100)",
403
+ "max(max - field.min, 0)",
404
+ "round(round * 2)"
405
+ ]
371
406
  }
372
407
  ],
373
408
  versionDetection: [
374
409
  { feature: "Simple refs, arithmetic, comparisons", minVersion: "1.0" },
410
+ { feature: "Function-named fields (max(max, 0))", minVersion: "1.0" },
375
411
  { feature: "Nested paths (a.b)", minVersion: "1.1" },
376
- { feature: "Array index ([0], [-1])", minVersion: "1.1" }
412
+ { feature: "Array index ([0], [-1])", minVersion: "1.1" },
413
+ { feature: "Absolute paths (/field)", minVersion: "1.1" },
414
+ { feature: "Relative paths (../field)", minVersion: "1.1" }
377
415
  ],
378
416
  parseResult: {
379
417
  description: "The parser automatically detects the minimum required version",
@@ -464,6 +502,58 @@ evaluate('price > 100', { price: 150 })
464
502
 
465
503
  evaluate('a + b * c', { a: 1, b: 2, c: 3 })
466
504
  // 7`
505
+ },
506
+ {
507
+ name: "Function-named fields",
508
+ description: "Fields can have the same name as built-in functions",
509
+ code: `// Built-in functions take precedence in function calls
510
+ evaluate('max(max, 0)', { max: 10 })
511
+ // 10 (max() function, then max field)
512
+
513
+ evaluate('max(max - field.min, 0)', { max: 100, field: { min: 20 } })
514
+ // 80
515
+
516
+ evaluate('round(round * 2)', { round: 3.7 })
517
+ // 7
518
+
519
+ // Field named "sum" doesn't conflict with sum() function
520
+ evaluate('sum(values) + sum', { values: [1, 2, 3], sum: 10 })
521
+ // 16`
522
+ },
523
+ {
524
+ name: "Evaluate with context (array items)",
525
+ description: "Use evaluateWithContext() for array item formulas with path resolution",
526
+ code: `// Absolute path: /field always resolves from root
527
+ evaluateWithContext('price * (1 + /taxRate)', {
528
+ rootData: { taxRate: 0.1, items: [{ price: 100 }] },
529
+ itemData: { price: 100 },
530
+ currentPath: 'items[0]'
531
+ })
532
+ // 110
533
+
534
+ // Nested absolute path
535
+ evaluateWithContext('price * /config.multiplier', {
536
+ rootData: { config: { multiplier: 1.5 }, items: [] },
537
+ itemData: { price: 100 },
538
+ currentPath: 'items[0]'
539
+ })
540
+ // 150
541
+
542
+ // Relative path: ../field resolves from parent (root)
543
+ evaluateWithContext('price * (1 - ../discount)', {
544
+ rootData: { discount: 0.2, items: [] },
545
+ itemData: { price: 100 },
546
+ currentPath: 'items[0]'
547
+ })
548
+ // 80
549
+
550
+ // itemData takes precedence over rootData for same field
551
+ evaluateWithContext('value + 10', {
552
+ rootData: { value: 100 },
553
+ itemData: { value: 50 },
554
+ currentPath: 'items[0]'
555
+ })
556
+ // 60`
467
557
  }
468
558
  ],
469
559
  schemaUsage: {
@@ -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\n versionDetection: [\n { feature: 'Simple refs, arithmetic, comparisons', minVersion: '1.0' },\n { feature: 'Nested paths (a.b)', minVersion: '1.1' },\n { feature: 'Array index ([0], [-1])', 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\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"]}