@ricsam/formula-engine 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) hide show
  1. package/README.md +100 -0
  2. package/dist/cjs/core/ast-traverser.cjs +124 -0
  3. package/dist/cjs/core/ast-traverser.cjs.map +10 -0
  4. package/dist/cjs/core/autofill-utils.cjs +304 -0
  5. package/dist/cjs/core/autofill-utils.cjs.map +10 -0
  6. package/dist/cjs/core/engine.cjs +390 -0
  7. package/dist/cjs/core/engine.cjs.map +10 -0
  8. package/dist/cjs/core/managers/cache-manager.cjs +58 -0
  9. package/dist/cjs/core/managers/cache-manager.cjs.map +10 -0
  10. package/dist/cjs/core/managers/dependency-manager.cjs +620 -0
  11. package/dist/cjs/core/managers/dependency-manager.cjs.map +10 -0
  12. package/dist/cjs/core/managers/dependency-node.cjs +24 -0
  13. package/dist/cjs/core/managers/dependency-node.cjs.map +9 -0
  14. package/dist/cjs/core/managers/evaluation-manager.cjs +433 -0
  15. package/dist/cjs/core/managers/evaluation-manager.cjs.map +10 -0
  16. package/dist/cjs/core/managers/event-manager.cjs +49 -0
  17. package/dist/cjs/core/managers/event-manager.cjs.map +10 -0
  18. package/dist/cjs/core/managers/frontier-dependency-manager.cjs +181 -0
  19. package/dist/cjs/core/managers/frontier-dependency-manager.cjs.map +10 -0
  20. package/dist/cjs/core/managers/index.cjs +49 -0
  21. package/dist/cjs/core/managers/index.cjs.map +10 -0
  22. package/dist/cjs/core/managers/isDependencyNode.cjs +44 -0
  23. package/dist/cjs/core/managers/isDependencyNode.cjs.map +10 -0
  24. package/dist/cjs/core/managers/named-expression-manager.cjs +379 -0
  25. package/dist/cjs/core/managers/named-expression-manager.cjs.map +10 -0
  26. package/dist/cjs/core/managers/range-eval-order-builder.cjs +644 -0
  27. package/dist/cjs/core/managers/range-eval-order-builder.cjs.map +10 -0
  28. package/dist/cjs/core/managers/table-manager.cjs +254 -0
  29. package/dist/cjs/core/managers/table-manager.cjs.map +10 -0
  30. package/dist/cjs/core/managers/workbook-manager.cjs +474 -0
  31. package/dist/cjs/core/managers/workbook-manager.cjs.map +10 -0
  32. package/dist/cjs/core/map-serializer.cjs +69 -0
  33. package/dist/cjs/core/map-serializer.cjs.map +10 -0
  34. package/dist/cjs/core/named-expression-renamer.cjs +88 -0
  35. package/dist/cjs/core/named-expression-renamer.cjs.map +10 -0
  36. package/dist/cjs/core/sheet-renamer.cjs +89 -0
  37. package/dist/cjs/core/sheet-renamer.cjs.map +10 -0
  38. package/dist/cjs/core/sheet-utils.cjs +39 -0
  39. package/dist/cjs/core/sheet-utils.cjs.map +10 -0
  40. package/dist/cjs/core/table-renamer.cjs +88 -0
  41. package/dist/cjs/core/table-renamer.cjs.map +10 -0
  42. package/dist/cjs/core/types.cjs +48 -0
  43. package/dist/cjs/core/types.cjs.map +10 -0
  44. package/dist/cjs/core/utils/range-serializer.cjs +65 -0
  45. package/dist/cjs/core/utils/range-serializer.cjs.map +10 -0
  46. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs +142 -0
  47. package/dist/cjs/core/utils/spreadsheet-visualizer.cjs.map +10 -0
  48. package/dist/cjs/core/utils.cjs +434 -0
  49. package/dist/cjs/core/utils.cjs.map +10 -0
  50. package/dist/cjs/core/workbook-renamer.cjs +106 -0
  51. package/dist/cjs/core/workbook-renamer.cjs.map +10 -0
  52. package/dist/cjs/debug/flags.cjs +47 -0
  53. package/dist/cjs/debug/flags.cjs.map +10 -0
  54. package/dist/cjs/evaluator/arithmetic/add/add.cjs +82 -0
  55. package/dist/cjs/evaluator/arithmetic/add/add.cjs.map +10 -0
  56. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs +107 -0
  57. package/dist/cjs/evaluator/arithmetic/divide/divide.cjs.map +10 -0
  58. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs +93 -0
  59. package/dist/cjs/evaluator/arithmetic/multiply/multiply.cjs.map +10 -0
  60. package/dist/cjs/evaluator/arithmetic/power/power.cjs +125 -0
  61. package/dist/cjs/evaluator/arithmetic/power/power.cjs.map +10 -0
  62. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs +84 -0
  63. package/dist/cjs/evaluator/arithmetic/subtract/subtract.cjs.map +10 -0
  64. package/dist/cjs/evaluator/comparison/equals.cjs +64 -0
  65. package/dist/cjs/evaluator/comparison/equals.cjs.map +10 -0
  66. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs +61 -0
  67. package/dist/cjs/evaluator/comparison/greater-than-or-equal.cjs.map +10 -0
  68. package/dist/cjs/evaluator/comparison/greater-than.cjs +61 -0
  69. package/dist/cjs/evaluator/comparison/greater-than.cjs.map +10 -0
  70. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs +69 -0
  71. package/dist/cjs/evaluator/comparison/less-than-or-equal.cjs.map +10 -0
  72. package/dist/cjs/evaluator/comparison/less-than.cjs +68 -0
  73. package/dist/cjs/evaluator/comparison/less-than.cjs.map +10 -0
  74. package/dist/cjs/evaluator/comparison/not-equals.cjs +53 -0
  75. package/dist/cjs/evaluator/comparison/not-equals.cjs.map +10 -0
  76. package/dist/cjs/evaluator/concatenation/concatenate.cjs +72 -0
  77. package/dist/cjs/evaluator/concatenation/concatenate.cjs.map +10 -0
  78. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs +58 -0
  79. package/dist/cjs/evaluator/dependency-nodes/ast-evaluation-node.cjs.map +10 -0
  80. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs +112 -0
  81. package/dist/cjs/evaluator/dependency-nodes/base-eval-node.cjs.map +10 -0
  82. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs +54 -0
  83. package/dist/cjs/evaluator/dependency-nodes/cell-value-node.cjs.map +10 -0
  84. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs +108 -0
  85. package/dist/cjs/evaluator/dependency-nodes/empty-cell-evaluation-node.cjs.map +10 -0
  86. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs +50 -0
  87. package/dist/cjs/evaluator/dependency-nodes/spill-meta-node.cjs.map +10 -0
  88. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs +254 -0
  89. package/dist/cjs/evaluator/evaluate-scalar-operator.cjs.map +10 -0
  90. package/dist/cjs/evaluator/evaluation-context.cjs +154 -0
  91. package/dist/cjs/evaluator/evaluation-context.cjs.map +10 -0
  92. package/dist/cjs/evaluator/evaluation-error.cjs +75 -0
  93. package/dist/cjs/evaluator/evaluation-error.cjs.map +10 -0
  94. package/dist/cjs/evaluator/formula-evaluator.cjs +797 -0
  95. package/dist/cjs/evaluator/formula-evaluator.cjs.map +10 -0
  96. package/dist/cjs/evaluator/range-evaluation-node.cjs +88 -0
  97. package/dist/cjs/evaluator/range-evaluation-node.cjs.map +10 -0
  98. package/dist/cjs/functions/_template/template.cjs +42 -0
  99. package/dist/cjs/functions/_template/template.cjs.map +10 -0
  100. package/dist/cjs/functions/array/sequence/sequence.cjs +315 -0
  101. package/dist/cjs/functions/array/sequence/sequence.cjs.map +10 -0
  102. package/dist/cjs/functions/criteria-parser.cjs +217 -0
  103. package/dist/cjs/functions/criteria-parser.cjs.map +10 -0
  104. package/dist/cjs/functions/criteria-utils.cjs +291 -0
  105. package/dist/cjs/functions/criteria-utils.cjs.map +10 -0
  106. package/dist/cjs/functions/function-utils.cjs +63 -0
  107. package/dist/cjs/functions/function-utils.cjs.map +10 -0
  108. package/dist/cjs/functions/index.cjs +125 -0
  109. package/dist/cjs/functions/index.cjs.map +10 -0
  110. package/dist/cjs/functions/information/cell/cell.cjs +196 -0
  111. package/dist/cjs/functions/information/cell/cell.cjs.map +10 -0
  112. package/dist/cjs/functions/information/column/column.cjs +144 -0
  113. package/dist/cjs/functions/information/column/column.cjs.map +10 -0
  114. package/dist/cjs/functions/information/row/row.cjs +150 -0
  115. package/dist/cjs/functions/information/row/row.cjs.map +10 -0
  116. package/dist/cjs/functions/logical/and/and.cjs +112 -0
  117. package/dist/cjs/functions/logical/and/and.cjs.map +10 -0
  118. package/dist/cjs/functions/logical/if/if.cjs +195 -0
  119. package/dist/cjs/functions/logical/if/if.cjs.map +10 -0
  120. package/dist/cjs/functions/logical/iferror/iferror.cjs +126 -0
  121. package/dist/cjs/functions/logical/iferror/iferror.cjs.map +10 -0
  122. package/dist/cjs/functions/logical/or/or.cjs +112 -0
  123. package/dist/cjs/functions/logical/or/or.cjs.map +10 -0
  124. package/dist/cjs/functions/lookup/count/count-utils.cjs +65 -0
  125. package/dist/cjs/functions/lookup/count/count-utils.cjs.map +10 -0
  126. package/dist/cjs/functions/lookup/count/count.cjs +48 -0
  127. package/dist/cjs/functions/lookup/count/count.cjs.map +10 -0
  128. package/dist/cjs/functions/lookup/count/countif.cjs +94 -0
  129. package/dist/cjs/functions/lookup/count/countif.cjs.map +10 -0
  130. package/dist/cjs/functions/lookup/count/countifs.cjs +63 -0
  131. package/dist/cjs/functions/lookup/count/countifs.cjs.map +10 -0
  132. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs +187 -0
  133. package/dist/cjs/functions/lookup/index-lookup/index-lookup.cjs.map +10 -0
  134. package/dist/cjs/functions/lookup/match/match.cjs +168 -0
  135. package/dist/cjs/functions/lookup/match/match.cjs.map +10 -0
  136. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs +410 -0
  137. package/dist/cjs/functions/lookup/xlookup/xlookup.cjs.map +10 -0
  138. package/dist/cjs/functions/math/average/average-utils.cjs +72 -0
  139. package/dist/cjs/functions/math/average/average-utils.cjs.map +10 -0
  140. package/dist/cjs/functions/math/average/average.cjs +48 -0
  141. package/dist/cjs/functions/math/average/average.cjs.map +10 -0
  142. package/dist/cjs/functions/math/average/averageif.cjs +83 -0
  143. package/dist/cjs/functions/math/average/averageif.cjs.map +10 -0
  144. package/dist/cjs/functions/math/average/averageifs.cjs +61 -0
  145. package/dist/cjs/functions/math/average/averageifs.cjs.map +10 -0
  146. package/dist/cjs/functions/math/ceiling/ceiling.cjs +219 -0
  147. package/dist/cjs/functions/math/ceiling/ceiling.cjs.map +10 -0
  148. package/dist/cjs/functions/math/max/max-utils.cjs +71 -0
  149. package/dist/cjs/functions/math/max/max-utils.cjs.map +10 -0
  150. package/dist/cjs/functions/math/max/max.cjs +48 -0
  151. package/dist/cjs/functions/math/max/max.cjs.map +10 -0
  152. package/dist/cjs/functions/math/max/maxif.cjs +83 -0
  153. package/dist/cjs/functions/math/max/maxif.cjs.map +10 -0
  154. package/dist/cjs/functions/math/max/maxifs.cjs +61 -0
  155. package/dist/cjs/functions/math/max/maxifs.cjs.map +10 -0
  156. package/dist/cjs/functions/math/min/min-utils.cjs +71 -0
  157. package/dist/cjs/functions/math/min/min-utils.cjs.map +10 -0
  158. package/dist/cjs/functions/math/min/min.cjs +48 -0
  159. package/dist/cjs/functions/math/min/min.cjs.map +10 -0
  160. package/dist/cjs/functions/math/min/minif.cjs +83 -0
  161. package/dist/cjs/functions/math/min/minif.cjs.map +10 -0
  162. package/dist/cjs/functions/math/min/minifs.cjs +61 -0
  163. package/dist/cjs/functions/math/min/minifs.cjs.map +10 -0
  164. package/dist/cjs/functions/math/sum/sum.cjs +48 -0
  165. package/dist/cjs/functions/math/sum/sum.cjs.map +10 -0
  166. package/dist/cjs/functions/math/sum/sumif.cjs +83 -0
  167. package/dist/cjs/functions/math/sum/sumif.cjs.map +10 -0
  168. package/dist/cjs/functions/math/sum/sumifs.cjs +60 -0
  169. package/dist/cjs/functions/math/sum/sumifs.cjs.map +10 -0
  170. package/dist/cjs/functions/math/sum/summation-utils.cjs +57 -0
  171. package/dist/cjs/functions/math/sum/summation-utils.cjs.map +10 -0
  172. package/dist/cjs/functions/reference/address/address.cjs +163 -0
  173. package/dist/cjs/functions/reference/address/address.cjs.map +10 -0
  174. package/dist/cjs/functions/reference/indirect/indirect.cjs +102 -0
  175. package/dist/cjs/functions/reference/indirect/indirect.cjs.map +10 -0
  176. package/dist/cjs/functions/reference/offset/offset.cjs +233 -0
  177. package/dist/cjs/functions/reference/offset/offset.cjs.map +10 -0
  178. package/dist/cjs/functions/text/concatenate/concatenate.cjs +167 -0
  179. package/dist/cjs/functions/text/concatenate/concatenate.cjs.map +10 -0
  180. package/dist/cjs/functions/text/exact/exact.cjs +171 -0
  181. package/dist/cjs/functions/text/exact/exact.cjs.map +10 -0
  182. package/dist/cjs/functions/text/find/find.cjs +397 -0
  183. package/dist/cjs/functions/text/find/find.cjs.map +10 -0
  184. package/dist/cjs/functions/text/left/left.cjs +109 -0
  185. package/dist/cjs/functions/text/left/left.cjs.map +10 -0
  186. package/dist/cjs/functions/text/len/len.cjs +119 -0
  187. package/dist/cjs/functions/text/len/len.cjs.map +10 -0
  188. package/dist/cjs/functions/text/mid/mid.cjs +103 -0
  189. package/dist/cjs/functions/text/mid/mid.cjs.map +10 -0
  190. package/dist/cjs/functions/text/right/right.cjs +167 -0
  191. package/dist/cjs/functions/text/right/right.cjs.map +10 -0
  192. package/dist/cjs/functions/text/text-helpers.cjs +179 -0
  193. package/dist/cjs/functions/text/text-helpers.cjs.map +10 -0
  194. package/dist/cjs/functions/text/textjoin/textjoin.cjs +173 -0
  195. package/dist/cjs/functions/text/textjoin/textjoin.cjs.map +10 -0
  196. package/dist/cjs/package.json +5 -0
  197. package/dist/cjs/parser/ast.cjs +175 -0
  198. package/dist/cjs/parser/ast.cjs.map +10 -0
  199. package/dist/cjs/parser/formatter.cjs +319 -0
  200. package/dist/cjs/parser/formatter.cjs.map +10 -0
  201. package/dist/cjs/parser/grammar.cjs +375 -0
  202. package/dist/cjs/parser/grammar.cjs.map +10 -0
  203. package/dist/cjs/parser/lexer.cjs +443 -0
  204. package/dist/cjs/parser/lexer.cjs.map +10 -0
  205. package/dist/cjs/parser/parser.cjs +1700 -0
  206. package/dist/cjs/parser/parser.cjs.map +10 -0
  207. package/dist/cjs/react/hooks.cjs +59 -0
  208. package/dist/cjs/react/hooks.cjs.map +10 -0
  209. package/dist/mjs/core/ast-traverser.mjs +94 -0
  210. package/dist/mjs/core/ast-traverser.mjs.map +10 -0
  211. package/dist/mjs/core/autofill-utils.mjs +274 -0
  212. package/dist/mjs/core/autofill-utils.mjs.map +10 -0
  213. package/dist/mjs/core/engine.mjs +366 -0
  214. package/dist/mjs/core/engine.mjs.map +10 -0
  215. package/dist/mjs/core/managers/cache-manager.mjs +27 -0
  216. package/dist/mjs/core/managers/cache-manager.mjs.map +10 -0
  217. package/dist/mjs/core/managers/dependency-manager.mjs +593 -0
  218. package/dist/mjs/core/managers/dependency-manager.mjs.map +10 -0
  219. package/dist/mjs/core/managers/dependency-node.mjs +2 -0
  220. package/dist/mjs/core/managers/dependency-node.mjs.map +9 -0
  221. package/dist/mjs/core/managers/evaluation-manager.mjs +415 -0
  222. package/dist/mjs/core/managers/evaluation-manager.mjs.map +10 -0
  223. package/dist/mjs/core/managers/event-manager.mjs +18 -0
  224. package/dist/mjs/core/managers/event-manager.mjs.map +10 -0
  225. package/dist/mjs/core/managers/frontier-dependency-manager.mjs +151 -0
  226. package/dist/mjs/core/managers/frontier-dependency-manager.mjs.map +10 -0
  227. package/dist/mjs/core/managers/index.mjs +21 -0
  228. package/dist/mjs/core/managers/index.mjs.map +10 -0
  229. package/dist/mjs/core/managers/isDependencyNode.mjs +14 -0
  230. package/dist/mjs/core/managers/isDependencyNode.mjs.map +10 -0
  231. package/dist/mjs/core/managers/named-expression-manager.mjs +348 -0
  232. package/dist/mjs/core/managers/named-expression-manager.mjs.map +10 -0
  233. package/dist/mjs/core/managers/range-eval-order-builder.mjs +618 -0
  234. package/dist/mjs/core/managers/range-eval-order-builder.mjs.map +10 -0
  235. package/dist/mjs/core/managers/table-manager.mjs +224 -0
  236. package/dist/mjs/core/managers/table-manager.mjs.map +10 -0
  237. package/dist/mjs/core/managers/workbook-manager.mjs +447 -0
  238. package/dist/mjs/core/managers/workbook-manager.mjs.map +10 -0
  239. package/dist/mjs/core/map-serializer.mjs +39 -0
  240. package/dist/mjs/core/map-serializer.mjs.map +10 -0
  241. package/dist/mjs/core/named-expression-renamer.mjs +58 -0
  242. package/dist/mjs/core/named-expression-renamer.mjs.map +10 -0
  243. package/dist/mjs/core/sheet-renamer.mjs +59 -0
  244. package/dist/mjs/core/sheet-renamer.mjs.map +10 -0
  245. package/dist/mjs/core/sheet-utils.mjs +8 -0
  246. package/dist/mjs/core/sheet-utils.mjs.map +10 -0
  247. package/dist/mjs/core/table-renamer.mjs +58 -0
  248. package/dist/mjs/core/table-renamer.mjs.map +10 -0
  249. package/dist/mjs/core/types.mjs +18 -0
  250. package/dist/mjs/core/types.mjs.map +10 -0
  251. package/dist/mjs/core/utils/range-serializer.mjs +35 -0
  252. package/dist/mjs/core/utils/range-serializer.mjs.map +10 -0
  253. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs +112 -0
  254. package/dist/mjs/core/utils/spreadsheet-visualizer.mjs.map +10 -0
  255. package/dist/mjs/core/utils.mjs +409 -0
  256. package/dist/mjs/core/utils.mjs.map +10 -0
  257. package/dist/mjs/core/workbook-renamer.mjs +76 -0
  258. package/dist/mjs/core/workbook-renamer.mjs.map +10 -0
  259. package/dist/mjs/debug/flags.mjs +17 -0
  260. package/dist/mjs/debug/flags.mjs.map +10 -0
  261. package/dist/mjs/evaluator/arithmetic/add/add.mjs +52 -0
  262. package/dist/mjs/evaluator/arithmetic/add/add.mjs.map +10 -0
  263. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs +77 -0
  264. package/dist/mjs/evaluator/arithmetic/divide/divide.mjs.map +10 -0
  265. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs +63 -0
  266. package/dist/mjs/evaluator/arithmetic/multiply/multiply.mjs.map +10 -0
  267. package/dist/mjs/evaluator/arithmetic/power/power.mjs +95 -0
  268. package/dist/mjs/evaluator/arithmetic/power/power.mjs.map +10 -0
  269. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs +54 -0
  270. package/dist/mjs/evaluator/arithmetic/subtract/subtract.mjs.map +10 -0
  271. package/dist/mjs/evaluator/comparison/equals.mjs +34 -0
  272. package/dist/mjs/evaluator/comparison/equals.mjs.map +10 -0
  273. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs +31 -0
  274. package/dist/mjs/evaluator/comparison/greater-than-or-equal.mjs.map +10 -0
  275. package/dist/mjs/evaluator/comparison/greater-than.mjs +31 -0
  276. package/dist/mjs/evaluator/comparison/greater-than.mjs.map +10 -0
  277. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs +39 -0
  278. package/dist/mjs/evaluator/comparison/less-than-or-equal.mjs.map +10 -0
  279. package/dist/mjs/evaluator/comparison/less-than.mjs +38 -0
  280. package/dist/mjs/evaluator/comparison/less-than.mjs.map +10 -0
  281. package/dist/mjs/evaluator/comparison/not-equals.mjs +23 -0
  282. package/dist/mjs/evaluator/comparison/not-equals.mjs.map +10 -0
  283. package/dist/mjs/evaluator/concatenation/concatenate.mjs +42 -0
  284. package/dist/mjs/evaluator/concatenation/concatenate.mjs.map +10 -0
  285. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs +28 -0
  286. package/dist/mjs/evaluator/dependency-nodes/ast-evaluation-node.mjs.map +10 -0
  287. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs +81 -0
  288. package/dist/mjs/evaluator/dependency-nodes/base-eval-node.mjs.map +10 -0
  289. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs +24 -0
  290. package/dist/mjs/evaluator/dependency-nodes/cell-value-node.mjs.map +10 -0
  291. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs +78 -0
  292. package/dist/mjs/evaluator/dependency-nodes/empty-cell-evaluation-node.mjs.map +10 -0
  293. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs +20 -0
  294. package/dist/mjs/evaluator/dependency-nodes/spill-meta-node.mjs.map +10 -0
  295. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs +226 -0
  296. package/dist/mjs/evaluator/evaluate-scalar-operator.mjs.map +10 -0
  297. package/dist/mjs/evaluator/evaluation-context.mjs +123 -0
  298. package/dist/mjs/evaluator/evaluation-context.mjs.map +10 -0
  299. package/dist/mjs/evaluator/evaluation-error.mjs +44 -0
  300. package/dist/mjs/evaluator/evaluation-error.mjs.map +10 -0
  301. package/dist/mjs/evaluator/formula-evaluator.mjs +780 -0
  302. package/dist/mjs/evaluator/formula-evaluator.mjs.map +10 -0
  303. package/dist/mjs/evaluator/range-evaluation-node.mjs +58 -0
  304. package/dist/mjs/evaluator/range-evaluation-node.mjs.map +10 -0
  305. package/dist/mjs/functions/_template/template.mjs +12 -0
  306. package/dist/mjs/functions/_template/template.mjs.map +10 -0
  307. package/dist/mjs/functions/array/sequence/sequence.mjs +287 -0
  308. package/dist/mjs/functions/array/sequence/sequence.mjs.map +10 -0
  309. package/dist/mjs/functions/criteria-parser.mjs +187 -0
  310. package/dist/mjs/functions/criteria-parser.mjs.map +10 -0
  311. package/dist/mjs/functions/criteria-utils.mjs +268 -0
  312. package/dist/mjs/functions/criteria-utils.mjs.map +10 -0
  313. package/dist/mjs/functions/function-utils.mjs +33 -0
  314. package/dist/mjs/functions/function-utils.mjs.map +10 -0
  315. package/dist/mjs/functions/index.mjs +95 -0
  316. package/dist/mjs/functions/index.mjs.map +10 -0
  317. package/dist/mjs/functions/information/cell/cell.mjs +168 -0
  318. package/dist/mjs/functions/information/cell/cell.mjs.map +10 -0
  319. package/dist/mjs/functions/information/column/column.mjs +120 -0
  320. package/dist/mjs/functions/information/column/column.mjs.map +10 -0
  321. package/dist/mjs/functions/information/row/row.mjs +126 -0
  322. package/dist/mjs/functions/information/row/row.mjs.map +10 -0
  323. package/dist/mjs/functions/logical/and/and.mjs +84 -0
  324. package/dist/mjs/functions/logical/and/and.mjs.map +10 -0
  325. package/dist/mjs/functions/logical/if/if.mjs +167 -0
  326. package/dist/mjs/functions/logical/if/if.mjs.map +10 -0
  327. package/dist/mjs/functions/logical/iferror/iferror.mjs +98 -0
  328. package/dist/mjs/functions/logical/iferror/iferror.mjs.map +10 -0
  329. package/dist/mjs/functions/logical/or/or.mjs +84 -0
  330. package/dist/mjs/functions/logical/or/or.mjs.map +10 -0
  331. package/dist/mjs/functions/lookup/count/count-utils.mjs +35 -0
  332. package/dist/mjs/functions/lookup/count/count-utils.mjs.map +10 -0
  333. package/dist/mjs/functions/lookup/count/count.mjs +18 -0
  334. package/dist/mjs/functions/lookup/count/count.mjs.map +10 -0
  335. package/dist/mjs/functions/lookup/count/countif.mjs +68 -0
  336. package/dist/mjs/functions/lookup/count/countif.mjs.map +10 -0
  337. package/dist/mjs/functions/lookup/count/countifs.mjs +37 -0
  338. package/dist/mjs/functions/lookup/count/countifs.mjs.map +10 -0
  339. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs +159 -0
  340. package/dist/mjs/functions/lookup/index-lookup/index-lookup.mjs.map +10 -0
  341. package/dist/mjs/functions/lookup/match/match.mjs +140 -0
  342. package/dist/mjs/functions/lookup/match/match.mjs.map +10 -0
  343. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs +382 -0
  344. package/dist/mjs/functions/lookup/xlookup/xlookup.mjs.map +10 -0
  345. package/dist/mjs/functions/math/average/average-utils.mjs +44 -0
  346. package/dist/mjs/functions/math/average/average-utils.mjs.map +10 -0
  347. package/dist/mjs/functions/math/average/average.mjs +18 -0
  348. package/dist/mjs/functions/math/average/average.mjs.map +10 -0
  349. package/dist/mjs/functions/math/average/averageif.mjs +58 -0
  350. package/dist/mjs/functions/math/average/averageif.mjs.map +10 -0
  351. package/dist/mjs/functions/math/average/averageifs.mjs +35 -0
  352. package/dist/mjs/functions/math/average/averageifs.mjs.map +10 -0
  353. package/dist/mjs/functions/math/ceiling/ceiling.mjs +191 -0
  354. package/dist/mjs/functions/math/ceiling/ceiling.mjs.map +10 -0
  355. package/dist/mjs/functions/math/max/max-utils.mjs +43 -0
  356. package/dist/mjs/functions/math/max/max-utils.mjs.map +10 -0
  357. package/dist/mjs/functions/math/max/max.mjs +18 -0
  358. package/dist/mjs/functions/math/max/max.mjs.map +10 -0
  359. package/dist/mjs/functions/math/max/maxif.mjs +58 -0
  360. package/dist/mjs/functions/math/max/maxif.mjs.map +10 -0
  361. package/dist/mjs/functions/math/max/maxifs.mjs +35 -0
  362. package/dist/mjs/functions/math/max/maxifs.mjs.map +10 -0
  363. package/dist/mjs/functions/math/min/min-utils.mjs +43 -0
  364. package/dist/mjs/functions/math/min/min-utils.mjs.map +10 -0
  365. package/dist/mjs/functions/math/min/min.mjs +18 -0
  366. package/dist/mjs/functions/math/min/min.mjs.map +10 -0
  367. package/dist/mjs/functions/math/min/minif.mjs +58 -0
  368. package/dist/mjs/functions/math/min/minif.mjs.map +10 -0
  369. package/dist/mjs/functions/math/min/minifs.mjs +35 -0
  370. package/dist/mjs/functions/math/min/minifs.mjs.map +10 -0
  371. package/dist/mjs/functions/math/sum/sum.mjs +18 -0
  372. package/dist/mjs/functions/math/sum/sum.mjs.map +10 -0
  373. package/dist/mjs/functions/math/sum/sumif.mjs +58 -0
  374. package/dist/mjs/functions/math/sum/sumif.mjs.map +10 -0
  375. package/dist/mjs/functions/math/sum/sumifs.mjs +34 -0
  376. package/dist/mjs/functions/math/sum/sumifs.mjs.map +10 -0
  377. package/dist/mjs/functions/math/sum/summation-utils.mjs +27 -0
  378. package/dist/mjs/functions/math/sum/summation-utils.mjs.map +10 -0
  379. package/dist/mjs/functions/reference/address/address.mjs +135 -0
  380. package/dist/mjs/functions/reference/address/address.mjs.map +10 -0
  381. package/dist/mjs/functions/reference/indirect/indirect.mjs +74 -0
  382. package/dist/mjs/functions/reference/indirect/indirect.mjs.map +10 -0
  383. package/dist/mjs/functions/reference/offset/offset.mjs +205 -0
  384. package/dist/mjs/functions/reference/offset/offset.mjs.map +10 -0
  385. package/dist/mjs/functions/text/concatenate/concatenate.mjs +139 -0
  386. package/dist/mjs/functions/text/concatenate/concatenate.mjs.map +10 -0
  387. package/dist/mjs/functions/text/exact/exact.mjs +143 -0
  388. package/dist/mjs/functions/text/exact/exact.mjs.map +10 -0
  389. package/dist/mjs/functions/text/find/find.mjs +369 -0
  390. package/dist/mjs/functions/text/find/find.mjs.map +10 -0
  391. package/dist/mjs/functions/text/left/left.mjs +81 -0
  392. package/dist/mjs/functions/text/left/left.mjs.map +10 -0
  393. package/dist/mjs/functions/text/len/len.mjs +91 -0
  394. package/dist/mjs/functions/text/len/len.mjs.map +10 -0
  395. package/dist/mjs/functions/text/mid/mid.mjs +75 -0
  396. package/dist/mjs/functions/text/mid/mid.mjs.map +10 -0
  397. package/dist/mjs/functions/text/right/right.mjs +143 -0
  398. package/dist/mjs/functions/text/right/right.mjs.map +10 -0
  399. package/dist/mjs/functions/text/text-helpers.mjs +151 -0
  400. package/dist/mjs/functions/text/text-helpers.mjs.map +10 -0
  401. package/dist/mjs/functions/text/textjoin/textjoin.mjs +145 -0
  402. package/dist/mjs/functions/text/textjoin/textjoin.mjs.map +10 -0
  403. package/dist/mjs/package.json +5 -0
  404. package/dist/mjs/parser/ast.mjs +145 -0
  405. package/dist/mjs/parser/ast.mjs.map +10 -0
  406. package/dist/mjs/parser/formatter.mjs +289 -0
  407. package/dist/mjs/parser/formatter.mjs.map +10 -0
  408. package/dist/mjs/parser/grammar.mjs +345 -0
  409. package/dist/mjs/parser/grammar.mjs.map +10 -0
  410. package/dist/mjs/parser/lexer.mjs +412 -0
  411. package/dist/mjs/parser/lexer.mjs.map +10 -0
  412. package/dist/mjs/parser/parser.mjs +1692 -0
  413. package/dist/mjs/parser/parser.mjs.map +10 -0
  414. package/dist/mjs/react/hooks.mjs +16 -0
  415. package/dist/mjs/react/hooks.mjs.map +10 -0
  416. package/dist/types/core/ast-traverser.d.ts +28 -0
  417. package/dist/types/core/autofill-utils.d.ts +32 -0
  418. package/dist/types/core/engine.d.ts +184 -0
  419. package/dist/types/core/managers/cache-manager.d.ts +14 -0
  420. package/dist/types/core/managers/dependency-manager.d.ts +147 -0
  421. package/dist/types/core/managers/dependency-node.d.ts +13 -0
  422. package/dist/types/core/managers/evaluation-manager.d.ts +30 -0
  423. package/dist/types/core/managers/event-manager.d.ts +8 -0
  424. package/dist/types/core/managers/frontier-dependency-manager.d.ts +69 -0
  425. package/dist/types/core/managers/index.d.ts +7 -0
  426. package/dist/types/core/managers/isDependencyNode.d.ts +2 -0
  427. package/dist/types/core/managers/named-expression-manager.d.ts +101 -0
  428. package/dist/types/core/managers/range-eval-order-builder.d.ts +33 -0
  429. package/dist/types/core/managers/table-manager.d.ts +84 -0
  430. package/dist/types/core/managers/workbook-manager.d.ts +136 -0
  431. package/dist/types/core/map-serializer.d.ts +4 -0
  432. package/dist/types/core/named-expression-renamer.d.ts +21 -0
  433. package/dist/types/core/sheet-renamer.d.ts +28 -0
  434. package/dist/types/core/sheet-utils.d.ts +2 -0
  435. package/dist/types/core/table-renamer.d.ts +21 -0
  436. package/dist/types/core/types.d.ts +272 -0
  437. package/dist/types/core/utils/cell-address-parsing.test.d.ts +1 -0
  438. package/dist/types/core/utils/range-serializer.d.ts +22 -0
  439. package/dist/types/core/utils/range-serializer.test.d.ts +1 -0
  440. package/dist/types/core/utils/spreadsheet-visualizer.d.ts +30 -0
  441. package/dist/types/core/utils.d.ts +48 -0
  442. package/dist/types/core/workbook-renamer.d.ts +28 -0
  443. package/dist/types/debug/flags.d.ts +11 -0
  444. package/dist/types/evaluator/arithmetic/add/add.d.ts +2 -0
  445. package/dist/types/evaluator/arithmetic/add/add.test.d.ts +1 -0
  446. package/dist/types/evaluator/arithmetic/divide/divide.d.ts +2 -0
  447. package/dist/types/evaluator/arithmetic/divide/divide.test.d.ts +1 -0
  448. package/dist/types/evaluator/arithmetic/multiply/multiply.d.ts +2 -0
  449. package/dist/types/evaluator/arithmetic/multiply/multiply.test.d.ts +1 -0
  450. package/dist/types/evaluator/arithmetic/power/power.d.ts +2 -0
  451. package/dist/types/evaluator/arithmetic/power/power.test.d.ts +1 -0
  452. package/dist/types/evaluator/arithmetic/subtract/subtract.d.ts +2 -0
  453. package/dist/types/evaluator/arithmetic/subtract/subtract.test.d.ts +1 -0
  454. package/dist/types/evaluator/comparison/comparison-operators.test.d.ts +1 -0
  455. package/dist/types/evaluator/comparison/equals.d.ts +6 -0
  456. package/dist/types/evaluator/comparison/greater-than-or-equal.d.ts +6 -0
  457. package/dist/types/evaluator/comparison/greater-than.d.ts +6 -0
  458. package/dist/types/evaluator/comparison/less-than-or-equal.d.ts +6 -0
  459. package/dist/types/evaluator/comparison/less-than.d.ts +6 -0
  460. package/dist/types/evaluator/comparison/not-equals.d.ts +6 -0
  461. package/dist/types/evaluator/concatenation/concatenate.d.ts +6 -0
  462. package/dist/types/evaluator/concatenation/concatenate.test.d.ts +1 -0
  463. package/dist/types/evaluator/dependency-nodes/ast-evaluation-node.d.ts +12 -0
  464. package/dist/types/evaluator/dependency-nodes/base-eval-node.d.ts +31 -0
  465. package/dist/types/evaluator/dependency-nodes/cell-value-node.d.ts +10 -0
  466. package/dist/types/evaluator/dependency-nodes/empty-cell-evaluation-node.d.ts +17 -0
  467. package/dist/types/evaluator/dependency-nodes/spill-meta-node.d.ts +7 -0
  468. package/dist/types/evaluator/evaluate-scalar-operator.d.ts +12 -0
  469. package/dist/types/evaluator/evaluation-context.d.ts +66 -0
  470. package/dist/types/evaluator/evaluation-error.d.ts +20 -0
  471. package/dist/types/evaluator/formula-evaluator.d.ts +67 -0
  472. package/dist/types/evaluator/open-range-evaluator.test.d.ts +1 -0
  473. package/dist/types/evaluator/range-evaluation-node.d.ts +16 -0
  474. package/dist/types/functions/_template/template.d.ts +5 -0
  475. package/dist/types/functions/_template/template.test.d.ts +1 -0
  476. package/dist/types/functions/array/sequence/performance-test.d.ts +1 -0
  477. package/dist/types/functions/array/sequence/sequence.d.ts +14 -0
  478. package/dist/types/functions/array/sequence/sequence.test.d.ts +1 -0
  479. package/dist/types/functions/criteria-parser.d.ts +27 -0
  480. package/dist/types/functions/criteria-utils.d.ts +61 -0
  481. package/dist/types/functions/function-utils.d.ts +21 -0
  482. package/dist/types/functions/index.d.ts +2 -0
  483. package/dist/types/functions/information/cell/cell.d.ts +24 -0
  484. package/dist/types/functions/information/cell/cell.test.d.ts +1 -0
  485. package/dist/types/functions/information/column/column.d.ts +14 -0
  486. package/dist/types/functions/information/column/column.test.d.ts +1 -0
  487. package/dist/types/functions/information/row/row.d.ts +14 -0
  488. package/dist/types/functions/information/row/row.test.d.ts +1 -0
  489. package/dist/types/functions/logical/and/and.d.ts +5 -0
  490. package/dist/types/functions/logical/and/and.test.d.ts +1 -0
  491. package/dist/types/functions/logical/if/if.d.ts +5 -0
  492. package/dist/types/functions/logical/if/if.test.d.ts +1 -0
  493. package/dist/types/functions/logical/iferror/iferror.d.ts +5 -0
  494. package/dist/types/functions/logical/iferror/iferror.test.d.ts +1 -0
  495. package/dist/types/functions/logical/or/or.d.ts +5 -0
  496. package/dist/types/functions/logical/or/or.test.d.ts +1 -0
  497. package/dist/types/functions/lookup/count/count-utils.d.ts +14 -0
  498. package/dist/types/functions/lookup/count/count.d.ts +21 -0
  499. package/dist/types/functions/lookup/count/count.test.d.ts +1 -0
  500. package/dist/types/functions/lookup/count/countif.d.ts +26 -0
  501. package/dist/types/functions/lookup/count/countif.test.d.ts +1 -0
  502. package/dist/types/functions/lookup/count/countifs.d.ts +21 -0
  503. package/dist/types/functions/lookup/count/countifs.test.d.ts +1 -0
  504. package/dist/types/functions/lookup/index-lookup/index-lookup.d.ts +2 -0
  505. package/dist/types/functions/lookup/index-lookup/index-lookup.test.d.ts +1 -0
  506. package/dist/types/functions/lookup/match/match.d.ts +2 -0
  507. package/dist/types/functions/lookup/match/match.test.d.ts +1 -0
  508. package/dist/types/functions/lookup/xlookup/xlookup.d.ts +2 -0
  509. package/dist/types/functions/lookup/xlookup/xlookup.test.d.ts +1 -0
  510. package/dist/types/functions/math/average/average-utils.d.ts +10 -0
  511. package/dist/types/functions/math/average/average.d.ts +18 -0
  512. package/dist/types/functions/math/average/average.test.d.ts +1 -0
  513. package/dist/types/functions/math/average/averageif.d.ts +23 -0
  514. package/dist/types/functions/math/average/averageif.test.d.ts +1 -0
  515. package/dist/types/functions/math/average/averageifs.d.ts +21 -0
  516. package/dist/types/functions/math/average/averageifs.test.d.ts +1 -0
  517. package/dist/types/functions/math/ceiling/ceiling.d.ts +5 -0
  518. package/dist/types/functions/math/ceiling/ceiling.test.d.ts +1 -0
  519. package/dist/types/functions/math/max/max-utils.d.ts +20 -0
  520. package/dist/types/functions/math/max/max.d.ts +18 -0
  521. package/dist/types/functions/math/max/max.test.d.ts +1 -0
  522. package/dist/types/functions/math/max/maxif.d.ts +23 -0
  523. package/dist/types/functions/math/max/maxif.test.d.ts +1 -0
  524. package/dist/types/functions/math/max/maxifs.d.ts +21 -0
  525. package/dist/types/functions/math/max/maxifs.test.d.ts +1 -0
  526. package/dist/types/functions/math/min/min-utils.d.ts +20 -0
  527. package/dist/types/functions/math/min/min.d.ts +5 -0
  528. package/dist/types/functions/math/min/min.test.d.ts +1 -0
  529. package/dist/types/functions/math/min/minif.d.ts +23 -0
  530. package/dist/types/functions/math/min/minif.test.d.ts +1 -0
  531. package/dist/types/functions/math/min/minifs.d.ts +21 -0
  532. package/dist/types/functions/math/min/minifs.test.d.ts +1 -0
  533. package/dist/types/functions/math/sum/sum.d.ts +5 -0
  534. package/dist/types/functions/math/sum/sum.test.d.ts +1 -0
  535. package/dist/types/functions/math/sum/sumif.d.ts +23 -0
  536. package/dist/types/functions/math/sum/sumif.test.d.ts +1 -0
  537. package/dist/types/functions/math/sum/sumifs.d.ts +21 -0
  538. package/dist/types/functions/math/sum/sumifs.test.d.ts +1 -0
  539. package/dist/types/functions/math/sum/summation-utils.d.ts +19 -0
  540. package/dist/types/functions/reference/address/address.d.ts +18 -0
  541. package/dist/types/functions/reference/address/address.test.d.ts +1 -0
  542. package/dist/types/functions/reference/indirect/indirect.d.ts +20 -0
  543. package/dist/types/functions/reference/indirect/indirect.test.d.ts +1 -0
  544. package/dist/types/functions/reference/offset/offset.d.ts +23 -0
  545. package/dist/types/functions/reference/offset/offset.test.d.ts +1 -0
  546. package/dist/types/functions/text/concatenate/concatenate.d.ts +5 -0
  547. package/dist/types/functions/text/concatenate/concatenate.test.d.ts +1 -0
  548. package/dist/types/functions/text/exact/exact.d.ts +5 -0
  549. package/dist/types/functions/text/exact/exact.test.d.ts +1 -0
  550. package/dist/types/functions/text/find/find.d.ts +20 -0
  551. package/dist/types/functions/text/find/find.test.d.ts +1 -0
  552. package/dist/types/functions/text/left/left.d.ts +19 -0
  553. package/dist/types/functions/text/left/left.test.d.ts +1 -0
  554. package/dist/types/functions/text/len/len.d.ts +16 -0
  555. package/dist/types/functions/text/len/len.test.d.ts +1 -0
  556. package/dist/types/functions/text/mid/mid.d.ts +20 -0
  557. package/dist/types/functions/text/mid/mid.test.d.ts +1 -0
  558. package/dist/types/functions/text/right/right.d.ts +2 -0
  559. package/dist/types/functions/text/right/right.test.d.ts +1 -0
  560. package/dist/types/functions/text/text-helpers.d.ts +27 -0
  561. package/dist/types/functions/text/textjoin/textjoin.d.ts +5 -0
  562. package/dist/types/functions/text/textjoin/textjoin.test.d.ts +1 -0
  563. package/dist/types/parser/ast.d.ts +275 -0
  564. package/dist/types/parser/formatter.d.ts +6 -0
  565. package/dist/types/parser/grammar.d.ts +203 -0
  566. package/dist/types/parser/lexer.d.ts +144 -0
  567. package/dist/types/parser/parser.d.ts +159 -0
  568. package/dist/types/react/hooks.d.ts +5 -0
  569. package/package.json +41 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/core/managers/dependency-manager.ts"],
4
+ "sourcesContent": [
5
+ "import {\n contextDependencyKeys,\n eligibleKeysForContext,\n getContextDependencyKey,\n type ContextDependency,\n type ContextDependencyType,\n} from \"src/evaluator/evaluation-context\";\nimport {\n type CellAddress,\n type EvaluationOrder,\n type SpilledValue,\n} from \"../types.cjs\";\nimport { isCellInRange, keyToCellAddress } from \"../utils.cjs\";\n\nimport { AstEvaluationNode } from \"src/evaluator/dependency-nodes/ast-evaluation-node\";\nimport { CellValueNode } from \"src/evaluator/dependency-nodes/cell-value-node\";\nimport { EmptyCellEvaluationNode } from \"src/evaluator/dependency-nodes/empty-cell-evaluation-node\";\nimport { RangeEvaluationNode } from \"src/evaluator/range-evaluation-node\";\nimport type { ASTNode } from \"src/parser/ast\";\nimport { astToString } from \"src/parser/formatter\";\nimport { CacheManager } from \"./cache-manager.cjs\";\nimport type {\n CellNodeKeyDictionary,\n CellNodeType,\n DependencyNode,\n} from \"./dependency-node.cjs\";\nimport { WorkbookManager } from \"./workbook-manager.cjs\";\nimport { SpillMetaNode } from \"src/evaluator/dependency-nodes/spill-meta-node\";\nimport { flags } from \"src/debug/flags\";\n\nexport interface DependencyTreeNode {\n type: \"cell\" | \"range\" | \"empty\";\n circular?: boolean;\n key: string;\n directDepsUpdated?: boolean;\n resolved?: boolean;\n canResolve: boolean;\n resultType:\n | \"awaiting-evaluation\"\n | \"spilled-values\"\n | \"value\"\n | \"range\"\n | \"error\"\n | \"does-not-spill\";\n deps?: DependencyTreeNode[];\n frontierDependencies?: DependencyTreeNode[];\n self?: boolean;\n _debug?: {\n rawFrontierDependencies?: string[];\n discardedFrontierDependencies?: string[];\n activeFrontierDependencies?: string[];\n };\n}\n\n/**\n * The DependencyManager is responsible for storing the evaluated values and their dependencies.\n */\nexport class DependencyManager {\n /**\n * The dependency graph\n */\n private evaluatedNodes: Map<\n /**\n * key is the cell key, from cellAddressToKey\n */\n string,\n CellValueNode\n > = new Map();\n\n private spillMetaNodes: Map<string, SpillMetaNode> = new Map();\n\n private emptyCells: Map<string, EmptyCellEvaluationNode> = new Map();\n\n /**\n * registry of spilled values\n */\n private _spilledValues: Map<\n /**\n * key is the dependency node key, from dependencyNodeToKey for the origin cell\n */\n string,\n SpilledValue\n > = new Map();\n\n /**\n * Key is workbook:sheetName:rangeKey, e.g. Workbook1:Sheet1:A1:D10, from rangeAddressToKey\n */\n private ranges: Map<string, RangeEvaluationNode> = new Map();\n\n constructor(\n private cacheManager: CacheManager,\n private workbookManager: WorkbookManager\n ) {}\n\n public get spilledValues(): IterableIterator<SpilledValue> {\n return this._spilledValues.values();\n }\n\n isSpillOrigin(cellAddress: CellAddress): boolean {\n for (const spilledValue of this._spilledValues.values()) {\n if (\n spilledValue.origin.sheetName !== cellAddress.sheetName ||\n spilledValue.origin.workbookName !== cellAddress.workbookName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === cellAddress.colIndex &&\n spilledValue.origin.rowIndex === cellAddress.rowIndex\n ) {\n return true;\n }\n }\n return false;\n }\n\n getSpillValue(cellAddress: CellAddress): SpilledValue | undefined {\n for (const spilledValue of this._spilledValues.values()) {\n if (\n spilledValue.origin.sheetName !== cellAddress.sheetName ||\n spilledValue.origin.workbookName !== cellAddress.workbookName\n ) {\n continue;\n }\n if (\n spilledValue.origin.colIndex === cellAddress.colIndex &&\n spilledValue.origin.rowIndex === cellAddress.rowIndex\n ) {\n return undefined;\n }\n if (isCellInRange(cellAddress, spilledValue.spillOnto)) {\n return spilledValue;\n }\n }\n return undefined;\n }\n\n getSpilledAddress(\n cellAddress: CellAddress,\n /**\n * if the spilled value is already available, we can use it to get the source address\n */\n passedSpilledValue?: SpilledValue\n ): { address: CellAddress; spillOffset: { x: number; y: number } } {\n const spilledValue = passedSpilledValue ?? this.getSpillValue(cellAddress);\n if (!spilledValue) {\n throw new Error(\"Cell is not spilled\");\n }\n const offsetLeft = cellAddress.colIndex - spilledValue.origin.colIndex;\n const offsetTop = cellAddress.rowIndex - spilledValue.origin.rowIndex;\n const address: CellAddress = {\n ...cellAddress,\n colIndex: spilledValue.origin.colIndex + offsetLeft,\n rowIndex: spilledValue.origin.rowIndex + offsetTop,\n };\n if (offsetLeft === 0 && offsetTop === 0) {\n throw new Error(\n \"Spilled value is the same as the cell address! The origin has a pre-calculated value that can be used\"\n );\n }\n return { address, spillOffset: { x: offsetLeft, y: offsetTop } };\n }\n\n clearEvaluationCache(): void {\n this.cacheManager.clear();\n this.evaluatedNodes.clear();\n this.emptyCells.clear();\n this.asts.clear();\n this.spillMetaNodes.clear();\n this.ranges.clear();\n this._spilledValues.clear();\n }\n\n setSpilledValue(nodeKey: string, spilledValue: SpilledValue): void {\n this._spilledValues.set(nodeKey.replace(/^[^:]+:/, \"\"), spilledValue);\n }\n\n getSpilledValue(nodeKey: string): SpilledValue | undefined {\n return this._spilledValues.get(nodeKey.replace(/^[^:]+:/, \"\"));\n }\n\n getEmptyCellNode(nodeKey: string): EmptyCellEvaluationNode {\n if (!nodeKey.startsWith(\"empty:\")) {\n throw new Error(\"Invalid empty cell node key: \" + nodeKey);\n }\n if (!this.emptyCells.has(nodeKey)) {\n const node = new EmptyCellEvaluationNode(\n nodeKey,\n this,\n this.workbookManager\n );\n this.emptyCells.set(nodeKey, node);\n return node;\n }\n return this.emptyCells.get(nodeKey)!;\n }\n\n getSpillMetaNode(nodeKey: string): SpillMetaNode {\n if (!nodeKey.startsWith(\"spill-meta:\")) {\n throw new Error(\"Invalid spill meta node key: \" + nodeKey);\n }\n if (!this.spillMetaNodes.has(nodeKey)) {\n const node = new SpillMetaNode(nodeKey);\n this.spillMetaNodes.set(nodeKey, node);\n return node;\n }\n return this.spillMetaNodes.get(nodeKey)!;\n }\n\n getCellValueNode(nodeKey: string): CellValueNode {\n if (!nodeKey.startsWith(\"cell-value:\")) {\n throw new Error(\"Invalid cell value node key: \" + nodeKey);\n }\n if (!this.evaluatedNodes.has(nodeKey)) {\n const node = new CellValueNode(nodeKey);\n this.evaluatedNodes.set(nodeKey, node);\n return node;\n }\n return this.evaluatedNodes.get(nodeKey)!;\n }\n\n getCellValueOrEmptyCellNode(\n nodeKey: string\n ): CellValueNode | EmptyCellEvaluationNode {\n const cellAddress = keyToCellAddress(nodeKey);\n\n const emptyKey = nodeKey.replace(/^[^:]+:/, \"empty:\");\n const cellValueKey = nodeKey.replace(/^[^:]+:/, \"cell-value:\");\n\n if (this.workbookManager.isCellEmpty(cellAddress)) {\n return this.getEmptyCellNode(emptyKey);\n }\n\n return this.getCellValueNode(cellValueKey);\n }\n\n getSpillMetaOrEmptySpillMetaNode(\n nodeKey: string\n ): SpillMetaNode | EmptyCellEvaluationNode {\n const cellAddress = keyToCellAddress(nodeKey);\n\n const emptyKey = nodeKey.replace(/^[^:]+:/, \"empty:\");\n const spillMetaKey = nodeKey.replace(/^[^:]+:/, \"spill-meta:\");\n\n if (this.workbookManager.isCellEmpty(cellAddress)) {\n return this.getEmptyCellNode(emptyKey);\n }\n\n return this.getSpillMetaNode(spillMetaKey);\n }\n\n lookupCellNode<T extends CellNodeType>(\n nodeKey: string,\n types: T[]\n ): CellNodeKeyDictionary[T][] {\n const cellAddress = keyToCellAddress(nodeKey);\n\n const emptyKey = nodeKey.replace(/^[^:]+:/, \"empty:\");\n const cellValueKey = nodeKey.replace(/^[^:]+:/, \"cell-value:\");\n const cellValueNode = this.evaluatedNodes.get(cellValueKey);\n const cellMetaKey = nodeKey.replace(/^[^:]+:/, \"cell-meta:\");\n const cellMetaNode = this.evaluatedNodes.get(cellMetaKey);\n\n if (this.workbookManager.isCellEmpty(cellAddress)) {\n if ((types as string[]).includes(\"empty\")) {\n return [this.getEmptyCellNode(emptyKey) as any];\n } else {\n return [];\n }\n }\n\n const results: any[] = [];\n\n if ((types as string[]).includes(\"cell\")) {\n if (cellValueNode) {\n results.push(cellValueNode);\n } else {\n results.push(this.getCellValueNode(cellValueKey));\n }\n }\n\n if (this.workbookManager.isFormulaCell(cellAddress)) {\n if ((types as string[]).includes(\"spill-meta\")) {\n if (cellMetaNode) {\n results.push(cellMetaNode);\n } else {\n results.push(this.getSpillMetaNode(cellValueKey));\n }\n }\n }\n\n return results;\n }\n\n getRangeNode(rangeKey: string): RangeEvaluationNode {\n if (!rangeKey.startsWith(\"range:\")) {\n throw new Error(\"Invalid range node key: \" + rangeKey);\n }\n if (!this.ranges.has(rangeKey)) {\n const node = new RangeEvaluationNode(\n rangeKey,\n this,\n this.workbookManager\n );\n this.ranges.set(rangeKey, node);\n return node;\n }\n return this.ranges.get(rangeKey)!;\n }\n\n asts: Map<\n /**\n * ast key\n */\n string,\n {\n entries: Map<\n /**\n * context dependency key\n */\n string,\n {\n evalNode: AstEvaluationNode;\n contextDependency: ContextDependency;\n }\n >;\n }\n > = new Map();\n\n getAstNode(\n ast: ASTNode,\n currentContext: Omit<Required<ContextDependency>, \"tableName\"> & {\n tableName?: string;\n }\n ): AstEvaluationNode {\n const astKey = `ast:${astToString(ast)}`; // cache normalize this later\n const astEntries = this.asts.get(astKey);\n\n const keys = eligibleKeysForContext(currentContext);\n\n for (const key of keys) {\n const astEntry = astEntries?.entries.get(key);\n if (astEntry) {\n return astEntry.evalNode;\n }\n }\n\n // if any of the ast entries match the current context, then we can return the ast node\n // otherwise we have to evalute the ast node to understand if it is context dependent\n // and later it will be saved using saveAstNode\n // if (astEntries) {\n // for (const entry of astEntries.entries.values()) {\n // // e.g. we have a row dependent ast dependency, dependent on row 1, and the current context dependency has rowIndex 1\n // // then we will get a match\n // const matches = Object.entries(entry.contextDependency).every(\n // ([key, value]) => {\n // if (typeof value === \"undefined\") {\n // return true;\n // }\n // return currentContext[key as keyof ContextDependency] === value;\n // }\n // );\n // if (matches) {\n // return entry.evalNode;\n // }\n // }\n // }\n\n // by default the ast node is cell specific\n // but later, setContextDependency is called with a more open context dependency\n const node = new AstEvaluationNode(ast, currentContext);\n // initially we store it as a cell, sheet, workbook and table dependent node\n // but later, once resolved, we can store it under a looser dependency key, e.g. only sheet, workbook and table dependent\n this.saveAstNode(node, currentContext);\n return node;\n }\n\n /**\n * Once an AST node is evaluated, we know if it is context dependent\n * and will thus save it under the correct cache key according to its\n * contextDependency\n *\n * only resolved ast nodes can be saved\n */\n private saveAstNode(\n ast: AstEvaluationNode,\n contextDependency: ContextDependency\n ) {\n const astKey = ast.key;\n const contextDependencyKey = getContextDependencyKey(contextDependency);\n const astEntries = this.asts.get(astKey);\n\n if (astEntries) {\n // if we don't already have an entry, then let's add it\n astEntries.entries.set(contextDependencyKey, {\n evalNode: ast,\n contextDependency,\n });\n } else {\n this.asts.set(astKey, {\n entries: new Map([\n [contextDependencyKey, { evalNode: ast, contextDependency }],\n ]),\n });\n }\n }\n\n getEvaluatedNodes(): Map<string, CellValueNode> {\n return this.evaluatedNodes;\n }\n\n //#region dependency graph methods\n\n /**\n * Get transitive dependencies and transitive frontier dependencies\n * This is only used by buildEvaluationOrder, so we'll optimize it there\n */\n getTransitiveDepsForEvalOrder(\n node: DependencyNode,\n visited: Set<DependencyNode> = new Set()\n ): Set<DependencyNode> {\n // Prevent infinite recursion\n if (visited.has(node)) {\n return new Set();\n }\n\n // If the node is resolved, then we don't need to evaluate it\n if (node && node.resolved) {\n return new Set();\n }\n\n // Mark this node as visited for cycle detection\n visited.add(node);\n\n const allNodes = new Set<DependencyNode>();\n allNodes.add(node);\n\n // Get direct dependencies (regular + frontier)\n const directDeps = node.getDependencies();\n\n // Recursively get transitive dependencies for each direct dependency\n for (const dep of directDeps) {\n if (!visited.has(dep)) {\n const depTransitiveDeps = this.getTransitiveDepsForEvalOrder(\n dep,\n visited\n );\n for (const transitiveDep of depTransitiveDeps) {\n allNodes.add(transitiveDep);\n }\n }\n }\n\n // Remove this node from visited set for other branches\n visited.delete(node);\n\n return allNodes;\n }\n\n /**\n * Build evaluation order for a cell using SCC-based condensation DAG approach\n *\n * Algorithm:\n * 1. Discover all transitive dependencies (skipping resolved nodes)\n * 2. Find SCCs using Tarjan's algorithm\n * 3. Create condensation DAG from SCCs\n * 4. Topologically sort the condensation DAG using Kahn's algorithm\n * 5. For each SCC, create internal evaluation order with cycle breaking\n * 6. Join the sorted SCC evaluation orders to create final evaluation order\n */\n buildEvaluationOrder(\n node: CellValueNode | EmptyCellEvaluationNode\n ): EvaluationOrder {\n if (node.resolved && this.cacheManager.getEvaluationOrder(node.key)) {\n return this.cacheManager.getEvaluationOrder(node.key)!;\n }\n\n // Phase 1: Discover all transitive dependencies (skipping resolved nodes)\n const allNodes = new Map<string, DependencyNode>();\n const visitedForDiscovery = new Set<DependencyNode>();\n\n const discoverNodes = (currentNode: DependencyNode) => {\n if (currentNode && currentNode.resolved) {\n return;\n }\n\n if (!allNodes.has(currentNode.key)) {\n allNodes.set(currentNode.key, currentNode);\n }\n\n if (visitedForDiscovery.has(currentNode)) {\n return;\n }\n\n visitedForDiscovery.add(currentNode);\n\n const allDeps = currentNode.getAllDependencies();\n for (const dep of allDeps) {\n discoverNodes(dep);\n }\n };\n\n discoverNodes(node);\n\n if (allNodes.size === 0 && node && node.resolved) {\n const result: EvaluationOrder = {\n evaluationOrder: new Set([node]),\n hasCycle: false,\n hash: this.computeHash(new Set([node])),\n };\n\n if (node && node.resolved) {\n this.cacheManager.setEvaluationOrder(node.key, result);\n }\n\n return result;\n }\n\n // Phase 2: Find SCCs using Tarjan's algorithm\n // Build SCCs considering ALL dependencies (soft + hard edges)\n const sccs = this.findSCCs(allNodes, true);\n\n // Phase 3: Create condensation DAG and check for cached SCCs\n const nodeToSCCId = new Map<DependencyNode, number>();\n const sccList: import(\"../types.cjs\").SCC[] = [];\n\n for (let i = 0; i < sccs.length; i++) {\n const sccNodes = sccs[i]!;\n\n // Check if all nodes in this SCC are resolved\n const allResolved = Array.from(sccNodes).every((n) => n.resolved);\n\n // Create SCC hash for caching\n const sccHash = Array.from(sccNodes)\n .map((n) => n.key)\n .sort()\n .join(\"|\");\n\n // Try to get cached SCC if it's resolved\n let scc: import(\"../types.cjs\").SCC;\n const cachedSCC = allResolved\n ? this.cacheManager.getSCC(sccHash)\n : undefined;\n\n if (cachedSCC) {\n scc = cachedSCC;\n } else {\n // Build evaluation order for this SCC with cycle breaking\n const sccEvalOrder = this.buildSCCEvaluationOrder(sccNodes);\n\n // Find hard-edge SCCs within this soft-edge SCC\n // Hard-edge SCCs are formed by only regular dependencies\n const hardEdgeSCCs = this.findSCCs(\n new Map(Array.from(sccNodes).map((n) => [n.key, n])),\n false // Use only hard edges (regular dependencies)\n );\n\n scc = {\n id: i,\n nodes: sccNodes,\n evaluationOrder: sccEvalOrder,\n resolved: allResolved,\n hardEdgeSCCs,\n };\n\n // Cache if resolved\n if (allResolved) {\n this.cacheManager.setSCC(sccHash, scc);\n }\n }\n\n sccList.push(scc);\n\n for (const n of sccNodes) {\n nodeToSCCId.set(n, i);\n }\n }\n\n // Build SCC dependency graph\n // Edge from A to B means A depends on B, so B must be evaluated before A\n const sccGraph = new Map<number, Set<number>>();\n for (let i = 0; i < sccList.length; i++) {\n sccGraph.set(i, new Set());\n }\n\n for (const [_, n] of allNodes) {\n const nSCCId = nodeToSCCId.get(n)!;\n // Use ALL dependencies (regular + frontier) for the condensation DAG\n // This ensures proper evaluation order even with frontier dependencies\n const deps = n.getAllDependencies();\n\n for (const dep of deps) {\n if (!allNodes.has(dep.key)) continue;\n\n const depSCCId = nodeToSCCId.get(dep)!;\n // n depends on dep, so dep's SCC must come before n's SCC\n // Add edge from dep's SCC to n's SCC\n if (nSCCId !== depSCCId) {\n sccGraph.get(depSCCId)!.add(nSCCId);\n }\n }\n }\n\n // Phase 4: Topologically sort SCCs using Kahn's algorithm\n const inDegree = new Map<number, number>();\n for (let i = 0; i < sccList.length; i++) {\n inDegree.set(i, 0);\n }\n\n for (const [_, deps] of sccGraph) {\n for (const toId of deps) {\n inDegree.set(toId, inDegree.get(toId)! + 1);\n }\n }\n\n const queue: number[] = [];\n for (let i = 0; i < sccList.length; i++) {\n if (inDegree.get(i) === 0) {\n queue.push(i);\n }\n }\n\n const sortedSCCIds: number[] = [];\n while (queue.length > 0) {\n const sccId = queue.shift()!;\n sortedSCCIds.push(sccId);\n\n const deps = sccGraph.get(sccId)!;\n for (const depId of deps) {\n const newInDegree = inDegree.get(depId)! - 1;\n inDegree.set(depId, newInDegree);\n if (newInDegree === 0) {\n queue.push(depId);\n }\n }\n }\n\n // Phase 5: Join evaluation orders from sorted SCCs\n const evaluationOrderArray: DependencyNode[] = [];\n for (const sccId of sortedSCCIds) {\n const scc = sccList[sccId]!;\n evaluationOrderArray.push(...scc.evaluationOrder);\n }\n\n const evaluationOrder = new Set(evaluationOrderArray);\n\n // Identify cycle nodes from hard-edge SCCs\n const cycleNodes = new Set<DependencyNode>();\n for (const scc of sccList) {\n for (const hardEdgeSCC of scc.hardEdgeSCCs) {\n // A hard-edge SCC with multiple nodes or a self-loop indicates a real cycle\n if (hardEdgeSCC.size > 1) {\n for (const n of hardEdgeSCC) {\n cycleNodes.add(n);\n }\n } else if (hardEdgeSCC.size === 1) {\n const node = Array.from(hardEdgeSCC)[0]!;\n if (node.getDependencies().has(node)) {\n cycleNodes.add(node);\n }\n }\n }\n }\n\n const hasCycle = cycleNodes.size > 0;\n const result: EvaluationOrder = {\n evaluationOrder,\n hasCycle,\n ...(hasCycle && { cycleNodes }),\n hash: this.computeGraphHash(allNodes, sccList),\n sccDAG: {\n sccList,\n sccGraph,\n },\n };\n\n if (node && node.resolved) {\n this.cacheManager.setEvaluationOrder(node.key, result);\n }\n\n return result;\n }\n\n /**\n * Find strongly connected components using Tarjan's algorithm\n * @param nodes - Map of nodes to analyze\n * @param includeFrontier - If true, use getAllDependencies(); if false, use getDependencies()\n * @returns Array of SCCs (each SCC is a Set of nodes)\n */\n private findSCCs(\n nodes: Map<string, DependencyNode>,\n includeFrontier: boolean\n ): Set<DependencyNode>[] {\n const index = new Map<DependencyNode, number>();\n const lowlink = new Map<DependencyNode, number>();\n const onStack = new Set<DependencyNode>();\n const stack: DependencyNode[] = [];\n const sccs: Set<DependencyNode>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (v: DependencyNode) => {\n index.set(v, currentIndex);\n lowlink.set(v, currentIndex);\n currentIndex++;\n stack.push(v);\n onStack.add(v);\n\n // Use either all dependencies or just regular dependencies\n const successors = includeFrontier\n ? v.getAllDependencies()\n : v.getDependencies();\n\n for (const w of successors) {\n if (!nodes.has(w.key)) {\n continue;\n }\n\n if (!index.has(w)) {\n strongConnect(w);\n lowlink.set(v, Math.min(lowlink.get(v)!, lowlink.get(w)!));\n } else if (onStack.has(w)) {\n lowlink.set(v, Math.min(lowlink.get(v)!, index.get(w)!));\n }\n }\n\n if (lowlink.get(v) === index.get(v)) {\n const scc = new Set<DependencyNode>();\n let w: DependencyNode;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n scc.add(w);\n } while (w !== v);\n\n sccs.push(scc);\n }\n };\n\n for (const [_, n] of nodes) {\n if (!index.has(n)) {\n strongConnect(n);\n }\n }\n\n return sccs;\n }\n\n /**\n * Build evaluation order within a single SCC using DFS with cycle breaking\n * Uses all dependencies (including frontier) for proper evaluation ordering\n */\n private buildSCCEvaluationOrder(\n sccNodes: Set<DependencyNode>\n ): DependencyNode[] {\n const visited = new Set<DependencyNode>();\n const visiting = new Set<DependencyNode>();\n const result: DependencyNode[] = [];\n\n const dfs = (n: DependencyNode) => {\n if (visited.has(n)) {\n return;\n }\n\n if (visiting.has(n)) {\n // Cycle detected (from any edge type), break it\n return;\n }\n\n visiting.add(n);\n\n // Use all dependencies for evaluation ordering (regular + frontier)\n const deps = n.getAllDependencies();\n for (const dep of deps) {\n if (sccNodes.has(dep) && !visited.has(dep)) {\n dfs(dep);\n }\n }\n\n visiting.delete(n);\n visited.add(n);\n result.push(n);\n };\n\n // Sort nodes by key for deterministic ordering\n const sortedNodes = Array.from(sccNodes).sort((a, b) =>\n a.key.localeCompare(b.key)\n );\n\n for (const n of sortedNodes) {\n if (!visited.has(n)) {\n dfs(n);\n }\n }\n\n return result;\n }\n\n /**\n * Compute hash representing the graph structure including SCC information\n */\n private computeGraphHash(\n allNodes: Map<string, DependencyNode>,\n sccList: import(\"../types.cjs\").SCC[]\n ): string {\n const parts: string[] = [];\n\n // Hash nodes and their dependencies\n for (const [key, node] of Array.from(allNodes.entries()).sort()) {\n const deps = Array.from(node.getAllDependencies())\n .map((d) => d.key)\n .sort()\n .join(\",\");\n parts.push(`${key}:[${deps}]`);\n }\n\n // Add SCC structure\n for (const scc of sccList) {\n const nodeKeys = Array.from(scc.nodes)\n .map((n) => n.key)\n .sort()\n .join(\",\");\n parts.push(`SCC${scc.id}:{${nodeKeys}}`);\n }\n\n return parts.join(\"|\");\n }\n\n /**\n * Compute a hash representing the current state of evaluated nodes\n * This hash changes when dependencies, frontier dependencies, or discarded frontier dependencies change\n */\n private computeHash(allNodes: Set<DependencyNode>): string {\n const nodeStates: string[] = [];\n\n for (const node of Array.from(allNodes).sort()) {\n if (node) {\n const deps = Array.from(node.getDependencies() || [])\n .map((dep) => dep.key)\n .sort()\n .join(\",\");\n\n // Handle frontier dependencies (Map<string, Set<string>>)\n const frontierDeps: string = Array.from(node.getFrontierDependencies())\n .map((dep) => dep.key)\n .sort()\n .join(\";\");\n\n const nodeState = `${node.key}:{deps:[${deps}],frontier:[${frontierDeps}]}`;\n nodeStates.push(nodeState);\n }\n }\n\n return nodeStates.join(\"|\");\n }\n\n /**\n * Get a hierarchical dependency tree for a node\n */\n getDependencyTree(node: DependencyNode): DependencyTreeNode {\n const visited = new Set<DependencyNode>();\n\n const nodeToType = (node: DependencyNode): \"cell\" | \"range\" | \"empty\" => {\n if (node instanceof RangeEvaluationNode) {\n return \"range\";\n }\n if (node instanceof EmptyCellEvaluationNode) {\n return \"empty\";\n }\n return \"cell\";\n };\n\n const buildTree = (\n node: DependencyNode,\n isSelf = false\n ): DependencyTreeNode => {\n const cellRef: string = node.toString();\n\n // Handle self-reference to avoid infinite recursion\n if (isSelf) {\n return {\n type: nodeToType(node),\n resultType:\n node instanceof RangeEvaluationNode\n ? \"range\"\n : node.evaluationResult\n ? node.evaluationResult.type\n : \"awaiting-evaluation\",\n canResolve: node.canResolve(),\n key: cellRef,\n directDepsUpdated: node.directDepsUpdated,\n resolved: node.resolved,\n self: true,\n circular: true,\n };\n }\n\n // Avoid infinite recursion for circular dependencies\n if (visited.has(node)) {\n return {\n type: nodeToType(node),\n resultType:\n node instanceof RangeEvaluationNode\n ? \"range\"\n : node.evaluationResult\n ? node.evaluationResult.type\n : \"awaiting-evaluation\",\n canResolve: node.canResolve(),\n key: cellRef,\n directDepsUpdated: node.directDepsUpdated,\n resolved: node.resolved,\n circular: true,\n };\n }\n\n visited.add(node);\n\n const directDeps = Array.from(node.getDependencies());\n let frontierDeps = Array.from(node.getFrontierDependencies());\n\n // Get regular dependencies\n const deps: DependencyTreeNode[] = directDeps.map((dep) =>\n buildTree(dep, dep.key === node.key)\n );\n\n const frontierDependencies: DependencyTreeNode[] = frontierDeps.map(\n (dep) => buildTree(dep, false)\n );\n\n visited.delete(node);\n\n const result: DependencyTreeNode = {\n type: nodeToType(node),\n resultType:\n node instanceof RangeEvaluationNode\n ? \"range\"\n : node.evaluationResult\n ? node.evaluationResult.type\n : \"awaiting-evaluation\",\n canResolve: node.canResolve(),\n key: cellRef,\n directDepsUpdated: node.directDepsUpdated,\n resolved: node.resolved,\n };\n\n // Only include deps and frontierDependencies if they have content\n if (deps.length > 0) {\n result.deps = deps;\n }\n if (frontierDependencies.length > 0) {\n result.frontierDependencies = frontierDependencies;\n }\n\n return result;\n };\n\n return buildTree(node);\n }\n //#endregion\n\n markResolvedNodes(node: DependencyNode): void {\n // Track visited nodes to avoid infinite loops in circular dependencies\n const visited = new Set<DependencyNode>();\n visited.add(node); // Don't revisit the current cell\n\n const areTransitiveDepsResolved = (nodes: Set<DependencyNode>): boolean => {\n let canResolve = true;\n for (const node of nodes) {\n if (visited.has(node) || node.resolved) {\n continue;\n }\n visited.add(node);\n\n // Check the node's dependencies to not cause cycles with frontier dependencies\n const directDeps = node.getDependencies();\n\n const a = areTransitiveDepsResolved(directDeps);\n const b = node.canResolve();\n\n if (!a || !b) {\n canResolve = false;\n }\n if (a && b) {\n node.resolve();\n // if an ast node is resolved, it will get removed from the dependency graph\n // and thus never reach evaluateNode in formula evaluator\n // so we need to save it here. The latest context dependency is the correct one.\n if (node instanceof AstEvaluationNode) {\n this.saveAstNode(node, node.getContextDependency());\n }\n }\n }\n return canResolve;\n };\n\n if (\n areTransitiveDepsResolved(node.getDependencies()) &&\n node.canResolve()\n ) {\n node.resolve();\n if (node instanceof AstEvaluationNode) {\n this.saveAstNode(node, node.getContextDependency());\n }\n }\n }\n\n /**\n * Update SCCs in cache to mark them as resolved if all their nodes are resolved\n */\n public updateResolvedSCCs(evalOrder: EvaluationOrder): void {\n if (!evalOrder.sccDAG) {\n return;\n }\n\n // Check each SCC and update cache if all nodes are resolved\n for (const scc of evalOrder.sccDAG.sccList) {\n const allResolved = Array.from(scc.nodes).every((n) => n.resolved);\n\n if (allResolved && !scc.resolved) {\n // Create updated SCC with resolved flag\n const updatedSCC: import(\"../types.cjs\").SCC = {\n ...scc,\n resolved: true,\n };\n\n // Update cache\n const sccHash = Array.from(scc.nodes)\n .map((n) => n.key)\n .sort()\n .join(\"|\");\n\n this.cacheManager.setSCC(sccHash, updatedSCC);\n }\n }\n }\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "62F68ED5F4FB614764756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,24 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+
20
+ // src/core/managers/dependency-node.ts
21
+ var exports_dependency_node = {};
22
+ module.exports = __toCommonJS(exports_dependency_node);
23
+
24
+ //# debugId=A0317A58371FD5EC64756E2164756E21
@@ -0,0 +1,9 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [
5
+ ],
6
+ "mappings": "",
7
+ "debugId": "A0317A58371FD5EC64756E2164756E21",
8
+ "names": []
9
+ }
@@ -0,0 +1,433 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
6
+ var __toCommonJS = (from) => {
7
+ var entry = __moduleCache.get(from), desc;
8
+ if (entry)
9
+ return entry;
10
+ entry = __defProp({}, "__esModule", { value: true });
11
+ if (from && typeof from === "object" || typeof from === "function")
12
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
13
+ get: () => from[key],
14
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
15
+ }));
16
+ __moduleCache.set(from, entry);
17
+ return entry;
18
+ };
19
+ var __export = (target, all) => {
20
+ for (var name in all)
21
+ __defProp(target, name, {
22
+ get: all[name],
23
+ enumerable: true,
24
+ configurable: true,
25
+ set: (newValue) => all[name] = () => newValue
26
+ });
27
+ };
28
+
29
+ // src/core/managers/evaluation-manager.ts
30
+ var exports_evaluation_manager = {};
31
+ __export(exports_evaluation_manager, {
32
+ EvaluationManager: () => EvaluationManager
33
+ });
34
+ module.exports = __toCommonJS(exports_evaluation_manager);
35
+ var import_flags = require("src/debug/flags");
36
+ var import_ast_evaluation_node = require("src/evaluator/dependency-nodes/ast-evaluation-node");
37
+ var import_cell_value_node = require("src/evaluator/dependency-nodes/cell-value-node");
38
+ var import_evaluation_context = require("src/evaluator/evaluation-context");
39
+ var import_evaluation_error = require("src/evaluator/evaluation-error");
40
+ var import_range_evaluation_node = require("src/evaluator/range-evaluation-node");
41
+ var import_formatter = require("src/parser/formatter");
42
+ var import_types = require("../types.cjs");
43
+ var import_utils = require("../utils.cjs");
44
+ var import_spill_meta_node = require("src/evaluator/dependency-nodes/spill-meta-node");
45
+ var import_empty_cell_evaluation_node = require("src/evaluator/dependency-nodes/empty-cell-evaluation-node");
46
+
47
+ class EvaluationManager {
48
+ workbookManager;
49
+ tableManager;
50
+ formulaEvaluator;
51
+ dependencyManager;
52
+ isEvaluating = false;
53
+ constructor(workbookManager, tableManager, formulaEvaluator, dependencyManager) {
54
+ this.workbookManager = workbookManager;
55
+ this.tableManager = tableManager;
56
+ this.formulaEvaluator = formulaEvaluator;
57
+ this.dependencyManager = dependencyManager;
58
+ }
59
+ clearEvaluationCache() {
60
+ this.dependencyManager.clearEvaluationCache();
61
+ }
62
+ evaluationResultToSerializedValue(evaluation, cellAddress, debug) {
63
+ if (evaluation.type !== "error" && evaluation.type !== "awaiting-evaluation") {
64
+ const value = evaluation.result;
65
+ return value.type === "infinity" ? value.sign === "positive" ? "INFINITY" : "-INFINITY" : value.value;
66
+ }
67
+ if (evaluation.type === "awaiting-evaluation") {
68
+ return evaluation.errAddress.key + " is awaiting evaluation of " + evaluation.waitingFor.key;
69
+ }
70
+ if (debug) {
71
+ const errAddress = evaluation.errAddress.key;
72
+ if (errAddress === import_utils.cellAddressToKey(cellAddress)) {
73
+ return evaluation.err + " " + evaluation.message;
74
+ }
75
+ return evaluation.err + " in " + evaluation.errAddress.key + " " + evaluation.message;
76
+ }
77
+ return evaluation.err;
78
+ }
79
+ evaluateEmptyCell(node) {
80
+ node.resetDirectDepsUpdated();
81
+ if (node.resolved) {
82
+ const result = node.evaluationResult;
83
+ if (result && result.type !== "awaiting-evaluation") {
84
+ return;
85
+ }
86
+ }
87
+ const ctx = new import_evaluation_context.EvaluationContext(this.tableManager, node, node.cellAddress);
88
+ const inSpilled = this.dependencyManager.getSpillValue(node.cellAddress);
89
+ if (inSpilled) {
90
+ const spillTarget = this.dependencyManager.getSpilledAddress(node.cellAddress, inSpilled);
91
+ const spillOriginKey = import_utils.cellAddressToKey(inSpilled.origin).replace(/^[^:]+:/, "spill-meta:");
92
+ const spillMetaNode = this.dependencyManager.getSpillMetaNode(spillOriginKey);
93
+ node.addDependency(spillMetaNode);
94
+ const result = spillMetaNode.evaluationResult;
95
+ if (result.type === "spilled-values") {
96
+ const evaluation = import_utils.captureEvaluationErrors(spillMetaNode, () => {
97
+ return result.evaluate(spillTarget.spillOffset, ctx);
98
+ });
99
+ node.setEvaluationResult(evaluation);
100
+ }
101
+ } else {
102
+ node.upgradeFrontierDependencies();
103
+ const evaluationResult = {
104
+ type: "value",
105
+ result: this.convertScalarValueToCellValue("")
106
+ };
107
+ node.setEvaluationResult(evaluationResult);
108
+ }
109
+ }
110
+ evaluateRangeNode(node) {
111
+ if (node.resolved) {
112
+ return;
113
+ }
114
+ node.resetDirectDepsUpdated();
115
+ const result = import_utils.captureEvaluationErrors(node, () => {
116
+ node.upgradeFrontierDependencies();
117
+ const evalOrder = node.getRangeEvalOrder();
118
+ const results = [];
119
+ for (const entry of evalOrder) {
120
+ if (entry.type === "value") {
121
+ const entryAddress = entry.address;
122
+ const result2 = entry.node.evaluationResult;
123
+ const relativePos = {
124
+ x: entryAddress.colIndex - node.address.range.start.col,
125
+ y: entryAddress.rowIndex - node.address.range.start.row
126
+ };
127
+ results.push({ result: result2, relativePos });
128
+ } else if (entry.type === "empty_cell" || entry.type === "empty_range") {
129
+ for (const candidateNode of entry.candidates) {
130
+ if (candidateNode.evaluationResult.type === "spilled-values") {
131
+ const spillArea = candidateNode.evaluationResult.spillArea(candidateNode.cellAddress);
132
+ if (entry.type === "empty_range") {
133
+ const intersects = import_utils.checkRangeIntersection(spillArea, entry.address.range);
134
+ if (intersects) {
135
+ const ctx = new import_evaluation_context.EvaluationContext(this.tableManager, node, candidateNode.cellAddress);
136
+ const spilledResults = candidateNode.evaluationResult.evaluateAllCells.call(this.formulaEvaluator, {
137
+ context: ctx,
138
+ evaluate: candidateNode.evaluationResult.evaluate,
139
+ intersection: entry.address.range,
140
+ origin: candidateNode.cellAddress,
141
+ lookupOrder: "col-major"
142
+ });
143
+ if (spilledResults.type === "values") {
144
+ results.push(...spilledResults.values);
145
+ } else {
146
+ return spilledResults;
147
+ }
148
+ }
149
+ } else {
150
+ const intersects = import_utils.isCellInRange(entry.address, spillArea);
151
+ if (intersects) {
152
+ const relativePos = {
153
+ x: entry.address.colIndex - candidateNode.cellAddress.colIndex,
154
+ y: entry.address.rowIndex - candidateNode.cellAddress.rowIndex
155
+ };
156
+ const ctx = new import_evaluation_context.EvaluationContext(this.tableManager, node, candidateNode.cellAddress);
157
+ const spilledResult = candidateNode.evaluationResult.evaluate(relativePos, ctx);
158
+ results.push({
159
+ relativePos: {
160
+ x: entry.address.colIndex - node.address.range.start.col,
161
+ y: entry.address.rowIndex - node.address.range.start.row
162
+ },
163
+ result: spilledResult
164
+ });
165
+ }
166
+ }
167
+ }
168
+ }
169
+ }
170
+ }
171
+ return {
172
+ type: "values",
173
+ values: results
174
+ };
175
+ });
176
+ node.setResult(result);
177
+ }
178
+ evaluateCellNode(node) {
179
+ if (node.resolved) {
180
+ return;
181
+ }
182
+ node.resetDirectDepsUpdated();
183
+ const ctx = new import_evaluation_context.EvaluationContext(this.tableManager, node, node.cellAddress);
184
+ if (node instanceof import_cell_value_node.CellValueNode && node.spillMeta) {
185
+ const spillOrigin = node.spillMeta;
186
+ if (spillOrigin.evaluationResult.type === "spilled-values") {
187
+ const result = spillOrigin.evaluationResult.evaluate({ x: 0, y: 0 }, ctx);
188
+ node.setEvaluationResult(result);
189
+ return;
190
+ }
191
+ }
192
+ let content;
193
+ try {
194
+ content = this.workbookManager.getSerializedCellValue(node.cellAddress);
195
+ } catch (err) {
196
+ const evaluationResult = {
197
+ type: "error",
198
+ err: import_types.FormulaError.ERROR,
199
+ message: "Syntax error",
200
+ errAddress: node
201
+ };
202
+ node.setEvaluationResult(evaluationResult);
203
+ return;
204
+ }
205
+ if (typeof content !== "string" || !content.startsWith("=")) {
206
+ if (node instanceof import_spill_meta_node.SpillMetaNode) {
207
+ node.setEvaluationResult({
208
+ type: "does-not-spill"
209
+ });
210
+ return;
211
+ }
212
+ const result = {
213
+ type: "value",
214
+ result: this.convertScalarValueToCellValue(content)
215
+ };
216
+ node.setEvaluationResult(result);
217
+ return;
218
+ }
219
+ let evaluation = import_utils.captureEvaluationErrors(node, () => this.formulaEvaluator.evaluateFormula(content.slice(1), ctx));
220
+ if (evaluation.type === "spilled-values") {
221
+ const spillArea = evaluation.spillArea(node.cellAddress);
222
+ if (!this.canSpill(node.cellAddress, spillArea)) {
223
+ evaluation = {
224
+ type: "error",
225
+ err: import_types.FormulaError.SPILL,
226
+ message: "Cannot spill - area is blocked",
227
+ errAddress: node
228
+ };
229
+ } else {
230
+ this.dependencyManager.setSpilledValue(node.key, {
231
+ spillOnto: spillArea,
232
+ origin: node.cellAddress
233
+ });
234
+ }
235
+ if (node instanceof import_spill_meta_node.SpillMetaNode) {
236
+ node.setEvaluationResult(evaluation);
237
+ } else {
238
+ const spillMetaNode = this.dependencyManager.getSpillMetaNode(node.key.replace(/^[^:]+:/, "spill-meta:"));
239
+ node.addDependency(spillMetaNode);
240
+ node.setSpillMetaNode(spillMetaNode);
241
+ spillMetaNode.setEvaluationResult(evaluation);
242
+ if (evaluation.type === "spilled-values") {
243
+ const originResult = evaluation.evaluate({ x: 0, y: 0 }, ctx);
244
+ node.setEvaluationResult(originResult);
245
+ } else {
246
+ node.setEvaluationResult(evaluation);
247
+ }
248
+ }
249
+ return;
250
+ }
251
+ if (evaluation.type === "value") {
252
+ if (node instanceof import_spill_meta_node.SpillMetaNode) {
253
+ node.setEvaluationResult({
254
+ type: "does-not-spill"
255
+ });
256
+ return;
257
+ } else {
258
+ node.setEvaluationResult(evaluation);
259
+ return;
260
+ }
261
+ }
262
+ node.setEvaluationResult(evaluation);
263
+ }
264
+ evaluateDependencyNode(dependencyKey) {
265
+ if (dependencyKey.startsWith("empty:")) {
266
+ this.evaluateEmptyCell(this.dependencyManager.getEmptyCellNode(dependencyKey));
267
+ return;
268
+ }
269
+ if (dependencyKey.startsWith("range:")) {
270
+ this.evaluateRangeNode(this.dependencyManager.getRangeNode(dependencyKey));
271
+ return;
272
+ }
273
+ if (dependencyKey.startsWith("cell-value:")) {
274
+ const node = this.dependencyManager.getCellValueOrEmptyCellNode(dependencyKey);
275
+ if (node instanceof import_empty_cell_evaluation_node.EmptyCellEvaluationNode) {
276
+ this.evaluateEmptyCell(node);
277
+ return;
278
+ }
279
+ this.evaluateCellNode(node);
280
+ return;
281
+ }
282
+ if (dependencyKey.startsWith("ast:")) {
283
+ return;
284
+ }
285
+ if (dependencyKey.startsWith("spill-meta:")) {
286
+ const node = this.dependencyManager.getSpillMetaOrEmptySpillMetaNode(dependencyKey);
287
+ if (node instanceof import_empty_cell_evaluation_node.EmptyCellEvaluationNode) {
288
+ this.evaluateEmptyCell(node);
289
+ return;
290
+ }
291
+ this.evaluateCellNode(node);
292
+ return;
293
+ }
294
+ throw new Error("Invalid dependency key: " + dependencyKey);
295
+ }
296
+ evaluateCell(node) {
297
+ if (this.isEvaluating) {
298
+ throw new Error("Evaluation in progress");
299
+ }
300
+ this.isEvaluating = true;
301
+ const sheet = this.workbookManager.getSheet(node.cellAddress);
302
+ if (!sheet) {
303
+ this.isEvaluating = false;
304
+ throw new import_evaluation_error.SheetNotFoundError(node.cellAddress.sheetName);
305
+ }
306
+ let precalculatedPlan;
307
+ let requiresReRun = true;
308
+ while (requiresReRun) {
309
+ requiresReRun = false;
310
+ const evaluationPlan = precalculatedPlan ?? this.dependencyManager.buildEvaluationOrder(node);
311
+ if (evaluationPlan.hasCycle) {
312
+ const evaluationResult = {
313
+ type: "error",
314
+ err: import_types.FormulaError.CYCLE,
315
+ message: Array.from(evaluationPlan.cycleNodes ?? []).map((node2) => node2.key).join(" -> "),
316
+ errAddress: node
317
+ };
318
+ if (evaluationPlan.cycleNodes) {
319
+ for (const node2 of evaluationPlan.cycleNodes) {
320
+ if (!(node2 instanceof import_range_evaluation_node.RangeEvaluationNode)) {
321
+ if (node2 instanceof import_ast_evaluation_node.AstEvaluationNode) {
322
+ node2.setEvaluationResult(evaluationResult);
323
+ } else {
324
+ node2.setEvaluationResult(evaluationResult);
325
+ }
326
+ }
327
+ }
328
+ }
329
+ this.isEvaluating = false;
330
+ }
331
+ const timeStart = performance.now();
332
+ const durations = [];
333
+ let numResolved = 0;
334
+ if (import_flags.flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {}
335
+ evaluationPlan.evaluationOrder.forEach((dependency) => {
336
+ const start = performance.now();
337
+ if (dependency.resolved) {
338
+ numResolved++;
339
+ }
340
+ this.evaluateDependencyNode(dependency.key);
341
+ const end = performance.now();
342
+ if (import_flags.flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {
343
+ durations.push({ duration: end - start, key: dependency.key });
344
+ }
345
+ });
346
+ if (import_flags.flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {}
347
+ if (import_flags.flags.isProfiling && evaluationPlan.evaluationOrder.size > -1) {
348
+ const percentResolved = Math.round(100 * numResolved / evaluationPlan.evaluationOrder.size);
349
+ const avgDuration = durations.reduce((a, b) => a + b.duration, 0) / durations.length || 0;
350
+ console.log(`%c[Evaluation] %c${evaluationPlan.evaluationOrder.size} deps | %c${(performance.now() - timeStart).toFixed(1)}ms | %c${percentResolved}% resolved | %c${avgDuration.toFixed(2)}ms avg`, "color:#83aaff;font-weight:bold;", "color:#fff;font-weight:bold;", "color:#7fff9e", "color:#85baff", "color:#ffdfa3");
351
+ }
352
+ this.dependencyManager.markResolvedNodes(node);
353
+ const nextEvaluationPlan = this.dependencyManager.buildEvaluationOrder(node);
354
+ this.dependencyManager.updateResolvedSCCs(nextEvaluationPlan);
355
+ precalculatedPlan = nextEvaluationPlan;
356
+ if (nextEvaluationPlan.hash !== evaluationPlan.hash) {
357
+ requiresReRun = true;
358
+ } else {
359
+ this.isEvaluating = false;
360
+ return;
361
+ }
362
+ }
363
+ this.isEvaluating = false;
364
+ }
365
+ convertScalarValueToCellValue(val) {
366
+ if (typeof val === "number") {
367
+ return { type: "number", value: val };
368
+ }
369
+ if (typeof val === "boolean") {
370
+ return { type: "boolean", value: val };
371
+ }
372
+ if (typeof val === "undefined") {
373
+ return { type: "string", value: "" };
374
+ }
375
+ return { type: "string", value: val };
376
+ }
377
+ canSpill(spillCandidate, spillArea) {
378
+ const sheet = this.workbookManager.getSheet(spillCandidate);
379
+ if (!sheet) {
380
+ throw new import_evaluation_error.SheetNotFoundError(spillCandidate.sheetName);
381
+ }
382
+ const cellId = import_utils.getCellReference(spillCandidate);
383
+ const content = sheet.content.get(cellId);
384
+ if (!content) {
385
+ throw new import_evaluation_error.EvaluationError(import_types.FormulaError.REF, `Cell not found: ${cellId}`);
386
+ }
387
+ for (const spilledValue of this.dependencyManager.spilledValues) {
388
+ if (spilledValue.origin.workbookName !== spillCandidate.workbookName || spilledValue.origin.sheetName !== spillCandidate.sheetName) {
389
+ continue;
390
+ }
391
+ if (spilledValue.origin.colIndex === spillCandidate.colIndex && spilledValue.origin.rowIndex === spillCandidate.rowIndex) {
392
+ continue;
393
+ }
394
+ if (import_utils.checkRangeIntersection(spillArea, spilledValue.spillOnto)) {
395
+ return false;
396
+ }
397
+ }
398
+ for (const key of sheet.content.keys()) {
399
+ const cellAddress = import_utils.parseCellReference(key);
400
+ const endCol = spillArea.end.col;
401
+ const endRow = spillArea.end.row;
402
+ if (cellAddress.colIndex === spillCandidate.colIndex && cellAddress.rowIndex === spillCandidate.rowIndex) {
403
+ continue;
404
+ }
405
+ if (endCol.type === "number" && endRow.type === "number") {
406
+ if (cellAddress.colIndex >= spillArea.start.col && cellAddress.colIndex <= endCol.value && cellAddress.rowIndex >= spillArea.start.row && cellAddress.rowIndex <= endRow.value) {
407
+ if (import_formatter.normalizeSerializedCellValue(sheet.content.get(key)) !== undefined) {
408
+ return false;
409
+ }
410
+ }
411
+ }
412
+ }
413
+ return true;
414
+ }
415
+ getCellEvaluationResult(cellAddress) {
416
+ if (this.isEvaluating) {
417
+ throw new Error("Evaluation in progress");
418
+ }
419
+ const nodeKey = import_utils.cellAddressToKey(cellAddress);
420
+ const node = this.dependencyManager.getCellValueOrEmptyCellNode(nodeKey);
421
+ const sheet = this.workbookManager.getSheet(cellAddress);
422
+ if (!sheet) {
423
+ throw new import_evaluation_error.SheetNotFoundError(cellAddress.sheetName);
424
+ }
425
+ if (node.evaluationResult.type === "awaiting-evaluation") {
426
+ this.evaluateCell(node);
427
+ }
428
+ const result = node.evaluationResult;
429
+ return result;
430
+ }
431
+ }
432
+
433
+ //# debugId=ED71727AFAD08E2464756E2164756E21