@bilig/formula 0.1.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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/addressing.d.ts +66 -0
  4. package/dist/addressing.js +179 -0
  5. package/dist/addressing.js.map +1 -0
  6. package/dist/ast.d.ts +74 -0
  7. package/dist/ast.js +2 -0
  8. package/dist/ast.js.map +1 -0
  9. package/dist/binder.d.ts +13 -0
  10. package/dist/binder.js +1700 -0
  11. package/dist/binder.js.map +1 -0
  12. package/dist/builtin-capabilities.d.ts +19 -0
  13. package/dist/builtin-capabilities.js +861 -0
  14. package/dist/builtin-capabilities.js.map +1 -0
  15. package/dist/builtins/complex.d.ts +10 -0
  16. package/dist/builtins/complex.js +407 -0
  17. package/dist/builtins/complex.js.map +1 -0
  18. package/dist/builtins/convert.d.ts +3 -0
  19. package/dist/builtins/convert.js +362 -0
  20. package/dist/builtins/convert.js.map +1 -0
  21. package/dist/builtins/datetime.d.ts +23 -0
  22. package/dist/builtins/datetime.js +1096 -0
  23. package/dist/builtins/datetime.js.map +1 -0
  24. package/dist/builtins/distribution-builtins.d.ts +16 -0
  25. package/dist/builtins/distribution-builtins.js +517 -0
  26. package/dist/builtins/distribution-builtins.js.map +1 -0
  27. package/dist/builtins/distributions.d.ts +34 -0
  28. package/dist/builtins/distributions.js +722 -0
  29. package/dist/builtins/distributions.js.map +1 -0
  30. package/dist/builtins/financial-builtins.d.ts +16 -0
  31. package/dist/builtins/financial-builtins.js +324 -0
  32. package/dist/builtins/financial-builtins.js.map +1 -0
  33. package/dist/builtins/financial.d.ts +11 -0
  34. package/dist/builtins/financial.js +241 -0
  35. package/dist/builtins/financial.js.map +1 -0
  36. package/dist/builtins/fixed-income-builtins.d.ts +14 -0
  37. package/dist/builtins/fixed-income-builtins.js +598 -0
  38. package/dist/builtins/fixed-income-builtins.js.map +1 -0
  39. package/dist/builtins/fixed-income.d.ts +42 -0
  40. package/dist/builtins/fixed-income.js +668 -0
  41. package/dist/builtins/fixed-income.js.map +1 -0
  42. package/dist/builtins/formatting.d.ts +8 -0
  43. package/dist/builtins/formatting.js +53 -0
  44. package/dist/builtins/formatting.js.map +1 -0
  45. package/dist/builtins/logical.d.ts +4 -0
  46. package/dist/builtins/logical.js +258 -0
  47. package/dist/builtins/logical.js.map +1 -0
  48. package/dist/builtins/lookup-array-shape-builtins.d.ts +21 -0
  49. package/dist/builtins/lookup-array-shape-builtins.js +517 -0
  50. package/dist/builtins/lookup-array-shape-builtins.js.map +1 -0
  51. package/dist/builtins/lookup-criteria-builtins.d.ts +16 -0
  52. package/dist/builtins/lookup-criteria-builtins.js +216 -0
  53. package/dist/builtins/lookup-criteria-builtins.js.map +1 -0
  54. package/dist/builtins/lookup-database-builtins.d.ts +17 -0
  55. package/dist/builtins/lookup-database-builtins.js +294 -0
  56. package/dist/builtins/lookup-database-builtins.js.map +1 -0
  57. package/dist/builtins/lookup-financial-builtins.d.ts +11 -0
  58. package/dist/builtins/lookup-financial-builtins.js +291 -0
  59. package/dist/builtins/lookup-financial-builtins.js.map +1 -0
  60. package/dist/builtins/lookup-hypothesis-builtins.d.ts +11 -0
  61. package/dist/builtins/lookup-hypothesis-builtins.js +57 -0
  62. package/dist/builtins/lookup-hypothesis-builtins.js.map +1 -0
  63. package/dist/builtins/lookup-matrix-builtins.d.ts +17 -0
  64. package/dist/builtins/lookup-matrix-builtins.js +218 -0
  65. package/dist/builtins/lookup-matrix-builtins.js.map +1 -0
  66. package/dist/builtins/lookup-order-statistics-builtins.d.ts +18 -0
  67. package/dist/builtins/lookup-order-statistics-builtins.js +575 -0
  68. package/dist/builtins/lookup-order-statistics-builtins.js.map +1 -0
  69. package/dist/builtins/lookup-reference-builtins.d.ts +18 -0
  70. package/dist/builtins/lookup-reference-builtins.js +300 -0
  71. package/dist/builtins/lookup-reference-builtins.js.map +1 -0
  72. package/dist/builtins/lookup-regression-builtins.d.ts +12 -0
  73. package/dist/builtins/lookup-regression-builtins.js +511 -0
  74. package/dist/builtins/lookup-regression-builtins.js.map +1 -0
  75. package/dist/builtins/lookup-sort-filter-builtins.d.ts +20 -0
  76. package/dist/builtins/lookup-sort-filter-builtins.js +382 -0
  77. package/dist/builtins/lookup-sort-filter-builtins.js.map +1 -0
  78. package/dist/builtins/lookup.d.ts +13 -0
  79. package/dist/builtins/lookup.js +867 -0
  80. package/dist/builtins/lookup.js.map +1 -0
  81. package/dist/builtins/math-builtins.d.ts +31 -0
  82. package/dist/builtins/math-builtins.js +420 -0
  83. package/dist/builtins/math-builtins.js.map +1 -0
  84. package/dist/builtins/numeric.d.ts +30 -0
  85. package/dist/builtins/numeric.js +150 -0
  86. package/dist/builtins/numeric.js.map +1 -0
  87. package/dist/builtins/placeholder.d.ts +9 -0
  88. package/dist/builtins/placeholder.js +540 -0
  89. package/dist/builtins/placeholder.js.map +1 -0
  90. package/dist/builtins/radix.d.ts +12 -0
  91. package/dist/builtins/radix.js +220 -0
  92. package/dist/builtins/radix.js.map +1 -0
  93. package/dist/builtins/statistical-builtins.d.ts +13 -0
  94. package/dist/builtins/statistical-builtins.js +240 -0
  95. package/dist/builtins/statistical-builtins.js.map +1 -0
  96. package/dist/builtins/statistics.d.ts +8 -0
  97. package/dist/builtins/statistics.js +74 -0
  98. package/dist/builtins/statistics.js.map +1 -0
  99. package/dist/builtins/text.d.ts +5 -0
  100. package/dist/builtins/text.js +1879 -0
  101. package/dist/builtins/text.js.map +1 -0
  102. package/dist/builtins.d.ts +8 -0
  103. package/dist/builtins.js +695 -0
  104. package/dist/builtins.js.map +1 -0
  105. package/dist/compatibility.d.ts +25 -0
  106. package/dist/compatibility.js +498 -0
  107. package/dist/compatibility.js.map +1 -0
  108. package/dist/compiler.d.ts +29 -0
  109. package/dist/compiler.js +474 -0
  110. package/dist/compiler.js.map +1 -0
  111. package/dist/external-function-adapter.d.ts +32 -0
  112. package/dist/external-function-adapter.js +42 -0
  113. package/dist/external-function-adapter.js.map +1 -0
  114. package/dist/generated/formula-inventory.d.ts +6839 -0
  115. package/dist/generated/formula-inventory.js +7368 -0
  116. package/dist/generated/formula-inventory.js.map +1 -0
  117. package/dist/group-pivot-evaluator.d.ts +28 -0
  118. package/dist/group-pivot-evaluator.js +435 -0
  119. package/dist/group-pivot-evaluator.js.map +1 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +17 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/js-evaluator.d.ts +107 -0
  124. package/dist/js-evaluator.js +1651 -0
  125. package/dist/js-evaluator.js.map +1 -0
  126. package/dist/lexer.d.ts +6 -0
  127. package/dist/lexer.js +115 -0
  128. package/dist/lexer.js.map +1 -0
  129. package/dist/optimizer.d.ts +2 -0
  130. package/dist/optimizer.js +353 -0
  131. package/dist/optimizer.js.map +1 -0
  132. package/dist/parser.d.ts +2 -0
  133. package/dist/parser.js +352 -0
  134. package/dist/parser.js.map +1 -0
  135. package/dist/program-arena.d.ts +22 -0
  136. package/dist/program-arena.js +67 -0
  137. package/dist/program-arena.js.map +1 -0
  138. package/dist/runtime-values.d.ts +17 -0
  139. package/dist/runtime-values.js +11 -0
  140. package/dist/runtime-values.js.map +1 -0
  141. package/dist/special-call-rewrites.d.ts +2 -0
  142. package/dist/special-call-rewrites.js +74 -0
  143. package/dist/special-call-rewrites.js.map +1 -0
  144. package/dist/translation.d.ts +28 -0
  145. package/dist/translation.js +569 -0
  146. package/dist/translation.js.map +1 -0
  147. package/package.json +53 -0
package/dist/binder.js ADDED
@@ -0,0 +1,1700 @@
1
+ import { BuiltinId, FormulaMode, MAX_WASM_RANGE_CELLS } from "@bilig/protocol";
2
+ import { builtinWasmEnabledNames } from "./builtin-capabilities.js";
3
+ import { formatRangeAddress, parseRangeAddress } from "./addressing.js";
4
+ import { hasBuiltin } from "./builtins.js";
5
+ import { rewriteSpecialCall } from "./special-call-rewrites.js";
6
+ function assertNever(value) {
7
+ throw new Error(`Unexpected formula node: ${JSON.stringify(value)}`);
8
+ }
9
+ const RANGE_SAFE_BUILTINS = new Set([
10
+ "SUM",
11
+ "AVG",
12
+ "AVERAGE",
13
+ "MIN",
14
+ "MAX",
15
+ "COUNT",
16
+ "COUNTA",
17
+ "COUNTBLANK",
18
+ "PRODUCT",
19
+ "GEOMEAN",
20
+ "HARMEAN",
21
+ "SUMSQ",
22
+ "GCD",
23
+ "LCM",
24
+ "MODE",
25
+ "MODE.SNGL",
26
+ "STDEV",
27
+ "STDEV.P",
28
+ "STDEV.S",
29
+ "STDEVA",
30
+ "STDEVP",
31
+ "STDEVPA",
32
+ "VAR",
33
+ "VAR.P",
34
+ "VAR.S",
35
+ "VARA",
36
+ "VARP",
37
+ "VARPA",
38
+ "SKEW",
39
+ "SKEW.P",
40
+ "KURT",
41
+ ]);
42
+ const AXIS_AGGREGATE_CODES = new Map([
43
+ ["SUM", 1],
44
+ ["AVERAGE", 2],
45
+ ["AVG", 2],
46
+ ["MIN", 3],
47
+ ["MAX", 4],
48
+ ["COUNT", 5],
49
+ ["COUNTA", 6],
50
+ ]);
51
+ function isCellRangeNode(node) {
52
+ if (node.kind !== "RangeRef") {
53
+ return false;
54
+ }
55
+ try {
56
+ const sheetPrefix = node.sheetName ? `${node.sheetName}!` : "";
57
+ return parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`).kind === "cells";
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ function getNativeAxisAggregateCode(node) {
64
+ if (node.kind !== "CallExpr" ||
65
+ node.callee.toUpperCase() !== "LAMBDA" ||
66
+ node.args.length !== 2) {
67
+ return null;
68
+ }
69
+ const [param, body] = node.args;
70
+ if (param?.kind !== "NameRef" || body?.kind !== "CallExpr" || body.args.length !== 1) {
71
+ return null;
72
+ }
73
+ const aggregateCode = AXIS_AGGREGATE_CODES.get(body.callee.toUpperCase());
74
+ if (aggregateCode === undefined) {
75
+ return null;
76
+ }
77
+ return body.args[0]?.kind === "NameRef" &&
78
+ body.args[0].name.trim().toUpperCase() === param.name.trim().toUpperCase()
79
+ ? aggregateCode
80
+ : null;
81
+ }
82
+ function getNativeRunningFoldCode(node) {
83
+ if (node.kind !== "CallExpr" ||
84
+ node.callee.toUpperCase() !== "LAMBDA" ||
85
+ node.args.length !== 3) {
86
+ return null;
87
+ }
88
+ const [acc, value, body] = node.args;
89
+ if (acc?.kind !== "NameRef" || value?.kind !== "NameRef" || body?.kind !== "BinaryExpr") {
90
+ return null;
91
+ }
92
+ const foldCode = body.operator === "+" ? 1 : body.operator === "*" ? 2 : null;
93
+ if (foldCode === null) {
94
+ return null;
95
+ }
96
+ const left = body.left;
97
+ const right = body.right;
98
+ const accName = acc.name.trim().toUpperCase();
99
+ const valueName = value.name.trim().toUpperCase();
100
+ return left.kind === "NameRef" &&
101
+ right.kind === "NameRef" &&
102
+ ((left.name.trim().toUpperCase() === accName &&
103
+ right.name.trim().toUpperCase() === valueName) ||
104
+ (left.name.trim().toUpperCase() === valueName && right.name.trim().toUpperCase() === accName))
105
+ ? foldCode
106
+ : null;
107
+ }
108
+ function isNativeMakearraySumLambda(node) {
109
+ if (node.kind !== "CallExpr" ||
110
+ node.callee.toUpperCase() !== "LAMBDA" ||
111
+ node.args.length !== 3) {
112
+ return false;
113
+ }
114
+ const [rowParam, colParam, body] = node.args;
115
+ if (rowParam?.kind !== "NameRef" || colParam?.kind !== "NameRef" || body?.kind !== "BinaryExpr") {
116
+ return false;
117
+ }
118
+ if (body.operator !== "+") {
119
+ return false;
120
+ }
121
+ const left = body.left;
122
+ const right = body.right;
123
+ const rowName = rowParam.name.trim().toUpperCase();
124
+ const colName = colParam.name.trim().toUpperCase();
125
+ return (left.kind === "NameRef" &&
126
+ right.kind === "NameRef" &&
127
+ ((left.name.trim().toUpperCase() === rowName && right.name.trim().toUpperCase() === colName) ||
128
+ (left.name.trim().toUpperCase() === colName && right.name.trim().toUpperCase() === rowName)));
129
+ }
130
+ function isCellVectorNode(node) {
131
+ if (node.kind !== "RangeRef") {
132
+ return false;
133
+ }
134
+ try {
135
+ const sheetPrefix = node.sheetName ? `${node.sheetName}!` : "";
136
+ const range = parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`);
137
+ return (range.kind === "cells" &&
138
+ (range.start.row === range.end.row || range.start.col === range.end.col));
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ function isWasmSafeBuiltinArity(callee, argc) {
145
+ switch (callee) {
146
+ case "NOT":
147
+ case "LEN":
148
+ case "YEAR":
149
+ case "MONTH":
150
+ case "DAY":
151
+ case "HOUR":
152
+ case "MINUTE":
153
+ case "SECOND":
154
+ case "INT":
155
+ case "SIN":
156
+ case "COS":
157
+ case "TAN":
158
+ case "ASIN":
159
+ case "ACOS":
160
+ case "ATAN":
161
+ case "DEGREES":
162
+ case "RADIANS":
163
+ case "EXP":
164
+ case "LN":
165
+ case "LOG10":
166
+ case "SQRT":
167
+ return argc === 1;
168
+ case "TODAY":
169
+ case "NOW":
170
+ case "RAND":
171
+ return argc === 0;
172
+ case "NA":
173
+ return argc === 0;
174
+ case "IF":
175
+ return argc === 3;
176
+ case "IFS":
177
+ return argc >= 2 && argc % 2 === 0;
178
+ case "IFERROR":
179
+ case "IFNA":
180
+ return argc === 2;
181
+ case "WEEKDAY":
182
+ return argc === 1 || argc === 2;
183
+ case "DAYS":
184
+ return argc === 2;
185
+ case "COUNTBLANK":
186
+ return argc >= 1;
187
+ case "CHOOSE":
188
+ return argc >= 2;
189
+ case "DAYS360":
190
+ case "YEARFRAC":
191
+ return argc === 2 || argc === 3;
192
+ case "DISC":
193
+ case "INTRATE":
194
+ case "RECEIVED":
195
+ case "PRICEDISC":
196
+ case "YIELDDISC":
197
+ return argc === 4 || argc === 5;
198
+ case "COUPDAYBS":
199
+ case "COUPDAYS":
200
+ case "COUPDAYSNC":
201
+ case "COUPNCD":
202
+ case "COUPNUM":
203
+ case "COUPPCD":
204
+ return argc === 3 || argc === 4;
205
+ case "PRICEMAT":
206
+ case "YIELDMAT":
207
+ case "DURATION":
208
+ case "MDURATION":
209
+ return argc === 5 || argc === 6;
210
+ case "ODDFPRICE":
211
+ case "ODDFYIELD":
212
+ case "ODDLPRICE":
213
+ case "ODDLYIELD":
214
+ return argc === 7 || argc === 8;
215
+ case "TBILLPRICE":
216
+ case "TBILLYIELD":
217
+ case "TBILLEQ":
218
+ return argc === 3;
219
+ case "IRR":
220
+ return argc === 1 || argc === 2;
221
+ case "MIRR":
222
+ return argc === 3;
223
+ case "XNPV":
224
+ return argc === 3;
225
+ case "XIRR":
226
+ return argc === 2 || argc === 3;
227
+ case "PRICE":
228
+ case "YIELD":
229
+ return argc === 6 || argc === 7;
230
+ case "ISOWEEKNUM":
231
+ case "TIMEVALUE":
232
+ return argc === 1;
233
+ case "WEEKNUM":
234
+ return argc === 1 || argc === 2;
235
+ case "WORKDAY":
236
+ case "NETWORKDAYS":
237
+ return argc === 2 || argc === 3;
238
+ case "WORKDAY.INTL":
239
+ case "NETWORKDAYS.INTL":
240
+ return argc >= 2 && argc <= 4;
241
+ case "COUNTIF":
242
+ case "USE.THE.COUNTIF":
243
+ return argc === 2;
244
+ case "COUNTIFS":
245
+ return argc >= 2 && argc % 2 === 0;
246
+ case "DAVERAGE":
247
+ case "DCOUNT":
248
+ case "DCOUNTA":
249
+ case "DGET":
250
+ case "DMAX":
251
+ case "DMIN":
252
+ case "DPRODUCT":
253
+ case "DSTDEV":
254
+ case "DSTDEVP":
255
+ case "DSUM":
256
+ case "DVAR":
257
+ case "DVARP":
258
+ return argc === 3;
259
+ case "ADDRESS":
260
+ return argc >= 2 && argc <= 5;
261
+ case "SUMIF":
262
+ case "AVERAGEIF":
263
+ return argc === 2 || argc === 3;
264
+ case "SUMIFS":
265
+ case "AVERAGEIFS":
266
+ return argc >= 3 && argc % 2 === 1;
267
+ case "REPLACE":
268
+ return argc === 4;
269
+ case "SUBSTITUTE":
270
+ return argc === 3 || argc === 4;
271
+ case "REPT":
272
+ return argc === 2;
273
+ case "TEXT":
274
+ return argc === 2;
275
+ case "PHONETIC":
276
+ return argc === 1;
277
+ case "TEXTBEFORE":
278
+ case "TEXTAFTER":
279
+ return argc >= 2 && argc <= 6;
280
+ case "TEXTSPLIT":
281
+ return argc >= 2 && argc <= 6;
282
+ case "TEXTJOIN":
283
+ return argc >= 3;
284
+ case "POWER":
285
+ case "CONVERT":
286
+ return argc === 3;
287
+ case "EXACT":
288
+ case "ATAN2":
289
+ return argc === 2;
290
+ case "BESSELI":
291
+ case "BESSELJ":
292
+ case "BESSELK":
293
+ case "BESSELY":
294
+ return argc === 2;
295
+ case "EUROCONVERT":
296
+ return argc >= 3 && argc <= 5;
297
+ case "UPPER":
298
+ case "LOWER":
299
+ case "TRIM":
300
+ case "VALUE":
301
+ case "CHAR":
302
+ case "CODE":
303
+ case "UNICODE":
304
+ case "UNICHAR":
305
+ case "CLEAN":
306
+ case "ASC":
307
+ case "JIS":
308
+ case "DBCS":
309
+ case "BAHTTEXT":
310
+ case "LENB":
311
+ case "SINH":
312
+ case "COSH":
313
+ case "TANH":
314
+ case "ASINH":
315
+ case "ACOSH":
316
+ case "ATANH":
317
+ case "ACOT":
318
+ case "ACOTH":
319
+ case "COT":
320
+ case "COTH":
321
+ case "CSC":
322
+ case "CSCH":
323
+ case "SEC":
324
+ case "SECH":
325
+ case "SIGN":
326
+ case "EVEN":
327
+ case "ODD":
328
+ case "FACT":
329
+ case "FACTDOUBLE":
330
+ return argc === 1;
331
+ case "NUMBERVALUE":
332
+ return argc >= 1 && argc <= 3;
333
+ case "VALUETOTEXT":
334
+ return argc === 1 || argc === 2;
335
+ case "DOLLAR":
336
+ return argc >= 1 && argc <= 3;
337
+ case "DOLLARDE":
338
+ case "DOLLARFR":
339
+ case "COMBIN":
340
+ case "COMBINA":
341
+ case "QUOTIENT":
342
+ return argc === 2;
343
+ case "BASE":
344
+ return argc === 2 || argc === 3;
345
+ case "DECIMAL":
346
+ return argc === 2;
347
+ case "BIN2DEC":
348
+ case "HEX2DEC":
349
+ case "OCT2DEC":
350
+ return argc === 1;
351
+ case "BIN2HEX":
352
+ case "BIN2OCT":
353
+ case "DEC2BIN":
354
+ case "DEC2HEX":
355
+ case "DEC2OCT":
356
+ case "HEX2BIN":
357
+ case "HEX2OCT":
358
+ case "OCT2BIN":
359
+ case "OCT2HEX":
360
+ return argc === 1 || argc === 2;
361
+ case "BITAND":
362
+ case "BITOR":
363
+ case "BITXOR":
364
+ return argc >= 2;
365
+ case "BITLSHIFT":
366
+ case "BITRSHIFT":
367
+ return argc === 2;
368
+ case "MATCH":
369
+ return argc === 2 || argc === 3;
370
+ case "CORREL":
371
+ case "COVAR":
372
+ case "PEARSON":
373
+ case "COVARIANCE.P":
374
+ case "COVARIANCE.S":
375
+ case "PERCENTRANK":
376
+ case "PERCENTRANK.INC":
377
+ case "PERCENTRANK.EXC":
378
+ case "SMALL":
379
+ case "LARGE":
380
+ case "PERCENTILE":
381
+ case "PERCENTILE.INC":
382
+ case "PERCENTILE.EXC":
383
+ case "QUARTILE":
384
+ case "QUARTILE.INC":
385
+ case "QUARTILE.EXC":
386
+ case "RANK":
387
+ case "RANK.EQ":
388
+ case "RANK.AVG":
389
+ case "INTERCEPT":
390
+ case "RSQ":
391
+ case "SLOPE":
392
+ case "STEYX":
393
+ return argc === 2 || argc === 3;
394
+ case "MEDIAN":
395
+ case "MODE.MULT":
396
+ case "GCD":
397
+ case "LCM":
398
+ case "PRODUCT":
399
+ case "GEOMEAN":
400
+ case "HARMEAN":
401
+ case "SUMSQ":
402
+ return argc >= 1;
403
+ case "FREQUENCY":
404
+ return argc === 2;
405
+ case "PROB":
406
+ return argc === 3 || argc === 4;
407
+ case "TRIMMEAN":
408
+ return argc === 2;
409
+ case "FORECAST":
410
+ case "FORECAST.LINEAR":
411
+ return argc === 3;
412
+ case "TREND":
413
+ case "GROWTH":
414
+ case "LINEST":
415
+ case "LOGEST":
416
+ return argc >= 1 && argc <= 4;
417
+ case "XMATCH":
418
+ return argc >= 2 && argc <= 4;
419
+ case "XLOOKUP":
420
+ return argc >= 3 && argc <= 6;
421
+ case "INDEX":
422
+ return argc === 2 || argc === 3;
423
+ case "VLOOKUP":
424
+ case "HLOOKUP":
425
+ return argc === 3 || argc === 4;
426
+ case "LEFT":
427
+ case "RIGHT":
428
+ case "LEFTB":
429
+ case "RIGHTB":
430
+ return argc === 1 || argc === 2;
431
+ case "MID":
432
+ case "MIDB":
433
+ return argc === 3;
434
+ case "FIND":
435
+ case "SEARCH":
436
+ case "FINDB":
437
+ case "SEARCHB":
438
+ return argc === 2 || argc === 3;
439
+ case "REPLACEB":
440
+ return argc === 4;
441
+ case "ISBLANK":
442
+ case "ISNUMBER":
443
+ case "ISTEXT":
444
+ return argc === 0 || argc === 1;
445
+ case "ROUND":
446
+ case "ROUNDUP":
447
+ case "ROUNDDOWN":
448
+ case "FLOOR":
449
+ case "CEILING":
450
+ case "LOG":
451
+ return argc === 1 || argc === 2;
452
+ case "T":
453
+ case "N":
454
+ case "TYPE":
455
+ case "GAUSS":
456
+ case "PHI":
457
+ case "NORMSDIST":
458
+ case "NORMSINV":
459
+ return argc === 1 || (argc === 0 && (callee === "T" || callee === "N" || callee === "TYPE"));
460
+ case "DELTA":
461
+ case "GESTEP":
462
+ case "LOGNORMDIST":
463
+ case "EFFECT":
464
+ case "NOMINAL":
465
+ case "RRI":
466
+ case "PERMUT":
467
+ case "PERMUTATIONA":
468
+ return argc === 2;
469
+ case "STANDARDIZE":
470
+ case "NORMINV":
471
+ case "LOGINV":
472
+ case "PDURATION":
473
+ case "CONFIDENCE.NORM":
474
+ case "CONFIDENCE":
475
+ case "CONFIDENCE.T":
476
+ case "CRITBINOM":
477
+ case "BINOM.INV":
478
+ return argc === 3;
479
+ case "ERF":
480
+ return argc === 1 || argc === 2;
481
+ case "ERF.PRECISE":
482
+ case "ERFC":
483
+ case "ERFC.PRECISE":
484
+ case "FISHER":
485
+ case "FISHERINV":
486
+ case "GAMMALN":
487
+ case "GAMMALN.PRECISE":
488
+ case "GAMMA":
489
+ return argc === 1;
490
+ case "GAMMA.INV":
491
+ case "GAMMAINV":
492
+ return argc === 3;
493
+ case "CHIDIST":
494
+ case "LEGACY.CHIDIST":
495
+ case "CHIINV":
496
+ case "CHISQ.DIST.RT":
497
+ case "CHISQ.INV.RT":
498
+ case "CHISQDIST":
499
+ case "CHISQINV":
500
+ case "LEGACY.CHIINV":
501
+ case "CHISQ.TEST":
502
+ case "CHITEST":
503
+ case "LEGACY.CHITEST":
504
+ case "F.TEST":
505
+ case "FTEST":
506
+ return argc === 2;
507
+ case "Z.TEST":
508
+ case "ZTEST":
509
+ return argc === 2 || argc === 3;
510
+ case "F.DIST.RT":
511
+ case "FDIST":
512
+ case "LEGACY.FDIST":
513
+ return argc === 3;
514
+ case "CHISQ.INV":
515
+ return argc === 2;
516
+ case "CHISQ.DIST":
517
+ return argc === 3;
518
+ case "BETA.INV":
519
+ case "BETAINV":
520
+ return argc >= 3 && argc <= 5;
521
+ case "BETA.DIST":
522
+ return argc >= 4 && argc <= 6;
523
+ case "BETADIST":
524
+ return argc >= 3 && argc <= 5;
525
+ case "F.DIST":
526
+ return argc === 4;
527
+ case "T.DIST":
528
+ return argc === 3;
529
+ case "T.DIST.RT":
530
+ case "T.DIST.2T":
531
+ case "T.INV":
532
+ case "T.INV.2T":
533
+ case "TINV":
534
+ return argc === 2;
535
+ case "TDIST":
536
+ return argc === 3;
537
+ case "T.TEST":
538
+ case "TTEST":
539
+ return argc === 4;
540
+ case "F.INV":
541
+ case "F.INV.RT":
542
+ case "FINV":
543
+ case "LEGACY.FINV":
544
+ return argc === 3;
545
+ case "WEIBULL":
546
+ case "WEIBULL.DIST":
547
+ case "GAMMADIST":
548
+ case "GAMMA.DIST":
549
+ case "BINOMDIST":
550
+ case "BINOM.DIST":
551
+ case "NEGBINOM.DIST":
552
+ return argc === 4;
553
+ case "EXPONDIST":
554
+ case "EXPON.DIST":
555
+ case "POISSON":
556
+ case "POISSON.DIST":
557
+ case "NEGBINOMDIST":
558
+ return argc === 3;
559
+ case "BINOM.DIST.RANGE":
560
+ return argc === 3 || argc === 4;
561
+ case "HYPGEOMDIST":
562
+ return argc === 4;
563
+ case "HYPGEOM.DIST":
564
+ return argc === 5;
565
+ case "NORMDIST":
566
+ return argc === 4;
567
+ case "NORM.DIST":
568
+ return argc === 4;
569
+ case "NORM.INV":
570
+ return argc === 3;
571
+ case "NORM.S.DIST":
572
+ return argc === 1 || argc === 2;
573
+ case "NORM.S.INV":
574
+ return argc === 1;
575
+ case "LOGNORM.DIST":
576
+ return argc === 3 || argc === 4;
577
+ case "LOGNORM.INV":
578
+ return argc === 3;
579
+ case "MODE":
580
+ case "MODE.SNGL":
581
+ case "STDEV":
582
+ case "STDEV.P":
583
+ case "STDEV.S":
584
+ case "STDEVA":
585
+ case "STDEVP":
586
+ case "STDEVPA":
587
+ case "VAR":
588
+ case "VAR.P":
589
+ case "VAR.S":
590
+ case "VARA":
591
+ case "VARP":
592
+ case "VARPA":
593
+ case "SKEW":
594
+ case "SKEW.P":
595
+ case "KURT":
596
+ case "NPV":
597
+ return argc >= 1;
598
+ case "FV":
599
+ case "PV":
600
+ case "PMT":
601
+ case "NPER":
602
+ return argc >= 3 && argc <= 5;
603
+ case "RATE":
604
+ return argc >= 3 && argc <= 6;
605
+ case "IPMT":
606
+ case "PPMT":
607
+ return argc >= 4 && argc <= 6;
608
+ case "ISPMT":
609
+ return argc === 4;
610
+ case "CUMIPMT":
611
+ case "CUMPRINC":
612
+ return argc === 6;
613
+ case "DATE":
614
+ case "TIME":
615
+ case "DATEDIF":
616
+ return argc === 3;
617
+ case "FVSCHEDULE":
618
+ return argc >= 2;
619
+ case "SLN":
620
+ return argc === 3;
621
+ case "DB":
622
+ case "DDB":
623
+ return argc === 4 || argc === 5;
624
+ case "SYD":
625
+ return argc === 4;
626
+ case "VDB":
627
+ return argc >= 5 && argc <= 7;
628
+ case "EDATE":
629
+ case "EOMONTH":
630
+ return argc === 2;
631
+ case "AND":
632
+ case "OR":
633
+ case "XOR":
634
+ return argc >= 1;
635
+ case "SWITCH":
636
+ return argc >= 3;
637
+ case "SEQUENCE":
638
+ return argc >= 1 && argc <= 4;
639
+ case "EXPAND":
640
+ return argc >= 2 && argc <= 4;
641
+ case "FILTER":
642
+ return argc === 2 || argc === 3;
643
+ case "UNIQUE":
644
+ return argc >= 1 && argc <= 3;
645
+ case "TRIMRANGE":
646
+ return argc >= 1 && argc <= 3;
647
+ case "OFFSET":
648
+ return argc >= 3 && argc <= 5;
649
+ case "TAKE":
650
+ case "DROP":
651
+ return argc >= 1 && argc <= 3;
652
+ case "CHOOSECOLS":
653
+ case "CHOOSEROWS":
654
+ return argc >= 2;
655
+ case "SORT":
656
+ return argc >= 1 && argc <= 4;
657
+ case "SORTBY":
658
+ return argc >= 2;
659
+ case "TOCOL":
660
+ case "TOROW":
661
+ return argc >= 1 && argc <= 3;
662
+ case "WRAPROWS":
663
+ case "WRAPCOLS":
664
+ return argc >= 2 && argc <= 4;
665
+ case "LOOKUP":
666
+ return argc === 2 || argc === 3;
667
+ case "AREAS":
668
+ case "COLUMNS":
669
+ case "ROWS":
670
+ case "TRANSPOSE":
671
+ return argc === 1;
672
+ case "HSTACK":
673
+ case "VSTACK":
674
+ return argc >= 1;
675
+ case "ARRAYTOTEXT":
676
+ return argc === 1 || argc === 2;
677
+ case "MINIFS":
678
+ case "MAXIFS":
679
+ return argc >= 3 && argc % 2 === 1;
680
+ default:
681
+ return true;
682
+ }
683
+ }
684
+ export function bindFormula(ast) {
685
+ const deps = new Set();
686
+ const symbolicNames = new Set();
687
+ const symbolicTables = new Set();
688
+ const symbolicSpills = new Set();
689
+ function collectDeps(node, localNames = new Set()) {
690
+ switch (node.kind) {
691
+ case "NumberLiteral":
692
+ case "BooleanLiteral":
693
+ case "StringLiteral":
694
+ case "ErrorLiteral":
695
+ break;
696
+ case "NameRef":
697
+ if (!localNames.has(node.name)) {
698
+ symbolicNames.add(node.name);
699
+ }
700
+ break;
701
+ case "StructuredRef":
702
+ symbolicTables.add(node.tableName);
703
+ break;
704
+ case "CellRef":
705
+ deps.add(node.sheetName ? `${node.sheetName}!${node.ref}` : node.ref);
706
+ break;
707
+ case "SpillRef":
708
+ symbolicSpills.add(node.sheetName ? `${node.sheetName}!${node.ref}` : node.ref);
709
+ break;
710
+ case "RowRef":
711
+ case "ColumnRef":
712
+ throw new Error("Row and column references must appear inside a range");
713
+ case "RangeRef":
714
+ deps.add(formatRangeAddress(parseRangeAddress(node.sheetName
715
+ ? `${node.sheetName}!${node.start}:${node.end}`
716
+ : `${node.start}:${node.end}`)));
717
+ break;
718
+ case "UnaryExpr":
719
+ collectDeps(node.argument, localNames);
720
+ break;
721
+ case "BinaryExpr":
722
+ collectDeps(node.left, localNames);
723
+ collectDeps(node.right, localNames);
724
+ break;
725
+ case "CallExpr": {
726
+ const rewritten = rewriteSpecialCall(node);
727
+ if (rewritten) {
728
+ collectDeps(rewritten, localNames);
729
+ break;
730
+ }
731
+ const callee = node.callee.toUpperCase();
732
+ if (callee === "LET" && node.args.length >= 3 && node.args.length % 2 === 1) {
733
+ const scopedNames = new Set(localNames);
734
+ for (let index = 0; index < node.args.length - 1; index += 2) {
735
+ const nameNode = node.args[index];
736
+ collectDeps(node.args[index + 1], scopedNames);
737
+ if (nameNode.kind === "NameRef") {
738
+ scopedNames.add(nameNode.name);
739
+ }
740
+ }
741
+ collectDeps(node.args[node.args.length - 1], scopedNames);
742
+ break;
743
+ }
744
+ if (callee === "LAMBDA" && node.args.length >= 1) {
745
+ const scopedNames = new Set(localNames);
746
+ for (let index = 0; index < node.args.length - 1; index += 1) {
747
+ const paramNode = node.args[index];
748
+ if (paramNode.kind === "NameRef") {
749
+ scopedNames.add(paramNode.name);
750
+ }
751
+ }
752
+ collectDeps(node.args[node.args.length - 1], scopedNames);
753
+ break;
754
+ }
755
+ if (!hasBuiltin(callee) && !localNames.has(node.callee)) {
756
+ symbolicNames.add(node.callee);
757
+ }
758
+ const aggregateArgumentIndex = callee === "GROUPBY" ? 2 : callee === "PIVOTBY" ? 3 : -1;
759
+ node.args.forEach((arg, index) => {
760
+ if (index === aggregateArgumentIndex && arg.kind === "NameRef") {
761
+ return;
762
+ }
763
+ collectDeps(arg, localNames);
764
+ });
765
+ break;
766
+ }
767
+ case "InvokeExpr":
768
+ collectDeps(node.callee, localNames);
769
+ node.args.forEach((arg) => {
770
+ collectDeps(arg, localNames);
771
+ });
772
+ break;
773
+ default:
774
+ assertNever(node);
775
+ }
776
+ }
777
+ function isWasmSafe(node, allowRange = false) {
778
+ switch (node.kind) {
779
+ case "NumberLiteral":
780
+ case "BooleanLiteral":
781
+ case "StringLiteral":
782
+ case "ErrorLiteral":
783
+ return true;
784
+ case "NameRef":
785
+ case "StructuredRef":
786
+ case "SpillRef":
787
+ return false;
788
+ case "CellRef":
789
+ return true;
790
+ case "RowRef":
791
+ case "ColumnRef":
792
+ return false;
793
+ case "RangeRef":
794
+ if (!allowRange)
795
+ return false;
796
+ try {
797
+ const sheetPrefix = node.sheetName ? `${node.sheetName}!` : "";
798
+ const range = parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`);
799
+ if (range.kind !== "cells") {
800
+ return true;
801
+ }
802
+ const cellCount = (range.end.row - range.start.row + 1) * (range.end.col - range.start.col + 1);
803
+ return cellCount <= MAX_WASM_RANGE_CELLS;
804
+ }
805
+ catch {
806
+ return false;
807
+ }
808
+ case "UnaryExpr":
809
+ return ["+", "-"].includes(node.operator) && isWasmSafe(node.argument, true);
810
+ case "BinaryExpr":
811
+ return (["+", "-", "*", "/", "^", "&", "=", "<>", ">", ">=", "<", "<="].includes(node.operator) &&
812
+ isWasmSafe(node.left, true) &&
813
+ isWasmSafe(node.right, true));
814
+ case "CallExpr": {
815
+ const rewritten = rewriteSpecialCall(node);
816
+ if (rewritten) {
817
+ return isWasmSafe(rewritten, allowRange);
818
+ }
819
+ const callee = node.callee.toUpperCase();
820
+ if ((callee === "BYROW" || callee === "BYCOL") &&
821
+ node.args.length === 2 &&
822
+ isWasmSafe(node.args[0], true) &&
823
+ getNativeAxisAggregateCode(node.args[1]) !== null) {
824
+ return true;
825
+ }
826
+ if (callee === "REDUCE" || callee === "SCAN") {
827
+ const sourceArg = node.args.length === 3 ? node.args[1] : node.args[0];
828
+ const lambdaArg = node.args.length === 3 ? node.args[2] : node.args[1];
829
+ const initialArg = node.args.length === 3 ? node.args[0] : undefined;
830
+ const foldCode = lambdaArg ? getNativeRunningFoldCode(lambdaArg) : null;
831
+ if ((node.args.length === 2 || node.args.length === 3) &&
832
+ sourceArg !== undefined &&
833
+ lambdaArg !== undefined &&
834
+ isWasmSafe(sourceArg, true) &&
835
+ (initialArg === undefined || isWasmSafe(initialArg)) &&
836
+ foldCode !== null) {
837
+ return true;
838
+ }
839
+ }
840
+ if (callee === "MAKEARRAY" &&
841
+ node.args.length === 3 &&
842
+ isWasmSafe(node.args[0]) &&
843
+ isWasmSafe(node.args[1]) &&
844
+ isNativeMakearraySumLambda(node.args[2])) {
845
+ return true;
846
+ }
847
+ if (callee === "LET" ||
848
+ callee === "LAMBDA" ||
849
+ callee === "MAKEARRAY" ||
850
+ callee === "MAP" ||
851
+ callee === "REDUCE" ||
852
+ callee === "SCAN" ||
853
+ callee === "BYROW" ||
854
+ callee === "BYCOL") {
855
+ return false;
856
+ }
857
+ if (!hasBuiltin(callee) || !builtinWasmEnabledNames.has(callee)) {
858
+ return false;
859
+ }
860
+ if (!isWasmSafeBuiltinArity(callee, node.args.length)) {
861
+ return false;
862
+ }
863
+ return isWasmSafeBuiltinArgs(callee, node.args);
864
+ }
865
+ case "InvokeExpr":
866
+ return false;
867
+ }
868
+ }
869
+ function isWasmSafeBuiltinArgs(callee, args) {
870
+ const argc = args.length;
871
+ const isScalarArg = (arg) => isWasmSafe(arg);
872
+ const isCellRangeArg = (arg) => isWasmSafe(arg, true) && isCellRangeNode(arg);
873
+ const isCellVectorArg = (arg) => isWasmSafe(arg, true) && isCellVectorNode(arg);
874
+ const isCellOrScalarArg = (arg) => isCellVectorArg(arg) || isScalarArg(arg);
875
+ const isNativeSequenceArg = (arg) => arg.kind === "CallExpr" &&
876
+ arg.callee.toUpperCase() === "SEQUENCE" &&
877
+ isWasmSafeBuiltinArity("SEQUENCE", arg.args.length) &&
878
+ arg.args.every((child) => isWasmSafe(child));
879
+ switch (callee) {
880
+ case "SUM":
881
+ case "AVG":
882
+ case "MIN":
883
+ case "MAX":
884
+ case "COUNT":
885
+ case "COUNTA":
886
+ case "COUNTBLANK":
887
+ return args.every((arg) => isWasmSafe(arg, true) || isNativeSequenceArg(arg));
888
+ case "CHOOSE":
889
+ return (argc >= 2 &&
890
+ isScalarArg(args[0]) &&
891
+ args.slice(1).every((arg) => isWasmSafe(arg, true) || isNativeSequenceArg(arg)));
892
+ case "COUNTIF":
893
+ case "USE.THE.COUNTIF":
894
+ return args.length === 2 && isCellRangeArg(args[0]) && isScalarArg(args[1]);
895
+ case "COUNTIFS":
896
+ if (args.length === 0 || args.length % 2 !== 0) {
897
+ return false;
898
+ }
899
+ return args.every((arg, index) => index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg));
900
+ case "DAVERAGE":
901
+ case "DCOUNT":
902
+ case "DCOUNTA":
903
+ case "DGET":
904
+ case "DMAX":
905
+ case "DMIN":
906
+ case "DPRODUCT":
907
+ case "DSTDEV":
908
+ case "DSTDEVP":
909
+ case "DSUM":
910
+ case "DVAR":
911
+ case "DVARP":
912
+ return (argc === 3 &&
913
+ isCellRangeArg(args[0]) &&
914
+ isWasmSafe(args[1], true) &&
915
+ isCellRangeArg(args[2]));
916
+ case "CHISQ.TEST":
917
+ case "CHITEST":
918
+ case "LEGACY.CHITEST":
919
+ case "F.TEST":
920
+ case "FTEST":
921
+ return argc === 2 && args.every((arg) => isWasmSafe(arg, true));
922
+ case "T.TEST":
923
+ case "TTEST":
924
+ return (argc === 4 &&
925
+ isCellRangeArg(args[0]) &&
926
+ isCellRangeArg(args[1]) &&
927
+ isScalarArg(args[2]) &&
928
+ isScalarArg(args[3]));
929
+ case "Z.TEST":
930
+ case "ZTEST":
931
+ return (argc === 2 || argc === 3) && args.every((arg) => isWasmSafe(arg, true));
932
+ case "SUMIF":
933
+ case "AVERAGEIF":
934
+ if (args.length !== 2 && args.length !== 3) {
935
+ return false;
936
+ }
937
+ return (isCellRangeArg(args[0]) &&
938
+ isScalarArg(args[1]) &&
939
+ (args.length === 2 || isCellRangeArg(args[2])));
940
+ case "SUMIFS":
941
+ case "AVERAGEIFS":
942
+ if (args.length < 3 || args.length % 2 === 0) {
943
+ return false;
944
+ }
945
+ if (!isCellRangeArg(args[0])) {
946
+ return false;
947
+ }
948
+ return args
949
+ .slice(1)
950
+ .every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
951
+ case "SUMPRODUCT":
952
+ return args.length >= 1 && args.every((arg) => isCellRangeArg(arg));
953
+ case "MATCH":
954
+ return ((args.length === 2 || args.length === 3) &&
955
+ isScalarArg(args[0]) &&
956
+ isCellVectorArg(args[1]) &&
957
+ (args.length === 2 || isScalarArg(args[2])));
958
+ case "CORREL":
959
+ case "COVAR":
960
+ case "PEARSON":
961
+ case "COVARIANCE.P":
962
+ case "COVARIANCE.S":
963
+ case "INTERCEPT":
964
+ case "RSQ":
965
+ case "SLOPE":
966
+ case "STEYX":
967
+ return args.length === 2 && args.every((arg) => isWasmSafe(arg, true));
968
+ case "MEDIAN":
969
+ return args.length >= 1 && args.every((arg) => isWasmSafe(arg, true));
970
+ case "MODE.MULT":
971
+ return args.length >= 1 && args.every((arg) => isWasmSafe(arg, true));
972
+ case "FREQUENCY":
973
+ return args.length === 2 && isWasmSafe(args[0], true) && isWasmSafe(args[1], true);
974
+ case "BESSELI":
975
+ case "BESSELJ":
976
+ case "BESSELK":
977
+ case "BESSELY":
978
+ return args.length === 2 && isScalarArg(args[0]) && isScalarArg(args[1]);
979
+ case "SMALL":
980
+ case "LARGE":
981
+ case "PERCENTILE":
982
+ case "PERCENTILE.INC":
983
+ case "PERCENTILE.EXC":
984
+ case "QUARTILE":
985
+ case "QUARTILE.INC":
986
+ case "QUARTILE.EXC":
987
+ return args.length === 2 && isWasmSafe(args[0], true) && isScalarArg(args[1]);
988
+ case "PERCENTRANK":
989
+ case "PERCENTRANK.INC":
990
+ case "PERCENTRANK.EXC":
991
+ return ((args.length === 2 || args.length === 3) &&
992
+ isWasmSafe(args[0], true) &&
993
+ isScalarArg(args[1]) &&
994
+ (args.length === 2 || isScalarArg(args[2])));
995
+ case "RANK":
996
+ case "RANK.EQ":
997
+ case "RANK.AVG":
998
+ return ((args.length === 2 || args.length === 3) &&
999
+ isScalarArg(args[0]) &&
1000
+ isWasmSafe(args[1], true) &&
1001
+ (args.length === 2 || isScalarArg(args[2])));
1002
+ case "FORECAST":
1003
+ case "FORECAST.LINEAR":
1004
+ return (args.length === 3 &&
1005
+ isScalarArg(args[0]) &&
1006
+ isWasmSafe(args[1], true) &&
1007
+ isWasmSafe(args[2], true));
1008
+ case "TREND":
1009
+ case "GROWTH":
1010
+ case "LINEST":
1011
+ case "LOGEST":
1012
+ return (args.length >= 1 &&
1013
+ args.length <= 4 &&
1014
+ isWasmSafe(args[0], true) &&
1015
+ (args.length < 2 || isWasmSafe(args[1], true)) &&
1016
+ (args.length < 3 || isWasmSafe(args[2], true)) &&
1017
+ (args.length < 4 || isScalarArg(args[3])));
1018
+ case "XMATCH":
1019
+ return (args.length >= 2 &&
1020
+ args.length <= 4 &&
1021
+ isScalarArg(args[0]) &&
1022
+ isCellVectorArg(args[1]) &&
1023
+ args.slice(2).every((arg) => isScalarArg(arg)));
1024
+ case "XLOOKUP":
1025
+ return (args.length >= 3 &&
1026
+ args.length <= 6 &&
1027
+ isScalarArg(args[0]) &&
1028
+ isCellVectorArg(args[1]) &&
1029
+ isCellVectorArg(args[2]) &&
1030
+ args.slice(3).every((arg) => isScalarArg(arg)));
1031
+ case "INDEX":
1032
+ return ((args.length === 2 || args.length === 3) &&
1033
+ isCellRangeArg(args[0]) &&
1034
+ isScalarArg(args[1]) &&
1035
+ (args.length === 2 || isScalarArg(args[2])));
1036
+ case "VLOOKUP":
1037
+ return ((args.length === 3 || args.length === 4) &&
1038
+ isScalarArg(args[0]) &&
1039
+ isCellRangeArg(args[1]) &&
1040
+ isScalarArg(args[2]) &&
1041
+ (args.length === 3 || isScalarArg(args[3])));
1042
+ case "HLOOKUP":
1043
+ return ((args.length === 3 || args.length === 4) &&
1044
+ isScalarArg(args[0]) &&
1045
+ isCellRangeArg(args[1]) &&
1046
+ isScalarArg(args[2]) &&
1047
+ (args.length === 3 || isScalarArg(args[3])));
1048
+ case "DAYS":
1049
+ case "DAYS360":
1050
+ case "YEARFRAC":
1051
+ case "DISC":
1052
+ case "INTRATE":
1053
+ case "RECEIVED":
1054
+ case "PRICEDISC":
1055
+ case "YIELDDISC":
1056
+ case "COUPDAYBS":
1057
+ case "COUPDAYS":
1058
+ case "COUPDAYSNC":
1059
+ case "COUPNCD":
1060
+ case "COUPNUM":
1061
+ case "COUPPCD":
1062
+ case "PRICEMAT":
1063
+ case "YIELDMAT":
1064
+ case "ODDFPRICE":
1065
+ case "ODDFYIELD":
1066
+ case "ODDLPRICE":
1067
+ case "ODDLYIELD":
1068
+ case "PRICE":
1069
+ case "YIELD":
1070
+ case "DURATION":
1071
+ case "MDURATION":
1072
+ case "TBILLPRICE":
1073
+ case "TBILLYIELD":
1074
+ case "TBILLEQ":
1075
+ case "ISOWEEKNUM":
1076
+ case "TIMEVALUE":
1077
+ case "WEEKNUM":
1078
+ return args.every((arg) => isScalarArg(arg));
1079
+ case "EXPAND":
1080
+ return (argc >= 2 &&
1081
+ argc <= 4 &&
1082
+ isWasmSafe(args[0], true) &&
1083
+ isScalarArg(args[1]) &&
1084
+ (argc < 3 || isScalarArg(args[2])) &&
1085
+ (argc < 4 || isScalarArg(args[3])));
1086
+ case "WORKDAY":
1087
+ return args.length === 2
1088
+ ? args.every((arg) => isScalarArg(arg))
1089
+ : args.every((arg) => isScalarArg(arg));
1090
+ case "NETWORKDAYS":
1091
+ return args.length === 2
1092
+ ? args.every((arg) => isScalarArg(arg))
1093
+ : args.every((arg) => isScalarArg(arg));
1094
+ case "WORKDAY.INTL":
1095
+ case "NETWORKDAYS.INTL":
1096
+ return args.every((arg) => isScalarArg(arg));
1097
+ case "NUMBERVALUE":
1098
+ case "TEXT":
1099
+ return args.every((arg) => isScalarArg(arg));
1100
+ case "PHONETIC":
1101
+ return argc === 1 && (isScalarArg(args[0]) || isCellRangeNode(args[0]));
1102
+ case "VALUETOTEXT":
1103
+ case "TEXTBEFORE":
1104
+ case "TEXTAFTER":
1105
+ case "CHAR":
1106
+ case "CODE":
1107
+ case "UNICODE":
1108
+ case "UNICHAR":
1109
+ case "CLEAN":
1110
+ case "ASC":
1111
+ case "JIS":
1112
+ case "DBCS":
1113
+ case "BAHTTEXT":
1114
+ case "TEXTSPLIT":
1115
+ case "CONVERT":
1116
+ case "EUROCONVERT":
1117
+ case "BASE":
1118
+ case "DECIMAL":
1119
+ case "BIN2DEC":
1120
+ case "BIN2HEX":
1121
+ case "BIN2OCT":
1122
+ case "DEC2BIN":
1123
+ case "DEC2HEX":
1124
+ case "DEC2OCT":
1125
+ case "HEX2BIN":
1126
+ case "HEX2DEC":
1127
+ case "HEX2OCT":
1128
+ case "OCT2BIN":
1129
+ case "OCT2DEC":
1130
+ case "OCT2HEX":
1131
+ case "BITAND":
1132
+ case "BITOR":
1133
+ case "BITXOR":
1134
+ case "BITLSHIFT":
1135
+ case "BITRSHIFT":
1136
+ return args.every((arg) => isScalarArg(arg));
1137
+ case "TEXTJOIN":
1138
+ return (argc >= 3 &&
1139
+ isScalarArg(args[0]) &&
1140
+ isScalarArg(args[1]) &&
1141
+ args.slice(2).every((arg) => isWasmSafe(arg, true) || isNativeSequenceArg(arg)));
1142
+ case "REPLACE":
1143
+ case "SUBSTITUTE":
1144
+ case "REPT":
1145
+ return args.every((arg) => isScalarArg(arg));
1146
+ case "OFFSET":
1147
+ case "TAKE":
1148
+ case "DROP":
1149
+ case "CHOOSECOLS":
1150
+ case "CHOOSEROWS":
1151
+ case "SORT":
1152
+ case "TOCOL":
1153
+ case "TOROW":
1154
+ case "WRAPROWS":
1155
+ case "WRAPCOLS":
1156
+ if (args.length === 0) {
1157
+ return false;
1158
+ }
1159
+ return isCellRangeArg(args[0]) && args.slice(1).every((arg) => isScalarArg(arg));
1160
+ case "FILTER":
1161
+ return ((argc === 2 || argc === 3) &&
1162
+ isCellRangeArg(args[0]) &&
1163
+ isWasmSafe(args[1], true) &&
1164
+ (argc === 2 || isScalarArg(args[2])));
1165
+ case "UNIQUE":
1166
+ return (argc >= 1 &&
1167
+ argc <= 3 &&
1168
+ isCellRangeArg(args[0]) &&
1169
+ args.slice(1).every((arg) => isScalarArg(arg)));
1170
+ case "TRIMRANGE":
1171
+ return (argc >= 1 &&
1172
+ argc <= 3 &&
1173
+ isWasmSafe(args[0], true) &&
1174
+ args.slice(1).every((arg) => isScalarArg(arg)));
1175
+ case "PROB":
1176
+ return ((argc === 3 || argc === 4) &&
1177
+ isWasmSafe(args[0], true) &&
1178
+ isWasmSafe(args[1], true) &&
1179
+ isScalarArg(args[2]) &&
1180
+ (argc === 3 || isScalarArg(args[3])));
1181
+ case "TRIMMEAN":
1182
+ return argc === 2 && isWasmSafe(args[0], true) && isScalarArg(args[1]);
1183
+ case "LOOKUP":
1184
+ if (argc < 2 || argc > 3) {
1185
+ return false;
1186
+ }
1187
+ return (isScalarArg(args[0]) &&
1188
+ isCellOrScalarArg(args[1]) &&
1189
+ (argc === 2 || isCellVectorArg(args[2]) || isScalarArg(args[2])));
1190
+ case "TRANSPOSE":
1191
+ return args.length === 1 && isWasmSafe(args[0], true);
1192
+ case "HSTACK":
1193
+ case "VSTACK":
1194
+ return args.length >= 1 && args.every((arg) => isWasmSafe(arg, true));
1195
+ case "AREAS":
1196
+ case "COLUMNS":
1197
+ case "ROWS":
1198
+ return args.length === 1 && isCellRangeArg(args[0]);
1199
+ case "ARRAYTOTEXT":
1200
+ return ((argc === 1 || argc === 2) &&
1201
+ (isCellRangeArg(args[0]) || isScalarArg(args[0])) &&
1202
+ (argc === 1 || isScalarArg(args[1])));
1203
+ case "MINIFS":
1204
+ case "MAXIFS":
1205
+ if (args.length < 3 || args.length % 2 === 0 || !isCellRangeArg(args[0])) {
1206
+ return false;
1207
+ }
1208
+ return args
1209
+ .slice(1)
1210
+ .every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
1211
+ case "IRR":
1212
+ return ((argc === 1 || argc === 2) &&
1213
+ isCellRangeArg(args[0]) &&
1214
+ (argc === 1 || isScalarArg(args[1])));
1215
+ case "MIRR":
1216
+ return (argc === 3 && isCellRangeArg(args[0]) && isScalarArg(args[1]) && isScalarArg(args[2]));
1217
+ case "XNPV":
1218
+ return (argc === 3 &&
1219
+ isScalarArg(args[0]) &&
1220
+ isCellRangeArg(args[1]) &&
1221
+ isCellRangeArg(args[2]));
1222
+ case "XIRR":
1223
+ return ((argc === 2 || argc === 3) &&
1224
+ isCellRangeArg(args[0]) &&
1225
+ isCellRangeArg(args[1]) &&
1226
+ (argc === 2 || isScalarArg(args[2])));
1227
+ case "SORTBY":
1228
+ if (args.length < 2) {
1229
+ return false;
1230
+ }
1231
+ return (isCellRangeArg(args[0]) &&
1232
+ args
1233
+ .slice(1)
1234
+ .every((arg, index) => index % 2 === 0 ? isScalarArg(arg) || isWasmSafe(arg, true) : isScalarArg(arg)));
1235
+ default: {
1236
+ const allowRangeArgs = RANGE_SAFE_BUILTINS.has(callee);
1237
+ return args.every((arg) => isWasmSafe(arg, allowRangeArgs));
1238
+ }
1239
+ }
1240
+ }
1241
+ function isTopLevelWasmSafe(node) {
1242
+ if (node.kind !== "CallExpr") {
1243
+ return false;
1244
+ }
1245
+ const rewritten = rewriteSpecialCall(node);
1246
+ if (rewritten) {
1247
+ return isWasmSafe(rewritten);
1248
+ }
1249
+ const callee = node.callee.toUpperCase();
1250
+ if (callee !== "SEQUENCE") {
1251
+ return false;
1252
+ }
1253
+ if (!hasBuiltin(callee) || !isWasmSafeBuiltinArity(callee, node.args.length)) {
1254
+ return false;
1255
+ }
1256
+ return node.args.every((arg) => isWasmSafe(arg));
1257
+ }
1258
+ collectDeps(ast);
1259
+ return {
1260
+ ast,
1261
+ deps: [...deps],
1262
+ symbolicNames: [...symbolicNames],
1263
+ symbolicTables: [...symbolicTables],
1264
+ symbolicSpills: [...symbolicSpills],
1265
+ mode: ast.kind === "RangeRef" || (!isWasmSafe(ast) && !isTopLevelWasmSafe(ast))
1266
+ ? FormulaMode.JsOnly
1267
+ : FormulaMode.WasmFastPath,
1268
+ };
1269
+ }
1270
+ export function isBuiltinAvailable(name) {
1271
+ return hasBuiltin(name);
1272
+ }
1273
+ export function encodeBuiltin(name) {
1274
+ const builtins = {
1275
+ SUM: BuiltinId.Sum,
1276
+ AVG: BuiltinId.Avg,
1277
+ CHOOSE: BuiltinId.Choose,
1278
+ MIN: BuiltinId.Min,
1279
+ MAX: BuiltinId.Max,
1280
+ COUNT: BuiltinId.Count,
1281
+ COUNTA: BuiltinId.CountA,
1282
+ COUNTBLANK: BuiltinId.Countblank,
1283
+ ABS: BuiltinId.Abs,
1284
+ SIN: BuiltinId.Sin,
1285
+ COS: BuiltinId.Cos,
1286
+ TAN: BuiltinId.Tan,
1287
+ ASIN: BuiltinId.Asin,
1288
+ ACOS: BuiltinId.Acos,
1289
+ ATAN: BuiltinId.Atan,
1290
+ ATAN2: BuiltinId.Atan2,
1291
+ DEGREES: BuiltinId.Degrees,
1292
+ RADIANS: BuiltinId.Radians,
1293
+ EXP: BuiltinId.Exp,
1294
+ LN: BuiltinId.Ln,
1295
+ LOG: BuiltinId.Log,
1296
+ LOG10: BuiltinId.Log10,
1297
+ POWER: BuiltinId.Power,
1298
+ SQRT: BuiltinId.Sqrt,
1299
+ PI: BuiltinId.Pi,
1300
+ ROUND: BuiltinId.Round,
1301
+ FLOOR: BuiltinId.Floor,
1302
+ CEILING: BuiltinId.Ceiling,
1303
+ MOD: BuiltinId.Mod,
1304
+ IF: BuiltinId.If,
1305
+ IFS: BuiltinId.Ifs,
1306
+ IFERROR: BuiltinId.Iferror,
1307
+ IFNA: BuiltinId.Ifna,
1308
+ NA: BuiltinId.Na,
1309
+ AND: BuiltinId.And,
1310
+ OR: BuiltinId.Or,
1311
+ NOT: BuiltinId.Not,
1312
+ SWITCH: BuiltinId.Switch,
1313
+ XOR: BuiltinId.Xor,
1314
+ LEN: BuiltinId.Len,
1315
+ CONCAT: BuiltinId.Concat,
1316
+ ISBLANK: BuiltinId.IsBlank,
1317
+ ISNUMBER: BuiltinId.IsNumber,
1318
+ ISTEXT: BuiltinId.IsText,
1319
+ DATE: BuiltinId.Date,
1320
+ YEAR: BuiltinId.Year,
1321
+ MONTH: BuiltinId.Month,
1322
+ DAY: BuiltinId.Day,
1323
+ DATEDIF: BuiltinId.Datedif,
1324
+ TIME: BuiltinId.Time,
1325
+ HOUR: BuiltinId.Hour,
1326
+ MINUTE: BuiltinId.Minute,
1327
+ SECOND: BuiltinId.Second,
1328
+ WEEKDAY: BuiltinId.Weekday,
1329
+ DAYS: BuiltinId.Days,
1330
+ DAYS360: BuiltinId.Days360,
1331
+ YEARFRAC: BuiltinId.Yearfrac,
1332
+ ISOWEEKNUM: BuiltinId.Isoweeknum,
1333
+ TIMEVALUE: BuiltinId.Timevalue,
1334
+ WEEKNUM: BuiltinId.Weeknum,
1335
+ WORKDAY: BuiltinId.Workday,
1336
+ NETWORKDAYS: BuiltinId.Networkdays,
1337
+ "WORKDAY.INTL": BuiltinId.WorkdayIntl,
1338
+ "NETWORKDAYS.INTL": BuiltinId.NetworkdaysIntl,
1339
+ EDATE: BuiltinId.Edate,
1340
+ EOMONTH: BuiltinId.Eomonth,
1341
+ REPLACE: BuiltinId.Replace,
1342
+ SUBSTITUTE: BuiltinId.Substitute,
1343
+ REPT: BuiltinId.Rept,
1344
+ EXACT: BuiltinId.Exact,
1345
+ INT: BuiltinId.Int,
1346
+ ROUNDUP: BuiltinId.RoundUp,
1347
+ ROUNDDOWN: BuiltinId.RoundDown,
1348
+ LEFT: BuiltinId.Left,
1349
+ RIGHT: BuiltinId.Right,
1350
+ MID: BuiltinId.Mid,
1351
+ LEFTB: BuiltinId.Leftb,
1352
+ RIGHTB: BuiltinId.Rightb,
1353
+ MIDB: BuiltinId.Midb,
1354
+ TRIM: BuiltinId.Trim,
1355
+ UPPER: BuiltinId.Upper,
1356
+ LOWER: BuiltinId.Lower,
1357
+ FIND: BuiltinId.Find,
1358
+ SEARCH: BuiltinId.Search,
1359
+ FINDB: BuiltinId.Findb,
1360
+ LENB: BuiltinId.Lenb,
1361
+ SEARCHB: BuiltinId.Searchb,
1362
+ REPLACEB: BuiltinId.Replaceb,
1363
+ ADDRESS: BuiltinId.Address,
1364
+ DOLLAR: BuiltinId.Dollar,
1365
+ DOLLARDE: BuiltinId.Dollarde,
1366
+ DOLLARFR: BuiltinId.Dollarfr,
1367
+ BASE: BuiltinId.Base,
1368
+ DECIMAL: BuiltinId.Decimal,
1369
+ BIN2DEC: BuiltinId.Bin2dec,
1370
+ BIN2HEX: BuiltinId.Bin2hex,
1371
+ BIN2OCT: BuiltinId.Bin2oct,
1372
+ DEC2BIN: BuiltinId.Dec2bin,
1373
+ DEC2HEX: BuiltinId.Dec2hex,
1374
+ DEC2OCT: BuiltinId.Dec2oct,
1375
+ HEX2BIN: BuiltinId.Hex2bin,
1376
+ HEX2DEC: BuiltinId.Hex2dec,
1377
+ HEX2OCT: BuiltinId.Hex2oct,
1378
+ OCT2BIN: BuiltinId.Oct2bin,
1379
+ OCT2DEC: BuiltinId.Oct2dec,
1380
+ OCT2HEX: BuiltinId.Oct2hex,
1381
+ BITAND: BuiltinId.Bitand,
1382
+ BITOR: BuiltinId.Bitor,
1383
+ BITXOR: BuiltinId.Bitxor,
1384
+ BITLSHIFT: BuiltinId.Bitlshift,
1385
+ BITRSHIFT: BuiltinId.Bitrshift,
1386
+ CONVERT: BuiltinId.Convert,
1387
+ EUROCONVERT: BuiltinId.Euroconvert,
1388
+ BESSELI: BuiltinId.Besseli,
1389
+ BESSELJ: BuiltinId.Besselj,
1390
+ BESSELK: BuiltinId.Besselk,
1391
+ BESSELY: BuiltinId.Bessely,
1392
+ VALUE: BuiltinId.Value,
1393
+ CHAR: BuiltinId.Char,
1394
+ CODE: BuiltinId.Code,
1395
+ UNICODE: BuiltinId.Unicode,
1396
+ UNICHAR: BuiltinId.Unichar,
1397
+ CLEAN: BuiltinId.Clean,
1398
+ ASC: BuiltinId.Asc,
1399
+ JIS: BuiltinId.Jis,
1400
+ DBCS: BuiltinId.Dbcs,
1401
+ BAHTTEXT: BuiltinId.Bahttext,
1402
+ SINH: BuiltinId.Sinh,
1403
+ COSH: BuiltinId.Cosh,
1404
+ TANH: BuiltinId.Tanh,
1405
+ ASINH: BuiltinId.Asinh,
1406
+ ACOSH: BuiltinId.Acosh,
1407
+ ATANH: BuiltinId.Atanh,
1408
+ ACOT: BuiltinId.Acot,
1409
+ ACOTH: BuiltinId.Acoth,
1410
+ COT: BuiltinId.Cot,
1411
+ COTH: BuiltinId.Coth,
1412
+ CSC: BuiltinId.Csc,
1413
+ CSCH: BuiltinId.Csch,
1414
+ SEC: BuiltinId.Sec,
1415
+ SECH: BuiltinId.Sech,
1416
+ SIGN: BuiltinId.Sign,
1417
+ EVEN: BuiltinId.Even,
1418
+ ODD: BuiltinId.Odd,
1419
+ FACT: BuiltinId.Fact,
1420
+ FACTDOUBLE: BuiltinId.Factdouble,
1421
+ COMBIN: BuiltinId.Combin,
1422
+ COMBINA: BuiltinId.Combina,
1423
+ GCD: BuiltinId.Gcd,
1424
+ LCM: BuiltinId.Lcm,
1425
+ PRODUCT: BuiltinId.Product,
1426
+ QUOTIENT: BuiltinId.Quotient,
1427
+ GEOMEAN: BuiltinId.Geomean,
1428
+ HARMEAN: BuiltinId.Harmean,
1429
+ SUMSQ: BuiltinId.Sumsq,
1430
+ "FLOOR.MATH": BuiltinId.FloorMath,
1431
+ "FLOOR.PRECISE": BuiltinId.FloorPrecise,
1432
+ "CEILING.MATH": BuiltinId.CeilingMath,
1433
+ "CEILING.PRECISE": BuiltinId.CeilingPrecise,
1434
+ "ISO.CEILING": BuiltinId.IsoCeiling,
1435
+ TRUNC: BuiltinId.Trunc,
1436
+ MROUND: BuiltinId.Mround,
1437
+ SQRTPI: BuiltinId.Sqrtpi,
1438
+ SERIESSUM: BuiltinId.Seriessum,
1439
+ TEXTBEFORE: BuiltinId.Textbefore,
1440
+ TEXTAFTER: BuiltinId.Textafter,
1441
+ TEXTJOIN: BuiltinId.Textjoin,
1442
+ TEXTSPLIT: BuiltinId.Textsplit,
1443
+ TEXT: BuiltinId.Text,
1444
+ PHONETIC: BuiltinId.Phonetic,
1445
+ NUMBERVALUE: BuiltinId.Numbervalue,
1446
+ VALUETOTEXT: BuiltinId.Valuetotext,
1447
+ TODAY: BuiltinId.Today,
1448
+ NOW: BuiltinId.Now,
1449
+ RAND: BuiltinId.Rand,
1450
+ MATCH: BuiltinId.Match,
1451
+ CORREL: BuiltinId.Correl,
1452
+ COVAR: BuiltinId.Covar,
1453
+ PEARSON: BuiltinId.Pearson,
1454
+ "COVARIANCE.P": BuiltinId.CovarianceP,
1455
+ "COVARIANCE.S": BuiltinId.CovarianceS,
1456
+ MEDIAN: BuiltinId.Median,
1457
+ "MODE.MULT": BuiltinId.ModeMult,
1458
+ FREQUENCY: BuiltinId.Frequency,
1459
+ PROB: BuiltinId.Prob,
1460
+ TRIMMEAN: BuiltinId.Trimmean,
1461
+ SMALL: BuiltinId.Small,
1462
+ LARGE: BuiltinId.Large,
1463
+ PERCENTILE: BuiltinId.Percentile,
1464
+ "PERCENTILE.INC": BuiltinId.PercentileInc,
1465
+ "PERCENTILE.EXC": BuiltinId.PercentileExc,
1466
+ PERCENTRANK: BuiltinId.Percentrank,
1467
+ "PERCENTRANK.INC": BuiltinId.PercentrankInc,
1468
+ "PERCENTRANK.EXC": BuiltinId.PercentrankExc,
1469
+ QUARTILE: BuiltinId.Quartile,
1470
+ "QUARTILE.INC": BuiltinId.QuartileInc,
1471
+ "QUARTILE.EXC": BuiltinId.QuartileExc,
1472
+ RANK: BuiltinId.Rank,
1473
+ "RANK.EQ": BuiltinId.RankEq,
1474
+ "RANK.AVG": BuiltinId.RankAvg,
1475
+ FORECAST: BuiltinId.Forecast,
1476
+ "FORECAST.LINEAR": BuiltinId.Forecast,
1477
+ LINEST: BuiltinId.Linest,
1478
+ LOGEST: BuiltinId.Logest,
1479
+ INTERCEPT: BuiltinId.Intercept,
1480
+ RSQ: BuiltinId.Rsq,
1481
+ SLOPE: BuiltinId.Slope,
1482
+ STEYX: BuiltinId.Steyx,
1483
+ TREND: BuiltinId.Trend,
1484
+ GROWTH: BuiltinId.Growth,
1485
+ INDEX: BuiltinId.Index,
1486
+ VLOOKUP: BuiltinId.Vlookup,
1487
+ HLOOKUP: BuiltinId.Hlookup,
1488
+ XMATCH: BuiltinId.Xmatch,
1489
+ XLOOKUP: BuiltinId.Xlookup,
1490
+ COUNTIF: BuiltinId.Countif,
1491
+ "USE.THE.COUNTIF": BuiltinId.Countif,
1492
+ COUNTIFS: BuiltinId.Countifs,
1493
+ DAVERAGE: BuiltinId.Daverage,
1494
+ DCOUNT: BuiltinId.Dcount,
1495
+ DCOUNTA: BuiltinId.Dcounta,
1496
+ DGET: BuiltinId.Dget,
1497
+ DMAX: BuiltinId.Dmax,
1498
+ DMIN: BuiltinId.Dmin,
1499
+ DPRODUCT: BuiltinId.Dproduct,
1500
+ DSTDEV: BuiltinId.Dstdev,
1501
+ DSTDEVP: BuiltinId.Dstdevp,
1502
+ DSUM: BuiltinId.Dsum,
1503
+ DVAR: BuiltinId.Dvar,
1504
+ DVARP: BuiltinId.Dvarp,
1505
+ SUMIF: BuiltinId.Sumif,
1506
+ SUMIFS: BuiltinId.Sumifs,
1507
+ AVERAGEIF: BuiltinId.Averageif,
1508
+ AVERAGEIFS: BuiltinId.Averageifs,
1509
+ SUMPRODUCT: BuiltinId.Sumproduct,
1510
+ SEQUENCE: BuiltinId.Sequence,
1511
+ FILTER: BuiltinId.Filter,
1512
+ UNIQUE: BuiltinId.Unique,
1513
+ EXPAND: BuiltinId.Expand,
1514
+ TRIMRANGE: BuiltinId.Trimrange,
1515
+ OFFSET: BuiltinId.Offset,
1516
+ TAKE: BuiltinId.Take,
1517
+ DROP: BuiltinId.Drop,
1518
+ CHOOSECOLS: BuiltinId.Choosecols,
1519
+ CHOOSEROWS: BuiltinId.Chooserows,
1520
+ SORT: BuiltinId.Sort,
1521
+ SORTBY: BuiltinId.Sortby,
1522
+ TOCOL: BuiltinId.Tocol,
1523
+ TOROW: BuiltinId.Torow,
1524
+ WRAPROWS: BuiltinId.Wraprows,
1525
+ WRAPCOLS: BuiltinId.Wrapcols,
1526
+ LOOKUP: BuiltinId.Lookup,
1527
+ AREAS: BuiltinId.Areas,
1528
+ ARRAYTOTEXT: BuiltinId.Arraytotext,
1529
+ COLUMNS: BuiltinId.Columns,
1530
+ ROWS: BuiltinId.Rows,
1531
+ TRANSPOSE: BuiltinId.Transpose,
1532
+ HSTACK: BuiltinId.Hstack,
1533
+ VSTACK: BuiltinId.Vstack,
1534
+ MINIFS: BuiltinId.Minifs,
1535
+ MAXIFS: BuiltinId.Maxifs,
1536
+ T: BuiltinId.T,
1537
+ N: BuiltinId.N,
1538
+ TYPE: BuiltinId.Type,
1539
+ DELTA: BuiltinId.Delta,
1540
+ GESTEP: BuiltinId.Gestep,
1541
+ GAUSS: BuiltinId.Gauss,
1542
+ PHI: BuiltinId.Phi,
1543
+ STANDARDIZE: BuiltinId.Standardize,
1544
+ MODE: BuiltinId.Mode,
1545
+ "MODE.SNGL": BuiltinId.ModeSngl,
1546
+ STDEV: BuiltinId.Stdev,
1547
+ "STDEV.P": BuiltinId.StdevP,
1548
+ "STDEV.S": BuiltinId.StdevS,
1549
+ STDEVA: BuiltinId.Stdeva,
1550
+ STDEVP: BuiltinId.Stdevp,
1551
+ STDEVPA: BuiltinId.Stdevpa,
1552
+ VAR: BuiltinId.Var,
1553
+ "VAR.P": BuiltinId.VarP,
1554
+ "VAR.S": BuiltinId.VarS,
1555
+ VARA: BuiltinId.Vara,
1556
+ VARP: BuiltinId.Varp,
1557
+ VARPA: BuiltinId.Varpa,
1558
+ SKEW: BuiltinId.Skew,
1559
+ "SKEW.P": BuiltinId.SkewP,
1560
+ KURT: BuiltinId.Kurt,
1561
+ NORMDIST: BuiltinId.Normdist,
1562
+ "NORM.DIST": BuiltinId.NormDist,
1563
+ NORMINV: BuiltinId.Norminv,
1564
+ "NORM.INV": BuiltinId.NormInv,
1565
+ NORMSDIST: BuiltinId.Normsdist,
1566
+ "NORM.S.DIST": BuiltinId.NormSDist,
1567
+ NORMSINV: BuiltinId.Normsinv,
1568
+ "NORM.S.INV": BuiltinId.NormSInv,
1569
+ LOGINV: BuiltinId.Loginv,
1570
+ LOGNORMDIST: BuiltinId.Lognormdist,
1571
+ "LOGNORM.DIST": BuiltinId.LognormDist,
1572
+ "LOGNORM.INV": BuiltinId.LognormInv,
1573
+ "CONFIDENCE.NORM": BuiltinId.ConfidenceNorm,
1574
+ CONFIDENCE: BuiltinId.Confidence,
1575
+ "CONFIDENCE.T": BuiltinId.ConfidenceT,
1576
+ EFFECT: BuiltinId.Effect,
1577
+ NOMINAL: BuiltinId.Nominal,
1578
+ PDURATION: BuiltinId.Pduration,
1579
+ RRI: BuiltinId.Rri,
1580
+ FV: BuiltinId.Fv,
1581
+ FVSCHEDULE: BuiltinId.Fvschedule,
1582
+ DB: BuiltinId.Db,
1583
+ DDB: BuiltinId.Ddb,
1584
+ VDB: BuiltinId.Vdb,
1585
+ PV: BuiltinId.Pv,
1586
+ PMT: BuiltinId.Pmt,
1587
+ NPER: BuiltinId.Nper,
1588
+ RATE: BuiltinId.Rate,
1589
+ NPV: BuiltinId.Npv,
1590
+ IRR: BuiltinId.Irr,
1591
+ MIRR: BuiltinId.Mirr,
1592
+ XNPV: BuiltinId.Xnpv,
1593
+ XIRR: BuiltinId.Xirr,
1594
+ IPMT: BuiltinId.Ipmt,
1595
+ PPMT: BuiltinId.Ppmt,
1596
+ ISPMT: BuiltinId.Ispmt,
1597
+ CUMIPMT: BuiltinId.Cumipmt,
1598
+ CUMPRINC: BuiltinId.Cumprinc,
1599
+ SLN: BuiltinId.Sln,
1600
+ SYD: BuiltinId.Syd,
1601
+ DISC: BuiltinId.Disc,
1602
+ INTRATE: BuiltinId.Intrate,
1603
+ RECEIVED: BuiltinId.Received,
1604
+ COUPDAYBS: BuiltinId.Coupdaybs,
1605
+ COUPDAYS: BuiltinId.Coupdays,
1606
+ COUPDAYSNC: BuiltinId.Coupdaysnc,
1607
+ COUPNCD: BuiltinId.Coupncd,
1608
+ COUPNUM: BuiltinId.Coupnum,
1609
+ COUPPCD: BuiltinId.Couppcd,
1610
+ PRICEDISC: BuiltinId.Pricedisc,
1611
+ YIELDDISC: BuiltinId.Yielddisc,
1612
+ PRICEMAT: BuiltinId.Pricemat,
1613
+ YIELDMAT: BuiltinId.Yieldmat,
1614
+ ODDFPRICE: BuiltinId.Oddfprice,
1615
+ ODDFYIELD: BuiltinId.Oddfyield,
1616
+ ODDLPRICE: BuiltinId.Oddlprice,
1617
+ ODDLYIELD: BuiltinId.Oddlyield,
1618
+ PRICE: BuiltinId.Price,
1619
+ YIELD: BuiltinId.Yield,
1620
+ DURATION: BuiltinId.Duration,
1621
+ MDURATION: BuiltinId.Mduration,
1622
+ TBILLPRICE: BuiltinId.Tbillprice,
1623
+ TBILLYIELD: BuiltinId.Tbillyield,
1624
+ TBILLEQ: BuiltinId.Tbilleq,
1625
+ PERMUT: BuiltinId.Permut,
1626
+ PERMUTATIONA: BuiltinId.Permutationa,
1627
+ ERF: BuiltinId.Erf,
1628
+ "ERF.PRECISE": BuiltinId.ErfPrecise,
1629
+ ERFC: BuiltinId.Erfc,
1630
+ "ERFC.PRECISE": BuiltinId.ErfcPrecise,
1631
+ FISHER: BuiltinId.Fisher,
1632
+ FISHERINV: BuiltinId.Fisherinv,
1633
+ GAMMALN: BuiltinId.Gammaln,
1634
+ "GAMMALN.PRECISE": BuiltinId.GammalnPrecise,
1635
+ GAMMA: BuiltinId.Gamma,
1636
+ "GAMMA.INV": BuiltinId.GammaInv,
1637
+ GAMMAINV: BuiltinId.Gammainv,
1638
+ EXPONDIST: BuiltinId.Expondist,
1639
+ "EXPON.DIST": BuiltinId.ExponDist,
1640
+ POISSON: BuiltinId.Poisson,
1641
+ "POISSON.DIST": BuiltinId.PoissonDist,
1642
+ WEIBULL: BuiltinId.Weibull,
1643
+ "WEIBULL.DIST": BuiltinId.WeibullDist,
1644
+ GAMMADIST: BuiltinId.Gammadist,
1645
+ "GAMMA.DIST": BuiltinId.GammaDist,
1646
+ CHIDIST: BuiltinId.Chidist,
1647
+ "LEGACY.CHIDIST": BuiltinId.LegacyChidist,
1648
+ CHIINV: BuiltinId.Chiinv,
1649
+ "CHISQ.DIST.RT": BuiltinId.ChisqDistRt,
1650
+ "CHISQ.DIST": BuiltinId.ChisqDist,
1651
+ "CHISQ.INV.RT": BuiltinId.ChisqInvRt,
1652
+ "CHISQ.INV": BuiltinId.ChisqInv,
1653
+ CHISQDIST: BuiltinId.Chisqdist,
1654
+ CHISQINV: BuiltinId.Chisqinv,
1655
+ "LEGACY.CHIINV": BuiltinId.LegacyChiinv,
1656
+ "BETA.DIST": BuiltinId.BetaDist,
1657
+ "BETA.INV": BuiltinId.BetaInv,
1658
+ BETADIST: BuiltinId.Betadist,
1659
+ BETAINV: BuiltinId.Betainv,
1660
+ "F.DIST": BuiltinId.FDist,
1661
+ "F.DIST.RT": BuiltinId.FDistRt,
1662
+ "F.INV": BuiltinId.FInv,
1663
+ "F.INV.RT": BuiltinId.FInvRt,
1664
+ FDIST: BuiltinId.Fdist,
1665
+ FINV: BuiltinId.Finv,
1666
+ "LEGACY.FDIST": BuiltinId.LegacyFdist,
1667
+ "LEGACY.FINV": BuiltinId.LegacyFinv,
1668
+ "T.DIST": BuiltinId.TDist,
1669
+ "T.DIST.RT": BuiltinId.TDistRt,
1670
+ "T.DIST.2T": BuiltinId.TDist2T,
1671
+ "T.INV": BuiltinId.TInv,
1672
+ "T.INV.2T": BuiltinId.TInv2T,
1673
+ TDIST: BuiltinId.Tdist,
1674
+ TINV: BuiltinId.Tinv,
1675
+ "CHISQ.TEST": BuiltinId.ChisqTest,
1676
+ CHITEST: BuiltinId.Chitest,
1677
+ "LEGACY.CHITEST": BuiltinId.LegacyChitest,
1678
+ "F.TEST": BuiltinId.FTest,
1679
+ FTEST: BuiltinId.Ftest,
1680
+ "T.TEST": BuiltinId.TTest,
1681
+ TTEST: BuiltinId.Ttest,
1682
+ "Z.TEST": BuiltinId.ZTest,
1683
+ ZTEST: BuiltinId.Ztest,
1684
+ BINOMDIST: BuiltinId.Binomdist,
1685
+ "BINOM.DIST": BuiltinId.BinomDist,
1686
+ "BINOM.DIST.RANGE": BuiltinId.BinomDistRange,
1687
+ CRITBINOM: BuiltinId.Critbinom,
1688
+ "BINOM.INV": BuiltinId.BinomInv,
1689
+ HYPGEOMDIST: BuiltinId.Hypgeomdist,
1690
+ "HYPGEOM.DIST": BuiltinId.HypgeomDist,
1691
+ NEGBINOMDIST: BuiltinId.Negbinomdist,
1692
+ "NEGBINOM.DIST": BuiltinId.NegbinomDist,
1693
+ };
1694
+ const id = builtins[name.toUpperCase()];
1695
+ if (!id) {
1696
+ throw new Error(`Unsupported builtin for wasm: ${name}`);
1697
+ }
1698
+ return id;
1699
+ }
1700
+ //# sourceMappingURL=binder.js.map