@bilig/formula 0.1.83 → 0.1.85

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