@revisium/formula 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunk-FGRNVE53.js → chunk-4JNGUHMF.js} +88 -21
- package/dist/chunk-4JNGUHMF.js.map +1 -0
- package/dist/{chunk-5NMNSRHH.cjs → chunk-JJ72EVIZ.cjs} +88 -21
- package/dist/chunk-JJ72EVIZ.cjs.map +1 -0
- package/dist/editor/index.cjs +6 -6
- package/dist/editor/index.js +1 -1
- package/dist/formula-spec.cjs +297 -7
- package/dist/formula-spec.cjs.map +1 -1
- package/dist/formula-spec.d.cts +16 -1
- package/dist/formula-spec.d.ts +16 -1
- package/dist/formula-spec.js +297 -7
- package/dist/formula-spec.js.map +1 -1
- package/dist/index.cjs +13 -13
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-5NMNSRHH.cjs.map +0 -1
- package/dist/chunk-FGRNVE53.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# @revisium/formula
|
|
4
4
|
|
|
5
5
|
[](https://sonarcloud.io/summary/new_code?id=revisium_formula)
|
|
6
|
-
[](https://sonarcloud.io/summary/new_code?id=revisium_formula)
|
|
7
7
|
[](https://github.com/revisium/formula/blob/master/LICENSE)
|
|
8
8
|
[](https://github.com/revisium/formula/releases)
|
|
9
9
|
|
|
@@ -339,8 +339,6 @@ var KEYWORDS = /* @__PURE__ */ new Set([
|
|
|
339
339
|
"first",
|
|
340
340
|
"last",
|
|
341
341
|
"join",
|
|
342
|
-
"filter",
|
|
343
|
-
"map",
|
|
344
342
|
"includes"
|
|
345
343
|
]);
|
|
346
344
|
var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
@@ -350,8 +348,6 @@ var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
350
348
|
"first",
|
|
351
349
|
"last",
|
|
352
350
|
"join",
|
|
353
|
-
"filter",
|
|
354
|
-
"map",
|
|
355
351
|
"includes"
|
|
356
352
|
]);
|
|
357
353
|
function isKeyword(name) {
|
|
@@ -566,26 +562,87 @@ function validateSyntax(expression) {
|
|
|
566
562
|
};
|
|
567
563
|
}
|
|
568
564
|
}
|
|
565
|
+
var BUILTIN_FUNCTIONS = {
|
|
566
|
+
and: (a, b) => Boolean(a) && Boolean(b),
|
|
567
|
+
or: (a, b) => Boolean(a) || Boolean(b),
|
|
568
|
+
not: (a) => !a,
|
|
569
|
+
concat: (...args) => args.map(String).join(""),
|
|
570
|
+
upper: (s) => String(s).toUpperCase(),
|
|
571
|
+
lower: (s) => String(s).toLowerCase(),
|
|
572
|
+
trim: (s) => String(s).trim(),
|
|
573
|
+
left: (s, n) => {
|
|
574
|
+
const count = Math.max(0, Math.floor(Number(n)));
|
|
575
|
+
return String(s).slice(0, count);
|
|
576
|
+
},
|
|
577
|
+
right: (s, n) => {
|
|
578
|
+
const str = String(s);
|
|
579
|
+
const count = Math.max(0, Math.floor(Number(n)));
|
|
580
|
+
return count === 0 ? "" : str.slice(-count);
|
|
581
|
+
},
|
|
582
|
+
replace: (s, search, replacement) => String(s).replace(String(search), String(replacement)),
|
|
583
|
+
tostring: String,
|
|
584
|
+
length: (s) => {
|
|
585
|
+
if (Array.isArray(s)) return s.length;
|
|
586
|
+
if (typeof s === "string") return s.length;
|
|
587
|
+
if (s !== null && typeof s === "object") return Object.keys(s).length;
|
|
588
|
+
return String(s).length;
|
|
589
|
+
},
|
|
590
|
+
contains: (s, search) => String(s).includes(String(search)),
|
|
591
|
+
startswith: (s, search) => String(s).startsWith(String(search)),
|
|
592
|
+
endswith: (s, search) => String(s).endsWith(String(search)),
|
|
593
|
+
tonumber: Number,
|
|
594
|
+
toboolean: Boolean,
|
|
595
|
+
isnull: (v) => v === null || v === void 0,
|
|
596
|
+
coalesce: (...args) => args.find((v) => v !== null && v !== void 0) ?? null,
|
|
597
|
+
round: (n, decimals) => {
|
|
598
|
+
const num2 = Number(n);
|
|
599
|
+
const dec = decimals === void 0 ? 0 : Number(decimals);
|
|
600
|
+
const factor = 10 ** dec;
|
|
601
|
+
return Math.round(num2 * factor) / factor;
|
|
602
|
+
},
|
|
603
|
+
floor: (n) => Math.floor(Number(n)),
|
|
604
|
+
ceil: (n) => Math.ceil(Number(n)),
|
|
605
|
+
abs: (n) => Math.abs(Number(n)),
|
|
606
|
+
sqrt: (n) => Math.sqrt(Number(n)),
|
|
607
|
+
pow: (base, exp) => Math.pow(Number(base), Number(exp)),
|
|
608
|
+
min: (...args) => args.length === 0 ? Number.NaN : Math.min(...args.map(Number)),
|
|
609
|
+
max: (...args) => args.length === 0 ? Number.NaN : Math.max(...args.map(Number)),
|
|
610
|
+
log: (n) => Math.log(Number(n)),
|
|
611
|
+
log10: (n) => Math.log10(Number(n)),
|
|
612
|
+
exp: (n) => Math.exp(Number(n)),
|
|
613
|
+
sign: (n) => Math.sign(Number(n)),
|
|
614
|
+
sum: (arr) => Array.isArray(arr) ? arr.reduce((a, b) => a + Number(b), 0) : 0,
|
|
615
|
+
avg: (arr) => Array.isArray(arr) && arr.length > 0 ? arr.reduce((a, b) => a + Number(b), 0) / arr.length : 0,
|
|
616
|
+
count: (arr) => Array.isArray(arr) ? arr.length : 0,
|
|
617
|
+
first: (arr) => Array.isArray(arr) ? arr[0] : void 0,
|
|
618
|
+
last: (arr) => Array.isArray(arr) ? arr.at(-1) : void 0,
|
|
619
|
+
join: (arr, separator) => {
|
|
620
|
+
if (!Array.isArray(arr)) return "";
|
|
621
|
+
if (separator === void 0) return arr.join(",");
|
|
622
|
+
if (typeof separator === "string") return arr.join(separator);
|
|
623
|
+
if (typeof separator === "number") return arr.join(String(separator));
|
|
624
|
+
return arr.join(",");
|
|
625
|
+
},
|
|
626
|
+
includes: (arr, value) => Array.isArray(arr) ? arr.includes(value) : false,
|
|
627
|
+
if: (condition, ifTrue, ifFalse) => condition ? ifTrue : ifFalse
|
|
628
|
+
};
|
|
569
629
|
function evaluate(expression, context) {
|
|
570
630
|
const trimmed = expression.trim();
|
|
571
631
|
if (!trimmed) {
|
|
572
632
|
throw new Error("Empty expression");
|
|
573
633
|
}
|
|
574
634
|
const fn = subscript_default(trimmed);
|
|
575
|
-
|
|
635
|
+
const safeContext = { ...BUILTIN_FUNCTIONS };
|
|
636
|
+
for (const [key, value] of Object.entries(context)) {
|
|
637
|
+
if (typeof value !== "function") {
|
|
638
|
+
safeContext[key] = value;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return fn(safeContext);
|
|
576
642
|
}
|
|
577
643
|
var ARITHMETIC_OPS = /* @__PURE__ */ new Set(["+", "-", "*", "/", "%"]);
|
|
578
|
-
var COMPARISON_OPS = /* @__PURE__ */ new Set([
|
|
579
|
-
|
|
580
|
-
">",
|
|
581
|
-
"<=",
|
|
582
|
-
">=",
|
|
583
|
-
"==",
|
|
584
|
-
"!=",
|
|
585
|
-
"===",
|
|
586
|
-
"!=="
|
|
587
|
-
]);
|
|
588
|
-
var LOGICAL_OPS = /* @__PURE__ */ new Set(["&&", "||", "!", "and", "or", "not"]);
|
|
644
|
+
var COMPARISON_OPS = /* @__PURE__ */ new Set(["<", ">", "<=", ">=", "==", "!="]);
|
|
645
|
+
var LOGICAL_OPS = /* @__PURE__ */ new Set(["&&", "||", "!"]);
|
|
589
646
|
var NUMERIC_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
590
647
|
"round",
|
|
591
648
|
"floor",
|
|
@@ -602,7 +659,8 @@ var NUMERIC_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
602
659
|
"sum",
|
|
603
660
|
"avg",
|
|
604
661
|
"count",
|
|
605
|
-
"tonumber"
|
|
662
|
+
"tonumber",
|
|
663
|
+
"length"
|
|
606
664
|
]);
|
|
607
665
|
var STRING_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
608
666
|
"concat",
|
|
@@ -616,6 +674,9 @@ var STRING_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
616
674
|
"join"
|
|
617
675
|
]);
|
|
618
676
|
var BOOLEAN_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
677
|
+
"and",
|
|
678
|
+
"or",
|
|
679
|
+
"not",
|
|
619
680
|
"contains",
|
|
620
681
|
"startswith",
|
|
621
682
|
"endswith",
|
|
@@ -645,7 +706,12 @@ function inferLiteralArrayType(node) {
|
|
|
645
706
|
if (typeof val === "boolean") return "boolean";
|
|
646
707
|
return "unknown";
|
|
647
708
|
}
|
|
648
|
-
function inferOperatorType(op, argsLength) {
|
|
709
|
+
function inferOperatorType(op, argsLength, argTypes) {
|
|
710
|
+
if (op === "+" && argTypes) {
|
|
711
|
+
if (argTypes.includes("string")) return "string";
|
|
712
|
+
if (argTypes.includes("unknown")) return "unknown";
|
|
713
|
+
return "number";
|
|
714
|
+
}
|
|
649
715
|
if (ARITHMETIC_OPS.has(op)) return "number";
|
|
650
716
|
if (COMPARISON_OPS.has(op)) return "boolean";
|
|
651
717
|
if (LOGICAL_OPS.has(op)) return "boolean";
|
|
@@ -670,7 +736,8 @@ function inferTypeFromNode(node, fieldTypes) {
|
|
|
670
736
|
if (!Array.isArray(node)) return "unknown";
|
|
671
737
|
if (isLiteralArray(node)) return inferLiteralArrayType(node);
|
|
672
738
|
const [op, ...args] = node;
|
|
673
|
-
const
|
|
739
|
+
const argTypes = op === "+" ? args.map((arg) => inferTypeFromNode(arg, fieldTypes)) : void 0;
|
|
740
|
+
const operatorType = inferOperatorType(op, args.length, argTypes);
|
|
674
741
|
if (operatorType !== null) return operatorType;
|
|
675
742
|
if (op === "." || op === "[]") {
|
|
676
743
|
return inferPropertyAccessType(node, fieldTypes);
|
|
@@ -951,5 +1018,5 @@ function validateSchemaFormulas(schema) {
|
|
|
951
1018
|
}
|
|
952
1019
|
|
|
953
1020
|
export { buildDependencyGraph, detectCircularDependencies, evaluate, extractSchemaFormulas, getTopologicalOrder, inferFormulaType, parseExpression, parseFormula, validateFormulaAgainstSchema, validateFormulaSyntax, validateSchemaFormulas, validateSyntax };
|
|
954
|
-
//# sourceMappingURL=chunk-
|
|
955
|
-
//# sourceMappingURL=chunk-
|
|
1021
|
+
//# sourceMappingURL=chunk-4JNGUHMF.js.map
|
|
1022
|
+
//# sourceMappingURL=chunk-4JNGUHMF.js.map
|
|
@@ -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-4JNGUHMF.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 } from 'subscript';\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\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\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 'constructor',\n '__proto__',\n 'prototype',\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 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 (!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 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 detectFeatures(node: ASTNode, features: Set<FormulaFeature>): void {\n if (typeof node === 'string') {\n if (isContextToken(node)) {\n features.add('context_token');\n }\n return;\n }\n\n if (!Array.isArray(node) || isLiteralArray(node)) {\n return;\n }\n\n const op = node[0];\n\n if (op === '.') {\n features.add('nested_path');\n }\n\n if (op === '[]') {\n detectArrayAccessFeatures(node[2] as ASTNode, features);\n }\n\n if (op === '()') {\n detectFunctionCallFeatures(node[1] as ASTNode, features);\n }\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 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\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\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> = { ...BUILTIN_FUNCTIONS };\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 * 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 [key: string]: unknown;\n}\n\nexport interface JsonSchema {\n type?: string;\n properties?: Record<string, 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 const properties = schema.properties ?? {};\n\n for (const [fieldName, fieldSchema] of Object.entries(properties)) {\n const xFormula = fieldSchema['x-formula'];\n if (xFormula) {\n formulas.push({\n fieldName,\n expression: xFormula.expression,\n fieldType: fieldSchema.type ?? 'string',\n });\n }\n }\n\n return formulas;\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\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 getSchemaFields(schema: 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: 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\nexport function validateFormulaAgainstSchema(\n expression: string,\n fieldName: string,\n schema: JsonSchema,\n): FormulaValidationError | null {\n const syntaxResult = validateFormulaSyntax(expression);\n if (!syntaxResult.isValid) {\n return {\n field: fieldName,\n error: syntaxResult.error,\n position: syntaxResult.position,\n };\n }\n\n const parseResult = parseExpression(expression);\n const schemaFields = getSchemaFields(schema);\n\n for (const dep of parseResult.dependencies) {\n const rootField = extractFieldRoot(dep);\n if (!schemaFields.has(rootField)) {\n return {\n field: fieldName,\n error: `Unknown field '${rootField}' in formula`,\n };\n }\n }\n\n if (parseResult.dependencies.some((d) => extractFieldRoot(d) === fieldName)) {\n return {\n field: fieldName,\n error: `Formula cannot reference itself`,\n };\n }\n\n const fieldSchema = schema.properties?.[fieldName];\n const expectedType = schemaTypeToInferred(fieldSchema?.type);\n const fieldTypes = getSchemaFieldTypes(schema);\n const inferredType = inferFormulaType(expression, fieldTypes);\n\n if (!isTypeCompatible(inferredType, expectedType)) {\n return {\n field: fieldName,\n error: `Type mismatch: formula returns '${inferredType}' but field expects '${expectedType}'`,\n };\n }\n\n return null;\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 dependencies[formula.fieldName] =\n parseResult.dependencies.map(extractFieldRoot);\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"]}
|
|
@@ -341,8 +341,6 @@ var KEYWORDS = /* @__PURE__ */ new Set([
|
|
|
341
341
|
"first",
|
|
342
342
|
"last",
|
|
343
343
|
"join",
|
|
344
|
-
"filter",
|
|
345
|
-
"map",
|
|
346
344
|
"includes"
|
|
347
345
|
]);
|
|
348
346
|
var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
@@ -352,8 +350,6 @@ var ARRAY_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
352
350
|
"first",
|
|
353
351
|
"last",
|
|
354
352
|
"join",
|
|
355
|
-
"filter",
|
|
356
|
-
"map",
|
|
357
353
|
"includes"
|
|
358
354
|
]);
|
|
359
355
|
function isKeyword(name) {
|
|
@@ -568,26 +564,87 @@ function validateSyntax(expression) {
|
|
|
568
564
|
};
|
|
569
565
|
}
|
|
570
566
|
}
|
|
567
|
+
var BUILTIN_FUNCTIONS = {
|
|
568
|
+
and: (a, b) => Boolean(a) && Boolean(b),
|
|
569
|
+
or: (a, b) => Boolean(a) || Boolean(b),
|
|
570
|
+
not: (a) => !a,
|
|
571
|
+
concat: (...args) => args.map(String).join(""),
|
|
572
|
+
upper: (s) => String(s).toUpperCase(),
|
|
573
|
+
lower: (s) => String(s).toLowerCase(),
|
|
574
|
+
trim: (s) => String(s).trim(),
|
|
575
|
+
left: (s, n) => {
|
|
576
|
+
const count = Math.max(0, Math.floor(Number(n)));
|
|
577
|
+
return String(s).slice(0, count);
|
|
578
|
+
},
|
|
579
|
+
right: (s, n) => {
|
|
580
|
+
const str = String(s);
|
|
581
|
+
const count = Math.max(0, Math.floor(Number(n)));
|
|
582
|
+
return count === 0 ? "" : str.slice(-count);
|
|
583
|
+
},
|
|
584
|
+
replace: (s, search, replacement) => String(s).replace(String(search), String(replacement)),
|
|
585
|
+
tostring: String,
|
|
586
|
+
length: (s) => {
|
|
587
|
+
if (Array.isArray(s)) return s.length;
|
|
588
|
+
if (typeof s === "string") return s.length;
|
|
589
|
+
if (s !== null && typeof s === "object") return Object.keys(s).length;
|
|
590
|
+
return String(s).length;
|
|
591
|
+
},
|
|
592
|
+
contains: (s, search) => String(s).includes(String(search)),
|
|
593
|
+
startswith: (s, search) => String(s).startsWith(String(search)),
|
|
594
|
+
endswith: (s, search) => String(s).endsWith(String(search)),
|
|
595
|
+
tonumber: Number,
|
|
596
|
+
toboolean: Boolean,
|
|
597
|
+
isnull: (v) => v === null || v === void 0,
|
|
598
|
+
coalesce: (...args) => args.find((v) => v !== null && v !== void 0) ?? null,
|
|
599
|
+
round: (n, decimals) => {
|
|
600
|
+
const num2 = Number(n);
|
|
601
|
+
const dec = decimals === void 0 ? 0 : Number(decimals);
|
|
602
|
+
const factor = 10 ** dec;
|
|
603
|
+
return Math.round(num2 * factor) / factor;
|
|
604
|
+
},
|
|
605
|
+
floor: (n) => Math.floor(Number(n)),
|
|
606
|
+
ceil: (n) => Math.ceil(Number(n)),
|
|
607
|
+
abs: (n) => Math.abs(Number(n)),
|
|
608
|
+
sqrt: (n) => Math.sqrt(Number(n)),
|
|
609
|
+
pow: (base, exp) => Math.pow(Number(base), Number(exp)),
|
|
610
|
+
min: (...args) => args.length === 0 ? Number.NaN : Math.min(...args.map(Number)),
|
|
611
|
+
max: (...args) => args.length === 0 ? Number.NaN : Math.max(...args.map(Number)),
|
|
612
|
+
log: (n) => Math.log(Number(n)),
|
|
613
|
+
log10: (n) => Math.log10(Number(n)),
|
|
614
|
+
exp: (n) => Math.exp(Number(n)),
|
|
615
|
+
sign: (n) => Math.sign(Number(n)),
|
|
616
|
+
sum: (arr) => Array.isArray(arr) ? arr.reduce((a, b) => a + Number(b), 0) : 0,
|
|
617
|
+
avg: (arr) => Array.isArray(arr) && arr.length > 0 ? arr.reduce((a, b) => a + Number(b), 0) / arr.length : 0,
|
|
618
|
+
count: (arr) => Array.isArray(arr) ? arr.length : 0,
|
|
619
|
+
first: (arr) => Array.isArray(arr) ? arr[0] : void 0,
|
|
620
|
+
last: (arr) => Array.isArray(arr) ? arr.at(-1) : void 0,
|
|
621
|
+
join: (arr, separator) => {
|
|
622
|
+
if (!Array.isArray(arr)) return "";
|
|
623
|
+
if (separator === void 0) return arr.join(",");
|
|
624
|
+
if (typeof separator === "string") return arr.join(separator);
|
|
625
|
+
if (typeof separator === "number") return arr.join(String(separator));
|
|
626
|
+
return arr.join(",");
|
|
627
|
+
},
|
|
628
|
+
includes: (arr, value) => Array.isArray(arr) ? arr.includes(value) : false,
|
|
629
|
+
if: (condition, ifTrue, ifFalse) => condition ? ifTrue : ifFalse
|
|
630
|
+
};
|
|
571
631
|
function evaluate(expression, context) {
|
|
572
632
|
const trimmed = expression.trim();
|
|
573
633
|
if (!trimmed) {
|
|
574
634
|
throw new Error("Empty expression");
|
|
575
635
|
}
|
|
576
636
|
const fn = subscript_default(trimmed);
|
|
577
|
-
|
|
637
|
+
const safeContext = { ...BUILTIN_FUNCTIONS };
|
|
638
|
+
for (const [key, value] of Object.entries(context)) {
|
|
639
|
+
if (typeof value !== "function") {
|
|
640
|
+
safeContext[key] = value;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
return fn(safeContext);
|
|
578
644
|
}
|
|
579
645
|
var ARITHMETIC_OPS = /* @__PURE__ */ new Set(["+", "-", "*", "/", "%"]);
|
|
580
|
-
var COMPARISON_OPS = /* @__PURE__ */ new Set([
|
|
581
|
-
|
|
582
|
-
">",
|
|
583
|
-
"<=",
|
|
584
|
-
">=",
|
|
585
|
-
"==",
|
|
586
|
-
"!=",
|
|
587
|
-
"===",
|
|
588
|
-
"!=="
|
|
589
|
-
]);
|
|
590
|
-
var LOGICAL_OPS = /* @__PURE__ */ new Set(["&&", "||", "!", "and", "or", "not"]);
|
|
646
|
+
var COMPARISON_OPS = /* @__PURE__ */ new Set(["<", ">", "<=", ">=", "==", "!="]);
|
|
647
|
+
var LOGICAL_OPS = /* @__PURE__ */ new Set(["&&", "||", "!"]);
|
|
591
648
|
var NUMERIC_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
592
649
|
"round",
|
|
593
650
|
"floor",
|
|
@@ -604,7 +661,8 @@ var NUMERIC_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
604
661
|
"sum",
|
|
605
662
|
"avg",
|
|
606
663
|
"count",
|
|
607
|
-
"tonumber"
|
|
664
|
+
"tonumber",
|
|
665
|
+
"length"
|
|
608
666
|
]);
|
|
609
667
|
var STRING_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
610
668
|
"concat",
|
|
@@ -618,6 +676,9 @@ var STRING_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
|
618
676
|
"join"
|
|
619
677
|
]);
|
|
620
678
|
var BOOLEAN_FUNCTIONS = /* @__PURE__ */ new Set([
|
|
679
|
+
"and",
|
|
680
|
+
"or",
|
|
681
|
+
"not",
|
|
621
682
|
"contains",
|
|
622
683
|
"startswith",
|
|
623
684
|
"endswith",
|
|
@@ -647,7 +708,12 @@ function inferLiteralArrayType(node) {
|
|
|
647
708
|
if (typeof val === "boolean") return "boolean";
|
|
648
709
|
return "unknown";
|
|
649
710
|
}
|
|
650
|
-
function inferOperatorType(op, argsLength) {
|
|
711
|
+
function inferOperatorType(op, argsLength, argTypes) {
|
|
712
|
+
if (op === "+" && argTypes) {
|
|
713
|
+
if (argTypes.includes("string")) return "string";
|
|
714
|
+
if (argTypes.includes("unknown")) return "unknown";
|
|
715
|
+
return "number";
|
|
716
|
+
}
|
|
651
717
|
if (ARITHMETIC_OPS.has(op)) return "number";
|
|
652
718
|
if (COMPARISON_OPS.has(op)) return "boolean";
|
|
653
719
|
if (LOGICAL_OPS.has(op)) return "boolean";
|
|
@@ -672,7 +738,8 @@ function inferTypeFromNode(node, fieldTypes) {
|
|
|
672
738
|
if (!Array.isArray(node)) return "unknown";
|
|
673
739
|
if (isLiteralArray(node)) return inferLiteralArrayType(node);
|
|
674
740
|
const [op, ...args] = node;
|
|
675
|
-
const
|
|
741
|
+
const argTypes = op === "+" ? args.map((arg) => inferTypeFromNode(arg, fieldTypes)) : void 0;
|
|
742
|
+
const operatorType = inferOperatorType(op, args.length, argTypes);
|
|
676
743
|
if (operatorType !== null) return operatorType;
|
|
677
744
|
if (op === "." || op === "[]") {
|
|
678
745
|
return inferPropertyAccessType(node, fieldTypes);
|
|
@@ -964,5 +1031,5 @@ exports.validateFormulaAgainstSchema = validateFormulaAgainstSchema;
|
|
|
964
1031
|
exports.validateFormulaSyntax = validateFormulaSyntax;
|
|
965
1032
|
exports.validateSchemaFormulas = validateSchemaFormulas;
|
|
966
1033
|
exports.validateSyntax = validateSyntax;
|
|
967
|
-
//# sourceMappingURL=chunk-
|
|
968
|
-
//# sourceMappingURL=chunk-
|
|
1034
|
+
//# sourceMappingURL=chunk-JJ72EVIZ.cjs.map
|
|
1035
|
+
//# sourceMappingURL=chunk-JJ72EVIZ.cjs.map
|