@bilig/formula 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1031 @@
1
+ import { parseRangeAddress } from "./addressing.js";
2
+ const RANGE_SAFE_BUILTINS = new Set([
3
+ "SUM",
4
+ "AVG",
5
+ "AVERAGE",
6
+ "MIN",
7
+ "MAX",
8
+ "COUNT",
9
+ "COUNTA",
10
+ "COUNTBLANK",
11
+ "PRODUCT",
12
+ "GEOMEAN",
13
+ "HARMEAN",
14
+ "SUMSQ",
15
+ "GCD",
16
+ "LCM",
17
+ "MODE",
18
+ "MODE.SNGL",
19
+ "STDEV",
20
+ "STDEV.P",
21
+ "STDEV.S",
22
+ "STDEVA",
23
+ "STDEVP",
24
+ "STDEVPA",
25
+ "VAR",
26
+ "VAR.P",
27
+ "VAR.S",
28
+ "VARA",
29
+ "VARP",
30
+ "VARPA",
31
+ "SKEW",
32
+ "SKEW.P",
33
+ "KURT",
34
+ ]);
35
+ const AXIS_AGGREGATE_CODES = new Map([
36
+ ["SUM", 1],
37
+ ["AVERAGE", 2],
38
+ ["AVG", 2],
39
+ ["MIN", 3],
40
+ ["MAX", 4],
41
+ ["COUNT", 5],
42
+ ["COUNTA", 6],
43
+ ]);
44
+ export function isCellRangeNode(node) {
45
+ if (node.kind !== "RangeRef") {
46
+ return false;
47
+ }
48
+ try {
49
+ const sheetPrefix = node.sheetName ? `${node.sheetName}!` : "";
50
+ return parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`).kind === "cells";
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ export function getNativeAxisAggregateCode(node) {
57
+ if (node.kind !== "CallExpr" ||
58
+ node.callee.toUpperCase() !== "LAMBDA" ||
59
+ node.args.length !== 2) {
60
+ return null;
61
+ }
62
+ const [param, body] = node.args;
63
+ if (param?.kind !== "NameRef" || body?.kind !== "CallExpr" || body.args.length !== 1) {
64
+ return null;
65
+ }
66
+ const aggregateCode = AXIS_AGGREGATE_CODES.get(body.callee.toUpperCase());
67
+ if (aggregateCode === undefined) {
68
+ return null;
69
+ }
70
+ return body.args[0]?.kind === "NameRef" &&
71
+ body.args[0].name.trim().toUpperCase() === param.name.trim().toUpperCase()
72
+ ? aggregateCode
73
+ : null;
74
+ }
75
+ export function getNativeRunningFoldCode(node) {
76
+ if (node.kind !== "CallExpr" ||
77
+ node.callee.toUpperCase() !== "LAMBDA" ||
78
+ node.args.length !== 3) {
79
+ return null;
80
+ }
81
+ const [acc, value, body] = node.args;
82
+ if (acc?.kind !== "NameRef" || value?.kind !== "NameRef" || body?.kind !== "BinaryExpr") {
83
+ return null;
84
+ }
85
+ const foldCode = body.operator === "+" ? 1 : body.operator === "*" ? 2 : null;
86
+ if (foldCode === null) {
87
+ return null;
88
+ }
89
+ const left = body.left;
90
+ const right = body.right;
91
+ const accName = acc.name.trim().toUpperCase();
92
+ const valueName = value.name.trim().toUpperCase();
93
+ return left.kind === "NameRef" &&
94
+ right.kind === "NameRef" &&
95
+ ((left.name.trim().toUpperCase() === accName &&
96
+ right.name.trim().toUpperCase() === valueName) ||
97
+ (left.name.trim().toUpperCase() === valueName && right.name.trim().toUpperCase() === accName))
98
+ ? foldCode
99
+ : null;
100
+ }
101
+ export function isNativeMakearraySumLambda(node) {
102
+ if (node.kind !== "CallExpr" ||
103
+ node.callee.toUpperCase() !== "LAMBDA" ||
104
+ node.args.length !== 3) {
105
+ return false;
106
+ }
107
+ const [rowParam, colParam, body] = node.args;
108
+ if (rowParam?.kind !== "NameRef" || colParam?.kind !== "NameRef" || body?.kind !== "BinaryExpr") {
109
+ return false;
110
+ }
111
+ if (body.operator !== "+") {
112
+ return false;
113
+ }
114
+ const left = body.left;
115
+ const right = body.right;
116
+ const rowName = rowParam.name.trim().toUpperCase();
117
+ const colName = colParam.name.trim().toUpperCase();
118
+ return (left.kind === "NameRef" &&
119
+ right.kind === "NameRef" &&
120
+ ((left.name.trim().toUpperCase() === rowName && right.name.trim().toUpperCase() === colName) ||
121
+ (left.name.trim().toUpperCase() === colName && right.name.trim().toUpperCase() === rowName)));
122
+ }
123
+ export function isCellVectorNode(node) {
124
+ if (node.kind !== "RangeRef") {
125
+ return false;
126
+ }
127
+ try {
128
+ const sheetPrefix = node.sheetName ? `${node.sheetName}!` : "";
129
+ const range = parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`);
130
+ return (range.kind === "cells" &&
131
+ (range.start.row === range.end.row || range.start.col === range.end.col));
132
+ }
133
+ catch {
134
+ return false;
135
+ }
136
+ }
137
+ export function isWasmSafeBuiltinArity(callee, argc) {
138
+ switch (callee) {
139
+ case "NOT":
140
+ case "LEN":
141
+ case "YEAR":
142
+ case "MONTH":
143
+ case "DAY":
144
+ case "HOUR":
145
+ case "MINUTE":
146
+ case "SECOND":
147
+ case "INT":
148
+ case "SIN":
149
+ case "COS":
150
+ case "TAN":
151
+ case "ASIN":
152
+ case "ACOS":
153
+ case "ATAN":
154
+ case "DEGREES":
155
+ case "RADIANS":
156
+ case "EXP":
157
+ case "LN":
158
+ case "LOG10":
159
+ case "SQRT":
160
+ return argc === 1;
161
+ case "TODAY":
162
+ case "NOW":
163
+ case "RAND":
164
+ return argc === 0;
165
+ case "NA":
166
+ return argc === 0;
167
+ case "IF":
168
+ return argc === 3;
169
+ case "IFS":
170
+ return argc >= 2 && argc % 2 === 0;
171
+ case "IFERROR":
172
+ case "IFNA":
173
+ return argc === 2;
174
+ case "WEEKDAY":
175
+ return argc === 1 || argc === 2;
176
+ case "DAYS":
177
+ return argc === 2;
178
+ case "COUNTBLANK":
179
+ return argc >= 1;
180
+ case "CHOOSE":
181
+ return argc >= 2;
182
+ case "DAYS360":
183
+ case "YEARFRAC":
184
+ return argc === 2 || argc === 3;
185
+ case "DISC":
186
+ case "INTRATE":
187
+ case "RECEIVED":
188
+ case "PRICEDISC":
189
+ case "YIELDDISC":
190
+ return argc === 4 || argc === 5;
191
+ case "COUPDAYBS":
192
+ case "COUPDAYS":
193
+ case "COUPDAYSNC":
194
+ case "COUPNCD":
195
+ case "COUPNUM":
196
+ case "COUPPCD":
197
+ return argc === 3 || argc === 4;
198
+ case "PRICEMAT":
199
+ case "YIELDMAT":
200
+ case "DURATION":
201
+ case "MDURATION":
202
+ return argc === 5 || argc === 6;
203
+ case "ODDFPRICE":
204
+ case "ODDFYIELD":
205
+ case "ODDLPRICE":
206
+ case "ODDLYIELD":
207
+ return argc === 7 || argc === 8;
208
+ case "TBILLPRICE":
209
+ case "TBILLYIELD":
210
+ case "TBILLEQ":
211
+ return argc === 3;
212
+ case "IRR":
213
+ return argc === 1 || argc === 2;
214
+ case "MIRR":
215
+ return argc === 3;
216
+ case "XNPV":
217
+ return argc === 3;
218
+ case "XIRR":
219
+ return argc === 2 || argc === 3;
220
+ case "PRICE":
221
+ case "YIELD":
222
+ return argc === 6 || argc === 7;
223
+ case "ISOWEEKNUM":
224
+ case "TIMEVALUE":
225
+ return argc === 1;
226
+ case "WEEKNUM":
227
+ return argc === 1 || argc === 2;
228
+ case "WORKDAY":
229
+ case "NETWORKDAYS":
230
+ return argc === 2 || argc === 3;
231
+ case "WORKDAY.INTL":
232
+ case "NETWORKDAYS.INTL":
233
+ return argc >= 2 && argc <= 4;
234
+ case "COUNTIF":
235
+ case "USE.THE.COUNTIF":
236
+ return argc === 2;
237
+ case "COUNTIFS":
238
+ return argc >= 2 && argc % 2 === 0;
239
+ case "DAVERAGE":
240
+ case "DCOUNT":
241
+ case "DCOUNTA":
242
+ case "DGET":
243
+ case "DMAX":
244
+ case "DMIN":
245
+ case "DPRODUCT":
246
+ case "DSTDEV":
247
+ case "DSTDEVP":
248
+ case "DSUM":
249
+ case "DVAR":
250
+ case "DVARP":
251
+ return argc === 3;
252
+ case "ADDRESS":
253
+ return argc >= 2 && argc <= 5;
254
+ case "SUMIF":
255
+ case "AVERAGEIF":
256
+ return argc === 2 || argc === 3;
257
+ case "SUMIFS":
258
+ case "AVERAGEIFS":
259
+ return argc >= 3 && argc % 2 === 1;
260
+ case "REPLACE":
261
+ return argc === 4;
262
+ case "SUBSTITUTE":
263
+ return argc === 3 || argc === 4;
264
+ case "REPT":
265
+ return argc === 2;
266
+ case "TEXT":
267
+ return argc === 2;
268
+ case "PHONETIC":
269
+ return argc === 1;
270
+ case "TEXTBEFORE":
271
+ case "TEXTAFTER":
272
+ return argc >= 2 && argc <= 6;
273
+ case "TEXTSPLIT":
274
+ return argc >= 2 && argc <= 6;
275
+ case "TEXTJOIN":
276
+ return argc >= 3;
277
+ case "POWER":
278
+ case "CONVERT":
279
+ return argc === 3;
280
+ case "EXACT":
281
+ case "ATAN2":
282
+ return argc === 2;
283
+ case "BESSELI":
284
+ case "BESSELJ":
285
+ case "BESSELK":
286
+ case "BESSELY":
287
+ return argc === 2;
288
+ case "EUROCONVERT":
289
+ return argc >= 3 && argc <= 5;
290
+ case "UPPER":
291
+ case "LOWER":
292
+ case "TRIM":
293
+ case "VALUE":
294
+ case "CHAR":
295
+ case "CODE":
296
+ case "UNICODE":
297
+ case "UNICHAR":
298
+ case "CLEAN":
299
+ case "ASC":
300
+ case "JIS":
301
+ case "DBCS":
302
+ case "BAHTTEXT":
303
+ case "LENB":
304
+ case "SINH":
305
+ case "COSH":
306
+ case "TANH":
307
+ case "ASINH":
308
+ case "ACOSH":
309
+ case "ATANH":
310
+ case "ACOT":
311
+ case "ACOTH":
312
+ case "COT":
313
+ case "COTH":
314
+ case "CSC":
315
+ case "CSCH":
316
+ case "SEC":
317
+ case "SECH":
318
+ case "SIGN":
319
+ case "EVEN":
320
+ case "ODD":
321
+ case "FACT":
322
+ case "FACTDOUBLE":
323
+ return argc === 1;
324
+ case "NUMBERVALUE":
325
+ return argc >= 1 && argc <= 3;
326
+ case "VALUETOTEXT":
327
+ return argc === 1 || argc === 2;
328
+ case "DOLLAR":
329
+ return argc >= 1 && argc <= 3;
330
+ case "DOLLARDE":
331
+ case "DOLLARFR":
332
+ case "COMBIN":
333
+ case "COMBINA":
334
+ case "QUOTIENT":
335
+ return argc === 2;
336
+ case "BASE":
337
+ return argc === 2 || argc === 3;
338
+ case "DECIMAL":
339
+ return argc === 2;
340
+ case "BIN2DEC":
341
+ case "HEX2DEC":
342
+ case "OCT2DEC":
343
+ return argc === 1;
344
+ case "BIN2HEX":
345
+ case "BIN2OCT":
346
+ case "DEC2BIN":
347
+ case "DEC2HEX":
348
+ case "DEC2OCT":
349
+ case "HEX2BIN":
350
+ case "HEX2OCT":
351
+ case "OCT2BIN":
352
+ case "OCT2HEX":
353
+ return argc === 1 || argc === 2;
354
+ case "BITAND":
355
+ case "BITOR":
356
+ case "BITXOR":
357
+ return argc >= 2;
358
+ case "BITLSHIFT":
359
+ case "BITRSHIFT":
360
+ return argc === 2;
361
+ case "MATCH":
362
+ return argc === 2 || argc === 3;
363
+ case "CORREL":
364
+ case "COVAR":
365
+ case "PEARSON":
366
+ case "COVARIANCE.P":
367
+ case "COVARIANCE.S":
368
+ case "PERCENTRANK":
369
+ case "PERCENTRANK.INC":
370
+ case "PERCENTRANK.EXC":
371
+ case "SMALL":
372
+ case "LARGE":
373
+ case "PERCENTILE":
374
+ case "PERCENTILE.INC":
375
+ case "PERCENTILE.EXC":
376
+ case "QUARTILE":
377
+ case "QUARTILE.INC":
378
+ case "QUARTILE.EXC":
379
+ case "RANK":
380
+ case "RANK.EQ":
381
+ case "RANK.AVG":
382
+ case "INTERCEPT":
383
+ case "RSQ":
384
+ case "SLOPE":
385
+ case "STEYX":
386
+ return argc === 2 || argc === 3;
387
+ case "MEDIAN":
388
+ case "MODE.MULT":
389
+ case "GCD":
390
+ case "LCM":
391
+ case "PRODUCT":
392
+ case "GEOMEAN":
393
+ case "HARMEAN":
394
+ case "SUMSQ":
395
+ return argc >= 1;
396
+ case "FREQUENCY":
397
+ return argc === 2;
398
+ case "PROB":
399
+ return argc === 3 || argc === 4;
400
+ case "TRIMMEAN":
401
+ return argc === 2;
402
+ case "FORECAST":
403
+ case "FORECAST.LINEAR":
404
+ return argc === 3;
405
+ case "TREND":
406
+ case "GROWTH":
407
+ case "LINEST":
408
+ case "LOGEST":
409
+ return argc >= 1 && argc <= 4;
410
+ case "XMATCH":
411
+ return argc >= 2 && argc <= 4;
412
+ case "XLOOKUP":
413
+ return argc >= 3 && argc <= 6;
414
+ case "INDEX":
415
+ return argc === 2 || argc === 3;
416
+ case "VLOOKUP":
417
+ case "HLOOKUP":
418
+ return argc === 3 || argc === 4;
419
+ case "LEFT":
420
+ case "RIGHT":
421
+ case "LEFTB":
422
+ case "RIGHTB":
423
+ return argc === 1 || argc === 2;
424
+ case "MID":
425
+ case "MIDB":
426
+ return argc === 3;
427
+ case "FIND":
428
+ case "SEARCH":
429
+ case "FINDB":
430
+ case "SEARCHB":
431
+ return argc === 2 || argc === 3;
432
+ case "REPLACEB":
433
+ return argc === 4;
434
+ case "ISBLANK":
435
+ case "ISNUMBER":
436
+ case "ISTEXT":
437
+ return argc === 0 || argc === 1;
438
+ case "ROUND":
439
+ case "ROUNDUP":
440
+ case "ROUNDDOWN":
441
+ case "FLOOR":
442
+ case "CEILING":
443
+ case "LOG":
444
+ return argc === 1 || argc === 2;
445
+ case "T":
446
+ case "N":
447
+ case "TYPE":
448
+ case "GAUSS":
449
+ case "PHI":
450
+ case "NORMSDIST":
451
+ case "NORMSINV":
452
+ return argc === 1 || (argc === 0 && (callee === "T" || callee === "N" || callee === "TYPE"));
453
+ case "DELTA":
454
+ case "GESTEP":
455
+ case "LOGNORMDIST":
456
+ case "EFFECT":
457
+ case "NOMINAL":
458
+ case "RRI":
459
+ case "PERMUT":
460
+ case "PERMUTATIONA":
461
+ return argc === 2;
462
+ case "STANDARDIZE":
463
+ case "NORMINV":
464
+ case "LOGINV":
465
+ case "PDURATION":
466
+ case "CONFIDENCE.NORM":
467
+ case "CONFIDENCE":
468
+ case "CONFIDENCE.T":
469
+ case "CRITBINOM":
470
+ case "BINOM.INV":
471
+ return argc === 3;
472
+ case "ERF":
473
+ return argc === 1 || argc === 2;
474
+ case "ERF.PRECISE":
475
+ case "ERFC":
476
+ case "ERFC.PRECISE":
477
+ case "FISHER":
478
+ case "FISHERINV":
479
+ case "GAMMALN":
480
+ case "GAMMALN.PRECISE":
481
+ case "GAMMA":
482
+ return argc === 1;
483
+ case "GAMMA.INV":
484
+ case "GAMMAINV":
485
+ return argc === 3;
486
+ case "CHIDIST":
487
+ case "LEGACY.CHIDIST":
488
+ case "CHIINV":
489
+ case "CHISQ.DIST.RT":
490
+ case "CHISQ.INV.RT":
491
+ case "CHISQDIST":
492
+ case "CHISQINV":
493
+ case "LEGACY.CHIINV":
494
+ case "CHISQ.TEST":
495
+ case "CHITEST":
496
+ case "LEGACY.CHITEST":
497
+ case "F.TEST":
498
+ case "FTEST":
499
+ return argc === 2;
500
+ case "Z.TEST":
501
+ case "ZTEST":
502
+ return argc === 2 || argc === 3;
503
+ case "F.DIST.RT":
504
+ case "FDIST":
505
+ case "LEGACY.FDIST":
506
+ return argc === 3;
507
+ case "CHISQ.INV":
508
+ return argc === 2;
509
+ case "CHISQ.DIST":
510
+ return argc === 3;
511
+ case "BETA.INV":
512
+ case "BETAINV":
513
+ return argc >= 3 && argc <= 5;
514
+ case "BETA.DIST":
515
+ return argc >= 4 && argc <= 6;
516
+ case "BETADIST":
517
+ return argc >= 3 && argc <= 5;
518
+ case "F.DIST":
519
+ return argc === 4;
520
+ case "T.DIST":
521
+ return argc === 3;
522
+ case "T.DIST.RT":
523
+ case "T.DIST.2T":
524
+ case "T.INV":
525
+ case "T.INV.2T":
526
+ case "TINV":
527
+ return argc === 2;
528
+ case "TDIST":
529
+ return argc === 3;
530
+ case "T.TEST":
531
+ case "TTEST":
532
+ return argc === 4;
533
+ case "F.INV":
534
+ case "F.INV.RT":
535
+ case "FINV":
536
+ case "LEGACY.FINV":
537
+ return argc === 3;
538
+ case "WEIBULL":
539
+ case "WEIBULL.DIST":
540
+ case "GAMMADIST":
541
+ case "GAMMA.DIST":
542
+ case "BINOMDIST":
543
+ case "BINOM.DIST":
544
+ case "NEGBINOM.DIST":
545
+ return argc === 4;
546
+ case "EXPONDIST":
547
+ case "EXPON.DIST":
548
+ case "POISSON":
549
+ case "POISSON.DIST":
550
+ case "NEGBINOMDIST":
551
+ return argc === 3;
552
+ case "BINOM.DIST.RANGE":
553
+ return argc === 3 || argc === 4;
554
+ case "HYPGEOMDIST":
555
+ return argc === 4;
556
+ case "HYPGEOM.DIST":
557
+ return argc === 5;
558
+ case "NORMDIST":
559
+ return argc === 4;
560
+ case "NORM.DIST":
561
+ return argc === 4;
562
+ case "NORM.INV":
563
+ return argc === 3;
564
+ case "NORM.S.DIST":
565
+ return argc === 1 || argc === 2;
566
+ case "NORM.S.INV":
567
+ return argc === 1;
568
+ case "LOGNORM.DIST":
569
+ return argc === 3 || argc === 4;
570
+ case "LOGNORM.INV":
571
+ return argc === 3;
572
+ case "MODE":
573
+ case "MODE.SNGL":
574
+ case "STDEV":
575
+ case "STDEV.P":
576
+ case "STDEV.S":
577
+ case "STDEVA":
578
+ case "STDEVP":
579
+ case "STDEVPA":
580
+ case "VAR":
581
+ case "VAR.P":
582
+ case "VAR.S":
583
+ case "VARA":
584
+ case "VARP":
585
+ case "VARPA":
586
+ case "SKEW":
587
+ case "SKEW.P":
588
+ case "KURT":
589
+ case "NPV":
590
+ return argc >= 1;
591
+ case "FV":
592
+ case "PV":
593
+ case "PMT":
594
+ case "NPER":
595
+ return argc >= 3 && argc <= 5;
596
+ case "RATE":
597
+ return argc >= 3 && argc <= 6;
598
+ case "IPMT":
599
+ case "PPMT":
600
+ return argc >= 4 && argc <= 6;
601
+ case "ISPMT":
602
+ return argc === 4;
603
+ case "CUMIPMT":
604
+ case "CUMPRINC":
605
+ return argc === 6;
606
+ case "DATE":
607
+ case "TIME":
608
+ case "DATEDIF":
609
+ return argc === 3;
610
+ case "FVSCHEDULE":
611
+ return argc >= 2;
612
+ case "SLN":
613
+ return argc === 3;
614
+ case "DB":
615
+ case "DDB":
616
+ return argc === 4 || argc === 5;
617
+ case "SYD":
618
+ return argc === 4;
619
+ case "VDB":
620
+ return argc >= 5 && argc <= 7;
621
+ case "EDATE":
622
+ case "EOMONTH":
623
+ return argc === 2;
624
+ case "AND":
625
+ case "OR":
626
+ case "XOR":
627
+ return argc >= 1;
628
+ case "SWITCH":
629
+ return argc >= 3;
630
+ case "SEQUENCE":
631
+ return argc >= 1 && argc <= 4;
632
+ case "EXPAND":
633
+ return argc >= 2 && argc <= 4;
634
+ case "FILTER":
635
+ return argc === 2 || argc === 3;
636
+ case "UNIQUE":
637
+ return argc >= 1 && argc <= 3;
638
+ case "TRIMRANGE":
639
+ return argc >= 1 && argc <= 3;
640
+ case "OFFSET":
641
+ return argc >= 3 && argc <= 5;
642
+ case "TAKE":
643
+ case "DROP":
644
+ return argc >= 1 && argc <= 3;
645
+ case "CHOOSECOLS":
646
+ case "CHOOSEROWS":
647
+ return argc >= 2;
648
+ case "SORT":
649
+ return argc >= 1 && argc <= 4;
650
+ case "SORTBY":
651
+ return argc >= 2;
652
+ case "TOCOL":
653
+ case "TOROW":
654
+ return argc >= 1 && argc <= 3;
655
+ case "WRAPROWS":
656
+ case "WRAPCOLS":
657
+ return argc >= 2 && argc <= 4;
658
+ case "LOOKUP":
659
+ return argc === 2 || argc === 3;
660
+ case "AREAS":
661
+ case "COLUMNS":
662
+ case "ROWS":
663
+ case "TRANSPOSE":
664
+ return argc === 1;
665
+ case "HSTACK":
666
+ case "VSTACK":
667
+ return argc >= 1;
668
+ case "ARRAYTOTEXT":
669
+ return argc === 1 || argc === 2;
670
+ case "MINIFS":
671
+ case "MAXIFS":
672
+ return argc >= 3 && argc % 2 === 1;
673
+ default:
674
+ return true;
675
+ }
676
+ }
677
+ export function isWasmSafeBuiltinArgs(callee, args, deps) {
678
+ const argc = args.length;
679
+ const isScalarArg = (arg) => deps.isWasmSafe(arg);
680
+ const isCellRangeArg = (arg) => deps.isWasmSafe(arg, true) && isCellRangeNode(arg);
681
+ const isCellVectorArg = (arg) => deps.isWasmSafe(arg, true) && isCellVectorNode(arg);
682
+ const isCellOrScalarArg = (arg) => isCellVectorArg(arg) || isScalarArg(arg);
683
+ const isNativeSequenceArg = (arg) => arg.kind === "CallExpr" &&
684
+ arg.callee.toUpperCase() === "SEQUENCE" &&
685
+ isWasmSafeBuiltinArity("SEQUENCE", arg.args.length) &&
686
+ arg.args.every((child) => deps.isWasmSafe(child));
687
+ switch (callee) {
688
+ case "SUM":
689
+ case "AVG":
690
+ case "MIN":
691
+ case "MAX":
692
+ case "COUNT":
693
+ case "COUNTA":
694
+ case "COUNTBLANK":
695
+ return args.every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg));
696
+ case "CHOOSE":
697
+ return (argc >= 2 &&
698
+ isScalarArg(args[0]) &&
699
+ args.slice(1).every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg)));
700
+ case "COUNTIF":
701
+ case "USE.THE.COUNTIF":
702
+ return args.length === 2 && isCellRangeArg(args[0]) && isScalarArg(args[1]);
703
+ case "COUNTIFS":
704
+ if (args.length === 0 || args.length % 2 !== 0) {
705
+ return false;
706
+ }
707
+ return args.every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
708
+ case "DAVERAGE":
709
+ case "DCOUNT":
710
+ case "DCOUNTA":
711
+ case "DGET":
712
+ case "DMAX":
713
+ case "DMIN":
714
+ case "DPRODUCT":
715
+ case "DSTDEV":
716
+ case "DSTDEVP":
717
+ case "DSUM":
718
+ case "DVAR":
719
+ case "DVARP":
720
+ return (argc === 3 &&
721
+ isCellRangeArg(args[0]) &&
722
+ deps.isWasmSafe(args[1], true) &&
723
+ isCellRangeArg(args[2]));
724
+ case "CHISQ.TEST":
725
+ case "CHITEST":
726
+ case "LEGACY.CHITEST":
727
+ case "F.TEST":
728
+ case "FTEST":
729
+ return argc === 2 && args.every((arg) => deps.isWasmSafe(arg, true));
730
+ case "T.TEST":
731
+ case "TTEST":
732
+ return (argc === 4 &&
733
+ isCellRangeArg(args[0]) &&
734
+ isCellRangeArg(args[1]) &&
735
+ isScalarArg(args[2]) &&
736
+ isScalarArg(args[3]));
737
+ case "Z.TEST":
738
+ case "ZTEST":
739
+ return (argc === 2 || argc === 3) && args.every((arg) => deps.isWasmSafe(arg, true));
740
+ case "SUMIF":
741
+ case "AVERAGEIF":
742
+ if (args.length !== 2 && args.length !== 3) {
743
+ return false;
744
+ }
745
+ return (isCellRangeArg(args[0]) &&
746
+ isScalarArg(args[1]) &&
747
+ (args.length === 2 || isCellRangeArg(args[2])));
748
+ case "SUMIFS":
749
+ case "AVERAGEIFS":
750
+ if (args.length < 3 || args.length % 2 === 0) {
751
+ return false;
752
+ }
753
+ if (!isCellRangeArg(args[0])) {
754
+ return false;
755
+ }
756
+ return args
757
+ .slice(1)
758
+ .every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
759
+ case "SUMPRODUCT":
760
+ return args.length >= 1 && args.every((arg) => isCellRangeArg(arg));
761
+ case "MATCH":
762
+ return ((args.length === 2 || args.length === 3) &&
763
+ isScalarArg(args[0]) &&
764
+ isCellVectorArg(args[1]) &&
765
+ (args.length === 2 || isScalarArg(args[2])));
766
+ case "CORREL":
767
+ case "COVAR":
768
+ case "PEARSON":
769
+ case "COVARIANCE.P":
770
+ case "COVARIANCE.S":
771
+ case "INTERCEPT":
772
+ case "RSQ":
773
+ case "SLOPE":
774
+ case "STEYX":
775
+ return args.length === 2 && args.every((arg) => deps.isWasmSafe(arg, true));
776
+ case "MEDIAN":
777
+ return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
778
+ case "MODE.MULT":
779
+ return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
780
+ case "FREQUENCY":
781
+ return (args.length === 2 && deps.isWasmSafe(args[0], true) && deps.isWasmSafe(args[1], true));
782
+ case "BESSELI":
783
+ case "BESSELJ":
784
+ case "BESSELK":
785
+ case "BESSELY":
786
+ return args.length === 2 && isScalarArg(args[0]) && isScalarArg(args[1]);
787
+ case "SMALL":
788
+ case "LARGE":
789
+ case "PERCENTILE":
790
+ case "PERCENTILE.INC":
791
+ case "PERCENTILE.EXC":
792
+ case "QUARTILE":
793
+ case "QUARTILE.INC":
794
+ case "QUARTILE.EXC":
795
+ return args.length === 2 && deps.isWasmSafe(args[0], true) && isScalarArg(args[1]);
796
+ case "PERCENTRANK":
797
+ case "PERCENTRANK.INC":
798
+ case "PERCENTRANK.EXC":
799
+ return ((args.length === 2 || args.length === 3) &&
800
+ deps.isWasmSafe(args[0], true) &&
801
+ isScalarArg(args[1]) &&
802
+ (args.length === 2 || isScalarArg(args[2])));
803
+ case "RANK":
804
+ case "RANK.EQ":
805
+ case "RANK.AVG":
806
+ return ((args.length === 2 || args.length === 3) &&
807
+ isScalarArg(args[0]) &&
808
+ deps.isWasmSafe(args[1], true) &&
809
+ (args.length === 2 || isScalarArg(args[2])));
810
+ case "FORECAST":
811
+ case "FORECAST.LINEAR":
812
+ return (args.length === 3 &&
813
+ isScalarArg(args[0]) &&
814
+ deps.isWasmSafe(args[1], true) &&
815
+ deps.isWasmSafe(args[2], true));
816
+ case "TREND":
817
+ case "GROWTH":
818
+ case "LINEST":
819
+ case "LOGEST":
820
+ return (args.length >= 1 &&
821
+ args.length <= 4 &&
822
+ deps.isWasmSafe(args[0], true) &&
823
+ (args.length < 2 || deps.isWasmSafe(args[1], true)) &&
824
+ (args.length < 3 || deps.isWasmSafe(args[2], true)) &&
825
+ (args.length < 4 || isScalarArg(args[3])));
826
+ case "XMATCH":
827
+ return (args.length >= 2 &&
828
+ args.length <= 4 &&
829
+ isScalarArg(args[0]) &&
830
+ isCellVectorArg(args[1]) &&
831
+ args.slice(2).every((arg) => isScalarArg(arg)));
832
+ case "XLOOKUP":
833
+ return (args.length >= 3 &&
834
+ args.length <= 6 &&
835
+ isScalarArg(args[0]) &&
836
+ isCellVectorArg(args[1]) &&
837
+ isCellVectorArg(args[2]) &&
838
+ args.slice(3).every((arg) => isScalarArg(arg)));
839
+ case "INDEX":
840
+ return ((args.length === 2 || args.length === 3) &&
841
+ isCellRangeArg(args[0]) &&
842
+ isScalarArg(args[1]) &&
843
+ (args.length === 2 || isScalarArg(args[2])));
844
+ case "VLOOKUP":
845
+ case "HLOOKUP":
846
+ return ((args.length === 3 || args.length === 4) &&
847
+ isScalarArg(args[0]) &&
848
+ isCellRangeArg(args[1]) &&
849
+ isScalarArg(args[2]) &&
850
+ (args.length === 3 || isScalarArg(args[3])));
851
+ case "DAYS":
852
+ case "DAYS360":
853
+ case "YEARFRAC":
854
+ case "DISC":
855
+ case "INTRATE":
856
+ case "RECEIVED":
857
+ case "PRICEDISC":
858
+ case "YIELDDISC":
859
+ case "COUPDAYBS":
860
+ case "COUPDAYS":
861
+ case "COUPDAYSNC":
862
+ case "COUPNCD":
863
+ case "COUPNUM":
864
+ case "COUPPCD":
865
+ case "PRICEMAT":
866
+ case "YIELDMAT":
867
+ case "ODDFPRICE":
868
+ case "ODDFYIELD":
869
+ case "ODDLPRICE":
870
+ case "ODDLYIELD":
871
+ case "PRICE":
872
+ case "YIELD":
873
+ case "DURATION":
874
+ case "MDURATION":
875
+ case "TBILLPRICE":
876
+ case "TBILLYIELD":
877
+ case "TBILLEQ":
878
+ case "ISOWEEKNUM":
879
+ case "TIMEVALUE":
880
+ case "WEEKNUM":
881
+ return args.every((arg) => isScalarArg(arg));
882
+ case "EXPAND":
883
+ return (argc >= 2 &&
884
+ argc <= 4 &&
885
+ deps.isWasmSafe(args[0], true) &&
886
+ isScalarArg(args[1]) &&
887
+ (argc < 3 || isScalarArg(args[2])) &&
888
+ (argc < 4 || isScalarArg(args[3])));
889
+ case "WORKDAY":
890
+ case "NETWORKDAYS":
891
+ case "WORKDAY.INTL":
892
+ case "NETWORKDAYS.INTL":
893
+ case "NUMBERVALUE":
894
+ case "TEXT":
895
+ case "VALUETOTEXT":
896
+ case "TEXTBEFORE":
897
+ case "TEXTAFTER":
898
+ case "CHAR":
899
+ case "CODE":
900
+ case "UNICODE":
901
+ case "UNICHAR":
902
+ case "CLEAN":
903
+ case "ASC":
904
+ case "JIS":
905
+ case "DBCS":
906
+ case "BAHTTEXT":
907
+ case "TEXTSPLIT":
908
+ case "CONVERT":
909
+ case "EUROCONVERT":
910
+ case "BASE":
911
+ case "DECIMAL":
912
+ case "BIN2DEC":
913
+ case "BIN2HEX":
914
+ case "BIN2OCT":
915
+ case "DEC2BIN":
916
+ case "DEC2HEX":
917
+ case "DEC2OCT":
918
+ case "HEX2BIN":
919
+ case "HEX2DEC":
920
+ case "HEX2OCT":
921
+ case "OCT2BIN":
922
+ case "OCT2DEC":
923
+ case "OCT2HEX":
924
+ case "BITAND":
925
+ case "BITOR":
926
+ case "BITXOR":
927
+ case "BITLSHIFT":
928
+ case "BITRSHIFT":
929
+ return args.every((arg) => isScalarArg(arg));
930
+ case "PHONETIC":
931
+ return argc === 1 && (isScalarArg(args[0]) || isCellRangeNode(args[0]));
932
+ case "TEXTJOIN":
933
+ return (argc >= 3 &&
934
+ isScalarArg(args[0]) &&
935
+ isScalarArg(args[1]) &&
936
+ args.slice(2).every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg)));
937
+ case "REPLACE":
938
+ case "SUBSTITUTE":
939
+ case "REPT":
940
+ return args.every((arg) => isScalarArg(arg));
941
+ case "OFFSET":
942
+ case "TAKE":
943
+ case "DROP":
944
+ case "CHOOSECOLS":
945
+ case "CHOOSEROWS":
946
+ case "SORT":
947
+ case "TOCOL":
948
+ case "TOROW":
949
+ case "WRAPROWS":
950
+ case "WRAPCOLS":
951
+ if (args.length === 0) {
952
+ return false;
953
+ }
954
+ return isCellRangeArg(args[0]) && args.slice(1).every((arg) => isScalarArg(arg));
955
+ case "FILTER":
956
+ return ((argc === 2 || argc === 3) &&
957
+ isCellRangeArg(args[0]) &&
958
+ deps.isWasmSafe(args[1], true) &&
959
+ (argc === 2 || isScalarArg(args[2])));
960
+ case "UNIQUE":
961
+ return (argc >= 1 &&
962
+ argc <= 3 &&
963
+ isCellRangeArg(args[0]) &&
964
+ args.slice(1).every((arg) => isScalarArg(arg)));
965
+ case "TRIMRANGE":
966
+ return (argc >= 1 &&
967
+ argc <= 3 &&
968
+ deps.isWasmSafe(args[0], true) &&
969
+ args.slice(1).every((arg) => isScalarArg(arg)));
970
+ case "PROB":
971
+ return ((argc === 3 || argc === 4) &&
972
+ deps.isWasmSafe(args[0], true) &&
973
+ deps.isWasmSafe(args[1], true) &&
974
+ isScalarArg(args[2]) &&
975
+ (argc === 3 || isScalarArg(args[3])));
976
+ case "TRIMMEAN":
977
+ return argc === 2 && deps.isWasmSafe(args[0], true) && isScalarArg(args[1]);
978
+ case "LOOKUP":
979
+ if (argc < 2 || argc > 3) {
980
+ return false;
981
+ }
982
+ return (isScalarArg(args[0]) &&
983
+ isCellOrScalarArg(args[1]) &&
984
+ (argc === 2 || isCellVectorArg(args[2]) || isScalarArg(args[2])));
985
+ case "TRANSPOSE":
986
+ return args.length === 1 && deps.isWasmSafe(args[0], true);
987
+ case "HSTACK":
988
+ case "VSTACK":
989
+ return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
990
+ case "AREAS":
991
+ case "COLUMNS":
992
+ case "ROWS":
993
+ return args.length === 1 && isCellRangeArg(args[0]);
994
+ case "ARRAYTOTEXT":
995
+ return ((argc === 1 || argc === 2) &&
996
+ (isCellRangeArg(args[0]) || isScalarArg(args[0])) &&
997
+ (argc === 1 || isScalarArg(args[1])));
998
+ case "MINIFS":
999
+ case "MAXIFS":
1000
+ if (args.length < 3 || args.length % 2 === 0 || !isCellRangeArg(args[0])) {
1001
+ return false;
1002
+ }
1003
+ return args
1004
+ .slice(1)
1005
+ .every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
1006
+ case "IRR":
1007
+ return ((argc === 1 || argc === 2) &&
1008
+ isCellRangeArg(args[0]) &&
1009
+ (argc === 1 || isScalarArg(args[1])));
1010
+ case "MIRR":
1011
+ return (argc === 3 && isCellRangeArg(args[0]) && isScalarArg(args[1]) && isScalarArg(args[2]));
1012
+ case "XNPV":
1013
+ return (argc === 3 && isScalarArg(args[0]) && isCellRangeArg(args[1]) && isCellRangeArg(args[2]));
1014
+ case "XIRR":
1015
+ return ((argc === 2 || argc === 3) &&
1016
+ isCellRangeArg(args[0]) &&
1017
+ isCellRangeArg(args[1]) &&
1018
+ (argc === 2 || isScalarArg(args[2])));
1019
+ case "SORTBY":
1020
+ if (args.length < 2) {
1021
+ return false;
1022
+ }
1023
+ return (isCellRangeArg(args[0]) &&
1024
+ args
1025
+ .slice(1)
1026
+ .every((arg, index) => index % 2 === 0 ? isScalarArg(arg) || deps.isWasmSafe(arg, true) : isScalarArg(arg)));
1027
+ default:
1028
+ return args.every((arg) => deps.isWasmSafe(arg, RANGE_SAFE_BUILTINS.has(callee)));
1029
+ }
1030
+ }
1031
+ //# sourceMappingURL=binder-wasm-rules.js.map