@tekki-forge/expression 0.0.0-stage → 0.2.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 CHANGED
@@ -1,3 +1,5 @@
1
- # Temporary Holding Version
1
+ # @tekki-forge/expression
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Safe expression language for Forge computed fields (parser, type checker, evaluator).
4
+
5
+ Part of [Tekki Forge](https://www.npmjs.com/package/tekki-forge), which turns a `forge.config.ts` into a production-ready full-stack app. Apps created with `forge new` install this package for you; see the [tekki-forge](https://www.npmjs.com/package/tekki-forge) package for the documentation.
package/dist/ast.d.ts ADDED
@@ -0,0 +1,56 @@
1
+ /** Static types understood by the expression language. */
2
+ export type ExprType = "number" | "decimal" | "string" | "boolean" | "date" | "datetime" | "any";
3
+ export type AggregateFn = "sum" | "avg" | "min" | "max" | "count";
4
+ export type BinaryOp = "+" | "-" | "*" | "/" | "%" | "==" | "!=" | "<" | "<=" | ">" | ">=" | "and" | "or";
5
+ export type UnaryOp = "-" | "not";
6
+ /**
7
+ * Common node properties.
8
+ * - `pos`: 0-based character offset in the source.
9
+ * - `type`: static type, filled in by `inferType()` (optional; the evaluator uses it
10
+ * when present to pick decimal vs. number arithmetic, date handling, etc.).
11
+ */
12
+ interface NodeBase {
13
+ pos: number;
14
+ type?: ExprType;
15
+ }
16
+ export interface LiteralExpr extends NodeBase {
17
+ kind: "literal";
18
+ value: number | string | boolean | null;
19
+ }
20
+ export interface FieldExpr extends NodeBase {
21
+ kind: "field";
22
+ name: string;
23
+ }
24
+ export interface UnaryExpr extends NodeBase {
25
+ kind: "unary";
26
+ op: UnaryOp;
27
+ operand: Expr;
28
+ }
29
+ export interface BinaryExpr extends NodeBase {
30
+ kind: "binary";
31
+ op: BinaryOp;
32
+ left: Expr;
33
+ right: Expr;
34
+ }
35
+ export interface CallExpr extends NodeBase {
36
+ kind: "call";
37
+ /** Lower-cased function name. */
38
+ name: string;
39
+ args: Expr[];
40
+ }
41
+ export interface AggregateExpr extends NodeBase {
42
+ kind: "aggregate";
43
+ fn: AggregateFn;
44
+ relation: string;
45
+ /** `null` only for `count(relation)`. */
46
+ field: string | null;
47
+ }
48
+ /** JSON-serializable expression AST. */
49
+ export type Expr = LiteralExpr | FieldExpr | UnaryExpr | BinaryExpr | CallExpr | AggregateExpr;
50
+ export declare class ExpressionError extends Error {
51
+ position?: number;
52
+ constructor(message: string, position?: number);
53
+ }
54
+ export declare const MAX_SOURCE_LENGTH = 2000;
55
+ export declare const MAX_DEPTH = 64;
56
+ export {};
package/dist/ast.js ADDED
@@ -0,0 +1,12 @@
1
+ export class ExpressionError extends Error {
2
+ position;
3
+ constructor(message, position) {
4
+ super(message);
5
+ this.name = "ExpressionError";
6
+ if (position !== undefined)
7
+ this.position = position;
8
+ }
9
+ }
10
+ export const MAX_SOURCE_LENGTH = 2000;
11
+ export const MAX_DEPTH = 64;
12
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AA0EA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAU;IAClB,YAAY,OAAe,EAAE,QAAiB;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACvD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { AggregateFn, Expr } from "./ast.js";
2
+ export interface Scope {
3
+ /** Record values (numbers, strings, booleans, Date or ISO strings, decimals as string|number|Decimal-like, null/undefined). */
4
+ fields: Record<string, unknown>;
5
+ /** Resolves aggregates over a relation (e.g. via a DB query). Must return synchronously. */
6
+ aggregate?: (fn: AggregateFn, relation: string, field: string | null) => unknown;
7
+ /** Clock for now()/today(); defaults to new Date(). */
8
+ now?: Date;
9
+ }
10
+ /**
11
+ * Evaluate an expression against a record. Returns number | string | boolean | Date | null.
12
+ * Decimal results are plain strings without exponent notation. Data problems (nulls, division by
13
+ * zero, unparsable values) yield null; only a malformed AST throws.
14
+ */
15
+ export declare function evaluate(expr: Expr, scope: Scope): unknown;
@@ -0,0 +1,443 @@
1
+ import { ExpressionError } from "./ast.js";
2
+ import { D, decToString, isDecimalLike, toDate, toDec, toDecimalString, toNum } from "./values.js";
3
+ const DAY_MS = 86_400_000;
4
+ const MAX_AST_DEPTH = 5000;
5
+ function malformed(what = "Malformed expression node") {
6
+ throw new ExpressionError(what);
7
+ }
8
+ /** Convert a raw value to the canonical runtime representation of a static type. */
9
+ function out(v, t) {
10
+ if (v === undefined || v === null)
11
+ return null;
12
+ switch (t) {
13
+ case "number":
14
+ return toNum(v);
15
+ case "decimal":
16
+ return toDecimalString(v);
17
+ case "date":
18
+ case "datetime":
19
+ return toDate(v);
20
+ case "string":
21
+ if (typeof v === "string")
22
+ return v;
23
+ if (v instanceof Date)
24
+ return Number.isNaN(v.getTime()) ? null : v.toISOString();
25
+ if (typeof v === "number" || typeof v === "boolean" || typeof v === "bigint")
26
+ return String(v);
27
+ return isDecimalLike(v) ? String(v.toString()) : null;
28
+ case "boolean":
29
+ if (typeof v === "boolean")
30
+ return v;
31
+ if (v === 0 || v === 1)
32
+ return v === 1;
33
+ return null;
34
+ default:
35
+ if (typeof v === "number")
36
+ return Number.isFinite(v) ? v : null;
37
+ if (typeof v === "bigint")
38
+ return v.toString();
39
+ if (v instanceof Date)
40
+ return Number.isNaN(v.getTime()) ? null : v;
41
+ if (typeof v === "string" || typeof v === "boolean")
42
+ return v;
43
+ if (isDecimalLike(v))
44
+ return toDecimalString(v);
45
+ return null;
46
+ }
47
+ }
48
+ function kindOf(v, t) {
49
+ switch (t) {
50
+ case "number":
51
+ case "decimal":
52
+ return "numeric";
53
+ case "date":
54
+ case "datetime":
55
+ return "date";
56
+ case "string":
57
+ return "string";
58
+ case "boolean":
59
+ return "boolean";
60
+ }
61
+ if (v instanceof Date)
62
+ return "date";
63
+ if (typeof v === "number" || typeof v === "bigint" || isDecimalLike(v))
64
+ return "numeric";
65
+ if (typeof v === "string")
66
+ return "string";
67
+ if (typeof v === "boolean")
68
+ return "boolean";
69
+ return "unknown";
70
+ }
71
+ /** Three-way compare; null when the values are not comparable. */
72
+ function compare(l, r, lt, rt) {
73
+ let kl = kindOf(l, lt);
74
+ let kr = kindOf(r, rt);
75
+ // Untyped strings are coerced towards the other side's kind (e.g. "12.5" vs a number).
76
+ if (kl === "string" && lt !== "string" && (kr === "numeric" || kr === "date"))
77
+ kl = kr;
78
+ if (kr === "string" && rt !== "string" && (kl === "numeric" || kl === "date"))
79
+ kr = kl;
80
+ if (kl !== kr)
81
+ return null;
82
+ switch (kl) {
83
+ case "numeric": {
84
+ const a = toDec(l);
85
+ const b = toDec(r);
86
+ return a && b ? a.cmp(b) : null;
87
+ }
88
+ case "date": {
89
+ const a = toDate(l);
90
+ const b = toDate(r);
91
+ return a && b ? Math.sign(a.getTime() - b.getTime()) : null;
92
+ }
93
+ case "string": {
94
+ const a = String(l);
95
+ const b = String(r);
96
+ return a < b ? -1 : a > b ? 1 : 0;
97
+ }
98
+ case "boolean":
99
+ if (typeof l !== "boolean" || typeof r !== "boolean")
100
+ return null;
101
+ return l === r ? 0 : l ? 1 : -1;
102
+ default:
103
+ return null;
104
+ }
105
+ }
106
+ function toBool(v) {
107
+ return typeof v === "boolean" ? v : null;
108
+ }
109
+ /** Decide whether a numeric node computes with JS numbers or decimals. */
110
+ function useDecimal(t, values) {
111
+ if (t === "decimal")
112
+ return true;
113
+ if (t === "number")
114
+ return false;
115
+ return !values.every((v) => typeof v === "number");
116
+ }
117
+ function numResult(n) {
118
+ return Number.isFinite(n) ? (Object.is(n, -0) ? 0 : n) : null;
119
+ }
120
+ function evalBinary(e, c, depth) {
121
+ if (e.op === "and" || e.op === "or") {
122
+ const l = toBool(ev(e.left, c, depth + 1));
123
+ if (e.op === "and" && l === false)
124
+ return false;
125
+ if (e.op === "or" && l === true)
126
+ return true;
127
+ const r = toBool(ev(e.right, c, depth + 1));
128
+ if (e.op === "and")
129
+ return r === false ? false : l === null || r === null ? null : true;
130
+ return r === true ? true : l === null || r === null ? null : false;
131
+ }
132
+ const l = ev(e.left, c, depth + 1);
133
+ const r = ev(e.right, c, depth + 1);
134
+ if (l === null || r === null)
135
+ return null;
136
+ switch (e.op) {
137
+ case "==":
138
+ case "!=": {
139
+ const cmp = compare(l, r, e.left.type, e.right.type);
140
+ const eq = cmp === 0;
141
+ return e.op === "==" ? eq : !eq;
142
+ }
143
+ case "<":
144
+ case "<=":
145
+ case ">":
146
+ case ">=": {
147
+ const cmp = compare(l, r, e.left.type, e.right.type);
148
+ if (cmp === null)
149
+ return null;
150
+ return e.op === "<" ? cmp < 0 : e.op === "<=" ? cmp <= 0 : e.op === ">" ? cmp > 0 : cmp >= 0;
151
+ }
152
+ case "+":
153
+ case "-":
154
+ case "*":
155
+ case "/":
156
+ case "%": {
157
+ if (useDecimal(e.type, [l, r])) {
158
+ const a = toDec(l);
159
+ const b = toDec(r);
160
+ if (!a || !b)
161
+ return null;
162
+ let res;
163
+ switch (e.op) {
164
+ case "+":
165
+ res = a.plus(b);
166
+ break;
167
+ case "-":
168
+ res = a.minus(b);
169
+ break;
170
+ case "*":
171
+ res = a.times(b);
172
+ break;
173
+ case "/":
174
+ if (b.isZero())
175
+ return null;
176
+ res = a.div(b);
177
+ break;
178
+ case "%":
179
+ if (b.isZero())
180
+ return null;
181
+ res = a.mod(b);
182
+ break;
183
+ }
184
+ return decToString(res);
185
+ }
186
+ const a = toNum(l);
187
+ const b = toNum(r);
188
+ if (a === null || b === null)
189
+ return null;
190
+ switch (e.op) {
191
+ case "+":
192
+ return numResult(a + b);
193
+ case "-":
194
+ return numResult(a - b);
195
+ case "*":
196
+ return numResult(a * b);
197
+ case "/":
198
+ return b === 0 ? null : numResult(a / b);
199
+ case "%":
200
+ return b === 0 ? null : numResult(a % b);
201
+ }
202
+ }
203
+ }
204
+ return malformed(`Unknown operator "${String(e.op)}"`);
205
+ }
206
+ /** Apply a Decimal operation, returning a decimal string or number depending on mode. */
207
+ function numericFn(t, x, f) {
208
+ const d = toDec(x);
209
+ if (!d)
210
+ return null;
211
+ const r = f(d);
212
+ if (useDecimal(t, [x]))
213
+ return decToString(r);
214
+ return numResult(r.toNumber());
215
+ }
216
+ function roundDec(d, digits) {
217
+ if (digits >= 0)
218
+ return d.toDecimalPlaces(digits, D.ROUND_HALF_UP);
219
+ const f = new D(10).pow(-digits);
220
+ return d.div(f).toDecimalPlaces(0, D.ROUND_HALF_UP).times(f);
221
+ }
222
+ function formatForConcat(v, t) {
223
+ if (v === null || v === undefined)
224
+ return "";
225
+ if (typeof v === "string")
226
+ return v;
227
+ if (v instanceof Date) {
228
+ if (Number.isNaN(v.getTime()))
229
+ return "";
230
+ const iso = v.toISOString();
231
+ return t === "date" ? iso.slice(0, 10) : iso;
232
+ }
233
+ if (typeof v === "number" || typeof v === "boolean" || typeof v === "bigint")
234
+ return String(v);
235
+ if (isDecimalLike(v))
236
+ return toDecimalString(v) ?? String(v.toString());
237
+ return "";
238
+ }
239
+ function evalCall(e, c, depth) {
240
+ if (!Array.isArray(e.args))
241
+ malformed();
242
+ const args = e.args;
243
+ const argc = args.length;
244
+ const arity = (min, max = min) => {
245
+ if (argc < min || argc > max)
246
+ malformed(`Function ${e.name} called with ${argc} arguments`);
247
+ };
248
+ const arg = (i) => ev(args[i], c, depth + 1);
249
+ switch (e.name) {
250
+ case "round": {
251
+ arity(1, 2);
252
+ const x = arg(0);
253
+ if (x === null)
254
+ return null;
255
+ let digits = 0;
256
+ if (argc === 2) {
257
+ const dv = toNum(arg(1));
258
+ if (dv === null)
259
+ return null;
260
+ digits = Math.max(-100, Math.min(100, Math.trunc(dv)));
261
+ }
262
+ return numericFn(e.type, x, (d) => roundDec(d, digits));
263
+ }
264
+ case "floor":
265
+ case "ceil":
266
+ case "abs": {
267
+ arity(1);
268
+ const x = arg(0);
269
+ if (x === null)
270
+ return null;
271
+ return numericFn(e.type, x, (d) => (e.name === "floor" ? d.floor() : e.name === "ceil" ? d.ceil() : d.abs()));
272
+ }
273
+ case "min":
274
+ case "max": {
275
+ if (argc < 2)
276
+ malformed(`Function ${e.name} called with ${argc} arguments`);
277
+ let best = null;
278
+ let bestType;
279
+ for (let i = 0; i < argc; i++) {
280
+ const v = arg(i);
281
+ if (v === null)
282
+ return null;
283
+ const vt = args[i].type;
284
+ if (i === 0) {
285
+ best = v;
286
+ bestType = vt;
287
+ continue;
288
+ }
289
+ const cmp = compare(v, best, vt, bestType);
290
+ if (cmp === null)
291
+ return null;
292
+ if (e.name === "min" ? cmp < 0 : cmp > 0) {
293
+ best = v;
294
+ bestType = vt;
295
+ }
296
+ }
297
+ return best;
298
+ }
299
+ case "coalesce": {
300
+ arity(1, Infinity);
301
+ for (let i = 0; i < argc; i++) {
302
+ const v = arg(i);
303
+ if (v !== null)
304
+ return v;
305
+ }
306
+ return null;
307
+ }
308
+ case "concat": {
309
+ arity(1, Infinity);
310
+ let s = "";
311
+ for (let i = 0; i < argc; i++)
312
+ s += formatForConcat(arg(i), args[i].type);
313
+ return s;
314
+ }
315
+ case "upper":
316
+ case "lower":
317
+ case "trim":
318
+ case "length": {
319
+ arity(1);
320
+ const v = arg(0);
321
+ if (v === null)
322
+ return null;
323
+ const s = typeof v === "string" ? v : formatForConcat(v, args[0].type);
324
+ if (e.name === "upper")
325
+ return s.toUpperCase();
326
+ if (e.name === "lower")
327
+ return s.toLowerCase();
328
+ if (e.name === "trim")
329
+ return s.trim();
330
+ return s.length;
331
+ }
332
+ case "if": {
333
+ arity(3);
334
+ return toBool(arg(0)) === true ? arg(1) : arg(2);
335
+ }
336
+ case "now":
337
+ arity(0);
338
+ return new Date(c.now.getTime());
339
+ case "today":
340
+ arity(0);
341
+ return new Date(Date.UTC(c.now.getUTCFullYear(), c.now.getUTCMonth(), c.now.getUTCDate()));
342
+ case "days_between": {
343
+ arity(2);
344
+ const a = toDate(arg(0));
345
+ const b = toDate(arg(1));
346
+ if (!a || !b)
347
+ return null;
348
+ return numResult(Math.floor((b.getTime() - a.getTime()) / DAY_MS));
349
+ }
350
+ case "add_days": {
351
+ arity(2);
352
+ const d = toDate(arg(0));
353
+ const n = toNum(arg(1));
354
+ if (!d || n === null)
355
+ return null;
356
+ const r = new Date(d.getTime() + Math.trunc(n) * DAY_MS);
357
+ return Number.isNaN(r.getTime()) ? null : r;
358
+ }
359
+ case "year":
360
+ case "month":
361
+ case "day": {
362
+ arity(1);
363
+ const d = toDate(arg(0));
364
+ if (!d)
365
+ return null;
366
+ return e.name === "year" ? d.getUTCFullYear() : e.name === "month" ? d.getUTCMonth() + 1 : d.getUTCDate();
367
+ }
368
+ default:
369
+ return malformed(`Unknown function "${e.name}"`);
370
+ }
371
+ }
372
+ function ev(e, c, depth) {
373
+ if (depth > MAX_AST_DEPTH)
374
+ malformed("Expression is nested too deeply");
375
+ if (typeof e !== "object" || e === null)
376
+ malformed();
377
+ let v;
378
+ switch (e.kind) {
379
+ case "literal":
380
+ v = e.value;
381
+ break;
382
+ case "field":
383
+ if (typeof e.name !== "string")
384
+ malformed();
385
+ v = Object.hasOwn(c.fields, e.name) ? c.fields[e.name] : null;
386
+ break;
387
+ case "unary": {
388
+ const o = ev(e.operand, c, depth + 1);
389
+ if (e.op === "not") {
390
+ const b = toBool(o);
391
+ v = b === null ? null : !b;
392
+ }
393
+ else if (e.op === "-") {
394
+ if (o === null)
395
+ v = null;
396
+ else if (useDecimal(e.type, [o])) {
397
+ const d = toDec(o);
398
+ v = d ? decToString(d.neg()) : null;
399
+ }
400
+ else {
401
+ const n = toNum(o);
402
+ v = n === null ? null : numResult(-n);
403
+ }
404
+ }
405
+ else
406
+ malformed();
407
+ break;
408
+ }
409
+ case "binary":
410
+ v = evalBinary(e, c, depth);
411
+ break;
412
+ case "call":
413
+ if (typeof e.name !== "string")
414
+ malformed();
415
+ v = evalCall(e, c, depth);
416
+ break;
417
+ case "aggregate": {
418
+ if (!c.aggregate) {
419
+ v = null;
420
+ break;
421
+ }
422
+ v = c.aggregate(e.fn, e.relation, e.field ?? null);
423
+ // Asynchronous results cannot be used by the synchronous evaluator.
424
+ if (v !== null && typeof v === "object" && typeof v.then === "function")
425
+ v = null;
426
+ break;
427
+ }
428
+ default:
429
+ malformed();
430
+ }
431
+ return out(v, e.type);
432
+ }
433
+ /**
434
+ * Evaluate an expression against a record. Returns number | string | boolean | Date | null.
435
+ * Decimal results are plain strings without exponent notation. Data problems (nulls, division by
436
+ * zero, unparsable values) yield null; only a malformed AST throws.
437
+ */
438
+ export function evaluate(expr, scope) {
439
+ const now = scope.now instanceof Date && !Number.isNaN(scope.now.getTime()) ? scope.now : new Date();
440
+ const fields = scope.fields ?? {};
441
+ return ev(expr, { fields, aggregate: scope.aggregate, now }, 0);
442
+ }
443
+ //# sourceMappingURL=evaluate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { ExpressionError } from "./ast.js";
2
+ export type { AggregateExpr, AggregateFn, BinaryExpr, BinaryOp, CallExpr, Expr, ExprType, FieldExpr, LiteralExpr, UnaryExpr, UnaryOp, } from "./ast.js";
3
+ export { parseExpression } from "./parser.js";
4
+ export { inferType } from "./typecheck.js";
5
+ export type { TypeEnv } from "./typecheck.js";
6
+ export { evaluate } from "./evaluate.js";
7
+ export type { Scope } from "./evaluate.js";
8
+ export { references } from "./references.js";
9
+ export type { References } from "./references.js";
10
+ export { toDecimalString } from "./values.js";
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { ExpressionError } from "./ast.js";
2
+ export { parseExpression } from "./parser.js";
3
+ export { inferType } from "./typecheck.js";
4
+ export { evaluate } from "./evaluate.js";
5
+ export { references } from "./references.js";
6
+ export { toDecimalString } from "./values.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAc3C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Expr } from "./ast.js";
2
+ /** Parse source text into a JSON-serializable AST. Throws ExpressionError with position. */
3
+ export declare function parseExpression(source: string): Expr;