@ricsam/formula-engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. package/README.md +100 -0
  2. package/dist/cjs/core/ast-traverser.cjs +124 -0
  3. package/dist/cjs/core/ast-traverser.cjs.map +10 -0
  4. package/dist/cjs/core/autofill-utils.cjs +304 -0
  5. package/dist/cjs/core/autofill-utils.cjs.map +10 -0
  6. package/dist/cjs/core/engine.cjs +390 -0
  7. package/dist/cjs/core/engine.cjs.map +10 -0
  8. package/dist/cjs/core/managers/cache-manager.cjs +58 -0
  9. package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
  10. package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
  11. package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
  12. package/dist/cjs/core/managers/dependency-node.cjs +24 -0
  13. package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
  14. package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
  15. package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
  16. package/dist/cjs/core/managers/event-manager.cjs +49 -0
  17. package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
  18. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
  19. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
  20. package/dist/cjs/core/managers/index.cjs +49 -0
  21. package/dist/cjs/core/managers/index.cjs.map +10 -0
  22. package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
  23. package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
  24. package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
  25. package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
  26. package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
  27. package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
  28. package/dist/cjs/core/managers/table-manager.cjs +254 -0
  29. package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
  30. package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
  31. package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
  32. package/dist/cjs/core/map-serializer.cjs +69 -0
  33. package/dist/cjs/core/map-serializer.cjs.map +10 -0
  34. package/dist/cjs/core/named-expression-renamer.cjs +88 -0
  35. package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
  36. package/dist/cjs/core/sheet-renamer.cjs +89 -0
  37. package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
  38. package/dist/cjs/core/sheet-utils.cjs +39 -0
  39. package/dist/cjs/core/sheet-utils.cjs.map +10 -0
  40. package/dist/cjs/core/table-renamer.cjs +88 -0
  41. package/dist/cjs/core/table-renamer.cjs.map +10 -0
  42. package/dist/cjs/core/types.cjs +48 -0
  43. package/dist/cjs/core/types.cjs.map +10 -0
  44. package/dist/cjs/core/utils/range-serializer.cjs +65 -0
  45. package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
  46. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
  47. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
  48. package/dist/cjs/core/utils.cjs +434 -0
  49. package/dist/cjs/core/utils.cjs.map +10 -0
  50. package/dist/cjs/core/workbook-renamer.cjs +106 -0
  51. package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
  52. package/dist/cjs/debug/flags.cjs +47 -0
  53. package/dist/cjs/debug/flags.cjs.map +10 -0
  54. package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
  55. package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
  56. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
  57. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
  58. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
  59. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
  60. package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
  61. package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
  62. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
  63. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
  64. package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
  65. package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
  66. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
  67. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
  68. package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
  69. package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
  70. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
  71. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
  72. package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
  73. package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
  74. package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
  75. package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
  76. package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
  77. package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
  78. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
  79. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
  80. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
  81. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
  82. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
  83. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
  84. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
  85. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
  86. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
  87. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
  88. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
  89. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
  90. package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
  91. package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
  92. package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
  93. package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
  94. package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
  95. package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
  96. package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
  97. package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
  98. package/dist/cjs/functions/_template/template.cjs +42 -0
  99. package/dist/cjs/functions/_template/template.cjs.map +10 -0
  100. package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
  101. package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
  102. package/dist/cjs/functions/criteria-parser.cjs +217 -0
  103. package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
  104. package/dist/cjs/functions/criteria-utils.cjs +291 -0
  105. package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
  106. package/dist/cjs/functions/function-utils.cjs +63 -0
  107. package/dist/cjs/functions/function-utils.cjs.map +10 -0
  108. package/dist/cjs/functions/index.cjs +125 -0
  109. package/dist/cjs/functions/index.cjs.map +10 -0
  110. package/dist/cjs/functions/information/cell/cell.cjs +196 -0
  111. package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
  112. package/dist/cjs/functions/information/column/column.cjs +144 -0
  113. package/dist/cjs/functions/information/column/column.cjs.map +10 -0
  114. package/dist/cjs/functions/information/row/row.cjs +150 -0
  115. package/dist/cjs/functions/information/row/row.cjs.map +10 -0
  116. package/dist/cjs/functions/logical/and/and.cjs +112 -0
  117. package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
  118. package/dist/cjs/functions/logical/if/if.cjs +195 -0
  119. package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
  120. package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
  121. package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
  122. package/dist/cjs/functions/logical/or/or.cjs +112 -0
  123. package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
  124. package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
  125. package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
  126. package/dist/cjs/functions/lookup/count/count.cjs +48 -0
  127. package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
  128. package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
  129. package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
  130. package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
  131. package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
  132. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
  133. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
  134. package/dist/cjs/functions/lookup/match/match.cjs +168 -0
  135. package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
  136. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
  137. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
  138. package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
  139. package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
  140. package/dist/cjs/functions/math/average/average.cjs +48 -0
  141. package/dist/cjs/functions/math/average/average.cjs.map +10 -0
  142. package/dist/cjs/functions/math/average/averageif.cjs +83 -0
  143. package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
  144. package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
  145. package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
  146. package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
  147. package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
  148. package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
  149. package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
  150. package/dist/cjs/functions/math/max/max.cjs +48 -0
  151. package/dist/cjs/functions/math/max/max.cjs.map +10 -0
  152. package/dist/cjs/functions/math/max/maxif.cjs +83 -0
  153. package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
  154. package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
  155. package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
  156. package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
  157. package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
  158. package/dist/cjs/functions/math/min/min.cjs +48 -0
  159. package/dist/cjs/functions/math/min/min.cjs.map +10 -0
  160. package/dist/cjs/functions/math/min/minif.cjs +83 -0
  161. package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
  162. package/dist/cjs/functions/math/min/minifs.cjs +61 -0
  163. package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
  164. package/dist/cjs/functions/math/sum/sum.cjs +48 -0
  165. package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
  166. package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
  167. package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
  168. package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
  169. package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
  170. package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
  171. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
  172. package/dist/cjs/functions/reference/address/address.cjs +163 -0
  173. package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
  174. package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
  175. package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
  176. package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
  177. package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
  178. package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
  179. package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
  180. package/dist/cjs/functions/text/exact/exact.cjs +171 -0
  181. package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
  182. package/dist/cjs/functions/text/find/find.cjs +397 -0
  183. package/dist/cjs/functions/text/find/find.cjs.map +10 -0
  184. package/dist/cjs/functions/text/left/left.cjs +109 -0
  185. package/dist/cjs/functions/text/left/left.cjs.map +10 -0
  186. package/dist/cjs/functions/text/len/len.cjs +119 -0
  187. package/dist/cjs/functions/text/len/len.cjs.map +10 -0
  188. package/dist/cjs/functions/text/mid/mid.cjs +103 -0
  189. package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
  190. package/dist/cjs/functions/text/right/right.cjs +167 -0
  191. package/dist/cjs/functions/text/right/right.cjs.map +10 -0
  192. package/dist/cjs/functions/text/text-helpers.cjs +179 -0
  193. package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
  194. package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
  195. package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
  196. package/dist/cjs/package.json +5 -0
  197. package/dist/cjs/parser/ast.cjs +175 -0
  198. package/dist/cjs/parser/ast.cjs.map +10 -0
  199. package/dist/cjs/parser/formatter.cjs +319 -0
  200. package/dist/cjs/parser/formatter.cjs.map +10 -0
  201. package/dist/cjs/parser/grammar.cjs +375 -0
  202. package/dist/cjs/parser/grammar.cjs.map +10 -0
  203. package/dist/cjs/parser/lexer.cjs +443 -0
  204. package/dist/cjs/parser/lexer.cjs.map +10 -0
  205. package/dist/cjs/parser/parser.cjs +1700 -0
  206. package/dist/cjs/parser/parser.cjs.map +10 -0
  207. package/dist/cjs/react/hooks.cjs +59 -0
  208. package/dist/cjs/react/hooks.cjs.map +10 -0
  209. package/dist/mjs/core/ast-traverser.mjs +94 -0
  210. package/dist/mjs/core/ast-traverser.mjs.map +10 -0
  211. package/dist/mjs/core/autofill-utils.mjs +274 -0
  212. package/dist/mjs/core/autofill-utils.mjs.map +10 -0
  213. package/dist/mjs/core/engine.mjs +366 -0
  214. package/dist/mjs/core/engine.mjs.map +10 -0
  215. package/dist/mjs/core/managers/cache-manager.mjs +27 -0
  216. package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
  217. package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
  218. package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
  219. package/dist/mjs/core/managers/dependency-node.mjs +2 -0
  220. package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
  221. package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
  222. package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
  223. package/dist/mjs/core/managers/event-manager.mjs +18 -0
  224. package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
  225. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
  226. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
  227. package/dist/mjs/core/managers/index.mjs +21 -0
  228. package/dist/mjs/core/managers/index.mjs.map +10 -0
  229. package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
  230. package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
  231. package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
  232. package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
  233. package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
  234. package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
  235. package/dist/mjs/core/managers/table-manager.mjs +224 -0
  236. package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
  237. package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
  238. package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
  239. package/dist/mjs/core/map-serializer.mjs +39 -0
  240. package/dist/mjs/core/map-serializer.mjs.map +10 -0
  241. package/dist/mjs/core/named-expression-renamer.mjs +58 -0
  242. package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
  243. package/dist/mjs/core/sheet-renamer.mjs +59 -0
  244. package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
  245. package/dist/mjs/core/sheet-utils.mjs +8 -0
  246. package/dist/mjs/core/sheet-utils.mjs.map +10 -0
  247. package/dist/mjs/core/table-renamer.mjs +58 -0
  248. package/dist/mjs/core/table-renamer.mjs.map +10 -0
  249. package/dist/mjs/core/types.mjs +18 -0
  250. package/dist/mjs/core/types.mjs.map +10 -0
  251. package/dist/mjs/core/utils/range-serializer.mjs +35 -0
  252. package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
  253. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
  254. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
  255. package/dist/mjs/core/utils.mjs +409 -0
  256. package/dist/mjs/core/utils.mjs.map +10 -0
  257. package/dist/mjs/core/workbook-renamer.mjs +76 -0
  258. package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
  259. package/dist/mjs/debug/flags.mjs +17 -0
  260. package/dist/mjs/debug/flags.mjs.map +10 -0
  261. package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
  262. package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
  263. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
  264. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
  265. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
  266. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
  267. package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
  268. package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
  269. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
  270. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
  271. package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
  272. package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
  273. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
  274. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
  275. package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
  276. package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
  277. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
  278. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
  279. package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
  280. package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
  281. package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
  282. package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
  283. package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
  284. package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
  285. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
  286. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
  287. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
  288. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
  289. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
  290. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
  291. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
  292. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
  293. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
  294. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
  295. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
  296. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
  297. package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
  298. package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
  299. package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
  300. package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
  301. package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
  302. package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
  303. package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
  304. package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
  305. package/dist/mjs/functions/_template/template.mjs +12 -0
  306. package/dist/mjs/functions/_template/template.mjs.map +10 -0
  307. package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
  308. package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
  309. package/dist/mjs/functions/criteria-parser.mjs +187 -0
  310. package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
  311. package/dist/mjs/functions/criteria-utils.mjs +268 -0
  312. package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
  313. package/dist/mjs/functions/function-utils.mjs +33 -0
  314. package/dist/mjs/functions/function-utils.mjs.map +10 -0
  315. package/dist/mjs/functions/index.mjs +95 -0
  316. package/dist/mjs/functions/index.mjs.map +10 -0
  317. package/dist/mjs/functions/information/cell/cell.mjs +168 -0
  318. package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
  319. package/dist/mjs/functions/information/column/column.mjs +120 -0
  320. package/dist/mjs/functions/information/column/column.mjs.map +10 -0
  321. package/dist/mjs/functions/information/row/row.mjs +126 -0
  322. package/dist/mjs/functions/information/row/row.mjs.map +10 -0
  323. package/dist/mjs/functions/logical/and/and.mjs +84 -0
  324. package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
  325. package/dist/mjs/functions/logical/if/if.mjs +167 -0
  326. package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
  327. package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
  328. package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
  329. package/dist/mjs/functions/logical/or/or.mjs +84 -0
  330. package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
  331. package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
  332. package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
  333. package/dist/mjs/functions/lookup/count/count.mjs +18 -0
  334. package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
  335. package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
  336. package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
  337. package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
  338. package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
  339. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
  340. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
  341. package/dist/mjs/functions/lookup/match/match.mjs +140 -0
  342. package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
  343. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
  344. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
  345. package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
  346. package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
  347. package/dist/mjs/functions/math/average/average.mjs +18 -0
  348. package/dist/mjs/functions/math/average/average.mjs.map +10 -0
  349. package/dist/mjs/functions/math/average/averageif.mjs +58 -0
  350. package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
  351. package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
  352. package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
  353. package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
  354. package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
  355. package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
  356. package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
  357. package/dist/mjs/functions/math/max/max.mjs +18 -0
  358. package/dist/mjs/functions/math/max/max.mjs.map +10 -0
  359. package/dist/mjs/functions/math/max/maxif.mjs +58 -0
  360. package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
  361. package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
  362. package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
  363. package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
  364. package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
  365. package/dist/mjs/functions/math/min/min.mjs +18 -0
  366. package/dist/mjs/functions/math/min/min.mjs.map +10 -0
  367. package/dist/mjs/functions/math/min/minif.mjs +58 -0
  368. package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
  369. package/dist/mjs/functions/math/min/minifs.mjs +35 -0
  370. package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
  371. package/dist/mjs/functions/math/sum/sum.mjs +18 -0
  372. package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
  373. package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
  374. package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
  375. package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
  376. package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
  377. package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
  378. package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
  379. package/dist/mjs/functions/reference/address/address.mjs +135 -0
  380. package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
  381. package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
  382. package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
  383. package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
  384. package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
  385. package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
  386. package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
  387. package/dist/mjs/functions/text/exact/exact.mjs +143 -0
  388. package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
  389. package/dist/mjs/functions/text/find/find.mjs +369 -0
  390. package/dist/mjs/functions/text/find/find.mjs.map +10 -0
  391. package/dist/mjs/functions/text/left/left.mjs +81 -0
  392. package/dist/mjs/functions/text/left/left.mjs.map +10 -0
  393. package/dist/mjs/functions/text/len/len.mjs +91 -0
  394. package/dist/mjs/functions/text/len/len.mjs.map +10 -0
  395. package/dist/mjs/functions/text/mid/mid.mjs +75 -0
  396. package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
  397. package/dist/mjs/functions/text/right/right.mjs +143 -0
  398. package/dist/mjs/functions/text/right/right.mjs.map +10 -0
  399. package/dist/mjs/functions/text/text-helpers.mjs +151 -0
  400. package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
  401. package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
  402. package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
  403. package/dist/mjs/package.json +5 -0
  404. package/dist/mjs/parser/ast.mjs +145 -0
  405. package/dist/mjs/parser/ast.mjs.map +10 -0
  406. package/dist/mjs/parser/formatter.mjs +289 -0
  407. package/dist/mjs/parser/formatter.mjs.map +10 -0
  408. package/dist/mjs/parser/grammar.mjs +345 -0
  409. package/dist/mjs/parser/grammar.mjs.map +10 -0
  410. package/dist/mjs/parser/lexer.mjs +412 -0
  411. package/dist/mjs/parser/lexer.mjs.map +10 -0
  412. package/dist/mjs/parser/parser.mjs +1692 -0
  413. package/dist/mjs/parser/parser.mjs.map +10 -0
  414. package/dist/mjs/react/hooks.mjs +16 -0
  415. package/dist/mjs/react/hooks.mjs.map +10 -0
  416. package/dist/types/core/ast-traverser.d.ts +28 -0
  417. package/dist/types/core/autofill-utils.d.ts +32 -0
  418. package/dist/types/core/engine.d.ts +184 -0
  419. package/dist/types/core/managers/cache-manager.d.ts +14 -0
  420. package/dist/types/core/managers/dependency-manager.d.ts +147 -0
  421. package/dist/types/core/managers/dependency-node.d.ts +13 -0
  422. package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
  423. package/dist/types/core/managers/event-manager.d.ts +8 -0
  424. package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
  425. package/dist/types/core/managers/index.d.ts +7 -0
  426. package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
  427. package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
  428. package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
  429. package/dist/types/core/managers/table-manager.d.ts +84 -0
  430. package/dist/types/core/managers/workbook-manager.d.ts +136 -0
  431. package/dist/types/core/map-serializer.d.ts +4 -0
  432. package/dist/types/core/named-expression-renamer.d.ts +21 -0
  433. package/dist/types/core/sheet-renamer.d.ts +28 -0
  434. package/dist/types/core/sheet-utils.d.ts +2 -0
  435. package/dist/types/core/table-renamer.d.ts +21 -0
  436. package/dist/types/core/types.d.ts +272 -0
  437. package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
  438. package/dist/types/core/utils/range-serializer.d.ts +22 -0
  439. package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
  440. package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
  441. package/dist/types/core/utils.d.ts +48 -0
  442. package/dist/types/core/workbook-renamer.d.ts +28 -0
  443. package/dist/types/debug/flags.d.ts +11 -0
  444. package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
  445. package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
  446. package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
  447. package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
  448. package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
  449. package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
  450. package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
  451. package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
  452. package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
  453. package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
  454. package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
  455. package/dist/types/evaluator/comparison/equals.d.ts +6 -0
  456. package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
  457. package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
  458. package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
  459. package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
  460. package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
  461. package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
  462. package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
  463. package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
  464. package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
  465. package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
  466. package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
  467. package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
  468. package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
  469. package/dist/types/evaluator/evaluation-context.d.ts +66 -0
  470. package/dist/types/evaluator/evaluation-error.d.ts +20 -0
  471. package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
  472. package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
  473. package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
  474. package/dist/types/functions/_template/template.d.ts +5 -0
  475. package/dist/types/functions/_template/template.test.d.ts +1 -0
  476. package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
  477. package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
  478. package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
  479. package/dist/types/functions/criteria-parser.d.ts +27 -0
  480. package/dist/types/functions/criteria-utils.d.ts +61 -0
  481. package/dist/types/functions/function-utils.d.ts +21 -0
  482. package/dist/types/functions/index.d.ts +2 -0
  483. package/dist/types/functions/information/cell/cell.d.ts +24 -0
  484. package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
  485. package/dist/types/functions/information/column/column.d.ts +14 -0
  486. package/dist/types/functions/information/column/column.test.d.ts +1 -0
  487. package/dist/types/functions/information/row/row.d.ts +14 -0
  488. package/dist/types/functions/information/row/row.test.d.ts +1 -0
  489. package/dist/types/functions/logical/and/and.d.ts +5 -0
  490. package/dist/types/functions/logical/and/and.test.d.ts +1 -0
  491. package/dist/types/functions/logical/if/if.d.ts +5 -0
  492. package/dist/types/functions/logical/if/if.test.d.ts +1 -0
  493. package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
  494. package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
  495. package/dist/types/functions/logical/or/or.d.ts +5 -0
  496. package/dist/types/functions/logical/or/or.test.d.ts +1 -0
  497. package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
  498. package/dist/types/functions/lookup/count/count.d.ts +21 -0
  499. package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
  500. package/dist/types/functions/lookup/count/countif.d.ts +26 -0
  501. package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
  502. package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
  503. package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
  504. package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
  505. package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
  506. package/dist/types/functions/lookup/match/match.d.ts +2 -0
  507. package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
  508. package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
  509. package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
  510. package/dist/types/functions/math/average/average-utils.d.ts +10 -0
  511. package/dist/types/functions/math/average/average.d.ts +18 -0
  512. package/dist/types/functions/math/average/average.test.d.ts +1 -0
  513. package/dist/types/functions/math/average/averageif.d.ts +23 -0
  514. package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
  515. package/dist/types/functions/math/average/averageifs.d.ts +21 -0
  516. package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
  517. package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
  518. package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
  519. package/dist/types/functions/math/max/max-utils.d.ts +20 -0
  520. package/dist/types/functions/math/max/max.d.ts +18 -0
  521. package/dist/types/functions/math/max/max.test.d.ts +1 -0
  522. package/dist/types/functions/math/max/maxif.d.ts +23 -0
  523. package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
  524. package/dist/types/functions/math/max/maxifs.d.ts +21 -0
  525. package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
  526. package/dist/types/functions/math/min/min-utils.d.ts +20 -0
  527. package/dist/types/functions/math/min/min.d.ts +5 -0
  528. package/dist/types/functions/math/min/min.test.d.ts +1 -0
  529. package/dist/types/functions/math/min/minif.d.ts +23 -0
  530. package/dist/types/functions/math/min/minif.test.d.ts +1 -0
  531. package/dist/types/functions/math/min/minifs.d.ts +21 -0
  532. package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
  533. package/dist/types/functions/math/sum/sum.d.ts +5 -0
  534. package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
  535. package/dist/types/functions/math/sum/sumif.d.ts +23 -0
  536. package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
  537. package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
  538. package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
  539. package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
  540. package/dist/types/functions/reference/address/address.d.ts +18 -0
  541. package/dist/types/functions/reference/address/address.test.d.ts +1 -0
  542. package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
  543. package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
  544. package/dist/types/functions/reference/offset/offset.d.ts +23 -0
  545. package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
  546. package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
  547. package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
  548. package/dist/types/functions/text/exact/exact.d.ts +5 -0
  549. package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
  550. package/dist/types/functions/text/find/find.d.ts +20 -0
  551. package/dist/types/functions/text/find/find.test.d.ts +1 -0
  552. package/dist/types/functions/text/left/left.d.ts +19 -0
  553. package/dist/types/functions/text/left/left.test.d.ts +1 -0
  554. package/dist/types/functions/text/len/len.d.ts +16 -0
  555. package/dist/types/functions/text/len/len.test.d.ts +1 -0
  556. package/dist/types/functions/text/mid/mid.d.ts +20 -0
  557. package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
  558. package/dist/types/functions/text/right/right.d.ts +2 -0
  559. package/dist/types/functions/text/right/right.test.d.ts +1 -0
  560. package/dist/types/functions/text/text-helpers.d.ts +27 -0
  561. package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
  562. package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
  563. package/dist/types/parser/ast.d.ts +275 -0
  564. package/dist/types/parser/formatter.d.ts +6 -0
  565. package/dist/types/parser/grammar.d.ts +203 -0
  566. package/dist/types/parser/lexer.d.ts +144 -0
  567. package/dist/types/parser/parser.d.ts +159 -0
  568. package/dist/types/react/hooks.d.ts +5 -0
  569. package/package.json +41 -0
@@ -0,0 +1,369 @@
1
+ // src/functions/text/find/find.ts
2
+ import {
3
+ FormulaError
4
+ } from "src/core/types";
5
+ import { convertToString, extractNumericValue } from "../text-helpers.mjs";
6
+ function findOperation(findTextResult, withinTextResult, startNumResult, context) {
7
+ const findStr = convertToString(findTextResult, context);
8
+ const withinStr = convertToString(withinTextResult, context);
9
+ const startNum = extractNumericValue(startNumResult, context);
10
+ if (typeof findStr === "object" && (findStr.type === "awaiting-evaluation" || findStr.type === "error")) {
11
+ return findStr;
12
+ }
13
+ if (typeof withinStr === "object" && (withinStr.type === "awaiting-evaluation" || withinStr.type === "error")) {
14
+ return withinStr;
15
+ }
16
+ if (typeof startNum === "object" && (startNum.type === "awaiting-evaluation" || startNum.type === "error")) {
17
+ return startNum;
18
+ }
19
+ const findValue = findStr;
20
+ const withinValue = withinStr;
21
+ const startNumValue = startNum;
22
+ if (startNumValue < 1) {
23
+ return {
24
+ type: "error",
25
+ err: FormulaError.VALUE,
26
+ message: "Text not found #2",
27
+ errAddress: context.dependencyNode
28
+ };
29
+ }
30
+ const start = Math.floor(startNumValue) - 1;
31
+ if (start >= withinValue.length) {
32
+ return {
33
+ type: "error",
34
+ err: FormulaError.VALUE,
35
+ message: "Text not found #2",
36
+ errAddress: context.dependencyNode
37
+ };
38
+ }
39
+ const index = withinValue.indexOf(findValue, start);
40
+ if (index === -1) {
41
+ return {
42
+ type: "error",
43
+ err: FormulaError.VALUE,
44
+ message: "Text not found #2",
45
+ errAddress: context.dependencyNode
46
+ };
47
+ }
48
+ return { type: "number", value: index + 1 };
49
+ }
50
+ function createFindSpilledResult({
51
+ findTextResult,
52
+ withinTextResult,
53
+ startNumResult,
54
+ context
55
+ }) {
56
+ if (findTextResult.type === "spilled-values" && withinTextResult.type === "spilled-values") {
57
+ return {
58
+ type: "spilled-values",
59
+ spillArea: (origin) => {
60
+ let spillArea = this.unionRanges(this.projectRange(findTextResult.spillArea(origin), origin), this.projectRange(withinTextResult.spillArea(origin), origin));
61
+ if (startNumResult.type === "spilled-values") {
62
+ spillArea = this.unionRanges(spillArea, this.projectRange(startNumResult.spillArea(origin), origin));
63
+ }
64
+ return spillArea;
65
+ },
66
+ source: "FIND with zipped spilled findText and withinText values",
67
+ evaluate: (spillOffset, evalContext) => {
68
+ const spillFindResult = findTextResult.evaluate(spillOffset, evalContext);
69
+ const spillWithinResult = withinTextResult.evaluate(spillOffset, evalContext);
70
+ if (!spillFindResult || spillFindResult.type === "error") {
71
+ return spillFindResult;
72
+ }
73
+ if (!spillWithinResult || spillWithinResult.type === "error") {
74
+ return spillWithinResult;
75
+ }
76
+ let startNumArg = startNumResult;
77
+ if (startNumResult.type === "spilled-values") {
78
+ const spillStartNumResult = startNumResult.evaluate(spillOffset, evalContext);
79
+ if (!spillStartNumResult || spillStartNumResult.type === "error") {
80
+ return spillStartNumResult;
81
+ }
82
+ startNumArg = spillStartNumResult;
83
+ }
84
+ const result = findOperation(spillFindResult, spillWithinResult, startNumArg, evalContext);
85
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
86
+ return result;
87
+ }
88
+ return {
89
+ type: "value",
90
+ result
91
+ };
92
+ },
93
+ evaluateAllCells: (intersectingRange) => {
94
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
95
+ }
96
+ };
97
+ } else if (findTextResult.type === "spilled-values" && withinTextResult.type !== "spilled-values" && startNumResult.type !== "spilled-values") {
98
+ return {
99
+ type: "spilled-values",
100
+ spillArea: (origin) => {
101
+ return findTextResult.spillArea(origin);
102
+ },
103
+ source: "FIND with spilled findText values",
104
+ evaluate: (spillOffset, evalContext) => {
105
+ const spillResult = findTextResult.evaluate(spillOffset, evalContext);
106
+ if (!spillResult || spillResult.type === "error") {
107
+ return spillResult;
108
+ }
109
+ const result = findOperation(spillResult, withinTextResult, startNumResult, evalContext);
110
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
111
+ return result;
112
+ }
113
+ return {
114
+ type: "value",
115
+ result
116
+ };
117
+ },
118
+ evaluateAllCells: (intersectingRange) => {
119
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
120
+ }
121
+ };
122
+ } else if (withinTextResult.type === "spilled-values" && findTextResult.type !== "spilled-values" && startNumResult.type !== "spilled-values") {
123
+ return {
124
+ type: "spilled-values",
125
+ spillArea: (origin) => withinTextResult.spillArea(origin),
126
+ source: "FIND with spilled withinText values",
127
+ evaluate: (spillOffset, evalContext) => {
128
+ const spillResult = withinTextResult.evaluate(spillOffset, evalContext);
129
+ if (!spillResult || spillResult.type === "error") {
130
+ return spillResult;
131
+ }
132
+ const result = findOperation(findTextResult, spillResult, startNumResult, evalContext);
133
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
134
+ return result;
135
+ }
136
+ return {
137
+ type: "value",
138
+ result
139
+ };
140
+ },
141
+ evaluateAllCells: (intersectingRange) => {
142
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
143
+ }
144
+ };
145
+ } else if (findTextResult.type === "spilled-values" && startNumResult.type === "spilled-values" && withinTextResult.type !== "spilled-values") {
146
+ if (withinTextResult.type !== "value") {
147
+ return {
148
+ type: "error",
149
+ err: FormulaError.VALUE,
150
+ message: "Invalid withinText argument",
151
+ errAddress: context.dependencyNode
152
+ };
153
+ }
154
+ if (withinTextResult.result.type !== "string") {
155
+ return {
156
+ type: "error",
157
+ err: FormulaError.VALUE,
158
+ message: "WithinText argument must be a string",
159
+ errAddress: context.dependencyNode
160
+ };
161
+ }
162
+ return {
163
+ type: "spilled-values",
164
+ spillArea: (origin) => {
165
+ const spillArea = this.unionRanges(this.projectRange(findTextResult.spillArea(origin), origin), this.projectRange(startNumResult.spillArea(origin), origin));
166
+ return spillArea;
167
+ },
168
+ source: "FIND with spilled findText and startNum values",
169
+ evaluate: (spillOffset, evalContext) => {
170
+ const spillFindResult = findTextResult.evaluate(spillOffset, evalContext);
171
+ const spillStartNumResult = startNumResult.evaluate(spillOffset, evalContext);
172
+ if (!spillFindResult || spillFindResult.type === "error") {
173
+ return spillFindResult;
174
+ }
175
+ if (!spillStartNumResult || spillStartNumResult.type === "error") {
176
+ return spillStartNumResult;
177
+ }
178
+ const result = findOperation(spillFindResult, withinTextResult, spillStartNumResult, evalContext);
179
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
180
+ return result;
181
+ }
182
+ return {
183
+ type: "value",
184
+ result
185
+ };
186
+ },
187
+ evaluateAllCells: (intersectingRange) => {
188
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
189
+ }
190
+ };
191
+ } else if (withinTextResult.type === "spilled-values" && startNumResult.type === "spilled-values" && findTextResult.type !== "spilled-values") {
192
+ if (findTextResult.type !== "value") {
193
+ return {
194
+ type: "error",
195
+ err: FormulaError.VALUE,
196
+ message: "Invalid findText argument",
197
+ errAddress: context.dependencyNode
198
+ };
199
+ }
200
+ if (findTextResult.result.type !== "string") {
201
+ return {
202
+ type: "error",
203
+ err: FormulaError.VALUE,
204
+ message: "FindText argument must be a string",
205
+ errAddress: context.dependencyNode
206
+ };
207
+ }
208
+ return {
209
+ type: "spilled-values",
210
+ spillArea: (origin) => {
211
+ const spillArea = this.unionRanges(this.projectRange(withinTextResult.spillArea(origin), origin), this.projectRange(startNumResult.spillArea(origin), origin));
212
+ return spillArea;
213
+ },
214
+ source: "FIND with spilled withinText and startNum values",
215
+ evaluate: (spillOffset, evalContext) => {
216
+ const spillWithinResult = withinTextResult.evaluate(spillOffset, evalContext);
217
+ const spillStartNumResult = startNumResult.evaluate(spillOffset, evalContext);
218
+ if (!spillWithinResult || spillWithinResult.type === "error") {
219
+ return spillWithinResult;
220
+ }
221
+ if (!spillStartNumResult || spillStartNumResult.type === "error") {
222
+ return spillStartNumResult;
223
+ }
224
+ const result = findOperation(findTextResult, spillWithinResult, spillStartNumResult, evalContext);
225
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
226
+ return result;
227
+ }
228
+ return {
229
+ type: "value",
230
+ result
231
+ };
232
+ },
233
+ evaluateAllCells: (intersectingRange) => {
234
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
235
+ }
236
+ };
237
+ } else if (startNumResult.type === "spilled-values" && findTextResult.type !== "spilled-values" && withinTextResult.type !== "spilled-values") {
238
+ if (findTextResult.type !== "value") {
239
+ return findTextResult;
240
+ }
241
+ if (withinTextResult.type !== "value") {
242
+ return withinTextResult;
243
+ }
244
+ if (findTextResult.result.type !== "string") {
245
+ return {
246
+ type: "error",
247
+ err: FormulaError.VALUE,
248
+ message: "FindText argument must be a string",
249
+ errAddress: context.dependencyNode
250
+ };
251
+ }
252
+ if (withinTextResult.result.type !== "string") {
253
+ return {
254
+ type: "error",
255
+ err: FormulaError.VALUE,
256
+ message: "WithinText argument must be a string",
257
+ errAddress: context.dependencyNode
258
+ };
259
+ }
260
+ return {
261
+ type: "spilled-values",
262
+ spillArea: (origin) => startNumResult.spillArea(origin),
263
+ source: "FIND with spilled startNum values",
264
+ evaluate: (spillOffset, evalContext) => {
265
+ const spillResult = startNumResult.evaluate(spillOffset, evalContext);
266
+ if (!spillResult || spillResult.type === "error") {
267
+ return spillResult;
268
+ }
269
+ if (spillResult.type !== "value") {
270
+ return spillResult;
271
+ }
272
+ const startNumArg = {
273
+ type: "value",
274
+ result: spillResult.result
275
+ };
276
+ const result = findOperation(findTextResult, withinTextResult, startNumArg, evalContext);
277
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
278
+ return result;
279
+ }
280
+ return {
281
+ type: "value",
282
+ result
283
+ };
284
+ },
285
+ evaluateAllCells: (intersectingRange) => {
286
+ throw new Error("WIP: evaluateAllCells for FIND is not implemented");
287
+ }
288
+ };
289
+ }
290
+ return {
291
+ type: "error",
292
+ err: FormulaError.VALUE,
293
+ message: "Invalid arguments for FIND",
294
+ errAddress: context.dependencyNode
295
+ };
296
+ }
297
+ var FIND = {
298
+ name: "FIND",
299
+ evaluate: function(node, context) {
300
+ if (node.args.length < 2 || node.args.length > 3) {
301
+ return {
302
+ type: "error",
303
+ err: FormulaError.VALUE,
304
+ message: "FIND function takes 2 or 3 arguments",
305
+ errAddress: context.dependencyNode
306
+ };
307
+ }
308
+ const findTextResult = this.evaluateNode(node.args[0], context);
309
+ if (findTextResult.type === "error") {
310
+ return findTextResult;
311
+ }
312
+ const withinTextResult = this.evaluateNode(node.args[1], context);
313
+ if (withinTextResult.type === "error") {
314
+ return withinTextResult;
315
+ }
316
+ let startNumResult;
317
+ if (node.args.length > 2) {
318
+ startNumResult = this.evaluateNode(node.args[2], context);
319
+ } else {
320
+ startNumResult = {
321
+ type: "value",
322
+ result: { type: "number", value: 1 }
323
+ };
324
+ }
325
+ if (findTextResult.type === "spilled-values" || withinTextResult.type === "spilled-values" || startNumResult.type === "spilled-values") {
326
+ return createFindSpilledResult.call(this, {
327
+ findTextResult,
328
+ withinTextResult,
329
+ startNumResult,
330
+ context
331
+ });
332
+ }
333
+ if (findTextResult.type === "awaiting-evaluation") {
334
+ return findTextResult;
335
+ }
336
+ if (withinTextResult.type === "awaiting-evaluation") {
337
+ return withinTextResult;
338
+ }
339
+ if (findTextResult.result.type !== "string") {
340
+ return {
341
+ type: "error",
342
+ err: FormulaError.VALUE,
343
+ message: "FindText argument must be a string",
344
+ errAddress: context.dependencyNode
345
+ };
346
+ }
347
+ if (withinTextResult.result.type !== "string") {
348
+ return {
349
+ type: "error",
350
+ err: FormulaError.VALUE,
351
+ message: "WithinText argument must be a string",
352
+ errAddress: context.dependencyNode
353
+ };
354
+ }
355
+ const result = findOperation(findTextResult, withinTextResult, startNumResult, context);
356
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
357
+ return result;
358
+ }
359
+ return {
360
+ type: "value",
361
+ result
362
+ };
363
+ }
364
+ };
365
+ export {
366
+ FIND
367
+ };
368
+
369
+ //# debugId=3F582CD466EECC4A64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/functions/text/find/find.ts"],
4
+ "sourcesContent": [
5
+ "import {\n FormulaError,\n type CellNumber,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type ValueEvaluationResult,\n type CellAddress,\n type ErrorEvaluationResult,\n} from \"src/core/types\";\nimport type { FormulaEngine } from \"src/core/engine\";\nimport { convertToString, extractNumericValue } from \"../text-helpers.mjs\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n// Helper function for FIND operation - returns the result, error, or null if not found\nfunction findOperation(\n findTextResult: FunctionEvaluationResult,\n withinTextResult: FunctionEvaluationResult,\n startNumResult: FunctionEvaluationResult,\n context: EvaluationContext\n): CellNumber | ErrorEvaluationResult {\n const findStr = convertToString(findTextResult, context);\n const withinStr = convertToString(withinTextResult, context);\n const startNum = extractNumericValue(startNumResult, context);\n\n // Check if any of the results are awaiting evaluation or errors\n if (\n typeof findStr === \"object\" &&\n (findStr.type === \"awaiting-evaluation\" || findStr.type === \"error\")\n ) {\n return findStr;\n }\n if (\n typeof withinStr === \"object\" &&\n (withinStr.type === \"awaiting-evaluation\" || withinStr.type === \"error\")\n ) {\n return withinStr;\n }\n if (\n typeof startNum === \"object\" &&\n (startNum.type === \"awaiting-evaluation\" || startNum.type === \"error\")\n ) {\n return startNum;\n }\n\n // At this point, all values should be primitive types\n const findValue = findStr as string;\n const withinValue = withinStr as string;\n const startNumValue = startNum as number;\n\n // Validate startNum\n if (startNumValue < 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text not found #2\",\n errAddress: context.dependencyNode,\n };\n }\n\n const start = Math.floor(startNumValue) - 1; // Convert to 0-based index\n\n if (start >= withinValue.length) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text not found #2\",\n errAddress: context.dependencyNode,\n };\n }\n\n const index = withinValue.indexOf(findValue, start);\n if (index === -1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text not found #2\",\n errAddress: context.dependencyNode,\n };\n }\n\n return { type: \"number\", value: index + 1 }; // Convert back to 1-based index\n}\n\n/**\n * Helper for creating spilled-values result for FIND function\n */\nfunction createFindSpilledResult(\n this: FormulaEvaluator,\n {\n findTextResult,\n withinTextResult,\n startNumResult,\n context,\n }: {\n findTextResult: FunctionEvaluationResult;\n withinTextResult: FunctionEvaluationResult;\n startNumResult: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): FunctionEvaluationResult {\n // If both findText and withinText are spilled-values, we need to zip them together\n if (\n findTextResult.type === \"spilled-values\" &&\n withinTextResult.type === \"spilled-values\"\n ) {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => {\n // Create unified spill area (union of all spilled ranges)\n let spillArea = this.unionRanges(\n this.projectRange(findTextResult.spillArea(origin), origin),\n this.projectRange(withinTextResult.spillArea(origin), origin)\n );\n\n // Also include startNum spill area if it's spilled\n if (startNumResult.type === \"spilled-values\") {\n spillArea = this.unionRanges(\n spillArea,\n this.projectRange(startNumResult.spillArea(origin), origin)\n );\n }\n return spillArea;\n },\n source: \"FIND with zipped spilled findText and withinText values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n // Evaluate both spilled arrays at this position\n const spillFindResult = findTextResult.evaluate(\n spillOffset,\n evalContext\n );\n const spillWithinResult = withinTextResult.evaluate(\n spillOffset,\n evalContext\n );\n\n if (!spillFindResult || spillFindResult.type === \"error\") {\n return spillFindResult;\n }\n if (!spillWithinResult || spillWithinResult.type === \"error\") {\n return spillWithinResult;\n }\n\n // Handle startNum - evaluate if spilled, otherwise use as-is\n let startNumArg = startNumResult;\n if (startNumResult.type === \"spilled-values\") {\n const spillStartNumResult = startNumResult.evaluate(\n spillOffset,\n evalContext\n );\n if (!spillStartNumResult || spillStartNumResult.type === \"error\") {\n return spillStartNumResult;\n }\n startNumArg = spillStartNumResult;\n }\n\n const result = findOperation(\n spillFindResult,\n spillWithinResult,\n startNumArg,\n evalContext\n );\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n // If only findText is spilled-values\n else if (\n findTextResult.type === \"spilled-values\" &&\n withinTextResult.type !== \"spilled-values\" &&\n startNumResult.type !== \"spilled-values\"\n ) {\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => {\n return findTextResult.spillArea(origin);\n },\n source: \"FIND with spilled findText values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n const spillResult = findTextResult.evaluate(spillOffset, evalContext);\n if (!spillResult || spillResult.type === \"error\") {\n return spillResult;\n }\n const result = findOperation(\n spillResult,\n withinTextResult,\n startNumResult,\n evalContext\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n // If only withinText is spilled-values\n else if (\n withinTextResult.type === \"spilled-values\" &&\n findTextResult.type !== \"spilled-values\" &&\n startNumResult.type !== \"spilled-values\"\n ) {\n return {\n type: \"spilled-values\",\n spillArea: (origin) => withinTextResult.spillArea(origin),\n source: \"FIND with spilled withinText values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n const spillResult = withinTextResult.evaluate(spillOffset, evalContext);\n if (!spillResult || spillResult.type === \"error\") {\n return spillResult;\n }\n const result = findOperation(\n findTextResult,\n spillResult,\n startNumResult,\n evalContext\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n // If findText and startNum are spilled (but not withinText)\n else if (\n findTextResult.type === \"spilled-values\" &&\n startNumResult.type === \"spilled-values\" &&\n withinTextResult.type !== \"spilled-values\"\n ) {\n if (withinTextResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid withinText argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Strict type checking\n if (withinTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"WithinText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => {\n // Create unified spill area (union of both ranges)\n const spillArea = this.unionRanges(\n this.projectRange(findTextResult.spillArea(origin), origin),\n this.projectRange(startNumResult.spillArea(origin), origin)\n );\n return spillArea;\n },\n source: \"FIND with spilled findText and startNum values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n // Evaluate both spilled arrays at this position\n const spillFindResult = findTextResult.evaluate(\n spillOffset,\n evalContext\n );\n const spillStartNumResult = startNumResult.evaluate(\n spillOffset,\n evalContext\n );\n\n if (!spillFindResult || spillFindResult.type === \"error\") {\n return spillFindResult;\n }\n if (!spillStartNumResult || spillStartNumResult.type === \"error\") {\n return spillStartNumResult;\n }\n\n const result = findOperation(\n spillFindResult,\n withinTextResult,\n spillStartNumResult,\n evalContext\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n // If withinText and startNum are spilled (but not findText)\n else if (\n withinTextResult.type === \"spilled-values\" &&\n startNumResult.type === \"spilled-values\" &&\n findTextResult.type !== \"spilled-values\"\n ) {\n if (findTextResult.type !== \"value\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid findText argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Strict type checking\n if (findTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"FindText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => {\n // Create unified spill area (union of both ranges)\n const spillArea = this.unionRanges(\n this.projectRange(withinTextResult.spillArea(origin), origin),\n this.projectRange(startNumResult.spillArea(origin), origin)\n );\n return spillArea;\n },\n source: \"FIND with spilled withinText and startNum values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n // Evaluate both spilled arrays at this position\n const spillWithinResult = withinTextResult.evaluate(\n spillOffset,\n evalContext\n );\n const spillStartNumResult = startNumResult.evaluate(\n spillOffset,\n evalContext\n );\n\n if (!spillWithinResult || spillWithinResult.type === \"error\") {\n return spillWithinResult;\n }\n if (!spillStartNumResult || spillStartNumResult.type === \"error\") {\n return spillStartNumResult;\n }\n\n const result = findOperation(\n findTextResult,\n spillWithinResult,\n spillStartNumResult,\n evalContext\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n // If only startNum is spilled-values\n else if (\n startNumResult.type === \"spilled-values\" &&\n findTextResult.type !== \"spilled-values\" &&\n withinTextResult.type !== \"spilled-values\"\n ) {\n if (findTextResult.type !== \"value\") {\n return findTextResult;\n }\n if (withinTextResult.type !== \"value\") {\n return withinTextResult;\n }\n\n // Strict type checking\n if (findTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"FindText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (withinTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"WithinText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => startNumResult.spillArea(origin),\n source: \"FIND with spilled startNum values\",\n evaluate: (spillOffset, evalContext: EvaluationContext) => {\n const spillResult = startNumResult.evaluate(spillOffset, evalContext);\n if (!spillResult || spillResult.type === \"error\") {\n return spillResult;\n }\n\n // Create a proper startNum argument for findOperation\n if (spillResult.type !== \"value\") {\n return spillResult;\n }\n const startNumArg: ValueEvaluationResult = {\n type: \"value\",\n result: spillResult.result,\n };\n\n const result = findOperation(\n findTextResult,\n withinTextResult,\n startNumArg,\n evalContext\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result,\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for FIND is not implemented\");\n },\n };\n }\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Invalid arguments for FIND\",\n errAddress: context.dependencyNode,\n };\n}\n\n/**\n * FIND function - Finds one text string within another (case-sensitive)\n *\n * Usage: FIND(find_text, within_text, [start_num])\n *\n * find_text: The text you want to find.\n * within_text: The text containing the text you want to find.\n * start_num: [Optional] The character at which to start the search (default: 1).\n *\n * Example: FIND(\"World\", \"Hello World\", 1) returns 7\n *\n * Note:\n * - The search is case-sensitive\n * - Returns the position of the first character of find_text within within_text\n * - Returns #VALUE! error if text is not found\n * - Supports dynamic arrays (spilled values) for find_text and within_text\n * - Strict type checking: text arguments must be strings, start_num must be number\n */\nexport const FIND: FunctionDefinition = {\n name: \"FIND\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 2 || node.args.length > 3) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"FIND function takes 2 or 3 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate findText argument\n const findTextResult = this.evaluateNode(node.args[0]!, context);\n if (findTextResult.type === \"error\") {\n return findTextResult;\n }\n\n // Evaluate withinText argument\n const withinTextResult = this.evaluateNode(node.args[1]!, context);\n if (withinTextResult.type === \"error\") {\n return withinTextResult;\n }\n\n // Evaluate startNum argument (optional, defaults to 1)\n let startNumResult: FunctionEvaluationResult;\n if (node.args.length > 2) {\n startNumResult = this.evaluateNode(node.args[2]!, context);\n } else {\n startNumResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n }\n\n // Handle spilled-values inputs - return spilled-values for spilling\n if (\n findTextResult.type === \"spilled-values\" ||\n withinTextResult.type === \"spilled-values\" ||\n startNumResult.type === \"spilled-values\"\n ) {\n return createFindSpilledResult.call(this, {\n findTextResult,\n withinTextResult,\n startNumResult,\n context,\n });\n }\n\n if (findTextResult.type === \"awaiting-evaluation\") {\n return findTextResult;\n }\n if (withinTextResult.type === \"awaiting-evaluation\") {\n return withinTextResult;\n }\n\n // Strict type checking - no coercion\n if (findTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"FindText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (withinTextResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"WithinText argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n const result = findOperation(\n findTextResult,\n withinTextResult,\n startNumResult,\n context\n );\n\n // Handle error or awaiting evaluation results\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n\n return {\n type: \"value\",\n result: result,\n };\n },\n};\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "3F582CD466EECC4A64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,81 @@
1
+ // src/functions/text/left/left.ts
2
+ import {
3
+ FormulaError
4
+ } from "src/core/types";
5
+ import { midOperation, createMidSpilledResult } from "../text-helpers.mjs";
6
+ var LEFT = {
7
+ name: "LEFT",
8
+ evaluate: function(node, context) {
9
+ if (node.args.length < 1 || node.args.length > 2) {
10
+ return {
11
+ type: "error",
12
+ err: FormulaError.VALUE,
13
+ message: "LEFT function takes 1 or 2 arguments",
14
+ errAddress: context.dependencyNode
15
+ };
16
+ }
17
+ const textResult = this.evaluateNode(node.args[0], context);
18
+ if (textResult.type === "error") {
19
+ return textResult;
20
+ }
21
+ let numCharsResult;
22
+ if (node.args.length > 1) {
23
+ numCharsResult = this.evaluateNode(node.args[1], context);
24
+ if (numCharsResult.type === "error") {
25
+ return numCharsResult;
26
+ }
27
+ } else {
28
+ numCharsResult = {
29
+ type: "value",
30
+ result: { type: "number", value: 1 }
31
+ };
32
+ }
33
+ const startNumResult = {
34
+ type: "value",
35
+ result: { type: "number", value: 1 }
36
+ };
37
+ if (textResult.type === "spilled-values" || numCharsResult.type === "spilled-values") {
38
+ return createMidSpilledResult.call(this, {
39
+ textResult,
40
+ startNumResult,
41
+ numCharsResult,
42
+ context
43
+ });
44
+ }
45
+ if (textResult.type === "awaiting-evaluation") {
46
+ return textResult;
47
+ }
48
+ if (numCharsResult.type === "awaiting-evaluation") {
49
+ return numCharsResult;
50
+ }
51
+ if (textResult.result.type !== "string") {
52
+ return {
53
+ type: "error",
54
+ err: FormulaError.VALUE,
55
+ message: "Text argument must be a string",
56
+ errAddress: context.dependencyNode
57
+ };
58
+ }
59
+ if (numCharsResult.result.type !== "number") {
60
+ return {
61
+ type: "error",
62
+ err: FormulaError.VALUE,
63
+ message: "NumChars argument must be a number",
64
+ errAddress: context.dependencyNode
65
+ };
66
+ }
67
+ const result = midOperation(textResult, startNumResult, numCharsResult, context);
68
+ if (result.type === "error" || result.type === "awaiting-evaluation") {
69
+ return result;
70
+ }
71
+ return {
72
+ type: "value",
73
+ result: result.result
74
+ };
75
+ }
76
+ };
77
+ export {
78
+ LEFT
79
+ };
80
+
81
+ //# debugId=EDCCE625897AB07464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/functions/text/left/left.ts"],
4
+ "sourcesContent": [
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n} from \"src/core/types\";\nimport { midOperation, createMidSpilledResult } from \"../text-helpers.mjs\";\n\n/**\n * LEFT function - Returns the leftmost characters from a text string\n *\n * Usage: LEFT(text, num_chars)\n *\n * text: The text string to extract characters from.\n * num_chars: The number of characters to extract from the left side of the text.\n *\n * Example: LEFT(\"Hello, World!\", 5) returns \"Hello\"\n *\n * Note:\n * - If num_chars is less than 0, the function returns an error.\n * - If num_chars is greater than the length of text, the function returns the entire text.\n * - Supports dynamic arrays (spilled values) for both arguments\n * - Strict type checking: text must be string, num_chars must be number\n * - Implemented as MID(text, 1, num_chars)\n */\nexport const LEFT: FunctionDefinition = {\n name: \"LEFT\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length < 1 || node.args.length > 2) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEFT function takes 1 or 2 arguments\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate the text argument\n const textResult = this.evaluateNode(node.args[0]!, context);\n if (textResult.type === \"error\") {\n return textResult;\n }\n\n // Evaluate the numChars argument (optional, defaults to 1)\n let numCharsResult: FunctionEvaluationResult;\n if (node.args.length > 1) {\n numCharsResult = this.evaluateNode(node.args[1]!, context);\n if (numCharsResult.type === \"error\") {\n return numCharsResult;\n }\n } else {\n numCharsResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n }\n\n // Create start_num argument (always 1 for LEFT)\n const startNumResult: FunctionEvaluationResult = {\n type: \"value\",\n result: { type: \"number\", value: 1 },\n };\n\n // Handle spilled-values inputs using MID's spilled result handler\n if (textResult.type === \"spilled-values\" || numCharsResult.type === \"spilled-values\") {\n return createMidSpilledResult.call(this, {\n textResult,\n startNumResult,\n numCharsResult,\n context,\n });\n }\n\n // Both arguments are single values\n if (textResult.type === \"awaiting-evaluation\") {\n return textResult;\n }\n\n if (numCharsResult.type === \"awaiting-evaluation\") {\n return numCharsResult;\n }\n\n // Strict type checking - no coercion\n if (textResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (numCharsResult.result.type !== \"number\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"NumChars argument must be a number\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Use MID operation: LEFT(text, num_chars) = MID(text, 1, num_chars)\n const result = midOperation(textResult, startNumResult, numCharsResult, context);\n if (result.type === \"error\" || result.type === \"awaiting-evaluation\") {\n return result;\n }\n return {\n type: \"value\",\n result: result.result,\n };\n },\n};"
6
+ ],
7
+ "mappings": ";AAAA;AAAA;AAAA;AAKA;AAmBO,IAAM,OAA2B;AAAA,EACtC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MAChD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC3D,IAAI,WAAW,SAAS,SAAS;AAAA,MAC/B,OAAO;AAAA,IACT;AAAA,IAGA,IAAI;AAAA,IACJ,IAAI,KAAK,KAAK,SAAS,GAAG;AAAA,MACxB,iBAAiB,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,MACzD,IAAI,eAAe,SAAS,SAAS;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,IACF,EAAO;AAAA,MACL,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE;AAAA,MACrC;AAAA;AAAA,IAIF,MAAM,iBAA2C;AAAA,MAC/C,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU,OAAO,EAAE;AAAA,IACrC;AAAA,IAGA,IAAI,WAAW,SAAS,oBAAoB,eAAe,SAAS,kBAAkB;AAAA,MACpF,OAAO,uBAAuB,KAAK,MAAM;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAW,SAAS,uBAAuB;AAAA,MAC7C,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,SAAS,uBAAuB;AAAA,MACjD,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,eAAe,OAAO,SAAS,UAAU;AAAA,MAC3C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,SAAS,aAAa,YAAY,gBAAgB,gBAAgB,OAAO;AAAA,IAC/E,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,uBAAuB;AAAA,MACpE,OAAO;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,OAAO;AAAA,IACjB;AAAA;AAEJ;",
8
+ "debugId": "EDCCE625897AB07464756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,91 @@
1
+ // src/functions/text/len/len.ts
2
+ import {
3
+ FormulaError
4
+ } from "src/core/types";
5
+ var LEN = {
6
+ name: "LEN",
7
+ evaluate: function(node, context) {
8
+ if (node.args.length !== 1) {
9
+ return {
10
+ type: "error",
11
+ err: FormulaError.VALUE,
12
+ message: "LEN function takes exactly 1 argument",
13
+ errAddress: context.dependencyNode
14
+ };
15
+ }
16
+ const textResult = this.evaluateNode(node.args[0], context);
17
+ if (textResult.type === "error" || textResult.type === "awaiting-evaluation") {
18
+ return textResult;
19
+ }
20
+ if (textResult.type === "spilled-values") {
21
+ return createLenSpilledResult.call(this, {
22
+ textResult,
23
+ context
24
+ });
25
+ }
26
+ if (textResult.result.type !== "string") {
27
+ return {
28
+ type: "error",
29
+ err: FormulaError.VALUE,
30
+ message: "Text argument must be a string",
31
+ errAddress: context.dependencyNode
32
+ };
33
+ }
34
+ if (textResult.result.type === "string") {
35
+ return {
36
+ type: "value",
37
+ result: { type: "number", value: textResult.result.value.length }
38
+ };
39
+ }
40
+ return {
41
+ type: "error",
42
+ err: FormulaError.VALUE,
43
+ message: "LEN operation failed",
44
+ errAddress: context.dependencyNode
45
+ };
46
+ }
47
+ };
48
+ function createLenSpilledResult({
49
+ textResult,
50
+ context
51
+ }) {
52
+ if (textResult.type !== "spilled-values") {
53
+ return {
54
+ type: "error",
55
+ err: FormulaError.VALUE,
56
+ message: "createLenSpilledResult called without spilled values",
57
+ errAddress: context.dependencyNode
58
+ };
59
+ }
60
+ return {
61
+ type: "spilled-values",
62
+ spillArea: (origin) => textResult.spillArea(origin),
63
+ source: "LEN with spilled text values",
64
+ evaluate: (spillOffset, evalContext) => {
65
+ const spillTextResult = textResult.evaluate(spillOffset, evalContext);
66
+ if (!spillTextResult || spillTextResult.type === "error" || spillTextResult.type === "awaiting-evaluation") {
67
+ return spillTextResult;
68
+ }
69
+ if (spillTextResult.type !== "value" || spillTextResult.result.type !== "string") {
70
+ return {
71
+ type: "error",
72
+ err: FormulaError.VALUE,
73
+ message: "LEN operation failed",
74
+ errAddress: context.dependencyNode
75
+ };
76
+ }
77
+ return {
78
+ type: "value",
79
+ result: { type: "number", value: spillTextResult.result.value.length }
80
+ };
81
+ },
82
+ evaluateAllCells: (intersectingRange) => {
83
+ throw new Error("WIP: evaluateAllCells for LEN is not implemented");
84
+ }
85
+ };
86
+ }
87
+ export {
88
+ LEN
89
+ };
90
+
91
+ //# debugId=02DCC6D196B41BC564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/functions/text/len/len.ts"],
4
+ "sourcesContent": [
5
+ "import {\n FormulaError,\n type FunctionDefinition,\n type FunctionEvaluationResult,\n type CellNumber,\n type CellAddress,\n type SpreadsheetRange,\n} from \"src/core/types\";\nimport { convertToString } from \"../text-helpers.mjs\";\nimport type { FormulaEvaluator } from \"src/evaluator/formula-evaluator\";\nimport type { EvaluationContext } from \"src/evaluator/evaluation-context\";\n\n/**\n * LEN function - Returns the length of a text string\n *\n * Usage: LEN(text)\n *\n * text: The text string whose length you want to find.\n *\n * Example: LEN(\"Hello World\") returns 11\n *\n * Note:\n * - Supports dynamic arrays (spilled values) for the text argument\n * - Strict type checking: text must be string\n * - Returns the number of characters in the text string\n */\nexport const LEN: FunctionDefinition = {\n name: \"LEN\",\n evaluate: function (node, context): FunctionEvaluationResult {\n if (node.args.length !== 1) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN function takes exactly 1 argument\",\n errAddress: context.dependencyNode,\n };\n }\n\n // Evaluate the text argument\n const textResult = this.evaluateNode(node.args[0]!, context);\n if (\n textResult.type === \"error\" ||\n textResult.type === \"awaiting-evaluation\"\n ) {\n return textResult;\n }\n\n // Handle spilled-values input\n if (textResult.type === \"spilled-values\") {\n return createLenSpilledResult.call(this, {\n textResult,\n context,\n });\n }\n\n // Strict type checking - no coercion\n if (textResult.result.type !== \"string\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"Text argument must be a string\",\n errAddress: context.dependencyNode,\n };\n }\n\n if (textResult.result.type === \"string\") {\n return {\n type: \"value\",\n result: { type: \"number\", value: textResult.result.value.length },\n };\n }\n\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN operation failed\",\n errAddress: context.dependencyNode,\n };\n },\n};\n\n/**\n * Helper for creating spilled-values result for LEN function\n */\nfunction createLenSpilledResult(\n this: FormulaEvaluator,\n {\n textResult,\n context,\n }: {\n textResult: FunctionEvaluationResult;\n context: EvaluationContext;\n }\n): FunctionEvaluationResult {\n if (textResult.type !== \"spilled-values\") {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"createLenSpilledResult called without spilled values\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"spilled-values\",\n spillArea: (origin: CellAddress) => textResult.spillArea(origin),\n source: \"LEN with spilled text values\",\n evaluate: (spillOffset, evalContext) => {\n const spillTextResult = textResult.evaluate(spillOffset, evalContext);\n if (\n !spillTextResult ||\n spillTextResult.type === \"error\" ||\n spillTextResult.type === \"awaiting-evaluation\"\n ) {\n return spillTextResult;\n }\n\n if (\n spillTextResult.type !== \"value\" ||\n spillTextResult.result.type !== \"string\"\n ) {\n return {\n type: \"error\",\n err: FormulaError.VALUE,\n message: \"LEN operation failed\",\n errAddress: context.dependencyNode,\n };\n }\n\n return {\n type: \"value\",\n result: { type: \"number\", value: spillTextResult.result.value.length },\n };\n },\n evaluateAllCells: (intersectingRange) => {\n throw new Error(\"WIP: evaluateAllCells for LEN is not implemented\");\n },\n };\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AAAA;AAAA;AA0BO,IAAM,MAA0B;AAAA,EACrC,MAAM;AAAA,EACN,UAAU,QAAS,CAAC,MAAM,SAAmC;AAAA,IAC3D,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,MAC1B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,KAAK,aAAa,KAAK,KAAK,IAAK,OAAO;AAAA,IAC3D,IACE,WAAW,SAAS,WACpB,WAAW,SAAS,uBACpB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,WAAW,SAAS,kBAAkB;AAAA,MACxC,OAAO,uBAAuB,KAAK,MAAM;AAAA,QACvC;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAGA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,aAAa;AAAA,QAClB,SAAS;AAAA,QACT,YAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,IAAI,WAAW,OAAO,SAAS,UAAU;AAAA,MACvC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,WAAW,OAAO,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA;AAEJ;AAKA,SAAS,sBAAsB;AAAA,EAG3B;AAAA,EACA;AAAA,GAKwB;AAAA,EAC1B,IAAI,WAAW,SAAS,kBAAkB;AAAA,IACxC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,aAAa;AAAA,MAClB,SAAS;AAAA,MACT,YAAY,QAAQ;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,CAAC,WAAwB,WAAW,UAAU,MAAM;AAAA,IAC/D,QAAQ;AAAA,IACR,UAAU,CAAC,aAAa,gBAAgB;AAAA,MACtC,MAAM,kBAAkB,WAAW,SAAS,aAAa,WAAW;AAAA,MACpE,IACE,CAAC,mBACD,gBAAgB,SAAS,WACzB,gBAAgB,SAAS,uBACzB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IACE,gBAAgB,SAAS,WACzB,gBAAgB,OAAO,SAAS,UAChC;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,aAAa;AAAA,UAClB,SAAS;AAAA,UACT,YAAY,QAAQ;AAAA,QACtB;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,OAAO,gBAAgB,OAAO,MAAM,OAAO;AAAA,MACvE;AAAA;AAAA,IAEF,kBAAkB,CAAC,sBAAsB;AAAA,MACvC,MAAM,IAAI,MAAM,kDAAkD;AAAA;AAAA,EAEtE;AAAA;",
8
+ "debugId": "02DCC6D196B41BC564756E2164756E21",
9
+ "names": []
10
+ }