@ricsam/formula-engine 0.0.1

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 (569) hide show
  1. package/README.md +100 -0
  2. package/dist/cjs/core/ast-traverser.cjs +124 -0
  3. package/dist/cjs/core/ast-traverser.cjs.map +10 -0
  4. package/dist/cjs/core/autofill-utils.cjs +304 -0
  5. package/dist/cjs/core/autofill-utils.cjs.map +10 -0
  6. package/dist/cjs/core/engine.cjs +390 -0
  7. package/dist/cjs/core/engine.cjs.map +10 -0
  8. package/dist/cjs/core/managers/cache-manager.cjs +58 -0
  9. package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
  10. package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
  11. package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
  12. package/dist/cjs/core/managers/dependency-node.cjs +24 -0
  13. package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
  14. package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
  15. package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
  16. package/dist/cjs/core/managers/event-manager.cjs +49 -0
  17. package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
  18. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
  19. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
  20. package/dist/cjs/core/managers/index.cjs +49 -0
  21. package/dist/cjs/core/managers/index.cjs.map +10 -0
  22. package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
  23. package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
  24. package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
  25. package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
  26. package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
  27. package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
  28. package/dist/cjs/core/managers/table-manager.cjs +254 -0
  29. package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
  30. package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
  31. package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
  32. package/dist/cjs/core/map-serializer.cjs +69 -0
  33. package/dist/cjs/core/map-serializer.cjs.map +10 -0
  34. package/dist/cjs/core/named-expression-renamer.cjs +88 -0
  35. package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
  36. package/dist/cjs/core/sheet-renamer.cjs +89 -0
  37. package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
  38. package/dist/cjs/core/sheet-utils.cjs +39 -0
  39. package/dist/cjs/core/sheet-utils.cjs.map +10 -0
  40. package/dist/cjs/core/table-renamer.cjs +88 -0
  41. package/dist/cjs/core/table-renamer.cjs.map +10 -0
  42. package/dist/cjs/core/types.cjs +48 -0
  43. package/dist/cjs/core/types.cjs.map +10 -0
  44. package/dist/cjs/core/utils/range-serializer.cjs +65 -0
  45. package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
  46. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
  47. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
  48. package/dist/cjs/core/utils.cjs +434 -0
  49. package/dist/cjs/core/utils.cjs.map +10 -0
  50. package/dist/cjs/core/workbook-renamer.cjs +106 -0
  51. package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
  52. package/dist/cjs/debug/flags.cjs +47 -0
  53. package/dist/cjs/debug/flags.cjs.map +10 -0
  54. package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
  55. package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
  56. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
  57. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
  58. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
  59. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
  60. package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
  61. package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
  62. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
  63. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
  64. package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
  65. package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
  66. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
  67. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
  68. package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
  69. package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
  70. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
  71. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
  72. package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
  73. package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
  74. package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
  75. package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
  76. package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
  77. package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
  78. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
  79. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
  80. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
  81. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
  82. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
  83. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
  84. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
  85. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
  86. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
  87. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
  88. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
  89. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
  90. package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
  91. package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
  92. package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
  93. package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
  94. package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
  95. package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
  96. package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
  97. package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
  98. package/dist/cjs/functions/_template/template.cjs +42 -0
  99. package/dist/cjs/functions/_template/template.cjs.map +10 -0
  100. package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
  101. package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
  102. package/dist/cjs/functions/criteria-parser.cjs +217 -0
  103. package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
  104. package/dist/cjs/functions/criteria-utils.cjs +291 -0
  105. package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
  106. package/dist/cjs/functions/function-utils.cjs +63 -0
  107. package/dist/cjs/functions/function-utils.cjs.map +10 -0
  108. package/dist/cjs/functions/index.cjs +125 -0
  109. package/dist/cjs/functions/index.cjs.map +10 -0
  110. package/dist/cjs/functions/information/cell/cell.cjs +196 -0
  111. package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
  112. package/dist/cjs/functions/information/column/column.cjs +144 -0
  113. package/dist/cjs/functions/information/column/column.cjs.map +10 -0
  114. package/dist/cjs/functions/information/row/row.cjs +150 -0
  115. package/dist/cjs/functions/information/row/row.cjs.map +10 -0
  116. package/dist/cjs/functions/logical/and/and.cjs +112 -0
  117. package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
  118. package/dist/cjs/functions/logical/if/if.cjs +195 -0
  119. package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
  120. package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
  121. package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
  122. package/dist/cjs/functions/logical/or/or.cjs +112 -0
  123. package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
  124. package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
  125. package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
  126. package/dist/cjs/functions/lookup/count/count.cjs +48 -0
  127. package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
  128. package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
  129. package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
  130. package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
  131. package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
  132. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
  133. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
  134. package/dist/cjs/functions/lookup/match/match.cjs +168 -0
  135. package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
  136. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
  137. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
  138. package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
  139. package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
  140. package/dist/cjs/functions/math/average/average.cjs +48 -0
  141. package/dist/cjs/functions/math/average/average.cjs.map +10 -0
  142. package/dist/cjs/functions/math/average/averageif.cjs +83 -0
  143. package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
  144. package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
  145. package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
  146. package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
  147. package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
  148. package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
  149. package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
  150. package/dist/cjs/functions/math/max/max.cjs +48 -0
  151. package/dist/cjs/functions/math/max/max.cjs.map +10 -0
  152. package/dist/cjs/functions/math/max/maxif.cjs +83 -0
  153. package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
  154. package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
  155. package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
  156. package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
  157. package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
  158. package/dist/cjs/functions/math/min/min.cjs +48 -0
  159. package/dist/cjs/functions/math/min/min.cjs.map +10 -0
  160. package/dist/cjs/functions/math/min/minif.cjs +83 -0
  161. package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
  162. package/dist/cjs/functions/math/min/minifs.cjs +61 -0
  163. package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
  164. package/dist/cjs/functions/math/sum/sum.cjs +48 -0
  165. package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
  166. package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
  167. package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
  168. package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
  169. package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
  170. package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
  171. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
  172. package/dist/cjs/functions/reference/address/address.cjs +163 -0
  173. package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
  174. package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
  175. package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
  176. package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
  177. package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
  178. package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
  179. package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
  180. package/dist/cjs/functions/text/exact/exact.cjs +171 -0
  181. package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
  182. package/dist/cjs/functions/text/find/find.cjs +397 -0
  183. package/dist/cjs/functions/text/find/find.cjs.map +10 -0
  184. package/dist/cjs/functions/text/left/left.cjs +109 -0
  185. package/dist/cjs/functions/text/left/left.cjs.map +10 -0
  186. package/dist/cjs/functions/text/len/len.cjs +119 -0
  187. package/dist/cjs/functions/text/len/len.cjs.map +10 -0
  188. package/dist/cjs/functions/text/mid/mid.cjs +103 -0
  189. package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
  190. package/dist/cjs/functions/text/right/right.cjs +167 -0
  191. package/dist/cjs/functions/text/right/right.cjs.map +10 -0
  192. package/dist/cjs/functions/text/text-helpers.cjs +179 -0
  193. package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
  194. package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
  195. package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
  196. package/dist/cjs/package.json +5 -0
  197. package/dist/cjs/parser/ast.cjs +175 -0
  198. package/dist/cjs/parser/ast.cjs.map +10 -0
  199. package/dist/cjs/parser/formatter.cjs +319 -0
  200. package/dist/cjs/parser/formatter.cjs.map +10 -0
  201. package/dist/cjs/parser/grammar.cjs +375 -0
  202. package/dist/cjs/parser/grammar.cjs.map +10 -0
  203. package/dist/cjs/parser/lexer.cjs +443 -0
  204. package/dist/cjs/parser/lexer.cjs.map +10 -0
  205. package/dist/cjs/parser/parser.cjs +1700 -0
  206. package/dist/cjs/parser/parser.cjs.map +10 -0
  207. package/dist/cjs/react/hooks.cjs +59 -0
  208. package/dist/cjs/react/hooks.cjs.map +10 -0
  209. package/dist/mjs/core/ast-traverser.mjs +94 -0
  210. package/dist/mjs/core/ast-traverser.mjs.map +10 -0
  211. package/dist/mjs/core/autofill-utils.mjs +274 -0
  212. package/dist/mjs/core/autofill-utils.mjs.map +10 -0
  213. package/dist/mjs/core/engine.mjs +366 -0
  214. package/dist/mjs/core/engine.mjs.map +10 -0
  215. package/dist/mjs/core/managers/cache-manager.mjs +27 -0
  216. package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
  217. package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
  218. package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
  219. package/dist/mjs/core/managers/dependency-node.mjs +2 -0
  220. package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
  221. package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
  222. package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
  223. package/dist/mjs/core/managers/event-manager.mjs +18 -0
  224. package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
  225. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
  226. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
  227. package/dist/mjs/core/managers/index.mjs +21 -0
  228. package/dist/mjs/core/managers/index.mjs.map +10 -0
  229. package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
  230. package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
  231. package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
  232. package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
  233. package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
  234. package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
  235. package/dist/mjs/core/managers/table-manager.mjs +224 -0
  236. package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
  237. package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
  238. package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
  239. package/dist/mjs/core/map-serializer.mjs +39 -0
  240. package/dist/mjs/core/map-serializer.mjs.map +10 -0
  241. package/dist/mjs/core/named-expression-renamer.mjs +58 -0
  242. package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
  243. package/dist/mjs/core/sheet-renamer.mjs +59 -0
  244. package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
  245. package/dist/mjs/core/sheet-utils.mjs +8 -0
  246. package/dist/mjs/core/sheet-utils.mjs.map +10 -0
  247. package/dist/mjs/core/table-renamer.mjs +58 -0
  248. package/dist/mjs/core/table-renamer.mjs.map +10 -0
  249. package/dist/mjs/core/types.mjs +18 -0
  250. package/dist/mjs/core/types.mjs.map +10 -0
  251. package/dist/mjs/core/utils/range-serializer.mjs +35 -0
  252. package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
  253. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
  254. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
  255. package/dist/mjs/core/utils.mjs +409 -0
  256. package/dist/mjs/core/utils.mjs.map +10 -0
  257. package/dist/mjs/core/workbook-renamer.mjs +76 -0
  258. package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
  259. package/dist/mjs/debug/flags.mjs +17 -0
  260. package/dist/mjs/debug/flags.mjs.map +10 -0
  261. package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
  262. package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
  263. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
  264. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
  265. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
  266. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
  267. package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
  268. package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
  269. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
  270. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
  271. package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
  272. package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
  273. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
  274. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
  275. package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
  276. package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
  277. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
  278. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
  279. package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
  280. package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
  281. package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
  282. package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
  283. package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
  284. package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
  285. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
  286. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
  287. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
  288. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
  289. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
  290. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
  291. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
  292. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
  293. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
  294. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
  295. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
  296. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
  297. package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
  298. package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
  299. package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
  300. package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
  301. package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
  302. package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
  303. package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
  304. package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
  305. package/dist/mjs/functions/_template/template.mjs +12 -0
  306. package/dist/mjs/functions/_template/template.mjs.map +10 -0
  307. package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
  308. package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
  309. package/dist/mjs/functions/criteria-parser.mjs +187 -0
  310. package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
  311. package/dist/mjs/functions/criteria-utils.mjs +268 -0
  312. package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
  313. package/dist/mjs/functions/function-utils.mjs +33 -0
  314. package/dist/mjs/functions/function-utils.mjs.map +10 -0
  315. package/dist/mjs/functions/index.mjs +95 -0
  316. package/dist/mjs/functions/index.mjs.map +10 -0
  317. package/dist/mjs/functions/information/cell/cell.mjs +168 -0
  318. package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
  319. package/dist/mjs/functions/information/column/column.mjs +120 -0
  320. package/dist/mjs/functions/information/column/column.mjs.map +10 -0
  321. package/dist/mjs/functions/information/row/row.mjs +126 -0
  322. package/dist/mjs/functions/information/row/row.mjs.map +10 -0
  323. package/dist/mjs/functions/logical/and/and.mjs +84 -0
  324. package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
  325. package/dist/mjs/functions/logical/if/if.mjs +167 -0
  326. package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
  327. package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
  328. package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
  329. package/dist/mjs/functions/logical/or/or.mjs +84 -0
  330. package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
  331. package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
  332. package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
  333. package/dist/mjs/functions/lookup/count/count.mjs +18 -0
  334. package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
  335. package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
  336. package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
  337. package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
  338. package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
  339. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
  340. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
  341. package/dist/mjs/functions/lookup/match/match.mjs +140 -0
  342. package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
  343. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
  344. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
  345. package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
  346. package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
  347. package/dist/mjs/functions/math/average/average.mjs +18 -0
  348. package/dist/mjs/functions/math/average/average.mjs.map +10 -0
  349. package/dist/mjs/functions/math/average/averageif.mjs +58 -0
  350. package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
  351. package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
  352. package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
  353. package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
  354. package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
  355. package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
  356. package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
  357. package/dist/mjs/functions/math/max/max.mjs +18 -0
  358. package/dist/mjs/functions/math/max/max.mjs.map +10 -0
  359. package/dist/mjs/functions/math/max/maxif.mjs +58 -0
  360. package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
  361. package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
  362. package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
  363. package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
  364. package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
  365. package/dist/mjs/functions/math/min/min.mjs +18 -0
  366. package/dist/mjs/functions/math/min/min.mjs.map +10 -0
  367. package/dist/mjs/functions/math/min/minif.mjs +58 -0
  368. package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
  369. package/dist/mjs/functions/math/min/minifs.mjs +35 -0
  370. package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
  371. package/dist/mjs/functions/math/sum/sum.mjs +18 -0
  372. package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
  373. package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
  374. package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
  375. package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
  376. package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
  377. package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
  378. package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
  379. package/dist/mjs/functions/reference/address/address.mjs +135 -0
  380. package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
  381. package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
  382. package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
  383. package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
  384. package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
  385. package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
  386. package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
  387. package/dist/mjs/functions/text/exact/exact.mjs +143 -0
  388. package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
  389. package/dist/mjs/functions/text/find/find.mjs +369 -0
  390. package/dist/mjs/functions/text/find/find.mjs.map +10 -0
  391. package/dist/mjs/functions/text/left/left.mjs +81 -0
  392. package/dist/mjs/functions/text/left/left.mjs.map +10 -0
  393. package/dist/mjs/functions/text/len/len.mjs +91 -0
  394. package/dist/mjs/functions/text/len/len.mjs.map +10 -0
  395. package/dist/mjs/functions/text/mid/mid.mjs +75 -0
  396. package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
  397. package/dist/mjs/functions/text/right/right.mjs +143 -0
  398. package/dist/mjs/functions/text/right/right.mjs.map +10 -0
  399. package/dist/mjs/functions/text/text-helpers.mjs +151 -0
  400. package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
  401. package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
  402. package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
  403. package/dist/mjs/package.json +5 -0
  404. package/dist/mjs/parser/ast.mjs +145 -0
  405. package/dist/mjs/parser/ast.mjs.map +10 -0
  406. package/dist/mjs/parser/formatter.mjs +289 -0
  407. package/dist/mjs/parser/formatter.mjs.map +10 -0
  408. package/dist/mjs/parser/grammar.mjs +345 -0
  409. package/dist/mjs/parser/grammar.mjs.map +10 -0
  410. package/dist/mjs/parser/lexer.mjs +412 -0
  411. package/dist/mjs/parser/lexer.mjs.map +10 -0
  412. package/dist/mjs/parser/parser.mjs +1692 -0
  413. package/dist/mjs/parser/parser.mjs.map +10 -0
  414. package/dist/mjs/react/hooks.mjs +16 -0
  415. package/dist/mjs/react/hooks.mjs.map +10 -0
  416. package/dist/types/core/ast-traverser.d.ts +28 -0
  417. package/dist/types/core/autofill-utils.d.ts +32 -0
  418. package/dist/types/core/engine.d.ts +184 -0
  419. package/dist/types/core/managers/cache-manager.d.ts +14 -0
  420. package/dist/types/core/managers/dependency-manager.d.ts +147 -0
  421. package/dist/types/core/managers/dependency-node.d.ts +13 -0
  422. package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
  423. package/dist/types/core/managers/event-manager.d.ts +8 -0
  424. package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
  425. package/dist/types/core/managers/index.d.ts +7 -0
  426. package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
  427. package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
  428. package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
  429. package/dist/types/core/managers/table-manager.d.ts +84 -0
  430. package/dist/types/core/managers/workbook-manager.d.ts +136 -0
  431. package/dist/types/core/map-serializer.d.ts +4 -0
  432. package/dist/types/core/named-expression-renamer.d.ts +21 -0
  433. package/dist/types/core/sheet-renamer.d.ts +28 -0
  434. package/dist/types/core/sheet-utils.d.ts +2 -0
  435. package/dist/types/core/table-renamer.d.ts +21 -0
  436. package/dist/types/core/types.d.ts +272 -0
  437. package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
  438. package/dist/types/core/utils/range-serializer.d.ts +22 -0
  439. package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
  440. package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
  441. package/dist/types/core/utils.d.ts +48 -0
  442. package/dist/types/core/workbook-renamer.d.ts +28 -0
  443. package/dist/types/debug/flags.d.ts +11 -0
  444. package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
  445. package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
  446. package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
  447. package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
  448. package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
  449. package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
  450. package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
  451. package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
  452. package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
  453. package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
  454. package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
  455. package/dist/types/evaluator/comparison/equals.d.ts +6 -0
  456. package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
  457. package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
  458. package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
  459. package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
  460. package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
  461. package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
  462. package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
  463. package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
  464. package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
  465. package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
  466. package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
  467. package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
  468. package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
  469. package/dist/types/evaluator/evaluation-context.d.ts +66 -0
  470. package/dist/types/evaluator/evaluation-error.d.ts +20 -0
  471. package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
  472. package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
  473. package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
  474. package/dist/types/functions/_template/template.d.ts +5 -0
  475. package/dist/types/functions/_template/template.test.d.ts +1 -0
  476. package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
  477. package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
  478. package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
  479. package/dist/types/functions/criteria-parser.d.ts +27 -0
  480. package/dist/types/functions/criteria-utils.d.ts +61 -0
  481. package/dist/types/functions/function-utils.d.ts +21 -0
  482. package/dist/types/functions/index.d.ts +2 -0
  483. package/dist/types/functions/information/cell/cell.d.ts +24 -0
  484. package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
  485. package/dist/types/functions/information/column/column.d.ts +14 -0
  486. package/dist/types/functions/information/column/column.test.d.ts +1 -0
  487. package/dist/types/functions/information/row/row.d.ts +14 -0
  488. package/dist/types/functions/information/row/row.test.d.ts +1 -0
  489. package/dist/types/functions/logical/and/and.d.ts +5 -0
  490. package/dist/types/functions/logical/and/and.test.d.ts +1 -0
  491. package/dist/types/functions/logical/if/if.d.ts +5 -0
  492. package/dist/types/functions/logical/if/if.test.d.ts +1 -0
  493. package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
  494. package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
  495. package/dist/types/functions/logical/or/or.d.ts +5 -0
  496. package/dist/types/functions/logical/or/or.test.d.ts +1 -0
  497. package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
  498. package/dist/types/functions/lookup/count/count.d.ts +21 -0
  499. package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
  500. package/dist/types/functions/lookup/count/countif.d.ts +26 -0
  501. package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
  502. package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
  503. package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
  504. package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
  505. package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
  506. package/dist/types/functions/lookup/match/match.d.ts +2 -0
  507. package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
  508. package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
  509. package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
  510. package/dist/types/functions/math/average/average-utils.d.ts +10 -0
  511. package/dist/types/functions/math/average/average.d.ts +18 -0
  512. package/dist/types/functions/math/average/average.test.d.ts +1 -0
  513. package/dist/types/functions/math/average/averageif.d.ts +23 -0
  514. package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
  515. package/dist/types/functions/math/average/averageifs.d.ts +21 -0
  516. package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
  517. package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
  518. package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
  519. package/dist/types/functions/math/max/max-utils.d.ts +20 -0
  520. package/dist/types/functions/math/max/max.d.ts +18 -0
  521. package/dist/types/functions/math/max/max.test.d.ts +1 -0
  522. package/dist/types/functions/math/max/maxif.d.ts +23 -0
  523. package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
  524. package/dist/types/functions/math/max/maxifs.d.ts +21 -0
  525. package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
  526. package/dist/types/functions/math/min/min-utils.d.ts +20 -0
  527. package/dist/types/functions/math/min/min.d.ts +5 -0
  528. package/dist/types/functions/math/min/min.test.d.ts +1 -0
  529. package/dist/types/functions/math/min/minif.d.ts +23 -0
  530. package/dist/types/functions/math/min/minif.test.d.ts +1 -0
  531. package/dist/types/functions/math/min/minifs.d.ts +21 -0
  532. package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
  533. package/dist/types/functions/math/sum/sum.d.ts +5 -0
  534. package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
  535. package/dist/types/functions/math/sum/sumif.d.ts +23 -0
  536. package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
  537. package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
  538. package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
  539. package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
  540. package/dist/types/functions/reference/address/address.d.ts +18 -0
  541. package/dist/types/functions/reference/address/address.test.d.ts +1 -0
  542. package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
  543. package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
  544. package/dist/types/functions/reference/offset/offset.d.ts +23 -0
  545. package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
  546. package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
  547. package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
  548. package/dist/types/functions/text/exact/exact.d.ts +5 -0
  549. package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
  550. package/dist/types/functions/text/find/find.d.ts +20 -0
  551. package/dist/types/functions/text/find/find.test.d.ts +1 -0
  552. package/dist/types/functions/text/left/left.d.ts +19 -0
  553. package/dist/types/functions/text/left/left.test.d.ts +1 -0
  554. package/dist/types/functions/text/len/len.d.ts +16 -0
  555. package/dist/types/functions/text/len/len.test.d.ts +1 -0
  556. package/dist/types/functions/text/mid/mid.d.ts +20 -0
  557. package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
  558. package/dist/types/functions/text/right/right.d.ts +2 -0
  559. package/dist/types/functions/text/right/right.test.d.ts +1 -0
  560. package/dist/types/functions/text/text-helpers.d.ts +27 -0
  561. package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
  562. package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
  563. package/dist/types/parser/ast.d.ts +275 -0
  564. package/dist/types/parser/formatter.d.ts +6 -0
  565. package/dist/types/parser/grammar.d.ts +203 -0
  566. package/dist/types/parser/lexer.d.ts +144 -0
  567. package/dist/types/parser/parser.d.ts +159 -0
  568. package/dist/types/react/hooks.d.ts +5 -0
  569. package/package.json +41 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/functions/array/sequence/sequence.ts"],
4
+ "sourcesContent": [
5
+ "import {\n FormulaError,\n type CellAddress,\n type CellInRangeResult,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type SpilledValuesEvaluationResult,\n type SpreadsheetRange,\n} from \"src/core/types\";\nimport { getRangeIntersection, isRangeOneCell } from \"src/core/utils\";\nimport { EvaluationError } from \"src/evaluator/evaluation-error\";\n\n/**\n * SEQUENCE(rows, [columns], [start], [step])\n * Generates a sequence of numbers in an array.\n *\n * @param rows - The number of rows to return (can be array - uses origin value)\n * @param columns - [Optional] The number of columns to return (default: 1, can be array - uses origin value)\n * @param start - [Optional] The first number in the sequence (default: 1, can be array - uses origin value)\n * @param step - [Optional] The amount to increment each subsequent value (default: 1, can be array - uses origin value)\n *\n * Returns a spilled array of sequential numbers.\n * When any argument is an array, the result is broadcast over the largest input spill area.\n */\nexport const SEQUENCE: FunctionDefinition = {\n name: \"SEQUENCE\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 1 || node.args.length > 4) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"SEQUENCE function takes 1 to 4 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate all arguments and check for array inputs\n const argResults: FunctionEvaluationResult[] = [];\n let largestSpillArea: SpreadsheetRange | null = null;\n let hasArrayInput = false;\n\n for (let i = 0; i < node.args.length; i++) {\n const result = this.evaluateNode(node.args[i]!, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n argResults.push(result);\n\n if (result.type === \"spilled-values\") {\n hasArrayInput = true;\n const spillArea = result.spillArea(context.cellAddress);\n if (!largestSpillArea) {\n largestSpillArea = spillArea;\n } else {\n // Use the larger spill area (more cells)\n const currentCols =\n spillArea.end.col.type === \"number\"\n ? spillArea.end.col.value\n : Infinity;\n const currentRows =\n spillArea.end.row.type === \"number\"\n ? spillArea.end.row.value\n : Infinity;\n const currentSize =\n (currentCols - spillArea.start.col + 1) *\n (currentRows - spillArea.start.row + 1);\n\n const largestCols =\n largestSpillArea.end.col.type === \"number\"\n ? largestSpillArea.end.col.value\n : Infinity;\n const largestRows =\n largestSpillArea.end.row.type === \"number\"\n ? largestSpillArea.end.row.value\n : Infinity;\n const largestSize =\n (largestCols - largestSpillArea.start.col + 1) *\n (largestRows - largestSpillArea.start.row + 1);\n\n if (currentSize > largestSize) {\n largestSpillArea = spillArea;\n }\n }\n }\n }\n\n // Extract values from arguments (using origin values for arrays)\n const rowsResult = argResults[0];\n if (!rowsResult) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Missing rows argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n let rowsValue: number | \"infinity\" = 0;\n let isRowsInfinite = false;\n\n if (\n rowsResult.type === \"awaiting-evaluation\" ||\n rowsResult.type === \"error\"\n ) {\n return rowsResult;\n }\n\n if (rowsResult.type === \"spilled-values\") {\n throw new Error(\"Sequences cannot contain spilled values\");\n } else if (rowsResult.type === \"value\") {\n if (rowsResult.result.type === \"infinity\") {\n rowsValue = \"infinity\";\n isRowsInfinite = true;\n } else if (rowsResult.result.type === \"number\") {\n rowsValue = rowsResult.result.value;\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Rows argument must be a number or INFINITY\",\n errAddress: context.dependencyNode,\n };\n }\n }\n\n const rows = isRowsInfinite ? Infinity : Math.floor(rowsValue as number);\n if (!isRowsInfinite && rows < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Rows must be greater than 0\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate columns argument (optional, default: 1)\n let columns = 1;\n let isColumnsInfinite = false;\n if (node.args.length > 1) {\n const columnsResult = argResults[1];\n if (!columnsResult) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Missing columns argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (columnsResult.type === \"spilled-values\") {\n throw new Error(\"Sequences cannot contain spilled values\");\n } else if (columnsResult.type === \"value\") {\n if (columnsResult.result.type === \"infinity\") {\n columns = Infinity;\n isColumnsInfinite = true;\n } else if (columnsResult.result.type === \"number\") {\n columns = Math.floor(columnsResult.result.value);\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Columns argument must be a number or INFINITY\",\n errAddress: context.dependencyNode,\n };\n }\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Columns argument must be a number or INFINITY\",\n errAddress: context.dependencyNode,\n };\n }\n if (!isColumnsInfinite && columns < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Columns must be greater than 0\",\n errAddress: context.dependencyNode,\n };\n }\n }\n\n // Evaluate start argument (optional, default: 1)\n let start = 1;\n if (node.args.length > 2) {\n const startResult = argResults[2];\n if (!startResult) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Missing start argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (startResult.type === \"spilled-values\") {\n throw new Error(\"Sequences cannot contain spilled values\");\n } else if (\n startResult.type === \"value\" &&\n startResult.result.type === \"number\"\n ) {\n start = startResult.result.value;\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Start argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n }\n\n // Evaluate step argument (optional, default: 1)\n let step = 1;\n if (node.args.length > 3) {\n const stepResult = argResults[3];\n if (!stepResult) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Missing step argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (stepResult.type === \"spilled-values\") {\n throw new Error(\"Sequences cannot contain spilled values\");\n } else if (\n stepResult.type === \"value\" &&\n stepResult.result.type === \"number\"\n ) {\n step = stepResult.result.value;\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Step argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n }\n\n // Create the spill area - if there are array inputs, use the largest input spill area\n // Otherwise, create a new spill area based on the SEQUENCE dimensions\n const spillArea = (origin: CellAddress): SpreadsheetRange => {\n return hasArrayInput && largestSpillArea\n ? largestSpillArea\n : {\n start: {\n col: origin.colIndex,\n row: origin.rowIndex,\n },\n end: {\n col: isColumnsInfinite\n ? { type: \"infinity\", sign: \"positive\" }\n : { type: \"number\", value: origin.colIndex + columns - 1 },\n row: isRowsInfinite\n ? { type: \"infinity\", sign: \"positive\" }\n : { type: \"number\", value: origin.rowIndex + rows - 1 },\n },\n };\n };\n\n // Calculate the origin result (top-left cell value)\n const originResult: CellNumber = {\n type: \"number\",\n value: start,\n };\n\n if (isRangeOneCell(spillArea(context.cellAddress))) {\n return {\n type: \"value\",\n result: originResult,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea,\n source: \"SEQUENCE function\",\n evaluate: (spillOffset, context) => {\n if (hasArrayInput) {\n // When we have array inputs, all cells in the broadcast area get the same SEQUENCE result\n // The SEQUENCE is calculated once using the origin values from the input arrays\n\n // For broadcasting, we always return the same sequence across all spilled cells\n // Calculate the value for the origin cell of the SEQUENCE (always (0,0))\n const x = 0;\n const y = 0;\n\n // Check if the origin cell is within our intended SEQUENCE area\n if (\n (!isColumnsInfinite && x >= columns) ||\n (!isRowsInfinite && y >= rows)\n ) {\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Error evaluating SEQUENCE\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate the sequential value for origin cell\n // Since this is for broadcasting, we always use the origin (0,0) value\n const sequenceIndex = 0;\n const value = start + sequenceIndex * step;\n\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value,\n },\n };\n } else {\n // Normal SEQUENCE behavior - calculate the value for this spilled cell based on its offset\n const x = spillOffset.x;\n const y = spillOffset.y;\n\n // Check if the spilled cell is within our intended area\n if (\n (!isColumnsInfinite && x >= columns) ||\n (!isRowsInfinite && y >= rows)\n ) {\n return {\n type: \"error\",\n err: FormulaError.ERROR,\n message: \"Error evaluating SEQUENCE\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate the sequential value\n // Values are filled row by row: (0,0), (0,1), (0,2), ..., (1,0), (1,1), etc.\n let sequenceIndex: number;\n if (isColumnsInfinite && isRowsInfinite) {\n // For infinite 2D sequences, we can't calculate a single index\n // We'll use a simple pattern based on position\n sequenceIndex = y + x;\n } else if (isColumnsInfinite) {\n // For infinite columns, sequence goes horizontally\n sequenceIndex = x;\n } else if (isRowsInfinite) {\n // For infinite rows, sequence goes vertically\n sequenceIndex = y;\n } else {\n // Finite dimensions - normal calculation\n sequenceIndex = y * columns + x;\n }\n\n const value = start + sequenceIndex * step;\n\n return {\n type: \"value\",\n result: {\n type: \"number\",\n value,\n },\n };\n }\n },\n evaluateAllCells: function ({ evaluate, intersection, context, origin }) {\n const results: CellInRangeResult[] = [];\n let range = spillArea(origin);\n if (intersection) {\n const newRange = getRangeIntersection(range, intersection);\n if (!newRange) {\n throw new Error(\"Intersection is not valid #2\");\n }\n range = newRange;\n }\n if (\n range.end.row.type === \"infinity\" ||\n range.end.col.type === \"infinity\"\n ) {\n throw new EvaluationError(\n FormulaError.REF,\n `Can not evaluate all cells over an infinite range`\n );\n }\n\n for (let i = range.start.row; i <= range.end.row.value; i++) {\n for (let j = range.start.col; j <= range.end.col.value; j++) {\n const offsetLeft = j - origin.colIndex;\n const offsetTop = i - origin.rowIndex;\n\n const evaled = evaluate({ x: offsetLeft, y: offsetTop }, context);\n const relativePos = { x: offsetLeft, y: offsetTop };\n results.push({ result: evaled, relativePos });\n }\n }\n\n return { type: \"values\", values: results };\n },\n };\n },\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "7DF7E0198FCF2C6364756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,217 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/functions/criteria-parser.ts
30
+ var exports_criteria_parser = {};
31
+ __export(exports_criteria_parser, {
32
+ parseCriteria: () => parseCriteria,
33
+ matchesParsedCriteria: () => matchesParsedCriteria
34
+ });
35
+ module.exports = __toCommonJS(exports_criteria_parser);
36
+ function wildcardToRegex(pattern) {
37
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&");
38
+ const regexPattern = escaped.replace(/\*/g, ".*").replace(/\?/g, ".");
39
+ return new RegExp(`^${regexPattern}$`);
40
+ }
41
+ function parseSimpleValue(valueStr) {
42
+ const trimmed = valueStr.trim();
43
+ const upperTrimmed = trimmed.toUpperCase();
44
+ if (upperTrimmed === "TRUE") {
45
+ return { type: "boolean", value: true };
46
+ }
47
+ if (upperTrimmed === "FALSE") {
48
+ return { type: "boolean", value: false };
49
+ }
50
+ if (upperTrimmed === "INFINITY") {
51
+ return { type: "infinity", sign: "positive" };
52
+ }
53
+ if (upperTrimmed === "-INFINITY") {
54
+ return { type: "infinity", sign: "negative" };
55
+ }
56
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
57
+ const num = Number(trimmed);
58
+ if (!isNaN(num) && isFinite(num)) {
59
+ return { type: "number", value: num };
60
+ }
61
+ }
62
+ return { type: "string", value: valueStr };
63
+ }
64
+ function parseCriteria(criteria) {
65
+ if (criteria.type !== "string") {
66
+ return { type: "exact", value: criteria };
67
+ }
68
+ const criteriaStr = criteria.value;
69
+ if (criteriaStr === "") {
70
+ return { type: "exact", value: criteria };
71
+ }
72
+ if (criteriaStr === "=") {
73
+ return { type: "exact", value: { type: "string", value: "" } };
74
+ }
75
+ const comparisonMatch = criteriaStr.match(/^(>=|<=|<>|>|<)(.*)$/);
76
+ if (comparisonMatch) {
77
+ const operator = comparisonMatch[1];
78
+ const valueStr = comparisonMatch[2];
79
+ if (!operator || valueStr === undefined) {
80
+ return { type: "error", message: "Invalid comparison operator format" };
81
+ }
82
+ if (operator === "<>" && valueStr === "") {
83
+ return {
84
+ type: "comparison",
85
+ operator: "<>",
86
+ value: { type: "string", value: "" }
87
+ };
88
+ }
89
+ const parsedValue2 = parseSimpleValue(valueStr);
90
+ return {
91
+ type: "comparison",
92
+ operator,
93
+ value: parsedValue2
94
+ };
95
+ }
96
+ if (criteriaStr.includes("*") || criteriaStr.includes("?")) {
97
+ return { type: "wildcard", pattern: criteriaStr };
98
+ }
99
+ const parsedValue = parseSimpleValue(criteriaStr);
100
+ return { type: "exact", value: parsedValue };
101
+ }
102
+ function matchesParsedCriteria(cellValue, parsedCriteria) {
103
+ switch (parsedCriteria.type) {
104
+ case "error":
105
+ return false;
106
+ case "exact":
107
+ if (cellValue.type !== parsedCriteria.value.type) {
108
+ return false;
109
+ }
110
+ if ("value" in cellValue && "value" in parsedCriteria.value) {
111
+ if (cellValue.type === "string" && parsedCriteria.value.type === "string") {
112
+ return cellValue.value.toLowerCase() === parsedCriteria.value.value.toLowerCase();
113
+ }
114
+ return cellValue.value === parsedCriteria.value.value;
115
+ }
116
+ if (cellValue.type === "infinity" && parsedCriteria.value.type === "infinity") {
117
+ return cellValue.sign === parsedCriteria.value.sign;
118
+ }
119
+ return false;
120
+ case "comparison":
121
+ if (parsedCriteria.operator === "<>" && parsedCriteria.value.type === "string" && parsedCriteria.value.value === "") {
122
+ return cellValue.type !== "string" || cellValue.value !== "";
123
+ }
124
+ if (parsedCriteria.operator === "<>") {
125
+ if (cellValue.type !== parsedCriteria.value.type) {
126
+ return true;
127
+ }
128
+ if ("value" in cellValue && "value" in parsedCriteria.value) {
129
+ return cellValue.value !== parsedCriteria.value.value;
130
+ }
131
+ if (cellValue.type === "infinity" && parsedCriteria.value.type === "infinity") {
132
+ return cellValue.sign !== parsedCriteria.value.sign;
133
+ }
134
+ return true;
135
+ }
136
+ if (cellValue.type !== "number" && cellValue.type !== "infinity") {
137
+ return false;
138
+ }
139
+ if (parsedCriteria.value.type !== "number" && parsedCriteria.value.type !== "infinity") {
140
+ return false;
141
+ }
142
+ if (parsedCriteria.value.type === "infinity") {
143
+ const criteriaSign = parsedCriteria.value.sign;
144
+ if (cellValue.type === "infinity") {
145
+ const cellSign = cellValue.sign;
146
+ switch (parsedCriteria.operator) {
147
+ case ">":
148
+ return cellSign === "positive" && criteriaSign === "negative";
149
+ case "<":
150
+ return cellSign === "negative" && criteriaSign === "positive";
151
+ case ">=":
152
+ return cellSign === "positive" || cellSign === criteriaSign;
153
+ case "<=":
154
+ return cellSign === "negative" || cellSign === criteriaSign;
155
+ default:
156
+ return false;
157
+ }
158
+ }
159
+ if (cellValue.type === "number") {
160
+ switch (parsedCriteria.operator) {
161
+ case ">":
162
+ return criteriaSign === "negative";
163
+ case "<":
164
+ return criteriaSign === "positive";
165
+ case ">=":
166
+ return criteriaSign === "negative";
167
+ case "<=":
168
+ return criteriaSign === "positive";
169
+ default:
170
+ return false;
171
+ }
172
+ }
173
+ }
174
+ if (parsedCriteria.value.type === "number") {
175
+ const criteriaNum = parsedCriteria.value.value;
176
+ if (cellValue.type === "infinity") {
177
+ switch (parsedCriteria.operator) {
178
+ case ">":
179
+ return cellValue.sign === "positive";
180
+ case "<":
181
+ return cellValue.sign === "negative";
182
+ case ">=":
183
+ return cellValue.sign === "positive";
184
+ case "<=":
185
+ return cellValue.sign === "negative";
186
+ default:
187
+ return false;
188
+ }
189
+ }
190
+ if (cellValue.type === "number") {
191
+ switch (parsedCriteria.operator) {
192
+ case ">":
193
+ return cellValue.value > criteriaNum;
194
+ case "<":
195
+ return cellValue.value < criteriaNum;
196
+ case ">=":
197
+ return cellValue.value >= criteriaNum;
198
+ case "<=":
199
+ return cellValue.value <= criteriaNum;
200
+ default:
201
+ return false;
202
+ }
203
+ }
204
+ }
205
+ return false;
206
+ case "wildcard":
207
+ if (cellValue.type !== "string") {
208
+ return false;
209
+ }
210
+ const regex = wildcardToRegex(parsedCriteria.pattern);
211
+ return regex.test(cellValue.value);
212
+ default:
213
+ return false;
214
+ }
215
+ }
216
+
217
+ //# debugId=031BC6604992B51864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/functions/criteria-parser.ts"],
4
+ "sourcesContent": [
5
+ "import { FormulaError, type CellValue } from \"src/core/types\";\n\n/**\n * Parsed criteria result\n */\nexport type ParsedCriteria = \n | { type: \"exact\"; value: CellValue }\n | { type: \"comparison\"; operator: \">\" | \"<\" | \">=\" | \"<=\" | \"<>\"; value: CellValue }\n | { type: \"wildcard\"; pattern: string }\n | { type: \"error\"; message: string };\n\n/**\n * Convert wildcard pattern to regex\n */\nfunction wildcardToRegex(pattern: string): RegExp {\n // Escape regex special characters except * and ?\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n // Convert wildcards: * -> .*, ? -> .\n const regexPattern = escaped.replace(/\\*/g, \".*\").replace(/\\?/g, \".\");\n return new RegExp(`^${regexPattern}$`);\n}\n\n/**\n * Parse a simple value string to determine its type\n * This is a lightweight alternative to parseFormula for criteria strings\n */\nfunction parseSimpleValue(valueStr: string): CellValue {\n // Trim the value\n const trimmed = valueStr.trim();\n \n // Check for boolean values (case-insensitive)\n const upperTrimmed = trimmed.toUpperCase();\n if (upperTrimmed === \"TRUE\") {\n return { type: \"boolean\", value: true };\n }\n if (upperTrimmed === \"FALSE\") {\n return { type: \"boolean\", value: false };\n }\n \n // Check for infinity values (case-insensitive)\n if (upperTrimmed === \"INFINITY\") {\n return { type: \"infinity\", sign: \"positive\" };\n }\n if (upperTrimmed === \"-INFINITY\") {\n return { type: \"infinity\", sign: \"negative\" };\n }\n \n // Check for numeric values\n // Match: optional negative sign, digits, optional decimal point and more digits\n // Examples: \"10\", \"-20\", \"3.14\", \"-0.5\", \"0\"\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n const num = Number(trimmed);\n if (!isNaN(num) && isFinite(num)) {\n return { type: \"number\", value: num };\n }\n }\n \n // Default to string\n return { type: \"string\", value: valueStr };\n}\n\n/**\n * Simple criteria parser for COUNTIF\n * Handles: exact values, comparisons (>5, <=10, <>0), and wildcards (*app, ?at)\n */\nexport function parseCriteria(criteria: CellValue): ParsedCriteria {\n // Only string criteria can contain operators or wildcards\n if (criteria.type !== \"string\") {\n return { type: \"exact\", value: criteria };\n }\n\n const criteriaStr = criteria.value;\n\n // Handle empty string as exact match\n if (criteriaStr === \"\") {\n return { type: \"exact\", value: criteria };\n }\n\n // Special case: \"=\" means count empty cells\n if (criteriaStr === \"=\") {\n return { type: \"exact\", value: { type: \"string\", value: \"\" } };\n }\n\n // Check for comparison operators (must be at the beginning)\n const comparisonMatch = criteriaStr.match(/^(>=|<=|<>|>|<)(.*)$/);\n if (comparisonMatch) {\n const operator = comparisonMatch[1];\n const valueStr = comparisonMatch[2];\n \n if (!operator || valueStr === undefined) {\n return { type: \"error\", message: \"Invalid comparison operator format\" };\n }\n \n // Special case: \"<>\" with no value means \"not empty\"\n if (operator === \"<>\" && valueStr === \"\") {\n return { \n type: \"comparison\", \n operator: \"<>\", \n value: { type: \"string\", value: \"\" } \n };\n }\n\n // Parse the value part to get the proper type\n const parsedValue = parseSimpleValue(valueStr);\n return { \n type: \"comparison\", \n operator: operator as \">\" | \"<\" | \">=\" | \"<=\" | \"<>\", \n value: parsedValue\n };\n }\n\n // Check for wildcards\n if (criteriaStr.includes(\"*\") || criteriaStr.includes(\"?\")) {\n return { type: \"wildcard\", pattern: criteriaStr };\n }\n\n // Parse as a simple value to get the proper type\n const parsedValue = parseSimpleValue(criteriaStr);\n return { type: \"exact\", value: parsedValue };\n}\n\n/**\n * Check if a cell value matches the parsed criteria\n */\nexport function matchesParsedCriteria(cellValue: CellValue, parsedCriteria: ParsedCriteria): boolean {\n switch (parsedCriteria.type) {\n case \"error\":\n return false;\n\n case \"exact\":\n // Exact match - must be same type and value\n if (cellValue.type !== parsedCriteria.value.type) {\n return false;\n }\n if (\"value\" in cellValue && \"value\" in parsedCriteria.value) {\n if (cellValue.type === 'string' && parsedCriteria.value.type === 'string') {\n return cellValue.value.toLowerCase() === parsedCriteria.value.value.toLowerCase();\n }\n return cellValue.value === parsedCriteria.value.value;\n }\n if (cellValue.type === \"infinity\" && parsedCriteria.value.type === \"infinity\") {\n return cellValue.sign === parsedCriteria.value.sign;\n }\n return false;\n\n case \"comparison\":\n // Special case: \"<>\" with empty string means \"not empty\"\n if (parsedCriteria.operator === \"<>\" && \n parsedCriteria.value.type === \"string\" && \n parsedCriteria.value.value === \"\") {\n return cellValue.type !== \"string\" || cellValue.value !== \"\";\n }\n\n // For other comparisons, handle by operator\n if (parsedCriteria.operator === \"<>\") {\n // Not equals - same logic as exact but negated\n if (cellValue.type !== parsedCriteria.value.type) {\n return true; // Different types are not equal\n }\n if (\"value\" in cellValue && \"value\" in parsedCriteria.value) {\n return cellValue.value !== parsedCriteria.value.value;\n }\n if (cellValue.type === \"infinity\" && parsedCriteria.value.type === \"infinity\") {\n return cellValue.sign !== parsedCriteria.value.sign;\n }\n return true;\n }\n\n // Numeric comparison operators - only work with numbers and infinity\n if (cellValue.type !== \"number\" && cellValue.type !== \"infinity\") {\n return false;\n }\n if (parsedCriteria.value.type !== \"number\" && parsedCriteria.value.type !== \"infinity\") {\n return false; // Can only compare with numeric or infinity criteria\n }\n\n // Handle when criteria is infinity\n if (parsedCriteria.value.type === \"infinity\") {\n const criteriaSign = parsedCriteria.value.sign;\n \n // Handle when cell value is also infinity\n if (cellValue.type === \"infinity\") {\n const cellSign = cellValue.sign;\n switch (parsedCriteria.operator) {\n case \">\":\n // +∞ > -∞, but not +∞ > +∞\n return cellSign === \"positive\" && criteriaSign === \"negative\";\n case \"<\":\n // -∞ < +∞, but not -∞ < -∞\n return cellSign === \"negative\" && criteriaSign === \"positive\";\n case \">=\":\n // +∞ >= +∞, +∞ >= -∞, but not -∞ >= +∞\n return cellSign === \"positive\" || (cellSign === criteriaSign);\n case \"<=\":\n // -∞ <= -∞, -∞ <= +∞, but not +∞ <= -∞\n return cellSign === \"negative\" || (cellSign === criteriaSign);\n default:\n return false;\n }\n }\n \n // Handle when cell value is a finite number\n if (cellValue.type === \"number\") {\n switch (parsedCriteria.operator) {\n case \">\":\n // No finite number is > +∞, all finite numbers > -∞\n return criteriaSign === \"negative\";\n case \"<\":\n // All finite numbers < +∞, no finite number < -∞\n return criteriaSign === \"positive\";\n case \">=\":\n // No finite number >= +∞, all finite numbers >= -∞\n return criteriaSign === \"negative\";\n case \"<=\":\n // All finite numbers <= +∞, no finite number <= -∞\n return criteriaSign === \"positive\";\n default:\n return false;\n }\n }\n }\n\n // Handle when criteria is a number (not infinity)\n if (parsedCriteria.value.type === \"number\") {\n const criteriaNum = parsedCriteria.value.value;\n\n // Handle infinity cell values with numeric criteria\n if (cellValue.type === \"infinity\") {\n switch (parsedCriteria.operator) {\n case \">\":\n return cellValue.sign === \"positive\"; // +∞ > any number\n case \"<\":\n return cellValue.sign === \"negative\"; // -∞ < any number\n case \">=\":\n return cellValue.sign === \"positive\"; // +∞ >= any number\n case \"<=\":\n return cellValue.sign === \"negative\"; // -∞ <= any number\n default:\n return false;\n }\n }\n\n // Regular number comparison\n if (cellValue.type === \"number\") {\n switch (parsedCriteria.operator) {\n case \">\":\n return cellValue.value > criteriaNum;\n case \"<\":\n return cellValue.value < criteriaNum;\n case \">=\":\n return cellValue.value >= criteriaNum;\n case \"<=\":\n return cellValue.value <= criteriaNum;\n default:\n return false;\n }\n }\n }\n \n return false;\n\n case \"wildcard\":\n // Wildcard matching - only works with strings\n if (cellValue.type !== \"string\") {\n return false;\n }\n const regex = wildcardToRegex(parsedCriteria.pattern);\n return regex.test(cellValue.value);\n\n default:\n return false;\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "031BC6604992B51864756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,291 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/functions/criteria-utils.ts
30
+ var exports_criteria_utils = {};
31
+ __export(exports_criteria_utils, {
32
+ validateSingleCriteriaArgs: () => validateSingleCriteriaArgs,
33
+ validateMultiCriteriaArgs: () => validateMultiCriteriaArgs,
34
+ validateCountifsArgs: () => validateCountifsArgs,
35
+ processMultiCriteriaValues: () => processMultiCriteriaValues,
36
+ parseCriteriaPairs: () => parseCriteriaPairs,
37
+ hasEmptyCriteria: () => hasEmptyCriteria
38
+ });
39
+ module.exports = __toCommonJS(exports_criteria_utils);
40
+ var import_types = require("src/core/types");
41
+ var import_criteria_parser = require("./criteria-parser.cjs");
42
+ var import_utils = require("src/core/utils");
43
+ var import_evaluation_error = require("src/evaluator/evaluation-error");
44
+ function parseCriteriaPairs(node, context, evaluateNode, startIndex = 1) {
45
+ const criteriaPairs = [];
46
+ for (let i = startIndex;i < node.args.length; i += 2) {
47
+ const criteriaRangeResult = evaluateNode.call(this, node.args[i], context);
48
+ if (criteriaRangeResult.type === "error" || criteriaRangeResult.type === "awaiting-evaluation") {
49
+ return criteriaRangeResult;
50
+ }
51
+ const criteriaResult = evaluateNode.call(this, node.args[i + 1], context);
52
+ if (criteriaResult.type === "error" || criteriaResult.type === "awaiting-evaluation") {
53
+ return criteriaResult;
54
+ }
55
+ let result;
56
+ if (criteriaResult.type === "spilled-values") {
57
+ const firstSpilledValue = criteriaResult.evaluate({ x: 0, y: 0 }, context);
58
+ if (firstSpilledValue.type === "error" || firstSpilledValue.type === "awaiting-evaluation") {
59
+ return firstSpilledValue;
60
+ } else {
61
+ result = firstSpilledValue;
62
+ }
63
+ } else {
64
+ result = criteriaResult;
65
+ }
66
+ const parsedCriteria = import_criteria_parser.parseCriteria(result.result);
67
+ if (parsedCriteria.type === "error") {
68
+ return {
69
+ type: "error",
70
+ err: import_types.FormulaError.VALUE,
71
+ message: parsedCriteria.message,
72
+ errAddress: context.dependencyNode
73
+ };
74
+ }
75
+ criteriaPairs.push({
76
+ rangeResult: criteriaRangeResult,
77
+ parsedCriteria
78
+ });
79
+ }
80
+ return criteriaPairs;
81
+ }
82
+ function hasEmptyCriteria(criteriaPairs) {
83
+ return criteriaPairs.some(({ parsedCriteria }) => parsedCriteria.type === "exact" && parsedCriteria.value.type === "string" && parsedCriteria.value.value === "");
84
+ }
85
+ function processMultiCriteriaValues(evaluator, valueRangeResult, criteriaPairs, context, lookupOrder) {
86
+ const results = [];
87
+ const criteriaPairWithError = criteriaPairs.map((pair) => pair.rangeResult).find((result) => result.type === "error" || result.type === "awaiting-evaluation");
88
+ if (criteriaPairWithError) {
89
+ return criteriaPairWithError;
90
+ }
91
+ if (hasEmptyCriteria(criteriaPairs) && valueRangeResult.type === "spilled-values") {
92
+ return handleEmptyCriteriaSpilledValues(valueRangeResult, criteriaPairs, context);
93
+ }
94
+ if (valueRangeResult.type === "value") {
95
+ let allMatch = true;
96
+ for (const { rangeResult, parsedCriteria } of criteriaPairs) {
97
+ if (rangeResult.type === "value") {
98
+ if (!import_criteria_parser.matchesParsedCriteria(rangeResult.result, parsedCriteria)) {
99
+ allMatch = false;
100
+ break;
101
+ }
102
+ } else {
103
+ allMatch = false;
104
+ break;
105
+ }
106
+ }
107
+ if (allMatch) {
108
+ results.push(valueRangeResult);
109
+ }
110
+ } else if (valueRangeResult.type === "spilled-values") {
111
+ const valueSpillArea = valueRangeResult.spillArea(context.cellAddress);
112
+ for (const { rangeResult } of criteriaPairs) {
113
+ if (rangeResult.type === "spilled-values") {
114
+ const criteriaSpillArea = rangeResult.spillArea(context.cellAddress);
115
+ const valueRelRange = import_utils.getRelativeRange(valueSpillArea, context.cellAddress);
116
+ const criteriaRelRange = import_utils.getRelativeRange(criteriaSpillArea, context.cellAddress);
117
+ const widthsMatch = valueRelRange.width.type === "infinity" && criteriaRelRange.width.type === "infinity" || valueRelRange.width.type === "number" && criteriaRelRange.width.type === "number" && valueRelRange.width.value === criteriaRelRange.width.value;
118
+ const heightsMatch = valueRelRange.height.type === "infinity" && criteriaRelRange.height.type === "infinity" || valueRelRange.height.type === "number" && criteriaRelRange.height.type === "number" && valueRelRange.height.value === criteriaRelRange.height.value;
119
+ if (!widthsMatch || !heightsMatch) {
120
+ throw new import_evaluation_error.EvaluationError(import_types.FormulaError.VALUE, "Criteria range dimensions do not match value range dimensions");
121
+ }
122
+ }
123
+ }
124
+ const valueResults = valueRangeResult.evaluateAllCells.call(evaluator, {
125
+ context,
126
+ evaluate: valueRangeResult.evaluate,
127
+ origin: context.cellAddress,
128
+ lookupOrder
129
+ });
130
+ const criteriaResultsArrays = criteriaPairs.map(({ rangeResult }) => {
131
+ if (rangeResult.type === "spilled-values") {
132
+ const criteriaResults = rangeResult.evaluateAllCells.call(evaluator, {
133
+ context,
134
+ evaluate: rangeResult.evaluate,
135
+ origin: context.cellAddress,
136
+ lookupOrder
137
+ });
138
+ return { type: "array", results: criteriaResults };
139
+ } else {
140
+ return { type: "single", value: rangeResult };
141
+ }
142
+ });
143
+ const criteriaMaps = criteriaResultsArrays.map((criteriaData) => {
144
+ if (criteriaData.type === "single") {
145
+ return null;
146
+ }
147
+ if (criteriaData.results.type !== "values") {
148
+ return null;
149
+ }
150
+ const map = new Map;
151
+ for (const { result, relativePos } of criteriaData.results.values) {
152
+ const key = `${relativePos.x},${relativePos.y}`;
153
+ map.set(key, result);
154
+ }
155
+ return map;
156
+ });
157
+ if (valueResults.type !== "values") {
158
+ return valueResults;
159
+ }
160
+ for (const valueCell of valueResults.values) {
161
+ if (!valueCell) {
162
+ continue;
163
+ }
164
+ const posKey = `${valueCell.relativePos.x},${valueCell.relativePos.y}`;
165
+ let allMatch = true;
166
+ for (let j = 0;j < criteriaPairs.length; j++) {
167
+ let criteriaCell;
168
+ if (criteriaResultsArrays[j].type === "single") {
169
+ criteriaCell = criteriaResultsArrays[j].value;
170
+ } else {
171
+ criteriaCell = criteriaMaps[j]?.get(posKey);
172
+ }
173
+ if (!criteriaCell) {
174
+ const parsedCriteria = criteriaPairs[j].parsedCriteria;
175
+ const emptyValue = { type: "string", value: "" };
176
+ if (!import_criteria_parser.matchesParsedCriteria(emptyValue, parsedCriteria)) {
177
+ allMatch = false;
178
+ break;
179
+ }
180
+ } else if (criteriaCell.type === "error") {
181
+ allMatch = false;
182
+ break;
183
+ } else if (criteriaCell.type === "value") {
184
+ if (!import_criteria_parser.matchesParsedCriteria(criteriaCell.result, criteriaPairs[j].parsedCriteria)) {
185
+ allMatch = false;
186
+ break;
187
+ }
188
+ } else if (criteriaCell.type === "awaiting-evaluation") {
189
+ return criteriaCell;
190
+ } else {
191
+ allMatch = false;
192
+ break;
193
+ }
194
+ }
195
+ if (allMatch) {
196
+ results.push(valueCell.result);
197
+ }
198
+ }
199
+ }
200
+ return { type: "values", values: results };
201
+ }
202
+ function validateMultiCriteriaArgs(functionName, argCount, context) {
203
+ if (argCount < 3 || (argCount - 1) % 2 !== 0) {
204
+ return {
205
+ type: "error",
206
+ err: import_types.FormulaError.VALUE,
207
+ message: `${functionName} function requires an odd number of arguments (min 3): value_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...`,
208
+ errAddress: context.dependencyNode
209
+ };
210
+ }
211
+ return null;
212
+ }
213
+ function validateCountifsArgs(argCount, context) {
214
+ if (argCount < 2 || argCount % 2 !== 0) {
215
+ return {
216
+ type: "error",
217
+ err: import_types.FormulaError.VALUE,
218
+ message: "COUNTIFS function requires an even number of arguments (min 2): criteria_range1, criteria1, [criteria_range2, criteria2], ...",
219
+ errAddress: context.dependencyNode
220
+ };
221
+ }
222
+ return null;
223
+ }
224
+ function validateSingleCriteriaArgs(functionName, argCount, context) {
225
+ if (argCount < 2 || argCount > 3) {
226
+ return {
227
+ type: "error",
228
+ err: import_types.FormulaError.VALUE,
229
+ message: `${functionName} function takes 2 or 3 arguments`,
230
+ errAddress: context.dependencyNode
231
+ };
232
+ }
233
+ return null;
234
+ }
235
+ function handleEmptyCriteriaSpilledValues(valueRangeResult, criteriaPairs, context) {
236
+ if (!hasEmptyCriteria(criteriaPairs) || valueRangeResult.type !== "spilled-values") {
237
+ throw new Error("Not an empty criteria case");
238
+ }
239
+ const results = [];
240
+ const valueSpillArea = valueRangeResult.spillArea(context.cellAddress);
241
+ if (valueSpillArea.end.col.type === "infinity" || valueSpillArea.end.row.type === "infinity") {
242
+ throw new import_evaluation_error.EvaluationError(import_types.FormulaError.VALUE, "Can not process infinite ranges with empty cell criteria");
243
+ }
244
+ if (valueSpillArea.end.col.type === "number" && valueSpillArea.end.row.type === "number") {
245
+ for (let row = valueSpillArea.start.row;row <= valueSpillArea.end.row.value; row++) {
246
+ for (let col = valueSpillArea.start.col;col <= valueSpillArea.end.col.value; col++) {
247
+ const valueCell = valueRangeResult.evaluate({
248
+ x: col - valueSpillArea.start.col,
249
+ y: row - valueSpillArea.start.row
250
+ }, context);
251
+ let allMatch = true;
252
+ for (const { rangeResult, parsedCriteria } of criteriaPairs) {
253
+ let criteriaCell;
254
+ if (rangeResult.type === "spilled-values") {
255
+ const criteriaSpillArea = rangeResult.spillArea(context.cellAddress);
256
+ const criteriaRow = row - valueSpillArea.start.row + criteriaSpillArea.start.row;
257
+ const criteriaCol = col - valueSpillArea.start.col + criteriaSpillArea.start.col;
258
+ if (criteriaRow <= (criteriaSpillArea.end.row.type === "number" ? criteriaSpillArea.end.row.value : Infinity) && criteriaCol <= (criteriaSpillArea.end.col.type === "number" ? criteriaSpillArea.end.col.value : Infinity)) {
259
+ criteriaCell = rangeResult.evaluate({
260
+ x: criteriaCol - criteriaSpillArea.start.col,
261
+ y: criteriaRow - criteriaSpillArea.start.row
262
+ }, context);
263
+ }
264
+ } else if (rangeResult.type === "value") {
265
+ criteriaCell = rangeResult;
266
+ }
267
+ const isEmptyCriteria = parsedCriteria.type === "exact" && parsedCriteria.value.type === "string" && parsedCriteria.value.value === "" || parsedCriteria.type === "comparison" && parsedCriteria.operator === "<>" && parsedCriteria.value.type === "string" && parsedCriteria.value.value === "";
268
+ if (isEmptyCriteria) {
269
+ const isEmpty = !criteriaCell || criteriaCell.type === "value" && criteriaCell.result.type === "string" && criteriaCell.result.value === "";
270
+ const shouldMatch = parsedCriteria.type === "exact" ? isEmpty : !isEmpty;
271
+ if (!shouldMatch) {
272
+ allMatch = false;
273
+ break;
274
+ }
275
+ } else {
276
+ if (!criteriaCell || criteriaCell.type !== "value" || !import_criteria_parser.matchesParsedCriteria(criteriaCell.result, parsedCriteria)) {
277
+ allMatch = false;
278
+ break;
279
+ }
280
+ }
281
+ }
282
+ if (allMatch && valueCell) {
283
+ results.push(valueCell);
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return { type: "values", values: results };
289
+ }
290
+
291
+ //# debugId=5ACCD9DEBF70FD2764756E2164756E21