@kernhq/module-quire 0.4.0 → 0.5.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/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +1 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/properties.d.ts +483 -0
- package/dist/contract/properties.d.ts.map +1 -0
- package/dist/contract/properties.js +175 -0
- package/dist/contract/properties.js.map +1 -0
- package/dist/server/formula.d.ts +49 -0
- package/dist/server/formula.d.ts.map +1 -0
- package/dist/server/formula.js +407 -0
- package/dist/server/formula.js.map +1 -0
- package/dist/server/schema.d.ts +645 -1
- package/dist/server/schema.d.ts.map +1 -1
- package/dist/server/schema.js +85 -1
- package/dist/server/schema.js.map +1 -1
- package/migrations/0004_databases.sql +83 -0
- package/migrations/meta/0004_snapshot.json +1129 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +1 -1
- package/src/client/index.ts +3 -0
- package/src/contract/index.ts +1 -0
- package/src/contract/properties.ts +199 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.js","sourceRoot":"","sources":["../../src/contract/properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The formula language.
|
|
3
|
+
*
|
|
4
|
+
* A hand-written Pratt parser to a typed AST, evaluated by walking it. **Never `eval`, never `new
|
|
5
|
+
* Function`** — a formula is text a workspace member types, it is evaluated on the server, and
|
|
6
|
+
* handing that to the JavaScript engine is arbitrary code execution with the database connection
|
|
7
|
+
* already open.
|
|
8
|
+
*
|
|
9
|
+
* The language is deliberately small: numbers, strings, booleans, dates, `prop("Name")`, the usual
|
|
10
|
+
* operators, and a fixed function table. Anything it cannot express is a column somebody can fill
|
|
11
|
+
* in by hand, which is a better outcome than a language nobody can predict the cost of.
|
|
12
|
+
*/
|
|
13
|
+
export type FormulaValue = number | string | boolean | Date | null;
|
|
14
|
+
export type Ast = {
|
|
15
|
+
kind: 'literal';
|
|
16
|
+
value: FormulaValue;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'prop';
|
|
19
|
+
name: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'unary';
|
|
22
|
+
op: '-' | 'not';
|
|
23
|
+
operand: Ast;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'binary';
|
|
26
|
+
op: string;
|
|
27
|
+
left: Ast;
|
|
28
|
+
right: Ast;
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'call';
|
|
31
|
+
name: string;
|
|
32
|
+
args: Ast[];
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'if';
|
|
35
|
+
cond: Ast;
|
|
36
|
+
then: Ast;
|
|
37
|
+
otherwise: Ast;
|
|
38
|
+
};
|
|
39
|
+
export declare class FormulaError extends Error {
|
|
40
|
+
}
|
|
41
|
+
export declare function parseFormula(input: string): Ast;
|
|
42
|
+
export interface FormulaContext {
|
|
43
|
+
/** the value of a column by *name*, because that is what somebody types in a formula */
|
|
44
|
+
prop(name: string): FormulaValue;
|
|
45
|
+
}
|
|
46
|
+
export declare function evaluateFormula(ast: Ast, ctx: FormulaContext, depth?: number): FormulaValue;
|
|
47
|
+
/** Which columns a formula reads, so a change to one of them can recompute exactly what depends on it. */
|
|
48
|
+
export declare function formulaDependencies(ast: Ast, out?: Set<string>): Set<string>;
|
|
49
|
+
//# sourceMappingURL=formula.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula.d.ts","sourceRoot":"","sources":["../../src/server/formula.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAA;AAElE,MAAM,MAAM,GAAG,GACX;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,GAAG,GAAG,KAAK,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,GAAG,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,GAAG,CAAA;CAAE,CAAA;AAExD,qBAAa,YAAa,SAAQ,KAAK;CAAG;AAyG1C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAgF/C;AAqHD,MAAM,WAAW,cAAc;IAC7B,wFAAwF;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;CACjC;AAKD,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,SAAI,GAAG,YAAY,CAwDtF;AAED,0GAA0G;AAC1G,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,cAAoB,GAAG,GAAG,CAAC,MAAM,CAAC,CAsBlF"}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The formula language.
|
|
3
|
+
*
|
|
4
|
+
* A hand-written Pratt parser to a typed AST, evaluated by walking it. **Never `eval`, never `new
|
|
5
|
+
* Function`** — a formula is text a workspace member types, it is evaluated on the server, and
|
|
6
|
+
* handing that to the JavaScript engine is arbitrary code execution with the database connection
|
|
7
|
+
* already open.
|
|
8
|
+
*
|
|
9
|
+
* The language is deliberately small: numbers, strings, booleans, dates, `prop("Name")`, the usual
|
|
10
|
+
* operators, and a fixed function table. Anything it cannot express is a column somebody can fill
|
|
11
|
+
* in by hand, which is a better outcome than a language nobody can predict the cost of.
|
|
12
|
+
*/
|
|
13
|
+
export class FormulaError extends Error {
|
|
14
|
+
}
|
|
15
|
+
const OPERATORS = [
|
|
16
|
+
'>=',
|
|
17
|
+
'<=',
|
|
18
|
+
'!=',
|
|
19
|
+
'==',
|
|
20
|
+
'&&',
|
|
21
|
+
'||',
|
|
22
|
+
'+',
|
|
23
|
+
'-',
|
|
24
|
+
'*',
|
|
25
|
+
'/',
|
|
26
|
+
'%',
|
|
27
|
+
'^',
|
|
28
|
+
'>',
|
|
29
|
+
'<',
|
|
30
|
+
'=',
|
|
31
|
+
'(',
|
|
32
|
+
')',
|
|
33
|
+
',',
|
|
34
|
+
];
|
|
35
|
+
function lex(input) {
|
|
36
|
+
const out = [];
|
|
37
|
+
let i = 0;
|
|
38
|
+
while (i < input.length) {
|
|
39
|
+
const c = input[i];
|
|
40
|
+
if (/\s/.test(c)) {
|
|
41
|
+
i++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (/[0-9]/.test(c) || (c === '.' && /[0-9]/.test(input[i + 1] ?? ''))) {
|
|
45
|
+
let j = i;
|
|
46
|
+
while (j < input.length && /[0-9.]/.test(input[j]))
|
|
47
|
+
j++;
|
|
48
|
+
const raw = input.slice(i, j);
|
|
49
|
+
const v = Number(raw);
|
|
50
|
+
if (Number.isNaN(v))
|
|
51
|
+
throw new FormulaError(`Not a number: ${raw}`);
|
|
52
|
+
out.push({ t: 'num', v });
|
|
53
|
+
i = j;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (c === '"' || c === "'") {
|
|
57
|
+
let j = i + 1;
|
|
58
|
+
let v = '';
|
|
59
|
+
while (j < input.length && input[j] !== c) {
|
|
60
|
+
if (input[j] === '\\' && j + 1 < input.length) {
|
|
61
|
+
v += input[j + 1];
|
|
62
|
+
j += 2;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
v += input[j];
|
|
66
|
+
j++;
|
|
67
|
+
}
|
|
68
|
+
if (j >= input.length)
|
|
69
|
+
throw new FormulaError('Unterminated string');
|
|
70
|
+
out.push({ t: 'str', v });
|
|
71
|
+
i = j + 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (/[A-Za-z_]/.test(c)) {
|
|
75
|
+
let j = i;
|
|
76
|
+
while (j < input.length && /[A-Za-z0-9_]/.test(input[j]))
|
|
77
|
+
j++;
|
|
78
|
+
out.push({ t: 'name', v: input.slice(i, j) });
|
|
79
|
+
i = j;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const op = OPERATORS.find((o) => input.startsWith(o, i));
|
|
83
|
+
if (!op)
|
|
84
|
+
throw new FormulaError(`Unexpected character: ${c}`);
|
|
85
|
+
out.push({ t: 'op', v: op });
|
|
86
|
+
i += op.length;
|
|
87
|
+
}
|
|
88
|
+
out.push({ t: 'end' });
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
/** ---- parser ---- */
|
|
92
|
+
/** Binding power per infix operator. Higher binds tighter. */
|
|
93
|
+
const BINDING = {
|
|
94
|
+
'||': 1,
|
|
95
|
+
'&&': 2,
|
|
96
|
+
'==': 3,
|
|
97
|
+
'=': 3,
|
|
98
|
+
'!=': 3,
|
|
99
|
+
'>': 4,
|
|
100
|
+
'<': 4,
|
|
101
|
+
'>=': 4,
|
|
102
|
+
'<=': 4,
|
|
103
|
+
'+': 5,
|
|
104
|
+
'-': 5,
|
|
105
|
+
'*': 6,
|
|
106
|
+
'/': 6,
|
|
107
|
+
'%': 6,
|
|
108
|
+
'^': 7,
|
|
109
|
+
};
|
|
110
|
+
export function parseFormula(input) {
|
|
111
|
+
const tokens = lex(input);
|
|
112
|
+
let pos = 0;
|
|
113
|
+
const peek = () => tokens[pos];
|
|
114
|
+
const next = () => tokens[pos++];
|
|
115
|
+
function parseExpression(minBinding = 0) {
|
|
116
|
+
let left = parsePrefix();
|
|
117
|
+
for (;;) {
|
|
118
|
+
const token = peek();
|
|
119
|
+
if (token.t !== 'op')
|
|
120
|
+
break;
|
|
121
|
+
const binding = BINDING[token.v];
|
|
122
|
+
if (binding === undefined || binding < minBinding)
|
|
123
|
+
break;
|
|
124
|
+
next();
|
|
125
|
+
// `^` is right-associative; everything else groups to the left.
|
|
126
|
+
const right = parseExpression(token.v === '^' ? binding : binding + 1);
|
|
127
|
+
left = { kind: 'binary', op: token.v === '=' ? '==' : token.v, left, right };
|
|
128
|
+
}
|
|
129
|
+
return left;
|
|
130
|
+
}
|
|
131
|
+
function parsePrefix() {
|
|
132
|
+
const token = next();
|
|
133
|
+
if (token.t === 'num' || token.t === 'str')
|
|
134
|
+
return { kind: 'literal', value: token.v };
|
|
135
|
+
if (token.t === 'op' && token.v === '-')
|
|
136
|
+
return { kind: 'unary', op: '-', operand: parseExpression(6) };
|
|
137
|
+
if (token.t === 'op' && token.v === '(') {
|
|
138
|
+
const inner = parseExpression();
|
|
139
|
+
expect(')');
|
|
140
|
+
return inner;
|
|
141
|
+
}
|
|
142
|
+
if (token.t === 'name') {
|
|
143
|
+
const name = token.v.toLowerCase();
|
|
144
|
+
const after = peek();
|
|
145
|
+
if (after.t !== 'op' || after.v !== '(') {
|
|
146
|
+
if (name === 'true')
|
|
147
|
+
return { kind: 'literal', value: true };
|
|
148
|
+
if (name === 'false')
|
|
149
|
+
return { kind: 'literal', value: false };
|
|
150
|
+
if (name === 'null' || name === 'empty')
|
|
151
|
+
return { kind: 'literal', value: null };
|
|
152
|
+
throw new FormulaError(`Unknown name: ${token.v}`);
|
|
153
|
+
}
|
|
154
|
+
next();
|
|
155
|
+
const args = [];
|
|
156
|
+
if (!(peek().t === 'op' && peek().v === ')')) {
|
|
157
|
+
for (;;) {
|
|
158
|
+
args.push(parseExpression());
|
|
159
|
+
const sep = peek();
|
|
160
|
+
if (sep.t === 'op' && sep.v === ',') {
|
|
161
|
+
next();
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
expect(')');
|
|
168
|
+
if (name === 'not')
|
|
169
|
+
return { kind: 'unary', op: 'not', operand: args[0] ?? { kind: 'literal', value: null } };
|
|
170
|
+
if (name === 'if') {
|
|
171
|
+
if (args.length !== 3)
|
|
172
|
+
throw new FormulaError('if() takes a condition and two results');
|
|
173
|
+
return { kind: 'if', cond: args[0], then: args[1], otherwise: args[2] };
|
|
174
|
+
}
|
|
175
|
+
if (name === 'prop') {
|
|
176
|
+
const arg = args[0];
|
|
177
|
+
if (!arg || arg.kind !== 'literal' || typeof arg.value !== 'string')
|
|
178
|
+
throw new FormulaError('prop() takes the name of a property, in quotes');
|
|
179
|
+
return { kind: 'prop', name: arg.value };
|
|
180
|
+
}
|
|
181
|
+
const fn = lookupFunction(name);
|
|
182
|
+
if (!fn)
|
|
183
|
+
throw new FormulaError(`Unknown function: ${token.v}`);
|
|
184
|
+
return { kind: 'call', name: fn, args };
|
|
185
|
+
}
|
|
186
|
+
throw new FormulaError('Unexpected end of formula');
|
|
187
|
+
}
|
|
188
|
+
function expect(op) {
|
|
189
|
+
const token = next();
|
|
190
|
+
if (token.t !== 'op' || token.v !== op)
|
|
191
|
+
throw new FormulaError(`Expected ${op}`);
|
|
192
|
+
}
|
|
193
|
+
const ast = parseExpression();
|
|
194
|
+
if (peek().t !== 'end')
|
|
195
|
+
throw new FormulaError('Unexpected trailing input');
|
|
196
|
+
return ast;
|
|
197
|
+
}
|
|
198
|
+
/** ---- evaluator ---- */
|
|
199
|
+
const num = (v) => {
|
|
200
|
+
if (typeof v === 'number')
|
|
201
|
+
return v;
|
|
202
|
+
if (typeof v === 'boolean')
|
|
203
|
+
return v ? 1 : 0;
|
|
204
|
+
if (v instanceof Date)
|
|
205
|
+
return v.getTime();
|
|
206
|
+
if (typeof v === 'string' && v.trim() !== '' && !Number.isNaN(Number(v)))
|
|
207
|
+
return Number(v);
|
|
208
|
+
return 0;
|
|
209
|
+
};
|
|
210
|
+
const str = (v) => {
|
|
211
|
+
if (v === null)
|
|
212
|
+
return '';
|
|
213
|
+
if (v instanceof Date)
|
|
214
|
+
return v.toISOString();
|
|
215
|
+
return String(v);
|
|
216
|
+
};
|
|
217
|
+
const bool = (v) => {
|
|
218
|
+
if (typeof v === 'boolean')
|
|
219
|
+
return v;
|
|
220
|
+
if (typeof v === 'number')
|
|
221
|
+
return v !== 0;
|
|
222
|
+
if (typeof v === 'string')
|
|
223
|
+
return v !== '';
|
|
224
|
+
return v !== null;
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* The function table.
|
|
228
|
+
*
|
|
229
|
+
* Looked up case-insensitively — `dateBetween`, `datebetween` and `DATEBETWEEN` are the same
|
|
230
|
+
* function, because a formula is typed by a person and nobody should have to remember which of
|
|
231
|
+
* these is a name and which is a typo. The names are written in camelCase here for readability and
|
|
232
|
+
* normalised on lookup; keying the object directly by the lowercased name would have made every
|
|
233
|
+
* camelCase function silently unreachable.
|
|
234
|
+
*/
|
|
235
|
+
const FUNCTIONS = {
|
|
236
|
+
// text
|
|
237
|
+
concat: (a) => a.map(str).join(''),
|
|
238
|
+
join: (a) => a
|
|
239
|
+
.slice(1)
|
|
240
|
+
.map(str)
|
|
241
|
+
.join(str(a[0] ?? '')),
|
|
242
|
+
length: (a) => str(a[0] ?? null).length,
|
|
243
|
+
lower: (a) => str(a[0] ?? null).toLowerCase(),
|
|
244
|
+
upper: (a) => str(a[0] ?? null).toUpperCase(),
|
|
245
|
+
trim: (a) => str(a[0] ?? null).trim(),
|
|
246
|
+
contains: (a) => str(a[0] ?? null).includes(str(a[1] ?? null)),
|
|
247
|
+
replace: (a) => str(a[0] ?? null)
|
|
248
|
+
.split(str(a[1] ?? null))
|
|
249
|
+
.join(str(a[2] ?? null)),
|
|
250
|
+
slice: (a) => str(a[0] ?? null).slice(num(a[1] ?? 0), a[2] === undefined ? undefined : num(a[2])),
|
|
251
|
+
format: (a) => str(a[0] ?? null),
|
|
252
|
+
// number
|
|
253
|
+
abs: (a) => Math.abs(num(a[0] ?? 0)),
|
|
254
|
+
round: (a) => {
|
|
255
|
+
const p = 10 ** num(a[1] ?? 0);
|
|
256
|
+
return Math.round(num(a[0] ?? 0) * p) / p;
|
|
257
|
+
},
|
|
258
|
+
floor: (a) => Math.floor(num(a[0] ?? 0)),
|
|
259
|
+
ceil: (a) => Math.ceil(num(a[0] ?? 0)),
|
|
260
|
+
sqrt: (a) => Math.sqrt(num(a[0] ?? 0)),
|
|
261
|
+
min: (a) => (a.length ? Math.min(...a.map(num)) : 0),
|
|
262
|
+
max: (a) => (a.length ? Math.max(...a.map(num)) : 0),
|
|
263
|
+
sum: (a) => a.reduce((t, v) => t + num(v), 0),
|
|
264
|
+
average: (a) => (a.length ? a.reduce((t, v) => t + num(v), 0) / a.length : 0),
|
|
265
|
+
toNumber: (a) => num(a[0] ?? null),
|
|
266
|
+
// logic
|
|
267
|
+
and: (a) => a.every(bool),
|
|
268
|
+
or: (a) => a.some(bool),
|
|
269
|
+
equal: (a) => str(a[0] ?? null) === str(a[1] ?? null),
|
|
270
|
+
// dates
|
|
271
|
+
now: () => new Date(),
|
|
272
|
+
today: () => {
|
|
273
|
+
const d = new Date();
|
|
274
|
+
d.setHours(0, 0, 0, 0);
|
|
275
|
+
return d;
|
|
276
|
+
},
|
|
277
|
+
year: (a) => asDate(a[0] ?? null)?.getFullYear() ?? 0,
|
|
278
|
+
month: (a) => (asDate(a[0] ?? null)?.getMonth() ?? -1) + 1,
|
|
279
|
+
day: (a) => asDate(a[0] ?? null)?.getDate() ?? 0,
|
|
280
|
+
/** whole days between two dates; negative when the second is earlier */
|
|
281
|
+
dateBetween: (a) => {
|
|
282
|
+
const from = asDate(a[0] ?? null);
|
|
283
|
+
const to = asDate(a[1] ?? null);
|
|
284
|
+
if (!from || !to)
|
|
285
|
+
return 0;
|
|
286
|
+
return Math.round((to.getTime() - from.getTime()) / 86_400_000);
|
|
287
|
+
},
|
|
288
|
+
dateAdd: (a) => {
|
|
289
|
+
const d = asDate(a[0] ?? null);
|
|
290
|
+
if (!d)
|
|
291
|
+
return null;
|
|
292
|
+
return new Date(d.getTime() + num(a[1] ?? 0) * 86_400_000);
|
|
293
|
+
},
|
|
294
|
+
// general
|
|
295
|
+
isEmpty: (a) => {
|
|
296
|
+
const v = a[0] ?? null;
|
|
297
|
+
return v === null || v === '' || (Array.isArray(v) && v.length === 0);
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
/** The canonical name of a function, whatever case it was typed in. */
|
|
301
|
+
const FUNCTION_NAMES = new Map();
|
|
302
|
+
function lookupFunction(name) {
|
|
303
|
+
if (FUNCTION_NAMES.size === 0) {
|
|
304
|
+
for (const key of Object.keys(FUNCTIONS))
|
|
305
|
+
FUNCTION_NAMES.set(key.toLowerCase(), key);
|
|
306
|
+
}
|
|
307
|
+
return FUNCTION_NAMES.get(name.toLowerCase()) ?? null;
|
|
308
|
+
}
|
|
309
|
+
function asDate(v) {
|
|
310
|
+
if (v instanceof Date)
|
|
311
|
+
return v;
|
|
312
|
+
if (typeof v === 'string') {
|
|
313
|
+
const d = new Date(v);
|
|
314
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
315
|
+
}
|
|
316
|
+
if (typeof v === 'number')
|
|
317
|
+
return new Date(v);
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
/** How deep a formula may nest before it is refused, so a pathological one cannot blow the stack. */
|
|
321
|
+
const MAX_DEPTH = 64;
|
|
322
|
+
export function evaluateFormula(ast, ctx, depth = 0) {
|
|
323
|
+
if (depth > MAX_DEPTH)
|
|
324
|
+
throw new FormulaError('This formula nests too deeply');
|
|
325
|
+
const evaluate = (node) => evaluateFormula(node, ctx, depth + 1);
|
|
326
|
+
switch (ast.kind) {
|
|
327
|
+
case 'literal':
|
|
328
|
+
return ast.value;
|
|
329
|
+
case 'prop':
|
|
330
|
+
return ctx.prop(ast.name);
|
|
331
|
+
case 'unary':
|
|
332
|
+
return ast.op === '-' ? -num(evaluate(ast.operand)) : !bool(evaluate(ast.operand));
|
|
333
|
+
case 'if':
|
|
334
|
+
return bool(evaluate(ast.cond)) ? evaluate(ast.then) : evaluate(ast.otherwise);
|
|
335
|
+
case 'call': {
|
|
336
|
+
const fn = FUNCTIONS[ast.name];
|
|
337
|
+
if (!fn)
|
|
338
|
+
throw new FormulaError(`Unknown function: ${ast.name}`);
|
|
339
|
+
return fn(ast.args.map(evaluate));
|
|
340
|
+
}
|
|
341
|
+
case 'binary': {
|
|
342
|
+
// Short-circuit before evaluating the right side, so `false && prop("x")` never touches x.
|
|
343
|
+
if (ast.op === '&&')
|
|
344
|
+
return bool(evaluate(ast.left)) ? bool(evaluate(ast.right)) : false;
|
|
345
|
+
if (ast.op === '||')
|
|
346
|
+
return bool(evaluate(ast.left)) ? true : bool(evaluate(ast.right));
|
|
347
|
+
const l = evaluate(ast.left);
|
|
348
|
+
const r = evaluate(ast.right);
|
|
349
|
+
switch (ast.op) {
|
|
350
|
+
case '+':
|
|
351
|
+
// `+` concatenates when either side is text, which is what somebody writing a label wants.
|
|
352
|
+
return typeof l === 'string' || typeof r === 'string' ? str(l) + str(r) : num(l) + num(r);
|
|
353
|
+
case '-':
|
|
354
|
+
return num(l) - num(r);
|
|
355
|
+
case '*':
|
|
356
|
+
return num(l) * num(r);
|
|
357
|
+
case '/':
|
|
358
|
+
// Dividing by nothing is a blank cell, not Infinity and not a crashed table.
|
|
359
|
+
return num(r) === 0 ? null : num(l) / num(r);
|
|
360
|
+
case '%':
|
|
361
|
+
return num(r) === 0 ? null : num(l) % num(r);
|
|
362
|
+
case '^':
|
|
363
|
+
return num(l) ** num(r);
|
|
364
|
+
case '==':
|
|
365
|
+
return str(l) === str(r);
|
|
366
|
+
case '!=':
|
|
367
|
+
return str(l) !== str(r);
|
|
368
|
+
case '>':
|
|
369
|
+
return num(l) > num(r);
|
|
370
|
+
case '<':
|
|
371
|
+
return num(l) < num(r);
|
|
372
|
+
case '>=':
|
|
373
|
+
return num(l) >= num(r);
|
|
374
|
+
case '<=':
|
|
375
|
+
return num(l) <= num(r);
|
|
376
|
+
default:
|
|
377
|
+
throw new FormulaError(`Unknown operator: ${ast.op}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/** Which columns a formula reads, so a change to one of them can recompute exactly what depends on it. */
|
|
383
|
+
export function formulaDependencies(ast, out = new Set()) {
|
|
384
|
+
switch (ast.kind) {
|
|
385
|
+
case 'prop':
|
|
386
|
+
out.add(ast.name);
|
|
387
|
+
break;
|
|
388
|
+
case 'unary':
|
|
389
|
+
formulaDependencies(ast.operand, out);
|
|
390
|
+
break;
|
|
391
|
+
case 'binary':
|
|
392
|
+
formulaDependencies(ast.left, out);
|
|
393
|
+
formulaDependencies(ast.right, out);
|
|
394
|
+
break;
|
|
395
|
+
case 'if':
|
|
396
|
+
formulaDependencies(ast.cond, out);
|
|
397
|
+
formulaDependencies(ast.then, out);
|
|
398
|
+
formulaDependencies(ast.otherwise, out);
|
|
399
|
+
break;
|
|
400
|
+
case 'call':
|
|
401
|
+
for (const arg of ast.args)
|
|
402
|
+
formulaDependencies(arg, out);
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
return out;
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=formula.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formula.js","sourceRoot":"","sources":["../../src/server/formula.ts"],"names":[],"mappings":"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"}
|