@ricsam/formula-engine 0.0.2 → 0.0.4

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 (382) hide show
  1. package/dist/cjs/core/engine.cjs +12 -8
  2. package/dist/cjs/core/engine.cjs.map +3 -3
  3. package/dist/cjs/core/managers/dependency-manager.cjs +8 -8
  4. package/dist/cjs/core/managers/dependency-manager.cjs.map +3 -3
  5. package/dist/cjs/core/managers/evaluation-manager.cjs +10 -10
  6. package/dist/cjs/core/managers/evaluation-manager.cjs.map +2 -2
  7. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +1 -1
  8. package/dist/cjs/core/managers/isDependencyNode.cjs +6 -6
  9. package/dist/cjs/core/managers/isDependencyNode.cjs.map +2 -2
  10. package/dist/cjs/core/managers/named-expression-manager.cjs.map +1 -1
  11. package/dist/cjs/core/managers/range-eval-order-builder.cjs +2 -2
  12. package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +3 -3
  13. package/dist/cjs/core/managers/workbook-manager.cjs +3 -3
  14. package/dist/cjs/core/managers/workbook-manager.cjs.map +2 -2
  15. package/dist/cjs/core/types.cjs.map +2 -2
  16. package/dist/cjs/core/utils.cjs +2 -2
  17. package/dist/cjs/core/utils.cjs.map +2 -2
  18. package/dist/cjs/evaluator/arithmetic/add/add.cjs +2 -2
  19. package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +2 -2
  20. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +2 -2
  21. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +2 -2
  22. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +2 -2
  23. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +2 -2
  24. package/dist/cjs/evaluator/arithmetic/power/power.cjs +2 -2
  25. package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +2 -2
  26. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +2 -2
  27. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +2 -2
  28. package/dist/cjs/evaluator/comparison/equals.cjs.map +1 -1
  29. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +2 -2
  30. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +2 -2
  31. package/dist/cjs/evaluator/comparison/greater-than.cjs +2 -2
  32. package/dist/cjs/evaluator/comparison/greater-than.cjs.map +2 -2
  33. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +2 -2
  34. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +2 -2
  35. package/dist/cjs/evaluator/comparison/less-than.cjs +2 -2
  36. package/dist/cjs/evaluator/comparison/less-than.cjs.map +2 -2
  37. package/dist/cjs/evaluator/comparison/not-equals.cjs +2 -2
  38. package/dist/cjs/evaluator/comparison/not-equals.cjs.map +2 -2
  39. package/dist/cjs/evaluator/concatenation/concatenate.cjs +2 -2
  40. package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +2 -2
  41. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +2 -2
  42. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +2 -2
  43. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +2 -2
  44. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +2 -2
  45. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +2 -2
  46. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +3 -3
  47. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +2 -2
  48. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +2 -2
  49. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +2 -2
  50. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +1 -1
  51. package/dist/cjs/evaluator/evaluation-context.cjs.map +2 -2
  52. package/dist/cjs/evaluator/evaluation-error.cjs.map +1 -1
  53. package/dist/cjs/evaluator/formula-evaluator.cjs +5 -5
  54. package/dist/cjs/evaluator/formula-evaluator.cjs.map +3 -3
  55. package/dist/cjs/evaluator/range-evaluation-node.cjs +3 -3
  56. package/dist/cjs/evaluator/range-evaluation-node.cjs.map +2 -2
  57. package/dist/cjs/functions/_template/template.cjs.map +1 -1
  58. package/dist/cjs/functions/array/sequence/sequence.cjs +4 -4
  59. package/dist/cjs/functions/array/sequence/sequence.cjs.map +2 -2
  60. package/dist/cjs/functions/criteria-parser.cjs.map +1 -1
  61. package/dist/cjs/functions/criteria-utils.cjs +4 -4
  62. package/dist/cjs/functions/criteria-utils.cjs.map +3 -3
  63. package/dist/cjs/functions/function-utils.cjs.map +1 -1
  64. package/dist/cjs/functions/index.cjs.map +1 -1
  65. package/dist/cjs/functions/information/cell/cell.cjs +3 -3
  66. package/dist/cjs/functions/information/cell/cell.cjs.map +2 -2
  67. package/dist/cjs/functions/information/column/column.cjs +4 -4
  68. package/dist/cjs/functions/information/column/column.cjs.map +2 -2
  69. package/dist/cjs/functions/information/row/row.cjs +4 -4
  70. package/dist/cjs/functions/information/row/row.cjs.map +2 -2
  71. package/dist/cjs/functions/logical/and/and.cjs +2 -2
  72. package/dist/cjs/functions/logical/and/and.cjs.map +2 -2
  73. package/dist/cjs/functions/logical/if/if.cjs +2 -2
  74. package/dist/cjs/functions/logical/if/if.cjs.map +3 -3
  75. package/dist/cjs/functions/logical/iferror/iferror.cjs +3 -3
  76. package/dist/cjs/functions/logical/iferror/iferror.cjs.map +2 -2
  77. package/dist/cjs/functions/logical/or/or.cjs +2 -2
  78. package/dist/cjs/functions/logical/or/or.cjs.map +2 -2
  79. package/dist/cjs/functions/lookup/count/count-utils.cjs.map +1 -1
  80. package/dist/cjs/functions/lookup/count/count.cjs +2 -2
  81. package/dist/cjs/functions/lookup/count/count.cjs.map +2 -2
  82. package/dist/cjs/functions/lookup/count/countif.cjs +2 -2
  83. package/dist/cjs/functions/lookup/count/countif.cjs.map +2 -2
  84. package/dist/cjs/functions/lookup/count/countifs.cjs.map +1 -1
  85. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +2 -2
  86. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +2 -2
  87. package/dist/cjs/functions/lookup/match/match.cjs +2 -2
  88. package/dist/cjs/functions/lookup/match/match.cjs.map +2 -2
  89. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +2 -2
  90. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +2 -2
  91. package/dist/cjs/functions/math/average/average-utils.cjs +2 -2
  92. package/dist/cjs/functions/math/average/average-utils.cjs.map +2 -2
  93. package/dist/cjs/functions/math/average/average.cjs +2 -2
  94. package/dist/cjs/functions/math/average/average.cjs.map +2 -2
  95. package/dist/cjs/functions/math/average/averageif.cjs +3 -3
  96. package/dist/cjs/functions/math/average/averageif.cjs.map +3 -3
  97. package/dist/cjs/functions/math/average/averageifs.cjs.map +2 -2
  98. package/dist/cjs/functions/math/ceiling/ceiling.cjs +2 -2
  99. package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +3 -3
  100. package/dist/cjs/functions/math/max/max-utils.cjs +2 -2
  101. package/dist/cjs/functions/math/max/max-utils.cjs.map +2 -2
  102. package/dist/cjs/functions/math/max/max.cjs +2 -2
  103. package/dist/cjs/functions/math/max/max.cjs.map +2 -2
  104. package/dist/cjs/functions/math/max/maxif.cjs +2 -2
  105. package/dist/cjs/functions/math/max/maxif.cjs.map +2 -2
  106. package/dist/cjs/functions/math/max/maxifs.cjs.map +2 -2
  107. package/dist/cjs/functions/math/min/min-utils.cjs +2 -2
  108. package/dist/cjs/functions/math/min/min-utils.cjs.map +2 -2
  109. package/dist/cjs/functions/math/min/min.cjs +2 -2
  110. package/dist/cjs/functions/math/min/min.cjs.map +3 -3
  111. package/dist/cjs/functions/math/min/minif.cjs +2 -2
  112. package/dist/cjs/functions/math/min/minif.cjs.map +2 -2
  113. package/dist/cjs/functions/math/min/minifs.cjs.map +2 -2
  114. package/dist/cjs/functions/math/sum/sum.cjs +2 -2
  115. package/dist/cjs/functions/math/sum/sum.cjs.map +2 -2
  116. package/dist/cjs/functions/math/sum/sumif.cjs +2 -2
  117. package/dist/cjs/functions/math/sum/sumif.cjs.map +2 -2
  118. package/dist/cjs/functions/math/sum/sumifs.cjs.map +2 -2
  119. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +1 -1
  120. package/dist/cjs/functions/reference/address/address.cjs +2 -2
  121. package/dist/cjs/functions/reference/address/address.cjs.map +2 -2
  122. package/dist/cjs/functions/reference/indirect/indirect.cjs +3 -3
  123. package/dist/cjs/functions/reference/indirect/indirect.cjs.map +3 -3
  124. package/dist/cjs/functions/reference/offset/offset.cjs +3 -3
  125. package/dist/cjs/functions/reference/offset/offset.cjs.map +2 -2
  126. package/dist/cjs/functions/text/concatenate/concatenate.cjs +2 -2
  127. package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +2 -2
  128. package/dist/cjs/functions/text/exact/exact.cjs +2 -2
  129. package/dist/cjs/functions/text/exact/exact.cjs.map +2 -2
  130. package/dist/cjs/functions/text/find/find.cjs +2 -2
  131. package/dist/cjs/functions/text/find/find.cjs.map +3 -3
  132. package/dist/cjs/functions/text/left/left.cjs +2 -2
  133. package/dist/cjs/functions/text/left/left.cjs.map +2 -2
  134. package/dist/cjs/functions/text/len/len.cjs +2 -2
  135. package/dist/cjs/functions/text/len/len.cjs.map +3 -3
  136. package/dist/cjs/functions/text/mid/mid.cjs +2 -2
  137. package/dist/cjs/functions/text/mid/mid.cjs.map +2 -2
  138. package/dist/cjs/functions/text/right/right.cjs +2 -2
  139. package/dist/cjs/functions/text/right/right.cjs.map +3 -3
  140. package/dist/cjs/functions/text/text-helpers.cjs +2 -2
  141. package/dist/cjs/functions/text/text-helpers.cjs.map +2 -2
  142. package/dist/cjs/functions/text/textjoin/textjoin.cjs +2 -2
  143. package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +3 -3
  144. package/dist/cjs/lib.cjs +2 -1
  145. package/dist/cjs/lib.cjs.map +3 -3
  146. package/dist/cjs/package.json +1 -1
  147. package/dist/cjs/parser/formatter.cjs +2 -2
  148. package/dist/cjs/parser/formatter.cjs.map +2 -2
  149. package/dist/mjs/core/engine.mjs +7 -9
  150. package/dist/mjs/core/engine.mjs.map +3 -3
  151. package/dist/mjs/core/managers/dependency-manager.mjs +8 -8
  152. package/dist/mjs/core/managers/dependency-manager.mjs.map +3 -3
  153. package/dist/mjs/core/managers/evaluation-manager.mjs +10 -10
  154. package/dist/mjs/core/managers/evaluation-manager.mjs.map +2 -2
  155. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +1 -1
  156. package/dist/mjs/core/managers/isDependencyNode.mjs +6 -6
  157. package/dist/mjs/core/managers/isDependencyNode.mjs.map +2 -2
  158. package/dist/mjs/core/managers/named-expression-manager.mjs.map +1 -1
  159. package/dist/mjs/core/managers/range-eval-order-builder.mjs +2 -2
  160. package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +3 -3
  161. package/dist/mjs/core/managers/workbook-manager.mjs +3 -3
  162. package/dist/mjs/core/managers/workbook-manager.mjs.map +2 -2
  163. package/dist/mjs/core/types.mjs.map +2 -2
  164. package/dist/mjs/core/utils.mjs +2 -2
  165. package/dist/mjs/core/utils.mjs.map +2 -2
  166. package/dist/mjs/evaluator/arithmetic/add/add.mjs +2 -2
  167. package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +2 -2
  168. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +2 -2
  169. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +2 -2
  170. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +2 -2
  171. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +2 -2
  172. package/dist/mjs/evaluator/arithmetic/power/power.mjs +2 -2
  173. package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +2 -2
  174. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +2 -2
  175. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +2 -2
  176. package/dist/mjs/evaluator/comparison/equals.mjs.map +1 -1
  177. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +2 -2
  178. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +2 -2
  179. package/dist/mjs/evaluator/comparison/greater-than.mjs +2 -2
  180. package/dist/mjs/evaluator/comparison/greater-than.mjs.map +2 -2
  181. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +2 -2
  182. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +2 -2
  183. package/dist/mjs/evaluator/comparison/less-than.mjs +2 -2
  184. package/dist/mjs/evaluator/comparison/less-than.mjs.map +2 -2
  185. package/dist/mjs/evaluator/comparison/not-equals.mjs +2 -2
  186. package/dist/mjs/evaluator/comparison/not-equals.mjs.map +2 -2
  187. package/dist/mjs/evaluator/concatenation/concatenate.mjs +2 -2
  188. package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +2 -2
  189. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +2 -2
  190. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +2 -2
  191. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +2 -2
  192. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +2 -2
  193. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +2 -2
  194. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +3 -3
  195. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +2 -2
  196. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +2 -2
  197. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +2 -2
  198. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +1 -1
  199. package/dist/mjs/evaluator/evaluation-context.mjs.map +2 -2
  200. package/dist/mjs/evaluator/evaluation-error.mjs.map +1 -1
  201. package/dist/mjs/evaluator/formula-evaluator.mjs +7 -7
  202. package/dist/mjs/evaluator/formula-evaluator.mjs.map +3 -3
  203. package/dist/mjs/evaluator/range-evaluation-node.mjs +3 -3
  204. package/dist/mjs/evaluator/range-evaluation-node.mjs.map +2 -2
  205. package/dist/mjs/functions/_template/template.mjs.map +1 -1
  206. package/dist/mjs/functions/array/sequence/sequence.mjs +4 -4
  207. package/dist/mjs/functions/array/sequence/sequence.mjs.map +2 -2
  208. package/dist/mjs/functions/criteria-parser.mjs.map +1 -1
  209. package/dist/mjs/functions/criteria-utils.mjs +8 -8
  210. package/dist/mjs/functions/criteria-utils.mjs.map +3 -3
  211. package/dist/mjs/functions/function-utils.mjs.map +1 -1
  212. package/dist/mjs/functions/index.mjs.map +1 -1
  213. package/dist/mjs/functions/information/cell/cell.mjs +3 -3
  214. package/dist/mjs/functions/information/cell/cell.mjs.map +2 -2
  215. package/dist/mjs/functions/information/column/column.mjs +4 -4
  216. package/dist/mjs/functions/information/column/column.mjs.map +2 -2
  217. package/dist/mjs/functions/information/row/row.mjs +4 -4
  218. package/dist/mjs/functions/information/row/row.mjs.map +2 -2
  219. package/dist/mjs/functions/logical/and/and.mjs +2 -2
  220. package/dist/mjs/functions/logical/and/and.mjs.map +2 -2
  221. package/dist/mjs/functions/logical/if/if.mjs +2 -2
  222. package/dist/mjs/functions/logical/if/if.mjs.map +3 -3
  223. package/dist/mjs/functions/logical/iferror/iferror.mjs +3 -3
  224. package/dist/mjs/functions/logical/iferror/iferror.mjs.map +2 -2
  225. package/dist/mjs/functions/logical/or/or.mjs +2 -2
  226. package/dist/mjs/functions/logical/or/or.mjs.map +2 -2
  227. package/dist/mjs/functions/lookup/count/count-utils.mjs.map +1 -1
  228. package/dist/mjs/functions/lookup/count/count.mjs +2 -2
  229. package/dist/mjs/functions/lookup/count/count.mjs.map +2 -2
  230. package/dist/mjs/functions/lookup/count/countif.mjs +2 -2
  231. package/dist/mjs/functions/lookup/count/countif.mjs.map +2 -2
  232. package/dist/mjs/functions/lookup/count/countifs.mjs.map +1 -1
  233. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +2 -2
  234. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +2 -2
  235. package/dist/mjs/functions/lookup/match/match.mjs +2 -2
  236. package/dist/mjs/functions/lookup/match/match.mjs.map +2 -2
  237. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +2 -2
  238. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +2 -2
  239. package/dist/mjs/functions/math/average/average-utils.mjs +2 -2
  240. package/dist/mjs/functions/math/average/average-utils.mjs.map +2 -2
  241. package/dist/mjs/functions/math/average/average.mjs +2 -2
  242. package/dist/mjs/functions/math/average/average.mjs.map +2 -2
  243. package/dist/mjs/functions/math/average/averageif.mjs +3 -3
  244. package/dist/mjs/functions/math/average/averageif.mjs.map +3 -3
  245. package/dist/mjs/functions/math/average/averageifs.mjs.map +2 -2
  246. package/dist/mjs/functions/math/ceiling/ceiling.mjs +2 -2
  247. package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +3 -3
  248. package/dist/mjs/functions/math/max/max-utils.mjs +2 -2
  249. package/dist/mjs/functions/math/max/max-utils.mjs.map +2 -2
  250. package/dist/mjs/functions/math/max/max.mjs +2 -2
  251. package/dist/mjs/functions/math/max/max.mjs.map +2 -2
  252. package/dist/mjs/functions/math/max/maxif.mjs +2 -2
  253. package/dist/mjs/functions/math/max/maxif.mjs.map +2 -2
  254. package/dist/mjs/functions/math/max/maxifs.mjs.map +2 -2
  255. package/dist/mjs/functions/math/min/min-utils.mjs +2 -2
  256. package/dist/mjs/functions/math/min/min-utils.mjs.map +2 -2
  257. package/dist/mjs/functions/math/min/min.mjs +2 -2
  258. package/dist/mjs/functions/math/min/min.mjs.map +2 -2
  259. package/dist/mjs/functions/math/min/minif.mjs +2 -2
  260. package/dist/mjs/functions/math/min/minif.mjs.map +2 -2
  261. package/dist/mjs/functions/math/min/minifs.mjs.map +2 -2
  262. package/dist/mjs/functions/math/sum/sum.mjs +2 -2
  263. package/dist/mjs/functions/math/sum/sum.mjs.map +2 -2
  264. package/dist/mjs/functions/math/sum/sumif.mjs +2 -2
  265. package/dist/mjs/functions/math/sum/sumif.mjs.map +2 -2
  266. package/dist/mjs/functions/math/sum/sumifs.mjs.map +2 -2
  267. package/dist/mjs/functions/math/sum/summation-utils.mjs.map +1 -1
  268. package/dist/mjs/functions/reference/address/address.mjs +2 -2
  269. package/dist/mjs/functions/reference/address/address.mjs.map +2 -2
  270. package/dist/mjs/functions/reference/indirect/indirect.mjs +3 -3
  271. package/dist/mjs/functions/reference/indirect/indirect.mjs.map +3 -3
  272. package/dist/mjs/functions/reference/offset/offset.mjs +3 -3
  273. package/dist/mjs/functions/reference/offset/offset.mjs.map +2 -2
  274. package/dist/mjs/functions/text/concatenate/concatenate.mjs +2 -2
  275. package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +2 -2
  276. package/dist/mjs/functions/text/exact/exact.mjs +2 -2
  277. package/dist/mjs/functions/text/exact/exact.mjs.map +2 -2
  278. package/dist/mjs/functions/text/find/find.mjs +2 -2
  279. package/dist/mjs/functions/text/find/find.mjs.map +3 -3
  280. package/dist/mjs/functions/text/left/left.mjs +3 -3
  281. package/dist/mjs/functions/text/left/left.mjs.map +2 -2
  282. package/dist/mjs/functions/text/len/len.mjs +2 -2
  283. package/dist/mjs/functions/text/len/len.mjs.map +3 -3
  284. package/dist/mjs/functions/text/mid/mid.mjs +3 -3
  285. package/dist/mjs/functions/text/mid/mid.mjs.map +2 -2
  286. package/dist/mjs/functions/text/right/right.mjs +4 -4
  287. package/dist/mjs/functions/text/right/right.mjs.map +3 -3
  288. package/dist/mjs/functions/text/text-helpers.mjs +2 -2
  289. package/dist/mjs/functions/text/text-helpers.mjs.map +2 -2
  290. package/dist/mjs/functions/text/textjoin/textjoin.mjs +2 -2
  291. package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +3 -3
  292. package/dist/mjs/lib.mjs +2 -1
  293. package/dist/mjs/lib.mjs.map +3 -3
  294. package/dist/mjs/package.json +1 -1
  295. package/dist/mjs/parser/formatter.mjs +2 -2
  296. package/dist/mjs/parser/formatter.mjs.map +2 -2
  297. package/dist/types/core/engine.d.ts +5 -1
  298. package/dist/types/core/managers/dependency-manager.d.ts +7 -7
  299. package/dist/types/core/managers/dependency-node.d.ts +5 -5
  300. package/dist/types/core/managers/evaluation-manager.d.ts +4 -4
  301. package/dist/types/core/managers/frontier-dependency-manager.d.ts +2 -2
  302. package/dist/types/core/managers/named-expression-manager.d.ts +2 -2
  303. package/dist/types/core/managers/workbook-manager.d.ts +1 -1
  304. package/dist/types/core/types.d.ts +3 -3
  305. package/dist/types/evaluator/arithmetic/add/add.d.ts +1 -1
  306. package/dist/types/evaluator/arithmetic/divide/divide.d.ts +1 -1
  307. package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +1 -1
  308. package/dist/types/evaluator/arithmetic/power/power.d.ts +1 -1
  309. package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +1 -1
  310. package/dist/types/evaluator/comparison/equals.d.ts +1 -1
  311. package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +1 -1
  312. package/dist/types/evaluator/comparison/greater-than.d.ts +1 -1
  313. package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +1 -1
  314. package/dist/types/evaluator/comparison/less-than.d.ts +1 -1
  315. package/dist/types/evaluator/comparison/not-equals.d.ts +1 -1
  316. package/dist/types/evaluator/concatenation/concatenate.d.ts +1 -1
  317. package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +2 -2
  318. package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +1 -1
  319. package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +1 -1
  320. package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +4 -4
  321. package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +1 -1
  322. package/dist/types/evaluator/evaluate-scalar-operator.d.ts +1 -1
  323. package/dist/types/evaluator/evaluation-context.d.ts +3 -3
  324. package/dist/types/evaluator/evaluation-error.d.ts +2 -2
  325. package/dist/types/evaluator/formula-evaluator.d.ts +5 -5
  326. package/dist/types/evaluator/range-evaluation-node.d.ts +4 -4
  327. package/dist/types/functions/_template/template.d.ts +1 -1
  328. package/dist/types/functions/array/sequence/sequence.d.ts +1 -1
  329. package/dist/types/functions/criteria-parser.d.ts +1 -1
  330. package/dist/types/functions/criteria-utils.d.ts +5 -5
  331. package/dist/types/functions/function-utils.d.ts +5 -5
  332. package/dist/types/functions/index.d.ts +1 -1
  333. package/dist/types/functions/information/cell/cell.d.ts +1 -1
  334. package/dist/types/functions/information/column/column.d.ts +1 -1
  335. package/dist/types/functions/information/row/row.d.ts +1 -1
  336. package/dist/types/functions/logical/and/and.d.ts +1 -1
  337. package/dist/types/functions/logical/if/if.d.ts +1 -1
  338. package/dist/types/functions/logical/iferror/iferror.d.ts +1 -1
  339. package/dist/types/functions/logical/or/or.d.ts +1 -1
  340. package/dist/types/functions/lookup/count/count-utils.d.ts +2 -2
  341. package/dist/types/functions/lookup/count/count.d.ts +1 -1
  342. package/dist/types/functions/lookup/count/countif.d.ts +1 -1
  343. package/dist/types/functions/lookup/count/countifs.d.ts +1 -1
  344. package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +1 -1
  345. package/dist/types/functions/lookup/match/match.d.ts +1 -1
  346. package/dist/types/functions/lookup/xlookup/xlookup.d.ts +1 -1
  347. package/dist/types/functions/math/average/average-utils.d.ts +2 -2
  348. package/dist/types/functions/math/average/average.d.ts +1 -1
  349. package/dist/types/functions/math/average/averageif.d.ts +1 -1
  350. package/dist/types/functions/math/average/averageifs.d.ts +1 -1
  351. package/dist/types/functions/math/ceiling/ceiling.d.ts +1 -1
  352. package/dist/types/functions/math/max/max-utils.d.ts +2 -2
  353. package/dist/types/functions/math/max/max.d.ts +1 -1
  354. package/dist/types/functions/math/max/maxif.d.ts +1 -1
  355. package/dist/types/functions/math/max/maxifs.d.ts +1 -1
  356. package/dist/types/functions/math/min/min-utils.d.ts +2 -2
  357. package/dist/types/functions/math/min/min.d.ts +1 -1
  358. package/dist/types/functions/math/min/minif.d.ts +1 -1
  359. package/dist/types/functions/math/min/minifs.d.ts +1 -1
  360. package/dist/types/functions/math/sum/sum.d.ts +1 -1
  361. package/dist/types/functions/math/sum/sumif.d.ts +1 -1
  362. package/dist/types/functions/math/sum/sumifs.d.ts +1 -1
  363. package/dist/types/functions/math/sum/summation-utils.d.ts +1 -1
  364. package/dist/types/functions/reference/address/address.d.ts +1 -1
  365. package/dist/types/functions/reference/indirect/indirect.d.ts +1 -1
  366. package/dist/types/functions/reference/offset/offset.d.ts +1 -1
  367. package/dist/types/functions/text/concatenate/concatenate.d.ts +1 -1
  368. package/dist/types/functions/text/exact/exact.d.ts +1 -1
  369. package/dist/types/functions/text/find/find.d.ts +1 -1
  370. package/dist/types/functions/text/left/left.d.ts +1 -1
  371. package/dist/types/functions/text/len/len.d.ts +1 -1
  372. package/dist/types/functions/text/mid/mid.d.ts +1 -1
  373. package/dist/types/functions/text/right/right.d.ts +1 -1
  374. package/dist/types/functions/text/text-helpers.d.ts +3 -3
  375. package/dist/types/functions/text/textjoin/textjoin.d.ts +1 -1
  376. package/dist/types/lib.d.ts +1 -0
  377. package/package.json +1 -1
  378. package/dist/cjs/core/managers/index.cjs +0 -49
  379. package/dist/cjs/core/managers/index.cjs.map +0 -10
  380. package/dist/mjs/core/managers/index.mjs +0 -21
  381. package/dist/mjs/core/managers/index.mjs.map +0 -10
  382. package/dist/types/core/managers/index.d.ts +0 -7
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/min/minif.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performMinimum } from \"./min-utils.mjs\";\n\n/**\n * MINIF function - Returns the minimum value among cells specified by a criteria\n *\n * Usage: MINIF(range, criteria, [min_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * min_range: Optional. The range to find minimum from. If omitted, uses the range parameter\n *\n * Examples:\n * MINIF(A1:A10, \"Apple\") - min of cells in A1:A10 that contain \"Apple\"\n * MINIF(B1:B10, \">10\") - min of cells in B1:B10 with values greater than 10\n * MINIF(A1:A10, \"Apple\", B1:B10) - min of B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are considered for the minimum\n * - Returns error if no values match the criteria\n */\nexport const MINIF: FunctionDefinition = {\n name: \"MINIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"MINIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MINIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine min range (third argument if present, otherwise same as criteria range)\n const minRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (minRangeResult.type === \"error\") {\n return minRangeResult;\n }\n\n // Use shared minimum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n minRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMinimum(matchingValues.values, context);\n },\n};\n"
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performMinimum } from \"./min-utils.mjs\";\n\n/**\n * MINIF function - Returns the minimum value among cells specified by a criteria\n *\n * Usage: MINIF(range, criteria, [min_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * min_range: Optional. The range to find minimum from. If omitted, uses the range parameter\n *\n * Examples:\n * MINIF(A1:A10, \"Apple\") - min of cells in A1:A10 that contain \"Apple\"\n * MINIF(B1:B10, \">10\") - min of cells in B1:B10 with values greater than 10\n * MINIF(A1:A10, \"Apple\", B1:B10) - min of B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are considered for the minimum\n * - Returns error if no values match the criteria\n */\nexport const MINIF: FunctionDefinition = {\n name: \"MINIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"MINIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"MINIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine min range (third argument if present, otherwise same as criteria range)\n const minRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (minRangeResult.type === \"error\") {\n return minRangeResult;\n }\n\n // Use shared minimum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n minRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMinimum(matchingValues.values, context);\n },\n};\n"
6
6
  ],
7
7
  "mappings": ";AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AACA;AAuBO,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,2BAA2B,SAAS,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IACpE,IAAI,oBAAoB,SAAS,SAAS;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBAAiB,cAAc,eAAe,MAAM;AAAA,IAC1D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,eAAe;AAAA,QACxB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBACJ,KAAK,KAAK,WAAW,IACjB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO,IACxC;AAAA,IAEN,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,CAAC,EAAE,aAAa,qBAAqB,eAAe,CAAC,GACrD,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
8
- "debugId": "4ABA08F6CF9EBBD864756E2164756E21",
8
+ "debugId": "9B3C601C38D6CF0664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/min/minifs.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performMinimum } from \"./min-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\n\n/**\n * MINIFS function - Returns the minimum value among cells specified by multiple criteria\n *\n * Usage: MINIFS(min_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * min_range: The range of cells from which you want the minimum\n * criteria_range1: The first range in which to evaluate criteria\n * criteria1: The criteria to apply to criteria_range1\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * MINIFS(B1:B10, A1:A10, \"Apple\") - min of B1:B10 where A1:A10 = \"Apple\"\n * MINIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - min of C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are considered for the minimum\n * - Returns error if no values match all criteria\n */\nexport const MINIFS: FunctionDefinition = {\n name: \"MINIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments using utility\n const argError = validateMultiCriteriaArgs(\"MINIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate min range\n const minRangeResult = this.evaluateNode(node.args[0]!, context);\n if (minRangeResult.type === \"error\") {\n return minRangeResult;\n }\n\n // Parse criteria pairs using utility\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n const criteriaPairs = criteriaPairsResult;\n\n // Use shared minimum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n minRangeResult,\n criteriaPairs,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMinimum(matchingValues.values, context);\n },\n};\n"
5
+ "import {\n type FunctionDefinition,\n type FunctionEvaluationResult\n} from \"../../../core/types.mjs\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performMinimum } from \"./min-utils.mjs\";\n\n/**\n * MINIFS function - Returns the minimum value among cells specified by multiple criteria\n *\n * Usage: MINIFS(min_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * min_range: The range of cells from which you want the minimum\n * criteria_range1: The first range in which to evaluate criteria\n * criteria1: The criteria to apply to criteria_range1\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * MINIFS(B1:B10, A1:A10, \"Apple\") - min of B1:B10 where A1:A10 = \"Apple\"\n * MINIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - min of C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are considered for the minimum\n * - Returns error if no values match all criteria\n */\nexport const MINIFS: FunctionDefinition = {\n name: \"MINIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments using utility\n const argError = validateMultiCriteriaArgs(\"MINIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate min range\n const minRangeResult = this.evaluateNode(node.args[0]!, context);\n if (minRangeResult.type === \"error\") {\n return minRangeResult;\n }\n\n // Parse criteria pairs using utility\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n const criteriaPairs = criteriaPairsResult;\n\n // Use shared minimum utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n minRangeResult,\n criteriaPairs,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performMinimum(matchingValues.values, context);\n },\n};\n"
6
6
  ],
7
- "mappings": ";AAMA;AAAA;AAAA;AAAA;AAAA;AAKA;AAsBO,IAAM,SAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,UAAU,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB;AAAA,IAGtB,MAAM,iBAAiB,2BACrB,MACA,gBACA,eACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
7
+ "mappings": ";AAIA;AAAA;AAAA;AAAA;AAAA;AAKA;AAqBO,IAAM,SAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,UAAU,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IACA,MAAM,gBAAgB;AAAA,IAGtB,MAAM,iBAAiB,2BACrB,MACA,gBACA,eACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,eAAe,eAAe,QAAQ,OAAO;AAAA;AAExD;",
8
8
  "debugId": "CC6DF45F70D7398B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,6 +1,6 @@
1
1
  // src/functions/math/sum/sum.ts
2
2
  import { performSummation } from "./summation-utils.mjs";
3
- import { createArgumentIterator } from "src/functions/function-utils";
3
+ import { createArgumentIterator } from "../../function-utils.mjs";
4
4
  var SUM = {
5
5
  name: "SUM",
6
6
  evaluate: function(node, context) {
@@ -15,4 +15,4 @@ export {
15
15
  SUM
16
16
  };
17
17
 
18
- //# debugId=D3BB63630E933DAC64756E2164756E21
18
+ //# debugId=D18937ED6441729B64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/sum/sum.ts"],
4
4
  "sourcesContent": [
5
- "import { type FunctionDefinition } from \"src/core/types\";\nimport { performSummation } from \"./summation-utils.mjs\";\nimport { createArgumentIterator } from \"src/functions/function-utils\";\n\n/**\n * SUM function - Adds all numbers in the arguments\n */\nexport const SUM: FunctionDefinition = {\n name: \"SUM\",\n evaluate: function (node, context) {\n // Create iterator from all arguments\n const argumentIterator = createArgumentIterator(\n this,\n node,\n context,\n \"col-major\"\n );\n\n if (argumentIterator.type !== \"values\") {\n return argumentIterator;\n }\n\n // Perform summation with error propagation (SUM propagates errors from direct arguments)\n return performSummation(argumentIterator.values);\n },\n};\n"
5
+ "import { type FunctionDefinition } from \"../../../core/types.mjs\";\nimport { performSummation } from \"./summation-utils.mjs\";\nimport { createArgumentIterator } from \"../../function-utils.mjs\";\n\n/**\n * SUM function - Adds all numbers in the arguments\n */\nexport const SUM: FunctionDefinition = {\n name: \"SUM\",\n evaluate: function (node, context) {\n // Create iterator from all arguments\n const argumentIterator = createArgumentIterator(\n this,\n node,\n context,\n \"col-major\"\n );\n\n if (argumentIterator.type !== \"values\") {\n return argumentIterator;\n }\n\n // Perform summation with error propagation (SUM propagates errors from direct arguments)\n return performSummation(argumentIterator.values);\n },\n};\n"
6
6
  ],
7
7
  "mappings": ";AACA;AACA;AAKO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAS;AAAA,IAEjC,MAAM,mBAAmB,uBACvB,MACA,MACA,SACA,WACF;AAAA,IAEA,IAAI,iBAAiB,SAAS,UAAU;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,iBAAiB,iBAAiB,MAAM;AAAA;AAEnD;",
8
- "debugId": "D3BB63630E933DAC64756E2164756E21",
8
+ "debugId": "D18937ED6441729B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // src/functions/math/sum/sumif.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
4
+ } from "../../../core/types.mjs";
5
5
  import {
6
6
  processMultiCriteriaValues,
7
7
  validateSingleCriteriaArgs
@@ -55,4 +55,4 @@ export {
55
55
  SUMIF
56
56
  };
57
57
 
58
- //# debugId=52F8841DF4F61B8364756E2164756E21
58
+ //# debugId=B043C53DA1834FE664756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/sum/sumif.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performSummation } from \"./summation-utils.mjs\";\n\n/**\n * SUMIF function - Sums cells in a range that meet a criteria\n *\n * Usage: SUMIF(range, criteria, [sum_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * sum_range: Optional. The range to sum. If omitted, uses the range parameter\n *\n * Examples:\n * SUMIF(A1:A10, \"Apple\") - sums cells in A1:A10 that contain \"Apple\"\n * SUMIF(B1:B10, \">10\") - sums cells in B1:B10 with values greater than 10\n * SUMIF(A1:A10, \"Apple\", B1:B10) - sums B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are included in the sum\n * - Returns 0 if no values match the criteria\n */\nexport const SUMIF: FunctionDefinition = {\n name: \"SUMIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"SUMIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"SUMIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine sum range (third argument if present, otherwise same as criteria range)\n const sumRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (sumRangeResult.type === \"error\") {\n return sumRangeResult;\n }\n\n // Use shared summation utility\n const matchingValues = processMultiCriteriaValues(\n this,\n sumRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performSummation(matchingValues.values);\n },\n};\n"
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport {\n processMultiCriteriaValues,\n validateSingleCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { parseCriteria, matchesParsedCriteria } from \"../../criteria-parser.mjs\";\nimport { performSummation } from \"./summation-utils.mjs\";\n\n/**\n * SUMIF function - Sums cells in a range that meet a criteria\n *\n * Usage: SUMIF(range, criteria, [sum_range])\n *\n * range: The range of cells to evaluate against the criteria\n * criteria: The criteria to match against. Can be:\n * - Exact value: \"Apple\", 42\n * - Comparison: \">10\", \"<=5\", \"<>0\"\n * - Wildcards: \"App*\", \"?ruit\"\n * sum_range: Optional. The range to sum. If omitted, uses the range parameter\n *\n * Examples:\n * SUMIF(A1:A10, \"Apple\") - sums cells in A1:A10 that contain \"Apple\"\n * SUMIF(B1:B10, \">10\") - sums cells in B1:B10 with values greater than 10\n * SUMIF(A1:A10, \"Apple\", B1:B10) - sums B1:B10 where A1:A10 contains \"Apple\"\n *\n * Note:\n * - Only numeric values are included in the sum\n * - Returns 0 if no values match the criteria\n */\nexport const SUMIF: FunctionDefinition = {\n name: \"SUMIF\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateSingleCriteriaArgs(\"SUMIF\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate criteria range (first argument)\n const criteriaRangeResult = this.evaluateNode(node.args[0]!, context);\n if (criteriaRangeResult.type === \"error\") {\n return criteriaRangeResult;\n }\n\n // Evaluate criteria (second argument)\n const criteriaResult = this.evaluateNode(node.args[1]!, context);\n if (criteriaResult.type === \"error\") {\n return criteriaResult;\n }\n\n if (criteriaResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"SUMIF criteria must be a single value\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse criteria\n const parsedCriteria = parseCriteria(criteriaResult.result);\n if (parsedCriteria.type === \"error\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: parsedCriteria.message,\n errAddress: context.dependencyNode,\n };\n }\n\n // Determine sum range (third argument if present, otherwise same as criteria range)\n const sumRangeResult =\n node.args.length === 3\n ? this.evaluateNode(node.args[2]!, context)\n : criteriaRangeResult;\n\n if (sumRangeResult.type === \"error\") {\n return sumRangeResult;\n }\n\n // Use shared summation utility\n const matchingValues = processMultiCriteriaValues(\n this,\n sumRangeResult,\n [{ rangeResult: criteriaRangeResult, parsedCriteria }],\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performSummation(matchingValues.values);\n },\n};\n"
6
6
  ],
7
7
  "mappings": ";AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAIA;AACA;AAuBO,IAAM,QAA4B;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,2BAA2B,SAAS,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IACpE,IAAI,oBAAoB,SAAS,SAAS;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBAAiB,cAAc,eAAe,MAAM;AAAA,IAC1D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,eAAe;AAAA,QACxB,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,iBACJ,KAAK,KAAK,WAAW,IACjB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO,IACxC;AAAA,IAEN,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,CAAC,EAAE,aAAa,qBAAqB,eAAe,CAAC,GACrD,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,iBAAiB,eAAe,MAAM;AAAA;AAEjD;",
8
- "debugId": "52F8841DF4F61B8364756E2164756E21",
8
+ "debugId": "B043C53DA1834FE664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/sum/sumifs.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performSummation } from \"./summation-utils.mjs\";\n\n/**\n * SUMIFS function - Sums cells in a range that meet multiple criteria\n *\n * Usage: SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * sum_range: The range of cells to sum\n * criteria_range1: The first range to evaluate against criteria1\n * criteria1: The first criteria to match against\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * SUMIFS(B1:B10, A1:A10, \"Apple\") - sums B1:B10 where A1:A10 = \"Apple\"\n * SUMIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - sums C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are included in the sum\n * - Returns 0 if no values match all criteria (unlike other IFS functions that return error)\n */\nexport const SUMIFS: FunctionDefinition = {\n name: \"SUMIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateMultiCriteriaArgs(\"SUMIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate sum range (first argument)\n const sumRangeResult = this.evaluateNode(node.args[0]!, context);\n if (sumRangeResult.type === \"error\") {\n return sumRangeResult;\n }\n\n // Parse criteria pairs starting from argument 1\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n\n // Use shared summation utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n sumRangeResult,\n criteriaPairsResult,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performSummation(matchingValues.values);\n },\n};\n"
5
+ "import {\n type FunctionDefinition,\n type FunctionEvaluationResult\n} from \"../../../core/types.mjs\";\nimport {\n parseCriteriaPairs,\n processMultiCriteriaValues,\n validateMultiCriteriaArgs,\n} from \"../../criteria-utils.mjs\";\nimport { performSummation } from \"./summation-utils.mjs\";\n\n/**\n * SUMIFS function - Sums cells in a range that meet multiple criteria\n *\n * Usage: SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...)\n *\n * sum_range: The range of cells to sum\n * criteria_range1: The first range to evaluate against criteria1\n * criteria1: The first criteria to match against\n * criteria_range2, criteria2: Optional additional criteria pairs\n *\n * Examples:\n * SUMIFS(B1:B10, A1:A10, \"Apple\") - sums B1:B10 where A1:A10 = \"Apple\"\n * SUMIFS(C1:C10, A1:A10, \"Apple\", B1:B10, \">10\") - sums C1:C10 where A1:A10 = \"Apple\" AND B1:B10 > 10\n *\n * Note:\n * - All criteria must be satisfied for a value to be included\n * - Only numeric values are included in the sum\n * - Returns 0 if no values match all criteria (unlike other IFS functions that return error)\n */\nexport const SUMIFS: FunctionDefinition = {\n name: \"SUMIFS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n // Validate arguments\n const argError = validateMultiCriteriaArgs(\"SUMIFS\", node.args.length, context);\n if (argError) {\n return argError;\n }\n\n // Evaluate sum range (first argument)\n const sumRangeResult = this.evaluateNode(node.args[0]!, context);\n if (sumRangeResult.type === \"error\") {\n return sumRangeResult;\n }\n\n // Parse criteria pairs starting from argument 1\n const criteriaPairsResult = parseCriteriaPairs.call(\n this,\n node,\n context,\n this.evaluateNode,\n 1\n );\n if (\"type\" in criteriaPairsResult) {\n return criteriaPairsResult;\n }\n\n // Use shared summation utility for standard cases\n const matchingValues = processMultiCriteriaValues(\n this,\n sumRangeResult,\n criteriaPairsResult,\n context,\n \"col-major\"\n );\n\n if (matchingValues.type === \"error\" || matchingValues.type === \"awaiting-evaluation\") {\n return matchingValues;\n }\n\n return performSummation(matchingValues.values);\n },\n};\n"
6
6
  ],
7
- "mappings": ";AAMA;AAAA;AAAA;AAAA;AAAA;AAKA;AAqBO,IAAM,SAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,UAAU,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,qBACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,iBAAiB,eAAe,MAAM;AAAA;AAEjD;",
7
+ "mappings": ";AAIA;AAAA;AAAA;AAAA;AAAA;AAKA;AAqBO,IAAM,SAA6B;AAAA,EACxC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAE3D,MAAM,WAAW,0BAA0B,UAAU,KAAK,KAAK,QAAQ,OAAO;AAAA,IAC9E,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC/D,IAAI,eAAe,SAAS,SAAS;AAAA,MACnC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,sBAAsB,mBAAmB,KAC7C,MACA,MACA,SACA,KAAK,cACL,CACF;AAAA,IACA,IAAI,UAAU,qBAAqB;AAAA,MACjC,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,iBAAiB,2BACrB,MACA,gBACA,qBACA,SACA,WACF;AAAA,IAEA,IAAI,eAAe,SAAS,WAAW,eAAe,SAAS,uBAAuB;AAAA,MACpF,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,iBAAiB,eAAe,MAAM;AAAA;AAEjD;",
8
8
  "debugId": "E9A98FD8BC29414D64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/math/sum/summation-utils.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n type CellInfinity,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { FunctionNode } from \"src/parser/ast\";\n\n/**\n * Result type for processInfinity in sum functions\n */\nexport type ProcessInfinityResult<T> =\n | { type: \"infinity\"; infinity: CellInfinity }\n | { type: \"state\"; state: T };\n\n/**\n * Perform summation with error propagation\n * Used when errors should be propagated instead of skipped (e.g., SUM with direct error arguments)\n *\n * @param results - Iterator of SingleEvaluationResults to sum\n * @returns FunctionEvaluationResult with the sum, infinity, or first error encountered\n */\nexport function performSummation(\n results: Iterable<SingleEvaluationResult>\n): FunctionEvaluationResult {\n let sum = 0;\n let hasValues = false;\n\n for (const result of results) {\n if (result.type === \"value\") {\n if (result.result.type === \"number\") {\n sum += result.result.value;\n hasValues = true;\n } else if (result.result.type === \"infinity\") {\n // Infinity dominates - return immediately\n return {\n type: \"value\",\n result: result.result,\n };\n } else {\n // Non-numeric values (strings, booleans) are ignored in summation\n }\n }\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: sum },\n };\n}\n"
5
+ "import {\n FormulaError,\n type FunctionEvaluationResult,\n type SingleEvaluationResult,\n type CellInfinity,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport type { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { FunctionNode } from \"../../../parser/ast.mjs\";\n\n/**\n * Result type for processInfinity in sum functions\n */\nexport type ProcessInfinityResult<T> =\n | { type: \"infinity\"; infinity: CellInfinity }\n | { type: \"state\"; state: T };\n\n/**\n * Perform summation with error propagation\n * Used when errors should be propagated instead of skipped (e.g., SUM with direct error arguments)\n *\n * @param results - Iterator of SingleEvaluationResults to sum\n * @returns FunctionEvaluationResult with the sum, infinity, or first error encountered\n */\nexport function performSummation(\n results: Iterable<SingleEvaluationResult>\n): FunctionEvaluationResult {\n let sum = 0;\n let hasValues = false;\n\n for (const result of results) {\n if (result.type === \"value\") {\n if (result.result.type === \"number\") {\n sum += result.result.value;\n hasValues = true;\n } else if (result.result.type === \"infinity\") {\n // Infinity dominates - return immediately\n return {\n type: \"value\",\n result: result.result,\n };\n } else {\n // Non-numeric values (strings, booleans) are ignored in summation\n }\n }\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: sum },\n };\n}\n"
6
6
  ],
7
7
  "mappings": ";AAwBO,SAAS,gBAAgB,CAC9B,SAC0B;AAAA,EAC1B,IAAI,MAAM;AAAA,EACV,IAAI,YAAY;AAAA,EAEhB,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,OAAO,SAAS,SAAS;AAAA,MAC3B,IAAI,OAAO,OAAO,SAAS,UAAU;AAAA,QACnC,OAAO,OAAO,OAAO;AAAA,QACrB,YAAY;AAAA,MACd,EAAO,SAAI,OAAO,OAAO,SAAS,YAAY;AAAA,QAE5C,OAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF,EAAO;AAAA,IAGT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,EAAE,MAAM,UAAU,OAAO,IAAI;AAAA,EACvC;AAAA;",
8
8
  "debugId": "DB26B1166A855E7564756E2164756E21",
@@ -1,7 +1,7 @@
1
1
  // src/functions/reference/address/address.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
4
+ } from "../../../core/types.mjs";
5
5
  var ADDRESS = {
6
6
  name: "ADDRESS",
7
7
  evaluate: function(node, context) {
@@ -132,4 +132,4 @@ export {
132
132
  ADDRESS
133
133
  };
134
134
 
135
- //# debugId=83CDE403F7D9098264756E2164756E21
135
+ //# debugId=8DF18DEFCCCDC87B64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/reference/address/address.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * ADDRESS function - Creates a cell reference as text given row and column numbers\n * \n * Usage: ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])\n * \n * row_num: The row number to use in the cell reference\n * column_num: The column number to use in the cell reference\n * abs_num: (optional) Type of reference to return (1=absolute, 2=absolute row/relative col, 3=relative row/absolute col, 4=relative)\n * a1: (optional) A logical value that specifies the A1 or R1C1 reference style (TRUE or omitted = A1 style)\n * sheet_text: (optional) The name of the worksheet to be used as the external reference\n * \n * Examples:\n * - ADDRESS(2, 3) returns \"$C$2\"\n * - ADDRESS(2, 3, 4) returns \"C2\"\n * - ADDRESS(2, 3, 1, TRUE, \"Sheet2\") returns \"Sheet2!$C$2\"\n */\nexport const ADDRESS: FunctionDefinition = {\n name: \"ADDRESS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 2 || node.args.length > 5) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function requires 2 to 5 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate row_num\n const rowResult = this.evaluateNode(node.args[0]!, context);\n if (\n rowResult.type === \"error\" ||\n rowResult.type === \"awaiting-evaluation\"\n ) {\n return rowResult;\n }\n\n if (rowResult.type !== \"value\" || rowResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function row_num must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate column_num\n const colResult = this.evaluateNode(node.args[1]!, context);\n if (\n colResult.type === \"error\" ||\n colResult.type === \"awaiting-evaluation\"\n ) {\n return colResult;\n }\n\n if (colResult.type !== \"value\" || colResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function column_num must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const rowNum = Math.floor(rowResult.result.value);\n const colNum = Math.floor(colResult.result.value);\n\n if (rowNum < 1 || colNum < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function row and column numbers must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Default values\n let absNum = 1; // Absolute reference by default\n let a1Style = true;\n let sheetText = \"\";\n\n // Optional abs_num parameter\n if (node.args.length >= 3) {\n const absResult = this.evaluateNode(node.args[2]!, context);\n if (\n absResult.type === \"error\" ||\n absResult.type === \"awaiting-evaluation\"\n ) {\n return absResult;\n }\n\n if (absResult.type === \"value\" && absResult.result.type === \"number\") {\n absNum = Math.floor(absResult.result.value);\n if (absNum < 1 || absNum > 4) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function abs_num must be between 1 and 4\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Optional a1 parameter\n if (node.args.length >= 4) {\n const a1Result = this.evaluateNode(node.args[3]!, context);\n if (\n a1Result.type === \"error\" ||\n a1Result.type === \"awaiting-evaluation\"\n ) {\n return a1Result;\n }\n\n if (a1Result.type === \"value\" && a1Result.result.type === \"boolean\") {\n a1Style = a1Result.result.value;\n }\n }\n\n // Optional sheet_text parameter\n if (node.args.length === 5) {\n const sheetResult = this.evaluateNode(node.args[4]!, context);\n if (\n sheetResult.type === \"error\" ||\n sheetResult.type === \"awaiting-evaluation\"\n ) {\n return sheetResult;\n }\n\n if (sheetResult.type === \"value\" && sheetResult.result.type === \"string\") {\n sheetText = sheetResult.result.value;\n }\n }\n\n // Build the address string\n let address = \"\";\n\n if (a1Style) {\n // A1 style reference\n const colLetter = columnNumberToLetter(colNum);\n \n switch (absNum) {\n case 1: // $A$1\n address = `$${colLetter}$${rowNum}`;\n break;\n case 2: // A$1\n address = `${colLetter}$${rowNum}`;\n break;\n case 3: // $A1\n address = `$${colLetter}${rowNum}`;\n break;\n case 4: // A1\n address = `${colLetter}${rowNum}`;\n break;\n }\n } else {\n // R1C1 style reference\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function R1C1 style not yet implemented\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Add sheet prefix if provided\n if (sheetText) {\n address = `${sheetText}!${address}`;\n }\n\n return {\n type: \"value\",\n result: { type: \"string\", value: address },\n };\n },\n};\n\n/**\n * Helper function to convert column number to letter(s)\n */\nfunction columnNumberToLetter(num: number): string {\n let letter = \"\";\n while (num > 0) {\n const remainder = (num - 1) % 26;\n letter = String.fromCharCode(65 + remainder) + letter;\n num = Math.floor((num - 1) / 26);\n }\n return letter;\n}\n"
5
+ "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * ADDRESS function - Creates a cell reference as text given row and column numbers\n * \n * Usage: ADDRESS(row_num, column_num, [abs_num], [a1], [sheet_text])\n * \n * row_num: The row number to use in the cell reference\n * column_num: The column number to use in the cell reference\n * abs_num: (optional) Type of reference to return (1=absolute, 2=absolute row/relative col, 3=relative row/absolute col, 4=relative)\n * a1: (optional) A logical value that specifies the A1 or R1C1 reference style (TRUE or omitted = A1 style)\n * sheet_text: (optional) The name of the worksheet to be used as the external reference\n * \n * Examples:\n * - ADDRESS(2, 3) returns \"$C$2\"\n * - ADDRESS(2, 3, 4) returns \"C2\"\n * - ADDRESS(2, 3, 1, TRUE, \"Sheet2\") returns \"Sheet2!$C$2\"\n */\nexport const ADDRESS: FunctionDefinition = {\n name: \"ADDRESS\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 2 || node.args.length > 5) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function requires 2 to 5 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate row_num\n const rowResult = this.evaluateNode(node.args[0]!, context);\n if (\n rowResult.type === \"error\" ||\n rowResult.type === \"awaiting-evaluation\"\n ) {\n return rowResult;\n }\n\n if (rowResult.type !== \"value\" || rowResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function row_num must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate column_num\n const colResult = this.evaluateNode(node.args[1]!, context);\n if (\n colResult.type === \"error\" ||\n colResult.type === \"awaiting-evaluation\"\n ) {\n return colResult;\n }\n\n if (colResult.type !== \"value\" || colResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function column_num must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const rowNum = Math.floor(rowResult.result.value);\n const colNum = Math.floor(colResult.result.value);\n\n if (rowNum < 1 || colNum < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function row and column numbers must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Default values\n let absNum = 1; // Absolute reference by default\n let a1Style = true;\n let sheetText = \"\";\n\n // Optional abs_num parameter\n if (node.args.length >= 3) {\n const absResult = this.evaluateNode(node.args[2]!, context);\n if (\n absResult.type === \"error\" ||\n absResult.type === \"awaiting-evaluation\"\n ) {\n return absResult;\n }\n\n if (absResult.type === \"value\" && absResult.result.type === \"number\") {\n absNum = Math.floor(absResult.result.value);\n if (absNum < 1 || absNum > 4) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function abs_num must be between 1 and 4\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Optional a1 parameter\n if (node.args.length >= 4) {\n const a1Result = this.evaluateNode(node.args[3]!, context);\n if (\n a1Result.type === \"error\" ||\n a1Result.type === \"awaiting-evaluation\"\n ) {\n return a1Result;\n }\n\n if (a1Result.type === \"value\" && a1Result.result.type === \"boolean\") {\n a1Style = a1Result.result.value;\n }\n }\n\n // Optional sheet_text parameter\n if (node.args.length === 5) {\n const sheetResult = this.evaluateNode(node.args[4]!, context);\n if (\n sheetResult.type === \"error\" ||\n sheetResult.type === \"awaiting-evaluation\"\n ) {\n return sheetResult;\n }\n\n if (sheetResult.type === \"value\" && sheetResult.result.type === \"string\") {\n sheetText = sheetResult.result.value;\n }\n }\n\n // Build the address string\n let address = \"\";\n\n if (a1Style) {\n // A1 style reference\n const colLetter = columnNumberToLetter(colNum);\n \n switch (absNum) {\n case 1: // $A$1\n address = `$${colLetter}$${rowNum}`;\n break;\n case 2: // A$1\n address = `${colLetter}$${rowNum}`;\n break;\n case 3: // $A1\n address = `$${colLetter}${rowNum}`;\n break;\n case 4: // A1\n address = `${colLetter}${rowNum}`;\n break;\n }\n } else {\n // R1C1 style reference\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"ADDRESS function R1C1 style not yet implemented\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Add sheet prefix if provided\n if (sheetText) {\n address = `${sheetText}!${address}`;\n }\n\n return {\n type: \"value\",\n result: { type: \"string\", value: address },\n };\n },\n};\n\n/**\n * Helper function to convert column number to letter(s)\n */\nfunction columnNumberToLetter(num: number): string {\n let letter = \"\";\n while (num > 0) {\n const remainder = (num - 1) % 26;\n letter = String.fromCharCode(65 + remainder) + letter;\n num = Math.floor((num - 1) / 26);\n }\n return letter;\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "83CDE403F7D9098264756E2164756E21",
8
+ "debugId": "8DF18DEFCCCDC87B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,8 +1,8 @@
1
1
  // src/functions/reference/indirect/indirect.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
5
- import { parseFormula } from "src/parser/parser";
4
+ } from "../../../core/types.mjs";
5
+ import { parseFormula } from "../../../parser/parser.mjs";
6
6
  var INDIRECT = {
7
7
  name: "INDIRECT",
8
8
  evaluate: function(node, context) {
@@ -71,4 +71,4 @@ export {
71
71
  INDIRECT
72
72
  };
73
73
 
74
- //# debugId=AA9E7C83014CFC5C64756E2164756E21
74
+ //# debugId=00423D52B9B6025C64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/reference/indirect/indirect.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport { parseFormula } from \"src/parser/parser\";\n\n/**\n * INDIRECT function - Returns the reference specified by a text string\n * \n * Usage: INDIRECT(ref_text, [a1])\n * \n * ref_text: A reference to a cell that contains an A1-style reference, an R1C1-style reference,\n * a name defined as a reference, or a reference to a cell as a text string\n * a1: (optional) A logical value that specifies what type of reference is in ref_text\n * TRUE or omitted = A1-style reference\n * FALSE = R1C1-style reference\n * \n * Examples:\n * - INDIRECT(\"A1\") returns the value in cell A1\n * - INDIRECT(\"B\" & ROW()) returns the value in column B of the current row\n * - INDIRECT(\"Sheet2!A1\") returns the value in cell A1 of Sheet2\n * \n * Note: This function is volatile - it recalculates whenever the worksheet recalculates\n */\nexport const INDIRECT: FunctionDefinition = {\n name: \"INDIRECT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length === 0 || node.args.length > 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function requires 1 or 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate ref_text\n const refTextResult = this.evaluateNode(node.args[0]!, context);\n if (\n refTextResult.type === \"error\" ||\n refTextResult.type === \"awaiting-evaluation\"\n ) {\n return refTextResult;\n }\n\n if (refTextResult.type !== \"value\" || refTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function ref_text must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n const refText = refTextResult.result.value.trim();\n\n // Optional a1 parameter\n let a1Style = true;\n if (node.args.length === 2) {\n const a1Result = this.evaluateNode(node.args[1]!, context);\n if (\n a1Result.type === \"error\" ||\n a1Result.type === \"awaiting-evaluation\"\n ) {\n return a1Result;\n }\n\n if (a1Result.type === \"value\" && a1Result.result.type === \"boolean\") {\n a1Style = a1Result.result.value;\n }\n }\n\n // R1C1 style not yet supported\n if (!a1Style) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function does not yet support R1C1 style references\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse the reference string as a formula (without the = sign)\n try {\n const ast = parseFormula(refText);\n \n // The parsed result should be a reference, range, or named expression\n if (ast.type !== \"reference\" && ast.type !== \"range\" && ast.type !== \"named-expression\") {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `INDIRECT requires a valid cell or range reference, got: ${refText}`,\n errAddress: context.dependencyNode,\n };\n }\n \n // Evaluate the parsed reference\n const result = this.evaluateNode(ast, context);\n return result;\n \n } catch (error) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `INDIRECT could not parse reference: ${refText}`,\n errAddress: context.dependencyNode,\n };\n }\n },\n};\n"
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult\n} from \"../../../core/types.mjs\";\nimport { parseFormula } from \"../../../parser/parser.mjs\";\n\n/**\n * INDIRECT function - Returns the reference specified by a text string\n * \n * Usage: INDIRECT(ref_text, [a1])\n * \n * ref_text: A reference to a cell that contains an A1-style reference, an R1C1-style reference,\n * a name defined as a reference, or a reference to a cell as a text string\n * a1: (optional) A logical value that specifies what type of reference is in ref_text\n * TRUE or omitted = A1-style reference\n * FALSE = R1C1-style reference\n * \n * Examples:\n * - INDIRECT(\"A1\") returns the value in cell A1\n * - INDIRECT(\"B\" & ROW()) returns the value in column B of the current row\n * - INDIRECT(\"Sheet2!A1\") returns the value in cell A1 of Sheet2\n * \n * Note: This function is volatile - it recalculates whenever the worksheet recalculates\n */\nexport const INDIRECT: FunctionDefinition = {\n name: \"INDIRECT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length === 0 || node.args.length > 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function requires 1 or 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate ref_text\n const refTextResult = this.evaluateNode(node.args[0]!, context);\n if (\n refTextResult.type === \"error\" ||\n refTextResult.type === \"awaiting-evaluation\"\n ) {\n return refTextResult;\n }\n\n if (refTextResult.type !== \"value\" || refTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function ref_text must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n const refText = refTextResult.result.value.trim();\n\n // Optional a1 parameter\n let a1Style = true;\n if (node.args.length === 2) {\n const a1Result = this.evaluateNode(node.args[1]!, context);\n if (\n a1Result.type === \"error\" ||\n a1Result.type === \"awaiting-evaluation\"\n ) {\n return a1Result;\n }\n\n if (a1Result.type === \"value\" && a1Result.result.type === \"boolean\") {\n a1Style = a1Result.result.value;\n }\n }\n\n // R1C1 style not yet supported\n if (!a1Style) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"INDIRECT function does not yet support R1C1 style references\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Parse the reference string as a formula (without the = sign)\n try {\n const ast = parseFormula(refText);\n \n // The parsed result should be a reference, range, or named expression\n if (ast.type !== \"reference\" && ast.type !== \"range\" && ast.type !== \"named-expression\") {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `INDIRECT requires a valid cell or range reference, got: ${refText}`,\n errAddress: context.dependencyNode,\n };\n }\n \n // Evaluate the parsed reference\n const result = this.evaluateNode(ast, context);\n return result;\n \n } catch (error) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: `INDIRECT could not parse reference: ${refText}`,\n errAddress: context.dependencyNode,\n };\n }\n },\n};\n"
6
6
  ],
7
- "mappings": ";AAAA;AAAA;AAAA;AAaA;AAoBO,IAAM,WAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MAClD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,gBAAgB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC9D,IACE,cAAc,SAAS,WACvB,cAAc,SAAS,uBACvB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,cAAc,SAAS,WAAW,cAAc,OAAO,SAAS,UAAU;AAAA,MAC5E,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,cAAc,OAAO,MAAM,KAAK;AAAA,IAGhD,IAAI,UAAU;AAAA,IACd,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,MAAM,WAAW,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,MACzD,IACE,SAAS,SAAS,WAClB,SAAS,SAAS,uBAClB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,SAAS,SAAS,WAAW,SAAS,OAAO,SAAS,WAAW;AAAA,QACnE,UAAU,SAAS,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,IAGA,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,IAAI;AAAA,MACF,MAAM,MAAM,aAAa,OAAO;AAAA,MAGhC,IAAI,IAAI,SAAS,eAAe,IAAI,SAAS,WAAW,IAAI,SAAS,oBAAoB;AAAA,QACvF,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,aAAa;AAAA,UAClB,SAAS,2DAA2D;AAAA,UACpE,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MAGA,MAAM,SAAS,KAAK,aAAa,KAAK,OAAO;AAAA,MAC7C,OAAO;AAAA,MAEP,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,uCAAuC;AAAA,QAChD,YAAY,QAAQ;AAAA,MACtB;AAAA;AAAA;AAGN;",
8
- "debugId": "AA9E7C83014CFC5C64756E2164756E21",
7
+ "mappings": ";AAAA;AAAA;AAAA;AAKA;AAoBO,IAAM,WAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MAClD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,gBAAgB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC9D,IACE,cAAc,SAAS,WACvB,cAAc,SAAS,uBACvB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,cAAc,SAAS,WAAW,cAAc,OAAO,SAAS,UAAU;AAAA,MAC5E,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,UAAU,cAAc,OAAO,MAAM,KAAK;AAAA,IAGhD,IAAI,UAAU;AAAA,IACd,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,MAAM,WAAW,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,MACzD,IACE,SAAS,SAAS,WAClB,SAAS,SAAS,uBAClB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,SAAS,SAAS,WAAW,SAAS,OAAO,SAAS,WAAW;AAAA,QACnE,UAAU,SAAS,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,IAGA,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,IAAI;AAAA,MACF,MAAM,MAAM,aAAa,OAAO;AAAA,MAGhC,IAAI,IAAI,SAAS,eAAe,IAAI,SAAS,WAAW,IAAI,SAAS,oBAAoB;AAAA,QACvF,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,aAAa;AAAA,UAClB,SAAS,2DAA2D;AAAA,UACpE,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MAGA,MAAM,SAAS,KAAK,aAAa,KAAK,OAAO;AAAA,MAC7C,OAAO;AAAA,MAEP,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS,uCAAuC;AAAA,QAChD,YAAY,QAAQ;AAAA,MACtB;AAAA;AAAA;AAGN;",
8
+ "debugId": "00423D52B9B6025C64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,8 +1,8 @@
1
1
  // src/functions/reference/offset/offset.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
5
- import { isCellAddress, isRangeAddress } from "src/core/utils";
4
+ } from "../../../core/types.mjs";
5
+ import { isCellAddress, isRangeAddress } from "../../../core/utils.mjs";
6
6
  var OFFSET = {
7
7
  name: "OFFSET",
8
8
  evaluate: function(node, context) {
@@ -202,4 +202,4 @@ export {
202
202
  OFFSET
203
203
  };
204
204
 
205
- //# debugId=406F37BBAB304EEB64756E2164756E21
205
+ //# debugId=BFCF32D44167F3BD64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/reference/offset/offset.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n type SpreadsheetRangeEnd,\n} from \"src/core/types\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\nimport type { ReferenceNode, RangeNode } from \"src/parser/ast\";\nimport { isCellAddress, isRangeAddress } from \"src/core/utils\";\n\n/**\n * OFFSET function - Returns a reference offset from a given reference\n * \n * Usage: OFFSET(reference, rows, cols, [height], [width])\n * \n * reference: The reference from which you want to base the offset\n * rows: The number of rows, up or down, that you want the upper-left cell to refer to\n * cols: The number of columns, left or right, that you want the upper-left cell to refer to\n * height: (optional) The height, in number of rows, that you want the returned reference to be\n * width: (optional) The width, in number of columns, that you want the returned reference to be\n * \n * Examples:\n * - OFFSET(A1, 2, 3) returns the value in cell D3 (2 rows down, 3 columns right from A1)\n * - OFFSET(A1, 0, 0, 3, 1) returns the range A1:A3\n * - OFFSET(A1, 1, 1, 2, 2) returns the range B2:C3\n * \n * Notes:\n * - If rows or cols offset reference from the edge of the worksheet, returns #REF! error\n * - Height and width must be positive\n * - If height or width is omitted, the same height or width as reference is used\n */\nexport const OFFSET: FunctionDefinition = {\n name: \"OFFSET\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 3 || node.args.length > 5) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires 3 to 5 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate reference\n const refResult = this.evaluateNode(node.args[0]!, context);\n if (\n refResult.type === \"error\" ||\n refResult.type === \"awaiting-evaluation\"\n ) {\n return refResult;\n }\n\n // Evaluate rows offset\n const rowsResult = this.evaluateNode(node.args[1]!, context);\n if (\n rowsResult.type === \"error\" ||\n rowsResult.type === \"awaiting-evaluation\"\n ) {\n return rowsResult;\n }\n\n if (rowsResult.type !== \"value\" || rowsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function rows must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate cols offset\n const colsResult = this.evaluateNode(node.args[2]!, context);\n if (\n colsResult.type === \"error\" ||\n colsResult.type === \"awaiting-evaluation\"\n ) {\n return colsResult;\n }\n\n if (colsResult.type !== \"value\" || colsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function cols must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const rowsOffset = Math.floor(rowsResult.result.value);\n const colsOffset = Math.floor(colsResult.result.value);\n\n // Optional height parameter\n let height: number | undefined;\n if (node.args.length >= 4) {\n const heightResult = this.evaluateNode(node.args[3]!, context);\n if (\n heightResult.type === \"error\" ||\n heightResult.type === \"awaiting-evaluation\"\n ) {\n return heightResult;\n }\n\n if (heightResult.type === \"value\" && heightResult.result.type === \"number\") {\n height = Math.floor(heightResult.result.value);\n if (height < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function height must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Optional width parameter\n let width: number | undefined;\n if (node.args.length === 5) {\n const widthResult = this.evaluateNode(node.args[4]!, context);\n if (\n widthResult.type === \"error\" ||\n widthResult.type === \"awaiting-evaluation\"\n ) {\n return widthResult;\n }\n\n if (widthResult.type === \"value\" && widthResult.result.type === \"number\") {\n width = Math.floor(widthResult.result.value);\n if (width < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function width must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Get the base cell/range from the evaluated reference\n let baseRange: SpreadsheetRange;\n let baseSheetName: string = context.cellAddress.sheetName;\n let baseWorkbookName: string = context.cellAddress.workbookName;\n\n // Check if we have a cell or range reference\n const cellOrRange =\n refResult.type === \"spilled-values\"\n ? (refResult.sourceCell ?? refResult.sourceRange)\n : refResult.sourceCell;\n\n if (!cellOrRange) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires a cell or range reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Extract the base range from sourceCell or sourceRange\n if (isCellAddress(cellOrRange)) {\n // It's a CellAddress\n baseSheetName = cellOrRange.sheetName;\n baseWorkbookName = cellOrRange.workbookName;\n baseRange = {\n start: {\n col: cellOrRange.colIndex,\n row: cellOrRange.rowIndex,\n },\n end: {\n col: { type: \"number\", value: cellOrRange.colIndex },\n row: { type: \"number\", value: cellOrRange.rowIndex },\n },\n };\n } else if (isRangeAddress(cellOrRange)) {\n // It's a RangeAddress\n baseSheetName = cellOrRange.sheetName;\n baseWorkbookName = cellOrRange.workbookName;\n baseRange = cellOrRange.range;\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires a cell or range reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate the offset range\n const offsetStartCol = baseRange.start.col + colsOffset;\n const offsetStartRow = baseRange.start.row + rowsOffset;\n\n // Validate bounds (assuming reasonable spreadsheet size)\n if (offsetStartCol < 0 || offsetStartRow < 0) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"OFFSET function resulted in invalid cell reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate end position based on height/width or original range size\n let offsetEndCol: number;\n let offsetEndRow: number;\n\n if (width !== undefined) {\n offsetEndCol = offsetStartCol + width - 1;\n } else if (baseRange.end.col.type === \"number\") {\n offsetEndCol = offsetStartCol + (baseRange.end.col.value - baseRange.start.col);\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires finite reference when width is omitted\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (height !== undefined) {\n offsetEndRow = offsetStartRow + height - 1;\n } else if (baseRange.end.row.type === \"number\") {\n offsetEndRow = offsetStartRow + (baseRange.end.row.value - baseRange.start.row);\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires finite reference when height is omitted\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Validate the end bounds\n if (offsetEndCol < 0 || offsetEndRow < 0) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"OFFSET function resulted in invalid cell reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Create the offset range\n const offsetRange: SpreadsheetRange = {\n start: {\n col: offsetStartCol,\n row: offsetStartRow,\n },\n end: {\n col: { type: \"number\", value: offsetEndCol },\n row: { type: \"number\", value: offsetEndRow },\n },\n };\n\n // If it's a single cell, return its value\n if (offsetStartCol === offsetEndCol && offsetStartRow === offsetEndRow) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: offsetStartCol,\n rowIndex: offsetStartRow,\n },\n sheetName: baseSheetName,\n workbookName: baseWorkbookName,\n isAbsolute: {\n col: true,\n row: true,\n },\n },\n context\n );\n }\n\n // Otherwise, return a range reference (spilled values)\n return this.evaluateRange(\n {\n type: \"range\",\n range: offsetRange,\n sheetName: baseSheetName,\n workbookName: baseWorkbookName,\n isAbsolute: {\n start: { col: true, row: true },\n end: { col: true, row: true },\n },\n },\n context\n );\n },\n};\n"
5
+ "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n type SpreadsheetRangeEnd,\n} from \"../../../core/types.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\nimport type { ReferenceNode, RangeNode } from \"../../../parser/ast.mjs\";\nimport { isCellAddress, isRangeAddress } from \"../../../core/utils.mjs\";\n\n/**\n * OFFSET function - Returns a reference offset from a given reference\n * \n * Usage: OFFSET(reference, rows, cols, [height], [width])\n * \n * reference: The reference from which you want to base the offset\n * rows: The number of rows, up or down, that you want the upper-left cell to refer to\n * cols: The number of columns, left or right, that you want the upper-left cell to refer to\n * height: (optional) The height, in number of rows, that you want the returned reference to be\n * width: (optional) The width, in number of columns, that you want the returned reference to be\n * \n * Examples:\n * - OFFSET(A1, 2, 3) returns the value in cell D3 (2 rows down, 3 columns right from A1)\n * - OFFSET(A1, 0, 0, 3, 1) returns the range A1:A3\n * - OFFSET(A1, 1, 1, 2, 2) returns the range B2:C3\n * \n * Notes:\n * - If rows or cols offset reference from the edge of the worksheet, returns #REF! error\n * - Height and width must be positive\n * - If height or width is omitted, the same height or width as reference is used\n */\nexport const OFFSET: FunctionDefinition = {\n name: \"OFFSET\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 3 || node.args.length > 5) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires 3 to 5 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate reference\n const refResult = this.evaluateNode(node.args[0]!, context);\n if (\n refResult.type === \"error\" ||\n refResult.type === \"awaiting-evaluation\"\n ) {\n return refResult;\n }\n\n // Evaluate rows offset\n const rowsResult = this.evaluateNode(node.args[1]!, context);\n if (\n rowsResult.type === \"error\" ||\n rowsResult.type === \"awaiting-evaluation\"\n ) {\n return rowsResult;\n }\n\n if (rowsResult.type !== \"value\" || rowsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function rows must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate cols offset\n const colsResult = this.evaluateNode(node.args[2]!, context);\n if (\n colsResult.type === \"error\" ||\n colsResult.type === \"awaiting-evaluation\"\n ) {\n return colsResult;\n }\n\n if (colsResult.type !== \"value\" || colsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function cols must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n const rowsOffset = Math.floor(rowsResult.result.value);\n const colsOffset = Math.floor(colsResult.result.value);\n\n // Optional height parameter\n let height: number | undefined;\n if (node.args.length >= 4) {\n const heightResult = this.evaluateNode(node.args[3]!, context);\n if (\n heightResult.type === \"error\" ||\n heightResult.type === \"awaiting-evaluation\"\n ) {\n return heightResult;\n }\n\n if (heightResult.type === \"value\" && heightResult.result.type === \"number\") {\n height = Math.floor(heightResult.result.value);\n if (height < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function height must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Optional width parameter\n let width: number | undefined;\n if (node.args.length === 5) {\n const widthResult = this.evaluateNode(node.args[4]!, context);\n if (\n widthResult.type === \"error\" ||\n widthResult.type === \"awaiting-evaluation\"\n ) {\n return widthResult;\n }\n\n if (widthResult.type === \"value\" && widthResult.result.type === \"number\") {\n width = Math.floor(widthResult.result.value);\n if (width < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function width must be positive\",\n errAddress: context.dependencyNode,\n };\n }\n }\n }\n\n // Get the base cell/range from the evaluated reference\n let baseRange: SpreadsheetRange;\n let baseSheetName: string = context.cellAddress.sheetName;\n let baseWorkbookName: string = context.cellAddress.workbookName;\n\n // Check if we have a cell or range reference\n const cellOrRange =\n refResult.type === \"spilled-values\"\n ? (refResult.sourceCell ?? refResult.sourceRange)\n : refResult.sourceCell;\n\n if (!cellOrRange) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires a cell or range reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Extract the base range from sourceCell or sourceRange\n if (isCellAddress(cellOrRange)) {\n // It's a CellAddress\n baseSheetName = cellOrRange.sheetName;\n baseWorkbookName = cellOrRange.workbookName;\n baseRange = {\n start: {\n col: cellOrRange.colIndex,\n row: cellOrRange.rowIndex,\n },\n end: {\n col: { type: \"number\", value: cellOrRange.colIndex },\n row: { type: \"number\", value: cellOrRange.rowIndex },\n },\n };\n } else if (isRangeAddress(cellOrRange)) {\n // It's a RangeAddress\n baseSheetName = cellOrRange.sheetName;\n baseWorkbookName = cellOrRange.workbookName;\n baseRange = cellOrRange.range;\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires a cell or range reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate the offset range\n const offsetStartCol = baseRange.start.col + colsOffset;\n const offsetStartRow = baseRange.start.row + rowsOffset;\n\n // Validate bounds (assuming reasonable spreadsheet size)\n if (offsetStartCol < 0 || offsetStartRow < 0) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"OFFSET function resulted in invalid cell reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Calculate end position based on height/width or original range size\n let offsetEndCol: number;\n let offsetEndRow: number;\n\n if (width !== undefined) {\n offsetEndCol = offsetStartCol + width - 1;\n } else if (baseRange.end.col.type === \"number\") {\n offsetEndCol = offsetStartCol + (baseRange.end.col.value - baseRange.start.col);\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires finite reference when width is omitted\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (height !== undefined) {\n offsetEndRow = offsetStartRow + height - 1;\n } else if (baseRange.end.row.type === \"number\") {\n offsetEndRow = offsetStartRow + (baseRange.end.row.value - baseRange.start.row);\n } else {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"OFFSET function requires finite reference when height is omitted\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Validate the end bounds\n if (offsetEndCol < 0 || offsetEndRow < 0) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"OFFSET function resulted in invalid cell reference\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Create the offset range\n const offsetRange: SpreadsheetRange = {\n start: {\n col: offsetStartCol,\n row: offsetStartRow,\n },\n end: {\n col: { type: \"number\", value: offsetEndCol },\n row: { type: \"number\", value: offsetEndRow },\n },\n };\n\n // If it's a single cell, return its value\n if (offsetStartCol === offsetEndCol && offsetStartRow === offsetEndRow) {\n return this.evaluateReference(\n {\n type: \"reference\",\n address: {\n colIndex: offsetStartCol,\n rowIndex: offsetStartRow,\n },\n sheetName: baseSheetName,\n workbookName: baseWorkbookName,\n isAbsolute: {\n col: true,\n row: true,\n },\n },\n context\n );\n }\n\n // Otherwise, return a range reference (spilled values)\n return this.evaluateRange(\n {\n type: \"range\",\n range: offsetRange,\n sheetName: baseSheetName,\n workbookName: baseWorkbookName,\n isAbsolute: {\n start: { col: true, row: true },\n end: { col: true, row: true },\n },\n },\n context\n );\n },\n};\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "406F37BBAB304EEB64756E2164756E21",
8
+ "debugId": "BFCF32D44167F3BD64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // src/functions/text/concatenate/concatenate.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
4
+ } from "../../../core/types.mjs";
5
5
  function coerceToString(result, context) {
6
6
  if (result.type !== "value") {
7
7
  return {
@@ -136,4 +136,4 @@ export {
136
136
  CONCATENATE
137
137
  };
138
138
 
139
- //# debugId=96483CED2199205664756E2164756E21
139
+ //# debugId=51EDA2D25EB87B1F64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/text/concatenate/concatenate.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellString,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type ErrorEvaluationResult,\n type SingleEvaluationResult,\n} from \"src/core/types\";\nimport { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { FunctionNode } from \"src/parser/ast\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * CONCATENATE function - Joins several text strings into one text string\n *\n * Usage: CONCATENATE(text1, text2, ...)\n *\n * text1, text2, ...: Text strings to be joined together.\n *\n * Example: CONCATENATE(\"Hello\", \" \", \"World\") returns \"Hello World\"\n *\n * Note:\n * - Takes 1 or more arguments\n * - Supports type coercion: strings, numbers, and booleans are converted to strings\n * - Numbers: converted to string representation (123 -> \"123\", Infinity -> \"INFINITY\")\n * - Booleans: TRUE -> \"TRUE\", FALSE -> \"FALSE\"\n * - Supports dynamic arrays (spilled values) for arguments\n * - If any argument is a spilled value, the result will be spilled\n */\n\n/**\n * Helper function to convert a cell value to string with type coercion\n */\nfunction coerceToString(\n result: FunctionEvaluationResult,\n context: EvaluationContext\n): string | ErrorEvaluationResult {\n if (result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument type\",\n errAddress: context.dependencyNode,\n };\n }\n\n switch (result.result.type) {\n case \"string\":\n return result.result.value;\n case \"number\":\n // Convert number to string\n if (result.result.value === Infinity) {\n return \"INFINITY\";\n } else if (result.result.value === -Infinity) {\n return \"-INFINITY\";\n } else if (isNaN(result.result.value)) {\n return \"NaN\";\n } else {\n return result.result.value.toString();\n }\n case \"boolean\":\n // Convert boolean to string\n return result.result.value ? \"TRUE\" : \"FALSE\";\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Cannot convert argument to string\",\n errAddress: context.dependencyNode,\n };\n }\n}\n\n/**\n * Helper function to perform CONCATENATE operation on evaluated arguments\n */\nfunction concatenateOperation(\n textResults: FunctionEvaluationResult[],\n context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n let result = \"\";\n for (const textResult of textResults) {\n const stringValue = coerceToString(textResult, context);\n if (typeof stringValue === \"object\" && stringValue.type === \"error\") {\n return stringValue;\n }\n result += stringValue;\n }\n return { type: \"value\", result: { type: \"string\", value: result } };\n}\n\n/**\n * Helper for creating spilled-values result for CONCATENATE function\n */\nfunction createConcatenateSpilledResult(\n this: FormulaEvaluator,\n {\n textResults,\n context,\n }: {\n textResults: FunctionEvaluationResult[];\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const spilledResults = textResults.filter(\n (result) => result.type === \"spilled-values\"\n );\n\n if (spilledResults.length === 0) {\n throw new Error(\n \"createConcatenateSpilledResult called without spilled values\"\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of all spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n for (const result of textResults) {\n if (result.type === \"spilled-values\") {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"CONCATENATE with spilled values\",\n evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n // Evaluate all arguments at this spilled position\n const spilledTextResults: FunctionEvaluationResult[] = [];\n\n for (const textResult of textResults) {\n if (textResult.type === \"spilled-values\") {\n const spillResult = textResult.evaluate(spilledCell, evalContext);\n if (spillResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillResult.type === \"error\") {\n return spillResult;\n }\n spilledTextResults.push(spillResult);\n } else {\n spilledTextResults.push(textResult);\n }\n }\n\n return concatenateOperation(spilledTextResults, context);\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\n \"WIP: evaluateAllCells for CONCATENATE is not implemented\"\n );\n },\n };\n}\n\n/**\n * CONCATENATE function implementation\n */\nexport const CONCATENATE: FunctionDefinition = {\n name: \"CONCATENATE\",\n evaluate: function (\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (node.args.length < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"CONCATENATE function requires at least 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate all arguments\n const textResults: FunctionEvaluationResult[] = [];\n for (const arg of node.args) {\n const result = this.evaluateNode(arg, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n textResults.push(result);\n }\n\n // Check if any arguments are spilled values\n const hasSpilledValues = textResults.some(\n (result) => result.type === \"spilled-values\"\n );\n\n if (hasSpilledValues) {\n return createConcatenateSpilledResult.call(this, {\n textResults,\n context,\n });\n }\n\n // All arguments are single values - type coercion will be handled in concatenateOperation\n\n // Perform concatenation\n return concatenateOperation(textResults, context);\n },\n aliases: [\"CONCAT\"],\n};\n"
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellString,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type ErrorEvaluationResult,\n type SingleEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { FunctionNode } from \"../../../parser/ast.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * CONCATENATE function - Joins several text strings into one text string\n *\n * Usage: CONCATENATE(text1, text2, ...)\n *\n * text1, text2, ...: Text strings to be joined together.\n *\n * Example: CONCATENATE(\"Hello\", \" \", \"World\") returns \"Hello World\"\n *\n * Note:\n * - Takes 1 or more arguments\n * - Supports type coercion: strings, numbers, and booleans are converted to strings\n * - Numbers: converted to string representation (123 -> \"123\", Infinity -> \"INFINITY\")\n * - Booleans: TRUE -> \"TRUE\", FALSE -> \"FALSE\"\n * - Supports dynamic arrays (spilled values) for arguments\n * - If any argument is a spilled value, the result will be spilled\n */\n\n/**\n * Helper function to convert a cell value to string with type coercion\n */\nfunction coerceToString(\n result: FunctionEvaluationResult,\n context: EvaluationContext\n): string | ErrorEvaluationResult {\n if (result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument type\",\n errAddress: context.dependencyNode,\n };\n }\n\n switch (result.result.type) {\n case \"string\":\n return result.result.value;\n case \"number\":\n // Convert number to string\n if (result.result.value === Infinity) {\n return \"INFINITY\";\n } else if (result.result.value === -Infinity) {\n return \"-INFINITY\";\n } else if (isNaN(result.result.value)) {\n return \"NaN\";\n } else {\n return result.result.value.toString();\n }\n case \"boolean\":\n // Convert boolean to string\n return result.result.value ? \"TRUE\" : \"FALSE\";\n default:\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Cannot convert argument to string\",\n errAddress: context.dependencyNode,\n };\n }\n}\n\n/**\n * Helper function to perform CONCATENATE operation on evaluated arguments\n */\nfunction concatenateOperation(\n textResults: FunctionEvaluationResult[],\n context: EvaluationContext\n): { type: \"value\"; result: CellString } | ErrorEvaluationResult {\n let result = \"\";\n for (const textResult of textResults) {\n const stringValue = coerceToString(textResult, context);\n if (typeof stringValue === \"object\" && stringValue.type === \"error\") {\n return stringValue;\n }\n result += stringValue;\n }\n return { type: \"value\", result: { type: \"string\", value: result } };\n}\n\n/**\n * Helper for creating spilled-values result for CONCATENATE function\n */\nfunction createConcatenateSpilledResult(\n this: FormulaEvaluator,\n {\n textResults,\n context,\n }: {\n textResults: FunctionEvaluationResult[];\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const spilledResults = textResults.filter(\n (result) => result.type === \"spilled-values\"\n );\n\n if (spilledResults.length === 0) {\n throw new Error(\n \"createConcatenateSpilledResult called without spilled values\"\n );\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of all spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n for (const result of textResults) {\n if (result.type === \"spilled-values\") {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"CONCATENATE with spilled values\",\n evaluate: (spilledCell, evalContext): SingleEvaluationResult => {\n // Evaluate all arguments at this spilled position\n const spilledTextResults: FunctionEvaluationResult[] = [];\n\n for (const textResult of textResults) {\n if (textResult.type === \"spilled-values\") {\n const spillResult = textResult.evaluate(spilledCell, evalContext);\n if (spillResult === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled results have not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillResult.type === \"error\") {\n return spillResult;\n }\n spilledTextResults.push(spillResult);\n } else {\n spilledTextResults.push(textResult);\n }\n }\n\n return concatenateOperation(spilledTextResults, context);\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\n \"WIP: evaluateAllCells for CONCATENATE is not implemented\"\n );\n },\n };\n}\n\n/**\n * CONCATENATE function implementation\n */\nexport const CONCATENATE: FunctionDefinition = {\n name: \"CONCATENATE\",\n evaluate: function (\n node: FunctionNode,\n context: EvaluationContext\n ): FunctionEvaluationResult {\n if (node.args.length < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"CONCATENATE function requires at least 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate all arguments\n const textResults: FunctionEvaluationResult[] = [];\n for (const arg of node.args) {\n const result = this.evaluateNode(arg, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n textResults.push(result);\n }\n\n // Check if any arguments are spilled values\n const hasSpilledValues = textResults.some(\n (result) => result.type === \"spilled-values\"\n );\n\n if (hasSpilledValues) {\n return createConcatenateSpilledResult.call(this, {\n textResults,\n context,\n });\n }\n\n // All arguments are single values - type coercion will be handled in concatenateOperation\n\n // Perform concatenation\n return concatenateOperation(textResults, context);\n },\n aliases: [\"CONCAT\"],\n};\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "96483CED2199205664756E2164756E21",
8
+ "debugId": "51EDA2D25EB87B1F64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // src/functions/text/exact/exact.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
4
+ } from "../../../core/types.mjs";
5
5
  function cellValueToString(value) {
6
6
  switch (value.type) {
7
7
  case "string":
@@ -140,4 +140,4 @@ export {
140
140
  EXACT
141
141
  };
142
142
 
143
- //# debugId=ED7D5D40A96E0E7064756E2164756E21
143
+ //# debugId=D9302603025B202B64756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/functions/text/exact/exact.ts"],
4
4
  "sourcesContent": [
5
- "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n type ErrorEvaluationResult,\n} from \"src/core/types\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * EXACT function - Compares two text strings and returns TRUE if they are exactly the same, FALSE otherwise\n * \n * Usage: EXACT(text1, text2)\n * \n * text1: Required. The first text string\n * text2: Required. The second text string\n * \n * Examples:\n * EXACT(\"Apple\", \"Apple\") - returns TRUE\n * EXACT(\"Apple\", \"apple\") - returns FALSE (case-sensitive)\n * EXACT(\"123\", \"123\") - returns TRUE\n * EXACT(\"\", \"\") - returns TRUE (empty strings are equal)\n * \n * Note:\n * - The comparison is case-sensitive\n * - Non-text values are converted to text before comparison\n * - Supports spilled values (dynamic arrays) for both arguments\n */\n\n/**\n * Convert a cell value to string for text comparison\n */\nfunction cellValueToString(value: CellValue): string {\n switch (value.type) {\n case \"string\":\n return value.value;\n case \"number\":\n return value.value.toString();\n case \"boolean\":\n return value.value ? \"TRUE\" : \"FALSE\";\n case \"infinity\":\n return value.sign === \"positive\" ? \"INFINITY\" : \"-INFINITY\";\n default:\n return \"\";\n }\n}\n\n/**\n * Helper for creating spilled-values result for EXACT function\n */\nfunction createExactSpilledResult(\n this: FormulaEvaluator,\n {\n text1Result,\n text2Result,\n context,\n }: {\n text1Result: FunctionEvaluationResult;\n text2Result: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const hasSpilledText1 = text1Result.type === \"spilled-values\";\n const hasSpilledText2 = text2Result.type === \"spilled-values\";\n\n if (!hasSpilledText1 && !hasSpilledText2) {\n throw new Error(\"createExactSpilledResult called without spilled values\");\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n const spilledResults = [\n hasSpilledText1 ? text1Result : null,\n hasSpilledText2 ? text2Result : null,\n ].filter(Boolean) as SpilledValuesEvaluationResult[];\n\n for (const result of spilledResults) {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"EXACT with spilled values\",\n evaluate: (spilledCell: any, evalContext: any): SingleEvaluationResult => {\n // Evaluate both arguments at this spilled position\n const spillText1Result = hasSpilledText1\n ? text1Result.evaluate(spilledCell, evalContext)\n : text1Result;\n const spillText2Result = hasSpilledText2\n ? text2Result.evaluate(spilledCell, evalContext)\n : text2Result;\n\n // Check for errors\n if (spillText1Result === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled text1 argument has not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillText1Result.type === \"error\" || spillText1Result.type === \"awaiting-evaluation\") {\n return spillText1Result;\n }\n\n if (spillText2Result === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled text2 argument has not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillText2Result.type === \"error\" || spillText2Result.type === \"awaiting-evaluation\") {\n return spillText2Result;\n }\n\n // Perform EXACT comparison\n if (spillText1Result.type !== \"value\" || spillText2Result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument types for EXACT function #1\",\n errAddress: context.dependencyNode,\n };\n }\n\n const text1 = cellValueToString(spillText1Result.result);\n const text2 = cellValueToString(spillText2Result.result);\n\n return {\n type: \"value\",\n result: { type: \"boolean\", value: text1 === text2 },\n };\n },\n evaluateAllCells: (intersectingRange: any) => {\n throw new Error(\"WIP: evaluateAllCells for EXACT is not implemented\");\n },\n };\n}\n\n/**\n * EXACT function implementation\n */\nexport const EXACT: FunctionDefinition = {\n name: \"EXACT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"EXACT function takes exactly 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate both text arguments\n const text1Result = this.evaluateNode(node.args[0]!, context);\n if (text1Result.type === \"error\" || text1Result.type === \"awaiting-evaluation\") {\n return text1Result;\n }\n\n const text2Result = this.evaluateNode(node.args[1]!, context);\n if (text2Result.type === \"error\" || text2Result.type === \"awaiting-evaluation\") {\n return text2Result;\n }\n\n // Handle spilled values\n const hasSpilledValues = \n text1Result.type === \"spilled-values\" ||\n text2Result.type === \"spilled-values\";\n\n if (hasSpilledValues) {\n return createExactSpilledResult.call(this, {\n text1Result,\n text2Result,\n context,\n });\n }\n\n // Both arguments are single values\n if (text1Result.type !== \"value\" || text2Result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument types for EXACT function #2\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Convert both values to strings and compare\n const text1 = cellValueToString(text1Result.result);\n const text2 = cellValueToString(text2Result.result);\n\n return {\n type: \"value\",\n result: { type: \"boolean\", value: text1 === text2 },\n };\n },\n};\n"
5
+ "import {\n FormulaError,\n type CellValue,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type SpreadsheetRange,\n type SpilledValuesEvaluationResult,\n type SingleEvaluationResult,\n type ErrorEvaluationResult,\n} from \"../../../core/types.mjs\";\nimport type { FormulaEvaluator } from \"../../../evaluator/formula-evaluator.mjs\";\nimport type { EvaluationContext } from \"../../../evaluator/evaluation-context.mjs\";\n\n/**\n * EXACT function - Compares two text strings and returns TRUE if they are exactly the same, FALSE otherwise\n * \n * Usage: EXACT(text1, text2)\n * \n * text1: Required. The first text string\n * text2: Required. The second text string\n * \n * Examples:\n * EXACT(\"Apple\", \"Apple\") - returns TRUE\n * EXACT(\"Apple\", \"apple\") - returns FALSE (case-sensitive)\n * EXACT(\"123\", \"123\") - returns TRUE\n * EXACT(\"\", \"\") - returns TRUE (empty strings are equal)\n * \n * Note:\n * - The comparison is case-sensitive\n * - Non-text values are converted to text before comparison\n * - Supports spilled values (dynamic arrays) for both arguments\n */\n\n/**\n * Convert a cell value to string for text comparison\n */\nfunction cellValueToString(value: CellValue): string {\n switch (value.type) {\n case \"string\":\n return value.value;\n case \"number\":\n return value.value.toString();\n case \"boolean\":\n return value.value ? \"TRUE\" : \"FALSE\";\n case \"infinity\":\n return value.sign === \"positive\" ? \"INFINITY\" : \"-INFINITY\";\n default:\n return \"\";\n }\n}\n\n/**\n * Helper for creating spilled-values result for EXACT function\n */\nfunction createExactSpilledResult(\n this: FormulaEvaluator,\n {\n text1Result,\n text2Result,\n context,\n }: {\n text1Result: FunctionEvaluationResult;\n text2Result: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): SpilledValuesEvaluationResult | ErrorEvaluationResult {\n const hasSpilledText1 = text1Result.type === \"spilled-values\";\n const hasSpilledText2 = text2Result.type === \"spilled-values\";\n\n if (!hasSpilledText1 && !hasSpilledText2) {\n throw new Error(\"createExactSpilledResult called without spilled values\");\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress): SpreadsheetRange => {\n // Calculate spill area (union of spilled ranges)\n let spillArea: SpreadsheetRange | undefined;\n\n const spilledResults = [\n hasSpilledText1 ? text1Result : null,\n hasSpilledText2 ? text2Result : null,\n ].filter(Boolean) as SpilledValuesEvaluationResult[];\n\n for (const result of spilledResults) {\n const currentSpillArea = result.spillArea(origin);\n if (!spillArea) {\n spillArea = currentSpillArea;\n } else {\n spillArea = this.unionRanges(\n this.projectRange(spillArea, origin),\n this.projectRange(currentSpillArea, origin)\n );\n }\n }\n\n if (!spillArea) {\n throw new Error(\"No spilled values found\");\n }\n return spillArea;\n },\n source: \"EXACT with spilled values\",\n evaluate: (spilledCell: any, evalContext: any): SingleEvaluationResult => {\n // Evaluate both arguments at this spilled position\n const spillText1Result = hasSpilledText1\n ? text1Result.evaluate(spilledCell, evalContext)\n : text1Result;\n const spillText2Result = hasSpilledText2\n ? text2Result.evaluate(spilledCell, evalContext)\n : text2Result;\n\n // Check for errors\n if (spillText1Result === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled text1 argument has not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillText1Result.type === \"error\" || spillText1Result.type === \"awaiting-evaluation\") {\n return spillText1Result;\n }\n\n if (spillText2Result === undefined) {\n return {\n type: \"error\",\n err: FormulaError.REF,\n message: \"The spilled text2 argument has not been evaluated\",\n errAddress: context.dependencyNode,\n };\n }\n if (spillText2Result.type === \"error\" || spillText2Result.type === \"awaiting-evaluation\") {\n return spillText2Result;\n }\n\n // Perform EXACT comparison\n if (spillText1Result.type !== \"value\" || spillText2Result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument types for EXACT function #1\",\n errAddress: context.dependencyNode,\n };\n }\n\n const text1 = cellValueToString(spillText1Result.result);\n const text2 = cellValueToString(spillText2Result.result);\n\n return {\n type: \"value\",\n result: { type: \"boolean\", value: text1 === text2 },\n };\n },\n evaluateAllCells: (intersectingRange: any) => {\n throw new Error(\"WIP: evaluateAllCells for EXACT is not implemented\");\n },\n };\n}\n\n/**\n * EXACT function implementation\n */\nexport const EXACT: FunctionDefinition = {\n name: \"EXACT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"EXACT function takes exactly 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate both text arguments\n const text1Result = this.evaluateNode(node.args[0]!, context);\n if (text1Result.type === \"error\" || text1Result.type === \"awaiting-evaluation\") {\n return text1Result;\n }\n\n const text2Result = this.evaluateNode(node.args[1]!, context);\n if (text2Result.type === \"error\" || text2Result.type === \"awaiting-evaluation\") {\n return text2Result;\n }\n\n // Handle spilled values\n const hasSpilledValues = \n text1Result.type === \"spilled-values\" ||\n text2Result.type === \"spilled-values\";\n\n if (hasSpilledValues) {\n return createExactSpilledResult.call(this, {\n text1Result,\n text2Result,\n context,\n });\n }\n\n // Both arguments are single values\n if (text1Result.type !== \"value\" || text2Result.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid argument types for EXACT function #2\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Convert both values to strings and compare\n const text1 = cellValueToString(text1Result.result);\n const text2 = cellValueToString(text2Result.result);\n\n return {\n type: \"value\",\n result: { type: \"boolean\", value: text1 === text2 },\n };\n },\n};\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "ED7D5D40A96E0E7064756E2164756E21",
8
+ "debugId": "D9302603025B202B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // src/functions/text/find/find.ts
2
2
  import {
3
3
  FormulaError
4
- } from "src/core/types";
4
+ } from "../../../core/types.mjs";
5
5
  import { convertToString, extractNumericValue } from "../text-helpers.mjs";
6
6
  function findOperation(findTextResult, withinTextResult, startNumResult, context) {
7
7
  const findStr = convertToString(findTextResult, context);
@@ -366,4 +366,4 @@ export {
366
366
  FIND
367
367
  };
368
368
 
369
- //# debugId=3F582CD466EECC4A64756E2164756E21
369
+ //# debugId=ADF4E8CDCE962DEE64756E2164756E21